$update method

  1. @override
void $update([
  1. List<int>? block,
  2. int offset = 0,
  3. bool last = false
])
override

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;
}