use anyhow::Result;
use pastey::paste;
use rstest::*;
use similar_asserts::assert_eq;
use test_utils::{
AegisTestCase, aegis128l, aegis128x2, aegis128x4, aegis256, aegis256x2,
aegis256x4,
};
use crate::{
arch::api::aegis_struct,
arch::*,
auth_tag::AuthTag128,
base::aegis::Aegis,
easy::{AssociatedData, Ciphertext, CiphertextMut, Plaintext, PlaintextMut},
};
macro_rules! gen_arch_quick_tests {
(
$simd:ident, // One of: Avx512, Avx2, Avx, Sse2, None
$algo:ident // One of: aegis128l, aegis128x2, aegis128x4,
// aegis256, aegis256x2, aegis256x4
) => {
paste! { #[rstest]
fn [<$algo:lower _encryption_ $simd:lower>](
#[from([<$algo:lower>]::example)] expected: AegisTestCase)
-> Result<()> {
let Some(simd) = SimdLevel::supported::<$simd>() else {
return Ok(());
};
type Key = crate::facade::aegis_key_type!($algo);
type Nonce = crate::facade::aegis_nonce_type!($algo);
let mut actual_ciphertext = vec![0; expected.plaintext.len()];
let actual_tag: AuthTag128 =
<aegis_struct!($algo, $simd)>::encrypt_to_slice_detached(
simd,
Plaintext::new(&expected.plaintext),
AssociatedData::new(&expected.associated_data),
&Key::from_bytes(expected.key)?,
Nonce::new(*expected.nonce.as_array().unwrap())?,
CiphertextMut::new(&mut actual_ciphertext),
)?;
assert_eq!(
expected.ciphertext,
actual_ciphertext[..expected.ciphertext.len()]
);
assert_eq!(expected.tag128, actual_tag);
Ok(())
}
#[rstest]
fn [<$algo:lower _decryption_ $simd:lower>](
#[from([<$algo:lower>]::example)] expected: AegisTestCase)
-> Result<()> {
let Some(simd) = SimdLevel::supported::<$simd>() else {
return Ok(());
};
type Key = crate::facade::aegis_key_type!($algo);
type Nonce = crate::facade::aegis_nonce_type!($algo);
let mut actual_plaintext = vec![0; expected.ciphertext.len()];
<aegis_struct!($algo, $simd)>::decrypt_to_slice_detached(
simd,
Ciphertext::new(&expected.ciphertext),
&expected.tag128,
AssociatedData::new(&expected.associated_data),
&Key::from_bytes(expected.key)?,
Nonce::new(*expected.nonce.as_array().unwrap())?,
PlaintextMut::new(&mut actual_plaintext),
)?;
assert_eq!(expected.plaintext, actual_plaintext);
Ok(())
}
}
};
}
gen_arch_quick_tests!(Sse2, aegis128l);
gen_arch_quick_tests!(Sse2, aegis128x2);
gen_arch_quick_tests!(Sse2, aegis128x4);
gen_arch_quick_tests!(Avx, aegis128l);
gen_arch_quick_tests!(Avx, aegis128x2);
gen_arch_quick_tests!(Avx, aegis128x4);
gen_arch_quick_tests!(Avx2, aegis128x2);
gen_arch_quick_tests!(Avx2, aegis128x4);
gen_arch_quick_tests!(Avx512, aegis128x4);
gen_arch_quick_tests!(Sse2, aegis256);
gen_arch_quick_tests!(Sse2, aegis256x2);
gen_arch_quick_tests!(Sse2, aegis256x4);
gen_arch_quick_tests!(Avx, aegis256);
gen_arch_quick_tests!(Avx, aegis256x2);
gen_arch_quick_tests!(Avx, aegis256x4);
gen_arch_quick_tests!(Avx2, aegis256x2);
gen_arch_quick_tests!(Avx2, aegis256x4);
gen_arch_quick_tests!(Avx512, aegis256x4);
gen_arch_quick_tests!(Fallback, aegis128l);
gen_arch_quick_tests!(Fallback, aegis128x2);
gen_arch_quick_tests!(Fallback, aegis128x4);
gen_arch_quick_tests!(Fallback, aegis256);
gen_arch_quick_tests!(Fallback, aegis256x2);
gen_arch_quick_tests!(Fallback, aegis256x4);