feat(dubp): add method getDewifSecretCodeLen

This commit is contained in:
librelois 2021-02-08 18:26:30 +01:00
parent f450f0a181
commit 7d9c95bb66
8 changed files with 105 additions and 14 deletions

18
Cargo.lock generated
View File

@ -222,9 +222,9 @@ dependencies = [
[[package]] [[package]]
name = "cryptoxide" name = "cryptoxide"
version = "0.2.1" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da24927b5b899890bcb29205436c957b7892ec3a3fbffce81d710b9611e77778" checksum = "f2824e117f942b77e942b14162316711d66f07d14b0f37a44fa4b4cad592b8fa"
[[package]] [[package]]
name = "dart-bindgen" name = "dart-bindgen"
@ -261,9 +261,9 @@ dependencies = [
[[package]] [[package]]
name = "dup-crypto" name = "dup-crypto"
version = "0.38.0" version = "0.40.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b1f8913ba1b77dbbf419c2aeabc566ccca5e77385b6738bb408cd9a9e7bbb86" checksum = "ba9cba3d83bf946b9e2d3b444f98df563d6ffefa94579bdfc6f06b158cd872a9"
dependencies = [ dependencies = [
"aes", "aes",
"arrayvec", "arrayvec",
@ -272,6 +272,7 @@ dependencies = [
"bs58", "bs58",
"byteorder", "byteorder",
"cryptoxide", "cryptoxide",
"ed25519-bip32",
"getrandom", "getrandom",
"once_cell", "once_cell",
"ring", "ring",
@ -282,6 +283,15 @@ dependencies = [
] ]
[[package]] [[package]]
name = "ed25519-bip32"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8827180a2b511141fbe49141e50b31a8d542465e0fb572f81f36feea2addfe92"
dependencies = [
"cryptoxide",
]
[[package]]
name = "fast-threadpool" name = "fast-threadpool"
version = "0.3.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"

View File

@ -4,4 +4,7 @@ members = ["native/dubp_rs"]
[profile.release] [profile.release]
lto = true lto = true
codegen-units = 1 codegen-units = 1
debug = true debug = true
[patch.crates-io]
#dup-crypto = { path = "/home/elois/dev/duniter/libs/dubp-rs-libs/crypto" }

View File

@ -10,7 +10,7 @@ crate-type = ["rlib"]
[dependencies] [dependencies]
allo-isolate = "0.1.6" allo-isolate = "0.1.6"
dup-crypto = { version = "0.38.0", features = ["dewif", "mnemonic", "mnemonic_french", "rand", "scrypt"] } dup-crypto = { version = "0.40.0", features = ["bip32-ed25519", "dewif", "mnemonic", "mnemonic_french", "rand", "scrypt"] }
fast-threadpool = { version = "0.3.0", default-features = false } fast-threadpool = { version = "0.3.0", default-features = false }
once_cell = { version = "1.3.1", default-features = false, features = ["std"] } once_cell = { version = "1.3.1", default-features = false, features = ["std"] }
thiserror = "1.0.23" thiserror = "1.0.23"

View File

@ -64,6 +64,21 @@ pub(super) fn gen_dewif(
Ok(vec![dewif, secret_code, pubkey]) Ok(vec![dewif, secret_code, pubkey])
} }
pub(super) fn get_secret_code_len(
currency: Currency,
dewif: &str,
member_wallet: bool,
secret_code_type: SecretCodeType,
) -> Result<String, DubpError> {
let log_n = dup_crypto::dewif::read_dewif_log_n(ExpectedCurrency::Specific(currency), dewif)
.map_err(DubpError::DewifReadError)?;
Ok(
crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)?
.to_string(),
)
}
pub(super) fn get_pubkey(currency: Currency, dewif: &str, pin: &str) -> Result<String, DubpError> { pub(super) fn get_pubkey(currency: Currency, dewif: &str, pin: &str) -> Result<String, DubpError> {
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),

View File

@ -15,6 +15,7 @@
use crate::*; use crate::*;
#[derive(Clone, Copy, Debug)]
pub(crate) enum SecretCodeType { pub(crate) enum SecretCodeType {
Digits, Digits,
Letters, Letters,

View File

@ -168,6 +168,29 @@ pub extern "C" fn gen_mnemonic(port: i64, language: u32) {
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn get_dewif_secret_code_len(
port: i64,
currency: *const raw::c_char,
dewif: *const raw::c_char,
member_wallet: u32,
secret_code_type: u32,
) {
exec_async(
port,
|| {
let currency = parse_currency(char_ptr_to_str(currency)?)?;
let dewif = char_ptr_to_str(dewif)?;
let member_wallet = member_wallet != 0;
let secret_code_type = SecretCodeType::from(secret_code_type);
Ok((currency, dewif, member_wallet, secret_code_type))
},
|(currency, dewif, member_wallet, secret_code_type)| {
dewif::get_secret_code_len(currency, dewif, member_wallet, secret_code_type)
},
)
}
#[no_mangle]
pub extern "C" fn get_dewif_pubkey( pub extern "C" fn get_dewif_pubkey(
port: i64, port: i64,
currency: *const raw::c_char, currency: *const raw::c_char,

View File

@ -15,33 +15,45 @@
use crate::*; use crate::*;
pub(crate) fn gen_secret_code( pub(crate) fn compute_secret_code_len(
member_wallet: bool, member_wallet: bool,
secret_code_type: SecretCodeType, secret_code_type: SecretCodeType,
log_n: u8, log_n: u8,
) -> Result<String, DubpError> { ) -> Result<usize, DubpError> {
match secret_code_type { match secret_code_type {
SecretCodeType::Digits => { SecretCodeType::Digits => {
if member_wallet { if member_wallet {
Err(DubpError::DigitsCodeForbidForMemberWallet) Err(DubpError::DigitsCodeForbidForMemberWallet)
} else if log_n >= 15 { } else if log_n >= 15 {
gen_random_digits(7) Ok(7)
} else { } else {
gen_random_digits(8) Ok(8)
} }
} }
SecretCodeType::Letters => { SecretCodeType::Letters => {
if member_wallet { if member_wallet {
gen_random_letters(10) Ok(10)
} else if log_n >= 15 { } else if log_n >= 15 {
gen_random_letters(5) Ok(5)
} else { } else {
gen_random_letters(6) Ok(6)
} }
} }
} }
} }
pub(crate) fn gen_secret_code(
member_wallet: bool,
secret_code_type: SecretCodeType,
log_n: u8,
) -> Result<String, DubpError> {
let secret_code_len = compute_secret_code_len(member_wallet, secret_code_type, log_n)?;
match secret_code_type {
SecretCodeType::Digits => gen_random_digits(secret_code_len),
SecretCodeType::Letters => gen_random_letters(secret_code_len),
}
}
fn gen_random_digits(n: usize) -> Result<String, DubpError> { fn gen_random_digits(n: usize) -> Result<String, DubpError> {
let mut digits_string = dup_crypto::rand::gen_u32() let mut digits_string = dup_crypto::rand::gen_u32()
.map_err(|_| DubpError::RandErr)? .map_err(|_| DubpError::RandErr)?

View File

@ -116,7 +116,6 @@ class DubpRust {
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2])); return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
} }
/// Generate a wallet from a mnemonic phrase. /// Generate a wallet from a mnemonic phrase.
/// ///
/// If the mnemonic is not in English, you must indicate the language of /// If the mnemonic is not in English, you must indicate the language of
@ -165,6 +164,24 @@ class DubpRust {
return completer.future; return completer.future;
} }
/// Get secret code length of `dewif` keypair.
static Future<int> getDewifSecretCodeLen(
{String currency = "g1",
String dewif,
SecretCodeType secretCodeType = SecretCodeType.letters}) async {
final completer = Completer<int>();
final sendPort =
singleCompletePort<int, String>(completer, callback: _handleErrInt);
native.get_dewif_secret_code_len(
sendPort.nativePort,
Utf8.toUtf8(currency),
Utf8.toUtf8(dewif),
0,
secretCodeType.index,
);
return completer.future;
}
/// Get public key (in base 58) of legacy wallet (password + salt) /// Get public key (in base 58) of legacy wallet (password + salt)
/// ///
/// This deprecated method must be used only for compatibility purpose ! /// This deprecated method must be used only for compatibility purpose !
@ -271,4 +288,14 @@ class DubpRust {
return arr; return arr;
} }
} }
static int _handleErrInt(String res) {
if (res.startsWith('DUBP_RS_ERROR: ')) {
final error = res;
print(error);
throw error;
} else {
return int.parse(res);
}
}
} }