decryptPhrase function
Implementation
Future<String> decryptPhrase(
Map<String, dynamic> keyStore,
String passphrase,
) async {
Uint8List ciphertext = (keyStore['crypto']['ciphertext'] as String).toU8a();
String kdf = keyStore['crypto']['kdf'];
Map<String, dynamic> kdfparams = keyStore['crypto']['kdfparams'] is String
? json.decode(keyStore['crypto']['kdfparams'])
: keyStore['crypto']['kdfparams'];
var cipherparams = keyStore['crypto']["cipherparams"];
Uint8List iv = (cipherparams["iv"] as String).toU8a();
List<int> encodedPassword = utf8.encode(passphrase);
_KeyDerivator derivator = getDerivedKey(kdf, kdfparams);
List<int> derivedKey = derivator.deriveKey(encodedPassword);
List<int> macBuffer =
derivedKey.sublist(16, 32) + ciphertext + iv + ALGO_IDENTIFIER.codeUnits;
String mac = (SHA256()
.update(Uint8List.fromList(derivedKey))
.update(macBuffer)
.digest()
.toHex());
String macString = keyStore['crypto']['mac'];
Function eq = const ListEquality().equals;
if (!eq(mac.toUpperCase().codeUnits, macString.toUpperCase().codeUnits)) {
throw 'Decryption Failed';
}
var aesKey = derivedKey.sublist(0, 16);
var encryptedPhrase = (keyStore["crypto"]["ciphertext"] as String).toU8a();
var aes = _initCipher(false, aesKey, iv);
var privateKeyByte = aes.process(encryptedPhrase);
return privateKeyByte.u8aToString();
}