Poly1305Sink constructor

Poly1305Sink(
  1. Uint8List key
)

Creates a new instance to process 16-bytes blocks with 17-bytes buffer

Parameters:

  • key : The key-pair (r, s) - 16 or 32-bytes.

Implementation

Poly1305Sink(Uint8List key) : super(16, bufferLength: 17) {
  if (key.length != 16 && key.length != 32) {
    throw ArgumentError('The key length must be either 16 or 32 bytes');
  }

  // r = key[15..0]
  _r0 = key[0] | (key[1] << 8) | (key[2] << 16) | (key[3] << 24);
  _r1 = (key[3] >>> 2) | (key[4] << 6) | (key[5] << 14) | (key[6] << 22);
  _r2 = (key[6] >>> 4) | (key[7] << 4) | (key[8] << 12) | (key[9] << 20);
  _r3 = (key[9] >>> 6) | (key[10] << 2) | (key[11] << 10) | (key[12] << 18);
  _r4 = key[13] | (key[14] << 8) | (key[15] << 16);

  // clamp(r): r &= 0x0ffffffc0ffffffc0ffffffc0fffffff
  _r0 &= 0x03ffffff;
  _r1 &= 0x03ffff03;
  _r2 &= 0x03ffc0ff;
  _r3 &= 0x03f03fff;
  _r4 &= 0x000fffff;

  _g1 = 5 * _r1;
  _g2 = 5 * _r2;
  _g3 = 5 * _r3;
  _g4 = 5 * _r4;

  if (key.length == 32) {
    // s = key[31..16]
    _s0 = key[16] | (key[17] << 8) | (key[18] << 16) | (key[19] << 24);
    _s1 = key[20] | (key[21] << 8) | (key[22] << 16) | (key[23] << 24);
    _s2 = key[24] | (key[25] << 8) | (key[26] << 16) | (key[27] << 24);
    _s3 = key[28] | (key[29] << 8) | (key[30] << 16) | (key[31] << 24);
  }
}