diff --git a/Cargo.lock b/Cargo.lock index 80986fb..e91513d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,37 +15,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - [[package]] name = "allo-isolate" version = "0.1.7" @@ -280,15 +249,6 @@ dependencies = [ "envmnt", ] -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.4", -] - [[package]] name = "clang" version = "0.24.0" @@ -405,28 +365,34 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dubp" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1669c61ccfe0d3fc7be8fe3175ebd401b9c879f638425f31e92777c73b32ea86" +checksum = "5649c2ed6d55ce1dda5c2ef3af34f5c669c4f8882c81a5d9a395c044c8d001fe" dependencies = [ "dubp-common", "dubp-documents", "dubp-documents-parser", "dubp-wallet", - "dup-crypto 0.50.0", + "dup-crypto", ] [[package]] name = "dubp-client" version = "0.1.0" -source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#a690f9b1bb029495c6aaf957c31d528dd282b49c" +source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#13ea957330fcb5507d544c9ce4d61902c731a059" dependencies = [ + "arrayvec", "bincode", + "cfg-if 1.0.0", "dubp", "duniter-bca-types", + "fast-threadpool 0.3.1-alpha.0", + "flume", "graphql_client", "maybe-async", + "rand", "reqwest", + "resiter", "serde", "static_assertions", "thiserror", @@ -434,11 +400,11 @@ dependencies = [ [[package]] name = "dubp-common" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "515fb09166a50b4543a99c42359fc4afa5a4c7af118c6f9627575c2760f3fef8" +checksum = "af754efaf281211ef4253f9a833adf9064ef95c594f1acb86bee37202d23104b" dependencies = [ - "dup-crypto 0.50.0", + "dup-crypto", "serde", "serde_json", "thiserror", @@ -447,9 +413,9 @@ dependencies = [ [[package]] name = "dubp-documents" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc9327c62778ee4fd060c0efbe32c6cfda5e317c4a2eb4ddee8293fbd278904" +checksum = "0ea7da99c4b73abafa67362741f0271b41e987f33c566daa794fb3aa78adbe55" dependencies = [ "beef", "dubp-wallet", @@ -461,9 +427,9 @@ dependencies = [ [[package]] name = "dubp-documents-parser" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271ce4a6bebfdfdaefb0e51f57c9bb04976fce5fbe2744dd60c1dcf857c60c20" +checksum = "c31fa6ba34a4f0e86e2fe2ac4d1c9e9ff6e36bdcfef64e78279b9a05297bd069" dependencies = [ "dubp-documents", "json-pest-parser", @@ -475,9 +441,9 @@ dependencies = [ [[package]] name = "dubp-wallet" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e65a121fa6745038e903ed3d1eb6a97f9658c6c6e2bfbf7e9ffdaf34161d23" +checksum = "34ff32a5d34243b2e435f1a7d3b0930fedf2396da07ca2ef6ba51aac1debb0ad" dependencies = [ "byteorder", "dubp-common", @@ -496,8 +462,7 @@ dependencies = [ "cbindgen", "dart-bindgen", "dubp-client", - "dup-crypto 0.46.0", - "fast-threadpool", + "fast-threadpool 0.3.0", "once_cell", "parking_lot", "rusty-hook", @@ -507,7 +472,7 @@ dependencies = [ [[package]] name = "duniter-bca-types" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/typescript/duniter?branch=dev#591f334185151a200a7dbb06b32ff434a19b0885" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#d602fca862972b0ecc6639033e67720a268ce9d7" dependencies = [ "arrayvec", "bincode", @@ -519,34 +484,10 @@ dependencies = [ [[package]] name = "dup-crypto" -version = "0.46.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b1ebfa9edbb53cd4434f01877fcd74fb2416b93a217754d2daecbeecad67eb" +checksum = "d66627bb4c014d390a345230745931e2144cc10f3dc16989399dde85510a6543" dependencies = [ - "aes", - "arrayvec", - "base64", - "blake3", - "bs58", - "byteorder", - "cryptoxide", - "ed25519-bip32", - "getrandom", - "once_cell", - "ring", - "serde", - "thiserror", - "zerocopy", - "zeroize", -] - -[[package]] -name = "dup-crypto" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3032421000ca2cdd372bd72f4c548be7f1386d357abb0936291890064d3072e8" -dependencies = [ - "aes", "arrayvec", "base64", "blake3", @@ -555,6 +496,7 @@ dependencies = [ "cryptoxide", "ed25519-bip32", "getrandom", + "hex", "once_cell", "ring", "serde", @@ -636,6 +578,16 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "fast-threadpool" +version = "0.3.1-alpha.0" +source = "git+https://github.com/librelois/fast-threadpool?branch=main#1a271710677ecc43cbfe43234ec21c954dfdbef7" +dependencies = [ + "async-oneshot", + "flume", + "num_cpus", +] + [[package]] name = "flate2" version = "1.0.20" @@ -654,6 +606,10 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0362ef9c4c1fa854ff95b4cb78045a86e810d804dc04937961988b45427104a9" dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", "spinning_top", ] @@ -783,8 +739,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -903,6 +861,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "http" version = "0.2.3" @@ -1136,6 +1100,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "nanorand" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1378b66f7c93a1c0f8464a19bf47df8795083842e5090f4b7305973d5a22d0" +dependencies = [ + "getrandom", +] + [[package]] name = "nias" version = "0.5.0" @@ -1179,12 +1152,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "parking_lot" version = "0.11.1" @@ -1423,6 +1390,12 @@ dependencies = [ "winreg", ] +[[package]] +name = "resiter" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd69ab1e90258b7769f0b5c46bfd802b8206d0707ced4ca4b9d5681b744de1be" + [[package]] name = "ring" version = "0.16.20" @@ -1543,7 +1516,7 @@ dependencies = [ "block-buffer", "digest 0.8.1", "fake-simd", - "opaque-debug 0.2.3", + "opaque-debug", ] [[package]] diff --git a/native/dubp_rs/Cargo.toml b/native/dubp_rs/Cargo.toml index 0208e51..4359111 100644 --- a/native/dubp_rs/Cargo.toml +++ b/native/dubp_rs/Cargo.toml @@ -13,7 +13,6 @@ crate-type = ["rlib"] allo-isolate = "0.1.6" dubp-client = { git = "https://git.duniter.org/libs/dubp-rs-client-lib", branch = "master", features = ["blocking"], default-features = false } #dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking"], default-features = false } -dup-crypto = { version = "0.46.0", features = ["bip32-ed25519", "dewif", "mnemonic", "mnemonic_french", "scrypt"] } fast-threadpool = { version = "0.3.0", default-features = false } once_cell = { version = "1.3.1", default-features = false, features = ["std"] } parking_lot = "0.11.1" diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index 4d4a530..6db0dad 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -49,20 +49,12 @@ pub(super) fn gen_dewif( let currency = parse_currency(currency)?; let mnemonic = Mnemonic::from_phrase(mnemonic, language).map_err(|_| DubpError::WrongLanguage)?; - let seed = dubp_client::crypto::mnemonic::mnemonic_to_seed(&mnemonic); let log_n = log_n(system_memory); let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?; - let keypair = dubp_client::crypto::keys::ed25519::bip32::KeyPair::from_seed(seed.clone()); - let pubkey = keypair.public_key(); - let dewif = dubp_client::crypto::dewif::write_dewif_v4_content( - currency, - log_n, - &secret_code, - &pubkey, - seed, - ); + let dewif = + dubp_client::crypto::dewif::create_dewif_v1(currency, log_n, &mnemonic, &secret_code); Ok(vec![dewif, secret_code]) } @@ -73,6 +65,7 @@ pub(super) fn get_dewif_meta( secret_code_type: SecretCodeType, ) -> Result, DubpError> { let dubp_client::crypto::dewif::DewifMeta { + algo, currency, log_n, version, @@ -82,6 +75,11 @@ pub(super) fn get_dewif_meta( crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)?; Ok(vec![ + if algo == KeysAlgo::Bip32Ed25519 { + "Bip32Ed25519".to_owned() + } else { + "Ed25519".to_owned() + }, currency.to_string(), secret_code_len.to_string(), version.to_string(), @@ -106,18 +104,16 @@ pub(super) fn get_pubkey( secret_code, ) } else if address_index_opt.is_none() && external_opt.is_none() { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), ) .map_err(DubpError::DewifReadError)?; - match keypairs.next() { - Some(KeyPairEnum::Ed25519(keypair)) => Ok(keypair.public_key().to_base58()), - Some(KeyPairEnum::Bip32Ed25519(_)) => Err(DubpError::GetMasterPubkeyOfHdWallet), - Some(_) => Err(DubpError::UnsupportedDewifVersion), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + match payload { + DewifPayload::Ed25519(keypair) => Ok(keypair.public_key().to_base58()), + DewifPayload::Bip32Ed25519(_) => Err(DubpError::GetMasterPubkeyOfHdWallet), } } else { Err(DubpError::GiveExternalBoolOrAddressIndexForLegacyWallet) @@ -136,11 +132,7 @@ pub(super) fn get_secret_code_len( let log_n = dubp_client::crypto::dewif::read_dewif_log_n(ExpectedCurrency::Any, dewif) .map_err(DubpError::DewifReadError)?; - Ok(crate::secret_code::compute_secret_code_len( - member_wallet, - secret_code_type, - log_n, - )?) + crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n) } pub(crate) fn log_n(system_memory: i64) -> u8 { diff --git a/native/dubp_rs/src/dewif/bip32.rs b/native/dubp_rs/src/dewif/bip32.rs index 2f692ec..acb1a38 100644 --- a/native/dubp_rs/src/dewif/bip32.rs +++ b/native/dubp_rs/src/dewif/bip32.rs @@ -34,22 +34,24 @@ pub(crate) fn get_accounts_pubkeys( if accounts_indexs.contains(&U31::new(0)?) { verify_member_secret_code(currency, dewif, secret_code)?; } - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), ) .map_err(DubpError::DewifReadError)?; - match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => Ok(accounts_indexs - .into_iter() - .map(|account_index| { - PrivateDerivationPath::transparent(account_index) - .map(|path| master_keypair.derive(path).public_key().to_base58()) - }) - .collect::, InvalidAccountIndex>>()?), - Some(_) => Err(DubpError::NotHdWallet), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => { + let master_keypair = KeyPair::from_mnemonic(&mnemonic); + Ok(accounts_indexs + .into_iter() + .map(|account_index| { + PrivateDerivationPath::transparent(account_index) + .map(|path| master_keypair.derive(path).public_key().to_base58()) + }) + .collect::, InvalidAccountIndex>>()?) + } + _ => Err(DubpError::NotHdWallet), } } @@ -61,7 +63,7 @@ pub(crate) fn get_bip32_keypair( external_opt: Option, secret_code: &str, ) -> Result { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -72,14 +74,14 @@ pub(crate) fn get_bip32_keypair( verify_member_secret_code(currency, dewif, secret_code)?; } - match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => { + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => { + let master_keypair = KeyPair::from_mnemonic(&mnemonic); Ok(KeyPairEnum::Bip32Ed25519(master_keypair.derive( z_get_derivation_path(account_index, address_index_opt, external_opt)?, ))) } - Some(_) => Err(DubpError::NotHdWallet), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + _ => Err(DubpError::NotHdWallet), } } @@ -91,7 +93,7 @@ pub(crate) fn get_bip32_pubkey( external_opt: Option, secret_code: &str, ) -> Result { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -102,17 +104,19 @@ pub(crate) fn get_bip32_pubkey( verify_member_secret_code(currency, dewif, secret_code)?; } - match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => Ok(master_keypair - .derive(z_get_derivation_path( - account_index, - address_index_opt, - external_opt, - )?) - .public_key() - .to_base58()), - Some(_) => Err(DubpError::NotHdWallet), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => { + let master_keypair = KeyPair::from_mnemonic(&mnemonic); + Ok(master_keypair + .derive(z_get_derivation_path( + account_index, + address_index_opt, + external_opt, + )?) + .public_key() + .to_base58()) + } + _ => Err(DubpError::NotHdWallet), } } @@ -137,20 +141,39 @@ pub(crate) fn get_opaque_account_next_external_address( } } +pub(crate) fn get_mnemonic( + currency: Currency, + dewif: &str, + secret_code: &str, +) -> Result { + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( + ExpectedCurrency::Specific(currency), + dewif, + &secret_code.to_ascii_uppercase(), + ) + .map_err(DubpError::DewifReadError)?; + + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => Ok(mnemonic.phrase().to_owned()), + _ => Err(DubpError::NotHdWallet), + } +} + pub(crate) fn load_opaque_bip32_accounts( accounts_indexs: Vec, currency: Currency, dewif: &str, secret_code: &str, ) -> Result<(), DubpError> { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), ) .map_err(DubpError::DewifReadError)?; - match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => { + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => { + let master_keypair = KeyPair::from_mnemonic(&mnemonic); for account_index in accounts_indexs { let external_path = PrivateDerivationPath::opaque(account_index, true, None)?; let external_kp = master_keypair.derive(external_path); @@ -165,8 +188,7 @@ pub(crate) fn load_opaque_bip32_accounts( } Ok(()) } - Some(_) => Err(DubpError::NotHdWallet), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + _ => Err(DubpError::NotHdWallet), } } @@ -179,7 +201,7 @@ pub(crate) fn sign_bip32( secret_code: &str, msg: &str, ) -> Result { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -190,16 +212,18 @@ pub(crate) fn sign_bip32( verify_member_secret_code(currency, dewif, secret_code)?; } - match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => sign_bip32_inner( - account_index, - address_index_opt, - external_opt, - master_keypair, - msg, - ), - Some(_) => Err(DubpError::NotHdWallet), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => { + let master_keypair = KeyPair::from_mnemonic(&mnemonic); + sign_bip32_inner( + account_index, + address_index_opt, + external_opt, + master_keypair, + msg, + ) + } + _ => Err(DubpError::NotHdWallet), } } @@ -212,7 +236,7 @@ pub(crate) fn sign_several_bip32( secret_code: &str, msgs: &[&str], ) -> Result, DubpError> { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -223,16 +247,18 @@ pub(crate) fn sign_several_bip32( verify_member_secret_code(currency, dewif, secret_code)?; } - match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => sign_several_bip32_inner( - account_index, - address_index_opt, - external_opt, - master_keypair, - msgs, - ), - Some(_) => Err(DubpError::NotHdWallet), - None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + match payload { + DewifPayload::Bip32Ed25519(mnemonic) => { + let master_keypair = KeyPair::from_mnemonic(&mnemonic); + sign_several_bip32_inner( + account_index, + address_index_opt, + external_opt, + master_keypair, + msgs, + ) + } + _ => Err(DubpError::NotHdWallet), } } diff --git a/native/dubp_rs/src/dewif/classic.rs b/native/dubp_rs/src/dewif/classic.rs index e6fe1c3..27087ef 100644 --- a/native/dubp_rs/src/dewif/classic.rs +++ b/native/dubp_rs/src/dewif/classic.rs @@ -21,13 +21,13 @@ pub(crate) fn sign( secret_code: &str, msg: &str, ) -> Result { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), ) .map_err(DubpError::DewifReadError)?; - if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() { + if let DewifPayload::Ed25519(keypair) = payload { Ok(keypair.generate_signator().sign(msg.as_bytes()).to_base64()) } else { Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)) @@ -40,13 +40,13 @@ pub(crate) fn sign_several( secret_code: &str, msgs: &[&str], ) -> Result, DubpError> { - let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), ) .map_err(DubpError::DewifReadError)?; - if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() { + if let DewifPayload::Ed25519(keypair) = payload { let signator = keypair.generate_signator(); Ok(msgs .iter() diff --git a/native/dubp_rs/src/error.rs b/native/dubp_rs/src/error.rs index e68957d..479b0c2 100644 --- a/native/dubp_rs/src/error.rs +++ b/native/dubp_rs/src/error.rs @@ -63,8 +63,8 @@ pub(crate) enum DubpError { UnknownCurrencyName, #[error("Unknown language")] UnknownLanguage, - #[error("Unsupported DEWIF version")] - UnsupportedDewifVersion, + //#[error("Unsupported DEWIF version")] + //UnsupportedDewifVersion, #[error("{0}")] Utf8Error(std::str::Utf8Error), #[error("Wrong language")] diff --git a/native/dubp_rs/src/legacy.rs b/native/dubp_rs/src/legacy.rs index d1831ec..0379b89 100644 --- a/native/dubp_rs/src/legacy.rs +++ b/native/dubp_rs/src/legacy.rs @@ -16,6 +16,7 @@ use crate::*; use dubp_client::crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword}; +#[allow(deprecated)] pub(super) fn gen_dewif_from_legacy( currency: &str, salt: String, @@ -26,12 +27,17 @@ pub(super) fn gen_dewif_from_legacy( ) -> Result, DubpError> { let currency = parse_currency(currency)?; let keypair = KeyPairFromSaltedPasswordGenerator::with_default_parameters() - .generate(SaltedPassword::new(salt, password)); + .generate(SaltedPassword::new(salt.clone(), password.clone())); let log_n = crate::dewif::log_n(system_memory); let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?; - let dewif = - dubp_client::crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code); + let dewif = dubp_client::crypto::dewif::create_dewif_v1_legacy( + currency, + log_n, + password, + salt, + &secret_code, + ); let pubkey = keypair.public_key().to_base58(); Ok(vec![dewif, secret_code, pubkey]) } diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index f6ba745..64876fc 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -32,13 +32,16 @@ use crate::secret_code::gen_secret_code; use allo_isolate::{IntoDart, Isolate}; use dubp_client::crypto::{ bases::b58::ToBase58, - dewif::{Currency, DewifReadError, ExpectedCurrency, G1_CURRENCY, G1_TEST_CURRENCY}, + dewif::{ + Currency, DewifContent, DewifPayload, DewifReadError, ExpectedCurrency, G1_CURRENCY, + G1_TEST_CURRENCY, + }, keys::{ ed25519::bip32::{ ChainCode, InvalidAccountIndex, KeyPair, PrivateDerivationPath, PublicKeyWithChainCode, }, ed25519::{KeyPairFromSeed32Generator, PublicKey, PublicKeyFromStrErr}, - KeyPair as _, KeyPairEnum, PublicKey as _, Signator as _, Signature as _, + KeyPair as _, KeyPairEnum, KeysAlgo, PublicKey as _, Signator as _, Signature as _, }, mnemonic::{Language, Mnemonic, MnemonicType}, utils::{U31Error, U31}, @@ -87,16 +90,12 @@ pub extern "C" fn change_dewif_secret_code( #[no_mangle] pub extern "C" fn check_pubkey(port: i64, pubkey: *const raw::c_char) { - exec_async(port, || Ok(char_ptr_to_str(pubkey)?), pubkey::check_pubkey) + exec_async(port, || char_ptr_to_str(pubkey), pubkey::check_pubkey) } #[no_mangle] pub extern "C" fn compute_checksum(port: i64, pubkey: *const raw::c_char) { - exec_async( - port, - || Ok(char_ptr_to_str(pubkey)?), - pubkey::compute_checksum, - ) + exec_async(port, || char_ptr_to_str(pubkey), pubkey::compute_checksum) } #[no_mangle] @@ -208,6 +207,25 @@ pub extern "C" fn get_bip32_dewif_accounts_pubkeys( ) } +#[no_mangle] +pub extern "C" fn get_bip32_dewif_mnemonic( + port: i64, + currency: *const raw::c_char, + dewif: *const raw::c_char, + secret_code: *const raw::c_char, +) { + exec_async( + port, + || { + let currency = parse_currency(char_ptr_to_str(currency)?)?; + let dewif = char_ptr_to_str(dewif)?; + let secret_code = char_ptr_to_str(secret_code)?; + Ok((currency, dewif, secret_code)) + }, + |(currency, dewif, secret_code)| dewif::bip32::get_mnemonic(currency, dewif, secret_code), + ) +} + #[no_mangle] pub extern "C" fn get_dewif_meta( port: i64, diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index dbceb82..5a60eb6 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -232,6 +232,21 @@ class DubpRust { return completer.future; } + /// Get mnemonic phrase of `dewif` (algo Bip32-Ed25519 only). + static Future> getBip32DewifMnemonic( + {String currency = "g1", String dewif, String secretCode}) async { + final completer = Completer>(); + final sendPort = singleCompletePort, List>(completer, + callback: _handleErrList); + native.get_bip32_dewif_mnemonic( + sendPort.nativePort, + StringUtf8Pointer(currency).toNativeUtf8(), + StringUtf8Pointer(dewif).toNativeUtf8(), + StringUtf8Pointer(secretCode).toNativeUtf8(), + ); + return completer.future; + } + /// Get `dewif` keypair meta data. static Future getDewifMetaData( {String dewif,