1use std::{
4 fmt::{Debug, Display, Formatter},
5 iter::{Product, Sum},
6 marker::PhantomData,
7 ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign},
8};
9
10use binius_utils::{
11 DeserializeBytes, SerializationError, SerializeBytes,
12 bytes::{Buf, BufMut},
13};
14use bytemuck::{Pod, Zeroable};
15
16use super::{
17 PackedExtension, PackedSubfield,
18 arithmetic_traits::InvertOrZero,
19 binary_field::{BinaryField, BinaryField1b, binary_field, impl_field_extension},
20 binary_field_arithmetic::TowerFieldArithmetic,
21 mul_by_binary_field_1b,
22};
23use crate::{
24 ExtensionField, Field, TowerField, binary_field_arithmetic::impl_arithmetic_using_packed,
25 linear_transformation::Transformation, underlier::U1,
26};
27
28binary_field!(pub AESTowerField8b(u8), 0xD0);
36
37unsafe impl Pod for AESTowerField8b {}
38
39impl_field_extension!(BinaryField1b(U1) < @3 => AESTowerField8b(u8));
40
41mul_by_binary_field_1b!(AESTowerField8b);
42
43impl_arithmetic_using_packed!(AESTowerField8b);
44
45impl TowerField for AESTowerField8b {
46 fn min_tower_level(self) -> usize {
47 match self {
48 Self::ZERO | Self::ONE => 0,
49 _ => 3,
50 }
51 }
52}
53
54pub struct SubfieldTransformer<IF, OF, T> {
59 inner_transform: T,
60 _ip_pd: PhantomData<IF>,
61 _op_pd: PhantomData<OF>,
62}
63
64impl<IF, OF, IEP, OEP, T> Transformation<IEP, OEP> for SubfieldTransformer<IF, OF, T>
65where
66 IF: Field,
67 OF: Field,
68 IEP: PackedExtension<IF>,
69 OEP: PackedExtension<OF>,
70 T: Transformation<PackedSubfield<IEP, IF>, PackedSubfield<OEP, OF>>,
71{
72 fn transform(&self, input: &IEP) -> OEP {
73 OEP::cast_ext(self.inner_transform.transform(IEP::cast_base_ref(input)))
74 }
75}
76
77impl SerializeBytes for AESTowerField8b {
78 fn serialize(&self, write_buf: impl BufMut) -> Result<(), SerializationError> {
79 self.0.serialize(write_buf)
80 }
81}
82
83impl DeserializeBytes for AESTowerField8b {
84 fn deserialize(read_buf: impl Buf) -> Result<Self, SerializationError>
85 where
86 Self: Sized,
87 {
88 Ok(Self(DeserializeBytes::deserialize(read_buf)?))
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use binius_utils::{SerializeBytes, bytes::BytesMut};
95 use proptest::{arbitrary::any, proptest};
96 use rand::prelude::*;
97
98 use super::*;
99 use crate::{Random, binary_field::tests::is_binary_field_valid_generator};
100
101 fn check_square(f: impl Field) {
102 assert_eq!(f.square(), f * f);
103 }
104
105 proptest! {
106 #[test]
107 fn test_square_8(a in any::<u8>()) {
108 check_square(AESTowerField8b::from(a))
109 }
110 }
111
112 fn check_invert(f: impl Field) {
113 let inversed = f.invert();
114 if f.is_zero() {
115 assert!(inversed.is_none());
116 } else {
117 assert_eq!(inversed.unwrap() * f, Field::ONE);
118 }
119 }
120
121 proptest! {
122 #[test]
123 fn test_invert_8(a in any::<u8>()) {
124 check_invert(AESTowerField8b::from(a))
125 }
126 }
127
128 fn check_mul_by_one<F: Field>(f: F) {
129 assert_eq!(F::ONE * f, f);
130 assert_eq!(f * F::ONE, f);
131 }
132
133 fn check_commutative<F: Field>(f_1: F, f_2: F) {
134 assert_eq!(f_1 * f_2, f_2 * f_1);
135 }
136
137 fn check_associativity_and_lineraity<F: Field>(f_1: F, f_2: F, f_3: F) {
138 assert_eq!(f_1 * (f_2 * f_3), (f_1 * f_2) * f_3);
139 assert_eq!(f_1 * (f_2 + f_3), f_1 * f_2 + f_1 * f_3);
140 }
141
142 fn check_mul<F: Field>(f_1: F, f_2: F, f_3: F) {
143 check_mul_by_one(f_1);
144 check_mul_by_one(f_2);
145 check_mul_by_one(f_3);
146
147 check_commutative(f_1, f_2);
148 check_commutative(f_1, f_3);
149 check_commutative(f_2, f_3);
150
151 check_associativity_and_lineraity(f_1, f_2, f_3);
152 check_associativity_and_lineraity(f_1, f_3, f_2);
153 check_associativity_and_lineraity(f_2, f_1, f_3);
154 check_associativity_and_lineraity(f_2, f_3, f_1);
155 check_associativity_and_lineraity(f_3, f_1, f_2);
156 check_associativity_and_lineraity(f_3, f_2, f_1);
157 }
158
159 proptest! {
160 #[test]
161 fn test_mul_8(a in any::<u8>(), b in any::<u8>(), c in any::<u8>()) {
162 check_mul(AESTowerField8b::from(a), AESTowerField8b::from(b), AESTowerField8b::from(c))
163 }
164 }
165
166 #[test]
167 fn test_multiplicative_generators() {
168 assert!(is_binary_field_valid_generator::<AESTowerField8b>());
169 }
170
171 #[test]
172 fn test_serialization() {
173 let mut buffer = BytesMut::new();
174 let mut rng = StdRng::seed_from_u64(0);
175 let aes8 = AESTowerField8b::random(&mut rng);
176
177 SerializeBytes::serialize(&aes8, &mut buffer).unwrap();
178
179 let mut read_buffer = buffer.freeze();
180
181 assert_eq!(AESTowerField8b::deserialize(&mut read_buffer).unwrap(), aes8);
182 }
183}