diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index 2186fcc56fdae68d5cf222fbdfcde97aae7581a0..80fa7ba23e0ebc843331c96c223c5ae371b5e35a 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 b5d649bcd1c05bda385df8cf5c6c5f9a3d6fdea1..049b6d17ae7e5d6aee23989dc7362a4f586f3f19 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<Vec<String>, 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 7530a96568f5a79438d28c8ffd9e6082310e1548..91a2811419bd152247f9a0cbed961beef196cb40 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -122,6 +122,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 6332ea36d979be45d210f7a59fc212b627820cb1..7aa5c26cb10708006ea5a12d7ddb84af6232f071 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -49,6 +49,32 @@ class DubpRust { print("DUBP_RS Setup Done"); } + /// Change the secret code that encrypts the `dewif` keypair. + static Future<NewWallet> changeDewifPin({ + String currency = "g1", + String dewif, + String oldPin, + SecretCodeType secretCodeType = SecretCodeType.letters, + }) async { + int ram = SysInfo.getTotalPhysicalMemory(); + + final completer = Completer<List<String>>(); + final sendPort = singleCompletePort<List<String>, List>(completer, + callback: _handleErrList); + native.change_dewif_secret_code( + sendPort.nativePort, + Utf8.toUtf8(currency), + Utf8.toUtf8(dewif), + Utf8.toUtf8(oldPin), + 0, + secretCodeType.index, + ram, + ); + List<String> newWallet = await completer.future; + + return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); + } + /// Generate a random mnemonic static Future<String> genMnemonic({Language language = Language.english}) { final completer = Completer<String>(); @@ -61,23 +87,26 @@ class DubpRust { return completer.future; } - /// Change the secret code that encrypts the `dewif` keypair. - static Future<NewWallet> changeDewifPin({ + /// Generate a wallet from a deprecated salt + password couple. + /// + /// This deprecated method must be used only for compatibility purpose ! + static Future<NewWallet> genWalletFromDeprecatedSaltPassword({ String currency = "g1", - String dewif, - String oldPin, + String salt, + String password, SecretCodeType secretCodeType = SecretCodeType.letters, }) async { int ram = SysInfo.getTotalPhysicalMemory(); + print('ram=$ram'); final completer = Completer<List<String>>(); final sendPort = singleCompletePort<List<String>, List>(completer, callback: _handleErrList); - native.change_dewif_secret_code( + native.gen_dewif_from_legacy( sendPort.nativePort, Utf8.toUtf8(currency), - Utf8.toUtf8(dewif), - Utf8.toUtf8(oldPin), + Utf8.toUtf8(salt), + Utf8.toUtf8(password), 0, secretCodeType.index, ram, @@ -87,6 +116,7 @@ class DubpRust { 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,30 +150,32 @@ 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<String> getLegacyPublicKey({String password, String salt}) { + /// Get public key (in base 58) of `dewif` keypair. + static Future<String> getDewifPublicKey( + {String currency = "g1", String dewif, String pin}) async { final completer = Completer<String>(); final sendPort = singleCompletePort<String, String>(completer, callback: _handleErr); - native.get_legacy_pubkey( + native.get_dewif_pubkey( sendPort.nativePort, - Utf8.toUtf8(password), - Utf8.toUtf8(salt), + Utf8.toUtf8(currency), + Utf8.toUtf8(dewif), + Utf8.toUtf8(pin), ); return completer.future; } - /// Get public key (in base 58) of `dewif` keypair. - static Future<String> getDewifPublicKey( - {String currency = "g1", String dewif, String pin}) async { + /// Get public key (in base 58) of legacy wallet (password + salt) + /// + /// This deprecated method must be used only for compatibility purpose ! + static Future<String> getLegacyPublicKey({String password, String salt}) { final completer = Completer<String>(); final sendPort = singleCompletePort<String, String>(completer, callback: _handleErr); - native.get_dewif_pubkey( + native.get_legacy_pubkey( sendPort.nativePort, - Utf8.toUtf8(currency), - Utf8.toUtf8(dewif), - Utf8.toUtf8(pin), + Utf8.toUtf8(password), + Utf8.toUtf8(salt), ); return completer.future; } @@ -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<String> signLegacy( {String password, String salt, String message}) { final completer = Completer<String>();