forked from axiom-team/gecko
perf(dubp): optimize changeDewifPin & genWalletFromMnemonic
This commit is contained in:
parent
b288b601ce
commit
63dd4ee59b
|
@ -38,8 +38,8 @@ pub(super) fn change_pin(
|
||||||
currency: &str,
|
currency: &str,
|
||||||
dewif: &str,
|
dewif: &str,
|
||||||
old_pin: &str,
|
old_pin: &str,
|
||||||
new_pin: &str,
|
member_wallet: bool,
|
||||||
) -> Result<String, DubpError> {
|
) -> Result<Vec<String>, DubpError> {
|
||||||
let currency = parse_currency(currency)?;
|
let currency = parse_currency(currency)?;
|
||||||
let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
|
let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
|
||||||
ExpectedCurrency::Specific(currency),
|
ExpectedCurrency::Specific(currency),
|
||||||
|
@ -48,9 +48,15 @@ pub(super) fn change_pin(
|
||||||
)
|
)
|
||||||
.map_err(DubpError::DewifReadError)?;
|
.map_err(DubpError::DewifReadError)?;
|
||||||
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
|
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
|
||||||
Ok(dup_crypto::dewif::write_dewif_v1_content(
|
let new_pin = if member_wallet {
|
||||||
currency, &keypair, new_pin,
|
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 {
|
} else {
|
||||||
Err(DubpError::DewifReadError(DewifReadError::CorruptedContent))
|
Err(DubpError::DewifReadError(DewifReadError::CorruptedContent))
|
||||||
}
|
}
|
||||||
|
@ -60,20 +66,25 @@ pub(super) fn gen_dewif(
|
||||||
currency: &str,
|
currency: &str,
|
||||||
language: u32,
|
language: u32,
|
||||||
mnemonic: &str,
|
mnemonic: &str,
|
||||||
pin: &str,
|
member_wallet: bool,
|
||||||
) -> Result<String, DubpError> {
|
) -> Result<Vec<String>, DubpError> {
|
||||||
let currency = parse_currency(currency)?;
|
let currency = parse_currency(currency)?;
|
||||||
let mnemonic = Mnemonic::from_phrase(mnemonic, u32_to_language(language)?)
|
let mnemonic = Mnemonic::from_phrase(mnemonic, u32_to_language(language)?)
|
||||||
.map_err(|_| DubpError::WrongLanguage)?;
|
.map_err(|_| DubpError::WrongLanguage)?;
|
||||||
let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic);
|
let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic);
|
||||||
let keypair = KeyPairFromSeed32Generator::generate(seed);
|
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> {
|
pub(super) fn get_pubkey(currency: Currency, dewif: &str, pin: &str) -> Result<String, DubpError> {
|
||||||
let currency = parse_currency(currency)?;
|
|
||||||
let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
|
let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
|
||||||
ExpectedCurrency::Specific(currency),
|
ExpectedCurrency::Specific(currency),
|
||||||
dewif,
|
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) {
|
fn gen_pin2_inner(mut i: u32, pin: &mut String) {
|
||||||
for _ in 0..2 {
|
for _ in 0..2 {
|
||||||
pin.push(to_char(i));
|
pin.push(to_char(i));
|
||||||
|
|
|
@ -59,6 +59,15 @@ fn char_ptr_prt_to_vec_str<'a>(
|
||||||
Ok(str_vec)
|
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> {
|
fn u32_to_language(i: u32) -> Result<Language, DubpError> {
|
||||||
match i {
|
match i {
|
||||||
0 => Ok(Language::English),
|
0 => Ok(Language::English),
|
||||||
|
@ -73,7 +82,7 @@ pub extern "C" fn change_dewif_pin(
|
||||||
currency: *const raw::c_char,
|
currency: *const raw::c_char,
|
||||||
dewif: *const raw::c_char,
|
dewif: *const raw::c_char,
|
||||||
old_pin: *const raw::c_char,
|
old_pin: *const raw::c_char,
|
||||||
new_pin: *const raw::c_char,
|
member_wallet: u32,
|
||||||
) {
|
) {
|
||||||
exec_async(
|
exec_async(
|
||||||
port,
|
port,
|
||||||
|
@ -81,10 +90,12 @@ pub extern "C" fn change_dewif_pin(
|
||||||
let currency = char_ptr_to_str(currency)?;
|
let currency = char_ptr_to_str(currency)?;
|
||||||
let dewif = char_ptr_to_str(dewif)?;
|
let dewif = char_ptr_to_str(dewif)?;
|
||||||
let old_pin = char_ptr_to_str(old_pin)?;
|
let old_pin = char_ptr_to_str(old_pin)?;
|
||||||
let new_pin = char_ptr_to_str(new_pin)?;
|
let member_wallet = member_wallet != 0;
|
||||||
Ok((currency, dewif, old_pin, new_pin))
|
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,
|
currency: *const raw::c_char,
|
||||||
language: u32,
|
language: u32,
|
||||||
mnemonic: *const raw::c_char,
|
mnemonic: *const raw::c_char,
|
||||||
pin: *const raw::c_char,
|
member_wallet: u32,
|
||||||
) {
|
) {
|
||||||
exec_async(
|
exec_async(
|
||||||
port,
|
port,
|
||||||
|| {
|
|| {
|
||||||
let currency = char_ptr_to_str(currency)?;
|
let currency = char_ptr_to_str(currency)?;
|
||||||
let mnemonic = char_ptr_to_str(mnemonic)?;
|
let mnemonic = char_ptr_to_str(mnemonic)?;
|
||||||
let pin = char_ptr_to_str(pin)?;
|
let member_wallet = member_wallet != 0;
|
||||||
Ok((currency, language, mnemonic, pin))
|
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(
|
exec_async(
|
||||||
port,
|
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 dewif = char_ptr_to_str(dewif)?;
|
||||||
let pin = char_ptr_to_str(pin)?;
|
let pin = char_ptr_to_str(pin)?;
|
||||||
Ok((currency, dewif, pin))
|
Ok((currency, dewif, pin))
|
||||||
|
|
|
@ -63,70 +63,25 @@ class DubpRust {
|
||||||
return completer.future;
|
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.
|
/// Change the pin code that encrypts the `dewif` keypair.
|
||||||
static Future<NewWallet> changeDewifPin(
|
static Future<NewWallet> changeDewifPin(
|
||||||
{String currency = "g1",
|
{String currency = "g1",
|
||||||
String dewif,
|
String dewif,
|
||||||
String oldPin,
|
String oldPin,
|
||||||
PinLength newPinLength = PinLength.six}) async {
|
PinLength newPinLength = PinLength.six}) async {
|
||||||
// pin
|
final completer = Completer<List<String>>();
|
||||||
String newPin = await _genPin(newPinLength);
|
final sendPort = singleCompletePort<List<String>, List>(completer,
|
||||||
// dewif
|
callback: _handleErrList);
|
||||||
String newDewif;
|
native.change_dewif_pin(
|
||||||
{
|
sendPort.nativePort,
|
||||||
final completer = Completer<String>();
|
Utf8.toUtf8(currency),
|
||||||
final sendPort =
|
Utf8.toUtf8(dewif),
|
||||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
Utf8.toUtf8(oldPin),
|
||||||
native.change_dewif_pin(
|
0,
|
||||||
sendPort.nativePort,
|
);
|
||||||
Utf8.toUtf8(currency),
|
List<String> newWallet = await completer.future;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Future.value(NewWallet._(newDewif, newPin, publicKey));
|
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate a wallet from a mnemonic phrase.
|
/// Generate a wallet from a mnemonic phrase.
|
||||||
|
@ -141,37 +96,19 @@ class DubpRust {
|
||||||
Language language = Language.english,
|
Language language = Language.english,
|
||||||
String mnemonic,
|
String mnemonic,
|
||||||
PinLength pinLength = PinLength.six}) async {
|
PinLength pinLength = PinLength.six}) async {
|
||||||
// pin
|
final completer = Completer<List<String>>();
|
||||||
String pin = await _genPin(pinLength);
|
final sendPort = singleCompletePort<List<String>, List>(completer,
|
||||||
// publicKey
|
callback: _handleErrList);
|
||||||
String publicKey;
|
native.gen_dewif(
|
||||||
{
|
sendPort.nativePort,
|
||||||
final completer = Completer<String>();
|
Utf8.toUtf8(currency),
|
||||||
final sendPort =
|
language.index,
|
||||||
singleCompletePort<String, String>(completer, callback: _handleErr);
|
Utf8.toUtf8(mnemonic),
|
||||||
native.mnemonic_to_pubkey(
|
0,
|
||||||
sendPort.nativePort,
|
);
|
||||||
language.index,
|
List<String> newWallet = await completer.future;
|
||||||
Utf8.toUtf8(mnemonic),
|
|
||||||
);
|
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get pulblic key (in base 58) of `dewif` keypair.
|
/// Get pulblic key (in base 58) of `dewif` keypair.
|
||||||
|
|
Loading…
Reference in New Issue