INNER CODE UNIT · Rust
bitpack_ring_element_d
orion-rs/orion · src/hazardous/dsa/ml_dsa/internal/mod.rs:146
fn bitpack_ring_element_d(w: &RingElement, out: &mut [u8]) {
debug_assert_eq!(MlDsa44::D, MlDsa65::D);
debug_assert_eq!(MlDsa65::D, MlDsa87::D);
debug_assert_eq!(out.len(), Self::D_BITPACK_SIZE);
let fe_2power12 = FieldElement::new(1 << 12);
for i in 0..256 / 8 {
let mut t = [0u32; 8];
for (j, slot) in t.iter_mut().enumerate() {
*slot = (fe_2power12 - &w.coefficients[8 * i + j]).0;
}
out[13 * i] = t[0] as u8;
out[13 * i + 1] = ((t[0] >> 8) | (t[1] << 5)) as u8;
out[13 * i + 2] = (t[1] >> 3) as u8;
out[13 * i + 3] = ((t[1] >> 11) | (t[2] << 2)) as u8;
out[13 * i + 4] = ((t[2] >> 6) | (t[3] << 7)) as u8;
out[13 * i + 5] = (t[3] >> 1) as u8;
out[13 * i + 6] = ((t[3] >> 9) | (t[4] << 4)) as u8;