diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index 6e9932c..6fe856a 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -38,8 +38,8 @@ pub(super) fn change_pin( currency: &str, dewif: &str, old_pin: &str, - new_pin: &str, -) -> Result { + member_wallet: bool, +) -> Result, DubpError> { let currency = parse_currency(currency)?; let mut keypairs = dup_crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), @@ -48,9 +48,15 @@ pub(super) fn change_pin( ) .map_err(DubpError::DewifReadError)?; if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() { - Ok(dup_crypto::dewif::write_dewif_v1_content( - currency, &keypair, new_pin, - )) + let new_pin = if member_wallet { + gen_pin10()? + } else { + gen_pin6()? + }; + + let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &new_pin); + let pubkey = keypair.public_key().to_base58(); + Ok(vec![dewif, new_pin, pubkey]) } else { Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)) } @@ -60,20 +66,25 @@ pub(super) fn gen_dewif( currency: &str, language: u32, mnemonic: &str, - pin: &str, -) -> Result { + member_wallet: bool, +) -> Result, DubpError> { let currency = parse_currency(currency)?; let mnemonic = Mnemonic::from_phrase(mnemonic, u32_to_language(language)?) .map_err(|_| DubpError::WrongLanguage)?; let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic); let keypair = KeyPairFromSeed32Generator::generate(seed); - Ok(dup_crypto::dewif::write_dewif_v1_content( - currency, &keypair, pin, - )) + + let pin = if member_wallet { + gen_pin10()? + } else { + gen_pin6()? + }; + let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &pin); + let pubkey = keypair.public_key().to_base58(); + Ok(vec![dewif, pin, pubkey]) } -pub(super) fn get_pubkey(currency: &str, dewif: &str, pin: &str) -> Result { - let currency = parse_currency(currency)?; +pub(super) fn get_pubkey(currency: Currency, dewif: &str, pin: &str) -> Result { let mut keypairs = dup_crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, @@ -126,15 +137,6 @@ pub(super) fn sign_several( } } -fn parse_currency(currency: &str) -> Result { - let currency_code = match currency { - "g1" => G1_CURRENCY, - "g1-test" | "gt" => G1_TEST_CURRENCY, - _ => return Err(DubpError::UnknownCurrencyName), - }; - Ok(Currency::from(currency_code)) -} - fn gen_pin2_inner(mut i: u32, pin: &mut String) { for _ in 0..2 { pin.push(to_char(i)); diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index 2f29e58..65be056 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -59,6 +59,15 @@ fn char_ptr_prt_to_vec_str<'a>( Ok(str_vec) } +pub(crate) fn parse_currency(currency: &str) -> Result { + let currency_code = match currency { + "g1" => G1_CURRENCY, + "g1-test" | "gt" => G1_TEST_CURRENCY, + _ => return Err(DubpError::UnknownCurrencyName), + }; + Ok(Currency::from(currency_code)) +} + fn u32_to_language(i: u32) -> Result { match i { 0 => Ok(Language::English), @@ -73,7 +82,7 @@ pub extern "C" fn change_dewif_pin( currency: *const raw::c_char, dewif: *const raw::c_char, old_pin: *const raw::c_char, - new_pin: *const raw::c_char, + member_wallet: u32, ) { exec_async( port, @@ -81,10 +90,12 @@ pub extern "C" fn change_dewif_pin( let currency = char_ptr_to_str(currency)?; let dewif = char_ptr_to_str(dewif)?; let old_pin = char_ptr_to_str(old_pin)?; - let new_pin = char_ptr_to_str(new_pin)?; - Ok((currency, dewif, old_pin, new_pin)) + let member_wallet = member_wallet != 0; + Ok((currency, dewif, old_pin, member_wallet)) + }, + |(currency, dewif, old_pin, member_wallet)| { + dewif::change_pin(currency, dewif, old_pin, member_wallet) }, - |(currency, dewif, old_pin, new_pin)| dewif::change_pin(currency, dewif, old_pin, new_pin), ) } @@ -94,17 +105,19 @@ pub extern "C" fn gen_dewif( currency: *const raw::c_char, language: u32, mnemonic: *const raw::c_char, - pin: *const raw::c_char, + member_wallet: u32, ) { exec_async( port, || { let currency = char_ptr_to_str(currency)?; let mnemonic = char_ptr_to_str(mnemonic)?; - let pin = char_ptr_to_str(pin)?; - Ok((currency, language, mnemonic, pin)) + let member_wallet = member_wallet != 0; + Ok((currency, language, mnemonic, member_wallet)) + }, + |(currency, language, mnemonic, member_wallet)| { + dewif::gen_dewif(currency, language, mnemonic, member_wallet) }, - |(currency, language, mnemonic, pin)| dewif::gen_dewif(currency, language, mnemonic, pin), ) } @@ -138,7 +151,7 @@ pub extern "C" fn get_dewif_pubkey( exec_async( port, || { - let currency = char_ptr_to_str(currency)?; + let currency = parse_currency(char_ptr_to_str(currency)?)?; let dewif = char_ptr_to_str(dewif)?; let pin = char_ptr_to_str(pin)?; Ok((currency, dewif, pin)) diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index 35b4e8a..9856183 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -63,70 +63,25 @@ class DubpRust { return completer.future; } - static Future _genPin(PinLength pinLength) { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - switch (pinLength) { - case PinLength.ten: - native.gen_pin10( - sendPort.nativePort, - ); - break; - case PinLength.eight: - native.gen_pin8( - sendPort.nativePort, - ); - break; - case PinLength.six: - default: - native.gen_pin6( - sendPort.nativePort, - ); - break; - } - return completer.future; - } - /// Change the pin code that encrypts the `dewif` keypair. static Future changeDewifPin( {String currency = "g1", String dewif, String oldPin, PinLength newPinLength = PinLength.six}) async { - // pin - String newPin = await _genPin(newPinLength); - // dewif - String newDewif; - { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - native.change_dewif_pin( - sendPort.nativePort, - Utf8.toUtf8(currency), - Utf8.toUtf8(dewif), - Utf8.toUtf8(oldPin), - Utf8.toUtf8(newPin), - ); - newDewif = await completer.future; - } - // publicKey - String publicKey; - { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - native.get_dewif_pubkey( - sendPort.nativePort, - Utf8.toUtf8(currency), - Utf8.toUtf8(newDewif), - Utf8.toUtf8(newPin), - ); - publicKey = await completer.future; - } + final completer = Completer>(); + final sendPort = singleCompletePort, List>(completer, + callback: _handleErrList); + native.change_dewif_pin( + sendPort.nativePort, + Utf8.toUtf8(currency), + Utf8.toUtf8(dewif), + Utf8.toUtf8(oldPin), + 0, + ); + List newWallet = await completer.future; - return Future.value(NewWallet._(newDewif, newPin, publicKey)); + return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); } /// Generate a wallet from a mnemonic phrase. @@ -141,37 +96,19 @@ class DubpRust { Language language = Language.english, String mnemonic, PinLength pinLength = PinLength.six}) async { - // pin - String pin = await _genPin(pinLength); - // publicKey - String publicKey; - { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - native.mnemonic_to_pubkey( - sendPort.nativePort, - language.index, - Utf8.toUtf8(mnemonic), - ); - publicKey = await completer.future; - } - // dewif - String dewif; - { - final completer = Completer(); - final sendPort = - singleCompletePort(completer, callback: _handleErr); - native.gen_dewif( - sendPort.nativePort, - Utf8.toUtf8(currency), - language.index, - Utf8.toUtf8(mnemonic), - Utf8.toUtf8(pin), - ); - dewif = await completer.future; - } - return Future.value(NewWallet._(dewif, pin, publicKey)); + final completer = Completer>(); + final sendPort = singleCompletePort, List>(completer, + callback: _handleErrList); + native.gen_dewif( + sendPort.nativePort, + Utf8.toUtf8(currency), + language.index, + Utf8.toUtf8(mnemonic), + 0, + ); + List newWallet = await completer.future; + + return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); } /// Get pulblic key (in base 58) of `dewif` keypair.