#include "rivide/internal/kem_sampling.h"
#include "rivide/crypto/sha3.h"
#include "rivide/internal/kem_cbd.h"
#include "rivide/utils/mem.h"
void poly_uniform(poly_t *p, const uint8_t seed[34]) {
rivide_keccak_state_t state;
uint8_t buf[168];
unsigned int ctr = 0;
unsigned int pos = 0;
unsigned int buflen;
rivide_shake128_init(&state);
rivide_shake_absorb(&state, seed, 34);
rivide_shake_squeeze(&state, buf, sizeof(buf));
buflen = sizeof(buf);
while (ctr < KEM_N) {
if (pos + 3 > buflen) {
rivide_shake_squeeze(&state, buf, sizeof(buf));
buflen = sizeof(buf);
pos = 0;
}
{
uint16_t d1 = (uint16_t)(((uint16_t)buf[pos] | ((uint16_t)buf[pos + 1] << 8)) & 0x0FFF);
uint16_t d2 =
(uint16_t)((((uint16_t)buf[pos + 1] >> 4) | ((uint16_t)buf[pos + 2] << 4)) &
0x0FFF);
pos += 3;
if (d1 < KEM_Q && ctr < KEM_N) {
p->coeffs[ctr++] = (int16_t)d1;
}
if (d2 < KEM_Q && ctr < KEM_N) {
p->coeffs[ctr++] = (int16_t)d2;
}
}
}
}
void poly_noise(poly_t *p, const uint8_t seed[32], uint8_t nonce, int eta) {
uint8_t buf[3 * KEM_N];
uint8_t extseed[33];
size_t buflen = (size_t)(64 * eta);
unsigned int i;
for (i = 0; i < 32; i++) {
extseed[i] = seed[i];
}
extseed[32] = nonce;
rivide_shake256(buf, buflen, extseed, 33);
poly_cbd(p, buf, eta);
rivide_cleanse(buf, sizeof(buf));
}