hpke_dispatch/
keypair.rs

1#[cfg(target_arch = "wasm32")]
2use wasm_bindgen::prelude::*;
3
4use crate::Kem;
5use hpke::Serializable;
6
7/// An encoded keypair
8#[derive(Debug, Clone, Eq, PartialEq, zeroize::Zeroize)]
9#[cfg_attr(target_arch = "wasm32", wasm_bindgen(getter_with_clone))]
10pub struct Keypair {
11    /// the public key for this keypair
12    pub public_key: Vec<u8>,
13
14    /// the private key for this keypair,
15    pub private_key: Vec<u8>,
16}
17
18#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
19impl Keypair {
20    /// generate a keypair from a [`Kem`]
21    #[cfg_attr(target_arch = "wasm32", wasm_bindgen(constructor))]
22    #[must_use]
23    pub fn new(kem: Kem) -> Keypair {
24        gen_keypair(kem)
25    }
26}
27
28impl Keypair {
29    /// deconstructs the pair into (private, public)
30    #[must_use]
31    pub fn into_parts(self) -> (Vec<u8>, Vec<u8>) {
32        (self.private_key, self.public_key)
33    }
34}
35
36/// generate a Keypair for the provided asymmetric key encapsulation mechanism ([`Kem`])
37#[must_use]
38pub fn gen_keypair(kem: Kem) -> Keypair {
39    match kem {
40        #[cfg(feature = "kem-dh-p256-hkdf-sha256")]
41        Kem::DhP256HkdfSha256 => gen_kp::<hpke::kem::DhP256HkdfSha256>(),
42
43        #[cfg(feature = "kem-dh-p384-hkdf-sha384")]
44        Kem::DhP384HkdfSha384 => gen_kp::<hpke::kem::DhP384HkdfSha384>(),
45
46        #[cfg(feature = "kem-dh-p521-hkdf-sha512")]
47        Kem::DhP521HkdfSha512 => gen_kp::<hpke::kem::DhP521HkdfSha512>(),
48
49        #[cfg(feature = "kem-x25519-hkdf-sha256")]
50        Kem::X25519HkdfSha256 => gen_kp::<hpke::kem::X25519HkdfSha256>(),
51    }
52}
53
54fn gen_kp<KemT: hpke::kem::Kem>() -> Keypair {
55    let (private_key, public_key) = KemT::gen_keypair(&mut rand::rng());
56    let public_key = public_key.to_bytes().to_vec();
57    let private_key = private_key.to_bytes().to_vec();
58
59    Keypair {
60        public_key,
61        private_key,
62    }
63}