use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[derive(Default)]
pub enum SecurityTier {
#[deprecated(note = "Vulnerable to quantum attacks")]
Classical,
PostQuantum,
#[default]
HardenedPQ,
EntropyEnhanced,
QuantumSecured,
HybridQuantum,
}
#[allow(deprecated)]
impl SecurityTier {
pub fn detect_available() -> Self {
if std::env::var("QSSH_QKD_ENDPOINT").is_ok() {
SecurityTier::QuantumSecured
} else if std::env::var("QSSH_QRNG_ENDPOINT").is_ok() {
SecurityTier::EntropyEnhanced
} else {
SecurityTier::HardenedPQ }
}
pub fn requires_quantum_hardware(&self) -> bool {
matches!(self, SecurityTier::QuantumSecured | SecurityTier::HybridQuantum)
}
pub fn requires_qrng(&self) -> bool {
matches!(self,
SecurityTier::EntropyEnhanced |
SecurityTier::QuantumSecured |
SecurityTier::HybridQuantum
)
}
pub fn frame_size(&self) -> Option<usize> {
match self {
SecurityTier::Classical | SecurityTier::PostQuantum => None, _ => Some(768), }
}
pub fn algorithms(&self) -> Vec<&'static str> {
match self {
SecurityTier::Classical => vec!["RSA-2048", "ECDSA-P256"],
SecurityTier::PostQuantum => vec!["Falcon-512", "SPHINCS+"],
SecurityTier::HardenedPQ => vec!["Falcon-512", "SPHINCS+", "AES-256-GCM"],
SecurityTier::EntropyEnhanced => vec!["Falcon-512", "SPHINCS+", "AES-256-GCM", "QRNG"],
SecurityTier::QuantumSecured => vec!["QKD", "Falcon-512", "SPHINCS+", "AES-256-GCM"],
SecurityTier::HybridQuantum => vec!["QKD", "Falcon-512", "SPHINCS+", "RSA-3072", "AES-256-GCM"],
}
}
pub fn performance_factor(&self) -> f32 {
match self {
SecurityTier::Classical => 1.0, SecurityTier::PostQuantum => 0.95, SecurityTier::HardenedPQ => 0.85, SecurityTier::EntropyEnhanced => 0.80, SecurityTier::QuantumSecured => 0.70, SecurityTier::HybridQuantum => 0.60, }
}
pub fn security_bits(&self) -> &'static str {
match self {
SecurityTier::Classical => "112 bits (breakable by quantum)",
SecurityTier::PostQuantum => "128 bits (quantum-resistant)",
SecurityTier::HardenedPQ => "128 bits + traffic analysis resistance",
SecurityTier::EntropyEnhanced => "128 bits + true randomness",
SecurityTier::QuantumSecured => "Information-theoretic (unbreakable keys)",
SecurityTier::HybridQuantum => "Maximum available (belt & suspenders)",
}
}
}
#[allow(deprecated)]
impl fmt::Display for SecurityTier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SecurityTier::Classical => write!(f, "T0: Classical (DEPRECATED)"),
SecurityTier::PostQuantum => write!(f, "T1: Post-Quantum"),
SecurityTier::HardenedPQ => write!(f, "T2: Hardened PQ"),
SecurityTier::EntropyEnhanced => write!(f, "T3: Entropy-Enhanced"),
SecurityTier::QuantumSecured => write!(f, "T4: Quantum-Secured"),
SecurityTier::HybridQuantum => write!(f, "T5: Hybrid Quantum"),
}
}
}
#[cfg(test)]
#[allow(deprecated)]
mod tests {
use super::*;
#[test]
fn test_tier_ordering() {
assert!(SecurityTier::Classical < SecurityTier::PostQuantum);
assert!(SecurityTier::PostQuantum < SecurityTier::HardenedPQ);
assert!(SecurityTier::HardenedPQ < SecurityTier::EntropyEnhanced);
assert!(SecurityTier::EntropyEnhanced < SecurityTier::QuantumSecured);
assert!(SecurityTier::QuantumSecured < SecurityTier::HybridQuantum);
}
#[test]
fn test_frame_sizes() {
assert_eq!(SecurityTier::Classical.frame_size(), None);
assert_eq!(SecurityTier::PostQuantum.frame_size(), None);
assert_eq!(SecurityTier::HardenedPQ.frame_size(), Some(768));
assert_eq!(SecurityTier::EntropyEnhanced.frame_size(), Some(768));
}
#[test]
fn test_performance_impact() {
assert!(SecurityTier::Classical.performance_factor() >
SecurityTier::HybridQuantum.performance_factor());
}
}