use crate::NamedGroup;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct FfdheGroup<'a> {
pub p: &'a [u8],
pub g: &'a [u8],
}
impl FfdheGroup<'static> {
pub fn from_named_group(named_group: NamedGroup) -> Option<Self> {
match named_group {
NamedGroup::FFDHE2048 => Some(FFDHE2048),
NamedGroup::FFDHE3072 => Some(FFDHE3072),
NamedGroup::FFDHE4096 => Some(FFDHE4096),
NamedGroup::FFDHE6144 => Some(FFDHE6144),
NamedGroup::FFDHE8192 => Some(FFDHE8192),
_ => None,
}
}
}
impl<'a> FfdheGroup<'a> {
pub fn named_group(&self) -> Option<NamedGroup> {
match *self {
FFDHE2048 => Some(NamedGroup::FFDHE2048),
FFDHE3072 => Some(NamedGroup::FFDHE3072),
FFDHE4096 => Some(NamedGroup::FFDHE4096),
FFDHE6144 => Some(NamedGroup::FFDHE6144),
FFDHE8192 => Some(NamedGroup::FFDHE8192),
_ => None,
}
}
pub fn from_params_trimming_leading_zeros(p: &'a [u8], g: &'a [u8]) -> Self {
fn trim_leading_zeros(buf: &[u8]) -> &[u8] {
for start in 0..buf.len() {
if buf[start] != 0 {
return &buf[start..];
}
}
&[]
}
FfdheGroup {
p: trim_leading_zeros(p),
g: trim_leading_zeros(g),
}
}
}
pub const FFDHE2048: FfdheGroup = FfdheGroup {
p: include_bytes!("ffdhe_groups/ffdhe2048-modulus.bin"),
g: &[2],
};
pub const FFDHE3072: FfdheGroup = FfdheGroup {
p: include_bytes!("ffdhe_groups/ffdhe3072-modulus.bin"),
g: &[2],
};
pub const FFDHE4096: FfdheGroup = FfdheGroup {
p: include_bytes!("ffdhe_groups/ffdhe4096-modulus.bin"),
g: &[2],
};
pub const FFDHE6144: FfdheGroup = FfdheGroup {
p: include_bytes!("ffdhe_groups/ffdhe6144-modulus.bin"),
g: &[2],
};
pub const FFDHE8192: FfdheGroup = FfdheGroup {
p: include_bytes!("ffdhe_groups/ffdhe8192-modulus.bin"),
g: &[2],
};
#[test]
fn named_group_ffdhe_group_roudtrip() {
use NamedGroup::*;
let ffdhe_groups = [FFDHE2048, FFDHE3072, FFDHE4096, FFDHE6144, FFDHE8192];
for g in ffdhe_groups {
assert_eq!(
FfdheGroup::from_named_group(g)
.unwrap()
.named_group(),
Some(g)
);
}
}