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