feat(dubp): add method getDewifMetaData

This commit is contained in:
librelois 2021-02-14 17:36:44 +01:00
parent 2981181817
commit 673e2db2ba
3 changed files with 96 additions and 16 deletions

View File

@ -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<usize, DubpError> {
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<Vec<String>, 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<usize, DubpError> {
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

View File

@ -176,6 +176,27 @@ pub extern "C" fn gen_mnemonic(port: i64, language: u32) {
}
#[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,
member_wallet: u32,

View File

@ -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<DewifMetaData> getDewifMetaData(
{String dewif,
SecretCodeType secretCodeType = SecretCodeType.letters}) async {
final completer = Completer<List<String>>();
final sendPort = singleCompletePort<List<String>, List>(completer,
callback: _handleErrList);
native.get_dewif_meta(
sendPort.nativePort, Utf8.toUtf8(dewif), 0, secretCodeType.index);
List<String> 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<String> getDewifPublicKey(
{String currency = "g1", String dewif, String pin}) async {