diff --git a/poseidon2/src/external.rs b/poseidon2/src/external.rs index c94700cd9..6a61abc55 100644 --- a/poseidon2/src/external.rs +++ b/poseidon2/src/external.rs @@ -2,7 +2,7 @@ use ark_ff::PrimeField; -use crate::add_rc_and_sbox; +use crate::{add_rcs, s_box}; /// The fastest 4x4 MDS matrix. /// [ 2 3 1 1 ] @@ -88,8 +88,9 @@ pub(crate) fn permute_state( rc: &'static [F; T], d: usize, ) { - for i in 0..T { - add_rc_and_sbox(&mut state[i], rc[i], d) + add_rcs(state, rc); + for s in state.iter_mut() { + s_box(s, d); } matmul_external(state); } diff --git a/poseidon2/src/internal.rs b/poseidon2/src/internal.rs index 4b001f882..91f0b087a 100644 --- a/poseidon2/src/internal.rs +++ b/poseidon2/src/internal.rs @@ -2,7 +2,7 @@ use ark_ff::PrimeField; -use crate::add_rc_and_sbox; +use crate::s_box; /// Matrix multiplication in the internal layers /// Given a vector v compute the matrix vector product (1 + diag(v))*state @@ -55,6 +55,7 @@ pub(crate) fn permute_state( d: usize, mat_diag_minus_1: &'static [F; T], ) { - add_rc_and_sbox(&mut state[0], rc, d); + state[0] += rc; + s_box(&mut state[0], d); matmul_internal(state, mat_diag_minus_1); } diff --git a/poseidon2/src/lib.rs b/poseidon2/src/lib.rs index 41bc77dda..8fe452675 100644 --- a/poseidon2/src/lib.rs +++ b/poseidon2/src/lib.rs @@ -122,14 +122,18 @@ impl Poseidon2 { } } -/// A generic method performing the transformation, used both in external and -/// internal layers: -/// -/// `s -> (s + rc)^d` // @credit: `add_rc_and_sbox_generic()` in plonky3 +/// add RCs to the entire state +#[inline(always)] +pub(crate) fn add_rcs(state: &mut [F; T], rc: &[F; T]) { + for i in 0..T { + state[i] += rc[i]; + } +} + +/// `s -> s^d` #[inline(always)] -pub(crate) fn add_rc_and_sbox(val: &mut F, rc: F, d: usize) { - *val += rc; +pub(crate) fn s_box(val: &mut F, d: usize) { if d == 5 { // Perform unrolled computation for val^5, faster let original = *val;