diff --git a/Cargo.lock b/Cargo.lock index 2c6ad0e..70861c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -261,9 +261,9 @@ dependencies = [ [[package]] name = "dup-crypto" -version = "0.36.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed9887f92b29910736ad29f5631abcbd8fc6b2bd2dd5510dc1edd32b0265d04" +checksum = "3b1f8913ba1b77dbbf419c2aeabc566ccca5e77385b6738bb408cd9a9e7bbb86" dependencies = [ "aes", "arrayvec", diff --git a/native/dubp_rs/Cargo.toml b/native/dubp_rs/Cargo.toml index 58d56c9..1b138b3 100644 --- a/native/dubp_rs/Cargo.toml +++ b/native/dubp_rs/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["rlib"] [dependencies] allo-isolate = "0.1.6" -dup-crypto = { version = "0.36.0", features = ["dewif", "mnemonic", "mnemonic_french", "rand", "scrypt"] } +dup-crypto = { version = "0.38.0", features = ["dewif", "mnemonic", "mnemonic_french", "rand", "scrypt"] } fast-threadpool = { version = "0.3.0", default-features = false } once_cell = { version = "1.3.1", default-features = false, features = ["std"] } thiserror = "1.0.23" diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index a7905e3..2186fcc 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -21,6 +21,7 @@ pub(super) fn change_secret_code( old_secret_code: &str, member_wallet: bool, secret_code_type: SecretCodeType, + system_memory: i64, ) -> Result, DubpError> { let currency = parse_currency(currency)?; let mut keypairs = dup_crypto::dewif::read_dewif_file_content( @@ -30,9 +31,11 @@ pub(super) fn change_secret_code( ) .map_err(DubpError::DewifReadError)?; if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() { - let new_secret_code = gen_secret_code(member_wallet, secret_code_type)?; + let log_n = log_n(system_memory); + let new_secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?; - let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &new_secret_code); + let dewif = + dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &new_secret_code); let pubkey = keypair.public_key().to_base58(); Ok(vec![dewif, new_secret_code, pubkey]) } else { @@ -46,6 +49,7 @@ pub(super) fn gen_dewif( mnemonic: &str, member_wallet: bool, secret_code_type: SecretCodeType, + system_memory: i64, ) -> Result, DubpError> { let currency = parse_currency(currency)?; let mnemonic = @@ -53,8 +57,9 @@ pub(super) fn gen_dewif( let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic); let keypair = KeyPairFromSeed32Generator::generate(seed); - let secret_code = gen_secret_code(member_wallet, secret_code_type)?; - let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &secret_code); + let log_n = 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]) } @@ -111,3 +116,11 @@ pub(super) fn sign_several( Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)) } } + +fn log_n(system_memory: i64) -> u8 { + if system_memory > 3_000_000_000 { + 15 + } else { + 12 + } +} diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index a778aba..b701806 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -49,6 +49,7 @@ pub extern "C" fn change_dewif_secret_code( old_pin: *const raw::c_char, member_wallet: u32, secret_code_type: u32, + system_memory: i64, ) { exec_async( port, @@ -58,10 +59,24 @@ pub extern "C" fn change_dewif_secret_code( let old_pin = char_ptr_to_str(old_pin)?; let member_wallet = member_wallet != 0; let secret_code_type = SecretCodeType::from(secret_code_type); - Ok((currency, dewif, old_pin, member_wallet, secret_code_type)) + Ok(( + currency, + dewif, + old_pin, + member_wallet, + secret_code_type, + system_memory, + )) }, - |(currency, dewif, old_pin, member_wallet, secret_code_type)| { - dewif::change_secret_code(currency, dewif, old_pin, member_wallet, secret_code_type) + |(currency, dewif, old_pin, member_wallet, secret_code_type, system_memory)| { + dewif::change_secret_code( + currency, + dewif, + old_pin, + member_wallet, + secret_code_type, + system_memory, + ) }, ) } @@ -74,6 +89,7 @@ pub extern "C" fn gen_dewif( mnemonic: *const raw::c_char, member_wallet: u32, secret_code_type: u32, + system_memory: i64, ) { exec_async( port, @@ -89,15 +105,17 @@ pub extern "C" fn gen_dewif( mnemonic, member_wallet, secret_code_type, + system_memory, )) }, - |(currency, language, mnemonic, member_wallet, secret_code_type)| { + |(currency, language, mnemonic, member_wallet, secret_code_type, system_memory)| { dewif::gen_dewif( currency, language, mnemonic, member_wallet, secret_code_type, + system_memory, ) }, ) diff --git a/native/dubp_rs/src/secret_code.rs b/native/dubp_rs/src/secret_code.rs index f9581e4..4b29dca 100644 --- a/native/dubp_rs/src/secret_code.rs +++ b/native/dubp_rs/src/secret_code.rs @@ -18,11 +18,14 @@ use crate::*; pub(crate) fn gen_secret_code( member_wallet: bool, secret_code_type: SecretCodeType, + log_n: u8, ) -> Result { match secret_code_type { SecretCodeType::Digits => { if member_wallet { Err(DubpError::DigitsCodeForbidForMemberWallet) + } else if log_n >= 15 { + gen_random_digits(7) } else { gen_random_digits(8) } @@ -30,6 +33,8 @@ pub(crate) fn gen_secret_code( SecretCodeType::Letters => { if member_wallet { gen_random_letters(10) + } else if log_n >= 15 { + gen_random_letters(5) } else { gen_random_letters(6) } diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index e2f1d2e..1a7f3d7 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:ffi'; import 'package:ffi/ffi.dart'; import 'package:isolate/ports.dart'; +import "package:system_info/system_info.dart"; import 'ffi.dart' as native; @@ -45,7 +46,7 @@ class DubpRust { /// Must be called only once at the start of your application. static void setup() { native.store_dart_post_cobject(NativeApi.postCObject); - print("Dubp Setup Done"); + print("DUBP_RS Setup Done"); } /// Generate a random mnemonic @@ -67,6 +68,8 @@ class DubpRust { String oldPin, SecretCodeType secretCodeType = SecretCodeType.letters, }) async { + int ram = SysInfo.getTotalPhysicalMemory(); + final completer = Completer>(); final sendPort = singleCompletePort, List>(completer, callback: _handleErrList); @@ -77,6 +80,7 @@ class DubpRust { Utf8.toUtf8(oldPin), 0, secretCodeType.index, + ram, ); List newWallet = await completer.future; @@ -96,6 +100,9 @@ class DubpRust { String mnemonic, SecretCodeType secretCodeType = SecretCodeType.letters, }) async { + int ram = SysInfo.getTotalPhysicalMemory(); + print('ram=$ram'); + final completer = Completer>(); final sendPort = singleCompletePort, List>(completer, callback: _handleErrList); @@ -106,6 +113,7 @@ class DubpRust { Utf8.toUtf8(mnemonic), 0, secretCodeType.index, + ram, ); List newWallet = await completer.future; diff --git a/packages/dubp_rs/pubspec.lock b/packages/dubp_rs/pubspec.lock index 37fe020..c5f7973 100644 --- a/packages/dubp_rs/pubspec.lock +++ b/packages/dubp_rs/pubspec.lock @@ -64,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + file_utils: + dependency: transitive + description: + name: file_utils + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" flutter: dependency: "direct main" description: flutter @@ -74,6 +81,13 @@ packages: description: flutter source: sdk version: "0.0.0" + globbing: + dependency: transitive + description: + name: globbing + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" isolate: dependency: "direct main" description: @@ -135,6 +149,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0-nullsafety.1" + system_info: + dependency: "direct main" + description: + name: system_info + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" term_glyph: dependency: transitive description: diff --git a/packages/dubp_rs/pubspec.yaml b/packages/dubp_rs/pubspec.yaml index e640dce..bfc6dfa 100644 --- a/packages/dubp_rs/pubspec.yaml +++ b/packages/dubp_rs/pubspec.yaml @@ -11,6 +11,7 @@ dependencies: sdk: flutter ffi: ^0.1.3 isolate: ^2.0.3 + system_info: ^0.1.3 dev_dependencies: effective_dart: ^1.0.0 diff --git a/pubspec.lock b/pubspec.lock index 299602e..a5cb3cb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -134,6 +134,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.2.1" + file_utils: + dependency: transitive + description: + name: file_utils + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" flutter: dependency: "direct main" description: flutter @@ -163,6 +170,13 @@ packages: description: flutter source: sdk version: "0.0.0" + globbing: + dependency: transitive + description: + name: globbing + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" gql: dependency: transitive description: