Skip to content

Commit d0cd63b

Browse files
committed
Don't allocate in apply_mds_matrix
1 parent 2fdb5a7 commit d0cd63b

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

poseidon/src/permutation.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@ use ark_ff::Field;
77
fn apply_mds_matrix<F: Field, SC: SpongeConstants>(
88
params: &ArithmeticSpongeParams<F>,
99
state: &[F],
10-
) -> Vec<F> {
10+
) -> [F; 3] {
11+
assert_eq!(params.mds.len(), 3);
1112
if SC::PERM_FULL_MDS {
12-
params
13-
.mds
14-
.iter()
15-
.map(|m| {
16-
state
17-
.iter()
18-
.zip(m.iter())
19-
.fold(F::zero(), |x, (s, &m)| m * s + x)
20-
})
21-
.collect()
13+
let mut new_state = [F::zero(); 3];
14+
for (i, sub_params) in params.mds.iter().enumerate() {
15+
for (state, param) in state.iter().zip(sub_params) {
16+
new_state[i].add_assign(*param * state);
17+
}
18+
}
19+
new_state
2220
} else {
23-
vec![
21+
[
2422
state[0] + state[2],
2523
state[0] + state[1],
2624
state[1] + state[2],
@@ -36,7 +34,9 @@ pub fn full_round<F: Field, SC: SpongeConstants>(
3634
for state_i in state.iter_mut() {
3735
*state_i = sbox::<F, SC>(*state_i);
3836
}
39-
*state = apply_mds_matrix::<F, SC>(params, state);
37+
let new_state = apply_mds_matrix::<F, SC>(params, state);
38+
state.clear();
39+
state.extend(new_state);
4040
for (i, x) in params.round_constants[r].iter().enumerate() {
4141
state[i].add_assign(x);
4242
}

0 commit comments

Comments
 (0)