anemoi/bls12_381/anemoi_4_3/
mod.rsuse super::{sbox, Felt, MontFp};
use crate::{Anemoi, Jive, Sponge};
use ark_ff::{One, Zero};
mod digest;
mod hasher;
mod round_constants;
pub use digest::AnemoiDigest;
pub const STATE_WIDTH: usize = 4;
pub const RATE_WIDTH: usize = 3;
pub const NUM_COLUMNS: usize = 2;
pub const DIGEST_SIZE: usize = 1;
pub const NUM_HASH_ROUNDS: usize = 14;
#[derive(Debug, Clone)]
pub struct AnemoiBls12_381_4_3;
impl<'a> Anemoi<'a, Felt> for AnemoiBls12_381_4_3 {
const NUM_COLUMNS: usize = NUM_COLUMNS;
const NUM_ROUNDS: usize = NUM_HASH_ROUNDS;
const WIDTH: usize = STATE_WIDTH;
const RATE: usize = RATE_WIDTH;
const OUTPUT_SIZE: usize = DIGEST_SIZE;
const ARK_C: &'a [Felt] = &round_constants::C;
const ARK_D: &'a [Felt] = &round_constants::D;
const GROUP_GENERATOR: u32 = sbox::BETA;
const ALPHA: u32 = sbox::ALPHA;
const INV_ALPHA: Felt = sbox::INV_ALPHA;
const BETA: u32 = sbox::BETA;
const DELTA: Felt = sbox::DELTA;
fn exp_by_inv_alpha(x: Felt) -> Felt {
sbox::exp_by_inv_alpha(&x)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sbox() {
let mut input = [
[Felt::zero(); 4],
[Felt::one(); 4],
[Felt::zero(), Felt::zero(), Felt::one(), Felt::one()],
[Felt::one(), Felt::one(), Felt::zero(), Felt::zero()],
[MontFp!("2081602124513646137695314117326388648754841306540974921206706910089368274988230529250912492350013284696252680611719"
),
MontFp!("468253762223819495911247862969663819827315608924033316759435717605721341564168786674751723237223287123382844475978"
),
MontFp!("1790599177195186268011570559642647876382499348837053781267173241988678124171645198912369406527054802837106787436886"
),
MontFp!("293930289777017343813488045367525917593744818399737543555288111616475267691832744004085663212197382675969483818729"),],[MontFp!("441572871730196319035031749686220639442405143952816520002713161299914796478982096333953332748686216661783048168923"
),
MontFp!("2915418195618530442003858944276026663660226152151556582592592304687094600333178096659246084643589600504277590051737"
),
MontFp!("2509576532036978236563559425122278218185069784456253103747919079306012396653736481604933141817197783650351928086952"
),
MontFp!("863779193975931658183094597594568093256087575096034004831214171661965691838491189370455101703955758992386018484200"),],[MontFp!("2441973641744968616720839939572938698254898805125876839708046674418735434264119675167995046372542532960905385038142"
),
MontFp!("1621684423703802440219025540277466322011894942739954094170101949330785499647694504227160410729282058921065173608493"
),
MontFp!("507586788055666087125636262632846272994367208316845297095920906774079561056618810495557683679482047746598826680545"
),
MontFp!("3782501457089999228732705613962535608630632344070766602867932348444101532425256087308331743903688756531812846473598"),],[MontFp!("2455362494341367102046842853095253861632254670549992904190828326459648246878593282565792580717369445695065755883401"
),
MontFp!("301310021690980220528611239358435226101742493254380106179493023959735689893915513360813228510791334164881128825763"
),
MontFp!("3861676326565229332594652587719210898573617733850369115681805483758644226675819041047331767761872934471679179252485"
),
MontFp!("1446267223429054484533485188134030814480768754481328847702595780498849652750051304567570517881711834975058885220594"),],[MontFp!("240127785612843655978300266055833755875786658507228378206341569127372273660320305073330828620234934285057407453420"
),
MontFp!("2993813551314088530320185588994621774415633623177363806042260572224273197340650647195935152156965564198446614410745"
),
MontFp!("1139825206959636706128635474073142820587033652987042864248663416156882662796954980143056019974055648862158592083772"
),
MontFp!("2711593982082807599852073796225247529645949197536937280722656193456115081389029059360702216765919289542497838460212"),],[MontFp!("2997029641596197058207513951095821316235379607143565133288043800556792446568081350508209295511513893829205142266158"
),
MontFp!("3634972483100356404859713122758035883644834267949074765185451174659647285869022037902029643855131033446048805519967"
),
MontFp!("1833881154570872385866976559458683706845881515432300714556054903854337381464890057901829048322200263844324085022204"
),
MontFp!("2961342067900645293751321010096625502779838797936336795154134240479607482604713414396303369341713598298272778984167"),],];
let output = [
[MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279894"
),
MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279894"),Felt::zero(),Felt::zero(),],[MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279901"
),
MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279901"
),
MontFp!("2"
),
MontFp!("2"),],[MontFp!("3409024350324770932167116073246649688369598710716962856079695054623192887746906059977244451934321045232801607693752"
),
MontFp!("3409024350324770932167116073246649688369598710716962856079695054623192887746906059977244451934321045232801607693752"
),
MontFp!("1329263574752159191211793849573133266716936406142823755742645842982909514268936466892710969217855617281191220461747"
),
MontFp!("1329263574752159191211793849573133266716936406142823755742645842982909514268936466892710969217855617281191220461747"),],[MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279897"
),
MontFp!("2001204777610833696708894912867952078278441409969503942666029068062015825245418932221343814564507832018947136279897"
),
MontFp!("4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786"
),
MontFp!("4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786"),],[MontFp!("834439169804048824470052574420236030833961988987691496757852680487904729384570491777210628987362280984864850742793"
),
MontFp!("3806615707916953028284861568141164127968907073394611337473107064150014540228704835445774035912140156915404028787846"
),
MontFp!("1033097831859890497494604960157536630731507241099218683648230717486381727705016380139561283847688437536318796970617"
),
MontFp!("3715767011826736754853324713629394232201042606353810673815508422669232900680887141493261140003301149178281278440423"),],[MontFp!("2919025707759556970717683233069614263002933316032281869690759119579997877431683272842821298923869667820224511720885"
),
MontFp!("3135992476675763436759645893894968611903607315146320500918639175800916799220825268982799630555605195664266902104170"
),
MontFp!("2731585273194351628592800069397863038644904389544168412964683242069522832770220517984853173875522300171182634821200"
),
MontFp!("1124690147119502598656728120824446719452885161719259258014458985213439061531456656124512838648713284931591892601592"),],[MontFp!("1001951031379804692917039694494326513935962135620753485846692535593549975525543444819156363971040909583651464899479"
),
MontFp!("3139571804296440930171271111027455641027534214482732883531067271464179093425895866908634660820610808770003418456387"
),
MontFp!("7469481272372962452587301166015037014393870617555771249258769179712803351540624610979014359152798325020193052026"
),
MontFp!("1186351354659048675596172277751140932384855325947693139667718723908659064335306879849840628809501497977398787502051"),],[MontFp!("3560830719491817970659813645961553097462590653341857616858943804051905223459485985450453068610750049794339715675413"
),
MontFp!("3714223960474366934827162292532974263137376459765164571051695631726401669469692159480735541602243326344467468213901"
),
MontFp!("2297165886194646287074293404572093402389666048338055527106194950767426736076754159449679861633077367309408836299389"
),
MontFp!("404784666489194356884819889522452560608243909990037999106065297443798277620351143092333243006722230489706363160024"),],[MontFp!("2587691041415297208170813621426123711587130311656763106443526157156436517845452124196281924978357506575145761348395"
),
MontFp!("3524210195795102648186572100209075907981195895606975903918531654123759994752504406361148960875464108301039130788254"
),
MontFp!("1003582579185259380618898665178193931248336323946137514501508078622590709315946841672191680628523973330573135520824"
),
MontFp!("3376310366754963166951571853027536276000162884850203098936199690722103424949058295369803171264574693931565888540995"),],[MontFp!("2793930555241504233224768584553500316357054380321077379375434743545669401613268602169625866566640788149926011644948"
),
MontFp!("1966890074557743708422260153134332706103244072613897205404929834384329609774782299620923843299432293058751323341105"
),
MontFp!("2658823954834469452004476174227464170464134636867848854259748598307208023496451202872017391563638898782682744231860"
),
MontFp!("3262184035300534872597815773424946999315749875868370883450024250935795691005987313421064966544295981129761226003691"),],];
for i in input.iter_mut() {
AnemoiBls12_381_4_3::sbox_layer(i);
}
for (&i, o) in input.iter().zip(output) {
assert_eq!(i, o);
}
}
}