sp1_recursion_core/stark/
poseidon2.rs1use 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}