diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index 2186fcc..80fa7ba 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -117,7 +117,7 @@ pub(super) fn sign_several( } } -fn log_n(system_memory: i64) -> u8 { +pub(crate) fn log_n(system_memory: i64) -> u8 { if system_memory > 3_000_000_000 { 15 } else { diff --git a/native/dubp_rs/src/legacy.rs b/native/dubp_rs/src/legacy.rs index b5d649b..049b6d1 100644 --- a/native/dubp_rs/src/legacy.rs +++ b/native/dubp_rs/src/legacy.rs @@ -16,6 +16,25 @@ use crate::*; use dup_crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword}; +pub(super) fn gen_dewif_from_legacy( + currency: &str, + salt: String, + password: String, + member_wallet: bool, + secret_code_type: SecretCodeType, + system_memory: i64, +) -> Result, DubpError> { + let currency = parse_currency(currency)?; + let keypair = KeyPairFromSaltedPasswordGenerator::with_default_parameters() + .generate(SaltedPassword::new(salt, password)); + + let log_n = crate::dewif::log_n(system_memory); + let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?; + let dewif = dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code); + let pubkey = keypair.public_key().to_base58(); + Ok(vec![dewif, secret_code, pubkey]) +} + pub(super) fn get_pubkey(salt: &str, password: &str) -> String { KeyPairFromSaltedPasswordGenerator::with_default_parameters() .generate(SaltedPassword::new(salt.to_owned(), password.to_owned())) diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index 7530a96..91a2811 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -123,6 +123,46 @@ pub extern "C" fn gen_dewif( } #[no_mangle] +pub extern "C" fn gen_dewif_from_legacy( + port: i64, + currency: *const raw::c_char, + salt: *const raw::c_char, + password: *const raw::c_char, + member_wallet: u32, + secret_code_type: u32, + system_memory: i64, +) { + exec_async( + port, + || { + let currency = char_ptr_to_str(currency)?; + let salt = char_ptr_to_str(salt)?.to_owned(); + let password = char_ptr_to_str(password)?.to_owned(); + let member_wallet = member_wallet != 0; + let secret_code_type = SecretCodeType::from(secret_code_type); + Ok(( + currency, + salt, + password, + member_wallet, + secret_code_type, + system_memory, + )) + }, + |(currency, salt, password, member_wallet, secret_code_type, system_memory)| { + legacy::gen_dewif_from_legacy( + currency, + salt, + password, + member_wallet, + secret_code_type, + system_memory, + ) + }, + ) +} + +#[no_mangle] pub extern "C" fn gen_mnemonic(port: i64, language: u32) { exec_async(port, || u32_to_language(language), mnemonic::gen_mnemonic) } diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index 6332ea3..7aa5c26 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -49,18 +49,6 @@ class DubpRust { print("DUBP_RS Setup Done"); } - /// Generate a random mnemonic - static Future genMnemonic({Language language = Language.english}) { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - native.gen_mnemonic( - sendPort.nativePort, - language.index, - ); - return completer.future; - } - /// Change the secret code that encrypts the `dewif` keypair. static Future changeDewifPin({ String currency = "g1", @@ -87,6 +75,48 @@ class DubpRust { return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); } + /// Generate a random mnemonic + static Future genMnemonic({Language language = Language.english}) { + final completer = Completer(); + final sendPort = + singleCompletePort(completer, callback: _handleErr); + native.gen_mnemonic( + sendPort.nativePort, + language.index, + ); + return completer.future; + } + + /// Generate a wallet from a deprecated salt + password couple. + /// + /// This deprecated method must be used only for compatibility purpose ! + static Future genWalletFromDeprecatedSaltPassword({ + String currency = "g1", + String salt, + String password, + SecretCodeType secretCodeType = SecretCodeType.letters, + }) async { + int ram = SysInfo.getTotalPhysicalMemory(); + print('ram=$ram'); + + final completer = Completer>(); + final sendPort = singleCompletePort, List>(completer, + callback: _handleErrList); + native.gen_dewif_from_legacy( + sendPort.nativePort, + Utf8.toUtf8(currency), + Utf8.toUtf8(salt), + Utf8.toUtf8(password), + 0, + secretCodeType.index, + ram, + ); + List newWallet = await completer.future; + + return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); + } + + /// Generate a wallet from a mnemonic phrase. /// /// If the mnemonic is not in English, you must indicate the language of @@ -120,19 +150,6 @@ class DubpRust { return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); } - /// Get public key (in base 58) of legacy wallet (password + salt) - static Future getLegacyPublicKey({String password, String salt}) { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - native.get_legacy_pubkey( - sendPort.nativePort, - Utf8.toUtf8(password), - Utf8.toUtf8(salt), - ); - return completer.future; - } - /// Get public key (in base 58) of `dewif` keypair. static Future getDewifPublicKey( {String currency = "g1", String dewif, String pin}) async { @@ -148,6 +165,21 @@ class DubpRust { return completer.future; } + /// Get public key (in base 58) of legacy wallet (password + salt) + /// + /// This deprecated method must be used only for compatibility purpose ! + static Future getLegacyPublicKey({String password, String salt}) { + final completer = Completer(); + final sendPort = + singleCompletePort(completer, callback: _handleErr); + native.get_legacy_pubkey( + sendPort.nativePort, + Utf8.toUtf8(password), + Utf8.toUtf8(salt), + ); + return completer.future; + } + /// Sign the message `message` with `dewif` keypair encryted in DEWIF format. /// /// If you have several messages to sign, use `signSeveral` method instead. @@ -167,6 +199,8 @@ class DubpRust { } /// Sign the message `message` with legacy wallet (password + salt) + /// + /// This deprecated method must be used only for compatibility purpose ! static Future signLegacy( {String password, String salt, String message}) { final completer = Completer();