openzeppelin_crypto/poseidon2/instance/
goldilocks.rs

1//! This module contains the poseidon sponge hash function parameters for
2//! [`FpGoldiLocks`] field instance.
3
4use crate::{
5    field::instance::FpGoldiLocks, fp_from_hex,
6    poseidon2::params::PoseidonParams,
7};
8
9/// Poseidon sponge hash function parameters for [`FpGoldiLocks`] field
10/// instance.
11pub struct Goldilocks12Params;
12
13#[rustfmt::skip]
14impl PoseidonParams<FpGoldiLocks> for Goldilocks12Params {
15    const T: usize = 12;
16    const D: u8 = 7;
17    // Capacity 4 will give `4*64 = 256` bits security.
18    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}