$update method
Internal method to update the message-digest with a single block.
The method starts reading the block from offset index
Implementation
@override
void $update([List<int>? block, int offset = 0, bool last = false]) {
int d0, d1, d2, d3, d4;
// a += n
_h0 += buffer[0] |
(buffer[1] << 8) |
(buffer[2] << 16) |
((buffer[3] & 0x03) << 24);
_h1 += (buffer[3] >>> 2) |
(buffer[4] << 6) |
(buffer[5] << 14) |
((buffer[6] & 0xF) << 22);
_h2 += (buffer[6] >>> 4) |
(buffer[7] << 4) |
(buffer[8] << 12) |
((buffer[9] & 0x3F) << 20);
_h3 += (buffer[9] >>> 6) |
(buffer[10] << 2) |
(buffer[11] << 10) |
(buffer[12] << 18);
_h4 += buffer[13] |
(buffer[14] << 8) |
(buffer[15] << 16) |
((buffer[16] & 0x03) << 24);
// a *= r
d0 = _h0 * _r0 + _h1 * _g4 + _h2 * _g3 + _h3 * _g2 + _h4 * _g1;
d1 = _h0 * _r1 + _h1 * _r0 + _h2 * _g4 + _h3 * _g3 + _h4 * _g2;
d2 = _h0 * _r2 + _h1 * _r1 + _h2 * _r0 + _h3 * _g4 + _h4 * _g3;
d3 = _h0 * _r3 + _h1 * _r2 + _h2 * _r1 + _h3 * _r0 + _h4 * _g4;
d4 = _h0 * _r4 + _h1 * _r3 + _h2 * _r2 + _h3 * _r1 + _h4 * _r0;
// a %= 2^130 - 5;
d1 += d0 >>> 26;
d2 += d1 >>> 26;
d3 += d2 >>> 26;
d4 += d3 >>> 26;
_h0 = d0 & _mask26;
_h1 = d1 & _mask26;
_h2 = d2 & _mask26;
_h3 = d3 & _mask26;
_h4 = d4 & _mask26;
_h0 += 5 * (d4 >>> 26);
_h1 += _h0 >>> 26;
_h0 &= _mask26;
}