in src/decode/decode.c [180:217]
_INLINE_ void find_err2(OUT e_t *e,
IN e_t * pos_e,
IN const syndrome_t * syndrome,
IN const compressed_idx_d_ar_t wlist,
IN const uint8_t threshold,
IN const decode_ctx *ctx)
{
DEFER_CLEANUP(syndrome_t rotated_syndrome = {0}, syndrome_cleanup);
DEFER_CLEANUP(upc_t upc, upc_cleanup);
for(uint32_t i = 0; i < N0; i++) {
// UPC must start from zero at every iteration
bike_memset(&upc, 0, sizeof(upc));
// 1) Right-rotate the syndrome, for every index of a set bit in the secret
// key. Then slice-add it to the UPC array.
for(size_t j = 0; j < D; j++) {
ctx->rotate_right(&rotated_syndrome, syndrome, wlist[i].val[j]);
ctx->bit_sliced_adder(&upc, &rotated_syndrome, LOG2_MSB(j + 1));
}
// 2) Subtract the threshold from the UPC counters
ctx->bit_slice_full_subtract(&upc, threshold);
// 3) Update the errors vector.
// The last slice of the UPC array holds the MSB of the accumulated values
// minus the threshold. Every zero bit indicates a potential error bit.
const r_t *last_slice = &(upc.slice[SLICES - 1].u.r.val);
for(size_t j = 0; j < R_BYTES; j++) {
const uint8_t sum_msb = (~last_slice->raw[j]);
e->val[i].raw[j] ^= (pos_e->val[i].raw[j] & sum_msb);
}
// Ensure that the padding bits (upper bits of the last byte) are zero, so
// they are not included in the multiplication, and in the hash function.
e->val[i].raw[R_BYTES - 1] &= LAST_R_BYTE_MASK;
}
}