INNER CODE UNIT · Rust
subat
orion-rs/orion · src/hazardous/dsa/ml_dsa/internal/mod.rs:471
let subat = |k: usize| fe_eta - &w.coefficients[8 * i + k];
out[3 * i] = (subat(0).0 | (subat(1).0 << 3) | (subat(2).0 << 6)) as u8;
out[3 * i + 1] =
((subat(2).0 >> 2) | (subat(3).0 << 1) | (subat(4).0 << 4) | (subat(5).0 << 7))
as u8;
out[3 * i + 2] = ((subat(5).0 >> 1) | (subat(6).0 << 2) | (subat(7).0 << 5)) as u8;
}
}
fn bitunpack_ring_element_eta(v: &[u8], w: &mut RingElement) {
debug_assert_eq!(v.len(), Self::ETA_BITPACK_SIZE);
let fe_eta = FieldElement::new(Self::ETA as u32);
for (fe, blk) in w.coefficients.chunks_exact_mut(8).zip(v.chunks_exact(3)) {
let b = |k: usize| blk[k] as u32;
fe[0] = fe_eta - &FieldElement::new(b(0) & 7);
fe[1] = fe_eta - &FieldElement::new((b(0) >> 3) & 7);
fe[2] = fe_eta - &FieldElement::new((b(0) >> 6) | ((b(1) << 2) & 4));
fe[3] = fe_eta - &FieldElement::new((b(1) >> 1) & 7);