crypto/fipsmodule/ml_dsa/ml_dsa_ref/params.c (84 lines of code) (raw):
#include <openssl/base.h>
#include <assert.h>
#include "params.h"
static void ml_dsa_params_init(ml_dsa_params *params, size_t k) {
assert((k == 2) || (k == 3) || (k == 5));
if (k == 2) {
// Parameters for ML-DSA-44 from Table 1. FIPS-204: ML-DSA Parameter Sets.
// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf Section 4
params->k = 4;
params->l = 4;
params->tau = 39;
params->beta = 78;
params->omega = 80;
params->c_tilde_bytes = 32;
params->gamma1 = (1 << 17);
params->gamma2 = (ML_DSA_Q-1)/88;
params->eta = 2;
params->poly_z_packed_bytes = 576;
params->poly_w1_packed_bytes = 192;
params->poly_eta_packed_bytes = 96;
params->poly_vech_packed_bytes = (params->omega + params->k);
// Sizes for ML-DSA-44 keys and signatures from Table 2. FIPS-204.
params->public_key_bytes = (ML_DSA_SEEDBYTES + params->k * ML_DSA_POLYT1_PACKEDBYTES);
params->secret_key_bytes = (2 * ML_DSA_SEEDBYTES + ML_DSA_TRBYTES +
params->l * params->poly_eta_packed_bytes +
params->k * params->poly_eta_packed_bytes +
params->k * ML_DSA_POLYT0_PACKEDBYTES);
params->bytes = (params->c_tilde_bytes +
params->l * params->poly_z_packed_bytes +
params->poly_vech_packed_bytes);
}
else if (k == 3) {
// Parameters for ML-DSA-65 from Table 1. FIPS-204: ML-DSA Parameter Sets.
// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf Section 4
params->k = 6;
params->l = 5;
params->tau = 49;
params->beta = 196;
params->omega = 55;
params->c_tilde_bytes = 48;
params->gamma1 = (1 << 19);
params->gamma2 = (ML_DSA_Q-1)/32;
params->eta = 4;
params->poly_z_packed_bytes = 640;
params->poly_w1_packed_bytes = 128;
params->poly_eta_packed_bytes = 128;
params->poly_vech_packed_bytes = (params->omega + params->k);
// Sizes for ML-DSA-65 keys and signatures from Table 2. FIPS-204.
params->public_key_bytes = (ML_DSA_SEEDBYTES + params->k * ML_DSA_POLYT1_PACKEDBYTES);
params->secret_key_bytes = (2 * ML_DSA_SEEDBYTES + ML_DSA_TRBYTES +
params->l * params->poly_eta_packed_bytes +
params->k * params->poly_eta_packed_bytes +
params->k * ML_DSA_POLYT0_PACKEDBYTES);
params->bytes = (params->c_tilde_bytes +
params->l * params->poly_z_packed_bytes +
params->poly_vech_packed_bytes);
}
else {
// Parameters for ML-DSA-87 from Table 1. FIPS-204: ML-DSA Parameter Sets.
// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf Section 4
params->k = 8;
params->l = 7;
params->tau = 60;
params->beta = 120;
params->omega = 75;
params->c_tilde_bytes = 64;
params->gamma1 = (1 << 19);
params->gamma2 = (ML_DSA_Q-1)/32;
params->eta = 2;
params->poly_z_packed_bytes = 640;
params->poly_w1_packed_bytes = 128;
params->poly_eta_packed_bytes = 96;
params->poly_vech_packed_bytes = (params->omega + params->k);
// Sizes for ML-DSA-87 keys and signatures from Table 2. FIPS-204.
params->public_key_bytes = (ML_DSA_SEEDBYTES + params->k * ML_DSA_POLYT1_PACKEDBYTES);
params->secret_key_bytes = (2 * ML_DSA_SEEDBYTES + ML_DSA_TRBYTES +
params->l * params->poly_eta_packed_bytes +
params->k * params->poly_eta_packed_bytes +
params->k * ML_DSA_POLYT0_PACKEDBYTES);
params->bytes = (params->c_tilde_bytes +
params->l * params->poly_z_packed_bytes +
params->poly_vech_packed_bytes);
}
}
void ml_dsa_44_params_init(ml_dsa_params *params) {
ml_dsa_params_init(params, 2);
}
void ml_dsa_65_params_init(ml_dsa_params *params) {
ml_dsa_params_init(params, 3);
}
void ml_dsa_87_params_init(ml_dsa_params *params) {
ml_dsa_params_init(params, 5);
}