mls_rs_crypto_traits/
ec.rs1use mls_rs_core::crypto::CipherSuite;
6
7use crate::SamplingMethod;
8
9#[derive(Clone, Copy, Debug, Eq, PartialEq)]
11#[repr(u8)]
12#[non_exhaustive]
13pub enum Curve {
14 P256,
16 P384,
18 P521,
20 X25519,
22 Ed25519,
24 X448,
26 Ed448,
28}
29
30impl Curve {
31 #[inline(always)]
33 pub fn secret_key_size(&self) -> usize {
34 match self {
35 Curve::P256 => 32,
36 Curve::P384 => 48,
37 Curve::P521 => 66,
38 Curve::X25519 => 32,
39 Curve::Ed25519 => 64,
40 Curve::X448 => 56,
41 Curve::Ed448 => 114,
42 }
43 }
44
45 #[inline(always)]
46 pub fn public_key_size(&self) -> usize {
47 match self {
48 Curve::P256 | Curve::P384 | Curve::P521 => 2 * self.secret_key_size() + 1,
49 Curve::X25519 | Curve::Ed25519 | Curve::X448 | Curve::Ed448 => self.secret_key_size(),
50 }
51 }
52
53 pub fn from_ciphersuite(cipher_suite: CipherSuite, for_sig: bool) -> Option<Self> {
54 match cipher_suite {
55 CipherSuite::P256_AES128 => Some(Curve::P256),
56 CipherSuite::P384_AES256 => Some(Curve::P384),
57 CipherSuite::P521_AES256 => Some(Curve::P521),
58 CipherSuite::CURVE25519_AES128 | CipherSuite::CURVE25519_CHACHA if for_sig => {
59 Some(Curve::Ed25519)
60 }
61 CipherSuite::CURVE25519_AES128 | CipherSuite::CURVE25519_CHACHA => Some(Curve::X25519),
62 CipherSuite::CURVE448_AES256 | CipherSuite::CURVE448_CHACHA if for_sig => {
63 Some(Curve::Ed448)
64 }
65 CipherSuite::CURVE448_AES256 | CipherSuite::CURVE448_CHACHA => Some(Curve::X448),
66 _ => None,
67 }
68 }
69
70 #[inline(always)]
71 pub fn hpke_sampling_method(&self) -> SamplingMethod {
72 match self {
73 Curve::P256 | Curve::P384 => SamplingMethod::HpkeWithBitmask(0xFF),
74 Curve::P521 => SamplingMethod::HpkeWithBitmask(0x01),
75 _ => SamplingMethod::HpkeWithoutBitmask,
76 }
77 }
78}