#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "alloc")]
use alloc::vec::Vec;
use lib_q_stark_field::extension::Complex;
use lib_q_stark_mersenne31::Mersenne31;
use crate::constants::{
mds_matrix_5x5,
mds_matrix_7x7,
round_constants_128,
round_constants_256,
};
use crate::permutation::PoseidonPermutation;
pub type PoseidonField = Complex<Mersenne31>;
#[derive(Debug, Clone)]
pub struct PoseidonParams {
pub state_width: usize,
pub rate: usize,
pub capacity: usize,
pub full_rounds: usize,
pub partial_rounds: usize,
pub round_constants: Vec<PoseidonField>,
pub mds_matrix: Vec<Vec<PoseidonField>>,
}
pub struct Poseidon128;
impl Poseidon128 {
pub fn permutation() -> PoseidonPermutation {
PoseidonPermutation::new(Self::params())
}
pub fn params() -> PoseidonParams {
PoseidonParams {
state_width: 5,
rate: 2,
capacity: 3,
full_rounds: 8,
partial_rounds: 56,
round_constants: round_constants_128(),
mds_matrix: mds_matrix_5x5(),
}
}
}
impl Default for Poseidon128 {
fn default() -> Self {
Self
}
}
pub struct Poseidon256;
impl Poseidon256 {
pub fn permutation() -> PoseidonPermutation {
PoseidonPermutation::new(Self::params())
}
pub fn params() -> PoseidonParams {
PoseidonParams {
state_width: 7,
rate: 2,
capacity: 5,
full_rounds: 8,
partial_rounds: 60,
round_constants: round_constants_256(),
mds_matrix: mds_matrix_7x7(),
}
}
}
impl Default for Poseidon256 {
fn default() -> Self {
Self
}
}