use std::time::Instant;
use lib_q_aead::timing::{
TimingProtection,
protect_timing_with_timing,
set_timing_protection,
};
use lib_q_aead::validation::{
InputValidator,
ValidationConfig,
set_input_validator,
};
use lib_q_aead::*;
use lib_q_core::{
AeadKey,
Algorithm,
Nonce,
};
fn test_key_for_security(algorithm: Algorithm) -> AeadKey {
match algorithm {
Algorithm::RomulusN | Algorithm::RomulusM => {
AeadKey::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
}
_ => AeadKey::new(vec![
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
]),
}
}
fn invalid_key_wrong_size(algorithm: Algorithm) -> AeadKey {
match algorithm {
Algorithm::RomulusN | Algorithm::RomulusM => AeadKey::new(vec![0u8; 32]),
_ => AeadKey::new(vec![0u8; 16]),
}
}
#[test]
fn test_constant_time_operations() {
use lib_q_aead::security::constant_time::*;
let a = [1, 2, 3, 4, 5];
let b = [1, 2, 3, 4, 5];
let c = [1, 2, 3, 4, 6];
assert!(constant_time_eq(&a, &b));
assert!(!constant_time_eq(&a, &c));
let result1 = constant_time_select(true, 42u8, 24u8);
let result2 = constant_time_select(false, 42u8, 24u8);
assert_eq!(result1, 42);
assert_eq!(result2, 24);
let src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
constant_time_copy(true, &src, &mut dst);
assert_eq!(dst, src);
let mut dst2 = [0; 5];
constant_time_copy(false, &src, &mut dst2);
assert_eq!(dst2, [0; 5]);
let mut data = [1, 2, 3, 4, 5];
constant_time_zero(true, &mut data);
assert_eq!(data, [0; 5]);
let mut data2 = [1, 2, 3, 4, 5];
constant_time_zero(false, &mut data2);
assert_eq!(data2, [1, 2, 3, 4, 5]);
let mut a = 42u8;
let mut b = 24u8;
constant_time_swap(true, &mut a, &mut b);
assert_eq!(a, 24);
assert_eq!(b, 42);
let mut c = 10u8;
let mut d = 20u8;
constant_time_swap(false, &mut c, &mut d);
assert_eq!(c, 10);
assert_eq!(d, 20);
}
#[test]
fn test_memory_safety_operations() {
use lib_q_aead::security::memory::*;
let mut data = [1, 2, 3, 4, 5];
secure_zero(&mut data);
assert_eq!(data, [0; 5]);
let mut data = [1, 2, 3, 4, 5];
secure_zero_slice(&mut data);
assert_eq!(data, [0; 5]);
let src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
secure_copy(&mut dst, &src);
assert_eq!(dst, src);
let src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
secure_copy_slice(&mut dst, &src);
assert_eq!(dst, src);
let mut src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
secure_move(&mut dst, &mut src);
assert_eq!(dst, [1, 2, 3, 4, 5]);
assert_eq!(src, [0; 5]);
let mut src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
secure_move_slice(&mut dst, &mut src);
assert_eq!(dst, [1, 2, 3, 4, 5]);
assert_eq!(src, [0; 5]);
let a = [1, 2, 3, 4, 5];
let b = [1, 2, 3, 4, 5];
let c = [1, 2, 3, 4, 6];
assert!(secure_compare(&a, &b));
assert!(!secure_compare(&a, &c));
let a = [1, 2, 3, 4, 5];
let b = [1, 2, 3, 4, 5];
let c = [1, 2, 3, 4, 6];
assert!(secure_compare_slice(&a, &b));
assert!(!secure_compare_slice(&a, &c));
let mut data = [0u8; 5];
secure_fill(&mut data, 42);
assert_eq!(data, [42; 5]);
let mut data = [0; 5];
secure_fill_slice(&mut data, 42);
assert_eq!(data, [42; 5]);
let mut a = [0b1010, 0b1100, 0b1111];
let b = [0b1100, 0b1010, 0b0000];
secure_xor(&mut a, &b);
assert_eq!(a, [0b0110, 0b0110, 0b1111]);
let mut a = [0b1010, 0b1100, 0b1111];
let b = [0b1100, 0b1010, 0b0000];
secure_xor_slice(&mut a, &b);
assert_eq!(a, [0b0110, 0b0110, 0b1111]);
}
#[test]
fn test_input_validation() {
use lib_q_aead::security::validation::*;
let validator = InputValidator::new();
let valid_key = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
assert!(validator.validate_key(&valid_key).is_ok());
let empty_key = [];
assert!(validator.validate_key(&empty_key).is_err());
let zero_key = [0; 16];
assert!(validator.validate_key(&zero_key).is_err());
let all_ones_key = [0xFF; 16];
assert!(validator.validate_key(&all_ones_key).is_err());
let repeated_pattern_key = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2];
assert!(validator.validate_key(&repeated_pattern_key).is_err());
let valid_nonce = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
assert!(validator.validate_nonce(&valid_nonce).is_ok());
let empty_nonce = [];
assert!(validator.validate_nonce(&empty_nonce).is_err());
let zero_nonce = [0; 16];
assert!(validator.validate_nonce(&zero_nonce).is_err());
let all_ones_nonce = [0xFF; 16];
assert!(validator.validate_nonce(&all_ones_nonce).is_err());
let valid_plaintext = b"Hello, World!";
assert!(validator.validate_plaintext(valid_plaintext).is_ok());
let valid_ciphertext = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
assert!(validator.validate_ciphertext(&valid_ciphertext).is_ok());
let empty_ciphertext = [];
assert!(validator.validate_ciphertext(&empty_ciphertext).is_err());
let valid_associated_data = b"metadata";
assert!(
validator
.validate_associated_data(valid_associated_data)
.is_ok()
);
assert!(validator.validate_key_size(32, 32).is_ok());
assert!(validator.validate_key_size(16, 32).is_err());
assert!(validator.validate_nonce_size(16, 16).is_ok());
assert!(validator.validate_nonce_size(12, 16).is_err());
}
#[test]
fn test_side_channel_protection() {
use lib_q_aead::security::side_channel::*;
let protection = SideChannelProtection::new();
let a = [1, 2, 3, 4];
let b = [1, 2, 3, 4];
let c = [1, 2, 3, 5];
assert!(protection.secure_key_compare(&a, &b));
assert!(!protection.secure_key_compare(&a, &c));
let a = [1, 2, 3, 4];
let b = [5, 6, 7, 8];
#[cfg(feature = "alloc")]
{
let result1 = protection.secure_key_select(1, &a, &b);
assert_eq!(result1, a);
let result0 = protection.secure_key_select(0, &a, &b);
assert_eq!(result0, b);
}
#[cfg(not(feature = "alloc"))]
{
let mut result = [0; 4];
protection.secure_key_select(1, &a, &b, &mut result);
assert_eq!(result, a);
protection.secure_key_select(0, &a, &b, &mut result);
assert_eq!(result, b);
}
let data = [1, 2, 3, 4, 5];
assert_eq!(protection.secure_memory_access(&data, 2), Some(&3));
assert_eq!(protection.secure_memory_access(&data, 10), None);
let mut executed = false;
let result = protection.secure_conditional_execute(true, || {
executed = true;
true
});
assert!(result);
assert!(executed);
let mut executed = false;
protection.secure_conditional_execute_no_return(true, || {
executed = true;
});
assert!(executed);
let mut count = 0;
protection.secure_loop(5, |_| {
count += 1;
true
});
assert_eq!(count, 5);
let array = [1, 2, 3, 4, 5];
assert_eq!(protection.secure_array_access(&array, 2), Some(&3));
assert_eq!(protection.secure_array_access(&array, 10), None);
assert!(protection.secure_string_compare("hello", "hello"));
assert!(!protection.secure_string_compare("hello", "world"));
assert!(protection.secure_integer_compare(42, 42));
assert!(!protection.secure_integer_compare(42, 24));
assert_eq!(protection.secure_integer_add(10, 5), 15);
assert_eq!(protection.secure_integer_sub(10, 5), 5);
assert_eq!(protection.secure_integer_mul(10, 5), 50);
assert_eq!(protection.secure_integer_div(10, 5), 2);
assert_eq!(protection.secure_integer_mod(10, 5), 0);
assert_eq!(protection.secure_bitwise_and(0b1010, 0b1100), 0b1000);
assert_eq!(protection.secure_bitwise_or(0b1010, 0b1100), 0b1110);
assert_eq!(protection.secure_bitwise_xor(0b1010, 0b1100), 0b0110);
assert_eq!(protection.secure_bitwise_not(0b1010), !0b1010);
assert_eq!(protection.secure_left_shift(0b1010, 2), 0b101000);
assert_eq!(protection.secure_right_shift(0b1010, 2), 0b10);
assert_eq!(protection.secure_rotate_left(0b1010, 2), 0b101000);
assert_eq!(
protection.secure_rotate_right(0b1010, 2),
0b1010u64.rotate_right(2)
);
let mut value = 42u64;
protection.secure_conditional_assign(true, &mut value, 24);
assert_eq!(value, 24);
protection.secure_conditional_assign(false, &mut value, 100);
assert_eq!(value, 24);
let mut value = 42u64;
protection.secure_conditional_increment(true, &mut value);
assert_eq!(value, 43);
protection.secure_conditional_increment(false, &mut value);
assert_eq!(value, 43);
let mut value = 42u64;
protection.secure_conditional_decrement(true, &mut value);
assert_eq!(value, 41);
protection.secure_conditional_decrement(false, &mut value);
assert_eq!(value, 41);
let mut value = 42u64;
protection.secure_conditional_add(true, &mut value, 10);
assert_eq!(value, 52);
protection.secure_conditional_add(false, &mut value, 5);
assert_eq!(value, 52);
let mut value = 42u64;
protection.secure_conditional_subtract(true, &mut value, 10);
assert_eq!(value, 32);
protection.secure_conditional_subtract(false, &mut value, 5);
assert_eq!(value, 32);
let mut value = 42u64;
protection.secure_conditional_multiply(true, &mut value, 2);
assert_eq!(value, 84);
protection.secure_conditional_multiply(false, &mut value, 3);
assert_eq!(value, 84);
let mut value = 42u64;
protection.secure_conditional_divide(true, &mut value, 2);
assert_eq!(value, 21);
protection.secure_conditional_divide(false, &mut value, 3);
assert_eq!(value, 21);
let mut value = 42u64;
protection.secure_conditional_modulo(true, &mut value, 10);
assert_eq!(value, 2);
protection.secure_conditional_modulo(false, &mut value, 5);
assert_eq!(value, 2);
let mut value = 0b1010u64;
protection.secure_conditional_bitwise_and(true, &mut value, 0b1100);
assert_eq!(value, 0b1000);
protection.secure_conditional_bitwise_or(true, &mut value, 0b0010);
assert_eq!(value, 0b1010);
protection.secure_conditional_bitwise_xor(true, &mut value, 0b1111);
assert_eq!(value, 0b0101);
protection.secure_conditional_bitwise_not(true, &mut value);
assert_eq!(value, !0b0101);
let mut value = 0b1010u64;
protection.secure_conditional_left_shift(true, &mut value, 2);
assert_eq!(value, 0b101000);
protection.secure_conditional_right_shift(true, &mut value, 2);
assert_eq!(value, 0b1010);
protection.secure_conditional_rotate_left(true, &mut value, 2);
assert_eq!(value, 0b101000);
protection.secure_conditional_rotate_right(true, &mut value, 2);
assert_eq!(value, 0b1010);
}
#[test]
fn test_timing_attack_protection() {
use lib_q_aead::security::timing::*;
let protection = TimingProtection::new();
let result = protection.protect(|| 42);
assert_eq!(result, 42);
let (result, elapsed) = protection.protect_with_timing(|| 42);
assert_eq!(result, 42);
assert!(elapsed > 0);
let result = protect_timing(|| 42);
assert_eq!(result, 42);
let (result, elapsed) = protect_timing_with_timing(|| 42);
assert_eq!(result, 42);
assert!(elapsed > 0);
}
#[test]
fn test_aead_operations_with_security() {
let algorithms = available_algorithms();
for algorithm in algorithms {
let aead = create_aead(algorithm).unwrap();
let key = test_key_for_security(algorithm);
let nonce = Nonce::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
let plaintext = b"Hello, World!";
let associated_data = Some(b"metadata".as_slice());
let ciphertext = aead.encrypt(&key, &nonce, plaintext, associated_data);
assert!(ciphertext.is_ok());
let ciphertext = ciphertext.unwrap();
assert_eq!(ciphertext.len(), plaintext.len() + aead.tag_size());
let decrypted = aead.decrypt(&key, &nonce, &ciphertext, associated_data);
assert!(decrypted.is_ok());
assert_eq!(decrypted.unwrap(), plaintext);
let invalid_key = invalid_key_wrong_size(algorithm);
let invalid_nonce = Nonce::new(vec![0; 12]);
let result = aead.encrypt(&invalid_key, &nonce, plaintext, associated_data);
assert!(result.is_err());
let result = aead.encrypt(&key, &invalid_nonce, plaintext, associated_data);
assert!(result.is_err());
let mut tampered_ciphertext = ciphertext.clone();
tampered_ciphertext[0] ^= 0xFF;
let result = aead.decrypt(&key, &nonce, &tampered_ciphertext, associated_data);
assert!(result.is_err());
let wrong_associated_data = Some(b"wrong metadata".as_slice());
let result = aead.decrypt(&key, &nonce, &ciphertext, wrong_associated_data);
assert!(result.is_err());
}
}
#[test]
fn test_security_configuration() {
use lib_q_aead::security::*;
let config = SecurityConfig::default();
assert!(config.constant_time);
assert!(config.side_channel_protection);
assert!(config.secure_memory);
assert!(config.strict_validation);
assert!(config.timing_protection);
assert!(config.fault_injection_protection);
let config = SecurityConfig::strict();
assert!(config.constant_time);
assert!(config.side_channel_protection);
assert!(config.secure_memory);
assert!(config.strict_validation);
assert!(config.timing_protection);
assert!(config.fault_injection_protection);
let config = SecurityConfig::permissive();
assert!(!config.constant_time);
assert!(!config.side_channel_protection);
assert!(!config.secure_memory);
assert!(!config.strict_validation);
assert!(!config.timing_protection);
assert!(!config.fault_injection_protection);
let config = SecurityConfig::balanced();
assert!(config.constant_time);
assert!(config.side_channel_protection);
assert!(config.secure_memory);
assert!(config.strict_validation);
assert!(!config.timing_protection);
assert!(!config.fault_injection_protection);
let ctx = SecurityContext::with_config(SecurityConfig::default());
assert!(ctx.operation_id() > 0);
let _elapsed = ctx.elapsed_time();
assert!(ctx.constant_time_enabled());
assert!(ctx.side_channel_protection_enabled());
assert!(ctx.secure_memory_enabled());
assert!(ctx.strict_validation_enabled());
assert!(ctx.timing_protection_enabled());
assert!(ctx.fault_injection_protection_enabled());
let config = SecurityConfig::permissive();
let ctx = SecurityContext::with_config(config);
assert!(!ctx.constant_time_enabled());
assert!(!ctx.side_channel_protection_enabled());
assert!(!ctx.secure_memory_enabled());
assert!(!ctx.strict_validation_enabled());
assert!(!ctx.timing_protection_enabled());
assert!(!ctx.fault_injection_protection_enabled());
let original_config = get_security_config();
let new_config = SecurityConfig::permissive();
set_security_config(new_config);
let retrieved_config = get_security_config();
assert_eq!(retrieved_config, new_config);
set_security_config(original_config);
}
#[test]
fn test_comprehensive_security_integration() {
use lib_q_aead::security::*;
let strict_config = SecurityConfig::strict();
set_security_config(strict_config);
let validator = InputValidator::with_config(ValidationConfig::strict());
set_input_validator(validator);
let timing_protection = TimingProtection::strict();
set_timing_protection(timing_protection);
let algorithms = available_algorithms();
for algorithm in algorithms {
let aead = create_aead(algorithm).unwrap();
let key = test_key_for_security(algorithm);
let nonce = Nonce::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
let plaintext = b"Hello, World!";
let associated_data = Some(b"metadata".as_slice());
let (ciphertext, timing) =
protect_timing_with_timing(|| aead.encrypt(&key, &nonce, plaintext, associated_data));
assert!(ciphertext.is_ok());
assert!(timing > 0);
let ciphertext = ciphertext.unwrap();
assert_eq!(ciphertext.len(), plaintext.len() + aead.tag_size());
let (decrypted, timing) =
protect_timing_with_timing(|| aead.decrypt(&key, &nonce, &ciphertext, associated_data));
assert!(decrypted.is_ok());
assert!(timing > 0); assert_eq!(decrypted.unwrap(), plaintext);
let invalid_key = invalid_key_wrong_size(algorithm);
let invalid_nonce = Nonce::new(vec![0; 12]);
let result = aead.encrypt(&invalid_key, &nonce, plaintext, associated_data);
assert!(result.is_err());
let result = aead.encrypt(&key, &invalid_nonce, plaintext, associated_data);
assert!(result.is_err());
let mut tampered_ciphertext = ciphertext.clone();
tampered_ciphertext[0] ^= 0xFF;
let result = aead.decrypt(&key, &nonce, &tampered_ciphertext, associated_data);
assert!(result.is_err());
let wrong_associated_data = Some(b"wrong metadata".as_slice());
let result = aead.decrypt(&key, &nonce, &ciphertext, wrong_associated_data);
assert!(result.is_err());
}
set_security_config(SecurityConfig::default());
set_input_validator(InputValidator::new());
set_timing_protection(TimingProtection::default());
}
#[test]
fn test_security_performance_impact() {
let algorithms = available_algorithms();
for algorithm in algorithms {
let aead = create_aead(algorithm).unwrap();
let key = test_key_for_security(algorithm);
let nonce = Nonce::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
let plaintext = b"Hello, World!";
let associated_data = Some(b"metadata".as_slice());
let ciphertext = aead.encrypt(&key, &nonce, plaintext, associated_data);
assert!(ciphertext.is_ok());
let ciphertext = ciphertext.unwrap();
let start = Instant::now();
let decrypted_baseline = aead.decrypt(&key, &nonce, &ciphertext, associated_data);
let without_wrapper = start.elapsed();
assert!(decrypted_baseline.is_ok());
let start = Instant::now();
let (decrypted, timing) =
protect_timing_with_timing(|| aead.decrypt(&key, &nonce, &ciphertext, associated_data));
let with_wrapper = start.elapsed();
assert!(decrypted.is_ok());
assert!(timing > 0);
const MIN_BASELINE_NS: u128 = 10_000; let baseline_ns = without_wrapper.as_nanos().max(MIN_BASELINE_NS);
let with_ns = with_wrapper.as_nanos();
let ratio = with_ns as f64 / baseline_ns as f64;
assert!(
(0.01..=100.0).contains(&ratio),
"Security overhead ratio (wrapped decrypt / floored plain decrypt): {}",
ratio
);
}
}
#[test]
fn test_security_error_handling() {
let validator = InputValidator::with_config(ValidationConfig::strict());
let empty_key = [];
assert!(validator.validate_key(&empty_key).is_err());
let zero_key = [0; 16];
assert!(validator.validate_key(&zero_key).is_err());
let all_ones_key = [0xFF; 16];
assert!(validator.validate_key(&all_ones_key).is_err());
let repeated_pattern_key = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2];
assert!(validator.validate_key(&repeated_pattern_key).is_err());
let empty_nonce = [];
assert!(validator.validate_nonce(&empty_nonce).is_err());
let zero_nonce = [0; 16];
assert!(validator.validate_nonce(&zero_nonce).is_err());
let all_ones_nonce = [0xFF; 16];
assert!(validator.validate_nonce(&all_ones_nonce).is_err());
let empty_ciphertext = [];
assert!(validator.validate_ciphertext(&empty_ciphertext).is_err());
let suspicious_plaintext = b"<script>alert('xss')</script>";
assert!(validator.validate_plaintext(suspicious_plaintext).is_err());
}
#[test]
fn test_security_configuration_persistence() {
use lib_q_aead::security::*;
let strict_config = SecurityConfig::strict();
set_security_config(strict_config);
let validator = InputValidator::new();
let key = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
assert!(validator.validate_key(&key).is_ok());
let retrieved_config = get_security_config();
assert_eq!(retrieved_config, strict_config);
let permissive_config = SecurityConfig::permissive();
set_security_config(permissive_config);
let retrieved_config = get_security_config();
assert_eq!(retrieved_config, permissive_config);
set_security_config(SecurityConfig::default());
}
#[test]
fn test_security_context_isolation() {
use lib_q_aead::security::*;
let ctx1 = SecurityContext::new();
let ctx2 = SecurityContext::new();
assert_ne!(ctx1.operation_id(), ctx2.operation_id());
let strict_config = SecurityConfig::strict();
let ctx_strict = SecurityContext::with_config(strict_config);
let permissive_config = SecurityConfig::permissive();
let ctx_permissive = SecurityContext::with_config(permissive_config);
assert!(ctx_strict.constant_time_enabled());
assert!(!ctx_permissive.constant_time_enabled());
assert!(ctx_strict.side_channel_protection_enabled());
assert!(!ctx_permissive.side_channel_protection_enabled());
assert!(ctx_strict.secure_memory_enabled());
assert!(!ctx_permissive.secure_memory_enabled());
assert!(ctx_strict.strict_validation_enabled());
assert!(!ctx_permissive.strict_validation_enabled());
assert!(ctx_strict.timing_protection_enabled());
assert!(!ctx_permissive.timing_protection_enabled());
assert!(ctx_strict.fault_injection_protection_enabled());
assert!(!ctx_permissive.fault_injection_protection_enabled());
}
#[test]
fn test_security_feature_flags() {
use lib_q_aead::security::*;
let config = SecurityConfig {
constant_time: false,
..Default::default()
};
set_security_config(config);
let retrieved_config = get_security_config();
assert!(!retrieved_config.constant_time);
let config = SecurityConfig {
side_channel_protection: false,
..Default::default()
};
set_security_config(config);
let retrieved_config = get_security_config();
assert!(!retrieved_config.side_channel_protection);
let config = SecurityConfig {
secure_memory: false,
..Default::default()
};
set_security_config(config);
let retrieved_config = get_security_config();
assert!(!retrieved_config.secure_memory);
let config = SecurityConfig {
strict_validation: false,
..Default::default()
};
set_security_config(config);
let retrieved_config = get_security_config();
assert!(!retrieved_config.strict_validation);
let config = SecurityConfig {
timing_protection: false,
..Default::default()
};
set_security_config(config);
let retrieved_config = get_security_config();
assert!(!retrieved_config.timing_protection);
let config = SecurityConfig {
fault_injection_protection: false,
..Default::default()
};
set_security_config(config);
let retrieved_config = get_security_config();
assert!(!retrieved_config.fault_injection_protection);
set_security_config(SecurityConfig::default());
}
#[test]
fn test_security_integration_with_aead_operations() {
use lib_q_aead::security::*;
let algorithms = available_algorithms();
for algorithm in algorithms {
let aead = create_aead(algorithm).unwrap();
let configs = [
SecurityConfig::strict(),
SecurityConfig::balanced(),
SecurityConfig::permissive(),
];
for config in configs {
set_security_config(config);
let key = test_key_for_security(algorithm);
let nonce = Nonce::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
let plaintext = b"Hello, World!";
let associated_data = Some(b"metadata".as_slice());
let ciphertext = aead.encrypt(&key, &nonce, plaintext, associated_data);
assert!(ciphertext.is_ok());
let ciphertext = ciphertext.unwrap();
assert_eq!(ciphertext.len(), plaintext.len() + aead.tag_size());
let decrypted = aead.decrypt(&key, &nonce, &ciphertext, associated_data);
assert!(decrypted.is_ok());
assert_eq!(decrypted.unwrap(), plaintext);
}
}
set_security_config(SecurityConfig::default());
}