diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index f317c3e..c017d69 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -67,23 +67,25 @@ pub(super) fn gen_dewif( Ok(vec![dewif, secret_code]) } -pub(super) fn get_secret_code_len( - dewif: *const raw::c_char, - member_wallet: u32, - secret_code_type: u32, -) -> Result { - let dewif = char_ptr_to_str(dewif)?; - let member_wallet = member_wallet != 0; - let secret_code_type = SecretCodeType::from(secret_code_type); - - let log_n = dup_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, +pub(super) fn get_dewif_meta( + dewif: &str, + member_wallet: bool, + secret_code_type: SecretCodeType, +) -> Result, DubpError> { + let dup_crypto::dewif::DewifMeta { + currency, log_n, - )?) + version, + } = dup_crypto::dewif::read_dewif_meta(dewif).map_err(DubpError::DewifReadError)?; + + let secret_code_len = + crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)?; + + Ok(vec![ + currency.to_string(), + secret_code_len.to_string(), + version.to_string(), + ]) } pub(super) fn get_pubkey( @@ -106,6 +108,25 @@ pub(super) fn get_pubkey( } } +pub(super) fn get_secret_code_len( + dewif: *const raw::c_char, + member_wallet: u32, + secret_code_type: u32, +) -> Result { + let dewif = char_ptr_to_str(dewif)?; + let member_wallet = member_wallet != 0; + let secret_code_type = SecretCodeType::from(secret_code_type); + + let log_n = dup_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, + )?) +} + pub(crate) fn log_n(system_memory: i64) -> u8 { if system_memory > 3_000_000_000 { 15 diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index 602f49a..6109089 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -175,6 +175,27 @@ pub extern "C" fn gen_mnemonic(port: i64, language: u32) { exec_async(port, || u32_to_language(language), mnemonic::gen_mnemonic) } +#[no_mangle] +pub extern "C" fn get_dewif_meta( + port: i64, + dewif: *const raw::c_char, + member_wallet: u32, + secret_code_type: u32, +) { + exec_async( + port, + || { + let dewif = char_ptr_to_str(dewif)?; + let member_wallet = member_wallet != 0; + let secret_code_type = SecretCodeType::from(secret_code_type); + Ok((dewif, member_wallet, secret_code_type)) + }, + |(dewif, member_wallet, secret_code_type)| { + dewif::get_dewif_meta(dewif, member_wallet, secret_code_type) + }, + ) +} + #[no_mangle] pub extern "C" fn get_dewif_secret_code_len( dewif: *const raw::c_char, diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index f3e692c..da50c41 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -6,6 +6,29 @@ import "package:system_info/system_info.dart"; import 'ffi.dart' as native; +/// DEWIF meta data +class DewifMetaData { + /// Currency name + String currency; + + /// Secret code length + int secretCodeLen; + + /// DEWIF version + int version; + + /// Wallet type + WalletType walletType; + + DewifMetaData._(this.currency, this.secretCodeLen, this.version) { + if (version == 4) { + walletType = WalletType.bip32Ed25519; + } else { + walletType = WalletType.ed25519; + } + } +} + /// Language enum Language { /// English @@ -176,6 +199,21 @@ class DubpRust { return completer.future; } + /// Get `dewif` keypair meta data. + static Future getDewifMetaData( + {String dewif, + SecretCodeType secretCodeType = SecretCodeType.letters}) async { + final completer = Completer>(); + final sendPort = singleCompletePort, List>(completer, + callback: _handleErrList); + native.get_dewif_meta( + sendPort.nativePort, Utf8.toUtf8(dewif), 0, secretCodeType.index); + List dewifMetaData = await completer.future; + + return Future.value(DewifMetaData._(dewifMetaData[0], + int.parse(dewifMetaData[1]), int.parse(dewifMetaData[2]))); + } + /// Get public key (in base 58) of `dewif` keypair. static Future getDewifPublicKey( {String currency = "g1", String dewif, String pin}) async {