Skip to main content

slop_koala_bear/
koala_bear_poseidon2.rs

1use std::array::from_fn;
2
3use crate::{DiffusionMatrixKoalaBear, KoalaBear};
4use lazy_static::lazy_static;
5use serde::{Deserialize, Serialize};
6use slop_algebra::{extension::BinomialExtensionField, AbstractField};
7use slop_challenger::{DuplexChallenger, IopCtx};
8use slop_poseidon2::{Poseidon2, Poseidon2ExternalMatrixGeneral};
9use slop_symmetric::{PaddingFreeSponge, TruncatedPermutation};
10
11pub(crate) fn string_to_koala_bear(hex_string: String) -> KoalaBear {
12    KoalaBear::from_canonical_u64(
13        u64::from_str_radix(&hex_string[2..], 16).expect("Invalid KoalaBear hex string"),
14    )
15}
16
17#[derive(Debug, Clone, Default, Copy, Serialize, Deserialize, Hash, PartialEq, Eq)]
18pub struct Poseidon2KoalaBearConfig<const STATE_WIDTH: usize = 16>;
19
20pub type KoalaPerm =
21    Poseidon2<KoalaBear, Poseidon2ExternalMatrixGeneral, DiffusionMatrixKoalaBear, 16, 3>;
22
23#[derive(Clone, Serialize, Deserialize, Eq, PartialEq, Debug, Default)]
24pub struct KoalaBearDegree4Duplex;
25
26pub const KOALA_BEAR_DIGEST_SIZE: usize = 8;
27
28impl IopCtx for KoalaBearDegree4Duplex {
29    type F = KoalaBear;
30    type EF = BinomialExtensionField<KoalaBear, 4>;
31    type Digest = [KoalaBear; KOALA_BEAR_DIGEST_SIZE];
32    type Challenger = DuplexChallenger<Self::F, KoalaPerm, 16, 8>;
33    type Hasher = PaddingFreeSponge<KoalaPerm, 16, 8, 8>;
34    type Compressor = TruncatedPermutation<KoalaPerm, 2, 8, 16>;
35
36    fn default_hasher_and_compressor() -> (Self::Hasher, Self::Compressor) {
37        let perm = my_kb_16_perm();
38        let hasher = Self::Hasher::new(perm.clone());
39        let compressor = Self::Compressor::new(perm.clone());
40        (hasher, compressor)
41    }
42
43    fn default_challenger() -> Self::Challenger {
44        DuplexChallenger::new(my_kb_16_perm())
45    }
46}
47
48pub fn my_kb_16_perm() -> KoalaPerm {
49    const ROUNDS_F: usize = 8;
50    const ROUNDS_P: usize = 20;
51    let mut external_round_constants = KoalaBear_BEGIN_EXT_CONSTS.to_vec();
52    let internal_round_constants = KoalaBear_PARTIAL_CONSTS.to_vec();
53    external_round_constants.extend_from_slice(KoalaBear_END_EXT_CONSTS.as_slice());
54
55    KoalaPerm::new(
56        ROUNDS_F,
57        external_round_constants,
58        Poseidon2ExternalMatrixGeneral,
59        ROUNDS_P,
60        internal_round_constants,
61        DiffusionMatrixKoalaBear,
62    )
63}
64
65const KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS: usize = 4;
66const KOALA_BEAR_POSEIDON2_PARTIAL_ROUNDS: usize = 20;
67const KOALA_BEAR_POSEIDON2_WIDTH: usize = 16;
68
69pub(crate) fn koala_bear_round_consts(
70) -> ([[KoalaBear; 16]; 4], [KoalaBear; 20], [[KoalaBear; 16]; 4]) {
71    let p3_rc16: Vec<Vec<KoalaBear>> = RC16
72        .iter()
73        .map(|round| round.iter().map(|elem| string_to_koala_bear(elem.clone())).collect())
74        .collect();
75    let p_end = KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS + KOALA_BEAR_POSEIDON2_PARTIAL_ROUNDS;
76
77    let beginning_full_round_constants: [[KoalaBear; KOALA_BEAR_POSEIDON2_WIDTH];
78        KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS] =
79        from_fn(|i| p3_rc16[i].clone().try_into().unwrap());
80    let partial_round_constants: [KoalaBear; KOALA_BEAR_POSEIDON2_PARTIAL_ROUNDS] =
81        from_fn(|i| p3_rc16[i + KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS][0]);
82    let ending_full_round_constants: [[KoalaBear; KOALA_BEAR_POSEIDON2_WIDTH];
83        KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS] =
84        from_fn(|i| p3_rc16[i + p_end].clone().try_into().unwrap());
85
86    (beginning_full_round_constants, partial_round_constants, ending_full_round_constants)
87}
88
89lazy_static! {
90    pub static ref KoalaBear_BEGIN_EXT_CONSTS: [[KoalaBear; KOALA_BEAR_POSEIDON2_WIDTH]; KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS] =
91        koala_bear_round_consts().0;
92    pub static ref KoalaBear_PARTIAL_CONSTS: [KoalaBear; KOALA_BEAR_POSEIDON2_PARTIAL_ROUNDS] =
93        koala_bear_round_consts().1;
94    pub static ref KoalaBear_END_EXT_CONSTS: [[KoalaBear; KOALA_BEAR_POSEIDON2_WIDTH]; KOALA_BEAR_POSEIDON2_HALF_FULL_ROUNDS] =
95        koala_bear_round_consts().2;
96    pub static ref RC16: Vec<Vec<String>> = vec![
97        vec![
98            ("0x7ee56a48".to_string()),
99            ("0x11367045".to_string()),
100            ("0x12e41941".to_string()),
101            ("0x7ebbc12b".to_string()),
102            ("0x1970b7d5".to_string()),
103            ("0x662b60e8".to_string()),
104            ("0x3e4990c6".to_string()),
105            ("0x679f91f5".to_string()),
106            ("0x350813bb".to_string()),
107            ("0x00874ad4".to_string()),
108            ("0x28a0081a".to_string()),
109            ("0x18fa5872".to_string()),
110            ("0x5f25b071".to_string()),
111            ("0x5e5d5998".to_string()),
112            ("0x5e6fd3e7".to_string()),
113            ("0x5b2e2660".to_string()),
114        ],
115        vec![
116            ("0x6f1837bf".to_string()),
117            ("0x3fe6182b".to_string()),
118            ("0x1edd7ac5".to_string()),
119            ("0x57470d00".to_string()),
120            ("0x43d486d5".to_string()),
121            ("0x1982c70f".to_string()),
122            ("0x0ea53af9".to_string()),
123            ("0x61d6165b".to_string()),
124            ("0x51639c00".to_string()),
125            ("0x2dec352c".to_string()),
126            ("0x2950e531".to_string()),
127            ("0x2d2cb947".to_string()),
128            ("0x08256cef".to_string()),
129            ("0x1a0109f6".to_string()),
130            ("0x1f51faf3".to_string()),
131            ("0x5cef1c62".to_string()),
132        ],
133        vec![
134            ("0x3d65e50e".to_string()),
135            ("0x33d91626".to_string()),
136            ("0x133d5a1e".to_string()),
137            ("0x0ff49b0d".to_string()),
138            ("0x38900cd1".to_string()),
139            ("0x2c22cc3f".to_string()),
140            ("0x28852bb2".to_string()),
141            ("0x06c65a02".to_string()),
142            ("0x7b2cf7bc".to_string()),
143            ("0x68016e1a".to_string()),
144            ("0x15e16bc0".to_string()),
145            ("0x5248149a".to_string()),
146            ("0x6dd212a0".to_string()),
147            ("0x18d6830a".to_string()),
148            ("0x5001be82".to_string()),
149            ("0x64dac34e".to_string()),
150        ],
151        vec![
152            ("0x5902b287".to_string()),
153            ("0x426583a0".to_string()),
154            ("0x0c921632".to_string()),
155            ("0x3fe028a5".to_string()),
156            ("0x245f8e49".to_string()),
157            ("0x43bb297e".to_string()),
158            ("0x7873dbd9".to_string()),
159            ("0x3cc987df".to_string()),
160            ("0x286bb4ce".to_string()),
161            ("0x640a8dcd".to_string()),
162            ("0x512a8e36".to_string()),
163            ("0x03a4cf55".to_string()),
164            ("0x481837a2".to_string()),
165            ("0x03d6da84".to_string()),
166            ("0x73726ac7".to_string()),
167            ("0x760e7fdf".to_string()),
168        ],
169        vec![
170            ("0x54dfeb5d".to_string()),
171            ("0x00000000".to_string()),
172            ("0x00000000".to_string()),
173            ("0x00000000".to_string()),
174            ("0x00000000".to_string()),
175            ("0x00000000".to_string()),
176            ("0x00000000".to_string()),
177            ("0x00000000".to_string()),
178            ("0x00000000".to_string()),
179            ("0x00000000".to_string()),
180            ("0x00000000".to_string()),
181            ("0x00000000".to_string()),
182            ("0x00000000".to_string()),
183            ("0x00000000".to_string()),
184            ("0x00000000".to_string()),
185            ("0x00000000".to_string()),
186        ],
187        vec![
188            ("0x7d40afd6".to_string()),
189            ("0x00000000".to_string()),
190            ("0x00000000".to_string()),
191            ("0x00000000".to_string()),
192            ("0x00000000".to_string()),
193            ("0x00000000".to_string()),
194            ("0x00000000".to_string()),
195            ("0x00000000".to_string()),
196            ("0x00000000".to_string()),
197            ("0x00000000".to_string()),
198            ("0x00000000".to_string()),
199            ("0x00000000".to_string()),
200            ("0x00000000".to_string()),
201            ("0x00000000".to_string()),
202            ("0x00000000".to_string()),
203            ("0x00000000".to_string()),
204        ],
205        vec![
206            ("0x722cb316".to_string()),
207            ("0x00000000".to_string()),
208            ("0x00000000".to_string()),
209            ("0x00000000".to_string()),
210            ("0x00000000".to_string()),
211            ("0x00000000".to_string()),
212            ("0x00000000".to_string()),
213            ("0x00000000".to_string()),
214            ("0x00000000".to_string()),
215            ("0x00000000".to_string()),
216            ("0x00000000".to_string()),
217            ("0x00000000".to_string()),
218            ("0x00000000".to_string()),
219            ("0x00000000".to_string()),
220            ("0x00000000".to_string()),
221            ("0x00000000".to_string()),
222        ],
223        vec![
224            ("0x106a4573".to_string()),
225            ("0x00000000".to_string()),
226            ("0x00000000".to_string()),
227            ("0x00000000".to_string()),
228            ("0x00000000".to_string()),
229            ("0x00000000".to_string()),
230            ("0x00000000".to_string()),
231            ("0x00000000".to_string()),
232            ("0x00000000".to_string()),
233            ("0x00000000".to_string()),
234            ("0x00000000".to_string()),
235            ("0x00000000".to_string()),
236            ("0x00000000".to_string()),
237            ("0x00000000".to_string()),
238            ("0x00000000".to_string()),
239            ("0x00000000".to_string()),
240        ],
241        vec![
242            ("0x45a7ccdb".to_string()),
243            ("0x00000000".to_string()),
244            ("0x00000000".to_string()),
245            ("0x00000000".to_string()),
246            ("0x00000000".to_string()),
247            ("0x00000000".to_string()),
248            ("0x00000000".to_string()),
249            ("0x00000000".to_string()),
250            ("0x00000000".to_string()),
251            ("0x00000000".to_string()),
252            ("0x00000000".to_string()),
253            ("0x00000000".to_string()),
254            ("0x00000000".to_string()),
255            ("0x00000000".to_string()),
256            ("0x00000000".to_string()),
257            ("0x00000000".to_string()),
258        ],
259        vec![
260            ("0x44061375".to_string()),
261            ("0x00000000".to_string()),
262            ("0x00000000".to_string()),
263            ("0x00000000".to_string()),
264            ("0x00000000".to_string()),
265            ("0x00000000".to_string()),
266            ("0x00000000".to_string()),
267            ("0x00000000".to_string()),
268            ("0x00000000".to_string()),
269            ("0x00000000".to_string()),
270            ("0x00000000".to_string()),
271            ("0x00000000".to_string()),
272            ("0x00000000".to_string()),
273            ("0x00000000".to_string()),
274            ("0x00000000".to_string()),
275            ("0x00000000".to_string()),
276        ],
277        vec![
278            ("0x154077a5".to_string()),
279            ("0x00000000".to_string()),
280            ("0x00000000".to_string()),
281            ("0x00000000".to_string()),
282            ("0x00000000".to_string()),
283            ("0x00000000".to_string()),
284            ("0x00000000".to_string()),
285            ("0x00000000".to_string()),
286            ("0x00000000".to_string()),
287            ("0x00000000".to_string()),
288            ("0x00000000".to_string()),
289            ("0x00000000".to_string()),
290            ("0x00000000".to_string()),
291            ("0x00000000".to_string()),
292            ("0x00000000".to_string()),
293            ("0x00000000".to_string()),
294        ],
295        vec![
296            ("0x45744faa".to_string()),
297            ("0x00000000".to_string()),
298            ("0x00000000".to_string()),
299            ("0x00000000".to_string()),
300            ("0x00000000".to_string()),
301            ("0x00000000".to_string()),
302            ("0x00000000".to_string()),
303            ("0x00000000".to_string()),
304            ("0x00000000".to_string()),
305            ("0x00000000".to_string()),
306            ("0x00000000".to_string()),
307            ("0x00000000".to_string()),
308            ("0x00000000".to_string()),
309            ("0x00000000".to_string()),
310            ("0x00000000".to_string()),
311            ("0x00000000".to_string()),
312        ],
313        vec![
314            ("0x4eb5e5ee".to_string()),
315            ("0x00000000".to_string()),
316            ("0x00000000".to_string()),
317            ("0x00000000".to_string()),
318            ("0x00000000".to_string()),
319            ("0x00000000".to_string()),
320            ("0x00000000".to_string()),
321            ("0x00000000".to_string()),
322            ("0x00000000".to_string()),
323            ("0x00000000".to_string()),
324            ("0x00000000".to_string()),
325            ("0x00000000".to_string()),
326            ("0x00000000".to_string()),
327            ("0x00000000".to_string()),
328            ("0x00000000".to_string()),
329            ("0x00000000".to_string()),
330        ],
331        vec![
332            ("0x3794e83f".to_string()),
333            ("0x00000000".to_string()),
334            ("0x00000000".to_string()),
335            ("0x00000000".to_string()),
336            ("0x00000000".to_string()),
337            ("0x00000000".to_string()),
338            ("0x00000000".to_string()),
339            ("0x00000000".to_string()),
340            ("0x00000000".to_string()),
341            ("0x00000000".to_string()),
342            ("0x00000000".to_string()),
343            ("0x00000000".to_string()),
344            ("0x00000000".to_string()),
345            ("0x00000000".to_string()),
346            ("0x00000000".to_string()),
347            ("0x00000000".to_string()),
348        ],
349        vec![
350            ("0x47c7093c".to_string()),
351            ("0x00000000".to_string()),
352            ("0x00000000".to_string()),
353            ("0x00000000".to_string()),
354            ("0x00000000".to_string()),
355            ("0x00000000".to_string()),
356            ("0x00000000".to_string()),
357            ("0x00000000".to_string()),
358            ("0x00000000".to_string()),
359            ("0x00000000".to_string()),
360            ("0x00000000".to_string()),
361            ("0x00000000".to_string()),
362            ("0x00000000".to_string()),
363            ("0x00000000".to_string()),
364            ("0x00000000".to_string()),
365            ("0x00000000".to_string()),
366        ],
367        vec![
368            ("0x5694903c".to_string()),
369            ("0x00000000".to_string()),
370            ("0x00000000".to_string()),
371            ("0x00000000".to_string()),
372            ("0x00000000".to_string()),
373            ("0x00000000".to_string()),
374            ("0x00000000".to_string()),
375            ("0x00000000".to_string()),
376            ("0x00000000".to_string()),
377            ("0x00000000".to_string()),
378            ("0x00000000".to_string()),
379            ("0x00000000".to_string()),
380            ("0x00000000".to_string()),
381            ("0x00000000".to_string()),
382            ("0x00000000".to_string()),
383            ("0x00000000".to_string()),
384        ],
385        vec![
386            ("0x69cb6299".to_string()),
387            ("0x00000000".to_string()),
388            ("0x00000000".to_string()),
389            ("0x00000000".to_string()),
390            ("0x00000000".to_string()),
391            ("0x00000000".to_string()),
392            ("0x00000000".to_string()),
393            ("0x00000000".to_string()),
394            ("0x00000000".to_string()),
395            ("0x00000000".to_string()),
396            ("0x00000000".to_string()),
397            ("0x00000000".to_string()),
398            ("0x00000000".to_string()),
399            ("0x00000000".to_string()),
400            ("0x00000000".to_string()),
401            ("0x00000000".to_string()),
402        ],
403        vec![
404            ("0x373df84c".to_string()),
405            ("0x00000000".to_string()),
406            ("0x00000000".to_string()),
407            ("0x00000000".to_string()),
408            ("0x00000000".to_string()),
409            ("0x00000000".to_string()),
410            ("0x00000000".to_string()),
411            ("0x00000000".to_string()),
412            ("0x00000000".to_string()),
413            ("0x00000000".to_string()),
414            ("0x00000000".to_string()),
415            ("0x00000000".to_string()),
416            ("0x00000000".to_string()),
417            ("0x00000000".to_string()),
418            ("0x00000000".to_string()),
419            ("0x00000000".to_string()),
420        ],
421        vec![
422            ("0x46a0df58".to_string()),
423            ("0x00000000".to_string()),
424            ("0x00000000".to_string()),
425            ("0x00000000".to_string()),
426            ("0x00000000".to_string()),
427            ("0x00000000".to_string()),
428            ("0x00000000".to_string()),
429            ("0x00000000".to_string()),
430            ("0x00000000".to_string()),
431            ("0x00000000".to_string()),
432            ("0x00000000".to_string()),
433            ("0x00000000".to_string()),
434            ("0x00000000".to_string()),
435            ("0x00000000".to_string()),
436            ("0x00000000".to_string()),
437            ("0x00000000".to_string()),
438        ],
439        vec![
440            ("0x46b8758a".to_string()),
441            ("0x00000000".to_string()),
442            ("0x00000000".to_string()),
443            ("0x00000000".to_string()),
444            ("0x00000000".to_string()),
445            ("0x00000000".to_string()),
446            ("0x00000000".to_string()),
447            ("0x00000000".to_string()),
448            ("0x00000000".to_string()),
449            ("0x00000000".to_string()),
450            ("0x00000000".to_string()),
451            ("0x00000000".to_string()),
452            ("0x00000000".to_string()),
453            ("0x00000000".to_string()),
454            ("0x00000000".to_string()),
455            ("0x00000000".to_string()),
456        ],
457        vec![
458            ("0x3241ebcb".to_string()),
459            ("0x00000000".to_string()),
460            ("0x00000000".to_string()),
461            ("0x00000000".to_string()),
462            ("0x00000000".to_string()),
463            ("0x00000000".to_string()),
464            ("0x00000000".to_string()),
465            ("0x00000000".to_string()),
466            ("0x00000000".to_string()),
467            ("0x00000000".to_string()),
468            ("0x00000000".to_string()),
469            ("0x00000000".to_string()),
470            ("0x00000000".to_string()),
471            ("0x00000000".to_string()),
472            ("0x00000000".to_string()),
473            ("0x00000000".to_string()),
474        ],
475        vec![
476            ("0x0b09d233".to_string()),
477            ("0x00000000".to_string()),
478            ("0x00000000".to_string()),
479            ("0x00000000".to_string()),
480            ("0x00000000".to_string()),
481            ("0x00000000".to_string()),
482            ("0x00000000".to_string()),
483            ("0x00000000".to_string()),
484            ("0x00000000".to_string()),
485            ("0x00000000".to_string()),
486            ("0x00000000".to_string()),
487            ("0x00000000".to_string()),
488            ("0x00000000".to_string()),
489            ("0x00000000".to_string()),
490            ("0x00000000".to_string()),
491            ("0x00000000".to_string()),
492        ],
493        vec![
494            ("0x1af42357".to_string()),
495            ("0x00000000".to_string()),
496            ("0x00000000".to_string()),
497            ("0x00000000".to_string()),
498            ("0x00000000".to_string()),
499            ("0x00000000".to_string()),
500            ("0x00000000".to_string()),
501            ("0x00000000".to_string()),
502            ("0x00000000".to_string()),
503            ("0x00000000".to_string()),
504            ("0x00000000".to_string()),
505            ("0x00000000".to_string()),
506            ("0x00000000".to_string()),
507            ("0x00000000".to_string()),
508            ("0x00000000".to_string()),
509            ("0x00000000".to_string()),
510        ],
511        vec![
512            ("0x1e66cec2".to_string()),
513            ("0x00000000".to_string()),
514            ("0x00000000".to_string()),
515            ("0x00000000".to_string()),
516            ("0x00000000".to_string()),
517            ("0x00000000".to_string()),
518            ("0x00000000".to_string()),
519            ("0x00000000".to_string()),
520            ("0x00000000".to_string()),
521            ("0x00000000".to_string()),
522            ("0x00000000".to_string()),
523            ("0x00000000".to_string()),
524            ("0x00000000".to_string()),
525            ("0x00000000".to_string()),
526            ("0x00000000".to_string()),
527            ("0x00000000".to_string()),
528        ],
529        vec![
530            ("0x43e7dc24".to_string()),
531            ("0x259a5d61".to_string()),
532            ("0x27e85a3b".to_string()),
533            ("0x1b9133fa".to_string()),
534            ("0x343e5628".to_string()),
535            ("0x485cd4c2".to_string()),
536            ("0x16e269f5".to_string()),
537            ("0x165b60c6".to_string()),
538            ("0x25f683d9".to_string()),
539            ("0x124f81f9".to_string()),
540            ("0x174331f9".to_string()),
541            ("0x77344dc5".to_string()),
542            ("0x5a821dba".to_string()),
543            ("0x5fc4177f".to_string()),
544            ("0x54153bf5".to_string()),
545            ("0x5e3f1194".to_string()),
546        ],
547        vec![
548            ("0x3bdbf191".to_string()),
549            ("0x088c84a3".to_string()),
550            ("0x68256c9b".to_string()),
551            ("0x3c90bbc6".to_string()),
552            ("0x6846166a".to_string()),
553            ("0x03f4238d".to_string()),
554            ("0x463335fb".to_string()),
555            ("0x5e3d3551".to_string()),
556            ("0x6e59ae6f".to_string()),
557            ("0x32d06cc0".to_string()),
558            ("0x596293f3".to_string()),
559            ("0x6c87edb2".to_string()),
560            ("0x08fc60b5".to_string()),
561            ("0x34bcca80".to_string()),
562            ("0x24f007f3".to_string()),
563            ("0x62731c6f".to_string()),
564        ],
565        vec![
566            ("0x1e1db6c6".to_string()),
567            ("0x0ca409bb".to_string()),
568            ("0x585c1e78".to_string()),
569            ("0x56e94edc".to_string()),
570            ("0x16d22734".to_string()),
571            ("0x18e11467".to_string()),
572            ("0x7b2c3730".to_string()),
573            ("0x770075e4".to_string()),
574            ("0x35d1b18c".to_string()),
575            ("0x22be3db5".to_string()),
576            ("0x4fb1fbb7".to_string()),
577            ("0x477cb3ed".to_string()),
578            ("0x7d5311c6".to_string()),
579            ("0x5b62ae7d".to_string()),
580            ("0x559c5fa8".to_string()),
581            ("0x77f15048".to_string()),
582        ],
583        vec![
584            ("0x3211570b".to_string()),
585            ("0x490fef6a".to_string()),
586            ("0x77ec311f".to_string()),
587            ("0x2247171b".to_string()),
588            ("0x4e0ac711".to_string()),
589            ("0x2edf69c9".to_string()),
590            ("0x3b5a8850".to_string()),
591            ("0x65809421".to_string()),
592            ("0x5619b4aa".to_string()),
593            ("0x362019a7".to_string()),
594            ("0x6bf9d4ed".to_string()),
595            ("0x5b413dff".to_string()),
596            ("0x617e181e".to_string()),
597            ("0x5e7ab57b".to_string()),
598            ("0x33ad7833".to_string()),
599            ("0x3466c7ca".to_string()),
600        ],
601    ];
602}