From 0c35f61d70a41ed7b5acd25015d03f9c12a1398b Mon Sep 17 00:00:00 2001 From: zhl Date: Fri, 24 Feb 2023 13:01:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BD=BF=E7=94=A8=E9=92=B1?= =?UTF-8?q?=E5=8C=85=E5=AF=86=E9=92=A5=E5=92=8C=E5=85=AC=E9=92=A5=E5=8A=A0?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 336 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + examples/test.rs | 73 +++++---- scripts/wasm_build.sh | 0 src/lib.rs | 148 ++++++++++------- src/wallet/wallet_impl.rs | 67 +++++--- 6 files changed, 513 insertions(+), 112 deletions(-) mode change 100644 => 100755 scripts/wasm_build.sh diff --git a/Cargo.lock b/Cargo.lock index 6a85bca..7b42c92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,53 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aead" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "anyhow" version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + [[package]] name = "arrayvec" version = "0.7.2" @@ -20,6 +61,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "bitcoin_hashes" version = "0.11.0" @@ -44,6 +91,24 @@ dependencies = [ "wyz", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.11.0" @@ -74,6 +139,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cipher" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -83,12 +158,86 @@ dependencies = [ "bitflags", ] +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + [[package]] name = "crunchy" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", + "subtle", +] + +[[package]] +name = "ecies" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374125c18bfe63716aae1b6b4ee0243e6264f1766056b5efdd4f257732aa3543" +dependencies = [ + "aes-gcm", + "getrandom", + "hkdf", + "libsecp256k1", + "rand 0.8.5", + "sha2 0.10.6", + "typenum", +] + [[package]] name = "fixed-hash" version = "0.8.0" @@ -113,6 +262,16 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.7" @@ -126,12 +285,61 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ghash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -152,6 +360,15 @@ dependencies = [ "syn", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "itoa" version = "1.0.3" @@ -173,6 +390,54 @@ version = "0.2.133" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + [[package]] name = "log" version = "0.4.17" @@ -219,6 +484,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "parity-scale-codec" version = "3.2.1" @@ -245,6 +516,18 @@ dependencies = [ "syn", ] +[[package]] +name = "polyval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -367,6 +650,7 @@ version = "0.1.0" dependencies = [ "anyhow", "bitcoin_hashes", + "ecies", "getrandom", "hex", "primitive-types", @@ -435,6 +719,30 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + [[package]] name = "shamir_secret_sharing" version = "0.1.1" @@ -452,6 +760,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + [[package]] name = "syn" version = "1.0.100" @@ -507,6 +821,12 @@ dependencies = [ "serde", ] +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "uint" version = "0.9.4" @@ -525,6 +845,22 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" +[[package]] +name = "universal-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index e2ea61f..eddb66e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ shamir_secret_sharing = "0.1.1" tiny-keccak = "1.5" primitive-types = "0.12.1" getrandom = { version = "0.2.7", features = ["js"]} +ecies = {version = "0.2", default-features = false, features = ["pure"]} #[target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.83" diff --git a/examples/test.rs b/examples/test.rs index 52a0fed..1c7703f 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -4,45 +4,39 @@ // 测试钱包在C侧调用接口存储和重新读出钱包密钥 // +use rustwallet::{ + decrypt, encrypt, generate_sec_key, get_address, new_wallet, sign, sign_for_tran, CWallet, +}; use std::ffi::{CStr, CString}; use std::os::raw::c_char; -use rustwallet::{new_wallet, get_address, sign, sign_for_tran, CWallet, generate_sec_key}; -macro_rules! print_cchar{ - ($p1:expr) => ( +macro_rules! print_cchar { + ($p1:expr) => { let s = CStr::from_ptr($p1); let ps = s.to_str().unwrap(); - println!("{}=> {}", - stringify!($p1), - ps) - ); - ($p1:expr, $p2:expr) => ( + println!("{}=> {}", stringify!($p1), ps) + }; + ($p1:expr, $p2:expr) => { let s = CStr::from_ptr($p2); let ps = s.to_str().unwrap(); - println!("{}{}", - $p1, - ps) - ) + println!("{}{}", $p1, ps) + }; } -macro_rules! cchar_to_str{ - ($p1:expr) => { - { - let s = CStr::from_ptr($p1); - let ps = s.to_str().unwrap(); - ps - } - } +macro_rules! cchar_to_str { + ($p1:expr) => {{ + let s = CStr::from_ptr($p1); + let ps = s.to_str().unwrap(); + ps + }}; } macro_rules! str_to_cchar { - ($p1:expr) => { - { - let msgkey = CString::new($p1).unwrap(); - let c_msgkey: *mut c_char = msgkey.into_raw(); - c_msgkey - } - }; + ($p1:expr) => {{ + let msgkey = CString::new($p1).unwrap(); + let c_msgkey: *mut c_char = msgkey.into_raw(); + c_msgkey + }}; } fn main() { @@ -60,7 +54,6 @@ fn main() { // let s_key = generate_sec_key(&wallet); // print_cchar!(s_key); - let key0 = "3f26e586111b5c4cab6a5dd5e0d13c3b13184ba74410ba064a3b485be4f9a2cd"; let key1 = ""; let key2 = "cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5"; @@ -68,7 +61,7 @@ fn main() { str_to_cchar!(msg), str_to_cchar!(key0), str_to_cchar!(key1), - str_to_cchar!(key2) + str_to_cchar!(key2), ); print_cchar!(private_key); @@ -76,9 +69,29 @@ fn main() { str_to_cchar!(msg), str_to_cchar!(key0), str_to_cchar!(key1), - str_to_cchar!(key2) + str_to_cchar!(key2), ); print_cchar!(address2); + let message = "helloword"; + let msg_encrypt = encrypt( + str_to_cchar!(msg), + str_to_cchar!(key0), + str_to_cchar!(key1), + str_to_cchar!(key2), + str_to_cchar!(message), + ); + print_cchar!(msg_encrypt); + + let msg_decrypt = decrypt( + str_to_cchar!(msg), + str_to_cchar!(key0), + str_to_cchar!(key1), + str_to_cchar!(key2), + msg_encrypt, + ); + print_cchar!(msg_decrypt); + let msg_decrypt = cchar_to_str!(msg_decrypt); + assert_eq!(message, msg_decrypt); // let tmp_cwallet2 = restore_wallet(&tmp_cwallet); // let address3 = get_address(&tmp_cwallet2); // print_cchar!(address3); diff --git a/scripts/wasm_build.sh b/scripts/wasm_build.sh old mode 100644 new mode 100755 diff --git a/src/lib.rs b/src/lib.rs index 86e2acd..24a1638 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,64 +16,52 @@ use crate::wallet::*; // #[cfg(target_os = "android")] // mod android; -macro_rules! cchar_to_str{ - ($p1:expr) => { - { - let s = CStr::from_ptr($p1); - let ps = s.to_str().unwrap(); - ps - } - } +macro_rules! cchar_to_str { + ($p1:expr) => {{ + let s = CStr::from_ptr($p1); + let ps = s.to_str().unwrap(); + ps + }}; } -macro_rules! cchar_to_string{ - ($p1:expr) => { - { - let s = CStr::from_ptr($p1); - let ps = s.to_str().unwrap(); - ps.to_string() - } - } +macro_rules! cchar_to_string { + ($p1:expr) => {{ + let s = CStr::from_ptr($p1); + let ps = s.to_str().unwrap(); + ps.to_string() + }}; } -macro_rules! cchar_to_ostring{ - ($p1:expr) => { - { - let s = CStr::from_ptr($p1); - let pb = s.to_str().unwrap(); - let result = if pb.is_empty() { - None - } else { - Some(pb.to_string()) - }; - result - } - } +macro_rules! cchar_to_ostring { + ($p1:expr) => {{ + let s = CStr::from_ptr($p1); + let pb = s.to_str().unwrap(); + let result = if pb.is_empty() { + None + } else { + Some(pb.to_string()) + }; + result + }}; } macro_rules! str_to_cchar { - ($p1:expr) => { - { - let msgkey = CString::new($p1).unwrap(); - let c_msgkey: *mut c_char = msgkey.into_raw(); - c_msgkey - } - }; + ($p1:expr) => {{ + let msgkey = CString::new($p1).unwrap(); + let c_msgkey: *mut c_char = msgkey.into_raw(); + c_msgkey + }}; } -macro_rules! ostr_to_cchar{ - ($p1:expr) => { - { - let key = match $p1 { - Some(val) => { - CString::new(val).unwrap() - }, - None => CString::new("").unwrap() - }; - let c_key: *mut c_char = key.into_raw(); - c_key - } - } +macro_rules! ostr_to_cchar { + ($p1:expr) => {{ + let key = match $p1 { + Some(val) => CString::new(val).unwrap(), + None => CString::new("").unwrap(), + }; + let c_key: *mut c_char = key.into_raw(); + c_key + }}; } #[repr(C)] @@ -115,7 +103,6 @@ pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet { convert_to_cwallet(rust_wallet) } - #[no_mangle] pub unsafe extern "C" fn reset_wallet( msg_key: *const c_char, @@ -142,7 +129,7 @@ pub unsafe extern "C" fn get_address( master_key: *const c_char, second_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 address = rwallet.get_address(); let address_str = format!("{:?}", address); @@ -151,13 +138,18 @@ pub unsafe extern "C" fn get_address( } #[wasm_bindgen] -pub fn wget_address(msg_key: String, master_key: String, second_key: Option, backup_key: Option) -> String { +pub fn wget_address( + msg_key: String, + master_key: String, + second_key: Option, + backup_key: Option, +) -> String { console_log!("wget_address: {}, {}!", msg_key, master_key); - let rwallet = Wallet{ + let rwallet = Wallet { msg_key, master_key, second_key, - backup_key + backup_key, }; console_log!("wallet: {:?}", rwallet); let address = rwallet.get_address(); @@ -184,8 +176,8 @@ pub unsafe extern "C" fn sign( master_key: *const c_char, second_key: *const c_char, backup_key: *const c_char, - msg: *const c_char -) -> *mut 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); @@ -201,9 +193,9 @@ 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{ + 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); @@ -215,6 +207,40 @@ pub unsafe extern "C" fn sign_for_tran( str_to_cchar!(result) } +#[no_mangle] +pub unsafe extern "C" fn encrypt( + 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 r = match rwallet.zencrypt(msg_str) { + Ok(v) => v, + Err(err) => panic!("Problem encrypt: {:?}", err), + }; + str_to_cchar!(r) +} + +#[no_mangle] +pub unsafe extern "C" fn decrypt( + 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); + println!("{}", msg_str); + let r = match rwallet.zdecrypt(msg_str) { + Ok(v) => v, + Err(err) => panic!("Problem encrypt: {:?}", err), + }; + str_to_cchar!(r) +} unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet { let c_msgkey: *mut c_char = str_to_cchar!(rwallet.msg_key); @@ -249,7 +275,7 @@ unsafe fn generate_rwallet( master_key: *const c_char, second_key: *const c_char, backup_key: *const c_char, -) ->Wallet { +) -> Wallet { let pmsg = cchar_to_string!(msg_key); let pm = cchar_to_string!(master_key); let second_key = cchar_to_ostring!(second_key); @@ -258,6 +284,6 @@ unsafe fn generate_rwallet( msg_key: pmsg, master_key: pm, second_key: second_key, - backup_key: backup_key + backup_key: backup_key, } } diff --git a/src/wallet/wallet_impl.rs b/src/wallet/wallet_impl.rs index 77dd9aa..9df5fce 100644 --- a/src/wallet/wallet_impl.rs +++ b/src/wallet/wallet_impl.rs @@ -2,6 +2,8 @@ extern crate hex; use anyhow::Result; use core::fmt::Write; +use ecies::{decrypt, encrypt}; +use primitive_types::{H160, H256}; use secp256k1::rand::rngs::OsRng; use secp256k1::{Message, PublicKey, Secp256k1, SecretKey}; use serde::{Deserialize, Serialize}; @@ -10,7 +12,6 @@ use shamir_secret_sharing::ShamirSecretSharing as SSS; use std::str; use std::str::FromStr; use tiny_keccak::keccak256; -use primitive_types::{H160, H256}; pub fn generate_keypair() -> (SecretKey, PublicKey) { let secp = Secp256k1::new(); @@ -43,11 +44,7 @@ pub fn get_sss(msg: &str) -> SSS { } pub fn generate_sss_keypair(msg: &str, skey: &str) -> Vec { - let secret = BigInt::parse_bytes( - &skey.as_bytes(), - 16, - ) - .unwrap(); + let secret = BigInt::parse_bytes(&skey.as_bytes(), 16).unwrap(); let sss = get_sss(msg); let shares = sss.split(secret.clone()); let mut shares_str: Vec = Vec::new(); @@ -57,7 +54,6 @@ pub fn generate_sss_keypair(msg: &str, skey: &str) -> Vec { shares_str } - pub fn hash_message(message: S) -> H256 where S: AsRef<[u8]>, @@ -79,7 +75,7 @@ pub struct Wallet { } impl Wallet { - pub fn new(msg: &str) -> Self{ + pub fn new(msg: &str) -> Self { let (secret_key, _pub_key) = generate_keypair(); let s = hex::encode(&secret_key.secret_bytes()); let shares_str = generate_sss_keypair(msg, &s); @@ -91,11 +87,11 @@ impl Wallet { msg_key: msg.to_string(), master_key: shares_str.get(0).unwrap().to_string(), second_key: second_key, - backup_key: backup_key + backup_key: backup_key, } } - pub fn reset_wallet(&self) -> Self{ + pub fn reset_wallet(&self) -> Self { let secret_key = self.get_secret_key(); let s = hex::encode(&secret_key.secret_bytes()); let shares_str = generate_sss_keypair(&self.msg_key, &s); @@ -106,16 +102,13 @@ impl Wallet { msg_key: self.msg_key.clone(), master_key: shares_str.get(0).unwrap().to_string(), second_key: second_key, - backup_key: backup_key + backup_key: backup_key, } } fn get_secret_key(&self) -> SecretKey { let key_str_0: &str = &self.master_key; - let key0 = BigInt::parse_bytes( - &key_str_0.as_bytes(), - 16, - ).unwrap(); + let key0 = BigInt::parse_bytes(&key_str_0.as_bytes(), 16).unwrap(); let kp0: (usize, BigInt) = (1, key0); let i: usize; let key_str_1: &str; @@ -130,11 +123,7 @@ impl Wallet { i = 2; key_str_1 = ""; } - let key1 = BigInt::parse_bytes( - &key_str_1.as_bytes(), - 16, - ) - .unwrap(); + let key1 = BigInt::parse_bytes(&key_str_1.as_bytes(), 16).unwrap(); let kp1 = (i, key1); let _tmp = vec![kp0, kp1]; let sss = get_sss(&self.msg_key); @@ -151,7 +140,6 @@ impl Wallet { get_public_key(&s_key) } - pub fn generate_sec_key(&self) -> String { let secret_key = self.get_secret_key(); let s = hex::encode(&secret_key.secret_bytes()); @@ -199,4 +187,41 @@ impl Wallet { let recid = _recovery_id.to_i32(); 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, msg: &str) -> Result { + let sk = self.get_secret_key(); + let sk = sk.secret_bytes(); + let msg = match hex::decode(&msg) { + Ok(v) => v, + Err(e) => panic!("error decode hex str {}", e), + }; + println!("msg to decrypt: {:?}", &msg); + let msg_decrypt = match decrypt(&sk, &msg) { + Ok(v) => v, + Err(e) => panic!("error decrypt content: {}", e), + }; + println!("msg after decrypt: {:?}", &msg_decrypt); + // let msg_decrypt = hex::encode(msg_decrypt); + let str_decrypt = match str::from_utf8(&msg_decrypt) { + Ok(v) => v, + Err(e) => panic!("Invalid UTF-8 sequence: {}", e), + }; + let result = str_decrypt.to_string(); + + Ok(result) + } }