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 mldsa44;
pub mod mldsa65;
pub mod mldsa87;
pub const SEED_SIZE: usize = 32;
pub const RAND_SIZE: usize = 32;
#[derive(Debug, Clone)]
pub struct MlDsaSeed {}
impl Sealed for MlDsaSeed {}
impl TypeSpec for MlDsaSeed {
const NAME: &'static str = stringify!(Seed);
type TypeData = ByteArrayData<SEED_SIZE>;
}
impl From<[u8; SEED_SIZE]> for Secret<MlDsaSeed> {
fn from(value: [u8; SEED_SIZE]) -> Self {
Self::from_data(<MlDsaSeed as TypeSpec>::TypeData::from(value))
}
}
impl GenerateSecret for MlDsaSeed {
#[cfg(feature = "safe_api")]
#[cfg_attr(docsrs, doc(cfg(feature = "safe_api")))]
fn generate() -> Result<Secret<MlDsaSeed>, 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<MlDsaSeed>;
#[derive(Debug)]
pub struct MlDsaExplicitRandom {}
impl Sealed for MlDsaExplicitRandom {}
impl TypeSpec for MlDsaExplicitRandom {
const NAME: &'static str = stringify!(ExplicitRandom);
type TypeData = ByteArrayData<RAND_SIZE>;
}
impl From<[u8; RAND_SIZE]> for Secret<MlDsaExplicitRandom> {
fn from(value: [u8; RAND_SIZE]) -> Self {
Self::from_data(<MlDsaExplicitRandom as TypeSpec>::TypeData::from(value))
}
}
impl ExplicitRandom {
pub fn deterministic() -> Self {
Self::from([0u8; RAND_SIZE])
}
}
impl GenerateSecret for MlDsaExplicitRandom {
#[cfg(feature = "safe_api")]
#[cfg_attr(docsrs, doc(cfg(feature = "safe_api")))]
fn generate() -> Result<Secret<MlDsaExplicitRandom>, 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<MlDsaExplicitRandom>;
#[test]
fn test_mldsa_seed() {
use crate::test_framework::newtypes::secret::SecretNewtype;
SecretNewtype::test_with_generate::<SEED_SIZE, SEED_SIZE, SEED_SIZE, MlDsaSeed>();
assert_ne!(Seed::from([0u8; SEED_SIZE]), Seed::from([1u8; SEED_SIZE]));
}
#[test]
fn test_mldsa_explicitrandom() {
use crate::test_framework::newtypes::secret::SecretNewtype;
SecretNewtype::test_with_generate::<RAND_SIZE, RAND_SIZE, RAND_SIZE, MlDsaExplicitRandom>();
assert_ne!(
ExplicitRandom::from([0u8; RAND_SIZE]),
ExplicitRandom::from([1u8; RAND_SIZE])
);
}