$finalize method

  1. @override
Uint8List $finalize()
override

Finalizes the message digest with the remaining message block, and returns the output as byte array.

Implementation

@override
Uint8List $finalize() {
  if (pos > 0) {
    buffer[pos] = 1;
    for (pos++; pos <= 16; pos++) {
      buffer[pos] = 0;
    }
    $update();
  }

  int d0, d1, d2, d3, d4;

  // fully carry
  _h1 += _h0 >>> 26;
  _h2 += _h1 >>> 26;
  _h3 += _h2 >>> 26;
  _h4 += _h3 >>> 26;
  _h0 &= _mask26;
  _h1 &= _mask26;
  _h2 &= _mask26;
  _h3 &= _mask26;

  // compute d = h - p
  d0 = _h0 + 5;
  d1 = _h1 + (d0 >>> 26);
  d2 = _h2 + (d1 >>> 26);
  d3 = _h3 + (d2 >>> 26);
  d4 = _h4 + (d3 >>> 26) - (1 << 26);
  d4 &= _mask32;

  // if h < p, take h; else, take d
  if ((d4 >>> 31) != 1) {
    _h0 = d0 & _mask26;
    _h1 = d1 & _mask26;
    _h2 = d2 & _mask26;
    _h3 = d3 & _mask26;
    _h4 = d4 & _mask26;
  }

  // modulus 2^128
  _h0 = ((_h0) | (_h1 << 26)) & _mask32;
  _h1 = ((_h1 >>> 6) | (_h2 << 20)) & _mask32;
  _h2 = ((_h2 >>> 12) | (_h3 << 14)) & _mask32;
  _h3 = ((_h3 >>> 18) | (_h4 << 8)) & _mask32;

  // h += s
  _h0 += _s0;
  _h1 += _s1 + (_h0 >>> 32);
  _h2 += _s2 + (_h1 >>> 32);
  _h3 += _s3 + (_h2 >>> 32);

  var result = Uint32List.fromList([
    _h0,
    _h1,
    _h2,
    _h3,
  ]);
  return Uint8List.view(result.buffer);
}