polydecompress function
Decompresses a polynomial from a compressed byte representation.
This function takes a compressed byte array r and reconstructs the polynomial
a by decompressing each sequence of bytes into four coefficients. The coefficients
are extracted from the bit-packed format in r, where each group of five bytes
represents four 10-bit coefficients. The decompressed coefficients are converted
to the original polynomial domain by scaling them with KYBER_Q and normalizing.
- Parameters:
- r: A byte array containing the compressed representation of the polynomial.
- Returns: A
Polyobject with coefficients decompressed from the input byte array.
Implementation
Poly polydecompress(Uint8List r) {
Poly a = Poly();
int pos = 0;
for (int i = 0; i < KYBER_N; i += 4) {
int t0 =
r[pos] | (r[pos + 1] << 8) | (r[pos + 2] << 16) | (r[pos + 3] << 24);
int t1 = r[pos + 4];
pos += 5;
int d0 = t0 & 0x3FF;
int d1 = (t0 >> 10) & 0x3FF;
int d2 = (t0 >> 20) & 0x3FF;
int d3 = ((t0 >> 30) & 0x03F) | ((t1 & 0xFF) << 6);
a.coeffs[i] = (d0 * KYBER_Q + (1 << 9)) >> 10;
a.coeffs[i + 1] = (d1 * KYBER_Q + (1 << 9)) >> 10;
a.coeffs[i + 2] = (d2 * KYBER_Q + (1 << 9)) >> 10;
a.coeffs[i + 3] = (d3 * KYBER_Q + (1 << 9)) >> 10;
}
return a;
}