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;
}
}
}