perf(dubp): optimize changeDewifPin & genWalletFromMnemonic

This commit is contained in:
librelois 2021-01-09 22:03:19 +01:00
parent b288b601ce
commit 63dd4ee59b
3 changed files with 70 additions and 118 deletions

View File

@ -38,8 +38,8 @@ pub(super) fn change_pin(
currency: &str,
dewif: &str,
old_pin: &str,
new_pin: &str,
) -> Result<String, DubpError> {
member_wallet: bool,
) -> Result<Vec<String>, 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<String, DubpError> {
member_wallet: bool,
) -> Result<Vec<String>, 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<String, DubpError> {
let currency = parse_currency(currency)?;
pub(super) fn get_pubkey(currency: Currency, dewif: &str, pin: &str) -> Result<String, DubpError> {
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<Currency, DubpError> {
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));

View File

@ -59,6 +59,15 @@ fn char_ptr_prt_to_vec_str<'a>(
Ok(str_vec)
}
pub(crate) fn parse_currency(currency: &str) -> Result<Currency, DubpError> {
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<Language, DubpError> {
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))

View File

@ -63,70 +63,25 @@ class DubpRust {
return completer.future;
}
static Future<String> _genPin(PinLength pinLength) {
final completer = Completer<String>();
final sendPort =
singleCompletePort<String, String>(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<NewWallet> 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<String>();
final sendPort =
singleCompletePort<String, String>(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<String>();
final sendPort =
singleCompletePort<String, String>(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<List<String>>();
final sendPort = singleCompletePort<List<String>, List>(completer,
callback: _handleErrList);
native.change_dewif_pin(
sendPort.nativePort,
Utf8.toUtf8(currency),
Utf8.toUtf8(dewif),
Utf8.toUtf8(oldPin),
0,
);
List<String> 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<String>();
final sendPort =
singleCompletePort<String, String>(completer, callback: _handleErr);
native.mnemonic_to_pubkey(
sendPort.nativePort,
language.index,
Utf8.toUtf8(mnemonic),
);
publicKey = await completer.future;
}
// dewif
String dewif;
{
final completer = Completer<String>();
final sendPort =
singleCompletePort<String, String>(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<List<String>>();
final sendPort = singleCompletePort<List<String>, List>(completer,
callback: _handleErrList);
native.gen_dewif(
sendPort.nativePort,
Utf8.toUtf8(currency),
language.index,
Utf8.toUtf8(mnemonic),
0,
);
List<String> newWallet = await completer.future;
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
}
/// Get pulblic key (in base 58) of `dewif` keypair.