增加替换ehereumjs-util.signature.ecsign签名的方法
This commit is contained in:
parent
1b1228fa28
commit
e2de3e296c
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
use std::os::raw::c_char;
|
use std::os::raw::c_char;
|
||||||
use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, CWallet};
|
use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, sign_for_tran, CWallet};
|
||||||
|
|
||||||
macro_rules! print_cchar{
|
macro_rules! print_cchar{
|
||||||
($p1:expr) => (
|
($p1:expr) => (
|
||||||
@ -47,22 +47,26 @@ macro_rules! str_to_cchar {
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
unsafe {
|
unsafe {
|
||||||
let msg = "111";
|
let msg = "099c9c3da391df6e7e82141888db5cca";
|
||||||
let wallet: CWallet = new_wallet(str_to_cchar!(msg));
|
let wallet: CWallet = new_wallet(str_to_cchar!(msg));
|
||||||
println!("---- generated a wallet to be used on C-side ----");
|
println!("---- generated a wallet to be used on C-side ----");
|
||||||
print_wallet(&wallet);
|
print_wallet(&wallet);
|
||||||
let address = get_address(&wallet);
|
let address = get_address(&wallet);
|
||||||
print_cchar!(address);
|
print_cchar!(address);
|
||||||
// let address_str = cchar_to_str!(address);
|
let address_str = cchar_to_str!(address);
|
||||||
// println!("address: {}", address_str);
|
println!("address: {}", address_str);
|
||||||
let key0 = "3da2dfc54de71230f639f37de61d8f8c4699f75e783dc54353146a4b73250366";
|
let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894"));
|
||||||
let key1 = "a1a3ed90e41a37096f07957b9888ffa7a74406f3a3e8c77686d92f2ba7c22d58";
|
print_cchar!(sign_str);
|
||||||
let key2 = "27216cbe70021d5d1d018da5ab548b8b45dee4fd9ec0b33ab1dd264cf2ff249f";
|
|
||||||
|
|
||||||
|
let key0 = "aadcabedb89a41db4c815bd149d3e7a1ff04247947efd5768666ba5f5e2df2e2";
|
||||||
|
let key1 = "5b5d60194aa6588db9c52182a50d4657d918af3a9ff681207243957bac94791a";
|
||||||
|
let key2 = "";
|
||||||
let tmp_cwallet = CWallet{
|
let tmp_cwallet = CWallet{
|
||||||
msg_key: str_to_cchar!(msg),
|
msg_key: str_to_cchar!(msg),
|
||||||
master_key: str_to_cchar!(key0),
|
master_key: str_to_cchar!(key0),
|
||||||
second_key: str_to_cchar!(""),
|
second_key: str_to_cchar!(key1),
|
||||||
backup_key: str_to_cchar!(key2)
|
backup_key: str_to_cchar!("")
|
||||||
};
|
};
|
||||||
let address2 = get_address(&tmp_cwallet);
|
let address2 = get_address(&tmp_cwallet);
|
||||||
print_cchar!(address2);
|
print_cchar!(address2);
|
||||||
|
13
src/lib.rs
13
src/lib.rs
@ -140,6 +140,19 @@ pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{
|
|||||||
str_to_cchar!(r)
|
str_to_cchar!(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn sign_for_tran(cw: &CWallet, msg: *const c_char) -> *mut c_char{
|
||||||
|
let rwallet = convert_to_rwallet(cw);
|
||||||
|
println!("rwallet: {:?}", rwallet);
|
||||||
|
let msg_str = cchar_to_str!(msg);
|
||||||
|
let signature = rwallet.sign_for_tran(msg_str);
|
||||||
|
let r = match signature {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(err) => panic!("Problem sign: {:?}", err),
|
||||||
|
};
|
||||||
|
str_to_cchar!(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
|
unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
|
||||||
// 转换Rust字符串数据为C的字符串并移交ownership
|
// 转换Rust字符串数据为C的字符串并移交ownership
|
||||||
|
@ -228,7 +228,6 @@ impl Wallet {
|
|||||||
let message = msg.as_ref();
|
let message = msg.as_ref();
|
||||||
let message_hash = hash_message(message.as_ref());
|
let message_hash = hash_message(message.as_ref());
|
||||||
println!("secret key: {:?}", &secret_key);
|
println!("secret key: {:?}", &secret_key);
|
||||||
|
|
||||||
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
|
let (recovery_id, signature) = secp
|
||||||
.sign_ecdsa_recoverable(&message_to_hash, &secret_key)
|
.sign_ecdsa_recoverable(&message_to_hash, &secret_key)
|
||||||
@ -244,4 +243,18 @@ impl Wallet {
|
|||||||
|
|
||||||
Ok(s)
|
Ok(s)
|
||||||
}
|
}
|
||||||
|
pub fn sign_for_tran<S>(&self, msg: S) -> Result<String>
|
||||||
|
where
|
||||||
|
S: AsRef<[u8]>,
|
||||||
|
{
|
||||||
|
let secp = Secp256k1::new();
|
||||||
|
let secret_key = self.get_secret_key();
|
||||||
|
let hex_str = hex::decode(msg).unwrap();
|
||||||
|
let message_to_hash = Message::from_slice(&hex_str).unwrap();
|
||||||
|
let (_recovery_id, signature) = secp
|
||||||
|
.sign_ecdsa_recoverable(&message_to_hash, &secret_key)
|
||||||
|
.serialize_compact();
|
||||||
|
let s = hex::encode(signature);
|
||||||
|
Ok(s)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user