use crate::ml_dsa_generic::ml_dsa_44::*;
use crate::{constants::*, types::*, SigningError, VerificationError};
pub use crate::ml_dsa_generic::ml_dsa_44::{
MLDSA44KeyPair, MLDSA44Signature, MLDSA44SigningKey, MLDSA44VerificationKey,
};
macro_rules! instantiate {
($modp:ident, $doc:expr) => {
#[doc = $doc]
pub mod $modp {
use super::*;
pub fn generate_key_pair(
randomness: [u8; KEY_GENERATION_RANDOMNESS_SIZE],
) -> MLDSA44KeyPair {
let mut signing_key = [0u8; SIGNING_KEY_SIZE];
let mut verification_key = [0u8; VERIFICATION_KEY_SIZE];
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::generate_key_pair(
randomness,
&mut signing_key,
&mut verification_key,
);
MLDSA44KeyPair {
signing_key: MLDSASigningKey::new(signing_key),
verification_key: MLDSAVerificationKey::new(verification_key),
}
}
pub fn sign(
signing_key: &MLDSA44SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA44Signature, SigningError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::sign(
signing_key.as_ref(),
message,
context,
randomness,
)
}
pub fn sign_mut(
signing_key: &MLDSA44SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
signature: &mut [u8; SIGNATURE_SIZE],
) -> Result<(), SigningError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::sign_mut(
signing_key.as_ref(),
message,
context,
randomness,
signature,
)
}
#[cfg(feature = "acvp")]
pub fn sign_internal(
signing_key: &MLDSA44SigningKey,
message: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA44Signature, SigningError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::sign_internal(
signing_key.as_ref(),
message,
randomness,
)
}
#[cfg(feature = "acvp")]
pub fn verify_internal(
verification_key: &MLDSA44VerificationKey,
message: &[u8],
signature: &MLDSA44Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::verify_internal(
verification_key.as_ref(),
message,
signature.as_ref(),
)
}
pub fn sign_pre_hashed_shake128(
signing_key: &MLDSA44SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA44Signature, SigningError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::sign_pre_hashed_shake128(
signing_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
randomness,
)
}
pub fn verify(
verification_key: &MLDSA44VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA44Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::verify(
verification_key.as_ref(),
message,
context,
signature.as_ref(),
)
}
pub fn verify_pre_hashed_shake128(
verification_key: &MLDSA44VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA44Signature,
) -> Result<(), VerificationError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_44::verify_pre_hashed_shake128(
verification_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
signature.as_ref(),
)
}
}
};
}
instantiate! {portable, "Portable ML-DSA 44"}
#[cfg(feature = "simd256")]
instantiate! {avx2, "AVX2 Optimised ML-DSA 44"}
#[cfg(feature = "simd128")]
instantiate! {neon, "Neon Optimised ML-DSA 44"}
#[cfg(not(eurydice))]
pub fn generate_key_pair(randomness: [u8; KEY_GENERATION_RANDOMNESS_SIZE]) -> MLDSA44KeyPair {
let mut signing_key = [0u8; SIGNING_KEY_SIZE];
let mut verification_key = [0u8; VERIFICATION_KEY_SIZE];
crate::ml_dsa_generic::multiplexing::ml_dsa_44::generate_key_pair(
randomness,
&mut signing_key,
&mut verification_key,
);
MLDSA44KeyPair {
signing_key: MLDSASigningKey::new(signing_key),
verification_key: MLDSAVerificationKey::new(verification_key),
}
}
#[cfg(not(eurydice))]
pub fn sign(
signing_key: &MLDSA44SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA44Signature, SigningError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_44::sign(
signing_key.as_ref(),
message,
context,
randomness,
)
}
#[cfg(all(not(eurydice), feature = "acvp"))]
pub fn sign_internal(
signing_key: &MLDSA44SigningKey,
message: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA44Signature, SigningError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_44::sign_internal(
signing_key.as_ref(),
message,
randomness,
)
}
#[cfg(all(not(eurydice), feature = "acvp"))]
pub fn verify_internal(
verification_key: &MLDSA44VerificationKey,
message: &[u8],
signature: &MLDSA44Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_44::verify_internal(
verification_key.as_ref(),
message,
signature.as_ref(),
)
}
#[cfg(not(eurydice))]
pub fn verify(
verification_key: &MLDSA44VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA44Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_44::verify(
verification_key.as_ref(),
message,
context,
signature.as_ref(),
)
}
#[cfg(not(eurydice))]
pub fn sign_pre_hashed_shake128(
signing_key: &MLDSA44SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA44Signature, SigningError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::multiplexing::ml_dsa_44::sign_pre_hashed_shake128(
signing_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
randomness,
)
}
#[cfg(not(eurydice))]
pub fn verify_pre_hashed_shake128(
verification_key: &MLDSA44VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA44Signature,
) -> Result<(), VerificationError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::multiplexing::ml_dsa_44::verify_pre_hashed_shake128(
verification_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
signature.as_ref(),
)
}