#[cfg(test)]
mod tests {
#[cfg(feature = "alloc")]
use alloc::{
string::ToString,
vec,
};
use crate::providers::post_quantum::PostQuantumProvider;
use crate::providers::traits::{
AeadProvider,
KdfProvider,
KemProvider,
};
use crate::types::*;
#[test]
fn test_aead_invalid_key_lengths() {
let provider = PostQuantumProvider::new();
let invalid_key_16 = vec![0u8; 16]; let invalid_key_48 = vec![0u8; 48]; let _valid_key = [0u8; 32]; let nonce = vec![0u8; 16];
let plaintext = b"test message";
let result_short = provider.seal(
HpkeAead::Saturnin256,
&invalid_key_16,
&nonce,
b"",
plaintext,
);
assert!(result_short.is_err());
assert!(
result_short
.unwrap_err()
.to_string()
.contains("Invalid input for key")
);
let result_long = provider.seal(
HpkeAead::Saturnin256,
&invalid_key_48,
&nonce,
b"",
plaintext,
);
assert!(result_long.is_err());
assert!(
result_long
.unwrap_err()
.to_string()
.contains("Invalid input for key")
);
}
#[test]
fn test_aead_invalid_nonce_lengths() {
let provider = PostQuantumProvider::new();
let key = vec![1u8; 32]; let invalid_nonce_8 = vec![0u8; 8]; let invalid_nonce_24 = vec![0u8; 24]; let _valid_nonce = [0u8; 16]; let plaintext = b"test message";
let result_short = provider.seal(
HpkeAead::Saturnin256,
&key,
&invalid_nonce_8,
b"",
plaintext,
);
assert!(result_short.is_err());
assert!(
result_short
.unwrap_err()
.to_string()
.contains("Invalid input for nonce")
);
let result_long = provider.seal(
HpkeAead::Saturnin256,
&key,
&invalid_nonce_24,
b"",
plaintext,
);
assert!(result_long.is_err());
assert!(
result_long
.unwrap_err()
.to_string()
.contains("Invalid input for nonce")
);
}
#[test]
fn test_aead_zero_key_rejection() {
let provider = PostQuantumProvider::new();
let zero_key = vec![0u8; 32];
let nonce = vec![0u8; 16];
let plaintext = b"test message";
let result = provider.seal(HpkeAead::Saturnin256, &zero_key, &nonce, b"", plaintext);
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("Key material cannot be all zeros")
);
}
#[test]
fn test_unsupported_aead_algorithms() {
let provider = PostQuantumProvider::new();
let key = vec![1u8; 32]; let nonce = vec![0u8; 16];
let plaintext = b"test message";
let result = provider.seal(HpkeAead::Shake256, &key, &nonce, b"", plaintext);
assert!(
result.is_err(),
"SHAKE256 AEAD should fail as it's not currently implemented"
);
}
#[test]
fn test_ciphertext_length_validation() {
let provider = PostQuantumProvider::new();
let key = vec![1u8; 32]; let nonce = vec![0u8; 16];
let short_ciphertext = vec![0u8; 8];
let result = provider.open(HpkeAead::Saturnin256, &key, &nonce, b"", &short_ciphertext);
assert!(result.is_err());
let error_msg = result.unwrap_err().to_string();
assert!(
error_msg.contains("Ciphertext too short") ||
error_msg.contains("Invalid input") ||
error_msg.contains("decryption failed")
);
}
#[test]
fn test_algorithm_support_checks() {
let provider = PostQuantumProvider::new();
assert!(provider.supports_kem(HpkeKem::MlKem512));
assert!(provider.supports_kem(HpkeKem::MlKem768));
assert!(provider.supports_kem(HpkeKem::MlKem1024));
assert!(provider.supports_kdf(HpkeKdf::HkdfShake128));
assert!(provider.supports_kdf(HpkeKdf::HkdfShake256));
assert!(provider.supports_kdf(HpkeKdf::HkdfSha3_256));
assert!(provider.supports_kdf(HpkeKdf::HkdfSha3_512));
assert!(provider.supports_aead(HpkeAead::Saturnin256));
assert!(provider.supports_aead(HpkeAead::Shake256));
#[cfg(feature = "duplex-sponge-aead")]
assert!(provider.supports_aead(HpkeAead::DuplexSpongeAead));
#[cfg(not(feature = "duplex-sponge-aead"))]
assert!(!provider.supports_aead(HpkeAead::DuplexSpongeAead));
assert!(provider.supports_aead(HpkeAead::Export));
}
#[test]
fn test_error_message_security() {
let provider = PostQuantumProvider::new();
let invalid_key = vec![0u8; 16];
let nonce = vec![0u8; 16];
let plaintext = b"test message";
let result = provider.seal(HpkeAead::Saturnin256, &invalid_key, &nonce, b"", plaintext);
assert!(result.is_err());
let error_msg = result.unwrap_err().to_string();
assert!(error_msg.contains("Invalid input for key"));
assert!(error_msg.contains("expected 32 bytes"));
assert!(error_msg.contains("got '16 bytes'"));
assert!(!error_msg.contains("00000000"));
}
#[test]
fn test_constant_time_properties() {
let provider = PostQuantumProvider::new();
let key1 = vec![0u8; 32]; let key2 = vec![1u8; 32]; let nonce = vec![0u8; 16];
let plaintext = b"test message";
let result1 = provider.seal(HpkeAead::Saturnin256, &key1, &nonce, b"", plaintext);
assert!(result1.is_err());
let error1 = result1.unwrap_err().to_string();
assert!(error1.contains("Key material cannot be all zeros"));
let result2 = provider.seal(HpkeAead::Saturnin256, &key2, &nonce, b"", plaintext);
assert!(
result2.is_ok(),
"expected seal with non-zero key to succeed: {:?}",
result2
);
}
}