spongefish_poseidon2/
lib.rs1#[cfg(feature = "p3-baby-bear")]
2pub use p3_baby_bear_poseidon2::{BabyBearPoseidon2_16, BabyBearPoseidon2_24};
3#[cfg(feature = "p3-koala-bear")]
4pub use p3_koala_bear_poseidon2::{KoalaBearPoseidon2_16, KoalaBearPoseidon2_24};
5#[cfg(feature = "risc0-zkp")]
6pub use risc0_poseidon2::RiscZeroBabyBearPoseidon2_24;
7
8#[cfg(feature = "risc0-zkp")]
9mod risc0_poseidon2;
10
11#[cfg(any(feature = "p3-koala-bear", feature = "p3-baby-bear"))]
13macro_rules! impl_permutation {
14 ($name:ident via $permutation:ident<$width:literal> over $field:ty) => {
15 #[derive(Clone)]
16 pub struct $name($permutation<$width>);
17
18 impl From<$permutation<$width>> for $name {
19 fn from(inner: $permutation<$width>) -> Self {
20 Self(inner)
21 }
22 }
23
24 impl spongefish::Permutation<$width> for $name
25 where
26 $permutation<$width>: p3_symmetric::Permutation<[$field; $width]>,
27 {
28 type U = $field;
29
30 fn permute(&self, state: &[Self::U; $width]) -> [Self::U; $width] {
31 p3_symmetric::Permutation::permute(&self.0, state.clone())
32 }
33
34 fn permute_mut(&self, state: &mut [Self::U; $width]) {
35 p3_symmetric::Permutation::permute_mut(&self.0, state);
36 }
37 }
38 };
39}
40
41#[cfg(feature = "p3-koala-bear")]
42#[allow(unused)]
43mod p3_koala_bear_poseidon2 {
44 use p3_koala_bear::{
45 KoalaBear, Poseidon2ExternalLayerKoalaBear, Poseidon2InternalLayerKoalaBear,
46 Poseidon2KoalaBear, KOALABEAR_RC16_EXTERNAL_FINAL, KOALABEAR_RC16_EXTERNAL_INITIAL,
47 KOALABEAR_RC16_INTERNAL,
48 };
49
50 type SpongefishPoseidon2KoalaBear<const WIDTH: usize> = p3_poseidon2::Poseidon2<
51 KoalaBear,
52 Poseidon2ExternalLayerKoalaBear<WIDTH>,
53 Poseidon2InternalLayerKoalaBear<WIDTH>,
54 WIDTH,
55 7,
56 >;
57
58 impl_permutation!(KoalaBearPoseidon2_16 via Poseidon2KoalaBear<16> over KoalaBear);
59 impl_permutation!(KoalaBearPoseidon2_24 via Poseidon2KoalaBear<24> over KoalaBear);
60
61 impl Default for crate::KoalaBearPoseidon2_16 {
62 fn default() -> Self {
63 let p2 = p3_poseidon2::Poseidon2::new(
64 p3_poseidon2::ExternalLayerConstants::new(
65 KOALABEAR_RC16_EXTERNAL_INITIAL.to_vec(),
66 KOALABEAR_RC16_EXTERNAL_FINAL.to_vec(),
67 ),
68 KOALABEAR_RC16_INTERNAL.to_vec(),
69 );
70 Self(p2)
71 }
72 }
73}
74
75#[cfg(feature = "p3-baby-bear")]
76mod p3_baby_bear_poseidon2 {
77 use p3_baby_bear::{
78 BabyBear, Poseidon2ExternalLayerBabyBear, Poseidon2InternalLayerBabyBear,
79 BABYBEAR_RC16_EXTERNAL_FINAL, BABYBEAR_RC16_EXTERNAL_INITIAL, BABYBEAR_RC16_INTERNAL,
80 BABYBEAR_RC24_EXTERNAL_FINAL, BABYBEAR_RC24_EXTERNAL_INITIAL, BABYBEAR_RC24_INTERNAL,
81 };
82
83 type SpongefishPoseidon2BabyBear<const WIDTH: usize> = p3_poseidon2::Poseidon2<
84 BabyBear,
85 Poseidon2ExternalLayerBabyBear<WIDTH>,
86 Poseidon2InternalLayerBabyBear<WIDTH>,
87 WIDTH,
88 7,
89 >;
90
91 impl_permutation!(BabyBearPoseidon2_16 via SpongefishPoseidon2BabyBear<16> over BabyBear);
92 impl_permutation!(BabyBearPoseidon2_24 via SpongefishPoseidon2BabyBear<24> over BabyBear);
93
94 impl Default for crate::BabyBearPoseidon2_24 {
95 fn default() -> Self {
96 let p2 = p3_poseidon2::Poseidon2::new(
97 p3_poseidon2::ExternalLayerConstants::new(
98 BABYBEAR_RC24_EXTERNAL_INITIAL.to_vec(),
99 BABYBEAR_RC24_EXTERNAL_FINAL.to_vec(),
100 ),
101 BABYBEAR_RC24_INTERNAL.to_vec(),
102 );
103 Self(p2)
104 }
105 }
106
107 impl Default for crate::BabyBearPoseidon2_16 {
108 fn default() -> Self {
109 let p2 = p3_poseidon2::Poseidon2::new(
110 p3_poseidon2::ExternalLayerConstants::new(
111 BABYBEAR_RC16_EXTERNAL_INITIAL.to_vec(),
112 BABYBEAR_RC16_EXTERNAL_FINAL.to_vec(),
113 ),
114 BABYBEAR_RC16_INTERNAL.to_vec(),
115 );
116 Self(p2)
117 }
118 }
119}