Merge pull request 'add legacy ard adapt secret code len' (#6) from dubp into master
Reviewed-on: #6
This commit is contained in:
commit
4499f8c4fc
|
@ -261,9 +261,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dup-crypto"
|
name = "dup-crypto"
|
||||||
version = "0.36.0"
|
version = "0.38.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2ed9887f92b29910736ad29f5631abcbd8fc6b2bd2dd5510dc1edd32b0265d04"
|
checksum = "3b1f8913ba1b77dbbf419c2aeabc566ccca5e77385b6738bb408cd9a9e7bbb86"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
|
|
|
@ -10,7 +10,7 @@ crate-type = ["rlib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
allo-isolate = "0.1.6"
|
allo-isolate = "0.1.6"
|
||||||
dup-crypto = { version = "0.36.0", features = ["dewif", "mnemonic", "mnemonic_french", "rand", "scrypt"] }
|
dup-crypto = { version = "0.38.0", features = ["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"
|
||||||
|
|
|
@ -21,6 +21,7 @@ pub(super) fn change_secret_code(
|
||||||
old_secret_code: &str,
|
old_secret_code: &str,
|
||||||
member_wallet: bool,
|
member_wallet: bool,
|
||||||
secret_code_type: SecretCodeType,
|
secret_code_type: SecretCodeType,
|
||||||
|
system_memory: i64,
|
||||||
) -> Result<Vec<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(
|
||||||
|
@ -30,9 +31,11 @@ pub(super) fn change_secret_code(
|
||||||
)
|
)
|
||||||
.map_err(DubpError::DewifReadError)?;
|
.map_err(DubpError::DewifReadError)?;
|
||||||
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
|
if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() {
|
||||||
let new_secret_code = gen_secret_code(member_wallet, secret_code_type)?;
|
let log_n = log_n(system_memory);
|
||||||
|
let new_secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
|
||||||
|
|
||||||
let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &new_secret_code);
|
let dewif =
|
||||||
|
dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &new_secret_code);
|
||||||
let pubkey = keypair.public_key().to_base58();
|
let pubkey = keypair.public_key().to_base58();
|
||||||
Ok(vec![dewif, new_secret_code, pubkey])
|
Ok(vec![dewif, new_secret_code, pubkey])
|
||||||
} else {
|
} else {
|
||||||
|
@ -46,6 +49,7 @@ pub(super) fn gen_dewif(
|
||||||
mnemonic: &str,
|
mnemonic: &str,
|
||||||
member_wallet: bool,
|
member_wallet: bool,
|
||||||
secret_code_type: SecretCodeType,
|
secret_code_type: SecretCodeType,
|
||||||
|
system_memory: i64,
|
||||||
) -> Result<Vec<String>, DubpError> {
|
) -> Result<Vec<String>, DubpError> {
|
||||||
let currency = parse_currency(currency)?;
|
let currency = parse_currency(currency)?;
|
||||||
let mnemonic =
|
let mnemonic =
|
||||||
|
@ -53,8 +57,9 @@ pub(super) fn gen_dewif(
|
||||||
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);
|
||||||
|
|
||||||
let secret_code = gen_secret_code(member_wallet, secret_code_type)?;
|
let log_n = log_n(system_memory);
|
||||||
let dewif = dup_crypto::dewif::write_dewif_v1_content(currency, &keypair, &secret_code);
|
let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
|
||||||
|
let dewif = dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code);
|
||||||
let pubkey = keypair.public_key().to_base58();
|
let pubkey = keypair.public_key().to_base58();
|
||||||
Ok(vec![dewif, secret_code, pubkey])
|
Ok(vec![dewif, secret_code, pubkey])
|
||||||
}
|
}
|
||||||
|
@ -111,3 +116,11 @@ pub(super) fn sign_several(
|
||||||
Err(DubpError::DewifReadError(DewifReadError::CorruptedContent))
|
Err(DubpError::DewifReadError(DewifReadError::CorruptedContent))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn log_n(system_memory: i64) -> u8 {
|
||||||
|
if system_memory > 3_000_000_000 {
|
||||||
|
15
|
||||||
|
} else {
|
||||||
|
12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
// Copyright (C) 2020 Éloïs SANCHEZ.
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use crate::*;
|
||||||
|
use dup_crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword};
|
||||||
|
|
||||||
|
pub(super) fn get_pubkey(salt: &str, password: &str) -> String {
|
||||||
|
KeyPairFromSaltedPasswordGenerator::with_default_parameters()
|
||||||
|
.generate(SaltedPassword::new(salt.to_owned(), password.to_owned()))
|
||||||
|
.public_key()
|
||||||
|
.to_base58()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn sign(salt: &str, password: &str, msg: &str) -> String {
|
||||||
|
KeyPairFromSaltedPasswordGenerator::with_default_parameters()
|
||||||
|
.generate(SaltedPassword::new(salt.to_owned(), password.to_owned()))
|
||||||
|
.generate_signator()
|
||||||
|
.sign(msg.as_bytes())
|
||||||
|
.to_base64()
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ mod r#async;
|
||||||
mod dewif;
|
mod dewif;
|
||||||
mod error;
|
mod error;
|
||||||
mod inputs;
|
mod inputs;
|
||||||
|
mod legacy;
|
||||||
mod mnemonic;
|
mod mnemonic;
|
||||||
mod secret_code;
|
mod secret_code;
|
||||||
|
|
||||||
|
@ -49,6 +50,7 @@ pub extern "C" fn change_dewif_secret_code(
|
||||||
old_pin: *const raw::c_char,
|
old_pin: *const raw::c_char,
|
||||||
member_wallet: u32,
|
member_wallet: u32,
|
||||||
secret_code_type: u32,
|
secret_code_type: u32,
|
||||||
|
system_memory: i64,
|
||||||
) {
|
) {
|
||||||
exec_async(
|
exec_async(
|
||||||
port,
|
port,
|
||||||
|
@ -58,10 +60,24 @@ pub extern "C" fn change_dewif_secret_code(
|
||||||
let old_pin = char_ptr_to_str(old_pin)?;
|
let old_pin = char_ptr_to_str(old_pin)?;
|
||||||
let member_wallet = member_wallet != 0;
|
let member_wallet = member_wallet != 0;
|
||||||
let secret_code_type = SecretCodeType::from(secret_code_type);
|
let secret_code_type = SecretCodeType::from(secret_code_type);
|
||||||
Ok((currency, dewif, old_pin, member_wallet, secret_code_type))
|
Ok((
|
||||||
|
currency,
|
||||||
|
dewif,
|
||||||
|
old_pin,
|
||||||
|
member_wallet,
|
||||||
|
secret_code_type,
|
||||||
|
system_memory,
|
||||||
|
))
|
||||||
},
|
},
|
||||||
|(currency, dewif, old_pin, member_wallet, secret_code_type)| {
|
|(currency, dewif, old_pin, member_wallet, secret_code_type, system_memory)| {
|
||||||
dewif::change_secret_code(currency, dewif, old_pin, member_wallet, secret_code_type)
|
dewif::change_secret_code(
|
||||||
|
currency,
|
||||||
|
dewif,
|
||||||
|
old_pin,
|
||||||
|
member_wallet,
|
||||||
|
secret_code_type,
|
||||||
|
system_memory,
|
||||||
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -74,6 +90,7 @@ pub extern "C" fn gen_dewif(
|
||||||
mnemonic: *const raw::c_char,
|
mnemonic: *const raw::c_char,
|
||||||
member_wallet: u32,
|
member_wallet: u32,
|
||||||
secret_code_type: u32,
|
secret_code_type: u32,
|
||||||
|
system_memory: i64,
|
||||||
) {
|
) {
|
||||||
exec_async(
|
exec_async(
|
||||||
port,
|
port,
|
||||||
|
@ -89,15 +106,17 @@ pub extern "C" fn gen_dewif(
|
||||||
mnemonic,
|
mnemonic,
|
||||||
member_wallet,
|
member_wallet,
|
||||||
secret_code_type,
|
secret_code_type,
|
||||||
|
system_memory,
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
|(currency, language, mnemonic, member_wallet, secret_code_type)| {
|
|(currency, language, mnemonic, member_wallet, secret_code_type, system_memory)| {
|
||||||
dewif::gen_dewif(
|
dewif::gen_dewif(
|
||||||
currency,
|
currency,
|
||||||
language,
|
language,
|
||||||
mnemonic,
|
mnemonic,
|
||||||
member_wallet,
|
member_wallet,
|
||||||
secret_code_type,
|
secret_code_type,
|
||||||
|
system_memory,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -105,7 +124,7 @@ pub extern "C" fn gen_dewif(
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn gen_mnemonic(port: i64, language: u32) {
|
pub extern "C" fn gen_mnemonic(port: i64, language: u32) {
|
||||||
Isolate::new(port).post(DartRes::from(mnemonic::gen_mnemonic(language)));
|
exec_async(port, || u32_to_language(language), mnemonic::gen_mnemonic)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -127,6 +146,23 @@ pub extern "C" fn get_dewif_pubkey(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn get_legacy_pubkey(
|
||||||
|
port: i64,
|
||||||
|
salt: *const raw::c_char,
|
||||||
|
password: *const raw::c_char,
|
||||||
|
) {
|
||||||
|
exec_async(
|
||||||
|
port,
|
||||||
|
|| {
|
||||||
|
let salt = char_ptr_to_str(salt)?;
|
||||||
|
let password = char_ptr_to_str(password)?;
|
||||||
|
Ok((salt, password))
|
||||||
|
},
|
||||||
|
|(salt, password)| Ok::<_, DubpError>(legacy::get_pubkey(salt, password)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn mnemonic_to_pubkey(
|
pub extern "C" fn mnemonic_to_pubkey(
|
||||||
port: i64,
|
port: i64,
|
||||||
|
@ -136,6 +172,7 @@ pub extern "C" fn mnemonic_to_pubkey(
|
||||||
exec_async(
|
exec_async(
|
||||||
port,
|
port,
|
||||||
|| {
|
|| {
|
||||||
|
let language = u32_to_language(language)?;
|
||||||
let mnemonic_phrase = char_ptr_to_str(mnemonic_phrase)?;
|
let mnemonic_phrase = char_ptr_to_str(mnemonic_phrase)?;
|
||||||
Ok((language, mnemonic_phrase))
|
Ok((language, mnemonic_phrase))
|
||||||
},
|
},
|
||||||
|
@ -164,6 +201,25 @@ pub extern "C" fn sign(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn sign_legacy(
|
||||||
|
port: i64,
|
||||||
|
salt: *const raw::c_char,
|
||||||
|
password: *const raw::c_char,
|
||||||
|
msg: *const raw::c_char,
|
||||||
|
) {
|
||||||
|
exec_async(
|
||||||
|
port,
|
||||||
|
|| {
|
||||||
|
let salt = char_ptr_to_str(salt)?;
|
||||||
|
let password = char_ptr_to_str(password)?;
|
||||||
|
let msg = char_ptr_to_str(msg)?;
|
||||||
|
Ok((salt, password, msg))
|
||||||
|
},
|
||||||
|
|(salt, password, msg)| Ok::<_, DubpError>(legacy::sign(salt, password, msg)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn sign_several(
|
pub extern "C" fn sign_several(
|
||||||
port: i64,
|
port: i64,
|
||||||
|
|
|
@ -15,15 +15,15 @@
|
||||||
|
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
pub(super) fn gen_mnemonic(language: u32) -> Result<String, DubpError> {
|
pub(super) fn gen_mnemonic(language: Language) -> Result<String, DubpError> {
|
||||||
let mnemonic = Mnemonic::new(MnemonicType::Words12, u32_to_language(language)?)
|
let mnemonic =
|
||||||
.map_err(|_| DubpError::RandErr)?;
|
Mnemonic::new(MnemonicType::Words12, language).map_err(|_| DubpError::RandErr)?;
|
||||||
Ok(mnemonic.phrase().to_owned())
|
Ok(mnemonic.phrase().to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn mnemonic_to_pubkey(language: u32, mnemonic: &str) -> Result<String, DubpError> {
|
pub(super) fn mnemonic_to_pubkey(language: Language, mnemonic: &str) -> Result<String, DubpError> {
|
||||||
let mnemonic = Mnemonic::from_phrase(mnemonic, u32_to_language(language)?)
|
let mnemonic =
|
||||||
.map_err(|_| DubpError::WrongLanguage)?;
|
Mnemonic::from_phrase(mnemonic, language).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(keypair.public_key().to_base58())
|
Ok(keypair.public_key().to_base58())
|
||||||
|
|
|
@ -18,11 +18,14 @@ use crate::*;
|
||||||
pub(crate) fn gen_secret_code(
|
pub(crate) fn gen_secret_code(
|
||||||
member_wallet: bool,
|
member_wallet: bool,
|
||||||
secret_code_type: SecretCodeType,
|
secret_code_type: SecretCodeType,
|
||||||
|
log_n: u8,
|
||||||
) -> Result<String, DubpError> {
|
) -> Result<String, 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 {
|
||||||
|
gen_random_digits(7)
|
||||||
} else {
|
} else {
|
||||||
gen_random_digits(8)
|
gen_random_digits(8)
|
||||||
}
|
}
|
||||||
|
@ -30,6 +33,8 @@ pub(crate) fn gen_secret_code(
|
||||||
SecretCodeType::Letters => {
|
SecretCodeType::Letters => {
|
||||||
if member_wallet {
|
if member_wallet {
|
||||||
gen_random_letters(10)
|
gen_random_letters(10)
|
||||||
|
} else if log_n >= 15 {
|
||||||
|
gen_random_letters(5)
|
||||||
} else {
|
} else {
|
||||||
gen_random_letters(6)
|
gen_random_letters(6)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
||||||
import 'dart:ffi';
|
import 'dart:ffi';
|
||||||
import 'package:ffi/ffi.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
import 'package:isolate/ports.dart';
|
import 'package:isolate/ports.dart';
|
||||||
|
import "package:system_info/system_info.dart";
|
||||||
|
|
||||||
import 'ffi.dart' as native;
|
import 'ffi.dart' as native;
|
||||||
|
|
||||||
|
@ -45,7 +46,7 @@ class DubpRust {
|
||||||
/// Must be called only once at the start of your application.
|
/// Must be called only once at the start of your application.
|
||||||
static void setup() {
|
static void setup() {
|
||||||
native.store_dart_post_cobject(NativeApi.postCObject);
|
native.store_dart_post_cobject(NativeApi.postCObject);
|
||||||
print("Dubp Setup Done");
|
print("DUBP_RS Setup Done");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate a random mnemonic
|
/// Generate a random mnemonic
|
||||||
|
@ -67,6 +68,8 @@ class DubpRust {
|
||||||
String oldPin,
|
String oldPin,
|
||||||
SecretCodeType secretCodeType = SecretCodeType.letters,
|
SecretCodeType secretCodeType = SecretCodeType.letters,
|
||||||
}) async {
|
}) async {
|
||||||
|
int ram = SysInfo.getTotalPhysicalMemory();
|
||||||
|
|
||||||
final completer = Completer<List<String>>();
|
final completer = Completer<List<String>>();
|
||||||
final sendPort = singleCompletePort<List<String>, List>(completer,
|
final sendPort = singleCompletePort<List<String>, List>(completer,
|
||||||
callback: _handleErrList);
|
callback: _handleErrList);
|
||||||
|
@ -77,6 +80,7 @@ class DubpRust {
|
||||||
Utf8.toUtf8(oldPin),
|
Utf8.toUtf8(oldPin),
|
||||||
0,
|
0,
|
||||||
secretCodeType.index,
|
secretCodeType.index,
|
||||||
|
ram,
|
||||||
);
|
);
|
||||||
List<String> newWallet = await completer.future;
|
List<String> newWallet = await completer.future;
|
||||||
|
|
||||||
|
@ -96,6 +100,9 @@ class DubpRust {
|
||||||
String mnemonic,
|
String mnemonic,
|
||||||
SecretCodeType secretCodeType = SecretCodeType.letters,
|
SecretCodeType secretCodeType = SecretCodeType.letters,
|
||||||
}) async {
|
}) async {
|
||||||
|
int ram = SysInfo.getTotalPhysicalMemory();
|
||||||
|
print('ram=$ram');
|
||||||
|
|
||||||
final completer = Completer<List<String>>();
|
final completer = Completer<List<String>>();
|
||||||
final sendPort = singleCompletePort<List<String>, List>(completer,
|
final sendPort = singleCompletePort<List<String>, List>(completer,
|
||||||
callback: _handleErrList);
|
callback: _handleErrList);
|
||||||
|
@ -106,13 +113,27 @@ class DubpRust {
|
||||||
Utf8.toUtf8(mnemonic),
|
Utf8.toUtf8(mnemonic),
|
||||||
0,
|
0,
|
||||||
secretCodeType.index,
|
secretCodeType.index,
|
||||||
|
ram,
|
||||||
);
|
);
|
||||||
List<String> newWallet = await completer.future;
|
List<String> newWallet = await completer.future;
|
||||||
|
|
||||||
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
|
return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get pulblic key (in base 58) of `dewif` keypair.
|
/// Get public key (in base 58) of legacy wallet (password + salt)
|
||||||
|
static Future<String> getLegacyPublicKey({String password, String salt}) {
|
||||||
|
final completer = Completer<String>();
|
||||||
|
final sendPort =
|
||||||
|
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||||
|
native.get_legacy_pubkey(
|
||||||
|
sendPort.nativePort,
|
||||||
|
Utf8.toUtf8(password),
|
||||||
|
Utf8.toUtf8(salt),
|
||||||
|
);
|
||||||
|
return completer.future;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get public key (in base 58) of `dewif` keypair.
|
||||||
static Future<String> getDewifPublicKey(
|
static Future<String> getDewifPublicKey(
|
||||||
{String currency = "g1", String dewif, String pin}) async {
|
{String currency = "g1", String dewif, String pin}) async {
|
||||||
final completer = Completer<String>();
|
final completer = Completer<String>();
|
||||||
|
@ -145,6 +166,21 @@ class DubpRust {
|
||||||
return completer.future;
|
return completer.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sign the message `message` with legacy wallet (password + salt)
|
||||||
|
static Future<String> signLegacy(
|
||||||
|
{String password, String salt, String message}) {
|
||||||
|
final completer = Completer<String>();
|
||||||
|
final sendPort =
|
||||||
|
singleCompletePort<String, String>(completer, callback: _handleErr);
|
||||||
|
native.sign_legacy(
|
||||||
|
sendPort.nativePort,
|
||||||
|
Utf8.toUtf8(password),
|
||||||
|
Utf8.toUtf8(salt),
|
||||||
|
Utf8.toUtf8(message),
|
||||||
|
);
|
||||||
|
return completer.future;
|
||||||
|
}
|
||||||
|
|
||||||
/// Sign several messages `messages` with `dewif` keypair encryted in DEWIF
|
/// Sign several messages `messages` with `dewif` keypair encryted in DEWIF
|
||||||
/// format.
|
/// format.
|
||||||
///
|
///
|
||||||
|
|
|
@ -64,6 +64,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.3"
|
version: "0.1.3"
|
||||||
|
file_utils:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: file_utils
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.4"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -74,6 +81,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
globbing:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: globbing
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.1"
|
||||||
isolate:
|
isolate:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -135,6 +149,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0-nullsafety.1"
|
version: "1.1.0-nullsafety.1"
|
||||||
|
system_info:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: system_info
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.3"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -11,6 +11,7 @@ dependencies:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
ffi: ^0.1.3
|
ffi: ^0.1.3
|
||||||
isolate: ^2.0.3
|
isolate: ^2.0.3
|
||||||
|
system_info: ^0.1.3
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
effective_dart: ^1.0.0
|
effective_dart: ^1.0.0
|
||||||
|
|
14
pubspec.lock
14
pubspec.lock
|
@ -134,6 +134,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.2.1"
|
version: "5.2.1"
|
||||||
|
file_utils:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: file_utils
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.4"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -163,6 +170,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
globbing:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: globbing
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.1"
|
||||||
gql:
|
gql:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
Loading…
Reference in New Issue