binius_field/
packed_aes_field.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3pub use crate::arch::{
4	packed_aes_8::*, packed_aes_16::*, packed_aes_32::*, packed_aes_64::*, packed_aes_128::*,
5	packed_aes_256::*, packed_aes_512::*,
6};
7
8#[cfg(test)]
9mod test_utils {
10	/// Test if `mult_func` operation is a valid multiply operation on the given values for
11	/// all possible packed fields defined on 8-512 bits.
12	macro_rules! define_multiply_tests {
13		($mult_func:path, $constraint:ty) => {
14			$crate::packed_binary_field::test_utils::define_check_packed_mul!(
15				$mult_func,
16				$constraint
17			);
18
19			proptest! {
20				#[test]
21				fn test_mul_packed_8(a_val in any::<u8>(), b_val in any::<u8>()) {
22					use $crate::arch::packed_aes_8::*;
23
24					TestMult::<PackedAESBinaryField1x8b>::test_mul(
25						a_val.into(),
26						b_val.into(),
27					);
28				}
29
30				#[test]
31				fn test_mul_packed_16(a_val in any::<u16>(), b_val in any::<u16>()) {
32					use $crate::arch::packed_aes_16::*;
33
34					TestMult::<PackedAESBinaryField2x8b>::test_mul(
35						a_val.into(),
36						b_val.into(),
37					);
38				}
39
40				#[test]
41				fn test_mul_packed_32(a_val in any::<u32>(), b_val in any::<u32>()) {
42					use $crate::arch::packed_aes_32::*;
43
44					TestMult::<PackedAESBinaryField4x8b>::test_mul(
45						a_val.into(),
46						b_val.into(),
47					);
48				}
49
50				#[test]
51				fn test_mul_packed_64(a_val in any::<u64>(), b_val in any::<u64>()) {
52					use $crate::arch::packed_aes_64::*;
53
54					TestMult::<PackedAESBinaryField8x8b>::test_mul(
55						a_val.into(),
56						b_val.into(),
57					);
58				}
59
60				#[test]
61				fn test_mul_packed_128(a_val in any::<u128>(), b_val in any::<u128>()) {
62					use $crate::arch::packed_aes_128::*;
63
64					TestMult::<PackedAESBinaryField16x8b>::test_mul(
65						a_val.into(),
66						b_val.into(),
67					);
68				}
69
70				#[test]
71				fn test_mul_packed_256(a_val in any::<[u128; 2]>(), b_val in any::<[u128; 2]>()) {
72					use $crate::arch::packed_aes_256::*;
73
74					TestMult::<PackedAESBinaryField32x8b>::test_mul(
75						a_val.into(),
76						b_val.into(),
77					);
78				}
79
80				#[test]
81				fn test_mul_packed_512(a_val in any::<[u128; 4]>(), b_val in any::<[u128; 4]>()) {
82					use $crate::arch::packed_aes_512::*;
83
84					TestMult::<PackedAESBinaryField64x8b>::test_mul(
85						a_val.into(),
86						b_val.into(),
87					);
88				}
89			}
90		};
91	}
92
93	/// Test if `square_func` operation is a valid square operation on the given value for
94	/// all possible packed fields.
95	macro_rules! define_square_tests {
96		($square_func:path, $constraint:ident) => {
97			$crate::packed_binary_field::test_utils::define_check_packed_square!(
98				$square_func,
99				$constraint
100			);
101
102			proptest! {
103				#[test]
104				fn test_square_packed_8(a_val in any::<u8>()) {
105					use $crate::arch::packed_aes_8::*;
106
107					TestSquare::<PackedAESBinaryField1x8b>::test_square(a_val.into());
108				}
109
110				#[test]
111				fn test_square_packed_16(a_val in any::<u16>()) {
112					use $crate::arch::packed_aes_16::*;
113
114					TestSquare::<PackedAESBinaryField2x8b>::test_square(a_val.into());
115				}
116
117				#[test]
118				fn test_square_packed_32(a_val in any::<u32>()) {
119					use $crate::arch::packed_aes_32::*;
120
121					TestSquare::<PackedAESBinaryField4x8b>::test_square(a_val.into());
122				}
123
124				#[test]
125				fn test_square_packed_64(a_val in any::<u64>()) {
126					use $crate::arch::packed_aes_64::*;
127
128					TestSquare::<PackedAESBinaryField8x8b>::test_square(a_val.into());
129				}
130
131				#[test]
132				fn test_square_packed_128(a_val in any::<u128>()) {
133					use $crate::arch::packed_aes_128::*;
134
135					TestSquare::<PackedAESBinaryField16x8b>::test_square(a_val.into());
136				}
137
138				#[test]
139				fn test_square_packed_256(a_val in any::<[u128; 2]>()) {
140					use $crate::arch::packed_aes_256::*;
141
142					TestSquare::<PackedAESBinaryField32x8b>::test_square(a_val.into());
143				}
144
145				#[test]
146				fn test_square_packed_512(a_val in any::<[u128; 4]>()) {
147					use $crate::arch::packed_aes_512::*;
148
149					TestSquare::<PackedAESBinaryField64x8b>::test_square(a_val.into());
150				}
151			}
152		};
153	}
154
155	/// Test if `invert_func` operation is a valid invert operation on the given value for
156	/// all possible packed fields.
157	macro_rules! define_invert_tests {
158		($invert_func:path, $constraint:ident) => {
159			$crate::packed_binary_field::test_utils::define_check_packed_inverse!(
160				$invert_func,
161				$constraint
162			);
163
164			proptest! {
165				#[test]
166				fn test_invert_packed_8(a_val in any::<u8>()) {
167					use $crate::arch::packed_aes_8::*;
168
169					TestSquare::<PackedAESBinaryField1x8b>::test_invert(a_val.into());
170				}
171
172				#[test]
173				fn test_invert_packed_16(a_val in any::<u16>()) {
174					use $crate::arch::packed_aes_16::*;
175
176					TestSquare::<PackedAESBinaryField2x8b>::test_invert(a_val.into());
177				}
178
179				#[test]
180				fn test_invert_packed_32(a_val in any::<u32>()) {
181					use $crate::arch::packed_aes_32::*;
182
183					TestSquare::<PackedAESBinaryField4x8b>::test_invert(a_val.into());
184				}
185
186				#[test]
187				fn test_invert_packed_64(a_val in any::<u64>()) {
188					use $crate::arch::packed_aes_64::*;
189
190					TestSquare::<PackedAESBinaryField8x8b>::test_invert(a_val.into());
191				}
192
193				#[test]
194				fn test_invert_packed_128(a_val in any::<u128>()) {
195					use $crate::arch::packed_aes_128::*;
196
197					TestInvert::<PackedAESBinaryField16x8b>::test_invert(a_val.into());
198				}
199
200				#[test]
201				fn test_invert_packed_256(a_val in any::<[u128; 2]>()) {
202					use $crate::arch::packed_aes_256::*;
203
204					TestInvert::<PackedAESBinaryField32x8b>::test_invert(a_val.into());
205				}
206
207				#[test]
208				fn test_invert_packed_512(a_val in any::<[u128; 4]>()) {
209					use $crate::arch::packed_aes_512::*;
210
211					TestInvert::<PackedAESBinaryField64x8b>::test_invert(a_val.into());
212				}
213			}
214		};
215	}
216
217	macro_rules! define_transformation_tests {
218		($constraint:path) => {
219			$crate::packed_binary_field::test_utils::define_check_packed_transformation!(
220				$constraint
221			);
222
223			proptest::proptest! {
224				#[test]
225				fn test_transformation_packed_aes_8(a_val in proptest::prelude::any::<u8>()) {
226					use crate::arch::packed_aes_8::*;
227
228					TestTransformation::<PackedAESBinaryField1x8b>::test_transformation(a_val.into());
229				}
230
231				#[test]
232				fn test_transformation_packed_aes_16(a_val in proptest::prelude::any::<u16>()) {
233					use crate::arch::packed_aes_16::*;
234
235					TestTransformation::<PackedAESBinaryField2x8b>::test_transformation(a_val.into());
236				}
237
238				#[test]
239				fn test_transformation_packed_aes_32(a_val in proptest::prelude::any::<u32>()) {
240					use crate::arch::packed_aes_32::*;
241
242					TestTransformation::<PackedAESBinaryField4x8b>::test_transformation(a_val.into());
243				}
244
245				#[test]
246				fn test_transformation_packed_aes_64(a_val in proptest::prelude::any::<u64>()) {
247					use crate::arch::packed_aes_64::*;
248
249					TestTransformation::<PackedAESBinaryField8x8b>::test_transformation(a_val.into());
250				}
251
252				#[test]
253				fn test_transformation_packed_aes_128(a_val in proptest::prelude::any::<u128>()) {
254					use crate::arch::packed_aes_128::*;
255
256					TestTransformation::<PackedAESBinaryField16x8b>::test_transformation(a_val.into());
257				}
258
259				#[test]
260				fn test_transformation_packed_aes_256(a_val in proptest::prelude::any::<[u128; 2]>()) {
261					use crate::arch::packed_aes_256::*;
262
263					TestTransformation::<PackedAESBinaryField32x8b>::test_transformation(a_val.into());
264				}
265
266				#[test]
267				fn test_transformation_packed_aes_512(a_val in proptest::prelude::any::<[u128; 4]>()) {
268					use crate::arch::packed_aes_512::*;
269
270					TestTransformation::<PackedAESBinaryField64x8b>::test_transformation(a_val.into());
271				}
272			}
273		};
274	}
275
276	pub(crate) use define_invert_tests;
277	pub(crate) use define_multiply_tests;
278	pub(crate) use define_square_tests;
279	pub(crate) use define_transformation_tests;
280}
281
282#[cfg(test)]
283mod tests {
284	use std::ops::Mul;
285
286	use proptest::prelude::*;
287
288	use super::test_utils::{
289		define_invert_tests, define_multiply_tests, define_square_tests,
290		define_transformation_tests,
291	};
292	use crate::{PackedField, linear_transformation::PackedTransformationFactory};
293
294	define_multiply_tests!(Mul::mul, PackedField);
295
296	define_square_tests!(PackedField::square, PackedField);
297
298	define_invert_tests!(PackedField::invert_or_zero, PackedField);
299
300	#[allow(unused)]
301	trait SelfTransformationFactory: PackedTransformationFactory<Self> {}
302
303	impl<T: PackedTransformationFactory<T>> SelfTransformationFactory for T {}
304
305	define_transformation_tests!(SelfTransformationFactory);
306}