增加shamir的测试代码

This commit is contained in:
fitchgc 2022-10-08 05:03:56 +00:00
parent ffbdca8c5e
commit d3227072d1
3 changed files with 56 additions and 10 deletions

View File

@ -7,7 +7,7 @@
use std::ffi::CStr; use std::ffi::CStr;
//use rustylib::gen::{CWallet}; //use rustylib::gen::{CWallet};
use rustwallet::{ use rustwallet::{
fetch_cwallet, free_cwallet, generate_cwallet, save_wallet, sign, CWallet, fetch_cwallet, free_cwallet, generate_cwallet, save_wallet, sign, sss_sign, CWallet,
}; };
fn main() { fn main() {
@ -24,6 +24,7 @@ fn main() {
let fetched = fetch_cwallet(); let fetched = fetch_cwallet();
print_wallet(&fetched); print_wallet(&fetched);
sign(); sign();
sss_sign();
// free_cwallet(wallet); // 对应 generate_cwallet() // free_cwallet(wallet); // 对应 generate_cwallet()
free_cwallet(fetched); // 对应 fetch_wallet() free_cwallet(fetched); // 对应 fetch_wallet()

View File

@ -87,6 +87,18 @@ pub unsafe extern "C" fn sign() {
}; };
} }
#[no_mangle]
pub unsafe extern "C" fn sss_sign() {
match wallet_impl::Wallet::retrieve_keys("wallet.json") {
Err(_) => {
println!("error sign");
}
Ok(w) => {
w.sss_sign();
}
};
}
unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet { unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
// 转换Rust字符串数据为C的字符串并移交ownership // 转换Rust字符串数据为C的字符串并移交ownership
let pubkey = CString::new(rwallet.public_key).unwrap(); let pubkey = CString::new(rwallet.public_key).unwrap();

View File

@ -1,7 +1,6 @@
extern crate hex; extern crate hex;
use anyhow::Result; use anyhow::Result;
use web3::types::{ H256, Bytes };
use secp256k1::{PublicKey, SecretKey, Message, Secp256k1}; use secp256k1::{PublicKey, SecretKey, Message, Secp256k1};
use secp256k1::rand::rngs::OsRng; use secp256k1::rand::rngs::OsRng;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -13,6 +12,8 @@ use web3::types::Address;
use web3::signing::{ hash_message, SecretKeyRef, Key }; use web3::signing::{ hash_message, SecretKeyRef, Key };
use std::str; use std::str;
use core::fmt::Write; use core::fmt::Write;
use shamir_secret_sharing::num_bigint::BigInt;
use shamir_secret_sharing::ShamirSecretSharing as SSS;
pub fn generate_keypair() -> (SecretKey, PublicKey) { pub fn generate_keypair() -> (SecretKey, PublicKey) {
let secp = Secp256k1::new(); let secp = Secp256k1::new();
@ -41,10 +42,10 @@ impl Wallet {
let addr: Address = public_key_address(&public_key); let addr: Address = public_key_address(&public_key);
println!("secret key: {:?}", secret_key); println!("secret key: {:?}", secret_key);
let mut s = String::with_capacity(2 * 32); let mut s = String::with_capacity(2 * 32);
// for i in &secret_key.secret_bytes() { for i in &secret_key.serialize_secret() {
// write!(s, "{:02x}", *i).unwrap(); write!(s, "{:02x}", *i).unwrap();
// } }
// println!("{:?}", s); println!("{:?}", s);
Wallet { Wallet {
@ -74,6 +75,38 @@ impl Wallet {
Ok(wallet) Ok(wallet)
} }
pub fn sss_sign(&self) {
let sss = SSS {
threshold: 2,
share_amount: 3,
prime: BigInt::parse_bytes(
b"fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
16,
)
.unwrap(),
};
let secret = BigInt::parse_bytes(
b"64a6f7baa58d7381f4068fc729568009ef8f36e9c7d9c33d2cf06afc25c01e87",
16,
)
.unwrap();
let shares = sss.split(secret.clone());
let key0 = shares[1].clone().1;
let key1 = shares[2].clone().1;
println!("key0: {:?}", key0.to_str_radix(16));
println!("key1: {:?}", key1.to_str_radix(16));
let kp0: (usize, BigInt) = (2, key0);
let kp1 = (3, key1);
let tmp = vec![kp0, kp1];
// println!("shares: {:?}", shares);
// assert_eq!(secret, sss.recover(&shares[..sss.threshold as usize]));
println!("secret: {:?}", secret.to_str_radix(16));
let secret_b = sss.recover(&tmp);
println!("recover: {:?}", secret_b.to_str_radix(16));
}
pub fn sign<S>(&self, msg: S) -> Result<()> pub fn sign<S>(&self, msg: S) -> Result<()>
where where
S: AsRef<[u8]>,{ S: AsRef<[u8]>,{
@ -85,7 +118,7 @@ impl Wallet {
println!("secret key: {:?}", pk); println!("secret key: {:?}", pk);
let key = SecretKeyRef::new(&pk); let key = SecretKeyRef::new(&pk);
let signature = key.sign(message_hash.as_bytes(), None).expect("hash is non-zero 32-bytes; qed");; let signature = key.sign(message_hash.as_bytes(), None).expect("hash is non-zero 32-bytes; qed");
let v = signature let v = signature
.v .v
.try_into() .try_into()
@ -104,11 +137,11 @@ impl Wallet {
bytes.extend_from_slice(signature.s.as_bytes()); bytes.extend_from_slice(signature.s.as_bytes());
bytes.push(v); bytes.push(v);
let mut string1 = String::with_capacity(2 * 65); let mut str_sign = String::with_capacity(2 * 65);
for i in bytes.iter() { for i in bytes.iter() {
write!(string1, "{:02x}", i).unwrap(); write!(str_sign, "{:02x}", i).unwrap();
} }
println!("web3 sign: {:?}", string1); println!("web3 sign: {:?}", str_sign);
let message_to_hash = Message::from_slice(message_hash.as_ref()).unwrap(); 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 (recovery_id, signature) = secp.sign_ecdsa_recoverable(&message_to_hash, &pk).serialize_compact();