1use binius_field::{
6 as_packed_field::PackScalar,
7 linear_transformation::{PackedTransformationFactory, Transformation},
8 polyval::{AES_TO_POLYVAL_TRANSFORMATION, BINARY_TO_POLYVAL_TRANSFORMATION},
9 underlier::UnderlierType,
10 AESTowerField128b, AESTowerField16b, AESTowerField32b, AESTowerField64b, AESTowerField8b,
11 BinaryField128b, BinaryField128bPolyval, BinaryField16b, BinaryField1b, BinaryField32b,
12 BinaryField64b, BinaryField8b, ExtensionField, PackedExtension, PackedField, TowerField,
13};
14use trait_set::trait_set;
15
16pub trait TowerFamily: Sized {
18 type B1: TowerField + TryFrom<Self::B128>;
19 type B8: TowerField + TryFrom<Self::B128> + ExtensionField<Self::B1>;
20 type B16: TowerField + TryFrom<Self::B128> + ExtensionField<Self::B1> + ExtensionField<Self::B8>;
21 type B32: TowerField
22 + TryFrom<Self::B128>
23 + ExtensionField<Self::B1>
24 + ExtensionField<Self::B8>
25 + ExtensionField<Self::B16>;
26 type B64: TowerField
27 + TryFrom<Self::B128>
28 + ExtensionField<Self::B1>
29 + ExtensionField<Self::B8>
30 + ExtensionField<Self::B16>
31 + ExtensionField<Self::B32>;
32 type B128: TowerField
33 + ExtensionField<Self::B1>
34 + ExtensionField<Self::B8>
35 + ExtensionField<Self::B16>
36 + ExtensionField<Self::B32>
37 + ExtensionField<Self::B64>;
38}
39
40pub trait ProverTowerFamily: TowerFamily {
41 type FastB128: TowerField + From<Self::B128> + Into<Self::B128>;
42
43 fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
44 where
45 Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
46 FastTop: PackedField<Scalar = Self::FastB128>;
47}
48
49#[derive(Debug)]
51pub struct CanonicalTowerFamily;
52
53impl TowerFamily for CanonicalTowerFamily {
54 type B1 = BinaryField1b;
55 type B8 = BinaryField8b;
56 type B16 = BinaryField16b;
57 type B32 = BinaryField32b;
58 type B64 = BinaryField64b;
59 type B128 = BinaryField128b;
60}
61
62impl ProverTowerFamily for CanonicalTowerFamily {
63 type FastB128 = BinaryField128bPolyval;
64
65 fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
66 where
67 Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
68 FastTop: PackedField<Scalar = Self::FastB128>,
69 {
70 Top::make_packed_transformation(BINARY_TO_POLYVAL_TRANSFORMATION)
71 }
72}
73
74#[derive(Debug)]
76pub struct AESTowerFamily;
77
78impl TowerFamily for AESTowerFamily {
79 type B1 = BinaryField1b;
80 type B8 = AESTowerField8b;
81 type B16 = AESTowerField16b;
82 type B32 = AESTowerField32b;
83 type B64 = AESTowerField64b;
84 type B128 = AESTowerField128b;
85}
86
87impl ProverTowerFamily for AESTowerFamily {
88 type FastB128 = BinaryField128bPolyval;
89
90 fn packed_transformation_to_fast<Top, FastTop>() -> impl Transformation<Top, FastTop>
91 where
92 Top: PackedTop<Self> + PackedTransformationFactory<FastTop>,
93 FastTop: PackedField<Scalar = Self::FastB128>,
94 {
95 Top::make_packed_transformation(AES_TO_POLYVAL_TRANSFORMATION)
96 }
97}
98
99trait_set! {
100 pub trait TowerUnderlier<Tower: TowerFamily> =
102 UnderlierType
103 + PackScalar<Tower::B1>
104 + PackScalar<Tower::B8>
105 + PackScalar<Tower::B16>
106 + PackScalar<Tower::B32>
107 + PackScalar<Tower::B64>
108 + PackScalar<Tower::B128>;
109
110 pub trait ProverTowerUnderlier<Tower: ProverTowerFamily> =
111 TowerUnderlier<Tower> + PackScalar<Tower::FastB128>;
112
113 pub trait PackedTop<Tower: TowerFamily> =
115 PackedField<Scalar=Tower::B128>
116 + PackedExtension<Tower::B1>
117 + PackedExtension<Tower::B8>
118 + PackedExtension<Tower::B16>
119 + PackedExtension<Tower::B32>
120 + PackedExtension<Tower::B64>
121 + PackedExtension<Tower::B128>;
122}