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}