polymod function

int polymod(
  1. List<int> data
)

Implementation

int polymod(List<int> data) {
  const GENERATOR1 = [0x98, 0x79, 0xf3, 0xae, 0x1e];
  const GENERATOR2 = [
    0xf2bc8e61,
    0xb76d99e2,
    0x3e5fb3c4,
    0x2eabe2a8,
    0x4f43e470
  ];
  int c0 = 0;
  int c1 = 1;
  int C = 0;

  for (int j = 0; j < data.length; j++) {
    C = c0 >> 3;
    c0 &= 0x07;
    c0 <<= 5;
    c0 |= c1 >> 27;
    c1 &= 0x07ffffff;
    c1 <<= 5;
    c1 ^= data[j];

    for (int i = 0; i < GENERATOR1.length; ++i) {
      if ((C & (1 << i)) != 0) {
        c0 ^= GENERATOR1[i];
        c1 ^= GENERATOR2[i];
      }
    }
  }

  c1 ^= 1;

  if (c1 < 0) {
    c1 ^= 1 << 31;
    c1 += (1 << 30) * 2;
  }

  return c0 * (1 << 30) * 4 + c1;
}