poseidon_paramgen/
v1.rs

1use ark_ff::PrimeField;
2
3use crate::{alpha, input::InputParameters, mds, round_constants, rounds};
4use poseidon_parameters::v1::PoseidonParameters;
5
6/// For generating parameters at build time.
7pub mod poseidon_build {
8    pub use crate::poseidon_build::v1_compile as compile;
9}
10
11/// Generate a Poseidon instance mapped over Fp given a choice of:
12///
13/// * M, the desired security level (in bits),
14/// * t, the width of the desired hash function, e.g. $t=3$ corresponds to 2-to-1 hash.
15/// * p, the prime modulus,
16/// * `allow_inverse`, whether or not to allow an inverse alpha.
17pub fn generate<F: PrimeField>(
18    M: usize,
19    t: usize,
20    p: F::BigInt,
21    allow_inverse: bool,
22) -> PoseidonParameters<F> {
23    let input = InputParameters::generate(M, t, p, allow_inverse);
24    let alpha = alpha::generate::<F>(p, allow_inverse);
25    let rounds = rounds::v1_generate(&input, &alpha);
26    let mds = mds::v1_generate(&input);
27    let arc = round_constants::v1_generate(&input, rounds, alpha);
28    let optimized_mds = mds::generate_optimized(&mds, t, &rounds);
29    let optimized_arc = round_constants::generate_optimized(&arc, &mds, &rounds);
30
31    PoseidonParameters::<F> {
32        M: input.M,
33        t: input.t,
34        alpha,
35        rounds,
36        mds,
37        arc,
38        optimized_mds,
39        optimized_arc,
40    }
41}