验证通过钱包的签名

This commit is contained in:
fitchgc 2022-09-29 07:01:54 +00:00
parent 7671829de3
commit ffbdca8c5e
5 changed files with 202 additions and 60 deletions

163
Cargo.lock generated
View File

@ -14,6 +14,15 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
name = "autocfg"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
dependencies = [
"autocfg 1.1.0",
]
[[package]]
name = "autocfg"
version = "1.1.0"
@ -26,6 +35,12 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "bitcoin_hashes"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "006cc91e1a1d99819bc5b8214be3555c1f0611b169f527a1fdc54ed1f2b745b0"
[[package]]
name = "bitcoin_hashes"
version = "0.11.0"
@ -630,7 +645,7 @@ version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
dependencies = [
"autocfg",
"autocfg 1.1.0",
"hashbrown",
]
@ -703,7 +718,7 @@ version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
dependencies = [
"autocfg",
"autocfg 1.1.0",
"scopeguard",
]
@ -770,7 +785,7 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
dependencies = [
"autocfg",
"autocfg 1.1.0",
"num-integer",
"num-traits",
"rand 0.5.6",
@ -782,7 +797,7 @@ version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [
"autocfg",
"autocfg 1.1.0",
"num-traits",
]
@ -792,7 +807,7 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
"autocfg 1.1.0",
]
[[package]]
@ -864,7 +879,7 @@ version = "0.9.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f"
dependencies = [
"autocfg",
"autocfg 1.1.0",
"cc",
"libc",
"openssl-src",
@ -1032,6 +1047,25 @@ dependencies = [
"winapi",
]
[[package]]
name = "rand"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
dependencies = [
"autocfg 0.1.8",
"libc",
"rand_chacha 0.1.1",
"rand_core 0.4.2",
"rand_hc",
"rand_isaac",
"rand_jitter",
"rand_os",
"rand_pcg",
"rand_xorshift",
"winapi",
]
[[package]]
name = "rand"
version = "0.8.5"
@ -1039,10 +1073,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
]
[[package]]
name = "rand_chacha"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
dependencies = [
"autocfg 0.1.8",
"rand_core 0.3.1",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
@ -1077,6 +1121,77 @@ dependencies = [
"getrandom",
]
[[package]]
name = "rand_hc"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
dependencies = [
"rand_core 0.3.1",
]
[[package]]
name = "rand_isaac"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
dependencies = [
"rand_core 0.3.1",
]
[[package]]
name = "rand_jitter"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
dependencies = [
"libc",
"rand_core 0.4.2",
"winapi",
]
[[package]]
name = "rand_os"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
dependencies = [
"cloudabi",
"fuchsia-cprng",
"libc",
"rand_core 0.4.2",
"rdrand",
"winapi",
]
[[package]]
name = "rand_pcg"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
dependencies = [
"autocfg 0.1.8",
"rand_core 0.4.2",
]
[[package]]
name = "rand_xorshift"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
dependencies = [
"rand_core 0.3.1",
]
[[package]]
name = "rdrand"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
dependencies = [
"rand_core 0.3.1",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
@ -1162,8 +1277,10 @@ name = "rustwallet"
version = "0.1.0"
dependencies = [
"anyhow",
"bitcoin_hashes 0.11.0",
"hex",
"openssl",
"secp256k1 0.24.0",
"secp256k1",
"serde",
"serde_json",
"shamir_secret_sharing",
@ -1199,18 +1316,9 @@ version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c42e6f1735c5f00f51e43e28d6634141f2bcad10931b2609ddd74a86d751260"
dependencies = [
"secp256k1-sys 0.4.2",
]
[[package]]
name = "secp256k1"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7649a0b3ffb32636e60c7ce0d70511eda9c52c658cd0634e194d5a19943aeff"
dependencies = [
"bitcoin_hashes",
"rand 0.8.5",
"secp256k1-sys 0.6.0",
"bitcoin_hashes 0.10.0",
"rand 0.6.5",
"secp256k1-sys",
]
[[package]]
@ -1222,15 +1330,6 @@ dependencies = [
"cc",
]
[[package]]
name = "secp256k1-sys"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7058dc8eaf3f2810d7828680320acda0b25a288f6d288e19278e249bbf74226b"
dependencies = [
"cc",
]
[[package]]
name = "security-framework"
version = "2.7.0"
@ -1365,7 +1464,7 @@ version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
dependencies = [
"autocfg",
"autocfg 1.1.0",
]
[[package]]
@ -1495,7 +1594,7 @@ version = "1.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0020c875007ad96677dcc890298f4b942882c5d4eb7cc8f439fc3bf813dc9c95"
dependencies = [
"autocfg",
"autocfg 1.1.0",
"bytes",
"libc",
"memchr",
@ -1790,7 +1889,7 @@ dependencies = [
"pin-project",
"reqwest",
"rlp",
"secp256k1 0.21.3",
"secp256k1",
"serde",
"serde_json",
"soketto",

View File

@ -15,11 +15,13 @@ crate-type = ["staticlib", "lib"]
[dependencies]
anyhow = "1.0.65"
bitcoin_hashes = "0.11.0"
hex = "0.4.3"
openssl = { version = "0.10.41", features = ["vendored"] }
secp256k1 = { version = "0.24.0", features = ["rand", "bitcoin_hashes"] }
secp256k1 = { version = "0.21.3", features = ["rand-std", "bitcoin_hashes", "recovery"] }
serde = { version = "1.0.145", features = ["derive"]}
serde_json = "1.0.85"
shamir_secret_sharing = "0.1.1"
tiny-keccak = "1.5"
web3 = "0.18.0"
web3 = { version = "0.18.0", features = ["signing"] }

View File

@ -12,20 +12,20 @@ use rustwallet::{
fn main() {
unsafe {
let wallet: CWallet = generate_cwallet();
println!("---- generated a wallet to be used on C-side ----");
print_wallet(&wallet);
// let wallet: CWallet = generate_cwallet();
// println!("---- generated a wallet to be used on C-side ----");
// print_wallet(&wallet);
println!("---- saving the wallet to wallet.json ----");
save_wallet(&wallet);
println!("---- saved! ----");
// println!("---- saving the wallet to wallet.json ----");
// save_wallet(&wallet);
// println!("---- saved! ----");
println!("---- fetching the saved wallet to be exposed to C-side ----");
let fetched = fetch_cwallet();
print_wallet(&fetched);
sign();
free_cwallet(wallet); // 对应 generate_cwallet()
// free_cwallet(wallet); // 对应 generate_cwallet()
free_cwallet(fetched); // 对应 fetch_wallet()
}
}

View File

@ -1,20 +1,23 @@
extern crate hex;
use anyhow::Result;
use secp256k1::ecdsa::Signature;
use web3::types::{ H256, Bytes };
use secp256k1::{PublicKey, SecretKey, Message, Secp256k1};
use secp256k1::rand::rngs::OsRng;
use secp256k1::{PublicKey, SecretKey, Message};
use secp256k1::hashes::sha256;
use serde::{Deserialize, Serialize};
use std::io::BufWriter;
use std::str::FromStr;
use std::{fs::OpenOptions, io::BufReader};
use tiny_keccak::keccak256;
use web3::types::Address;
use web3::signing::{ hash_message, SecretKeyRef, Key };
use std::str;
use core::fmt::Write;
pub fn generate_keypair() -> (SecretKey, PublicKey) {
let secp = secp256k1::Secp256k1::new();
secp.generate_keypair(&mut OsRng)
let secp = Secp256k1::new();
let mut rng = OsRng::new().expect("OsRng");
secp.generate_keypair(&mut rng)
}
pub fn public_key_address(public_key: &PublicKey) -> Address {
@ -38,10 +41,10 @@ impl Wallet {
let addr: Address = public_key_address(&public_key);
println!("secret key: {:?}", secret_key);
let mut s = String::with_capacity(2 * 32);
for i in &secret_key.secret_bytes() {
write!(s, "{:02x}", *i);
}
println!("{:?}", s);
// for i in &secret_key.secret_bytes() {
// write!(s, "{:02x}", *i).unwrap();
// }
// println!("{:?}", s);
Wallet {
@ -71,15 +74,53 @@ impl Wallet {
Ok(wallet)
}
pub fn sign(&self, msg: &str) -> Result<Signature> {
let secp = secp256k1::Secp256k1::new();
let message = Message::from_hashed_data::<sha256::Hash>(msg.as_bytes());
pub fn sign<S>(&self, msg: S) -> Result<()>
where
S: AsRef<[u8]>,{
let secp = Secp256k1::new();
println!("secret key str: {:?}", self.secret_key);
println!("message: {:?}", message);
let message = msg.as_ref();
let message_hash = hash_message(message.as_ref());
let pk = SecretKey::from_str(&self.secret_key).expect("32 bytes, within curve order");
println!("secret key: {:?}", pk);
// let sig = secp.sign_ecdsa(&message, &pk);
let sig = secp.sign_ecdsa(&message, &pk);
Ok(sig)
let key = SecretKeyRef::new(&pk);
let signature = key.sign(message_hash.as_bytes(), None).expect("hash is non-zero 32-bytes; qed");;
let v = signature
.v
.try_into()
.expect("signature recovery in electrum notation always fits in a u8");
// let signature_bytes = Bytes({
// let mut bytes = Vec::with_capacity(65);
// bytes.extend_from_slice(signature.r.as_bytes());
// bytes.extend_from_slice(signature.s.as_bytes());
// bytes.push(v);
// bytes
// });
let mut bytes = Vec::with_capacity(65);
bytes.extend_from_slice(signature.r.as_bytes());
bytes.extend_from_slice(signature.s.as_bytes());
bytes.push(v);
let mut string1 = String::with_capacity(2 * 65);
for i in bytes.iter() {
write!(string1, "{:02x}", i).unwrap();
}
println!("web3 sign: {:?}", string1);
let message_to_hash = Message::from_slice(message_hash.as_ref()).unwrap();
let (recovery_id, signature) = secp.sign_ecdsa_recoverable(&message_to_hash, &pk).serialize_compact();
let mut s = String::with_capacity(2 * 65);
for i in signature {
write!(s, "{:02x}", i).unwrap();
}
let standard_v = recovery_id.to_i32() as u64 + 27;
let rv:u8 = standard_v.try_into().expect("signature recovery in electrum notation always fits in a u8");
write!(s, "{:02x}", rv).unwrap();
println!("normal sigx: {:?}", s);
Ok(())
}
}

View File

@ -1,5 +1,5 @@
{
"secret_key": "4877e4466ed17b3fa3c5040760a8401bc26565126bd611fdbd903a4652a26b37",
"public_key": "03a0b65abcf64937afff82590b1580add0a3a344e00f209de388dd1378f8162419",
"public_address": "0x5f88990fa8ad8c6e8c33929a685fadec146102f4"
"secret_key": "64a6f7baa58d7381f4068fc729568009ef8f36e9c7d9c33d2cf06afc25c01e87",
"public_key": "03b7f10a2f6e8c267c71fbf43250cc89dec346e9e82ac8588d554eea7881eb3ed2",
"public_address": "0xbee138f1dd559a9758806c0eaf9d5d12ff60aff5"
}