cbd function
Samples a polynomial from a uniform distribution using the Centered Binomial Distribution (CBD) as described in the Kyber specification.
The CBD samples a uniform distribution of polynomials with
coefficients in the range -η, η
by sampling a uniform
distribution of two bytes, interpreting them as a 16-bit
unsigned integer, and then extracting the bits of the
integer to obtain the coefficients of the polynomial.
The coefficients are then divided by 2 to obtain the
final coefficients in the range -η/2, η/2
.
Implementation
void cbd(Poly r, Uint8List buf) {
// η=2 for Kyber512
for (int i = 0; i < KYBER_N ~/ 8; i++) {
int t = buf[2 * i] | (buf[2 * i + 1] << 8);
for (int j = 0; j < 8; j++) {
int aj = (t >> j) & 1;
int bj = (t >> (j + 8)) & 1;
r.coeffs[8 * i + j] = aj - bj;
}
}
}