INNER CODE UNIT · Rust
bitunpack_ring_element_d
orion-rs/orion · src/hazardous/dsa/ml_dsa/internal/mod.rs:174
fn bitunpack_ring_element_d(v: &[u8], w: &mut RingElement) {
debug_assert_eq!(MlDsa44::D, MlDsa65::D);
debug_assert_eq!(MlDsa65::D, MlDsa87::D);
debug_assert_eq!(v.len(), Self::D_BITPACK_SIZE);
let fe_2power12 = FieldElement::new(1 << 12);
for (fe, blk) in w.coefficients.chunks_exact_mut(8).zip(v.chunks_exact(13)) {
let b = |k: usize| blk[k] as u32;
let t = [
b(0) | (b(1) << 8),
(b(1) >> 5) | (b(2) << 3) | (b(3) << 11),
(b(3) >> 2) | (b(4) << 6),
(b(4) >> 7) | (b(5) << 1) | (b(6) << 9),
(b(6) >> 4) | (b(7) << 4) | (b(8) << 12),
(b(8) >> 1) | (b(9) << 7),
(b(9) >> 6) | (b(10) << 2) | (b(11) << 10),
(b(11) >> 3) | (b(12) << 5),
];