From c2580ace319e01bc8657dc92a6b5775348ce3133 Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Mon, 13 Oct 2025 23:15:50 +0800 Subject: [PATCH 1/5] impl Default for SwCurves --- crates/curves/src/weierstrass/bn254.rs | 4 ++-- crates/curves/src/weierstrass/mod.rs | 2 +- crates/curves/src/weierstrass/secp256k1.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/curves/src/weierstrass/bn254.rs b/crates/curves/src/weierstrass/bn254.rs index df70219..950c43b 100644 --- a/crates/curves/src/weierstrass/bn254.rs +++ b/crates/curves/src/weierstrass/bn254.rs @@ -9,14 +9,14 @@ use crate::{ params::{FieldParameters, NumLimbs}, }; -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] /// Bn254 curve parameter +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)] pub struct Bn254Parameters; pub type Bn254 = SwCurve; -#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)] /// Bn254 base field parameter +#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)] pub struct Bn254BaseField; impl FieldParameters for Bn254BaseField { diff --git a/crates/curves/src/weierstrass/mod.rs b/crates/curves/src/weierstrass/mod.rs index 2dc0910..38654b9 100644 --- a/crates/curves/src/weierstrass/mod.rs +++ b/crates/curves/src/weierstrass/mod.rs @@ -47,7 +47,7 @@ pub trait WeierstrassParameters: EllipticCurveParameters { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct SwCurve(pub E); impl WeierstrassParameters for SwCurve { diff --git a/crates/curves/src/weierstrass/secp256k1.rs b/crates/curves/src/weierstrass/secp256k1.rs index f43fc01..65e18dc 100644 --- a/crates/curves/src/weierstrass/secp256k1.rs +++ b/crates/curves/src/weierstrass/secp256k1.rs @@ -19,8 +19,8 @@ use crate::{ params::{FieldParameters, NumLimbs}, }; -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] /// Secp256k1 curve parameter +#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)] pub struct Secp256k1Parameters; pub type Secp256k1 = SwCurve; From a4aa4a87c519d5d7d7af99af5d49309f764c471c Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Wed, 29 Oct 2025 15:49:10 +0800 Subject: [PATCH 2/5] Self::P is an permutation of Ts --- crates/ff_ext/src/babybear.rs | 22 ++++++--------- crates/ff_ext/src/goldilock.rs | 23 ++++++---------- crates/ff_ext/src/lib.rs | 1 + crates/ff_ext/src/poseidon.rs | 7 +++-- crates/ff_ext/src/wrapper.rs | 50 ++++++++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 crates/ff_ext/src/wrapper.rs diff --git a/crates/ff_ext/src/babybear.rs b/crates/ff_ext/src/babybear.rs index 44f02f7..3a09a26 100644 --- a/crates/ff_ext/src/babybear.rs +++ b/crates/ff_ext/src/babybear.rs @@ -1,5 +1,5 @@ pub mod impl_babybear { - use crate::array_try_from_uniform_bytes; + use crate::{array_try_from_uniform_bytes, wrapper::Wrapper}; use p3::{ self, babybear::{BabyBear, Poseidon2BabyBear}, @@ -94,20 +94,14 @@ pub mod impl_babybear { #[cfg(debug_assertions)] use crate::poseidon::impl_instruments::*; - #[cfg(debug_assertions)] - use p3::symmetric::CryptographicPermutation; - #[cfg(debug_assertions)] - impl CryptographicPermutation<[BabyBear; POSEIDON2_BABYBEAR_WIDTH]> - for Instrumented> - { - } + type WP = Wrapper, POSEIDON2_BABYBEAR_WIDTH>; impl PoseidonField for BabyBear { #[cfg(debug_assertions)] - type P = Instrumented>; + type P = Instrumented; #[cfg(not(debug_assertions))] - type P = Poseidon2BabyBear; + type P = WP; type T = DuplexChallenger; type S = PaddingFreeSponge; @@ -124,24 +118,24 @@ pub mod impl_babybear { #[cfg(debug_assertions)] fn get_default_perm() -> Self::P { - Instrumented::new(Poseidon2BabyBear::new( + Instrumented::new(Wrapper::new(Poseidon2BabyBear::new( ExternalLayerConstants::new( BABYBEAR_RC16_EXTERNAL_INITIAL.to_vec(), BABYBEAR_RC16_EXTERNAL_FINAL.to_vec(), ), BABYBEAR_RC16_INTERNAL.to_vec(), - )) + ))) } #[cfg(not(debug_assertions))] fn get_default_perm() -> Self::P { - Poseidon2BabyBear::new( + Wrapper::new(Poseidon2BabyBear::new( ExternalLayerConstants::new( BABYBEAR_RC16_EXTERNAL_INITIAL.to_vec(), BABYBEAR_RC16_EXTERNAL_FINAL.to_vec(), ), BABYBEAR_RC16_INTERNAL.to_vec(), - ) + )) } fn get_default_sponge() -> Self::S { diff --git a/crates/ff_ext/src/goldilock.rs b/crates/ff_ext/src/goldilock.rs index 3e31ffb..d2acba7 100644 --- a/crates/ff_ext/src/goldilock.rs +++ b/crates/ff_ext/src/goldilock.rs @@ -3,6 +3,7 @@ pub mod impl_goldilocks { ExtensionField, FieldFrom, FieldInto, FromUniformBytes, SmallField, array_try_from_uniform_bytes, impl_from_uniform_bytes_for_binomial_extension, poseidon::{PoseidonField, new_array}, + wrapper::Wrapper, }; use p3::{ challenger::DuplexChallenger, @@ -21,8 +22,6 @@ pub mod impl_goldilocks { #[cfg(debug_assertions)] use crate::poseidon::impl_instruments::*; - #[cfg(debug_assertions)] - use p3::symmetric::CryptographicPermutation; pub type GoldilocksExt2 = BinomialExtensionField; @@ -47,17 +46,13 @@ pub mod impl_goldilocks { pub const POSEIDON2_GOLDILICK_WIDTH: usize = 8; pub const POSEIDON2_GOLDILICK_RATE: usize = 4; - #[cfg(debug_assertions)] - impl CryptographicPermutation<[Goldilocks; POSEIDON2_GOLDILICK_WIDTH]> - for Instrumented> - { - } - + type WP = Wrapper, POSEIDON2_GOLDILICK_WIDTH>; impl PoseidonField for Goldilocks { #[cfg(debug_assertions)] - type P = Instrumented>; + type P = Instrumented; #[cfg(not(debug_assertions))] - type P = Poseidon2GoldilocksHL; + type P = WP; + type T = DuplexChallenger; type S = PaddingFreeSponge; @@ -71,24 +66,24 @@ pub mod impl_goldilocks { #[cfg(debug_assertions)] fn get_default_perm() -> Self::P { - Instrumented::new(Poseidon2GoldilocksHL::new( + Instrumented::new(Wrapper::new(Poseidon2GoldilocksHL::new( ExternalLayerConstants::::new_from_saved_array( HL_GOLDILOCKS_8_EXTERNAL_ROUND_CONSTANTS, new_array, ), new_array(HL_GOLDILOCKS_8_INTERNAL_ROUND_CONSTANTS).to_vec(), - )) + ))) } #[cfg(not(debug_assertions))] fn get_default_perm() -> Self::P { - Poseidon2GoldilocksHL::new( + Wrapper::new(Poseidon2GoldilocksHL::new( ExternalLayerConstants::::new_from_saved_array( HL_GOLDILOCKS_8_EXTERNAL_ROUND_CONSTANTS, new_array, ), new_array(HL_GOLDILOCKS_8_INTERNAL_ROUND_CONSTANTS).to_vec(), - ) + )) } fn get_default_sponge() -> Self::S { diff --git a/crates/ff_ext/src/lib.rs b/crates/ff_ext/src/lib.rs index 4c2c370..6e3cfcb 100644 --- a/crates/ff_ext/src/lib.rs +++ b/crates/ff_ext/src/lib.rs @@ -10,6 +10,7 @@ use std::{ iter::{self, repeat_with}, }; mod babybear; +mod wrapper; pub use babybear::impl_babybear::*; mod goldilock; pub use goldilock::impl_goldilocks::*; diff --git a/crates/ff_ext/src/poseidon.rs b/crates/ff_ext/src/poseidon.rs index 80754d7..437369b 100644 --- a/crates/ff_ext/src/poseidon.rs +++ b/crates/ff_ext/src/poseidon.rs @@ -2,6 +2,7 @@ use p3::{ challenger::{FieldChallenger, GrindingChallenger}, commit::Mmcs, field::PrimeField, + symmetric::Permutation, }; use crate::{ExtensionField, SmallField}; @@ -19,7 +20,7 @@ pub trait FieldChallengerExt: FieldChallenger { pub trait PoseidonField: PrimeField + SmallField { // permutation - type P: Clone; + type P: Clone + Permutation>; // sponge type S: Clone + Sync; // compression @@ -51,7 +52,7 @@ pub mod impl_instruments { }; use once_cell::sync::Lazy; - use p3::symmetric::Permutation; + use p3::symmetric::{CryptographicPermutation, Permutation}; pub type PermCount = Arc>; pub type LabelCounts = Arc>>; @@ -136,4 +137,6 @@ pub mod impl_instruments { self.inner_perm.permute(input) } } + + impl> CryptographicPermutation for Instrumented

{} } diff --git a/crates/ff_ext/src/wrapper.rs b/crates/ff_ext/src/wrapper.rs new file mode 100644 index 0000000..7527cdb --- /dev/null +++ b/crates/ff_ext/src/wrapper.rs @@ -0,0 +1,50 @@ +use p3::symmetric::{CryptographicPermutation, Permutation}; +use std::array::from_fn; +#[derive(Clone)] +pub struct Wrapper { + inner: P, +} + +impl Wrapper { + pub fn new(inner: P) -> Self { + Self { inner } + } +} + +impl + Clone> Permutation> + for Wrapper +{ + fn permute(&self, input: Vec) -> Vec { + assert_eq!(input.len(), N, "Input vector must be of length {}", N); + + let mut array = from_fn(|i| input[i].clone()); + self.inner.permute_mut(&mut array); + + array.to_vec() + } + + fn permute_mut(&self, input: &mut Vec) { + assert_eq!(input.len(), N, "Input vector must be of length {}", N); + let mut array = from_fn(|i| input[i].clone()); + self.inner.permute_mut(&mut array); + for i in 0..N { + input[i] = array[i].clone(); + } + } +} +impl + Clone> Permutation<[T; N]> + for Wrapper +{ + fn permute(&self, input: [T; N]) -> [T; N] { + self.inner.permute(input) + } + + fn permute_mut(&self, input: &mut [T; N]) { + self.inner.permute_mut(input); + } +} + +impl + Clone> CryptographicPermutation<[T; N]> + for Wrapper +{ +} From b155b40356762733fac4264444a5e8cef323607e Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Wed, 29 Oct 2025 19:44:55 +0800 Subject: [PATCH 3/5] add get_default_perm_rc --- crates/ff_ext/src/babybear.rs | 10 ++++++++++ crates/ff_ext/src/goldilock.rs | 10 ++++++++++ crates/ff_ext/src/poseidon.rs | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/ff_ext/src/babybear.rs b/crates/ff_ext/src/babybear.rs index 3a09a26..5f8fb89 100644 --- a/crates/ff_ext/src/babybear.rs +++ b/crates/ff_ext/src/babybear.rs @@ -138,6 +138,16 @@ pub mod impl_babybear { )) } + fn get_default_perm_rc() -> Vec { + BABYBEAR_RC16_EXTERNAL_INITIAL + .iter() + .flatten() + .chain(BABYBEAR_RC16_INTERNAL.iter()) + .chain(BABYBEAR_RC16_EXTERNAL_FINAL.iter().flatten()) + .cloned() + .collect() + } + fn get_default_sponge() -> Self::S { PaddingFreeSponge::new(Self::get_default_perm()) } diff --git a/crates/ff_ext/src/goldilock.rs b/crates/ff_ext/src/goldilock.rs index d2acba7..4031bc6 100644 --- a/crates/ff_ext/src/goldilock.rs +++ b/crates/ff_ext/src/goldilock.rs @@ -86,6 +86,16 @@ pub mod impl_goldilocks { )) } + fn get_default_perm_rc() -> Vec { + HL_GOLDILOCKS_8_EXTERNAL_ROUND_CONSTANTS[0] + .iter() + .flatten() + .chain(HL_GOLDILOCKS_8_INTERNAL_ROUND_CONSTANTS.iter()) + .chain(HL_GOLDILOCKS_8_EXTERNAL_ROUND_CONSTANTS[1].iter().flatten()) + .map(|v| Self::from_canonical_u64(*v)) + .collect() + } + fn get_default_sponge() -> Self::S { PaddingFreeSponge::new(Self::get_default_perm()) } diff --git a/crates/ff_ext/src/poseidon.rs b/crates/ff_ext/src/poseidon.rs index 437369b..35e69d4 100644 --- a/crates/ff_ext/src/poseidon.rs +++ b/crates/ff_ext/src/poseidon.rs @@ -20,7 +20,7 @@ pub trait FieldChallengerExt: FieldChallenger { pub trait PoseidonField: PrimeField + SmallField { // permutation - type P: Clone + Permutation>; + type P: Clone + Permutation> + Send + Sync; // sponge type S: Clone + Sync; // compression @@ -29,6 +29,7 @@ pub trait PoseidonField: PrimeField + SmallField { type T: FieldChallenger + Clone + GrindingChallenger; fn get_default_challenger() -> Self::T; fn get_default_perm() -> Self::P; + fn get_default_perm_rc() -> Vec; fn get_default_sponge() -> Self::S; fn get_default_compression() -> Self::C; fn get_default_mmcs() -> Self::MMCS; From 7a04ab195d45d98632f80211d86a85839b93402b Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Mon, 3 Nov 2025 10:40:05 +0800 Subject: [PATCH 4/5] revert defaults --- crates/curves/src/weierstrass/bn254.rs | 4 ++-- crates/curves/src/weierstrass/mod.rs | 2 +- crates/curves/src/weierstrass/secp256k1.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/curves/src/weierstrass/bn254.rs b/crates/curves/src/weierstrass/bn254.rs index 950c43b..df70219 100644 --- a/crates/curves/src/weierstrass/bn254.rs +++ b/crates/curves/src/weierstrass/bn254.rs @@ -9,14 +9,14 @@ use crate::{ params::{FieldParameters, NumLimbs}, }; +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] /// Bn254 curve parameter -#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Default)] pub struct Bn254Parameters; pub type Bn254 = SwCurve; -/// Bn254 base field parameter #[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)] +/// Bn254 base field parameter pub struct Bn254BaseField; impl FieldParameters for Bn254BaseField { diff --git a/crates/curves/src/weierstrass/mod.rs b/crates/curves/src/weierstrass/mod.rs index 38654b9..2dc0910 100644 --- a/crates/curves/src/weierstrass/mod.rs +++ b/crates/curves/src/weierstrass/mod.rs @@ -47,7 +47,7 @@ pub trait WeierstrassParameters: EllipticCurveParameters { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub struct SwCurve(pub E); impl WeierstrassParameters for SwCurve { diff --git a/crates/curves/src/weierstrass/secp256k1.rs b/crates/curves/src/weierstrass/secp256k1.rs index 65e18dc..f43fc01 100644 --- a/crates/curves/src/weierstrass/secp256k1.rs +++ b/crates/curves/src/weierstrass/secp256k1.rs @@ -19,8 +19,8 @@ use crate::{ params::{FieldParameters, NumLimbs}, }; +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] /// Secp256k1 curve parameter -#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)] pub struct Secp256k1Parameters; pub type Secp256k1 = SwCurve; From d1feb82dd999b9373a258f3f6fb42322a99f8630 Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Mon, 3 Nov 2025 10:42:24 +0800 Subject: [PATCH 5/5] clippy --- crates/ff_ext/src/wrapper.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/ff_ext/src/wrapper.rs b/crates/ff_ext/src/wrapper.rs index 7527cdb..8630070 100644 --- a/crates/ff_ext/src/wrapper.rs +++ b/crates/ff_ext/src/wrapper.rs @@ -27,9 +27,9 @@ impl + Clone> Permutation + Clone> Permutation<[T; N]>