diff --git a/examples/test.rs b/examples/test.rs index 0afaec1..649d32d 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -5,8 +5,8 @@ // use rustwallet::{ - free_cwallet, generate_sec_key, get_address, get_public_key, new_wallet, rdecrypt, rencrypt, - sign, sign_for_tran, str_deflate, str_inflate, CWallet, + free_cwallet, generate_sec_key, get_address, get_public_key, hex_deflate, hex_inflate, + new_wallet, rencrypt, sign, sign_for_tran, wallet_decrypt, wallet_encrypt, CWallet, }; use std::ffi::{CStr, CString}; use std::os::raw::c_char; @@ -98,7 +98,7 @@ fn main() { ); print_cchar!(str_signed2); - let str_encrypt = rencrypt( + let str_encrypt = wallet_encrypt( str_to_cchar!(msg_key), str_to_cchar!(key0), str_to_cchar!(key1), @@ -106,8 +106,7 @@ fn main() { str_to_cchar!(msg), ); print_cchar!(str_encrypt); - - let str_decrypt = rdecrypt( + let str_decrypt = wallet_decrypt( str_to_cchar!(msg_key), str_to_cchar!(key0), str_to_cchar!(key1), @@ -116,10 +115,22 @@ fn main() { ); print_cchar!(str_decrypt); - let str_encode = str_deflate(key_public); + let pk = "031a8338368250f544b6cc8f5d72d77ab13bd067f51d4e84b8148edcc6595327e2"; + let str_encrypt2 = rencrypt(str_to_cchar!(pk), str_to_cchar!(msg)); + print_cchar!(str_encrypt2); + let str_decrypt2 = wallet_decrypt( + str_to_cchar!(msg_key), + str_to_cchar!(key0), + str_to_cchar!(key1), + str_to_cchar!(key2), + str_encrypt2, + ); + print_cchar!(str_decrypt2); + + let str_encode = hex_deflate(key_public); print_cchar!(str_encode); - let str_decode = str_inflate(str_encode); + let str_decode = hex_inflate(str_encode); print_cchar!(str_decode); } } diff --git a/rustwallet.h b/rustwallet.h index f7e9614..b4f35b2 100644 --- a/rustwallet.h +++ b/rustwallet.h @@ -24,6 +24,11 @@ char *get_address(const char *msg_key, const char *second_key, const char *backup_key); +char *get_public_key(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key); + char *generate_sec_key(const char *msg_key, const char *master_key, const char *second_key, @@ -41,18 +46,20 @@ char *sign_for_tran(const char *msg_key, const char *backup_key, const char *msg); -char *rencrypt(const char *msg_key, - const char *master_key, - const char *second_key, - const char *backup_key, - const char *msg); +char *rencrypt(const char *pk, const char *msg); -char *rdecrypt(const char *msg_key, - const char *master_key, - const char *second_key, - const char *backup_key, - const char *msg); +char *wallet_encrypt(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key, + const char *msg); -char *str_deflate(const char *content); +char *wallet_decrypt(const char *msg_key, + const char *master_key, + const char *second_key, + const char *backup_key, + const char *msg); -char *str_inflate(const char *content); +char *hex_deflate(const char *content); + +char *hex_inflate(const char *content); diff --git a/scripts/android_build.sh b/scripts/android_build.sh index ccbf774..0dd6bef 100755 --- a/scripts/android_build.sh +++ b/scripts/android_build.sh @@ -8,26 +8,26 @@ cargo ndk -t armeabi-v7a -t arm64-v8a -t x86_64 -t x86 -p ${min_ver} build --rel jniLibs=./android/rusty-android-lib/src/main/jniLibs libName=librustwallet.a -rm -rf ${jniLibs} +#rm -rf ${jniLibs} -mkdir ${jniLibs} -mkdir ${jniLibs}/arm64-v8a -mkdir ${jniLibs}/armeabi-v7a -mkdir ${jniLibs}/x86_64 -mkdir ${jniLibs}/x86 +#mkdir ${jniLibs} +#mkdir ${jniLibs}/arm64-v8a +#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} +targetBase=~/Documents/workspace/crypto/cocos_js/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} +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 +cp rustwallet.h ${targetBase}/x86/include/rustwallet/rustwallet.h diff --git a/scripts/ios_build.sh b/scripts/ios_build.sh index 12051ad..49dbe47 100755 --- a/scripts/ios_build.sh +++ b/scripts/ios_build.sh @@ -8,12 +8,12 @@ proj=ios inc=./${proj}/include libs=./${proj}/libs -rm -rf ${inc} ${libs} +#rm -rf ${inc} ${libs} -mkdir ${inc} -mkdir ${libs} +#mkdir ${inc} +#mkdir ${libs} -targetBase=~/Documents/workspace/cocos/cocos2d-x/external/ios +targetBase=~/Documents/workspace/crypto/cocos_js/external/ios cp rustwallet.h ${targetBase}/include/rustwallet/rustwallet.h cp target/universal/release/librustwallet.a ${targetBase}/libs/librustwallet.a diff --git a/src/lib.rs b/src/lib.rs index fcf245e..c0bde87 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,8 +7,11 @@ use std::ffi::{CStr, CString}; use std::os::raw::c_char; +use std::str::FromStr; mod wallet; +use secp256k1::PublicKey; +use wallet::wallet_impl::zencrypt; use wallet_impl::Wallet; use crate::wallet::*; @@ -179,7 +182,22 @@ pub unsafe extern "C" fn sign_for_tran( } #[no_mangle] -pub unsafe extern "C" fn rencrypt( +pub unsafe extern "C" fn rencrypt(pk: *const c_char, msg: *const c_char) -> *mut c_char { + let msg_str = cchar_to_str!(msg); + let pk_str = cchar_to_str!(pk); + let public_key = match PublicKey::from_str(pk_str) { + Ok(v) => v, + Err(e) => panic!("error parse publickey: {}", e), + }; + let msg_encrypt = match zencrypt(public_key, msg_str) { + Ok(v) => v, + Err(err) => panic!("error encrypt: {:?}", err), + }; + str_to_cchar!(msg_encrypt) +} + +#[no_mangle] +pub unsafe extern "C" fn wallet_encrypt( msg_key: *const c_char, master_key: *const c_char, second_key: *const c_char, @@ -188,7 +206,8 @@ pub unsafe extern "C" fn rencrypt( ) -> *mut c_char { let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key); let msg_str = cchar_to_str!(msg); - let msg_encrypt = match rwallet.zencrypt(msg_str) { + let pk = rwallet.get_public_key(); + let msg_encrypt = match zencrypt(pk, msg_str) { Ok(v) => v, Err(err) => panic!("error encrypt: {:?}", err), }; @@ -196,7 +215,7 @@ pub unsafe extern "C" fn rencrypt( } #[no_mangle] -pub unsafe extern "C" fn rdecrypt( +pub unsafe extern "C" fn wallet_decrypt( msg_key: *const c_char, master_key: *const c_char, second_key: *const c_char, @@ -213,14 +232,14 @@ pub unsafe extern "C" fn rdecrypt( } #[no_mangle] -pub unsafe extern "C" fn str_deflate(content: *const c_char) -> *mut c_char { +pub unsafe extern "C" fn hex_deflate(content: *const c_char) -> *mut c_char { let content_str = cchar_to_str!(content); let msg_base64 = hex_to_base64(&content_str); str_to_cchar!(msg_base64) } #[no_mangle] -pub unsafe extern "C" fn str_inflate(content: *const c_char) -> *mut c_char { +pub unsafe extern "C" fn hex_inflate(content: *const c_char) -> *mut c_char { let content_str = cchar_to_str!(content); let msg_hex = base64_to_hex(&content_str); str_to_cchar!(msg_hex) diff --git a/src/utils/str_utils.rs b/src/utils/str_utils.rs index c701ebb..7d7795b 100644 --- a/src/utils/str_utils.rs +++ b/src/utils/str_utils.rs @@ -1,7 +1,11 @@ use base64::{engine::general_purpose, Engine as _}; pub fn hex_to_base64(content: &str) -> String { - let str_tmp = match hex::decode(content) { + let mut msg: String = content.clone().to_string(); + if msg.len() % 2 == 1 { + msg = "0".to_owned() + &msg; + } + let str_tmp = match hex::decode(msg) { Ok(v) => v, Err(e) => panic!("error decode hex str: {}", e), }; diff --git a/src/wallet/wallet_impl.rs b/src/wallet/wallet_impl.rs index 802f960..cffea5a 100644 --- a/src/wallet/wallet_impl.rs +++ b/src/wallet/wallet_impl.rs @@ -19,6 +19,19 @@ pub fn generate_keypair() -> (SecretKey, PublicKey) { secp.generate_keypair(&mut OsRng) } +pub fn zencrypt(pk: PublicKey, msg: &str) -> Result { + let pk = &pk.serialize(); + let msg = msg.as_bytes(); + // println!("msg before encrypt: {:?}", msg); + let msg_encrypt = match encrypt(pk, &msg) { + Ok(v) => v, + Err(e) => panic!("error encrypt content: {}", e), + }; + // println!("msg after encrypt: {:?}", &msg_encrypt); + let str_encrypt = hex::encode(&msg_encrypt); + Ok(str_encrypt) +} + pub fn public_key_address(public_key: &PublicKey) -> H160 { let public_key = public_key.serialize_uncompressed(); debug_assert_eq!(public_key[0], 0x04); @@ -178,7 +191,7 @@ impl Wallet { { let secp = Secp256k1::new(); let secret_key = self.get_secret_key(); - let hex_str = match hex::decode(msg){ + let hex_str = match hex::decode(msg) { Ok(v) => v, Err(e) => panic!("error decode hex str: {}", e), }; @@ -191,27 +204,13 @@ impl Wallet { Ok((s, recid)) } - pub fn zencrypt(&self, msg: &str) -> Result { - let pk = self.get_public_key(); - let pk = &pk.serialize(); - let msg = msg.as_bytes(); - // println!("msg before encrypt: {:?}", msg); - let msg_encrypt = match encrypt(pk, &msg) { - Ok(v) => v, - Err(e) => panic!("error encrypt content: {}", e), - }; - // println!("msg after encrypt: {:?}", &msg_encrypt); - let str_encrypt = hex::encode(&msg_encrypt); - Ok(str_encrypt) - } - pub fn zdecrypt(&self, msg1: &str) -> Result { let sk = self.get_secret_key(); 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) { Ok(v) => v,