quantcrypt/kem/api/
key_generator.rs

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