Skip to main content

hpke_dispatch/
keypair.rs

1use hpke::Serializable;
2
3use crate::Kem;
4
5/// An encoded keypair
6#[derive(Debug, Clone, Eq, PartialEq, zeroize::Zeroize)]
7pub struct Keypair {
8    /// the public key for this keypair
9    pub public_key: Vec<u8>,
10
11    /// the private key for this keypair,
12    pub private_key: Vec<u8>,
13}
14
15impl Keypair {
16    /// generate a keypair from a [`Kem`]
17    #[must_use]
18    pub fn new(kem: Kem) -> Keypair {
19        gen_keypair(kem)
20    }
21}
22
23impl Keypair {
24    /// deconstructs the pair into (private, public)
25    #[must_use]
26    pub fn into_parts(self) -> (Vec<u8>, Vec<u8>) {
27        (self.private_key, self.public_key)
28    }
29}
30
31/// generate a Keypair for the provided asymmetric key encapsulation mechanism ([`Kem`])
32#[must_use]
33pub fn gen_keypair(kem: Kem) -> Keypair {
34    match kem {
35        #[cfg(feature = "nistp")]
36        Kem::DhP256HkdfSha256 => gen_kp::<hpke::kem::DhP256HkdfSha256>(),
37
38        #[cfg(feature = "nistp")]
39        Kem::DhP384HkdfSha384 => gen_kp::<hpke::kem::DhP384HkdfSha384>(),
40
41        #[cfg(feature = "nistp")]
42        Kem::DhP521HkdfSha512 => gen_kp::<hpke::kem::DhP521HkdfSha512>(),
43
44        #[cfg(feature = "x25519")]
45        Kem::X25519HkdfSha256 => gen_kp::<hpke::kem::X25519HkdfSha256>(),
46
47        #[cfg(feature = "mlkem")]
48        Kem::MlKem768 => gen_kp::<hpke::kem::MlKem768>(),
49
50        #[cfg(feature = "mlkem")]
51        Kem::MlKem1024 => gen_kp::<hpke::kem::MlKem1024>(),
52
53        #[cfg(all(feature = "mlkem", feature = "x25519"))]
54        Kem::XWing => gen_kp::<hpke::kem::XWing>(),
55
56        #[cfg(all(feature = "mlkem", feature = "nistp"))]
57        Kem::MlKem768P256 => gen_kp::<hpke::kem::MlKem768P256>(),
58
59        #[cfg(all(feature = "mlkem", feature = "nistp"))]
60        Kem::MlKem1024P384 => gen_kp::<hpke::kem::MlKem1024P384>(),
61    }
62}
63
64fn gen_kp<KemT: hpke::kem::Kem>() -> Keypair {
65    let (private_key, public_key) = KemT::gen_keypair();
66    let public_key = public_key.to_bytes().to_vec();
67    let private_key = private_key.to_bytes().to_vec();
68
69    Keypair {
70        public_key,
71        private_key,
72    }
73}