quantcrypt/kem/api/key_generator.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
use crate::asn1::private_key::PrivateKey;
use crate::asn1::public_key::PublicKey;
use crate::errors;
use crate::kem::common::config::oids::Oid;
use crate::kem::{api::algorithm::KemAlgorithm, common::kem_trait::Kem, kem_manager::KemManager};
// Change the alias to use `Box<dyn error::Error>`.
type Result<T> = std::result::Result<T, errors::QuantCryptError>;
/// A key generator for KEM keys
///
/// # Example
/// ```
/// use quantcrypt::kems::KemKeyGenerator;
/// use quantcrypt::kems::KemAlgorithm;
///
/// let mut key_generator = KemKeyGenerator::new(KemAlgorithm::MlKem768);
/// let (pk, sk) = key_generator.generate().unwrap();
/// ```
pub struct KemKeyGenerator {
/// The algorithm to use for key generation
algorithm: KemAlgorithm,
}
impl KemKeyGenerator {
/// Create a new `KeyGenerator` with the specified algorithm
///
/// # Arguments
///
/// * `algorithm` - The algorithm to use for key generation
///
/// # Returns
///
/// The new `KeyGenerator`
pub fn new(algorithm: KemAlgorithm) -> KemKeyGenerator {
KemKeyGenerator { algorithm }
}
/// Generate a keypair using the default RNG
///
/// # Returns
///
/// A tuple containing the public and secret keys (pk, sk)
pub fn generate(&mut self) -> Result<(PublicKey, PrivateKey)> {
let kem_type = self.algorithm.get_kem_type();
let mut dsa_manager = KemManager::new(kem_type.clone())?;
let (pk, sk) = dsa_manager
.key_gen()
.map_err(|_| errors::QuantCryptError::KeyPairGenerationFailed)?;
let oid = kem_type.get_oid();
let pk = PublicKey::new(&oid, &pk)
.map_err(|_| errors::QuantCryptError::KeyPairGenerationFailed)?;
let sk = PrivateKey::new(&oid, &sk, Some(pk.clone()))
.map_err(|_| errors::QuantCryptError::KeyPairGenerationFailed)?;
Ok((pk, sk))
}
}