#[cfg(kani)]
mod verification {
use crate::encryption::Nonce;
use crate::{EncryptionKey, SigningKey, chain_hash, crc32};
#[kani::proof]
#[kani::unwind(5)]
fn verify_chain_hash_deterministic() {
let data = b"test data";
let hash1 = chain_hash(None, data);
let hash2 = chain_hash(None, data);
assert_eq!(hash1, hash2);
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_chain_hash_non_zero() {
let data = b"any data";
let hash = chain_hash(None, data);
assert_ne!(hash.as_bytes(), &[0u8; 32]);
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_chain_hash_prev_affects_output() {
let data = b"payload";
let hash_without_prev = chain_hash(None, data);
let prev = chain_hash(None, b"previous");
let hash_with_prev = chain_hash(Some(&prev), data);
assert_ne!(hash_without_prev, hash_with_prev);
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_chain_hash_collision_resistance() {
let hash1 = chain_hash(None, b"data1");
let hash2 = chain_hash(None, b"data2");
assert_ne!(hash1, hash2);
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_crc32_deterministic() {
let data = b"test data for crc";
let crc1 = crc32(data);
let crc2 = crc32(data);
assert_eq!(crc1, crc2);
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_crc32_different_data() {
let crc1 = crc32(b"data1");
let crc2 = crc32(b"data2");
assert_ne!(crc1, crc2);
}
#[kani::proof]
#[kani::unwind(5)]
fn verify_crc32_single_bit_detection() {
let data1 = b"test data";
let mut data2 = *data1;
data2[0] ^= 0x01;
let crc1 = crc32(data1);
let crc2 = crc32(&data2);
assert_ne!(crc1, crc2);
}
#[kani::proof]
#[kani::unwind(3)]
fn verify_encryption_key_from_bytes() {
let key_bytes = [0x42u8; 32]; let key = EncryptionKey::from_bytes(&key_bytes);
assert_eq!(key.to_bytes(), key_bytes);
}
#[kani::proof]
#[kani::unwind(3)]
fn verify_signing_key_generation() {
let key_bytes = [0x42u8; 32]; let signing_key = SigningKey::from_bytes(&key_bytes);
let verifying_key = signing_key.verifying_key();
assert_eq!(signing_key.to_bytes().len(), 32);
assert_eq!(verifying_key.to_bytes().len(), 32);
}
#[kani::proof]
#[kani::unwind(3)]
fn verify_nonce_from_position_unique() {
let pos1: u64 = kani::any();
let pos2: u64 = kani::any();
kani::assume(pos1 != pos2);
kani::assume(pos1 < 1000);
kani::assume(pos2 < 1000);
let nonce1 = Nonce::from_position(pos1);
let nonce2 = Nonce::from_position(pos2);
assert_ne!(nonce1.to_bytes(), nonce2.to_bytes());
}
#[kani::proof]
#[kani::unwind(3)]
fn verify_nonce_from_position_deterministic() {
let position: u64 = kani::any();
kani::assume(position < 1000);
let nonce1 = Nonce::from_position(position);
let nonce2 = Nonce::from_position(position);
assert_eq!(nonce1.to_bytes(), nonce2.to_bytes());
}
#[kani::proof]
#[kani::unwind(3)]
fn verify_nonce_non_zero() {
let position: u64 = kani::any();
kani::assume(position < 1000);
let nonce = Nonce::from_position(position);
assert_ne!(nonce.to_bytes(), [0u8; 12]);
}
}