use ruvix_cap::{
verify_boot_signature_or_panic, verify_signature, BootSignature, BootVerifier,
SignatureAlgorithm, SignatureVerifyResult, TrustedKey, TrustedKeyStore,
};
fn create_valid_signature() -> BootSignature {
let mut signature = [0u8; 64];
signature[0] = 0x42;
BootSignature::ed25519(
signature,
[1u8; 32], [2u8; 32], )
}
fn create_trusted_store() -> TrustedKeyStore {
let mut store = TrustedKeyStore::new();
store.add_key(TrustedKey::permanent([1u8; 32], 1));
store
}
#[test]
fn test_sec001_valid_signature_does_not_panic() {
let signature = create_valid_signature();
let store = create_trusted_store();
verify_boot_signature_or_panic(&signature, &[], &store, 0);
}
#[test]
#[should_panic(expected = "SECURITY VIOLATION [SEC-001]")]
fn test_sec001_invalid_signature_panics() {
let signature = BootSignature::ed25519(
[0u8; 64], [1u8; 32], [2u8; 32],
);
let store = create_trusted_store();
verify_boot_signature_or_panic(&signature, &[], &store, 0);
}
#[test]
#[should_panic(expected = "SECURITY VIOLATION [SEC-001]")]
fn test_sec001_untrusted_key_panics() {
let signature = BootSignature::ed25519(
[1u8; 64], [99u8; 32], [2u8; 32],
);
let store = create_trusted_store();
verify_boot_signature_or_panic(&signature, &[], &store, 0);
}
#[test]
fn test_sec001_verify_returns_correct_error_codes() {
let store = create_trusted_store();
let sig = BootSignature::ed25519([1u8; 64], [99u8; 32], [0u8; 32]);
assert_eq!(
verify_signature(&sig, &[], &store, 0),
SignatureVerifyResult::UntrustedKey
);
let sig = BootSignature::ed25519([0u8; 64], [1u8; 32], [0u8; 32]);
assert_eq!(
verify_signature(&sig, &[], &store, 0),
SignatureVerifyResult::Invalid
);
let sig = create_valid_signature();
assert_eq!(
verify_signature(&sig, &[], &store, 0),
SignatureVerifyResult::Valid
);
}
#[test]
fn test_sec001_trusted_key_expiry() {
let mut store = TrustedKeyStore::new();
store.add_key(TrustedKey::new([1u8; 32], 1, 1000));
let sig = create_valid_signature();
assert_eq!(
verify_signature(&sig, &[], &store, 500),
SignatureVerifyResult::Valid
);
assert_eq!(
verify_signature(&sig, &[], &store, 2000),
SignatureVerifyResult::UntrustedKey
);
}
#[test]
#[should_panic(expected = "SECURITY VIOLATION [SEC-001]")]
fn test_sec001_expired_key_panics() {
let mut store = TrustedKeyStore::new();
store.add_key(TrustedKey::new([1u8; 32], 1, 1000));
let sig = create_valid_signature();
verify_boot_signature_or_panic(&sig, &[], &store, 2000);
}
#[test]
fn test_sec001_key_store_capacity() {
let mut store = TrustedKeyStore::new();
for i in 0..8 {
let key = TrustedKey::permanent([i as u8; 32], i as u64);
assert!(store.add_key(key), "Should add key {}", i);
}
let key = TrustedKey::permanent([99u8; 32], 99);
assert!(!store.add_key(key), "Should reject 9th key");
}
#[test]
fn test_sec001_permanent_key_never_expires() {
let key = TrustedKey::permanent([0u8; 32], 1);
assert!(!key.is_expired(0));
assert!(!key.is_expired(u64::MAX)); }
#[test]
fn test_sec001_boot_verifier_valid() {
let store = create_trusted_store();
let verifier = BootVerifier::new(store);
let sig = create_valid_signature();
verifier.verify_or_panic(&sig, &[], 0);
}
#[test]
fn test_sec001_signature_algorithms() {
assert_eq!(SignatureAlgorithm::Ed25519 as u8, 0);
assert_eq!(SignatureAlgorithm::EcdsaP256 as u8, 1);
assert_eq!(SignatureAlgorithm::RsaPss2048 as u8, 2);
assert_eq!(SignatureAlgorithm::MlDsa as u8, 3);
}
#[test]
fn test_sec001_unsupported_algorithm() {
let store = create_trusted_store();
let sig = BootSignature::new(
SignatureAlgorithm::RsaPss2048,
[1u8; 64],
[1u8; 32],
[0u8; 32],
);
assert_eq!(
verify_signature(&sig, &[], &store, 0),
SignatureVerifyResult::UnsupportedAlgorithm
);
}
#[test]
#[should_panic(expected = "SECURITY VIOLATION [SEC-001]")]
fn test_sec001_unsupported_algorithm_panics() {
let store = create_trusted_store();
let sig = BootSignature::new(
SignatureAlgorithm::MlDsa, [1u8; 64],
[1u8; 32],
[0u8; 32],
);
verify_boot_signature_or_panic(&sig, &[], &store, 0);
}