crypto/fipsmodule/ml_dsa/ml_dsa_ref/polyvec.h (84 lines of code) (raw):
#ifndef ML_DSA_POLYVEC_H
#define ML_DSA_POLYVEC_H
#include <stdint.h>
#include "params.h"
#include "poly.h"
/* Vectors of polynomials of length L */
typedef struct {
ml_dsa_poly vec[ML_DSA_L_MAX];
} polyvecl;
void ml_dsa_polyvecl_uniform_eta(ml_dsa_params *params,
polyvecl *v,
const uint8_t seed[ML_DSA_CRHBYTES],
uint16_t nonce);
void ml_dsa_polyvecl_uniform_gamma1(ml_dsa_params *params,
polyvecl *v,
const uint8_t seed[ML_DSA_CRHBYTES],
uint16_t nonce);
void ml_dsa_polyvecl_reduce(ml_dsa_params *params, polyvecl *v);
void ml_dsa_polyvecl_add(ml_dsa_params *params,
polyvecl *w,
const polyvecl *u,
const polyvecl *v);
void ml_dsa_polyvecl_ntt(ml_dsa_params *params, polyvecl *v);
void ml_dsa_polyvecl_invntt_tomont(ml_dsa_params *params, polyvecl *v);
void ml_dsa_polyvecl_pointwise_poly_montgomery(ml_dsa_params *params,
polyvecl *r,
const ml_dsa_poly *a,
const polyvecl *v);
void ml_dsa_polyvecl_pointwise_acc_montgomery(ml_dsa_params *params,
ml_dsa_poly *w,
const polyvecl *u,
const polyvecl *v);
int ml_dsa_polyvecl_chknorm(ml_dsa_params *params, const polyvecl *v, int32_t B);
typedef struct {
ml_dsa_poly vec[ML_DSA_K_MAX];
} polyveck;
void ml_dsa_polyveck_uniform_eta(ml_dsa_params *params,
polyveck *v,
const uint8_t seed[ML_DSA_CRHBYTES],
uint16_t nonce);
void ml_dsa_polyveck_reduce(ml_dsa_params *params, polyveck *v);
void ml_dsa_polyveck_caddq(ml_dsa_params *params, polyveck *v);
void ml_dsa_polyveck_add(ml_dsa_params *params,
polyveck *w,
const polyveck *u,
const polyveck *v);
void ml_dsa_polyveck_sub(ml_dsa_params *params,
polyveck *w,
const polyveck *u,
const polyveck *v);
void ml_dsa_polyveck_shiftl(ml_dsa_params *params, polyveck *v);
void ml_dsa_polyveck_ntt(ml_dsa_params *params, polyveck *v);
void ml_dsa_polyveck_invntt_tomont(ml_dsa_params *params, polyveck *v);
void ml_dsa_polyveck_pointwise_poly_montgomery(ml_dsa_params *params,
polyveck *r,
const ml_dsa_poly *a,
const polyveck *v);
int ml_dsa_polyveck_chknorm(ml_dsa_params *params, const polyveck *v, int32_t B);
void ml_dsa_polyveck_power2round(ml_dsa_params *params,
polyveck *v1,
polyveck *v0,
const polyveck *v);
void ml_dsa_polyveck_decompose(ml_dsa_params *params,
polyveck *v1,
polyveck *v0,
const polyveck *v);
unsigned int ml_dsa_polyveck_make_hint(ml_dsa_params *params,
polyveck *h,
const polyveck *v0,
const polyveck *v1);
void ml_dsa_polyveck_use_hint(ml_dsa_params *params,
polyveck *w,
const polyveck *v,
const polyveck *h);
void ml_dsa_polyveck_pack_w1(ml_dsa_params *params,
uint8_t *r,
const polyveck *w1);
void ml_dsa_polyvec_matrix_expand(ml_dsa_params *params,
polyvecl *mat,
const uint8_t rho[ML_DSA_SEEDBYTES]);
void ml_dsa_polyvec_matrix_pointwise_montgomery(ml_dsa_params *params,
polyveck *t,
const polyvecl *mat,
const polyvecl *v);
#endif