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);

View source record →

📰 Research Paper
Loading…
⏳ Fetching content…