diff --git a/Cargo.lock b/Cargo.lock index e6fdbe3..3c833e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" dependencies = [ "crypto-common", - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -34,7 +34,7 @@ dependencies = [ "cipher", "ctr", "ghash", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -123,13 +123,25 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -138,7 +150,16 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ - "generic-array", + "generic-array 0.14.6", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", ] [[package]] @@ -153,6 +174,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + [[package]] name = "byteorder" version = "1.4.3" @@ -211,19 +238,29 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.6", "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +dependencies = [ + "generic-array 0.12.4", + "subtle 1.0.0", +] + [[package]] name = "crypto-mac" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array", - "subtle", + "generic-array 0.14.6", + "subtle 2.4.1", ] [[package]] @@ -235,13 +272,22 @@ dependencies = [ "cipher", ] +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -252,7 +298,7 @@ checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer 0.10.3", "crypto-common", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -270,6 +316,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + [[package]] name = "fixed-hash" version = "0.8.0" @@ -294,6 +346,15 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + [[package]] name = "generic-array" version = "0.14.6" @@ -323,7 +384,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" dependencies = [ - "opaque-debug", + "opaque-debug 0.3.0", "polyval", ] @@ -342,13 +403,23 @@ dependencies = [ "hmac 0.12.1", ] +[[package]] +name = "hmac" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +dependencies = [ + "crypto-mac 0.7.0", + "digest 0.8.1", +] + [[package]] name = "hmac" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "crypto-mac", + "crypto-mac 0.8.0", "digest 0.9.0", ] @@ -368,7 +439,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ "digest 0.9.0", - "generic-array", + "generic-array 0.14.6", "hmac 0.8.1", ] @@ -398,7 +469,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array", + "generic-array 0.14.6", ] [[package]] @@ -449,7 +520,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" dependencies = [ "crunchy", "digest 0.9.0", - "subtle", + "subtle 2.4.1", ] [[package]] @@ -516,6 +587,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -556,7 +633,17 @@ checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", "rand_core 0.6.4", - "subtle", + "subtle 2.4.1", +] + +[[package]] +name = "pbkdf2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +dependencies = [ + "byteorder", + "crypto-mac 0.7.0", ] [[package]] @@ -567,7 +654,7 @@ checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" dependencies = [ "cfg-if", "cpufeatures", - "opaque-debug", + "opaque-debug 0.3.0", "universal-hash", ] @@ -708,6 +795,7 @@ dependencies = [ "primitive-types", "qrcodegen", "rand 0.8.5", + "scrypt", "secp256k1", "serde", "serde_json", @@ -722,6 +810,19 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[package]] +name = "scrypt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "656c79d0e90d0ab28ac86bf3c3d10bfbbac91450d3f190113b4e76d9fec3cfdd" +dependencies = [ + "byte-tools", + "byteorder", + "hmac 0.7.1", + "pbkdf2", + "sha2 0.8.2", +] + [[package]] name = "secp256k1" version = "0.25.0" @@ -773,6 +874,18 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + [[package]] name = "sha2" version = "0.9.9" @@ -783,7 +896,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug", + "opaque-debug 0.3.0", ] [[package]] @@ -814,6 +927,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + [[package]] name = "subtle" version = "2.4.1" @@ -906,7 +1025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" dependencies = [ "crypto-common", - "subtle", + "subtle 2.4.1", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index ff73474..48fad96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,9 +32,10 @@ base64 = "0.21.0" argon2 = { version = "0.5.0" } aes-gcm = "0.10.1" rand = "0.8.5" +scrypt = { version = "0.2", default-features = false } [profile.release] lto = true [package.metadata.wasm-pack.profile.release] -wasm-opt = false \ No newline at end of file +wasm-opt = false diff --git a/examples/test.rs b/examples/test.rs index fba0415..29c0022 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -4,7 +4,9 @@ // 测试钱包在C侧调用接口存储和重新读出钱包密钥 // -use rustwallet::{generate_sec_key, sign, sign_for_tran, wdecrypt, wencrypt, wget_address}; +use rustwallet::{ + generate_scrypt_hash, generate_sec_key, sign, sign_for_tran, wdecrypt, wencrypt, wget_address, +}; fn main() { let msg = "a0f2022d15fd8072f12c76cc1596c4f1"; @@ -12,40 +14,48 @@ fn main() { let key0 = "3f26e586111b5c4cab6a5dd5e0d13c3b13184ba74410ba064a3b485be4f9a2cd"; let key1 = ""; let key2 = "cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5"; - let private_key = generate_sec_key( - msg.to_string(), - key0.to_string(), - None, - Some(key2.to_string()), - ); - println!("private_key=> {}", private_key); + // let private_key = generate_sec_key( + // msg.to_string(), + // key0.to_string(), + // None, + // Some(key2.to_string()), + // ); + // println!("private_key=> {}", private_key); - let address2 = wget_address( - msg.to_string(), - key0.to_string(), - None, - Some(key2.to_string()), - ); + // let address2 = wget_address( + // msg.to_string(), + // key0.to_string(), + // None, + // Some(key2.to_string()), + // ); - println!("address=> {}", address2); - let message = "helloword"; - let msg_encrypt = wencrypt( - msg.to_string(), - key0.to_string(), - None, - Some(key2.to_string()), - message.to_string(), - ); + // println!("address=> {}", address2); + // let message = "helloword"; + // let msg_encrypt = wencrypt( + // msg.to_string(), + // key0.to_string(), + // None, + // Some(key2.to_string()), + // message.to_string(), + // ); - println!("msg_encrypt=> {}", msg_encrypt); + // println!("msg_encrypt=> {}", msg_encrypt); - let msg_decrypt = wdecrypt( - msg.to_string(), - key0.to_string(), - None, - Some(key2.to_string()), - msg_encrypt, - ); + // let msg_decrypt = wdecrypt( + // msg.to_string(), + // key0.to_string(), + // None, + // Some(key2.to_string()), + // msg_encrypt, + // ); - println!("msg_decrypt=> {}", msg_decrypt); + // println!("msg_decrypt=> {}", msg_decrypt); + let pass = "111111"; + let salt = "9ded475b6bf63ee9c0150b127f6c093600e952da79ba848d6f4f9a93c3c27259"; + let n: f32 = 8192f32; + let r: u32 = 8; + let p: u32 = 1; + let size: u32 = 32; + let hash = generate_scrypt_hash(pass.to_string(), salt.to_string(), n, r, p, size); + println!("scrypt hash => {}", hash); } diff --git a/src/lib.rs b/src/lib.rs index 2ec589f..c51ff2c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ use qr::qr_code::QR; use secp256k1::PublicKey; use secp256k1::SecretKey; use std::str::FromStr; -use utils::crypto_utils::{hash_password, verify_password, zdecrypt, zencrypt}; +use utils::crypto_utils::{hash_password, scrypt_hash, verify_password, zdecrypt, zencrypt}; use utils::str_utils::{base64_to_hex, hex_to_base64}; use wasm_bindgen::prelude::*; @@ -47,7 +47,13 @@ macro_rules! console_log { } #[wasm_bindgen] -pub fn get_public_key(id: String, openid: String, master_key: String, salt: String, pass: String) -> String { +pub fn get_public_key( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); @@ -60,7 +66,13 @@ pub fn get_public_key(id: String, openid: String, master_key: String, salt: Stri } #[wasm_bindgen] -pub fn generate_sec_key(id: String, openid: String, master_key: String, salt: String, pass: String) -> String { +pub fn generate_sec_key( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); @@ -73,7 +85,14 @@ pub fn generate_sec_key(id: String, openid: String, master_key: String, salt: St } #[wasm_bindgen] -pub fn sign(id: String, openid: String, master_key: String, salt: String, pass: String, msg: String) -> String { +pub fn sign( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, + msg: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); @@ -91,7 +110,14 @@ pub fn sign(id: String, openid: String, master_key: String, salt: String, pass: } #[wasm_bindgen] -pub fn sign_for_tran(id: String, openid: String, master_key: String, salt: String, pass: String, msg: String) -> String { +pub fn sign_for_tran( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, + msg: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); @@ -117,7 +143,26 @@ pub fn keccak256_hash(content: String) -> String { } #[wasm_bindgen] -pub fn wget_address(id: String, openid: String, master_key: String, salt: String, pass: String) -> String { +pub fn generate_scrypt_hash( + pass: String, + salt: String, + n: f32, + r: u32, + p: u32, + size: u32, +) -> String { + let nr = n.log2().ceil() as u8; + scrypt_hash(&pass, &salt, nr, r, p, size) +} + +#[wasm_bindgen] +pub fn wget_address( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); @@ -133,7 +178,14 @@ pub fn wget_address(id: String, openid: String, master_key: String, salt: String } #[wasm_bindgen] -pub fn wencrypt(id: String, openid: String, master_key: String, salt: String, pass: String,msg: String) -> String { +pub fn wencrypt( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, + msg: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); @@ -150,7 +202,14 @@ pub fn wencrypt(id: String, openid: String, master_key: String, salt: String, pa r } #[wasm_bindgen] -pub fn wdecrypt(id: String, openid: String, master_key: String, salt: String, pass: String, msg: String) -> String { +pub fn wdecrypt( + id: String, + openid: String, + master_key: String, + salt: String, + pass: String, + msg: String, +) -> String { let second_key = wallet_impl::generate_client_key(&pass, &openid, &salt); let msg_str = format!("{}{}{}", id, openid, salt); let msg_key = keccak256_hash(msg_str); diff --git a/src/utils/crypto_utils.rs b/src/utils/crypto_utils.rs index a06a0ae..2e4f26b 100644 --- a/src/utils/crypto_utils.rs +++ b/src/utils/crypto_utils.rs @@ -10,6 +10,7 @@ use argon2::{ use base64::{engine::general_purpose, Engine as _}; use ecies::{decrypt, encrypt}; use rand::prelude::*; +use scrypt::{scrypt, ScryptParams}; use secp256k1::{PublicKey, SecretKey}; use std::str; use tiny_keccak::keccak256; @@ -29,6 +30,15 @@ pub fn hash_password(pass: &str, salt: &str) -> String { general_purpose::STANDARD_NO_PAD.encode(&password_hash) } +pub fn scrypt_hash(pass: &str, salt: &str, n: u8, r: u32, p: u32, size: u32) -> String { + let password = pass.as_bytes(); + let salt = hex::decode(salt).expect("error decoding hex string"); + let params = ScryptParams::new(n, r, p).expect("error create scrypt params"); + let mut output = vec![0u8; size as usize]; + scrypt(password, &salt, ¶ms, &mut output).expect("error scrypt"); + general_purpose::STANDARD_NO_PAD.encode(output) +} + pub fn verify_password(pass: &str, password_hash: &str) -> bool { let str_tmp = match general_purpose::STANDARD_NO_PAD.decode(password_hash) { Ok(v) => v,