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))
    }
}