1use std::str::FromStr;
2
3use num_enum::TryFromPrimitive;
4
5use crate::{IdLookupError, Keypair};
6
7#[non_exhaustive]
14#[repr(u16)]
15#[derive(Copy, Clone, Debug, PartialEq, Eq, TryFromPrimitive)]
16#[cfg_attr(
17 feature = "serde",
18 derive(serde_crate::Serialize, serde_crate::Deserialize)
19)]
20#[cfg_attr(feature = "serde", serde(crate = "serde_crate"))]
21pub enum Kem {
22 #[cfg(feature = "nistp")]
24 DhP256HkdfSha256 = 0x0010,
25
26 #[cfg(feature = "nistp")]
28 DhP384HkdfSha384 = 0x0011,
29
30 #[cfg(feature = "nistp")]
32 DhP521HkdfSha512 = 0x0012,
33
34 #[cfg(feature = "x25519")]
36 X25519HkdfSha256 = 0x0020,
37
38 #[cfg(feature = "mlkem")]
40 MlKem768 = 0x0041,
41
42 #[cfg(feature = "mlkem")]
44 MlKem1024 = 0x0042,
45
46 #[cfg(all(feature = "mlkem", feature = "x25519"))]
48 XWing = 0x647a,
49
50 #[cfg(all(feature = "mlkem", feature = "nistp"))]
52 MlKem768P256 = 0x0050,
53
54 #[cfg(all(feature = "mlkem", feature = "nistp"))]
56 MlKem1024P384 = 0x0051,
57}
58
59impl FromStr for Kem {
60 type Err = IdLookupError;
61
62 fn from_str(s: &str) -> Result<Self, Self::Err> {
63 match &*s.to_lowercase().replace('-', "") {
64 #[cfg(feature = "nistp")]
65 "p256sha256" | "dhkemp256hkdfsha256" | "p256hkdfsha256" | "dhkem(p256, hkdfsha256)" => {
66 Ok(Self::DhP256HkdfSha256)
67 }
68 #[cfg(feature = "nistp")]
69 "p384sha384" | "dhkemp384hkdfsha384" | "p384hkdfsha384" | "dhkem(p384, hkdfsha384)" => {
70 Ok(Self::DhP384HkdfSha384)
71 }
72 #[cfg(feature = "nistp")]
73 "p521sha512" | "dhkemp521hkdfsha512" | "p521hkdfsha512" | "dhkem(p521, hkdfsha512)" => {
74 Ok(Self::DhP521HkdfSha512)
75 }
76 #[cfg(feature = "x25519")]
77 "x25519sha256"
78 | "dhkemx25519hkdfsha256"
79 | "x25519hkdfsha256"
80 | "dhkem(x25519, hkdfsha256)" => Ok(Self::X25519HkdfSha256),
81 #[cfg(feature = "mlkem")]
82 "mlkem768" => Ok(Self::MlKem768),
83 #[cfg(feature = "mlkem")]
84 "mlkem1024" => Ok(Self::MlKem1024),
85 #[cfg(all(feature = "mlkem", feature = "x25519"))]
86 "xwing" | "mlkem768x25119" | "mlkem768-x25119" => Ok(Self::XWing),
87 #[cfg(all(feature = "mlkem", feature = "nistp"))]
88 "mlkem768p256" | "mlkem768-p256" => Ok(Self::MlKem768P256),
89 #[cfg(all(feature = "mlkem", feature = "nistp"))]
90 "mlkem1024p384" | "mlkem1024-p384" => Ok(Self::MlKem1024P384),
91 _ => Err(IdLookupError("kem not recognized")),
92 }
93 }
94}
95
96impl Kem {
97 #[must_use]
99 pub fn gen_keypair(self) -> Keypair {
100 crate::gen_keypair(self)
101 }
102}
103
104pub const KEM_ALL: &[Kem] = &[
106 #[cfg(feature = "nistp")]
107 Kem::DhP256HkdfSha256,
108 #[cfg(feature = "nistp")]
109 Kem::DhP384HkdfSha384,
110 #[cfg(feature = "nistp")]
111 Kem::DhP521HkdfSha512,
112 #[cfg(feature = "x25519")]
113 Kem::X25519HkdfSha256,
114 #[cfg(feature = "mlkem")]
115 Kem::MlKem768,
116 #[cfg(feature = "mlkem")]
117 Kem::MlKem1024,
118 #[cfg(all(feature = "mlkem", feature = "x25519"))]
119 Kem::XWing,
120 #[cfg(all(feature = "mlkem", feature = "nistp"))]
121 Kem::MlKem768P256,
122 #[cfg(all(feature = "mlkem", feature = "nistp"))]
123 Kem::MlKem1024P384,
124];