Blake2bHash constructor
For internal use only.
Implementation
Blake2bHash(
int digestSize, {
this.key,
List<int>? salt,
List<int>? aad,
}) : hashLength = digestSize,
derivedKeyLength = digestSize,
super(1024 >>> 3) {
if (digestSize < 1 || digestSize > 64) {
throw ArgumentError('The digest size must be between 1 and 64');
}
// Parameter block from the seed
_s0 = _seed[0] ^ 0x01010000 ^ hashLength;
_s1 = _seed[1];
_s2 = _seed[2];
_s3 = _seed[3];
_s4 = _seed[4];
_s5 = _seed[5];
_s6 = _seed[6];
_s7 = _seed[7];
if (key != null && key!.isNotEmpty) {
if (key!.length > 64) {
throw ArgumentError('The key should not be greater than 64 bytes');
}
// Add key length to parameter
_s0 ^= key!.length << 8;
}
if (salt != null && salt.isNotEmpty) {
if (salt.length != 16) {
throw ArgumentError('The valid length of salt is 16 bytes');
}
for (int i = 0, p = 0; i < 8; i++, p += 8) {
_s4 ^= (salt[i] & 0xFF) << p;
}
for (int i = 8, p = 0; i < 16; i++, p += 8) {
_s5 ^= (salt[i] & 0xFF) << p;
}
}
if (aad != null && aad.isNotEmpty) {
if (aad.length != 16) {
throw ArgumentError('The valid length of personalization is 16 bytes');
}
for (int i = 0, p = 0; i < 8; i++, p += 8) {
_s6 ^= (aad[i] & 0xFF) << p;
}
for (int i = 8, p = 0; i < 16; i++, p += 8) {
_s7 ^= (aad[i] & 0xFF) << p;
}
}
reset();
}