use sha2::{Digest, Sha512};
use super::BlsScalar;
const WIDTH: usize = 5;
const ROUNDS: usize = 59 + 8;
const CONSTANTS: usize = ROUNDS * WIDTH;
pub fn constants() -> [BlsScalar; CONSTANTS] {
let mut cnst = [BlsScalar::zero(); CONSTANTS];
let mut p = BlsScalar::one();
let mut bytes = b"poseidon-for-plonk".to_vec();
cnst.iter_mut().for_each(|c| {
bytes = Sha512::digest(bytes.as_slice()).to_vec();
let mut v = [0x00u8; 64];
v.copy_from_slice(&bytes[0..64]);
*c = BlsScalar::from_bytes_wide(&v) + p;
p = *c;
});
cnst
}
pub fn mds() -> [[BlsScalar; WIDTH]; WIDTH] {
let mut matrix = [[BlsScalar::zero(); WIDTH]; WIDTH];
let mut xs = [BlsScalar::zero(); WIDTH];
let mut ys = [BlsScalar::zero(); WIDTH];
(0..WIDTH).for_each(|i| {
xs[i] = BlsScalar::from(i as u64);
ys[i] = BlsScalar::from((i + WIDTH) as u64);
});
let mut m = 0;
(0..WIDTH).for_each(|i| {
(0..WIDTH).for_each(|j| {
matrix[m][j] = (xs[i] + ys[j]).invert().unwrap();
});
m += 1;
});
matrix
}