mod sealed {
pub trait Sealed {}
}
pub trait MlKemParameterSet: sealed::Sealed + Send + Sync + 'static {
const K: usize;
const ETA1: usize;
const ETA2: usize = 2;
const DU: usize;
const DV: usize;
const NAME: &'static str;
const ENCAPSULATION_KEY_BYTES: usize;
const DECAPSULATION_KEY_BYTES: usize;
const CIPHERTEXT_BYTES: usize;
}
pub enum MlKem512Params {}
pub enum MlKem768Params {}
pub enum MlKem1024Params {}
impl sealed::Sealed for MlKem512Params {}
impl sealed::Sealed for MlKem768Params {}
impl sealed::Sealed for MlKem1024Params {}
impl MlKemParameterSet for MlKem512Params {
const K: usize = 2;
const ETA1: usize = 3;
const DU: usize = 10;
const DV: usize = 4;
const NAME: &'static str = "ML-KEM-512";
const ENCAPSULATION_KEY_BYTES: usize = 800;
const DECAPSULATION_KEY_BYTES: usize = 1_632;
const CIPHERTEXT_BYTES: usize = 768;
}
impl MlKemParameterSet for MlKem768Params {
const K: usize = 3;
const ETA1: usize = 2;
const DU: usize = 10;
const DV: usize = 4;
const NAME: &'static str = "ML-KEM-768";
const ENCAPSULATION_KEY_BYTES: usize = 1_184;
const DECAPSULATION_KEY_BYTES: usize = 2_400;
const CIPHERTEXT_BYTES: usize = 1_088;
}
impl MlKemParameterSet for MlKem1024Params {
const K: usize = 4;
const ETA1: usize = 2;
const DU: usize = 11;
const DV: usize = 5;
const NAME: &'static str = "ML-KEM-1024";
const ENCAPSULATION_KEY_BYTES: usize = 1_568;
const DECAPSULATION_KEY_BYTES: usize = 3_168;
const CIPHERTEXT_BYTES: usize = 1_568;
}
pub(crate) const N: usize = 256;
pub(crate) const Q: i16 = 3_329;
pub(crate) const SYM_BYTES: usize = 32;
pub(crate) const POLY_BYTES: usize = 384;
#[inline]
pub(crate) const fn pke_secret_key_bytes<P: MlKemParameterSet>() -> usize {
P::K * POLY_BYTES
}
#[inline]
pub(crate) const fn compressed_polyvec_bytes<P: MlKemParameterSet>() -> usize {
P::K * N * P::DU / 8
}