use crate::protocols::handshake::ServerHelloParser;
use crate::protocols::{Extension, Protocol};
#[cfg(kani)]
#[kani::proof]
#[kani::unwind(100)]
fn proof_server_hello_parse_no_panic() {
let len: usize = kani::any();
kani::assume(len <= 64);
let mut data: [u8; 64] = [0u8; 64];
for i in 0..64 {
data[i] = kani::any();
}
let _ = ServerHelloParser::parse(&data[..len]);
}
#[cfg(kani)]
#[kani::proof]
#[kani::unwind(100)]
fn proof_server_hello_parse_with_tls_header() {
let len: usize = kani::any();
kani::assume(len >= 6 && len <= 64);
let mut data: [u8; 64] = [0u8; 64];
data[0] = 0x16;
let version_major: u8 = kani::any();
let version_minor: u8 = kani::any();
kani::assume(version_major == 0x03); kani::assume(version_minor <= 0x04);
data[1] = version_major;
data[2] = version_minor;
let record_len: u16 = kani::any();
kani::assume((record_len as usize) <= len.saturating_sub(5));
data[3] = (record_len >> 8) as u8;
data[4] = (record_len & 0xff) as u8;
for i in 5..len {
data[i] = kani::any();
}
let _ = ServerHelloParser::parse(&data[..len]);
}
#[cfg(kani)]
#[kani::proof]
#[kani::unwind(32)]
fn proof_extension_new_no_panic() {
let extension_type: u16 = kani::any();
let data_len: usize = kani::any();
kani::assume(data_len <= 16);
let mut data: [u8; 16] = [0u8; 16];
for i in 0..data_len {
data[i] = kani::any();
}
let ext = Extension::new(extension_type, data[..data_len].to_vec());
kani::assert(ext.extension_type == extension_type, "Extension type must match");
}
#[cfg(kani)]
#[kani::proof]
fn proof_protocol_from_u16_total() {
let value: u16 = kani::any();
let protocol = Protocol::from(value);
let _ = protocol.name();
let _ = protocol.as_hex();
let _ = protocol.is_deprecated();
}
#[cfg(kani)]
#[kani::proof]
fn proof_protocol_hex_roundtrip() {
let idx: u8 = kani::any();
kani::assume(idx < 7);
let protocol = match idx {
0 => Protocol::SSLv2,
1 => Protocol::SSLv3,
2 => Protocol::TLS10,
3 => Protocol::TLS11,
4 => Protocol::TLS12,
5 => Protocol::TLS13,
_ => Protocol::QUIC,
};
let hex = protocol.as_hex();
let roundtrip = Protocol::from(hex);
match protocol {
Protocol::SSLv2
| Protocol::SSLv3
| Protocol::TLS10
| Protocol::TLS11
| Protocol::TLS12
| Protocol::TLS13 => {
kani::assert(roundtrip == protocol, "Known protocol roundtrip must match");
}
Protocol::QUIC => {
}
}
}
#[cfg(kani)]
#[kani::proof]
#[kani::unwind(100)]
fn proof_check_heartbeat_extension_no_panic() {
let len: usize = kani::any();
kani::assume(len <= 32);
let mut data: [u8; 32] = [0u8; 32];
for i in 0..len {
data[i] = kani::any();
}
let result = if len < 2 {
false
} else {
let mut found = false;
for i in 0..len.saturating_sub(1) {
if data[i] == 0x00 && data[i + 1] == 0x0f {
found = true;
break;
}
}
found
};
let _ = result;
}
#[cfg(kani)]
#[kani::proof]
fn proof_tls_version_parsing() {
let high_byte: u8 = kani::any();
let low_byte: u8 = kani::any();
let version = u16::from_be_bytes([high_byte, low_byte]);
let protocol = Protocol::from(version);
let _name = protocol.name();
let _hex = protocol.as_hex();
}