use bc_rand::RandomNumberGenerator;
#[cfg(feature = "pqcrypto")]
use crate::MLKEM;
#[cfg_attr(not(feature = "pqcrypto"), allow(unused_imports))]
use crate::{
EncapsulationPrivateKey, EncapsulationPublicKey, Error, Result,
X25519PrivateKey,
};
#[derive(Debug, Copy, Clone, PartialEq, Default)]
pub enum EncapsulationScheme {
#[default]
X25519,
#[cfg(feature = "pqcrypto")]
MLKEM512,
#[cfg(feature = "pqcrypto")]
MLKEM768,
#[cfg(feature = "pqcrypto")]
MLKEM1024,
}
impl EncapsulationScheme {
pub fn keypair(self) -> (EncapsulationPrivateKey, EncapsulationPublicKey) {
match self {
EncapsulationScheme::X25519 => {
let (private_key, public_key) = X25519PrivateKey::keypair();
(
EncapsulationPrivateKey::X25519(private_key),
EncapsulationPublicKey::X25519(public_key),
)
}
#[cfg(feature = "pqcrypto")]
EncapsulationScheme::MLKEM512 => {
let (private_key, public_key) = MLKEM::MLKEM512.keypair();
(
EncapsulationPrivateKey::MLKEM(private_key),
EncapsulationPublicKey::MLKEM(public_key),
)
}
#[cfg(feature = "pqcrypto")]
EncapsulationScheme::MLKEM768 => {
let (private_key, public_key) = MLKEM::MLKEM768.keypair();
(
EncapsulationPrivateKey::MLKEM(private_key),
EncapsulationPublicKey::MLKEM(public_key),
)
}
#[cfg(feature = "pqcrypto")]
EncapsulationScheme::MLKEM1024 => {
let (private_key, public_key) = MLKEM::MLKEM1024.keypair();
(
EncapsulationPrivateKey::MLKEM(private_key),
EncapsulationPublicKey::MLKEM(public_key),
)
}
}
}
pub fn keypair_using(
self,
rng: &mut impl RandomNumberGenerator,
) -> Result<(EncapsulationPrivateKey, EncapsulationPublicKey)> {
match self {
EncapsulationScheme::X25519 => {
let (private_key, public_key) =
X25519PrivateKey::keypair_using(rng);
Ok((
EncapsulationPrivateKey::X25519(private_key),
EncapsulationPublicKey::X25519(public_key),
))
}
#[cfg(feature = "pqcrypto")]
_ => Err(Error::general(
"Deterministic keypair generation not supported for this encapsulation scheme",
)),
}
}
}