feat(dubp): impl new dewif spec & add method getBip32DewifMnemonic

This commit is contained in:
librelois 2021-04-04 14:11:12 +02:00
parent 20b42742a4
commit c11282d27c
9 changed files with 212 additions and 183 deletions

151
Cargo.lock generated
View File

@ -16,37 +16,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aes"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561"
dependencies = [
"aes-soft",
"aesni",
"cipher",
]
[[package]]
name = "aes-soft"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072"
dependencies = [
"cipher",
"opaque-debug 0.3.0",
]
[[package]]
name = "aesni"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce"
dependencies = [
"cipher",
"opaque-debug 0.3.0",
]
[[package]]
name = "allo-isolate"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -281,15 +250,6 @@ dependencies = [
]
[[package]]
name = "cipher"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
dependencies = [
"generic-array 0.14.4",
]
[[package]]
name = "clang"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -405,28 +365,34 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]]
name = "dubp"
version = "0.50.0"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1669c61ccfe0d3fc7be8fe3175ebd401b9c879f638425f31e92777c73b32ea86"
checksum = "5649c2ed6d55ce1dda5c2ef3af34f5c669c4f8882c81a5d9a395c044c8d001fe"
dependencies = [
"dubp-common",
"dubp-documents",
"dubp-documents-parser",
"dubp-wallet",
"dup-crypto 0.50.0",
"dup-crypto",
]
[[package]]
name = "dubp-client"
version = "0.1.0"
source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#a690f9b1bb029495c6aaf957c31d528dd282b49c"
source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#13ea957330fcb5507d544c9ce4d61902c731a059"
dependencies = [
"arrayvec",
"bincode",
"cfg-if 1.0.0",
"dubp",
"duniter-bca-types",
"fast-threadpool 0.3.1-alpha.0",
"flume",
"graphql_client",
"maybe-async",
"rand",
"reqwest",
"resiter",
"serde",
"static_assertions",
"thiserror",
@ -434,11 +400,11 @@ dependencies = [
[[package]]
name = "dubp-common"
version = "0.50.0"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "515fb09166a50b4543a99c42359fc4afa5a4c7af118c6f9627575c2760f3fef8"
checksum = "af754efaf281211ef4253f9a833adf9064ef95c594f1acb86bee37202d23104b"
dependencies = [
"dup-crypto 0.50.0",
"dup-crypto",
"serde",
"serde_json",
"thiserror",
@ -447,9 +413,9 @@ dependencies = [
[[package]]
name = "dubp-documents"
version = "0.50.0"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccc9327c62778ee4fd060c0efbe32c6cfda5e317c4a2eb4ddee8293fbd278904"
checksum = "0ea7da99c4b73abafa67362741f0271b41e987f33c566daa794fb3aa78adbe55"
dependencies = [
"beef",
"dubp-wallet",
@ -461,9 +427,9 @@ dependencies = [
[[package]]
name = "dubp-documents-parser"
version = "0.50.0"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "271ce4a6bebfdfdaefb0e51f57c9bb04976fce5fbe2744dd60c1dcf857c60c20"
checksum = "c31fa6ba34a4f0e86e2fe2ac4d1c9e9ff6e36bdcfef64e78279b9a05297bd069"
dependencies = [
"dubp-documents",
"json-pest-parser",
@ -475,9 +441,9 @@ dependencies = [
[[package]]
name = "dubp-wallet"
version = "0.50.0"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6e65a121fa6745038e903ed3d1eb6a97f9658c6c6e2bfbf7e9ffdaf34161d23"
checksum = "34ff32a5d34243b2e435f1a7d3b0930fedf2396da07ca2ef6ba51aac1debb0ad"
dependencies = [
"byteorder",
"dubp-common",
@ -496,8 +462,7 @@ dependencies = [
"cbindgen",
"dart-bindgen",
"dubp-client",
"dup-crypto 0.46.0",
"fast-threadpool",
"fast-threadpool 0.3.0",
"once_cell",
"parking_lot",
"rusty-hook",
@ -507,7 +472,7 @@ dependencies = [
[[package]]
name = "duniter-bca-types"
version = "0.1.0"
source = "git+https://git.duniter.org/nodes/typescript/duniter?branch=dev#591f334185151a200a7dbb06b32ff434a19b0885"
source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#d602fca862972b0ecc6639033e67720a268ce9d7"
dependencies = [
"arrayvec",
"bincode",
@ -519,34 +484,10 @@ dependencies = [
[[package]]
name = "dup-crypto"
version = "0.46.0"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b1ebfa9edbb53cd4434f01877fcd74fb2416b93a217754d2daecbeecad67eb"
checksum = "d66627bb4c014d390a345230745931e2144cc10f3dc16989399dde85510a6543"
dependencies = [
"aes",
"arrayvec",
"base64",
"blake3",
"bs58",
"byteorder",
"cryptoxide",
"ed25519-bip32",
"getrandom",
"once_cell",
"ring",
"serde",
"thiserror",
"zerocopy",
"zeroize",
]
[[package]]
name = "dup-crypto"
version = "0.50.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3032421000ca2cdd372bd72f4c548be7f1386d357abb0936291890064d3072e8"
dependencies = [
"aes",
"arrayvec",
"base64",
"blake3",
@ -555,6 +496,7 @@ dependencies = [
"cryptoxide",
"ed25519-bip32",
"getrandom",
"hex",
"once_cell",
"ring",
"serde",
@ -637,6 +579,16 @@ dependencies = [
]
[[package]]
name = "fast-threadpool"
version = "0.3.1-alpha.0"
source = "git+https://github.com/librelois/fast-threadpool?branch=main#1a271710677ecc43cbfe43234ec21c954dfdbef7"
dependencies = [
"async-oneshot",
"flume",
"num_cpus",
]
[[package]]
name = "flate2"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -654,6 +606,10 @@ version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0362ef9c4c1fa854ff95b4cb78045a86e810d804dc04937961988b45427104a9"
dependencies = [
"futures-core",
"futures-sink",
"nanorand",
"pin-project",
"spinning_top",
]
@ -783,8 +739,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"libc",
"wasi",
"wasm-bindgen",
]
[[package]]
@ -904,6 +862,12 @@ dependencies = [
]
[[package]]
name = "hex"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "http"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -1137,6 +1101,15 @@ dependencies = [
]
[[package]]
name = "nanorand"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac1378b66f7c93a1c0f8464a19bf47df8795083842e5090f4b7305973d5a22d0"
dependencies = [
"getrandom",
]
[[package]]
name = "nias"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -1180,12 +1153,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
[[package]]
name = "opaque-debug"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]]
name = "parking_lot"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -1424,6 +1391,12 @@ dependencies = [
]
[[package]]
name = "resiter"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd69ab1e90258b7769f0b5c46bfd802b8206d0707ced4ca4b9d5681b744de1be"
[[package]]
name = "ring"
version = "0.16.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
@ -1543,7 +1516,7 @@ dependencies = [
"block-buffer",
"digest 0.8.1",
"fake-simd",
"opaque-debug 0.2.3",
"opaque-debug",
]
[[package]]

View File

@ -13,7 +13,6 @@ crate-type = ["rlib"]
allo-isolate = "0.1.6"
dubp-client = { git = "https://git.duniter.org/libs/dubp-rs-client-lib", branch = "master", features = ["blocking"], default-features = false }
#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking"], default-features = false }
dup-crypto = { version = "0.46.0", features = ["bip32-ed25519", "dewif", "mnemonic", "mnemonic_french", "scrypt"] }
fast-threadpool = { version = "0.3.0", default-features = false }
once_cell = { version = "1.3.1", default-features = false, features = ["std"] }
parking_lot = "0.11.1"

View File

@ -49,20 +49,12 @@ pub(super) fn gen_dewif(
let currency = parse_currency(currency)?;
let mnemonic =
Mnemonic::from_phrase(mnemonic, language).map_err(|_| DubpError::WrongLanguage)?;
let seed = dubp_client::crypto::mnemonic::mnemonic_to_seed(&mnemonic);
let log_n = log_n(system_memory);
let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
let keypair = dubp_client::crypto::keys::ed25519::bip32::KeyPair::from_seed(seed.clone());
let pubkey = keypair.public_key();
let dewif = dubp_client::crypto::dewif::write_dewif_v4_content(
currency,
log_n,
&secret_code,
&pubkey,
seed,
);
let dewif =
dubp_client::crypto::dewif::create_dewif_v1(currency, log_n, &mnemonic, &secret_code);
Ok(vec![dewif, secret_code])
}
@ -73,6 +65,7 @@ pub(super) fn get_dewif_meta(
secret_code_type: SecretCodeType,
) -> Result<Vec<String>, DubpError> {
let dubp_client::crypto::dewif::DewifMeta {
algo,
currency,
log_n,
version,
@ -82,6 +75,11 @@ pub(super) fn get_dewif_meta(
crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)?;
Ok(vec![
if algo == KeysAlgo::Bip32Ed25519 {
"Bip32Ed25519".to_owned()
} else {
"Ed25519".to_owned()
},
currency.to_string(),
secret_code_len.to_string(),
version.to_string(),
@ -106,18 +104,16 @@ pub(super) fn get_pubkey(
secret_code,
)
} else if address_index_opt.is_none() && external_opt.is_none() {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
)
.map_err(DubpError::DewifReadError)?;
match keypairs.next() {
Some(KeyPairEnum::Ed25519(keypair)) => Ok(keypair.public_key().to_base58()),
Some(KeyPairEnum::Bip32Ed25519(_)) => Err(DubpError::GetMasterPubkeyOfHdWallet),
Some(_) => Err(DubpError::UnsupportedDewifVersion),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
match payload {
DewifPayload::Ed25519(keypair) => Ok(keypair.public_key().to_base58()),
DewifPayload::Bip32Ed25519(_) => Err(DubpError::GetMasterPubkeyOfHdWallet),
}
} else {
Err(DubpError::GiveExternalBoolOrAddressIndexForLegacyWallet)
@ -136,11 +132,7 @@ pub(super) fn get_secret_code_len(
let log_n = dubp_client::crypto::dewif::read_dewif_log_n(ExpectedCurrency::Any, dewif)
.map_err(DubpError::DewifReadError)?;
Ok(crate::secret_code::compute_secret_code_len(
member_wallet,
secret_code_type,
log_n,
)?)
crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)
}
pub(crate) fn log_n(system_memory: i64) -> u8 {

View File

@ -34,22 +34,24 @@ pub(crate) fn get_accounts_pubkeys(
if accounts_indexs.contains(&U31::new(0)?) {
verify_member_secret_code(currency, dewif, secret_code)?;
}
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
)
.map_err(DubpError::DewifReadError)?;
match keypairs.next() {
Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => Ok(accounts_indexs
.into_iter()
.map(|account_index| {
PrivateDerivationPath::transparent(account_index)
.map(|path| master_keypair.derive(path).public_key().to_base58())
})
.collect::<Result<Vec<_>, InvalidAccountIndex>>()?),
Some(_) => Err(DubpError::NotHdWallet),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => {
let master_keypair = KeyPair::from_mnemonic(&mnemonic);
Ok(accounts_indexs
.into_iter()
.map(|account_index| {
PrivateDerivationPath::transparent(account_index)
.map(|path| master_keypair.derive(path).public_key().to_base58())
})
.collect::<Result<Vec<_>, InvalidAccountIndex>>()?)
}
_ => Err(DubpError::NotHdWallet),
}
}
@ -61,7 +63,7 @@ pub(crate) fn get_bip32_keypair(
external_opt: Option<bool>,
secret_code: &str,
) -> Result<KeyPairEnum, DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
@ -72,14 +74,14 @@ pub(crate) fn get_bip32_keypair(
verify_member_secret_code(currency, dewif, secret_code)?;
}
match keypairs.next() {
Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => {
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => {
let master_keypair = KeyPair::from_mnemonic(&mnemonic);
Ok(KeyPairEnum::Bip32Ed25519(master_keypair.derive(
z_get_derivation_path(account_index, address_index_opt, external_opt)?,
)))
}
Some(_) => Err(DubpError::NotHdWallet),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
_ => Err(DubpError::NotHdWallet),
}
}
@ -91,7 +93,7 @@ pub(crate) fn get_bip32_pubkey(
external_opt: Option<bool>,
secret_code: &str,
) -> Result<String, DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
@ -102,17 +104,19 @@ pub(crate) fn get_bip32_pubkey(
verify_member_secret_code(currency, dewif, secret_code)?;
}
match keypairs.next() {
Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => Ok(master_keypair
.derive(z_get_derivation_path(
account_index,
address_index_opt,
external_opt,
)?)
.public_key()
.to_base58()),
Some(_) => Err(DubpError::NotHdWallet),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => {
let master_keypair = KeyPair::from_mnemonic(&mnemonic);
Ok(master_keypair
.derive(z_get_derivation_path(
account_index,
address_index_opt,
external_opt,
)?)
.public_key()
.to_base58())
}
_ => Err(DubpError::NotHdWallet),
}
}
@ -137,20 +141,39 @@ pub(crate) fn get_opaque_account_next_external_address(
}
}
pub(crate) fn get_mnemonic(
currency: Currency,
dewif: &str,
secret_code: &str,
) -> Result<String, DubpError> {
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
)
.map_err(DubpError::DewifReadError)?;
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => Ok(mnemonic.phrase().to_owned()),
_ => Err(DubpError::NotHdWallet),
}
}
pub(crate) fn load_opaque_bip32_accounts(
accounts_indexs: Vec<U31>,
currency: Currency,
dewif: &str,
secret_code: &str,
) -> Result<(), DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
)
.map_err(DubpError::DewifReadError)?;
match keypairs.next() {
Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => {
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => {
let master_keypair = KeyPair::from_mnemonic(&mnemonic);
for account_index in accounts_indexs {
let external_path = PrivateDerivationPath::opaque(account_index, true, None)?;
let external_kp = master_keypair.derive(external_path);
@ -165,8 +188,7 @@ pub(crate) fn load_opaque_bip32_accounts(
}
Ok(())
}
Some(_) => Err(DubpError::NotHdWallet),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
_ => Err(DubpError::NotHdWallet),
}
}
@ -179,7 +201,7 @@ pub(crate) fn sign_bip32(
secret_code: &str,
msg: &str,
) -> Result<String, DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
@ -190,16 +212,18 @@ pub(crate) fn sign_bip32(
verify_member_secret_code(currency, dewif, secret_code)?;
}
match keypairs.next() {
Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => sign_bip32_inner(
account_index,
address_index_opt,
external_opt,
master_keypair,
msg,
),
Some(_) => Err(DubpError::NotHdWallet),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => {
let master_keypair = KeyPair::from_mnemonic(&mnemonic);
sign_bip32_inner(
account_index,
address_index_opt,
external_opt,
master_keypair,
msg,
)
}
_ => Err(DubpError::NotHdWallet),
}
}
@ -212,7 +236,7 @@ pub(crate) fn sign_several_bip32(
secret_code: &str,
msgs: &[&str],
) -> Result<Vec<String>, DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
@ -223,16 +247,18 @@ pub(crate) fn sign_several_bip32(
verify_member_secret_code(currency, dewif, secret_code)?;
}
match keypairs.next() {
Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => sign_several_bip32_inner(
account_index,
address_index_opt,
external_opt,
master_keypair,
msgs,
),
Some(_) => Err(DubpError::NotHdWallet),
None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
match payload {
DewifPayload::Bip32Ed25519(mnemonic) => {
let master_keypair = KeyPair::from_mnemonic(&mnemonic);
sign_several_bip32_inner(
account_index,
address_index_opt,
external_opt,
master_keypair,
msgs,
)
}
_ => Err(DubpError::NotHdWallet),
}
}

View File

@ -21,13 +21,13 @@ pub(crate) fn sign(
secret_code: &str,
msg: &str,
) -> Result<String, DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
)
.map_err(DubpError::DewifReadError)?;
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
if let DewifPayload::Ed25519(keypair) = payload {
Ok(keypair.generate_signator().sign(msg.as_bytes()).to_base64())
} else {
Err(DubpError::DewifReadError(DewifReadError::CorruptedContent))
@ -40,13 +40,13 @@ pub(crate) fn sign_several(
secret_code: &str,
msgs: &[&str],
) -> Result<Vec<String>, DubpError> {
let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
let DewifContent { payload, .. } = dubp_client::crypto::dewif::read_dewif_file_content(
ExpectedCurrency::Specific(currency),
dewif,
&secret_code.to_ascii_uppercase(),
)
.map_err(DubpError::DewifReadError)?;
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
if let DewifPayload::Ed25519(keypair) = payload {
let signator = keypair.generate_signator();
Ok(msgs
.iter()

View File

@ -63,8 +63,8 @@ pub(crate) enum DubpError {
UnknownCurrencyName,
#[error("Unknown language")]
UnknownLanguage,
#[error("Unsupported DEWIF version")]
UnsupportedDewifVersion,
//#[error("Unsupported DEWIF version")]
//UnsupportedDewifVersion,
#[error("{0}")]
Utf8Error(std::str::Utf8Error),
#[error("Wrong language")]

View File

@ -16,6 +16,7 @@
use crate::*;
use dubp_client::crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword};
#[allow(deprecated)]
pub(super) fn gen_dewif_from_legacy(
currency: &str,
salt: String,
@ -26,12 +27,17 @@ pub(super) fn gen_dewif_from_legacy(
) -> Result<Vec<String>, DubpError> {
let currency = parse_currency(currency)?;
let keypair = KeyPairFromSaltedPasswordGenerator::with_default_parameters()
.generate(SaltedPassword::new(salt, password));
.generate(SaltedPassword::new(salt.clone(), password.clone()));
let log_n = crate::dewif::log_n(system_memory);
let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
let dewif =
dubp_client::crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code);
let dewif = dubp_client::crypto::dewif::create_dewif_v1_legacy(
currency,
log_n,
password,
salt,
&secret_code,
);
let pubkey = keypair.public_key().to_base58();
Ok(vec![dewif, secret_code, pubkey])
}

View File

@ -32,13 +32,16 @@ use crate::secret_code::gen_secret_code;
use allo_isolate::{IntoDart, Isolate};
use dubp_client::crypto::{
bases::b58::ToBase58,
dewif::{Currency, DewifReadError, ExpectedCurrency, G1_CURRENCY, G1_TEST_CURRENCY},
dewif::{
Currency, DewifContent, DewifPayload, DewifReadError, ExpectedCurrency, G1_CURRENCY,
G1_TEST_CURRENCY,
},
keys::{
ed25519::bip32::{
ChainCode, InvalidAccountIndex, KeyPair, PrivateDerivationPath, PublicKeyWithChainCode,
},
ed25519::{KeyPairFromSeed32Generator, PublicKey, PublicKeyFromStrErr},
KeyPair as _, KeyPairEnum, PublicKey as _, Signator as _, Signature as _,
KeyPair as _, KeyPairEnum, KeysAlgo, PublicKey as _, Signator as _, Signature as _,
},
mnemonic::{Language, Mnemonic, MnemonicType},
utils::{U31Error, U31},
@ -87,16 +90,12 @@ pub extern "C" fn change_dewif_secret_code(
#[no_mangle]
pub extern "C" fn check_pubkey(port: i64, pubkey: *const raw::c_char) {
exec_async(port, || Ok(char_ptr_to_str(pubkey)?), pubkey::check_pubkey)
exec_async(port, || char_ptr_to_str(pubkey), pubkey::check_pubkey)
}
#[no_mangle]
pub extern "C" fn compute_checksum(port: i64, pubkey: *const raw::c_char) {
exec_async(
port,
|| Ok(char_ptr_to_str(pubkey)?),
pubkey::compute_checksum,
)
exec_async(port, || char_ptr_to_str(pubkey), pubkey::compute_checksum)
}
#[no_mangle]
@ -209,6 +208,25 @@ pub extern "C" fn get_bip32_dewif_accounts_pubkeys(
}
#[no_mangle]
pub extern "C" fn get_bip32_dewif_mnemonic(
port: i64,
currency: *const raw::c_char,
dewif: *const raw::c_char,
secret_code: *const raw::c_char,
) {
exec_async(
port,
|| {
let currency = parse_currency(char_ptr_to_str(currency)?)?;
let dewif = char_ptr_to_str(dewif)?;
let secret_code = char_ptr_to_str(secret_code)?;
Ok((currency, dewif, secret_code))
},
|(currency, dewif, secret_code)| dewif::bip32::get_mnemonic(currency, dewif, secret_code),
)
}
#[no_mangle]
pub extern "C" fn get_dewif_meta(
port: i64,
dewif: *const raw::c_char,

View File

@ -232,6 +232,21 @@ class DubpRust {
return completer.future;
}
/// Get mnemonic phrase of `dewif` (algo Bip32-Ed25519 only).
static Future<List<String>> getBip32DewifMnemonic(
{String currency = "g1", String dewif, String secretCode}) async {
final completer = Completer<List<String>>();
final sendPort = singleCompletePort<List<String>, List>(completer,
callback: _handleErrList);
native.get_bip32_dewif_mnemonic(
sendPort.nativePort,
StringUtf8Pointer(currency).toNativeUtf8(),
StringUtf8Pointer(dewif).toNativeUtf8(),
StringUtf8Pointer(secretCode).toNativeUtf8(),
);
return completer.future;
}
/// Get `dewif` keypair meta data.
static Future<DewifMetaData> getDewifMetaData(
{String dewif,