use crate::generics::GenerateSecret;
use crate::generics::{ByteArrayData, Secret, TypeSpec, sealed::Sealed};
#[cfg(feature = "safe_api")]
use crate::{errors::UnknownCryptoError, generics::sealed::Data};
pub mod internal;
pub mod mlkem512;
pub mod mlkem768;
pub mod mlkem1024;
pub const SEED_SIZE: usize = 64;
pub const RAND_SIZE: usize = 32;
#[derive(Debug)]
pub struct MlKemSeed {}
impl Sealed for MlKemSeed {}
impl TypeSpec for MlKemSeed {
const NAME: &'static str = stringify!(Seed);
type TypeData = ByteArrayData<SEED_SIZE>;
}
impl From<[u8; SEED_SIZE]> for Secret<MlKemSeed> {
fn from(value: [u8; SEED_SIZE]) -> Self {
Self::from_data(<MlKemSeed as TypeSpec>::TypeData::from(value))
}
}
impl GenerateSecret for MlKemSeed {
#[cfg(feature = "safe_api")]
#[cfg_attr(docsrs, doc(cfg(feature = "safe_api")))]
fn generate() -> Result<Secret<MlKemSeed>, UnknownCryptoError> {
let mut data = Self::TypeData::new(SEED_SIZE)?;
crate::util::secure_rand_bytes(&mut data.bytes)?;
Ok(Secret::from_data(data))
}
}
pub type Seed = Secret<MlKemSeed>;
#[derive(Debug)]
pub struct MlKemExplicitRandom {}
impl Sealed for MlKemExplicitRandom {}
impl TypeSpec for MlKemExplicitRandom {
const NAME: &'static str = stringify!(ExplicitRandom);
type TypeData = ByteArrayData<RAND_SIZE>;
}
impl From<[u8; RAND_SIZE]> for Secret<MlKemExplicitRandom> {
fn from(value: [u8; RAND_SIZE]) -> Self {
Self::from_data(<MlKemExplicitRandom as TypeSpec>::TypeData::from(value))
}
}
impl GenerateSecret for MlKemExplicitRandom {
#[cfg(feature = "safe_api")]
#[cfg_attr(docsrs, doc(cfg(feature = "safe_api")))]
fn generate() -> Result<Secret<MlKemExplicitRandom>, UnknownCryptoError> {
let mut data = Self::TypeData::new(RAND_SIZE)?;
crate::util::secure_rand_bytes(&mut data.bytes)?;
Ok(Secret::from_data(data))
}
}
pub type ExplicitRandom = Secret<MlKemExplicitRandom>;
#[test]
fn test_mlkem_seed() {
use crate::test_framework::newtypes::secret::SecretNewtype;
SecretNewtype::test_with_generate::<SEED_SIZE, SEED_SIZE, SEED_SIZE, MlKemSeed>();
assert_ne!(Seed::from([0u8; SEED_SIZE]), Seed::from([1u8; SEED_SIZE]));
}
#[test]
fn test_mlkem_explicitrandom() {
use crate::test_framework::newtypes::secret::SecretNewtype;
SecretNewtype::test_with_generate::<RAND_SIZE, RAND_SIZE, RAND_SIZE, MlKemExplicitRandom>();
assert_ne!(
ExplicitRandom::from([0u8; RAND_SIZE]),
ExplicitRandom::from([1u8; RAND_SIZE])
);
}