clia_rustls_mod/msgs/
ffdhe_groups.rs

1//! This module contains parameters for FFDHE named groups as defined
2//! in [RFC 7919 Appendix A](https://datatracker.ietf.org/doc/html/rfc7919#appendix-A).
3
4use crate::NamedGroup;
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7/// Parameters of an FFDHE group, with Big-endian byte order
8pub struct FfdheGroup<'a> {
9    pub p: &'a [u8],
10    pub g: &'a [u8],
11}
12
13impl FfdheGroup<'static> {
14    /// Return the `FfdheGroup` corresponding to the provided `NamedGroup`
15    /// if it is indeed an FFDHE group
16    pub fn from_named_group(named_group: NamedGroup) -> Option<Self> {
17        match named_group {
18            NamedGroup::FFDHE2048 => Some(FFDHE2048),
19            NamedGroup::FFDHE3072 => Some(FFDHE3072),
20            NamedGroup::FFDHE4096 => Some(FFDHE4096),
21            NamedGroup::FFDHE6144 => Some(FFDHE6144),
22            NamedGroup::FFDHE8192 => Some(FFDHE8192),
23            _ => None,
24        }
25    }
26}
27
28impl<'a> FfdheGroup<'a> {
29    /// Return the `NamedGroup` for the `FfdheGroup` if it represents one.
30    pub fn named_group(&self) -> Option<NamedGroup> {
31        match *self {
32            FFDHE2048 => Some(NamedGroup::FFDHE2048),
33            FFDHE3072 => Some(NamedGroup::FFDHE3072),
34            FFDHE4096 => Some(NamedGroup::FFDHE4096),
35            FFDHE6144 => Some(NamedGroup::FFDHE6144),
36            FFDHE8192 => Some(NamedGroup::FFDHE8192),
37            _ => None,
38        }
39    }
40
41    /// Construct an `FfdheGroup` from the given `p` and `g`, trimming any potential leading zeros.
42    pub fn from_params_trimming_leading_zeros(p: &'a [u8], g: &'a [u8]) -> Self {
43        fn trim_leading_zeros(buf: &[u8]) -> &[u8] {
44            for start in 0..buf.len() {
45                if buf[start] != 0 {
46                    return &buf[start..];
47                }
48            }
49            &[]
50        }
51
52        FfdheGroup {
53            p: trim_leading_zeros(p),
54            g: trim_leading_zeros(g),
55        }
56    }
57}
58
59/// FFDHE2048 group defined in [RFC 7919 Appendix A.1]
60///
61/// [RFC 7919 Appendix A.1]: https://datatracker.ietf.org/doc/html/rfc7919#appendix-A.1
62pub const FFDHE2048: FfdheGroup = FfdheGroup {
63    p: include_bytes!("ffdhe_groups/ffdhe2048-modulus.bin"),
64    g: &[2],
65};
66
67/// FFDHE3072 group defined in [RFC 7919 Appendix A.2]
68///
69/// [RFC 7919 Appendix A.2]: https://datatracker.ietf.org/doc/html/rfc7919#appendix-A.2
70pub const FFDHE3072: FfdheGroup = FfdheGroup {
71    p: include_bytes!("ffdhe_groups/ffdhe3072-modulus.bin"),
72    g: &[2],
73};
74
75/// FFDHE4096 group defined in [RFC 7919 Appendix A.3]
76///
77/// [RFC 7919 Appendix A.3]: https://datatracker.ietf.org/doc/html/rfc7919#appendix-A.3
78pub const FFDHE4096: FfdheGroup = FfdheGroup {
79    p: include_bytes!("ffdhe_groups/ffdhe4096-modulus.bin"),
80    g: &[2],
81};
82
83/// FFDHE6144 group defined in [RFC 7919 Appendix A.4]
84///
85/// [RFC 7919 Appendix A.4]: https://datatracker.ietf.org/doc/html/rfc7919#appendix-A.4
86pub const FFDHE6144: FfdheGroup = FfdheGroup {
87    p: include_bytes!("ffdhe_groups/ffdhe6144-modulus.bin"),
88    g: &[2],
89};
90
91/// FFDHE8192 group defined in [RFC 7919 Appendix A.5]
92///
93/// [RFC 7919 Appendix A.5]: https://datatracker.ietf.org/doc/html/rfc7919#appendix-A.5
94pub const FFDHE8192: FfdheGroup = FfdheGroup {
95    p: include_bytes!("ffdhe_groups/ffdhe8192-modulus.bin"),
96    g: &[2],
97};
98
99#[test]
100fn named_group_ffdhe_group_roudtrip() {
101    use NamedGroup::*;
102    let ffdhe_groups = [FFDHE2048, FFDHE3072, FFDHE4096, FFDHE6144, FFDHE8192];
103    for g in ffdhe_groups {
104        assert_eq!(
105            FfdheGroup::from_named_group(g)
106                .unwrap()
107                .named_group(),
108            Some(g)
109        );
110    }
111}