bc_components/encapsulation/
encapsulation_scheme.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
use anyhow::{bail, Result};
use bc_rand::RandomNumberGenerator;

use crate::Kyber;
use crate::{X25519PrivateKey, EncapsulationPrivateKey, EncapsulationPublicKey};

#[derive(Debug, Copy, Clone, PartialEq, Default)]
pub enum EncapsulationScheme {
    #[default]
    X25519,
    Kyber512,
    Kyber768,
    Kyber1024,
}

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))
            }
            EncapsulationScheme::Kyber512 => {
                let (private_key, public_key) = Kyber::Kyber512.keypair();
                (EncapsulationPrivateKey::Kyber(private_key), EncapsulationPublicKey::Kyber(public_key))
            }
            EncapsulationScheme::Kyber768 => {
                let (private_key, public_key) = Kyber::Kyber768.keypair();
                (EncapsulationPrivateKey::Kyber(private_key), EncapsulationPublicKey::Kyber(public_key))
            }
            EncapsulationScheme::Kyber1024 => {
                let (private_key, public_key) = Kyber::Kyber1024.keypair();
                (EncapsulationPrivateKey::Kyber(private_key), EncapsulationPublicKey::Kyber(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)))
            }
            _ => bail!("Deterministic keypair generation not supported for this encapsulation scheme"),
        }
    }
}