libcrux-ml-dsa 0.0.8

Libcrux ML-DSA implementation
Documentation
use crate::{
    constants::{
        Eta, BYTES_FOR_VERIFICATION_KEY_HASH, RING_ELEMENT_OF_T0S_SIZE, SEED_FOR_A_SIZE,
        SEED_FOR_SIGNING_SIZE,
    },
    encoding,
    hash_functions::shake256,
    helper::cloop,
    polynomial::PolynomialRingElement,
    simd::traits::Operations,
};

#[inline(always)]
pub(crate) fn generate_serialized<SIMDUnit: Operations, Shake256: shake256::DsaXof>(
    eta: Eta,
    error_ring_element_size: usize,
    seed_matrix: &[u8],
    seed_signing: &[u8],
    verification_key: &[u8],
    s1_2: &[PolynomialRingElement<SIMDUnit>],
    t0: &[PolynomialRingElement<SIMDUnit>],
    signing_key_serialized: &mut [u8],
) {
    let mut offset = 0;

    signing_key_serialized[offset..offset + SEED_FOR_A_SIZE].copy_from_slice(seed_matrix);
    offset += SEED_FOR_A_SIZE;

    signing_key_serialized[offset..offset + SEED_FOR_SIGNING_SIZE].copy_from_slice(seed_signing);
    offset += SEED_FOR_SIGNING_SIZE;

    let mut verification_key_hash = [0; BYTES_FOR_VERIFICATION_KEY_HASH];
    Shake256::shake256::<BYTES_FOR_VERIFICATION_KEY_HASH>(
        verification_key,
        &mut verification_key_hash,
    );
    signing_key_serialized[offset..offset + BYTES_FOR_VERIFICATION_KEY_HASH]
        .copy_from_slice(&verification_key_hash);
    offset += BYTES_FOR_VERIFICATION_KEY_HASH;

    for i in 0..s1_2.len() {
        encoding::error::serialize::<SIMDUnit>(
            eta,
            &s1_2[i],
            &mut signing_key_serialized[offset..offset + error_ring_element_size],
        );
        offset += error_ring_element_size;
    }

    cloop! {
        for ring_element in t0.iter() {
            encoding::t0::serialize::<SIMDUnit>(
                ring_element,
                &mut signing_key_serialized[offset..offset + RING_ELEMENT_OF_T0S_SIZE],
            );
            offset += RING_ELEMENT_OF_T0S_SIZE;
        }
    }
}