sp1_recursion_core/stark/
poseidon2.rs

1use ff::PrimeField as FFPrimeField;
2use p3_bn254_fr::{Bn254Fr, FFBn254Fr};
3use zkhash::{
4    ark_ff::{BigInteger, PrimeField},
5    fields::bn256::FpBN256 as ark_FpBN256,
6    poseidon2::poseidon2_instance_bn256::RC3,
7};
8
9fn bn254_from_ark_ff(input: ark_FpBN256) -> Bn254Fr {
10    let bytes = input.into_bigint().to_bytes_le();
11
12    let mut res = <FFBn254Fr as ff::PrimeField>::Repr::default();
13
14    for (i, digit) in res.0.as_mut().iter_mut().enumerate() {
15        *digit = bytes[i];
16    }
17
18    let value = FFBn254Fr::from_repr(res);
19
20    if value.is_some().into() {
21        Bn254Fr { value: value.unwrap() }
22    } else {
23        panic!("Invalid field element")
24    }
25}
26
27pub fn bn254_poseidon2_rc3() -> Vec<[Bn254Fr; 3]> {
28    RC3.iter()
29        .map(|vec| {
30            vec.iter().cloned().map(bn254_from_ark_ff).collect::<Vec<_>>().try_into().unwrap()
31        })
32        .collect()
33}
34
35pub fn bn254_poseidon2_rc4() -> Vec<[Bn254Fr; 4]> {
36    RC3.iter()
37        .map(|vec| {
38            let result: [Bn254Fr; 3] =
39                vec.iter().cloned().map(bn254_from_ark_ff).collect::<Vec<_>>().try_into().unwrap();
40            [result[0], result[1], result[2], result[2]]
41        })
42        .collect()
43}