pub mod kem;
pub mod signature;
pub use kem::{
KEMPrivateKey, KEMPublicKey, KeyEncapsulationMechanism, MLKem1024, MLKem1024PrivateKey,
MLKem1024PublicKey, MLKem768, MLKem768PrivateKey, MLKem768PublicKey, XWingMLKem768X25519,
XWingMLKem768X25519PrivateKey, XWingMLKem768X25519PublicKey,
};
pub use signature::{
DigitalSignatureAlgorithm, MLDsa65, MLDsa65PrivateKey, MLDsa65PublicKey, MLDsa87,
MLDsa87PrivateKey, MLDsa87PublicKey, SignaturePrivateKey, SignaturePublicKey,
};
pub trait QuantumSafe {
fn algorithm_name() -> &'static str;
fn security_level() -> u8;
fn is_post_quantum() -> bool {
true
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mlkem768_basic() {
let private_key = MLKem768::generate_private_key().unwrap();
let public_key = private_key.public_key();
let (ciphertext, shared_secret1) = public_key.encapsulate().unwrap();
let shared_secret2 = private_key.decapsulate(&ciphertext).unwrap();
assert_eq!(shared_secret1, shared_secret2);
assert_eq!(shared_secret1.len(), 32); }
#[test]
fn test_mlkem1024_basic() {
let private_key = MLKem1024::generate_private_key().unwrap();
let public_key = private_key.public_key();
let (ciphertext, shared_secret1) = public_key.encapsulate().unwrap();
let shared_secret2 = private_key.decapsulate(&ciphertext).unwrap();
assert_eq!(shared_secret1, shared_secret2);
assert_eq!(shared_secret1.len(), 32); }
#[test]
fn test_xwing_basic() {
let private_key = XWingMLKem768X25519::generate_private_key().unwrap();
let public_key = private_key.public_key();
let (ciphertext, shared_secret1) = public_key.encapsulate().unwrap();
let shared_secret2 = private_key.decapsulate(&ciphertext).unwrap();
assert_eq!(shared_secret1, shared_secret2);
assert_eq!(shared_secret1.len(), 32); }
#[test]
fn test_mldsa65_basic() {
let private_key = MLDsa65::generate_private_key().unwrap();
let public_key = private_key.public_key();
let message = b"Hello, quantum-safe world!";
let signature = private_key.sign(message).unwrap();
assert!(public_key.verify(message, &signature).unwrap());
let wrong_message = b"Wrong message";
assert!(!public_key.verify(wrong_message, &signature).unwrap());
}
#[test]
fn test_mldsa87_basic() {
let private_key = MLDsa87::generate_private_key().unwrap();
let public_key = private_key.public_key();
let message = b"Hello, ML-DSA87!";
let signature = private_key.sign(message).unwrap();
assert!(public_key.verify(message, &signature).unwrap());
let wrong_message = b"Wrong message";
assert!(!public_key.verify(wrong_message, &signature).unwrap());
}
}