spongefish_poseidon2/
lib.rs

1#[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/// Wrapper on Poseidon2KoalaBear of width 16.
12#[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}