1use ark_ff::PrimeField;
4
5use crate::s_box;
6
7#[inline(always)]
12fn matmul_internal<F: PrimeField, const T: usize>(
13 state: &mut [F; T],
14 mat_diag_minus_1: &'static [F; T],
15) {
16 match T {
17 2 => {
19 let mut sum = state[0];
22 sum += state[1];
23 state[0] += sum;
24 state[1].double_in_place();
25 state[1] += sum;
26 },
27 3 => {
28 let mut sum = state[0];
32 sum += state[1];
33 sum += state[2];
34 state[0] += sum;
35 state[1] += sum;
36 state[2].double_in_place();
37 state[2] += sum;
38 },
39 _ => {
40 let sum: F = state.iter().sum();
41 for i in 0..T {
42 state[i] *= mat_diag_minus_1[i];
43 state[i] += sum;
44 }
45 },
46 }
47}
48
49#[inline(always)]
52pub(crate) fn permute_state<F: PrimeField, const T: usize>(
53 state: &mut [F; T],
54 rc: F,
55 d: usize,
56 mat_diag_minus_1: &'static [F; T],
57) {
58 state[0] += rc;
59 s_box(&mut state[0], d);
60 matmul_internal(state, mat_diag_minus_1);
61}