libcrux-ml-dsa 0.0.8

Libcrux ML-DSA implementation
Documentation
use crate::{
    constants::{RING_ELEMENT_OF_T1S_SIZE, SEED_FOR_A_SIZE},
    encoding::t1,
    helper::cloop,
    polynomial::PolynomialRingElement,
    simd::traits::Operations,
};

#[inline(always)]
pub(crate) fn generate_serialized<SIMDUnit: Operations>(
    seed: &[u8],
    t1: &[PolynomialRingElement<SIMDUnit>],
    verification_key_serialized: &mut [u8],
) {
    verification_key_serialized[0..SEED_FOR_A_SIZE].copy_from_slice(seed);

    cloop! {
        for (i, ring_element) in t1.iter().enumerate() {
            let offset = SEED_FOR_A_SIZE + (i * RING_ELEMENT_OF_T1S_SIZE);
            t1::serialize::<SIMDUnit>(
                ring_element,
                &mut verification_key_serialized[offset..offset + RING_ELEMENT_OF_T1S_SIZE],
            );
        }
    }
}

#[inline(always)]
pub(crate) fn deserialize<SIMDUnit: Operations>(
    rows_in_a: usize,
    verification_key_size: usize,
    serialized: &[u8],
    t1: &mut [PolynomialRingElement<SIMDUnit>],
) {
    #[cfg(not(eurydice))]
    debug_assert!(serialized.len() == verification_key_size - SEED_FOR_A_SIZE);

    for i in 0..rows_in_a {
        t1::deserialize::<SIMDUnit>(
            &serialized[i * RING_ELEMENT_OF_T1S_SIZE..(i + 1) * RING_ELEMENT_OF_T1S_SIZE],
            &mut t1[i],
        );
    }
}