From 739621df6a5e762f961b9b40f39c69a7c3a2626d Mon Sep 17 00:00:00 2001 From: cebgcontract <99630598+cebgcontract@users.noreply.github.com> Date: Tue, 15 Nov 2022 18:02:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9c=E7=9A=84=E6=8E=A5=E5=8F=A3,?= =?UTF-8?q?=20=E6=94=B9=E4=B8=BA=E4=BC=A0string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_ios.log | 0 examples/test.rs | 61 ++++++++++++++++------------- rustwallet.h | 29 ++++++++++---- scripts/android_build.sh | 11 ++++++ scripts/ios_build.sh | 6 +-- src/lib.rs | 80 +++++++++++++++++++++++++++++---------- src/wallet/wallet_impl.rs | 6 ++- 7 files changed, 135 insertions(+), 58 deletions(-) create mode 100644 build_ios.log diff --git a/build_ios.log b/build_ios.log new file mode 100644 index 0000000..e69de29 diff --git a/examples/test.rs b/examples/test.rs index 238c10f..3edbf60 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -6,7 +6,7 @@ use std::ffi::{CStr, CString}; use std::os::raw::c_char; -use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, sign_for_tran, CWallet, generate_sec_key}; +use rustwallet::{new_wallet, get_address, free_cwallet, sign, sign_for_tran, CWallet, generate_sec_key}; macro_rules! print_cchar{ ($p1:expr) => ( @@ -47,42 +47,49 @@ macro_rules! str_to_cchar { fn main() { unsafe { - let msg = "099c9c3da391df6e7e82141888db5cca"; - let wallet: CWallet = new_wallet(str_to_cchar!(msg)); - println!("---- generated a wallet to be used on C-side ----"); - print_wallet(&wallet); - let address = get_address(&wallet); - print_cchar!(address); - let address_str = cchar_to_str!(address); - println!("address: {}", address_str); - let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894")); - print_cchar!(sign_str); - let s_key = generate_sec_key(&wallet); - print_cchar!(s_key); + let msg = "a0f2022d15fd8072f12c76cc1596c4f1"; + // let wallet: CWallet = new_wallet(str_to_cchar!(msg)); + // println!("---- generated a wallet to be used on C-side ----"); + // print_wallet(&wallet); + // let address = get_address(&wallet); + // print_cchar!(address); + // let address_str = cchar_to_str!(address); + // println!("address: {}", address_str); + // let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894")); + // print_cchar!(sign_str); + // let s_key = generate_sec_key(&wallet); + // print_cchar!(s_key); - let key0 = "aadcabedb89a41db4c815bd149d3e7a1ff04247947efd5768666ba5f5e2df2e2"; - let key1 = "5b5d60194aa6588db9c52182a50d4657d918af3a9ff681207243957bac94791a"; - let key2 = ""; + let key0 = "3f26e586111b5c4cab6a5dd5e0d13c3b13184ba74410ba064a3b485be4f9a2cd"; + let key1 = ""; + let key2 = "cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5"; let tmp_cwallet = CWallet{ msg_key: str_to_cchar!(msg), master_key: str_to_cchar!(key0), second_key: str_to_cchar!(key1), - backup_key: str_to_cchar!("") + backup_key: str_to_cchar!(key2) }; - let address2 = get_address(&tmp_cwallet); + let address2 = get_address( + str_to_cchar!(msg), + str_to_cchar!(key0), + str_to_cchar!(key1), + str_to_cchar!(key2) + ); print_cchar!(address2); - let tmp_cwallet2 = restore_wallet(&tmp_cwallet); - let address3 = get_address(&tmp_cwallet2); - print_cchar!(address3); + // let s_key2 = generate_sec_key(&tmp_cwallet); + // print_cchar!(s_key2); + // let tmp_cwallet2 = restore_wallet(&tmp_cwallet); + // let address3 = get_address(&tmp_cwallet2); + // print_cchar!(address3); - let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111")); - print_cchar!(sign_str); + // let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111")); + // print_cchar!(sign_str); - let cwallet3 = reset_wallet(&tmp_cwallet2); - print_wallet(&cwallet3); - let sign_str2 = sign(&cwallet3, str_to_cchar!("111")); - print_cchar!(sign_str2); + // let cwallet3 = reset_wallet(&tmp_cwallet2); + // print_wallet(&cwallet3); + // let sign_str2 = sign(&cwallet3, str_to_cchar!("111")); + // print_cchar!(sign_str2); // print_wallet(&tmp_cwallet2); // println!("---- saving the wallet to wallet.json ----"); // save_wallet(&wallet); diff --git a/rustwallet.h b/rustwallet.h index 593e636..c518ea9 100644 --- a/rustwallet.h +++ b/rustwallet.h @@ -12,16 +12,31 @@ typedef struct CWallet { struct CWallet new_wallet(const char *msg); -struct CWallet restore_wallet(const struct CWallet *cw); - -struct CWallet reset_wallet(const struct CWallet *cw); +struct CWallet reset_wallet(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key); void free_cwallet(struct CWallet cw); -char *get_address(const struct CWallet *cw); +char *get_address(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key); -char *generate_sec_key(const struct CWallet *cw); +char *generate_sec_key(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key); -char *sign(const struct CWallet *cw, const char *msg); +char *sign(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key, + const char *msg); -char *sign_for_tran(const struct CWallet *cw, const char *msg); +char *sign_for_tran(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key, + const char *msg); diff --git a/scripts/android_build.sh b/scripts/android_build.sh index f81298c..ccbf774 100755 --- a/scripts/android_build.sh +++ b/scripts/android_build.sh @@ -16,7 +16,18 @@ mkdir ${jniLibs}/armeabi-v7a mkdir ${jniLibs}/x86_64 mkdir ${jniLibs}/x86 +targetBase=~/Documents/workspace/cocos/cocos2d-x/external/android cp target/aarch64-linux-android/release/${libName} ${jniLibs}/arm64-v8a/${libName} cp target/armv7-linux-androideabi/release/${libName} ${jniLibs}/armeabi-v7a/${libName} cp target/x86_64-linux-android/release/${libName} ${jniLibs}/x86_64/${libName} cp target/i686-linux-android/release/${libName} ${jniLibs}/x86/${libName} + +cp target/aarch64-linux-android/release/${libName} ${targetBase}/arm64-v8a/${libName} +cp target/armv7-linux-androideabi/release/${libName} ${targetBase}/armeabi-v7a/${libName} +cp target/x86_64-linux-android/release/${libName} ${targetBase}/x86_64/${libName} +cp target/i686-linux-android/release/${libName} ${targetBase}/x86/${libName} +cbindgen src/lib.rs -l c > rustwallet.h +cp rustwallet.h ${targetBase}/arm64-v8a/include/rustwallet/rustwallet.h +cp rustwallet.h ${targetBase}/armeabi-v7a/include/rustwallet/rustwallet.h +cp rustwallet.h ${targetBase}/x86_64/include/rustwallet/rustwallet.h +cp rustwallet.h ${targetBase}/x86/include/rustwallet/rustwallet.h \ No newline at end of file diff --git a/scripts/ios_build.sh b/scripts/ios_build.sh index 973dcd4..453af08 100755 --- a/scripts/ios_build.sh +++ b/scripts/ios_build.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # building -cbindgen src/lib.rs -l c > rustwallet.h +# cbindgen src/lib.rs -l c > rustwallet.h cargo lipo --release # moving files to the ios project @@ -13,5 +13,5 @@ rm -rf ${inc} ${libs} mkdir ${inc} mkdir ${libs} -cp rustywallet.h ${inc} -cp target/universal/release/librustywallet.a ${libs} +cp rustwallet.h ${inc} +cp target/universal/release/librustwallet.a ${libs} diff --git a/src/lib.rs b/src/lib.rs index fa31bfb..af2e155 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -90,15 +90,15 @@ pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet { convert_to_cwallet(rust_wallet) } -#[no_mangle] -pub unsafe extern "C" fn restore_wallet(cw: &CWallet) -> CWallet { - let rust_wallet = convert_to_rwallet(cw); - convert_to_cwallet(rust_wallet) -} #[no_mangle] -pub unsafe extern "C" fn reset_wallet(cw: &CWallet) -> CWallet { - let rust_wallet = convert_to_rwallet(cw); +pub unsafe extern "C" fn reset_wallet( + msg_key: *const c_char, + master_key: *const c_char, + second_key: *const c_char, + backup_key: *const c_char, +) -> CWallet { + let rust_wallet = generate_rwallet(msg_key, master_key, second_key, backup_key); let rust_wallet2 = rust_wallet.reset_wallet(); convert_to_cwallet(rust_wallet2) } @@ -112,8 +112,13 @@ pub unsafe extern "C" fn free_cwallet(cw: CWallet) { } #[no_mangle] -pub unsafe extern "C" fn get_address(cw: &CWallet) -> *mut c_char{ - let rwallet = convert_to_rwallet(cw); +pub unsafe extern "C" fn get_address( + 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 address = rwallet.get_address(); let address_str = format!("{:?}", address); let c_address = CString::new(address_str).unwrap(); @@ -121,16 +126,27 @@ pub unsafe extern "C" fn get_address(cw: &CWallet) -> *mut c_char{ } #[no_mangle] -pub unsafe extern "C" fn generate_sec_key(cw: &CWallet) -> *mut c_char { - let rwallet = convert_to_rwallet(cw); +pub unsafe extern "C" fn generate_sec_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 s_key = rwallet.generate_sec_key(); let cs_key = CString::new(s_key).unwrap(); cs_key.into_raw() } #[no_mangle] -pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{ - let rwallet = convert_to_rwallet(cw); +pub unsafe extern "C" fn sign( + msg_key: *const c_char, + master_key: *const c_char, + second_key: *const c_char, + backup_key: *const c_char, + msg: *const c_char +) -> *mut c_char{ + let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key); let msg_str = cchar_to_str!(msg); let signature = rwallet.sign(msg_str); let r = match signature { @@ -141,8 +157,14 @@ pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{ } #[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); +pub unsafe extern "C" fn sign_for_tran( + msg_key: *const c_char, + master_key: *const c_char, + second_key: *const c_char, + backup_key: *const c_char, + msg: *const c_char +) -> *mut c_char{ + let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key); let msg_str = cchar_to_str!(msg); let signature = rwallet.sign_for_tran(msg_str); let (r, recid) = match signature { @@ -169,11 +191,29 @@ unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet { cw } -unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet { - let pmsg = cchar_to_string!(cwallet.msg_key); - let pm = cchar_to_string!(cwallet.master_key); - let second_key = cchar_to_ostring!(cwallet.second_key); - let backup_key = cchar_to_ostring!(cwallet.backup_key); +// unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet { +// let pmsg = cchar_to_string!(cwallet.msg_key); +// let pm = cchar_to_string!(cwallet.master_key); +// let second_key = cchar_to_ostring!(cwallet.second_key); +// let backup_key = cchar_to_ostring!(cwallet.backup_key); +// Wallet { +// msg_key: pmsg, +// master_key: pm, +// second_key: second_key, +// backup_key: backup_key +// } +// } + +unsafe fn generate_rwallet( + msg_key: *const c_char, + master_key: *const c_char, + second_key: *const c_char, + backup_key: *const c_char, +) ->Wallet { + let pmsg = cchar_to_string!(msg_key); + let pm = cchar_to_string!(master_key); + let second_key = cchar_to_ostring!(second_key); + let backup_key = cchar_to_ostring!(backup_key); Wallet { msg_key: pmsg, master_key: pm, diff --git a/src/wallet/wallet_impl.rs b/src/wallet/wallet_impl.rs index a40f621..47d1e10 100644 --- a/src/wallet/wallet_impl.rs +++ b/src/wallet/wallet_impl.rs @@ -139,7 +139,11 @@ impl Wallet { let _tmp = vec![kp0, kp1]; let sss = get_sss(&self.msg_key); let secret_b = sss.recover(&_tmp); - let s_key_str = secret_b.to_str_radix(16); + let mut s_key_str = secret_b.to_str_radix(16); + if s_key_str.len() < 64 { + s_key_str += "0"; + } + println!("{}", &s_key_str); SecretKey::from_str(&s_key_str).expect("32 bytes, within curve order") }