use crate::ml_dsa_generic::ml_dsa_87::*;
use crate::{constants::*, types::*, SigningError, VerificationError};
pub use crate::ml_dsa_generic::ml_dsa_87::{
MLDSA87KeyPair, MLDSA87Signature, MLDSA87SigningKey, MLDSA87VerificationKey,
};
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],
) -> MLDSA87KeyPair {
let mut signing_key = [0u8; SIGNING_KEY_SIZE];
let mut verification_key = [0u8; VERIFICATION_KEY_SIZE];
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::generate_key_pair(
randomness,
&mut signing_key,
&mut verification_key,
);
MLDSA87KeyPair {
signing_key: MLDSASigningKey::new(signing_key),
verification_key: MLDSAVerificationKey::new(verification_key),
}
}
pub fn sign(
signing_key: &MLDSA87SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA87Signature, SigningError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::sign(
signing_key.as_ref(),
message,
context,
randomness,
)
}
pub fn sign_mut(
signing_key: &MLDSA87SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
signature: &mut [u8; SIGNATURE_SIZE],
) -> Result<(), SigningError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::sign_mut(
signing_key.as_ref(),
message,
context,
randomness,
signature,
)
}
#[cfg(feature = "acvp")]
pub fn sign_internal(
signing_key: &MLDSA87SigningKey,
message: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA87Signature, SigningError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::sign_internal(
signing_key.as_ref(),
message,
randomness,
)
}
#[cfg(feature = "acvp")]
pub fn verify_internal(
verification_key: &MLDSA87VerificationKey,
message: &[u8],
signature: &MLDSA87Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::verify_internal(
verification_key.as_ref(),
message,
signature.as_ref(),
)
}
pub fn sign_pre_hashed_shake128(
signing_key: &MLDSA87SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA87Signature, SigningError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::sign_pre_hashed_shake128(
signing_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
randomness,
)
}
pub fn verify(
verification_key: &MLDSA87VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA87Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::verify(
verification_key.as_ref(),
message,
context,
signature.as_ref(),
)
}
pub fn verify_pre_hashed_shake128(
verification_key: &MLDSA87VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA87Signature,
) -> Result<(), VerificationError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::instantiations::$modp::ml_dsa_87::verify_pre_hashed_shake128(
verification_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
signature.as_ref(),
)
}
}
};
}
instantiate! {portable, "Portable ML-DSA 87"}
#[cfg(feature = "simd256")]
instantiate! {avx2, "AVX2 Optimised ML-DSA 87"}
#[cfg(feature = "simd128")]
instantiate! {neon, "Neon Optimised ML-DSA 87"}
#[cfg(not(eurydice))]
pub fn generate_key_pair(randomness: [u8; KEY_GENERATION_RANDOMNESS_SIZE]) -> MLDSA87KeyPair {
let mut signing_key = [0u8; SIGNING_KEY_SIZE];
let mut verification_key = [0u8; VERIFICATION_KEY_SIZE];
crate::ml_dsa_generic::multiplexing::ml_dsa_87::generate_key_pair(
randomness,
&mut signing_key,
&mut verification_key,
);
MLDSA87KeyPair {
signing_key: MLDSASigningKey::new(signing_key),
verification_key: MLDSAVerificationKey::new(verification_key),
}
}
#[cfg(not(eurydice))]
pub fn sign(
signing_key: &MLDSA87SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA87Signature, SigningError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_87::sign(
signing_key.as_ref(),
message,
context,
randomness,
)
}
#[cfg(all(not(eurydice), feature = "acvp"))]
pub fn sign_internal(
signing_key: &MLDSA87SigningKey,
message: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA87Signature, SigningError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_87::sign_internal(
signing_key.as_ref(),
message,
randomness,
)
}
#[cfg(all(not(eurydice), feature = "acvp"))]
pub fn verify_internal(
verification_key: &MLDSA87VerificationKey,
message: &[u8],
signature: &MLDSA87Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_87::verify_internal(
verification_key.as_ref(),
message,
signature.as_ref(),
)
}
#[cfg(not(eurydice))]
pub fn verify(
verification_key: &MLDSA87VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA87Signature,
) -> Result<(), VerificationError> {
crate::ml_dsa_generic::multiplexing::ml_dsa_87::verify(
verification_key.as_ref(),
message,
context,
signature.as_ref(),
)
}
#[cfg(not(eurydice))]
pub fn sign_pre_hashed_shake128(
signing_key: &MLDSA87SigningKey,
message: &[u8],
context: &[u8],
randomness: [u8; SIGNING_RANDOMNESS_SIZE],
) -> Result<MLDSA87Signature, SigningError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::multiplexing::ml_dsa_87::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: &MLDSA87VerificationKey,
message: &[u8],
context: &[u8],
signature: &MLDSA87Signature,
) -> Result<(), VerificationError> {
let mut pre_hash_buffer = [0u8; 32];
crate::ml_dsa_generic::multiplexing::ml_dsa_87::verify_pre_hashed_shake128(
verification_key.as_ref(),
message,
context,
&mut pre_hash_buffer,
signature.as_ref(),
)
}