encryptPhrase function
Implementation
Future<String> encryptPhrase(
String phrase,
String password, [
Map<String, dynamic>? options,
]) async {
Uint8List uuid = Uint8List(16);
Uuid uuidParser = const Uuid()..v4buffer(uuid);
String salt = randomAsHex(64);
List<int> iv = randomAsU8a(16);
String kdf = 'scrypt';
int level = 8192;
int n = kdf == 'pbkdf2' ? 262144 : level;
if (options == null) {
kdf = 'scrypt';
level = 8192;
n = kdf == 'pbkdf2' ? 262144 : level;
} else {
kdf = options['kdf'] is String ? options['kdf'] : 'scrypt';
level = options['level'] is int ? options['level'] : 8192;
n = kdf == 'pbkdf2' ? 262144 : level;
}
Map<String, dynamic> kdfParams = {
'salt': salt,
'n': n,
'r': 8,
'p': 1,
'dklen': 32
};
List<int> encodedPassword = utf8.encode(password);
_KeyDerivator derivator = getDerivedKey(kdf, kdfParams);
List<int> derivedKey = derivator.deriveKey(encodedPassword);
List<int> ciphertextBytes = _encryptPhrase(derivator,
Uint8List.fromList(encodedPassword), Uint8List.fromList(iv), phrase);
List<int> macBuffer = derivedKey.sublist(16, 32) +
ciphertextBytes +
iv +
ALGO_IDENTIFIER.codeUnits;
String mac = (SHA256()
.update(Uint8List.fromList(derivedKey))
.update(macBuffer)
.digest()
.toHex());
Map<String, dynamic> map = {
'crypto': {
'cipher': 'aes-128-ctr',
'cipherparams': {'iv': Uint8List.fromList(iv).toHex()},
'ciphertext': Uint8List.fromList(ciphertextBytes).toHex(),
'kdf': kdf,
'kdfparams': kdfParams,
'mac': mac,
},
'id': uuidParser.v4buffer(uuid),
'version': 3,
};
String result = json.encode(map);
return result;
}