mnemonicToEntropy function
String
mnemonicToEntropy(
- dynamic mnemonic, {
- String language = _defaultLanguage,
})
Implementation
String mnemonicToEntropy (mnemonic,{String language=_defaultLanguage}) {
var words = mnemonic.split(' ');
if (words.length % 3 != 0) {
throw new ArgumentError(_INVALID_MNEMONIC);
}
final wordlist = WORDLIST[language];
// convert word indices to 11 bit binary strings
final bits = words.map((word) {
final index = wordlist!.indexOf(word);
if (index == -1) {
throw new ArgumentError(_INVALID_MNEMONIC);
}
return index.toRadixString(2).padLeft(11, '0');
}).join('');
// split the binary string into ENT/CS
final dividerIndex = (bits.length / 33).floor() * 32;
final entropyBits = bits.substring(0, dividerIndex);
final checksumBits = bits.substring(dividerIndex);
// calculate the checksum and compare
final regex = RegExp(r".{1,8}");
final entropyBytes = Uint8List.fromList(regex
.allMatches(entropyBits)
.map((match) => _binaryToByte(match.group(0)!))
.toList(growable: false));
if (entropyBytes.length < 4) {
throw StateError(_INVALID_ENTROPY);
}
if (entropyBytes.length > 32) {
throw StateError(_INVALID_ENTROPY);
}
if (entropyBytes.length % 4 != 0) {
throw StateError(_INVALID_ENTROPY);
}
final newChecksum = _deriveChecksumBits(entropyBytes);
if (newChecksum != checksumBits) {
throw StateError(_INVALID_CHECKSUM);
}
return entropyBytes.map((byte) {
return byte.toRadixString(16).padLeft(2, '0');
}).join('');
}