Skip to main content

lib_q_ring/
params.rs

1//! ML-DSA parameter markers (FIPS 204) as associated constants.
2
3/// Shared geometry and bounds for \(R_q\) instantiations used with ML-DSA.
4pub trait RingParams {
5    /// Polynomial degree `n`.
6    const N: usize;
7    /// Modulus `q`.
8    const Q: i32;
9    /// Matrix rows `k`.
10    const ROWS_IN_A: usize;
11    /// Matrix columns `l`.
12    const COLUMNS_IN_A: usize;
13    /// Hamming weight `τ` of the challenge polynomial.
14    const TAU: usize;
15    /// `γ₁ = 2^{γ₁_exp}`.
16    const GAMMA1_EXPONENT: usize;
17    /// `γ₂ = ⌊(q-1)/88⌋` (ML-DSA-44) or `⌊(q-1)/32⌋` (65/87).
18    const GAMMA2: i32;
19    /// `η` (centered binomial / uniform width parameter as an integer bound).
20    const ETA: i32;
21    /// `β = τ · η`.
22    const BETA: i32;
23}
24
25/// ML-DSA-44 (`ML-DSA-44`).
26pub enum MlDsa44Params {}
27
28impl RingParams for MlDsa44Params {
29    const N: usize = 256;
30    const Q: i32 = crate::constants::FIELD_MODULUS;
31    const ROWS_IN_A: usize = 4;
32    const COLUMNS_IN_A: usize = 4;
33    const TAU: usize = 39;
34    const GAMMA1_EXPONENT: usize = 17;
35    const GAMMA2: i32 = (Self::Q - 1) / 88;
36    const ETA: i32 = 2;
37    const BETA: i32 = (Self::TAU as i32) * Self::ETA;
38}
39
40/// ML-DSA-65 (`ML-DSA-65`).
41pub enum MlDsa65Params {}
42
43impl RingParams for MlDsa65Params {
44    const N: usize = 256;
45    const Q: i32 = crate::constants::FIELD_MODULUS;
46    const ROWS_IN_A: usize = 6;
47    const COLUMNS_IN_A: usize = 5;
48    const TAU: usize = 49;
49    const GAMMA1_EXPONENT: usize = 19;
50    const GAMMA2: i32 = (Self::Q - 1) / 32;
51    const ETA: i32 = 4;
52    const BETA: i32 = (Self::TAU as i32) * Self::ETA;
53}
54
55/// ML-DSA-87 (`ML-DSA-87`).
56pub enum MlDsa87Params {}
57
58impl RingParams for MlDsa87Params {
59    const N: usize = 256;
60    const Q: i32 = crate::constants::FIELD_MODULUS;
61    const ROWS_IN_A: usize = 8;
62    const COLUMNS_IN_A: usize = 7;
63    const TAU: usize = 60;
64    const GAMMA1_EXPONENT: usize = 19;
65    const GAMMA2: i32 = (Self::Q - 1) / 32;
66    const ETA: i32 = 2;
67    const BETA: i32 = (Self::TAU as i32) * Self::ETA;
68}