1use crate::{
5 field::instance::FpGoldiLocks, fp_from_hex,
6 poseidon2::params::PoseidonParams,
7};
8
9pub struct Goldilocks12Params;
12
13#[rustfmt::skip]
14impl PoseidonParams<FpGoldiLocks> for Goldilocks12Params {
15 const T: usize = 12;
16 const D: u8 = 7;
17 const CAPACITY: usize = 4;
19 const ROUNDS_F: usize = 8;
20 const ROUNDS_P: usize = 22;
21 const MAT_INTERNAL_DIAG_M_1: &'static [FpGoldiLocks] = &[
22 fp_from_hex!("c3b6c08e23ba9300"),
23 fp_from_hex!("d84b5de94a324fb6"),
24 fp_from_hex!("0d0c371c5b35b84f"),
25 fp_from_hex!("7964f570e7188037"),
26 fp_from_hex!("5daf18bbd996604b"),
27 fp_from_hex!("6743bc47b9595257"),
28 fp_from_hex!("5528b9362c59bb70"),
29 fp_from_hex!("ac45e25b7127b68b"),
30 fp_from_hex!("a2077d7dfbb606b5"),
31 fp_from_hex!("f3faac6faee378ae"),
32 fp_from_hex!("0c6388b51545e883"),
33 fp_from_hex!("d27dbb6944917b60"),
34 ];
35 const ROUND_CONSTANTS: &'static [&'static [FpGoldiLocks]] = &[
36 &[
37 fp_from_hex!("13dcf33aba214f46"),
38 fp_from_hex!("30b3b654a1da6d83"),
39 fp_from_hex!("1fc634ada6159b56"),
40 fp_from_hex!("937459964dc03466"),
41 fp_from_hex!("edd2ef2ca7949924"),
42 fp_from_hex!("ede9affde0e22f68"),
43 fp_from_hex!("8515b9d6bac9282d"),
44 fp_from_hex!("6b5c07b4e9e900d8"),
45 fp_from_hex!("1ec66368838c8a08"),
46 fp_from_hex!("9042367d80d1fbab"),
47 fp_from_hex!("400283564a3c3799"),
48 fp_from_hex!("4a00be0466bca75e"),
49 ],
50 &[
51 fp_from_hex!("7913beee58e3817f"),
52 fp_from_hex!("f545e88532237d90"),
53 fp_from_hex!("22f8cb8736042005"),
54 fp_from_hex!("6f04990e247a2623"),
55 fp_from_hex!("fe22e87ba37c38cd"),
56 fp_from_hex!("d20e32c85ffe2815"),
57 fp_from_hex!("117227674048fe73"),
58 fp_from_hex!("4e9fb7ea98a6b145"),
59 fp_from_hex!("e0866c232b8af08b"),
60 fp_from_hex!("00bbc77916884964"),
61 fp_from_hex!("7031c0fb990d7116"),
62 fp_from_hex!("240a9e87cf35108f"),
63 ],
64 &[
65 fp_from_hex!("2e6363a5a12244b3"),
66 fp_from_hex!("5e1c3787d1b5011c"),
67 fp_from_hex!("4132660e2a196e8b"),
68 fp_from_hex!("3a013b648d3d4327"),
69 fp_from_hex!("f79839f49888ea43"),
70 fp_from_hex!("fe85658ebafe1439"),
71 fp_from_hex!("b6889825a14240bd"),
72 fp_from_hex!("578453605541382b"),
73 fp_from_hex!("4508cda8f6b63ce9"),
74 fp_from_hex!("9c3ef35848684c91"),
75 fp_from_hex!("0812bde23c87178c"),
76 fp_from_hex!("fe49638f7f722c14"),
77 ],
78 &[
79 fp_from_hex!("8e3f688ce885cbf5"),
80 fp_from_hex!("b8e110acf746a87d"),
81 fp_from_hex!("b4b2e8973a6dabef"),
82 fp_from_hex!("9e714c5da3d462ec"),
83 fp_from_hex!("6438f9033d3d0c15"),
84 fp_from_hex!("24312f7cf1a27199"),
85 fp_from_hex!("23f843bb47acbf71"),
86 fp_from_hex!("9183f11a34be9f01"),
87 fp_from_hex!("839062fbb9d45dbf"),
88 fp_from_hex!("24b56e7e6c2e43fa"),
89 fp_from_hex!("e1683da61c962a72"),
90 fp_from_hex!("a95c63971a19bfa7"),
91 ],
92 &[
93 fp_from_hex!("4adf842aa75d4316"),
94 fp_from_hex!("0000000000000000"),
95 fp_from_hex!("0000000000000000"),
96 fp_from_hex!("0000000000000000"),
97 fp_from_hex!("0000000000000000"),
98 fp_from_hex!("0000000000000000"),
99 fp_from_hex!("0000000000000000"),
100 fp_from_hex!("0000000000000000"),
101 fp_from_hex!("0000000000000000"),
102 fp_from_hex!("0000000000000000"),
103 fp_from_hex!("0000000000000000"),
104 fp_from_hex!("0000000000000000"),
105 ],
106 &[
107 fp_from_hex!("f8fbb871aa4ab4eb"),
108 fp_from_hex!("0000000000000000"),
109 fp_from_hex!("0000000000000000"),
110 fp_from_hex!("0000000000000000"),
111 fp_from_hex!("0000000000000000"),
112 fp_from_hex!("0000000000000000"),
113 fp_from_hex!("0000000000000000"),
114 fp_from_hex!("0000000000000000"),
115 fp_from_hex!("0000000000000000"),
116 fp_from_hex!("0000000000000000"),
117 fp_from_hex!("0000000000000000"),
118 fp_from_hex!("0000000000000000"),
119 ],
120 &[
121 fp_from_hex!("68e85b6eb2dd6aeb"),
122 fp_from_hex!("0000000000000000"),
123 fp_from_hex!("0000000000000000"),
124 fp_from_hex!("0000000000000000"),
125 fp_from_hex!("0000000000000000"),
126 fp_from_hex!("0000000000000000"),
127 fp_from_hex!("0000000000000000"),
128 fp_from_hex!("0000000000000000"),
129 fp_from_hex!("0000000000000000"),
130 fp_from_hex!("0000000000000000"),
131 fp_from_hex!("0000000000000000"),
132 fp_from_hex!("0000000000000000"),
133 ],
134 &[
135 fp_from_hex!("07a0b06b2d270380"),
136 fp_from_hex!("0000000000000000"),
137 fp_from_hex!("0000000000000000"),
138 fp_from_hex!("0000000000000000"),
139 fp_from_hex!("0000000000000000"),
140 fp_from_hex!("0000000000000000"),
141 fp_from_hex!("0000000000000000"),
142 fp_from_hex!("0000000000000000"),
143 fp_from_hex!("0000000000000000"),
144 fp_from_hex!("0000000000000000"),
145 fp_from_hex!("0000000000000000"),
146 fp_from_hex!("0000000000000000"),
147 ],
148 &[
149 fp_from_hex!("d94e0228bd282de4"),
150 fp_from_hex!("0000000000000000"),
151 fp_from_hex!("0000000000000000"),
152 fp_from_hex!("0000000000000000"),
153 fp_from_hex!("0000000000000000"),
154 fp_from_hex!("0000000000000000"),
155 fp_from_hex!("0000000000000000"),
156 fp_from_hex!("0000000000000000"),
157 fp_from_hex!("0000000000000000"),
158 fp_from_hex!("0000000000000000"),
159 fp_from_hex!("0000000000000000"),
160 fp_from_hex!("0000000000000000"),
161 ],
162 &[
163 fp_from_hex!("8bdd91d3250c5278"),
164 fp_from_hex!("0000000000000000"),
165 fp_from_hex!("0000000000000000"),
166 fp_from_hex!("0000000000000000"),
167 fp_from_hex!("0000000000000000"),
168 fp_from_hex!("0000000000000000"),
169 fp_from_hex!("0000000000000000"),
170 fp_from_hex!("0000000000000000"),
171 fp_from_hex!("0000000000000000"),
172 fp_from_hex!("0000000000000000"),
173 fp_from_hex!("0000000000000000"),
174 fp_from_hex!("0000000000000000"),
175 ],
176 &[
177 fp_from_hex!("209c68b88bba778f"),
178 fp_from_hex!("0000000000000000"),
179 fp_from_hex!("0000000000000000"),
180 fp_from_hex!("0000000000000000"),
181 fp_from_hex!("0000000000000000"),
182 fp_from_hex!("0000000000000000"),
183 fp_from_hex!("0000000000000000"),
184 fp_from_hex!("0000000000000000"),
185 fp_from_hex!("0000000000000000"),
186 fp_from_hex!("0000000000000000"),
187 fp_from_hex!("0000000000000000"),
188 fp_from_hex!("0000000000000000"),
189 ],
190 &[
191 fp_from_hex!("b5e18cdab77f3877"),
192 fp_from_hex!("0000000000000000"),
193 fp_from_hex!("0000000000000000"),
194 fp_from_hex!("0000000000000000"),
195 fp_from_hex!("0000000000000000"),
196 fp_from_hex!("0000000000000000"),
197 fp_from_hex!("0000000000000000"),
198 fp_from_hex!("0000000000000000"),
199 fp_from_hex!("0000000000000000"),
200 fp_from_hex!("0000000000000000"),
201 fp_from_hex!("0000000000000000"),
202 fp_from_hex!("0000000000000000"),
203 ],
204 &[
205 fp_from_hex!("b296a3e808da93fa"),
206 fp_from_hex!("0000000000000000"),
207 fp_from_hex!("0000000000000000"),
208 fp_from_hex!("0000000000000000"),
209 fp_from_hex!("0000000000000000"),
210 fp_from_hex!("0000000000000000"),
211 fp_from_hex!("0000000000000000"),
212 fp_from_hex!("0000000000000000"),
213 fp_from_hex!("0000000000000000"),
214 fp_from_hex!("0000000000000000"),
215 fp_from_hex!("0000000000000000"),
216 fp_from_hex!("0000000000000000"),
217 ],
218 &[
219 fp_from_hex!("8370ecbda11a327e"),
220 fp_from_hex!("0000000000000000"),
221 fp_from_hex!("0000000000000000"),
222 fp_from_hex!("0000000000000000"),
223 fp_from_hex!("0000000000000000"),
224 fp_from_hex!("0000000000000000"),
225 fp_from_hex!("0000000000000000"),
226 fp_from_hex!("0000000000000000"),
227 fp_from_hex!("0000000000000000"),
228 fp_from_hex!("0000000000000000"),
229 fp_from_hex!("0000000000000000"),
230 fp_from_hex!("0000000000000000"),
231 ],
232 &[
233 fp_from_hex!("3f9075283775dad8"),
234 fp_from_hex!("0000000000000000"),
235 fp_from_hex!("0000000000000000"),
236 fp_from_hex!("0000000000000000"),
237 fp_from_hex!("0000000000000000"),
238 fp_from_hex!("0000000000000000"),
239 fp_from_hex!("0000000000000000"),
240 fp_from_hex!("0000000000000000"),
241 fp_from_hex!("0000000000000000"),
242 fp_from_hex!("0000000000000000"),
243 fp_from_hex!("0000000000000000"),
244 fp_from_hex!("0000000000000000"),
245 ],
246 &[
247 fp_from_hex!("b78095bb23c6aa84"),
248 fp_from_hex!("0000000000000000"),
249 fp_from_hex!("0000000000000000"),
250 fp_from_hex!("0000000000000000"),
251 fp_from_hex!("0000000000000000"),
252 fp_from_hex!("0000000000000000"),
253 fp_from_hex!("0000000000000000"),
254 fp_from_hex!("0000000000000000"),
255 fp_from_hex!("0000000000000000"),
256 fp_from_hex!("0000000000000000"),
257 fp_from_hex!("0000000000000000"),
258 fp_from_hex!("0000000000000000"),
259 ],
260 &[
261 fp_from_hex!("3f36b9fe72ad4e5f"),
262 fp_from_hex!("0000000000000000"),
263 fp_from_hex!("0000000000000000"),
264 fp_from_hex!("0000000000000000"),
265 fp_from_hex!("0000000000000000"),
266 fp_from_hex!("0000000000000000"),
267 fp_from_hex!("0000000000000000"),
268 fp_from_hex!("0000000000000000"),
269 fp_from_hex!("0000000000000000"),
270 fp_from_hex!("0000000000000000"),
271 fp_from_hex!("0000000000000000"),
272 fp_from_hex!("0000000000000000"),
273 ],
274 &[
275 fp_from_hex!("69bc96780b10b553"),
276 fp_from_hex!("0000000000000000"),
277 fp_from_hex!("0000000000000000"),
278 fp_from_hex!("0000000000000000"),
279 fp_from_hex!("0000000000000000"),
280 fp_from_hex!("0000000000000000"),
281 fp_from_hex!("0000000000000000"),
282 fp_from_hex!("0000000000000000"),
283 fp_from_hex!("0000000000000000"),
284 fp_from_hex!("0000000000000000"),
285 fp_from_hex!("0000000000000000"),
286 fp_from_hex!("0000000000000000"),
287 ],
288 &[
289 fp_from_hex!("3f1d341f2eb7b881"),
290 fp_from_hex!("0000000000000000"),
291 fp_from_hex!("0000000000000000"),
292 fp_from_hex!("0000000000000000"),
293 fp_from_hex!("0000000000000000"),
294 fp_from_hex!("0000000000000000"),
295 fp_from_hex!("0000000000000000"),
296 fp_from_hex!("0000000000000000"),
297 fp_from_hex!("0000000000000000"),
298 fp_from_hex!("0000000000000000"),
299 fp_from_hex!("0000000000000000"),
300 fp_from_hex!("0000000000000000"),
301 ],
302 &[
303 fp_from_hex!("4e939e9815838818"),
304 fp_from_hex!("0000000000000000"),
305 fp_from_hex!("0000000000000000"),
306 fp_from_hex!("0000000000000000"),
307 fp_from_hex!("0000000000000000"),
308 fp_from_hex!("0000000000000000"),
309 fp_from_hex!("0000000000000000"),
310 fp_from_hex!("0000000000000000"),
311 fp_from_hex!("0000000000000000"),
312 fp_from_hex!("0000000000000000"),
313 fp_from_hex!("0000000000000000"),
314 fp_from_hex!("0000000000000000"),
315 ],
316 &[
317 fp_from_hex!("da366b3ae2a31604"),
318 fp_from_hex!("0000000000000000"),
319 fp_from_hex!("0000000000000000"),
320 fp_from_hex!("0000000000000000"),
321 fp_from_hex!("0000000000000000"),
322 fp_from_hex!("0000000000000000"),
323 fp_from_hex!("0000000000000000"),
324 fp_from_hex!("0000000000000000"),
325 fp_from_hex!("0000000000000000"),
326 fp_from_hex!("0000000000000000"),
327 fp_from_hex!("0000000000000000"),
328 fp_from_hex!("0000000000000000"),
329 ],
330 &[
331 fp_from_hex!("bc89db1e7287d509"),
332 fp_from_hex!("0000000000000000"),
333 fp_from_hex!("0000000000000000"),
334 fp_from_hex!("0000000000000000"),
335 fp_from_hex!("0000000000000000"),
336 fp_from_hex!("0000000000000000"),
337 fp_from_hex!("0000000000000000"),
338 fp_from_hex!("0000000000000000"),
339 fp_from_hex!("0000000000000000"),
340 fp_from_hex!("0000000000000000"),
341 fp_from_hex!("0000000000000000"),
342 fp_from_hex!("0000000000000000"),
343 ],
344 &[
345 fp_from_hex!("6102f411f9ef5659"),
346 fp_from_hex!("0000000000000000"),
347 fp_from_hex!("0000000000000000"),
348 fp_from_hex!("0000000000000000"),
349 fp_from_hex!("0000000000000000"),
350 fp_from_hex!("0000000000000000"),
351 fp_from_hex!("0000000000000000"),
352 fp_from_hex!("0000000000000000"),
353 fp_from_hex!("0000000000000000"),
354 fp_from_hex!("0000000000000000"),
355 fp_from_hex!("0000000000000000"),
356 fp_from_hex!("0000000000000000"),
357 ],
358 &[
359 fp_from_hex!("58725c5e7ac1f0ab"),
360 fp_from_hex!("0000000000000000"),
361 fp_from_hex!("0000000000000000"),
362 fp_from_hex!("0000000000000000"),
363 fp_from_hex!("0000000000000000"),
364 fp_from_hex!("0000000000000000"),
365 fp_from_hex!("0000000000000000"),
366 fp_from_hex!("0000000000000000"),
367 fp_from_hex!("0000000000000000"),
368 fp_from_hex!("0000000000000000"),
369 fp_from_hex!("0000000000000000"),
370 fp_from_hex!("0000000000000000"),
371 ],
372 &[
373 fp_from_hex!("0df5856c798883e7"),
374 fp_from_hex!("0000000000000000"),
375 fp_from_hex!("0000000000000000"),
376 fp_from_hex!("0000000000000000"),
377 fp_from_hex!("0000000000000000"),
378 fp_from_hex!("0000000000000000"),
379 fp_from_hex!("0000000000000000"),
380 fp_from_hex!("0000000000000000"),
381 fp_from_hex!("0000000000000000"),
382 fp_from_hex!("0000000000000000"),
383 fp_from_hex!("0000000000000000"),
384 fp_from_hex!("0000000000000000"),
385 ],
386 &[
387 fp_from_hex!("f7bb62a8da4c961b"),
388 fp_from_hex!("0000000000000000"),
389 fp_from_hex!("0000000000000000"),
390 fp_from_hex!("0000000000000000"),
391 fp_from_hex!("0000000000000000"),
392 fp_from_hex!("0000000000000000"),
393 fp_from_hex!("0000000000000000"),
394 fp_from_hex!("0000000000000000"),
395 fp_from_hex!("0000000000000000"),
396 fp_from_hex!("0000000000000000"),
397 fp_from_hex!("0000000000000000"),
398 fp_from_hex!("0000000000000000"),
399 ],
400 &[
401 fp_from_hex!("c68be7c94882a24d"),
402 fp_from_hex!("af996d5d5cdaedd9"),
403 fp_from_hex!("9717f025e7daf6a5"),
404 fp_from_hex!("6436679e6e7216f4"),
405 fp_from_hex!("8a223d99047af267"),
406 fp_from_hex!("bb512e35a133ba9a"),
407 fp_from_hex!("fbbf44097671aa03"),
408 fp_from_hex!("f04058ebf6811e61"),
409 fp_from_hex!("5cca84703fac7ffb"),
410 fp_from_hex!("9b55c7945de6469f"),
411 fp_from_hex!("8e05bf09808e934f"),
412 fp_from_hex!("2ea900de876307d7"),
413 ],
414 &[
415 fp_from_hex!("7748fff2b38dfb89"),
416 fp_from_hex!("6b99a676dd3b5d81"),
417 fp_from_hex!("ac4bb7c627cf7c13"),
418 fp_from_hex!("adb6ebe5e9e2f5ba"),
419 fp_from_hex!("2d33378cafa24ae3"),
420 fp_from_hex!("1e5b73807543f8c2"),
421 fp_from_hex!("09208814bfebb10f"),
422 fp_from_hex!("782e64b6bb5b93dd"),
423 fp_from_hex!("add5a48eac90b50f"),
424 fp_from_hex!("add4c54c736ea4b1"),
425 fp_from_hex!("d58dbb86ed817fd8"),
426 fp_from_hex!("6d5ed1a533f34ddd"),
427 ],
428 &[
429 fp_from_hex!("28686aa3e36b7cb9"),
430 fp_from_hex!("591abd3476689f36"),
431 fp_from_hex!("047d766678f13875"),
432 fp_from_hex!("a2a11112625f5b49"),
433 fp_from_hex!("21fd10a3f8304958"),
434 fp_from_hex!("f9b40711443b0280"),
435 fp_from_hex!("d2697eb8b2bde88e"),
436 fp_from_hex!("3493790b51731b3f"),
437 fp_from_hex!("11caf9dd73764023"),
438 fp_from_hex!("7acfb8f72878164e"),
439 fp_from_hex!("744ec4db23cefc26"),
440 fp_from_hex!("1e00e58f422c6340"),
441 ],
442 &[
443 fp_from_hex!("21dd28d906a62dda"),
444 fp_from_hex!("f32a46ab5f465b5f"),
445 fp_from_hex!("bfce13201f3f7e6b"),
446 fp_from_hex!("f30d2e7adb5304e2"),
447 fp_from_hex!("ecdf4ee4abad48e9"),
448 fp_from_hex!("f94e82182d395019"),
449 fp_from_hex!("4ee52e3744d887c5"),
450 fp_from_hex!("a1341c7cac0083b2"),
451 fp_from_hex!("2302fb26c30c834a"),
452 fp_from_hex!("aea3c587273bf7d3"),
453 fp_from_hex!("f798e24961823ec7"),
454 fp_from_hex!("962deba3e9a2cd94"),
455 ],
456 ];
457}
458
459#[allow(unused_imports)]
460#[cfg(test)]
461mod tests {
462 use crate::{
463 field::instance::FpGoldiLocks,
464 fp_from_hex,
465 poseidon2::{instance::goldilocks::Goldilocks12Params, *},
466 };
467
468 type Scalar = FpGoldiLocks;
469
470 #[test]
471 fn smoke() {
472 let mut poseidon2 = Poseidon2::<Goldilocks12Params, _>::new();
473 for i in 1..Goldilocks12Params::T {
474 poseidon2.absorb(&Scalar::from(i as u64));
475 }
476 let mut perm = poseidon2
477 .squeeze_batch(Goldilocks12Params::T - Goldilocks12Params::CAPACITY)
478 .into_iter();
479
480 assert_eq!(perm.next().unwrap(), fp_from_hex!("919ad117c013584c"));
481 assert_eq!(perm.next().unwrap(), fp_from_hex!("da52e5769cff16e3"));
482 assert_eq!(perm.next().unwrap(), fp_from_hex!("61018d9476a8588e"));
483 assert_eq!(perm.next().unwrap(), fp_from_hex!("eded3197110731fb"));
484 assert_eq!(perm.next().unwrap(), fp_from_hex!("57224df1bb91d294"));
485 assert_eq!(perm.next().unwrap(), fp_from_hex!("655c1fb6ef455b96"));
486 assert_eq!(perm.next().unwrap(), fp_from_hex!("aff582f1574c02b1"));
487 assert_eq!(perm.next().unwrap(), fp_from_hex!("5fde11bb5be4f4f9"));
488 assert!(perm.next().is_none());
489 }
490}