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