use tap_agent::crypto::{derive_key_ecdh_es, unwrap_key_aes_kw, wrap_key_aes_kw};
#[test]
fn test_key_wrap_is_not_xor() {
let kek = [0x00u8; 32]; let plaintext_key = [0xFFu8; 32];
let wrapped = wrap_key_aes_kw(&kek, &plaintext_key).expect("wrap should succeed");
assert_ne!(
&wrapped[..32],
&plaintext_key[..],
"Key wrapping must not be simple XOR"
);
assert_eq!(
wrapped.len(),
40,
"AES-KW output for 256-bit key should be 40 bytes"
);
}
#[test]
fn test_key_wrap_unwrap_roundtrip() {
let kek = [0x42u8; 32];
let plaintext_key = [0xABu8; 32];
let wrapped = wrap_key_aes_kw(&kek, &plaintext_key).expect("wrap should succeed");
let unwrapped = unwrap_key_aes_kw(&kek, &wrapped).expect("unwrap should succeed");
assert_eq!(
&unwrapped[..],
&plaintext_key[..],
"Unwrapped key must match original"
);
}
#[test]
fn test_key_unwrap_fails_with_wrong_kek() {
let kek1 = [0x42u8; 32];
let kek2 = [0x43u8; 32];
let plaintext_key = [0xABu8; 32];
let wrapped = wrap_key_aes_kw(&kek1, &plaintext_key).expect("wrap should succeed");
let result = unwrap_key_aes_kw(&kek2, &wrapped);
assert!(result.is_err(), "Unwrap with wrong KEK must fail");
}
#[test]
fn test_key_unwrap_detects_tampering() {
let kek = [0x42u8; 32];
let plaintext_key = [0xABu8; 32];
let mut wrapped = wrap_key_aes_kw(&kek, &plaintext_key).expect("wrap should succeed");
wrapped[0] ^= 0xFF;
let result = unwrap_key_aes_kw(&kek, &wrapped);
assert!(result.is_err(), "Unwrap of tampered ciphertext must fail");
}
#[test]
fn test_ecdh_kdf_output_length() {
let shared_secret = [0x42u8; 32];
let apu = b"Alice";
let apv = b"Bob";
let derived = derive_key_ecdh_es(&shared_secret, apu, apv, 256).expect("KDF should succeed");
assert_eq!(
derived.len(),
32,
"Derived key should be 32 bytes for 256 bits"
);
}
#[test]
fn test_ecdh_kdf_is_context_bound() {
let shared_secret = [0x42u8; 32];
let key1 =
derive_key_ecdh_es(&shared_secret, b"Alice", b"Bob", 256).expect("KDF should succeed");
let key2 =
derive_key_ecdh_es(&shared_secret, b"Alice", b"Charlie", 256).expect("KDF should succeed");
assert_ne!(
&key1[..],
&key2[..],
"Different APV must produce different derived keys"
);
}
#[test]
fn test_ecdh_kdf_is_deterministic() {
let shared_secret = [0x42u8; 32];
let key1 =
derive_key_ecdh_es(&shared_secret, b"Alice", b"Bob", 256).expect("KDF should succeed");
let key2 =
derive_key_ecdh_es(&shared_secret, b"Alice", b"Bob", 256).expect("KDF should succeed");
assert_eq!(
&key1[..],
&key2[..],
"Same inputs must produce same derived key"
);
}
#[test]
fn test_key_wrap_unwrap_various_keys() {
use rand::Rng;
let mut rng = rand::thread_rng();
for _ in 0..10 {
let mut kek = [0u8; 32];
let mut plaintext = [0u8; 32];
rng.fill(&mut kek);
rng.fill(&mut plaintext);
let wrapped = wrap_key_aes_kw(&kek, &plaintext).expect("wrap should succeed");
let unwrapped = unwrap_key_aes_kw(&kek, &wrapped).expect("unwrap should succeed");
assert_eq!(
&unwrapped[..],
&plaintext[..],
"Round-trip must preserve key"
);
}
}