in lib/src/hash_sink.dart [133:173]
void _finalizeData() {
// Pad out the data with 0x80, eight or sixteen 0s, and as many more 0s
// as we need to land cleanly on a chunk boundary.
_pendingData.add(0x80);
final contentsLength = _lengthInBytes + 1 /* 0x80 */ + _signatureBytes;
final finalizedLength =
_roundUp(contentsLength, _currentChunk.lengthInBytes);
for (var i = 0; i < finalizedLength - contentsLength; i++) {
_pendingData.add(0);
}
if (_lengthInBytes > _maxMessageLengthInBytes) {
throw UnsupportedError(
'Hashing is unsupported for messages with more than 2^53 bits.');
}
var lengthInBits = _lengthInBytes * bitsPerByte;
// Add the full length of the input data as a 64-bit value at the end of the
// hash. Note: we're only writing out 64 bits, so skip ahead 8 if the
// signature is 128-bit.
final offset = _pendingData.length + (_signatureBytes - 8);
_pendingData.addAll(Uint8List(_signatureBytes));
var byteData = _pendingData.buffer.asByteData();
// We're essentially doing byteData.setUint64(offset, lengthInBits, _endian)
// here, but that method isn't supported on dart2js so we implement it
// manually instead.
var highBits = lengthInBits >> 32;
var lowBits = lengthInBits & mask32;
if (_endian == Endian.big) {
byteData.setUint32(offset, highBits, _endian);
byteData.setUint32(offset + bytesPerWord, lowBits, _endian);
} else {
byteData.setUint32(offset, lowBits, _endian);
byteData.setUint32(offset + bytesPerWord, highBits, _endian);
}
}