anemoi/bls12_381/anemoi_4_3/
mod.rs1use super::{sbox, Felt, MontFp};
4use crate::{Anemoi, Jive, Sponge};
5use ark_ff::{One, Zero};
6mod digest;
8mod hasher;
10mod round_constants;
12
13pub use digest::AnemoiDigest;
14
15pub const STATE_WIDTH: usize = 4;
21pub const RATE_WIDTH: usize = 3;
23
24pub const NUM_COLUMNS: usize = 2;
26
27pub const DIGEST_SIZE: usize = 1;
29
30pub const NUM_HASH_ROUNDS: usize = 14;
32
33#[derive(Debug, Clone)]
38pub struct AnemoiBls12_381_4_3;
39
40impl<'a> Anemoi<'a, Felt> for AnemoiBls12_381_4_3 {
41 const NUM_COLUMNS: usize = NUM_COLUMNS;
42 const NUM_ROUNDS: usize = NUM_HASH_ROUNDS;
43
44 const WIDTH: usize = STATE_WIDTH;
45 const RATE: usize = RATE_WIDTH;
46 const OUTPUT_SIZE: usize = DIGEST_SIZE;
47
48 const ARK_C: &'a [Felt] = &round_constants::C;
49 const ARK_D: &'a [Felt] = &round_constants::D;
50
51 const GROUP_GENERATOR: u32 = sbox::BETA;
52
53 const ALPHA: u32 = sbox::ALPHA;
54 const INV_ALPHA: Felt = sbox::INV_ALPHA;
55 const BETA: u32 = sbox::BETA;
56 const DELTA: Felt = sbox::DELTA;
57
58 fn exp_by_inv_alpha(x: Felt) -> Felt {
59 sbox::exp_by_inv_alpha(&x)
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test_sbox() {
69 let mut input = [
71 [Felt::zero(); 4],
72 [Felt::one(); 4],
73 [Felt::zero(), Felt::zero(), Felt::one(), Felt::one()],
74 [Felt::one(), Felt::one(), Felt::zero(), Felt::zero()],
75 [MontFp!("2081602124513646137695314117326388648754841306540974921206706910089368274988230529250912492350013284696252680611719"
76 ),
77 MontFp!("468253762223819495911247862969663819827315608924033316759435717605721341564168786674751723237223287123382844475978"
78 ),
79 MontFp!("1790599177195186268011570559642647876382499348837053781267173241988678124171645198912369406527054802837106787436886"
80 ),
81 MontFp!("293930289777017343813488045367525917593744818399737543555288111616475267691832744004085663212197382675969483818729"),],[MontFp!("441572871730196319035031749686220639442405143952816520002713161299914796478982096333953332748686216661783048168923"
82 ),
83 MontFp!("2915418195618530442003858944276026663660226152151556582592592304687094600333178096659246084643589600504277590051737"
84 ),
85 MontFp!("2509576532036978236563559425122278218185069784456253103747919079306012396653736481604933141817197783650351928086952"
86 ),
87 MontFp!("863779193975931658183094597594568093256087575096034004831214171661965691838491189370455101703955758992386018484200"),],[MontFp!("2441973641744968616720839939572938698254898805125876839708046674418735434264119675167995046372542532960905385038142"
88 ),
89 MontFp!("1621684423703802440219025540277466322011894942739954094170101949330785499647694504227160410729282058921065173608493"
90 ),
91 MontFp!("507586788055666087125636262632846272994367208316845297095920906774079561056618810495557683679482047746598826680545"
92 ),
93 MontFp!("3782501457089999228732705613962535608630632344070766602867932348444101532425256087308331743903688756531812846473598"),],[MontFp!("2455362494341367102046842853095253861632254670549992904190828326459648246878593282565792580717369445695065755883401"
94 ),
95 MontFp!("301310021690980220528611239358435226101742493254380106179493023959735689893915513360813228510791334164881128825763"
96 ),
97 MontFp!("3861676326565229332594652587719210898573617733850369115681805483758644226675819041047331767761872934471679179252485"
98 ),
99 MontFp!("1446267223429054484533485188134030814480768754481328847702595780498849652750051304567570517881711834975058885220594"),],[MontFp!("240127785612843655978300266055833755875786658507228378206341569127372273660320305073330828620234934285057407453420"
100 ),
101 MontFp!("2993813551314088530320185588994621774415633623177363806042260572224273197340650647195935152156965564198446614410745"
102 ),
103 MontFp!("1139825206959636706128635474073142820587033652987042864248663416156882662796954980143056019974055648862158592083772"
104 ),
105 MontFp!("2711593982082807599852073796225247529645949197536937280722656193456115081389029059360702216765919289542497838460212"),],[MontFp!("2997029641596197058207513951095821316235379607143565133288043800556792446568081350508209295511513893829205142266158"
106 ),
107 MontFp!("3634972483100356404859713122758035883644834267949074765185451174659647285869022037902029643855131033446048805519967"
108 ),
109 MontFp!("1833881154570872385866976559458683706845881515432300714556054903854337381464890057901829048322200263844324085022204"
110 ),
111 MontFp!("2961342067900645293751321010096625502779838797936336795154134240479607482604713414396303369341713598298272778984167"),],];
112
113 let output = [
114[MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279894"
115 ),
116 MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279894"),Felt::zero(),Felt::zero(),],[MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279901"
117 ),
118 MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279901"
119 ),
120 MontFp!("2"
121 ),
122 MontFp!("2"),],[MontFp!("3409024350324770932167116073246649688369598710716962856079695054623192887746906059977244451934321045232801607693752"
123 ),
124 MontFp!("3409024350324770932167116073246649688369598710716962856079695054623192887746906059977244451934321045232801607693752"
125 ),
126 MontFp!("1329263574752159191211793849573133266716936406142823755742645842982909514268936466892710969217855617281191220461747"
127 ),
128 MontFp!("1329263574752159191211793849573133266716936406142823755742645842982909514268936466892710969217855617281191220461747"),],[MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279897"
129 ),
130 MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279897"
131 ),
132 MontFp!("4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786"
133 ),
134 MontFp!("4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786"),],[MontFp!("834439169804048824470052574420236030833961988987691496757852680487904729384570491777210628987362280984864850742793"
135 ),
136 MontFp!("3806615707916953028284861568141164127968907073394611337473107064150014540228704835445774035912140156915404028787846"
137 ),
138 MontFp!("1033097831859890497494604960157536630731507241099218683648230717486381727705016380139561283847688437536318796970617"
139 ),
140 MontFp!("3715767011826736754853324713629394232201042606353810673815508422669232900680887141493261140003301149178281278440423"),],[MontFp!("2919025707759556970717683233069614263002933316032281869690759119579997877431683272842821298923869667820224511720885"
141 ),
142 MontFp!("3135992476675763436759645893894968611903607315146320500918639175800916799220825268982799630555605195664266902104170"
143 ),
144 MontFp!("2731585273194351628592800069397863038644904389544168412964683242069522832770220517984853173875522300171182634821200"
145 ),
146 MontFp!("1124690147119502598656728120824446719452885161719259258014458985213439061531456656124512838648713284931591892601592"),],[MontFp!("1001951031379804692917039694494326513935962135620753485846692535593549975525543444819156363971040909583651464899479"
147 ),
148 MontFp!("3139571804296440930171271111027455641027534214482732883531067271464179093425895866908634660820610808770003418456387"
149 ),
150 MontFp!("7469481272372962452587301166015037014393870617555771249258769179712803351540624610979014359152798325020193052026"
151 ),
152 MontFp!("1186351354659048675596172277751140932384855325947693139667718723908659064335306879849840628809501497977398787502051"),],[MontFp!("3560830719491817970659813645961553097462590653341857616858943804051905223459485985450453068610750049794339715675413"
153 ),
154 MontFp!("3714223960474366934827162292532974263137376459765164571051695631726401669469692159480735541602243326344467468213901"
155 ),
156 MontFp!("2297165886194646287074293404572093402389666048338055527106194950767426736076754159449679861633077367309408836299389"
157 ),
158 MontFp!("404784666489194356884819889522452560608243909990037999106065297443798277620351143092333243006722230489706363160024"),],[MontFp!("2587691041415297208170813621426123711587130311656763106443526157156436517845452124196281924978357506575145761348395"
159 ),
160 MontFp!("3524210195795102648186572100209075907981195895606975903918531654123759994752504406361148960875464108301039130788254"
161 ),
162 MontFp!("1003582579185259380618898665178193931248336323946137514501508078622590709315946841672191680628523973330573135520824"
163 ),
164 MontFp!("3376310366754963166951571853027536276000162884850203098936199690722103424949058295369803171264574693931565888540995"),],[MontFp!("2793930555241504233224768584553500316357054380321077379375434743545669401613268602169625866566640788149926011644948"
165 ),
166 MontFp!("1966890074557743708422260153134332706103244072613897205404929834384329609774782299620923843299432293058751323341105"
167 ),
168 MontFp!("2658823954834469452004476174227464170464134636867848854259748598307208023496451202872017391563638898782682744231860"
169 ),
170 MontFp!("3262184035300534872597815773424946999315749875868370883450024250935795691005987313421064966544295981129761226003691"),],];
171
172 for i in input.iter_mut() {
173 AnemoiBls12_381_4_3::sbox_layer(i);
174 }
175
176 for (&i, o) in input.iter().zip(output) {
177 assert_eq!(i, o);
178 }
179 }
180}