From e4f38cb06759cd056083592c841fd43604f9e5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=5BArtyom=20Pavlov=5D?= Date: Fri, 21 Mar 2025 19:23:21 +0300 Subject: [PATCH] aead: split `new_test!` into `new_pass_test!` and `new_fail_test!` Helper utility to split the blob files ``` use blobby::encode_blobs; use std::{ env, fs::File, io::{self, BufReader, BufWriter, Read, Write}, path::PathBuf, }; fn main() -> io::Result<()> { let args: Vec = env::args().skip(1).collect(); if args.is_empty() { println!( "Blobby test vector split utility.\n\ Usage: split " ); return Ok(()); } let in_path: PathBuf = args[0].clone().into(); let base = in_path.parent().unwrap(); let name = in_path.file_name().unwrap().to_str().unwrap(); let (base_name, ext) = name.rsplit_once(".").unwrap(); let out_pass_path = base.to_path_buf().join(format!("{base_name}_pass.{ext}")); let out_fail_path = base.to_path_buf().join(format!("{base_name}_fail.{ext}")); println!("out_pass: {}", out_pass_path.display()); println!("out_fail: {}", out_fail_path.display()); let mut in_file = BufReader::new(File::open(in_path)?); let mut out_pass_file = BufWriter::new(File::create_new(out_pass_path)?); let mut out_fail_file = BufWriter::new(File::create_new(out_fail_path)?); let mut data = Vec::new(); in_file.read_to_end(&mut data)?; let res = blobby::parse_into_vec(&data).map_err(|e| { io::Error::new( io::ErrorKind::InvalidData, format!("invalid blobby data: {e:?}"), ) })?; let mut data_pass: Vec<&[u8]> = Vec::new(); let mut data_fail: Vec<&[u8]> = Vec::new(); for row in res.chunks(6) { let [key, nonce, aad, plaintext, ciphertext, pass] = row else { panic!("invariant failed") }; if pass[0] == 1 { data_pass.extend_from_slice(&[key, nonce, aad, plaintext, ciphertext]) } else if pass[0] == 0 { data_fail.extend_from_slice(&[key, nonce, aad, plaintext, ciphertext]) } else { panic!("invalid data"); } } let (data_pass, idx_len) = encode_blobs(&data_pass); println!("Pass len: {idx_len:?}"); out_pass_file.write_all(&data_pass)?; let (data_fail, idx_len) = encode_blobs(&data_fail); println!("Fail len: {idx_len:?}"); out_fail_file.write_all(&data_fail)?; Ok(()) } ``` --- aead/src/dev.rs | 50 +++++++++++++++++++++---------- aead/tests/data/postfix.blb | Bin 209 -> 0 bytes aead/tests/data/postfix_fail.blb | Bin 0 -> 120 bytes aead/tests/data/postfix_pass.blb | Bin 0 -> 120 bytes aead/tests/data/prefix.blb | Bin 209 -> 0 bytes aead/tests/data/prefix_fail.blb | Bin 0 -> 120 bytes aead/tests/data/prefix_pass.blb | Bin 0 -> 120 bytes aead/tests/dummy.rs | 11 +++++-- 8 files changed, 44 insertions(+), 17 deletions(-) delete mode 100644 aead/tests/data/postfix.blb create mode 100644 aead/tests/data/postfix_fail.blb create mode 100644 aead/tests/data/postfix_pass.blb delete mode 100644 aead/tests/data/prefix.blb create mode 100644 aead/tests/data/prefix_fail.blb create mode 100644 aead/tests/data/prefix_pass.blb diff --git a/aead/src/dev.rs b/aead/src/dev.rs index 2f942d557..a3e41f728 100644 --- a/aead/src/dev.rs +++ b/aead/src/dev.rs @@ -18,8 +18,6 @@ pub struct TestVector { pub plaintext: &'static [u8], /// Ciphertext pub ciphertext: &'static [u8], - /// Whether the test vector should pass (`[1]`) or fail (`[0]`) - pub pass: &'static [u8], } /// Run AEAD test for the provided passing test vector @@ -30,10 +28,8 @@ pub fn pass_test( aad, plaintext, ciphertext, - pass, }: &TestVector, ) -> Result<(), &'static str> { - assert_eq!(pass, &[1]); let nonce = nonce.try_into().expect("wrong nonce size"); let cipher = ::new_from_slice(key).expect("failed to initialize the cipher"); @@ -109,11 +105,9 @@ pub fn fail_test( nonce, aad, ciphertext, - pass, .. }: &TestVector, ) -> Result<(), &'static str> { - assert_eq!(pass, &[0]); let nonce = nonce.try_into().expect("wrong nonce size"); let cipher = ::new_from_slice(key).expect("failed to initialize the cipher"); @@ -131,9 +125,9 @@ pub fn fail_test( } } -/// Define AEAD test +/// Define AEAD test for passing test vectors #[macro_export] -macro_rules! new_test { +macro_rules! new_pass_test { ($name:ident, $test_name:expr, $cipher:ty $(,)?) => { #[test] fn $name() { @@ -142,17 +136,43 @@ macro_rules! new_test { $crate::dev::blobby::parse_into_structs!( include_bytes!(concat!("data/", $test_name, ".blb")); static TEST_VECTORS: &[ - TestVector { key, nonce, aad, plaintext, ciphertext, pass } + TestVector { key, nonce, aad, plaintext, ciphertext } ]; ); for (i, tv) in TEST_VECTORS.iter().enumerate() { - let pass = tv.pass[0] == 1; - let res = if pass { - $crate::dev::pass_test::<$cipher>(tv) - } else { - $crate::dev::fail_test::<$cipher>(tv) - }; + let res = $crate::dev::pass_test::<$cipher>(tv); + + if let Err(reason) = res { + panic!( + "\n\ + Failed test #{i}\n\ + reason:\t{reason:?}\n\ + test vector:\t{tv:?}\n" + ); + } + } + } + }; +} + +/// Define AEAD test for failing test vectors +#[macro_export] +macro_rules! new_fail_test { + ($name:ident, $test_name:expr, $cipher:ty $(,)?) => { + #[test] + fn $name() { + use $crate::dev::TestVector; + + $crate::dev::blobby::parse_into_structs!( + include_bytes!(concat!("data/", $test_name, ".blb")); + static TEST_VECTORS: &[ + TestVector { key, nonce, aad, plaintext, ciphertext } + ]; + ); + + for (i, tv) in TEST_VECTORS.iter().enumerate() { + let res = $crate::dev::fail_test::<$cipher>(tv); if let Err(reason) = res { panic!( diff --git a/aead/tests/data/postfix.blb b/aead/tests/data/postfix.blb deleted file mode 100644 index c3591020df10d59d2b746cba9ea4b58f87717226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmY#kWn^Gv6wwU(dM3f3;Dkcc^&30>R|$rFRPEx}`dg)QF0;-Rj<8<239IhpKjvg- zWe~XH(zLvI#k8%=oa_v&7WKDZ$DDd2uU*D}(nCmD^bR|$rFRPEx}`dg)QF0;-Rj<8<239IhpKW1fSWDvOG z(zLvI#k38q%nXbc^|xQgoO&a#UB-XXLr7Wl6GM%)R8H>&?@q-Z7l5jR|$rFRPEx}`dg)QF0;-Rj<8<239IhpKW1fSWDvOG z(zLvI#k8%g%nXbc^|xQgoO&a#UB-XXLr7Wl6GM%)R8H>&?@q-ZcY&(0E8sOMOHJ=` G+5-USGBA|@ literal 0 HcmV?d00001 diff --git a/aead/tests/data/prefix.blb b/aead/tests/data/prefix.blb deleted file mode 100644 index f6c09fc760f395610370c4ae39604f51c25a947d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmY#kWn^Gv0M5H Huqgllm|HJW literal 0 HcmV?d00001 diff --git a/aead/tests/data/prefix_pass.blb b/aead/tests/data/prefix_pass.blb new file mode 100644 index 0000000000000000000000000000000000000000..ec1d1aff255e8ecdac8889d9a8f3023e001fdf24 GIT binary patch literal 120 zcmd;Q7SRm*dM3f3;Dkcc^&30>R|$rFRPEx}`dg)QF0;-Rj<8<239IhpKW1fSWDvOG z(zLvI#k8%g%nXbcIlULWI~9N2t-t*`=F}T`?K1w89zx2ZpBQSarGTm#EqIN}Qq#Mf I_Fz*00Q@2_l>h($ literal 0 HcmV?d00001 diff --git a/aead/tests/dummy.rs b/aead/tests/dummy.rs index ef7606f00..a4604d807 100644 --- a/aead/tests/dummy.rs +++ b/aead/tests/dummy.rs @@ -170,5 +170,12 @@ impl AeadInOut for PostfixDummyAead { } } -aead::new_test!(dummy_prefix, "prefix", PrefixDummyAead); -aead::new_test!(dummy_postfix, "postfix", PostfixDummyAead); +#[cfg(feature = "dev")] +mod tests { + use super::{PostfixDummyAead, PrefixDummyAead}; + + aead::new_pass_test!(dummy_prefix_pass, "prefix_pass", PrefixDummyAead); + aead::new_fail_test!(dummy_prefix_fail, "prefix_fail", PrefixDummyAead); + aead::new_pass_test!(dummy_postfix_pass, "postfix_pass", PostfixDummyAead); + aead::new_fail_test!(dummy_postfix_fail, "postfix_fail", PostfixDummyAead); +}