use ciphern::memory::{ProtectedKey, SecretBytes};
#[test]
fn test_secret_bytes_zeroized() {
let original = vec![0x42u8; 32];
{
let secret = SecretBytes::new(original.clone()).unwrap();
assert_eq!(secret.as_bytes(), &original);
}
println!("SecretBytes dropped, memory should be zeroized");
}
#[test]
fn test_memory_tampering_detected() {
let secret = SecretBytes::new(vec![0u8; 32]).unwrap();
let protected = ProtectedKey::new(secret.clone());
assert!(protected.access().is_ok());
let corrupted_protected = ProtectedKey::create_with_corrupted_checksum(secret, 0xDEADBEEF);
assert!(corrupted_protected.access().is_err());
match corrupted_protected.access() {
Err(ciphern::error::CryptoError::MemoryTampered) => {
println!("Tampering detected correctly!");
}
_ => panic!("Expected MemoryTampered error"),
}
let secret2 = SecretBytes::new(vec![1u8; 32]).unwrap();
let protected2 = ProtectedKey::new(secret2);
assert!(protected2.access().is_ok());
let cloned = protected2.clone();
assert!(cloned.access().is_ok());
}
#[test]
fn test_secret_bytes_cloning() {
let original_data = vec![0xABu8; 64];
let secret1 = SecretBytes::new(original_data.clone()).unwrap();
let secret2 = secret1.clone();
assert_eq!(secret1.as_bytes(), secret2.as_bytes());
assert_eq!(secret1.as_bytes(), &original_data);
}
#[test]
fn test_protected_key_creation() {
let secret = SecretBytes::new(vec![0x55u8; 32]).unwrap();
let protected = ProtectedKey::new(secret);
let accessed_secret = protected.access().unwrap();
assert_eq!(accessed_secret.as_bytes(), &[0x55u8; 32]);
}
#[test]
fn test_memory_locking() {
let data = vec![0x77u8; 128];
let result = SecretBytes::new(data);
#[cfg(unix)]
assert!(result.is_ok());
#[cfg(not(unix))]
{
let _secret = result.unwrap();
println!("Memory locking not supported on this platform, using zeroize fallback");
}
}
#[test]
fn test_zeroize_on_drop() {
use std::sync::atomic::{AtomicBool, Ordering};
static DROPPED: AtomicBool = AtomicBool::new(false);
struct TestDrop {
data: Vec<u8>,
}
impl Drop for TestDrop {
fn drop(&mut self) {
DROPPED.store(true, Ordering::SeqCst);
self.data.fill(0);
}
}
{
let _test = TestDrop {
data: vec![0xFFu8; 32],
};
}
assert!(DROPPED.load(Ordering::SeqCst));
println!("Drop implementation verified - data should be zeroized");
}