use qssh::vault::{QuantumVault, KeyType, DoubleRatchet, LamportKeypair};
#[tokio::test]
async fn test_vault_initialization() {
let mut vault = QuantumVault::new();
assert!(vault.get_key("test").await.is_err());
vault.init(b"test-master-key").await.unwrap();
let test_key = b"my-secret-key";
vault.store_key("test", test_key, KeyType::SessionKey, 0).await.unwrap();
let retrieved = vault.get_key("test").await.unwrap();
assert_eq!(test_key.to_vec(), retrieved);
}
#[tokio::test]
async fn test_one_time_keys() {
let mut vault = QuantumVault::new();
vault.init(b"test-master-key").await.unwrap();
let otk = b"one-time-key";
vault.store_key("otk", otk, KeyType::LamportSeed, 1).await.unwrap();
let first = vault.get_key("otk").await.unwrap();
assert_eq!(otk.to_vec(), first);
assert!(vault.get_key("otk").await.is_err());
}
#[test]
fn test_double_ratchet() {
let mut ratchet = DoubleRatchet::new(b"initial-root-key");
let mut keys = Vec::new();
for _ in 0..10 {
keys.push(ratchet.next_key());
}
let unique_keys: std::collections::HashSet<_> = keys.iter().collect();
assert_eq!(unique_keys.len(), 10);
}
#[test]
fn test_ratchet_dh_step() {
let mut alice = DoubleRatchet::new(b"shared-root");
let mut bob = DoubleRatchet::new(b"shared-root");
let alice_send1 = alice.next_send_key();
let alice_send2 = alice.next_send_key();
assert_ne!(alice_send1, alice_send2);
let alice_key_before = alice.next_send_key();
let bob_key_before = bob.next_send_key();
alice.dh_ratchet(b"new-dh-secret");
bob.dh_ratchet(b"new-dh-secret");
let alice_key_after = alice.next_send_key();
let bob_key_after = bob.next_send_key();
assert_ne!(alice_key_before, alice_key_after);
assert_ne!(bob_key_before, bob_key_after);
}
#[test]
fn test_lamport_signature() {
let seed = [42u8; 32];
let mut keypair = LamportKeypair::generate(&seed);
let public_key = keypair.public_key_bytes();
let message = b"Critical blockchain operation";
let signature = keypair.sign(message).unwrap();
assert!(LamportKeypair::verify(&public_key, message, &signature));
assert!(!LamportKeypair::verify(&public_key, b"Different message", &signature));
assert!(keypair.sign(b"Another message").is_err());
}
#[tokio::test]
async fn test_lamport_chain_in_vault() {
let mut vault = QuantumVault::new();
vault.init(b"test-master-key").await.unwrap();
vault.init_lamport_chain("attestations", b"chain-seed", 5).await.unwrap();
for i in 0..5 {
let mut keypair = vault.get_lamport_keypair("attestations").await.unwrap();
let message = format!("Attestation {}", i);
let sig = keypair.sign(message.as_bytes()).unwrap();
}
assert!(vault.get_lamport_keypair("attestations").await.is_err());
}
#[tokio::test]
async fn test_ratchet_in_vault() {
let mut vault = QuantumVault::new();
vault.init(b"test-master-key").await.unwrap();
vault.create_ratchet("session-1", b"initial-key").await.unwrap();
let key1 = vault.ratchet_forward("session-1").await.unwrap();
let key2 = vault.ratchet_forward("session-1").await.unwrap();
let key3 = vault.ratchet_forward("session-1").await.unwrap();
assert_ne!(key1, key2);
assert_ne!(key2, key3);
assert_ne!(key1, key3);
}