#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use crate::error::{
AeadOperation,
HpkeError,
};
use crate::types::*;
pub struct ExportOnlyAead;
impl Default for ExportOnlyAead {
fn default() -> Self {
Self::new()
}
}
impl ExportOnlyAead {
pub fn new() -> Self {
Self
}
}
impl crate::aead::traits::Aead for ExportOnlyAead {
fn seal(
&self,
_key: &[u8],
_nonce: &[u8],
_aad: &[u8],
_plaintext: &[u8],
) -> Result<Vec<u8>, HpkeError> {
Err(HpkeError::aead_error(
HpkeAead::Export,
AeadOperation::Seal,
"Export-only AEAD does not support encryption operations. Use export() method for key derivation.",
))
}
fn open(
&self,
_key: &[u8],
_nonce: &[u8],
_aad: &[u8],
_ciphertext: &[u8],
) -> Result<Vec<u8>, HpkeError> {
Err(HpkeError::aead_error(
HpkeAead::Export,
AeadOperation::Open,
"Export-only AEAD does not support decryption operations. Use export() method for key derivation.",
))
}
}
pub fn create_export_aead() -> Result<ExportOnlyAead, HpkeError> {
Ok(ExportOnlyAead::new())
}
pub fn is_export_available() -> bool {
true }
#[cfg(test)]
mod tests {
use alloc::string::ToString;
use alloc::vec;
use super::*;
use crate::aead::traits::Aead;
#[test]
fn test_export_availability() {
assert!(is_export_available());
}
#[test]
fn test_export_creation() {
let _aead = ExportOnlyAead::new();
}
#[test]
fn test_export_seal_returns_error() {
let aead = ExportOnlyAead::new();
let key = vec![1u8; 32];
let nonce = vec![2u8; 16];
let plaintext = b"test message";
let aad = b"metadata";
let result = aead.seal(&key, &nonce, aad, plaintext);
assert!(result.is_err());
if let Err(HpkeError::AeadError {
algorithm,
operation,
..
}) = result
{
assert_eq!(algorithm, HpkeAead::Export);
assert_eq!(operation, AeadOperation::Seal);
} else {
panic!("Expected AeadError");
}
}
#[test]
fn test_export_open_returns_error() {
let aead = ExportOnlyAead::new();
let key = vec![1u8; 32];
let nonce = vec![2u8; 16];
let ciphertext = vec![3u8; 32];
let aad = b"metadata";
let result = aead.open(&key, &nonce, aad, &ciphertext);
assert!(result.is_err());
if let Err(HpkeError::AeadError {
algorithm,
operation,
..
}) = result
{
assert_eq!(algorithm, HpkeAead::Export);
assert_eq!(operation, AeadOperation::Open);
} else {
panic!("Expected AeadError");
}
}
#[test]
fn test_export_error_messages() {
let aead = ExportOnlyAead::new();
let key = vec![1u8; 32];
let nonce = vec![2u8; 16];
let plaintext = b"test message";
let aad = b"metadata";
let seal_result = aead.seal(&key, &nonce, aad, plaintext);
assert!(seal_result.is_err());
let error_msg = seal_result.unwrap_err().to_string();
assert!(error_msg.contains("Export-only AEAD does not support encryption operations"));
assert!(error_msg.contains("Use export() method for key derivation"));
let open_result = aead.open(&key, &nonce, aad, &[1u8; 32]);
assert!(open_result.is_err());
let error_msg = open_result.unwrap_err().to_string();
assert!(error_msg.contains("Export-only AEAD does not support decryption operations"));
assert!(error_msg.contains("Use export() method for key derivation"));
}
}