#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CryptoProfile {
#[default]
Prod,
HighSec,
DevTest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PqcMode {
Prefer,
Require,
Off,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TlsFloor {
V1_2,
V1_3,
}
impl CryptoProfile {
#[must_use]
pub fn tls_floor(self) -> TlsFloor {
match self {
CryptoProfile::Prod | CryptoProfile::DevTest => TlsFloor::V1_2,
CryptoProfile::HighSec => TlsFloor::V1_3,
}
}
#[must_use]
pub fn pqc(self) -> PqcMode {
match self {
CryptoProfile::Prod | CryptoProfile::DevTest => PqcMode::Prefer,
CryptoProfile::HighSec => PqcMode::Require,
}
}
#[must_use]
pub fn warn_on_downgrade(self) -> bool {
!matches!(self, CryptoProfile::DevTest)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_prod_commercial_floor() {
let p = CryptoProfile::default();
assert_eq!(p, CryptoProfile::Prod);
assert_eq!(p.tls_floor(), TlsFloor::V1_2);
assert_eq!(p.pqc(), PqcMode::Prefer);
assert!(p.warn_on_downgrade());
}
#[test]
fn highsec_is_strict() {
let p = CryptoProfile::HighSec;
assert_eq!(p.tls_floor(), TlsFloor::V1_3);
assert_eq!(p.pqc(), PqcMode::Require);
}
#[test]
fn devtest_quietens_warnings_but_keeps_algorithms() {
let p = CryptoProfile::DevTest;
assert_eq!(p.tls_floor(), TlsFloor::V1_2);
assert_eq!(p.pqc(), PqcMode::Prefer);
assert!(!p.warn_on_downgrade());
}
}