mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-19 05:58:50 +02:00
Changed random seed generation for bitcoin.
This commit is contained in:
@@ -4,23 +4,11 @@ import 'dart:typed_data';
|
||||
import 'package:crypto/crypto.dart';
|
||||
import 'package:unorm_dart/unorm_dart.dart' as unorm;
|
||||
import 'package:cryptography/cryptography.dart' as cryptography;
|
||||
import 'package:cake_wallet/core/sec_random_native.dart';
|
||||
|
||||
const segwit = '100';
|
||||
final wordlist = englishWordlist;
|
||||
|
||||
Uint8List randomBytes(int length, {bool secure = false}) {
|
||||
assert(length > 0);
|
||||
|
||||
final random = secure ? Random.secure() : Random();
|
||||
final ret = Uint8List(length);
|
||||
|
||||
for (var i = 0; i < length; i++) {
|
||||
ret[i] = random.nextInt(256);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
double logBase(num x, num base) => log(x) / log(base);
|
||||
|
||||
String mnemonicEncode(int i) {
|
||||
@@ -102,14 +90,15 @@ List<bool> prefixMatches(String source, List<String> prefixes) {
|
||||
return prefixes.map((prefix) => hx.startsWith(prefix.toLowerCase())).toList();
|
||||
}
|
||||
|
||||
String generateMnemonic({int strength = 132, String prefix = segwit}) {
|
||||
Future<String> generateMnemonic(
|
||||
{int strength = 264, String prefix = segwit}) async {
|
||||
final wordBitlen = logBase(wordlist.length, 2).ceil();
|
||||
final wordCount = strength / wordBitlen;
|
||||
final byteCount = ((wordCount * wordBitlen).ceil() / 8).ceil();
|
||||
var result = '';
|
||||
|
||||
do {
|
||||
final bytes = randomBytes(byteCount);
|
||||
final bytes = await secRandom(byteCount);
|
||||
maskBytes(bytes, strength);
|
||||
result = encode(bytes);
|
||||
} while (!prefixMatches(result, [prefix]).first);
|
||||
@@ -134,7 +123,7 @@ bool matchesAnyPrefix(String mnemonic) =>
|
||||
bool validateMnemonic(String mnemonic, {String prefix = segwit}) {
|
||||
try {
|
||||
return matchesAnyPrefix(mnemonic);
|
||||
} catch(e) {
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class BitcoinMnemonicIsIncorrectException implements Exception {
|
||||
@override
|
||||
String toString() =>
|
||||
'Bitcoin mnemonic has incorrect format. Mnemonic should contain 12 words separated by space.';
|
||||
'Bitcoin mnemonic has incorrect format. Mnemonic should contain 24 words separated by space.';
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ class BitcoinWalletService extends WalletService<
|
||||
type: WalletType.bitcoin, name: credentials.name);
|
||||
final wallet = BitcoinWalletBase.build(
|
||||
dirPath: dirPath,
|
||||
mnemonic: generateMnemonic(),
|
||||
mnemonic: await generateMnemonic(),
|
||||
password: credentials.password,
|
||||
name: credentials.name,
|
||||
walletInfo: credentials.walletInfo);
|
||||
@@ -47,7 +47,7 @@ class BitcoinWalletService extends WalletService<
|
||||
final walletPath = '$walletDirPath/$name';
|
||||
final walletJSONRaw = await read(path: walletPath, password: password);
|
||||
final walletInfo = walletInfoSource.values.firstWhere(
|
||||
(info) => info.id == WalletBase.idFor(name, WalletType.bitcoin),
|
||||
(info) => info.id == WalletBase.idFor(name, WalletType.bitcoin),
|
||||
orElse: () => null);
|
||||
final wallet = BitcoinWalletBase.fromJSON(
|
||||
password: password,
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
const utils = const MethodChannel('com.cake_wallet/native_utils');
|
||||
|
||||
Future<Uint8List> secRandom(int count) async {
|
||||
try {
|
||||
return await utils.invokeMethod<Uint8List>('sec_random', {'count': count});
|
||||
} on PlatformException catch (_) {
|
||||
return Uint8List.fromList([]);
|
||||
}
|
||||
}
|
||||
@@ -228,7 +228,7 @@ class MoneroWalletService extends WalletService<
|
||||
final name = f.path.split('/').last;
|
||||
final newPath = newWalletDirPath + '/$name';
|
||||
final newFile = File(newPath);
|
||||
print(file.path);
|
||||
|
||||
if (!newFile.existsSync()) {
|
||||
newFile.createSync();
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ class PreSeedPage extends BasePage {
|
||||
imageDark = Image.asset('assets/images/pre_seed_dark.png'),
|
||||
wordsCount = type == WalletType.monero
|
||||
? 25
|
||||
: 12; // FIXME: Stupid fast implementation
|
||||
: 24; // FIXME: Stupid fast implementation
|
||||
|
||||
final Image imageDark;
|
||||
final Image imageLight;
|
||||
@@ -49,7 +49,9 @@ class PreSeedPage extends BasePage {
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 70, left: 16, right: 16),
|
||||
child: Text(
|
||||
S.of(context).pre_seed_description(wordsCount.toString()),
|
||||
S
|
||||
.of(context)
|
||||
.pre_seed_description(wordsCount.toString()),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
|
||||
Reference in New Issue
Block a user