#![deny(unsafe_code)]
#![deny(missing_docs)]
use crate::tls::{TlsConfig, TlsMode};
pub struct KaniProofs {
harnesses: Vec<&'static str>,
}
impl KaniProofs {
#[must_use]
pub fn new() -> Self {
Self {
harnesses: vec![
"verify_mode_selection_deterministic",
"verify_security_level_mapping",
"verify_config_validation_soundness",
],
}
}
#[must_use]
pub fn harnesses(&self) -> &[&'static str] {
&self.harnesses
}
#[must_use]
pub fn verify_mode_determinism(mode: TlsMode) -> bool {
let config1 = TlsConfig { mode, ..TlsConfig::default() };
let config2 = TlsConfig { mode, ..TlsConfig::default() };
config1.mode == config2.mode
}
#[must_use]
pub fn verify_default_is_hybrid() -> bool {
let config = TlsConfig::default();
config.mode == TlsMode::Hybrid
}
#[must_use]
pub fn verify_default_validates() -> bool {
let config = TlsConfig::default();
config.validate().is_ok()
}
}
impl Default for KaniProofs {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_kani_proofs_harness_list_succeeds() {
let proofs = KaniProofs::new();
assert_eq!(proofs.harnesses().len(), 3);
assert!(proofs.harnesses().contains(&"verify_mode_selection_deterministic"));
}
#[test]
fn test_verify_mode_determinism_all_modes_is_deterministic() {
assert!(KaniProofs::verify_mode_determinism(TlsMode::Classic));
assert!(KaniProofs::verify_mode_determinism(TlsMode::Hybrid));
assert!(KaniProofs::verify_mode_determinism(TlsMode::Pq));
}
#[test]
fn test_verify_default_is_hybrid_succeeds() {
assert!(KaniProofs::verify_default_is_hybrid());
}
#[test]
fn test_verify_default_validates_succeeds() {
assert!(KaniProofs::verify_default_validates());
}
#[test]
fn test_kani_proofs_default_succeeds() {
let proofs = KaniProofs::default();
assert!(!proofs.harnesses().is_empty());
}
}