hex->base64转换增加保护, 增加测试
This commit is contained in:
parent
551a9d2b5f
commit
3fa7726102
@ -5,7 +5,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
use rustwallet::{
|
use rustwallet::{
|
||||||
free_cwallet, generate_sec_key, get_address, new_wallet, sign, sign_for_tran, CWallet,
|
free_cwallet, generate_sec_key, get_address, get_public_key, new_wallet, rdecrypt, rencrypt,
|
||||||
|
sign, sign_for_tran, str_deflate, str_inflate, CWallet,
|
||||||
};
|
};
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
use std::os::raw::c_char;
|
use std::os::raw::c_char;
|
||||||
@ -64,13 +65,13 @@ fn main() {
|
|||||||
str_to_cchar!(key2),
|
str_to_cchar!(key2),
|
||||||
);
|
);
|
||||||
print_cchar!(address2);
|
print_cchar!(address2);
|
||||||
let key__public = generate_sec_key(
|
let key_public = get_public_key(
|
||||||
str_to_cchar!(msg_key),
|
str_to_cchar!(msg_key),
|
||||||
str_to_cchar!(key0),
|
str_to_cchar!(key0),
|
||||||
str_to_cchar!(key1),
|
str_to_cchar!(key1),
|
||||||
str_to_cchar!(key2),
|
str_to_cchar!(key2),
|
||||||
);
|
);
|
||||||
print_cchar!(key_private);
|
print_cchar!(key_public);
|
||||||
let key_private = generate_sec_key(
|
let key_private = generate_sec_key(
|
||||||
str_to_cchar!(msg_key),
|
str_to_cchar!(msg_key),
|
||||||
str_to_cchar!(key0),
|
str_to_cchar!(key0),
|
||||||
@ -78,32 +79,48 @@ fn main() {
|
|||||||
str_to_cchar!(key2),
|
str_to_cchar!(key2),
|
||||||
);
|
);
|
||||||
print_cchar!(key_private);
|
print_cchar!(key_private);
|
||||||
// let tmp_cwallet2 = restore_wallet(&tmp_cwallet);
|
let msg = "hello world";
|
||||||
// let address3 = get_address(&tmp_cwallet2);
|
let str_signed = sign(
|
||||||
// print_cchar!(address3);
|
str_to_cchar!(msg_key),
|
||||||
|
str_to_cchar!(key0),
|
||||||
|
str_to_cchar!(key1),
|
||||||
|
str_to_cchar!(key2),
|
||||||
|
str_to_cchar!(msg),
|
||||||
|
);
|
||||||
|
print_cchar!(str_signed);
|
||||||
|
let tran_str = "0cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5";
|
||||||
|
let str_signed2 = sign_for_tran(
|
||||||
|
str_to_cchar!(msg_key),
|
||||||
|
str_to_cchar!(key0),
|
||||||
|
str_to_cchar!(key1),
|
||||||
|
str_to_cchar!(key2),
|
||||||
|
str_to_cchar!(tran_str),
|
||||||
|
);
|
||||||
|
print_cchar!(str_signed2);
|
||||||
|
|
||||||
// let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111"));
|
let str_encrypt = rencrypt(
|
||||||
// print_cchar!(sign_str);
|
str_to_cchar!(msg_key),
|
||||||
|
str_to_cchar!(key0),
|
||||||
|
str_to_cchar!(key1),
|
||||||
|
str_to_cchar!(key2),
|
||||||
|
str_to_cchar!(msg),
|
||||||
|
);
|
||||||
|
print_cchar!(str_encrypt);
|
||||||
|
|
||||||
// let cwallet3 = reset_wallet(&tmp_cwallet2);
|
let str_decrypt = rdecrypt(
|
||||||
// print_wallet(&cwallet3);
|
str_to_cchar!(msg_key),
|
||||||
// let sign_str2 = sign(&cwallet3, str_to_cchar!("111"));
|
str_to_cchar!(key0),
|
||||||
// print_cchar!(sign_str2);
|
str_to_cchar!(key1),
|
||||||
// print_wallet(&tmp_cwallet2);
|
str_to_cchar!(key2),
|
||||||
// println!("---- saving the wallet to wallet.json ----");
|
str_encrypt,
|
||||||
// save_wallet(&wallet);
|
);
|
||||||
// println!("---- saved! ----");
|
print_cchar!(str_decrypt);
|
||||||
|
|
||||||
// println!("---- fetching the saved wallet to be exposed to C-side ----");
|
let str_encode = str_deflate(key_public);
|
||||||
// let fetched = fetch_cwallet();
|
print_cchar!(str_encode);
|
||||||
// print_wallet(&fetched);
|
|
||||||
// sign();
|
|
||||||
// let sign_str = "111";
|
|
||||||
// let cstr = std::ffi::CString::new(sign_str).unwrap();
|
|
||||||
// sss_sign(cstr.into_raw());
|
|
||||||
|
|
||||||
// // free_cwallet(wallet); // 对应 generate_cwallet()
|
let str_decode = str_inflate(str_encode);
|
||||||
// free_cwallet(fetched); // 对应 fetch_wallet()
|
print_cchar!(str_decode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
85
src/lib.rs
85
src/lib.rs
@ -17,29 +17,24 @@ use utils::str_utils::{base64_to_hex, hex_to_base64};
|
|||||||
|
|
||||||
// #[cfg(target_os = "android")]
|
// #[cfg(target_os = "android")]
|
||||||
// mod android;
|
// mod android;
|
||||||
macro_rules! cchar_to_str{
|
macro_rules! cchar_to_str {
|
||||||
($p1:expr) => {
|
($p1:expr) => {{
|
||||||
{
|
|
||||||
let s = CStr::from_ptr($p1);
|
let s = CStr::from_ptr($p1);
|
||||||
let ps = s.to_str().unwrap();
|
let ps = s.to_str().unwrap();
|
||||||
ps
|
ps
|
||||||
}
|
}};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! cchar_to_string{
|
macro_rules! cchar_to_string {
|
||||||
($p1:expr) => {
|
($p1:expr) => {{
|
||||||
{
|
|
||||||
let s = CStr::from_ptr($p1);
|
let s = CStr::from_ptr($p1);
|
||||||
let ps = s.to_str().unwrap();
|
let ps = s.to_str().unwrap();
|
||||||
ps.to_string()
|
ps.to_string()
|
||||||
}
|
}};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! cchar_to_ostring{
|
macro_rules! cchar_to_ostring {
|
||||||
($p1:expr) => {
|
($p1:expr) => {{
|
||||||
{
|
|
||||||
let s = CStr::from_ptr($p1);
|
let s = CStr::from_ptr($p1);
|
||||||
let pb = s.to_str().unwrap();
|
let pb = s.to_str().unwrap();
|
||||||
let result = if pb.is_empty() {
|
let result = if pb.is_empty() {
|
||||||
@ -48,33 +43,26 @@ macro_rules! cchar_to_ostring{
|
|||||||
Some(pb.to_string())
|
Some(pb.to_string())
|
||||||
};
|
};
|
||||||
result
|
result
|
||||||
}
|
}};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! str_to_cchar {
|
macro_rules! str_to_cchar {
|
||||||
($p1:expr) => {
|
($p1:expr) => {{
|
||||||
{
|
|
||||||
let msgkey = CString::new($p1).unwrap();
|
let msgkey = CString::new($p1).unwrap();
|
||||||
let c_msgkey: *mut c_char = msgkey.into_raw();
|
let c_msgkey: *mut c_char = msgkey.into_raw();
|
||||||
c_msgkey
|
c_msgkey
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! ostr_to_cchar{
|
macro_rules! ostr_to_cchar {
|
||||||
($p1:expr) => {
|
($p1:expr) => {{
|
||||||
{
|
|
||||||
let key = match $p1 {
|
let key = match $p1 {
|
||||||
Some(val) => {
|
Some(val) => CString::new(val).unwrap(),
|
||||||
CString::new(val).unwrap()
|
None => CString::new("").unwrap(),
|
||||||
},
|
|
||||||
None => CString::new("").unwrap()
|
|
||||||
};
|
};
|
||||||
let c_key: *mut c_char = key.into_raw();
|
let c_key: *mut c_char = key.into_raw();
|
||||||
c_key
|
c_key
|
||||||
}
|
}};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@ -92,7 +80,6 @@ pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet {
|
|||||||
convert_to_cwallet(rust_wallet)
|
convert_to_cwallet(rust_wallet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn reset_wallet(
|
pub unsafe extern "C" fn reset_wallet(
|
||||||
msg_key: *const c_char,
|
msg_key: *const c_char,
|
||||||
@ -119,7 +106,7 @@ pub unsafe extern "C" fn get_address(
|
|||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
second_key: *const c_char,
|
second_key: *const c_char,
|
||||||
backup_key: *const c_char,
|
backup_key: *const c_char,
|
||||||
) -> *mut c_char{
|
) -> *mut c_char {
|
||||||
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
||||||
let address = rwallet.get_address();
|
let address = rwallet.get_address();
|
||||||
let address_str = format!("{:?}", address);
|
let address_str = format!("{:?}", address);
|
||||||
@ -127,6 +114,19 @@ pub unsafe extern "C" fn get_address(
|
|||||||
c_address.into_raw()
|
c_address.into_raw()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn get_public_key(
|
||||||
|
msg_key: *const c_char,
|
||||||
|
master_key: *const c_char,
|
||||||
|
second_key: *const c_char,
|
||||||
|
backup_key: *const c_char,
|
||||||
|
) -> *mut c_char {
|
||||||
|
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
||||||
|
let pk = rwallet.get_public_key();
|
||||||
|
let c_pk = CString::new(pk.to_string()).unwrap();
|
||||||
|
c_pk.into_raw()
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn generate_sec_key(
|
pub unsafe extern "C" fn generate_sec_key(
|
||||||
msg_key: *const c_char,
|
msg_key: *const c_char,
|
||||||
@ -146,8 +146,8 @@ pub unsafe extern "C" fn sign(
|
|||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
second_key: *const c_char,
|
second_key: *const c_char,
|
||||||
backup_key: *const c_char,
|
backup_key: *const c_char,
|
||||||
msg: *const c_char
|
msg: *const c_char,
|
||||||
) -> *mut c_char{
|
) -> *mut c_char {
|
||||||
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
||||||
let msg_str = cchar_to_str!(msg);
|
let msg_str = cchar_to_str!(msg);
|
||||||
let signature = rwallet.sign(msg_str);
|
let signature = rwallet.sign(msg_str);
|
||||||
@ -164,10 +164,11 @@ pub unsafe extern "C" fn sign_for_tran(
|
|||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
second_key: *const c_char,
|
second_key: *const c_char,
|
||||||
backup_key: *const c_char,
|
backup_key: *const c_char,
|
||||||
msg: *const c_char
|
msg: *const c_char,
|
||||||
) -> *mut c_char{
|
) -> *mut c_char {
|
||||||
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
||||||
let msg_str = cchar_to_str!(msg);
|
let msg_str = cchar_to_str!(msg);
|
||||||
|
println!("msg for sign tran: {}", &msg_str);
|
||||||
let signature = rwallet.sign_for_tran(msg_str);
|
let signature = rwallet.sign_for_tran(msg_str);
|
||||||
let (r, recid) = match signature {
|
let (r, recid) = match signature {
|
||||||
Ok((v, _recid)) => (v, _recid),
|
Ok((v, _recid)) => (v, _recid),
|
||||||
@ -183,11 +184,11 @@ pub unsafe extern "C" fn rencrypt(
|
|||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
second_key: *const c_char,
|
second_key: *const c_char,
|
||||||
backup_key: *const c_char,
|
backup_key: *const c_char,
|
||||||
msg: *const c_char
|
msg: *const c_char,
|
||||||
) -> *mut c_char{
|
) -> *mut c_char {
|
||||||
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
||||||
let msg_str = cchar_to_str!(msg);
|
let msg_str = cchar_to_str!(msg);
|
||||||
let msg_encrypt = match rwallet.zencrypt(msg_str){
|
let msg_encrypt = match rwallet.zencrypt(msg_str) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(err) => panic!("error encrypt: {:?}", err),
|
Err(err) => panic!("error encrypt: {:?}", err),
|
||||||
};
|
};
|
||||||
@ -200,11 +201,11 @@ pub unsafe extern "C" fn rdecrypt(
|
|||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
second_key: *const c_char,
|
second_key: *const c_char,
|
||||||
backup_key: *const c_char,
|
backup_key: *const c_char,
|
||||||
msg: *const c_char
|
msg: *const c_char,
|
||||||
) -> *mut c_char{
|
) -> *mut c_char {
|
||||||
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
|
||||||
let msg_str = cchar_to_str!(msg);
|
let msg_str = cchar_to_str!(msg);
|
||||||
let msg_decrypt = match rwallet.zdecrypt(msg_str){
|
let msg_decrypt = match rwallet.zdecrypt(msg_str) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(err) => panic!("error decrypt: {:?}", err),
|
Err(err) => panic!("error decrypt: {:?}", err),
|
||||||
};
|
};
|
||||||
@ -245,7 +246,7 @@ unsafe fn generate_rwallet(
|
|||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
second_key: *const c_char,
|
second_key: *const c_char,
|
||||||
backup_key: *const c_char,
|
backup_key: *const c_char,
|
||||||
) ->Wallet {
|
) -> Wallet {
|
||||||
let pmsg = cchar_to_string!(msg_key);
|
let pmsg = cchar_to_string!(msg_key);
|
||||||
let pm = cchar_to_string!(master_key);
|
let pm = cchar_to_string!(master_key);
|
||||||
let second_key = cchar_to_ostring!(second_key);
|
let second_key = cchar_to_ostring!(second_key);
|
||||||
@ -254,6 +255,6 @@ unsafe fn generate_rwallet(
|
|||||||
msg_key: pmsg,
|
msg_key: pmsg,
|
||||||
master_key: pm,
|
master_key: pm,
|
||||||
second_key: second_key,
|
second_key: second_key,
|
||||||
backup_key: backup_key
|
backup_key: backup_key,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,10 @@ impl Wallet {
|
|||||||
{
|
{
|
||||||
let secp = Secp256k1::new();
|
let secp = Secp256k1::new();
|
||||||
let secret_key = self.get_secret_key();
|
let secret_key = self.get_secret_key();
|
||||||
let hex_str = hex::decode(msg).unwrap();
|
let hex_str = match hex::decode(msg){
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => panic!("error decode hex str: {}", e),
|
||||||
|
};
|
||||||
let message_to_hash = Message::from_slice(&hex_str).unwrap();
|
let message_to_hash = Message::from_slice(&hex_str).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)
|
||||||
@ -192,29 +195,33 @@ impl Wallet {
|
|||||||
let pk = self.get_public_key();
|
let pk = self.get_public_key();
|
||||||
let pk = &pk.serialize();
|
let pk = &pk.serialize();
|
||||||
let msg = msg.as_bytes();
|
let msg = msg.as_bytes();
|
||||||
println!("msg before encrypt: {:?}", msg);
|
// println!("msg before encrypt: {:?}", msg);
|
||||||
let msg_encrypt = match encrypt(pk, &msg) {
|
let msg_encrypt = match encrypt(pk, &msg) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => panic!("error encrypt content: {}", e),
|
Err(e) => panic!("error encrypt content: {}", e),
|
||||||
};
|
};
|
||||||
println!("msg after encrypt: {:?}", &msg_encrypt);
|
// println!("msg after encrypt: {:?}", &msg_encrypt);
|
||||||
let str_encrypt = hex::encode(&msg_encrypt);
|
let str_encrypt = hex::encode(&msg_encrypt);
|
||||||
Ok(str_encrypt)
|
Ok(str_encrypt)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn zdecrypt(&self, msg: &str) -> Result<String> {
|
pub fn zdecrypt(&self, msg1: &str) -> Result<String> {
|
||||||
let sk = self.get_secret_key();
|
let sk = self.get_secret_key();
|
||||||
let sk = sk.secret_bytes();
|
let sk = sk.secret_bytes();
|
||||||
|
let mut msg: String = msg1.clone().to_string();
|
||||||
|
if msg.len() % 2 == 1 {
|
||||||
|
msg = "0".to_owned() + &msg;
|
||||||
|
}
|
||||||
|
println!("msg to decrypt: {:?}", &msg);
|
||||||
let msg = match hex::decode(&msg) {
|
let msg = match hex::decode(&msg) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => panic!("error decode hex str {}", e),
|
Err(e) => panic!("error decode hex str: {}", e),
|
||||||
};
|
};
|
||||||
println!("msg to decrypt: {:?}", &msg);
|
|
||||||
let msg_decrypt = match decrypt(&sk, &msg) {
|
let msg_decrypt = match decrypt(&sk, &msg) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(e) => panic!("error decrypt content: {}", e),
|
Err(e) => panic!("error decrypt content: {}", e),
|
||||||
};
|
};
|
||||||
println!("msg after decrypt: {:?}", &msg_decrypt);
|
// println!("msg after decrypt: {:?}", &msg_decrypt);
|
||||||
// let msg_decrypt = hex::encode(msg_decrypt);
|
// let msg_decrypt = hex::encode(msg_decrypt);
|
||||||
let str_decrypt = match str::from_utf8(&msg_decrypt) {
|
let str_decrypt = match str::from_utf8(&msg_decrypt) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
@ -225,4 +232,3 @@ impl Wallet {
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user