pub mod cipher_suites;
pub mod combiners;
pub mod config;
pub mod encryption;
pub mod memory_pool;
pub mod ml_dsa;
pub mod ml_kem;
pub mod negotiation;
pub mod packet_handler;
pub mod pqc_crypto_provider;
pub mod rustls_provider;
pub mod security_validation;
pub mod tls;
pub mod tls_extensions;
pub mod tls_integration;
pub mod types;
pub use config::{PqcConfig, PqcConfigBuilder};
pub use pqc_crypto_provider::{create_crypto_provider, is_pqc_group, validate_negotiated_group};
pub use types::{PqcError, PqcResult};
pub use encryption::{EncryptedMessage, HybridPublicKeyEncryption};
pub use memory_pool::{PoolConfig, PqcMemoryPool};
pub use ml_dsa::MlDsa65;
pub use ml_kem::MlKem768;
pub use tls_extensions::{NamedGroup, SignatureScheme};
pub trait PqcProvider: Send + Sync + 'static {
type MlKem: MlKemOperations;
type MlDsa: MlDsaOperations;
fn ml_kem(&self) -> &Self::MlKem;
fn ml_dsa(&self) -> &Self::MlDsa;
}
pub trait MlKemOperations: Send + Sync {
fn generate_keypair(&self) -> PqcResult<(MlKemPublicKey, MlKemSecretKey)>;
fn encapsulate(
&self,
public_key: &MlKemPublicKey,
) -> PqcResult<(MlKemCiphertext, SharedSecret)>;
fn decapsulate(
&self,
secret_key: &MlKemSecretKey,
ciphertext: &MlKemCiphertext,
) -> PqcResult<SharedSecret>;
}
pub trait MlDsaOperations: Send + Sync {
fn generate_keypair(&self) -> PqcResult<(MlDsaPublicKey, MlDsaSecretKey)>;
fn sign(&self, secret_key: &MlDsaSecretKey, message: &[u8]) -> PqcResult<MlDsaSignature>;
fn verify(
&self,
public_key: &MlDsaPublicKey,
message: &[u8],
signature: &MlDsaSignature,
) -> PqcResult<bool>;
}
use types::{
MlDsaPublicKey, MlDsaSecretKey, MlDsaSignature, MlKemCiphertext, MlKemPublicKey,
MlKemSecretKey, SharedSecret,
};
#[cfg(test)]
mod performance_tests {
use super::*;
use std::time::Instant;
#[test]
fn test_pqc_overhead() {
let baseline_start = Instant::now();
std::thread::sleep(std::time::Duration::from_millis(10));
let baseline_time = baseline_start.elapsed();
let pqc_start = Instant::now();
let ml_kem = MlKem768::new();
let ml_dsa = MlDsa65::new();
let (kem_pub, _kem_sec) = ml_kem.generate_keypair().expect("KEM keygen");
let (_ct, _ss) = ml_kem.encapsulate(&kem_pub).expect("KEM encap");
let (dsa_pub, dsa_sec) = ml_dsa.generate_keypair().expect("DSA keygen");
let sig = ml_dsa.sign(&dsa_sec, b"test").expect("DSA sign");
let _ = ml_dsa.verify(&dsa_pub, b"test", &sig).expect("DSA verify");
let pqc_time = pqc_start.elapsed();
let overhead =
((pqc_time.as_millis() as f64 / baseline_time.as_millis().max(1) as f64) - 1.0) * 100.0;
println!("Performance Test Results:");
println!(" Baseline time: {:?}", baseline_time);
println!(" PQC time: {:?}", pqc_time);
println!(" Overhead: {:.1}%", overhead);
let max_overhead = if cfg!(debug_assertions) {
5000.0 } else {
150.0
};
assert!(
overhead < max_overhead,
"PQC overhead {:.1}% exceeds {}% target",
overhead,
max_overhead
);
}
}