15#ifndef CRYPT_ML_DSA_LOCAL_H
16#define CRYPT_ML_DSA_LOCAL_H
17#include "crypt_mldsa.h"
18#include "sal_atomic.h"
19#include "crypt_local_types.h"
21#define MLDSA_SEED_BYTES_LEN 32
22#define MLDSA_PUBLIC_SEED_LEN 32
23#define MLDSA_PRIVATE_SEED_LEN 64
24#define MLDSA_SIGNING_SEED_LEN 32
25#define MLDSA_EXPANDED_SEED_BYTES_LEN (MLDSA_PUBLIC_SEED_LEN + MLDSA_PRIVATE_SEED_LEN + MLDSA_SIGNING_SEED_LEN)
26#define MLDSA_SEED_EXTEND_BYTES_LEN (MLDSA_SEED_BYTES_LEN + 2)
31#define MLDSA_TR_MSG_LEN 64
32#define MLDSA_XOF_MSG_LEN 64
34#define MLDSA_N_HALF (MLDSA_N >> 1)
35#define MLDSA_N_BYTE 32
37#define GAMMA_BITS_OF_MLDSA_44 18
38#define GAMMA_BITS_OF_MLDSA_65_87 20
39#define K_VALUE_OF_MLDSA_44 4
41#define MLDSA_Q 8380417
42#define MLDSA_QINV 58728449
44#define MLDSA_PUBKEY_POLYT_PACKEDBYTES 320
45#define MLDSA_MAX_CTX_BYTES 255
46#define MLDSA_SIGN_PREFIX_BYTES 2
50#define MLDSA_PLANTARD_L 32
51#define MLDSA_PLANTARD_ALPHA 3
52#define MLDSA_PLANTARD_INV 1732267787797143553
55#define MLDSA_LAST_ROUND_ZETA (-8751230424634003605LL)
59#define MLDSA_PLANTARD_8338439 (-92400822384635461LL)
62#define MLDSA_MOD_Q(val) {int32_t m = ((val) + (1 << 22u)) >> 23u; (val) = (val) - m * MLDSA_Q;}
75 uint32_t publicKeyLen;
76 uint32_t privateKeyLen;
77 uint32_t signatureLen;
91 bool deterministicSignFlag;
94 CRYPT_ALGO_MLDSA_PRIV_KEY_FORMAT_TYPE prvKeyFormat;
96 uint8_t seed[MLDSA_SEED_BYTES_LEN];
99void MLDSA_ComputesNTT(int32_t w[MLDSA_N]);
100void MLDSA_ComputesINVNTT(int32_t w[MLDSA_N]);
102static inline int32_t MLDSA_PlantardMulReduce(int64_t a)
105 tmp >>= MLDSA_PLANTARD_L;
106 tmp = (tmp + (1 << MLDSA_PLANTARD_ALPHA)) * MLDSA_Q;
107 tmp >>= MLDSA_PLANTARD_L;
111int32_t MLDSA_KeyGenInternal(CRYPT_ML_DSA_Ctx *ctx,
const uint8_t *d);
113int32_t MLDSA_SignInternal(
const CRYPT_ML_DSA_Ctx *ctx,
const CRYPT_Data *msg, uint8_t *out, uint32_t *outLen,
114 const uint8_t *rand);
116int32_t MLDSA_VerifyInternal(
const CRYPT_ML_DSA_Ctx *ctx,
const CRYPT_Data *msg,
const uint8_t *sign, uint32_t signLen);
119int32_t MLDSA_CalPub(
const CRYPT_ML_DSA_Ctx *ctx, uint8_t *pub, uint32_t pubLen);
120int32_t MLDSA_KeyConsistenceCheck(CRYPT_ML_DSA_Ctx *ctx);