29 for (uint32_t i = 0U; i <
MLDSA_N / 4U; i++) {
30 r[5U * i + 0U] = (uint8_t) (a->
coeffs[4U * i + 0U] >> 0U);
32 = (uint8_t) ((a->
coeffs[4U * i + 0U] >> 8U) | (a->
coeffs[4U * i + 1U] << 2U));
34 = (uint8_t) ((a->
coeffs[4U * i + 1U] >> 6U) | (a->
coeffs[4U * i + 2U] << 4U));
36 = (uint8_t) ((a->
coeffs[4U * i + 2U] >> 4U) | (a->
coeffs[4U * i + 3U] << 6U));
37 r[5U * i + 4U] = (uint8_t) (a->
coeffs[4U * i + 3U] >> 2U);
43 for (uint32_t i = 0U; i <
MLDSA_N / 4U; i++) {
45 = (((uint32_t) a[5U * i + 0U] >> 0U) | ((uint32_t) a[5U * i + 1U] << 8U)) & 0x3FFU;
47 = (((uint32_t) a[5U * i + 1U] >> 2U) | ((uint32_t) a[5U * i + 2U] << 6U)) & 0x3FFU;
49 = (((uint32_t) a[5U * i + 2U] >> 4U) | ((uint32_t) a[5U * i + 3U] << 4U)) & 0x3FFU;
51 = (((uint32_t) a[5U * i + 3U] >> 6U) | ((uint32_t) a[5U * i + 4U] << 2U)) & 0x3FFU;
61 for (uint32_t i = 0U; i <
MLDSA_N / 8U; i++) {
71 r[13U * i + 0U] = (uint8_t) t[0];
72 r[13U * i + 1U] = (uint8_t) (t[0] >> 8U);
73 r[13U * i + 1U] |= (uint8_t) (t[1] << 5U);
74 r[13U * i + 2U] = (uint8_t) (t[1] >> 3U);
75 r[13U * i + 3U] = (uint8_t) (t[1] >> 11U);
76 r[13U * i + 3U] |= (uint8_t) (t[2] << 2U);
77 r[13U * i + 4U] = (uint8_t) (t[2] >> 6U);
78 r[13U * i + 4U] |= (uint8_t) (t[3] << 7U);
79 r[13U * i + 5U] = (uint8_t) (t[3] >> 1U);
80 r[13U * i + 6U] = (uint8_t) (t[3] >> 9U);
81 r[13U * i + 6U] |= (uint8_t) (t[4] << 4U);
82 r[13U * i + 7U] = (uint8_t) (t[4] >> 4U);
83 r[13U * i + 8U] = (uint8_t) (t[4] >> 12U);
84 r[13U * i + 8U] |= (uint8_t) (t[5] << 1U);
85 r[13U * i + 9U] = (uint8_t) (t[5] >> 7U);
86 r[13U * i + 9U] |= (uint8_t) (t[6] << 6U);
87 r[13U * i + 10U] = (uint8_t) (t[6] >> 2U);
88 r[13U * i + 11U] = (uint8_t) (t[6] >> 10U);
89 r[13U * i + 11U] |= (uint8_t) (t[7] << 3U);
90 r[13U * i + 12U] = (uint8_t) (t[7] >> 5U);
96 for (uint32_t i = 0U; i <
MLDSA_N / 8U; i++) {
98 = (int32_t) (((uint32_t) a[13U * i + 0U] | ((uint32_t) a[13U * i + 1U] << 8U))
101 = (int32_t) ((((uint32_t) a[13U * i + 1U] >> 5U) | ((uint32_t) a[13U * i + 2U] << 3U)
102 | ((uint32_t) a[13U * i + 3U] << 11U))
105 = (int32_t) ((((uint32_t) a[13U * i + 3U] >> 2U) | ((uint32_t) a[13U * i + 4U] << 6U))
108 = (int32_t) ((((uint32_t) a[13U * i + 4U] >> 7U) | ((uint32_t) a[13U * i + 5U] << 1U)
109 | ((uint32_t) a[13U * i + 6U] << 9U))
112 = (int32_t) ((((uint32_t) a[13U * i + 6U] >> 4U) | ((uint32_t) a[13U * i + 7U] << 4U)
113 | ((uint32_t) a[13U * i + 8U] << 12U))
116 = (int32_t) ((((uint32_t) a[13U * i + 8U] >> 1U) | ((uint32_t) a[13U * i + 9U] << 7U))
119 = (int32_t) ((((uint32_t) a[13U * i + 9U] >> 6U) | ((uint32_t) a[13U * i + 10U] << 2U)
120 | ((uint32_t) a[13U * i + 11U] << 10U))
123 = (int32_t) ((((uint32_t) a[13U * i + 11U] >> 3U) | ((uint32_t) a[13U * i + 12U] << 5U))
144 for (uint32_t i = 0U; i <
MLDSA_N / 8U; i++) {
146 for (uint32_t j = 0U; j < 8U; j++) {
147 t[j] = (uint8_t) ((int32_t) eta - a->
coeffs[8U * i + j]);
150 r[3U * i + 0U] = (t[0] >> 0U) | (t[1] << 3U) | (t[2] << 6U);
151 r[3U * i + 1U] = (t[2] >> 2U) | (t[3] << 1U) | (t[4] << 4U) | (t[5] << 7U);
152 r[3U * i + 2U] = (t[5] >> 1U) | (t[6] << 2U) | (t[7] << 5U);
158 for (uint32_t i = 0U; i <
MLDSA_N / 2U; i++) {
159 uint8_t t0 = (uint8_t) ((int32_t) eta - a->
coeffs[2U * i + 0U]);
160 uint8_t t1 = (uint8_t) ((int32_t) eta - a->
coeffs[2U * i + 1U]);
161 r[i] = t0 | (t1 << 4U);
170 for (uint32_t i = 0U; i <
MLDSA_N / 8U; i++) {
171 r->
coeffs[8U * i + 0U] = (int32_t) ((a[3U * i + 0U] >> 0U) & 7U);
172 r->
coeffs[8U * i + 1U] = (int32_t) ((a[3U * i + 0U] >> 3U) & 7U);
174 = (int32_t) (((a[3U * i + 0U] >> 6U) | (a[3U * i + 1U] << 2U)) & 7U);
175 r->
coeffs[8U * i + 3U] = (int32_t) ((a[3U * i + 1U] >> 1U) & 7U);
176 r->
coeffs[8U * i + 4U] = (int32_t) ((a[3U * i + 1U] >> 4U) & 7U);
178 = (int32_t) (((a[3U * i + 1U] >> 7U) | (a[3U * i + 2U] << 1U)) & 7U);
179 r->
coeffs[8U * i + 6U] = (int32_t) ((a[3U * i + 2U] >> 2U) & 7U);
180 r->
coeffs[8U * i + 7U] = (int32_t) ((a[3U * i + 2U] >> 5U) & 7U);
182 r->
coeffs[8U * i + 0U] = (int32_t) eta - r->
coeffs[8U * i + 0U];
183 r->
coeffs[8U * i + 1U] = (int32_t) eta - r->
coeffs[8U * i + 1U];
184 r->
coeffs[8U * i + 2U] = (int32_t) eta - r->
coeffs[8U * i + 2U];
185 r->
coeffs[8U * i + 3U] = (int32_t) eta - r->
coeffs[8U * i + 3U];
186 r->
coeffs[8U * i + 4U] = (int32_t) eta - r->
coeffs[8U * i + 4U];
187 r->
coeffs[8U * i + 5U] = (int32_t) eta - r->
coeffs[8U * i + 5U];
188 r->
coeffs[8U * i + 6U] = (int32_t) eta - r->
coeffs[8U * i + 6U];
189 r->
coeffs[8U * i + 7U] = (int32_t) eta - r->
coeffs[8U * i + 7U];
194 for (uint32_t i = 0U; i <
MLDSA_N / 2U; i++) {
195 r->
coeffs[2U * i + 0U] = (int32_t) (a[i] & 0x0FU);
196 r->
coeffs[2U * i + 1U] = (int32_t) (a[i] >> 4U);
197 r->
coeffs[2U * i + 0U] = (int32_t) eta - r->
coeffs[2U * i + 0U];
198 r->
coeffs[2U * i + 1U] = (int32_t) eta - r->
coeffs[2U * i + 1U];
211 if (gamma1 == (1 << 17)) {
213 for (uint32_t i = 0U; i <
MLDSA_N / 4U; i++) {
214 t[0] = gamma1 - a->
coeffs[4U * i + 0U];
215 t[1] = gamma1 - a->
coeffs[4U * i + 1U];
216 t[2] = gamma1 - a->
coeffs[4U * i + 2U];
217 t[3] = gamma1 - a->
coeffs[4U * i + 3U];
219 r[9U * i + 0U] = (uint8_t) t[0];
220 r[9U * i + 1U] = (uint8_t) (t[0] >> 8U);
221 r[9U * i + 2U] = (uint8_t) ((t[0] >> 16U) | (t[1] << 2U));
222 r[9U * i + 3U] = (uint8_t) (t[1] >> 6U);
223 r[9U * i + 4U] = (uint8_t) ((t[1] >> 14U) | (t[2] << 4U));
224 r[9U * i + 5U] = (uint8_t) (t[2] >> 4U);
225 r[9U * i + 6U] = (uint8_t) ((t[2] >> 12U) | (t[3] << 6U));
226 r[9U * i + 7U] = (uint8_t) (t[3] >> 2U);
227 r[9U * i + 8U] = (uint8_t) (t[3] >> 10U);
233 for (uint32_t i = 0U; i <
MLDSA_N / 2U; i++) {
234 t[0] = gamma1 - a->
coeffs[2U * i + 0U];
235 t[1] = gamma1 - a->
coeffs[2U * i + 1U];
237 r[5U * i + 0U] = (uint8_t) t[0];
238 r[5U * i + 1U] = (uint8_t) (t[0] >> 8U);
239 r[5U * i + 2U] = (uint8_t) ((t[0] >> 16U) | (t[1] << 4U));
240 r[5U * i + 3U] = (uint8_t) (t[1] >> 4U);
241 r[5U * i + 4U] = (uint8_t) (t[1] >> 12U);
249 if (gamma1 == (1 << 17)) {
250 for (uint32_t i = 0U; i <
MLDSA_N / 4U; i++) {
252 = (int32_t) (((uint32_t) a[9U * i + 0U] | ((uint32_t) a[9U * i + 1U] << 8U)
253 | ((uint32_t) a[9U * i + 2U] << 16U))
256 = (int32_t) ((((uint32_t) a[9U * i + 2U] >> 2U) | ((uint32_t) a[9U * i + 3U] << 6U)
257 | ((uint32_t) a[9U * i + 4U] << 14U))
260 = (int32_t) ((((uint32_t) a[9U * i + 4U] >> 4U) | ((uint32_t) a[9U * i + 5U] << 4U)
261 | ((uint32_t) a[9U * i + 6U] << 12U))
264 = (int32_t) ((((uint32_t) a[9U * i + 6U] >> 6U) | ((uint32_t) a[9U * i + 7U] << 2U)
265 | ((uint32_t) a[9U * i + 8U] << 10U))
268 r->
coeffs[4U * i + 0U] = gamma1 - r->
coeffs[4U * i + 0U];
269 r->
coeffs[4U * i + 1U] = gamma1 - r->
coeffs[4U * i + 1U];
270 r->
coeffs[4U * i + 2U] = gamma1 - r->
coeffs[4U * i + 2U];
271 r->
coeffs[4U * i + 3U] = gamma1 - r->
coeffs[4U * i + 3U];
276 for (uint32_t i = 0U; i <
MLDSA_N / 2U; i++) {
278 = (int32_t) (((uint32_t) a[5U * i + 0U] | ((uint32_t) a[5U * i + 1U] << 8U)
279 | ((uint32_t) a[5U * i + 2U] << 16U))
282 = (int32_t) ((((uint32_t) a[5U * i + 2U] >> 4U) | ((uint32_t) a[5U * i + 3U] << 4U)
283 | ((uint32_t) a[5U * i + 4U] << 12U))
286 r->
coeffs[2U * i + 0U] = gamma1 - r->
coeffs[2U * i + 0U];
287 r->
coeffs[2U * i + 1U] = gamma1 - r->
coeffs[2U * i + 1U];
298 if (gamma2 == (
MLDSA_Q - 1) / 88) {
300 for (uint32_t i = 0U; i <
MLDSA_N / 4U; i++) {
301 r[3U * i + 0U] = (uint8_t) (a->
coeffs[4U * i + 0U] | (a->
coeffs[4U * i + 1U] << 6U));
303 = (uint8_t) ((a->
coeffs[4U * i + 1U] >> 2U) | (a->
coeffs[4U * i + 2U] << 4U));
305 = (uint8_t) ((a->
coeffs[4U * i + 2U] >> 4U) | (a->
coeffs[4U * i + 3U] << 2U));
311 for (uint32_t i = 0U; i <
MLDSA_N / 2U; i++) {
312 r[i] = (uint8_t) (a->
coeffs[2U * i + 0U] | (a->
coeffs[2U * i + 1U] << 4U));
327 for (uint32_t i = 0U; i < p->
k; i++) {
338 for (uint32_t i = 0U; i < p->
k; i++) {
352 uint32_t offset = 0U;
363 for (uint32_t i = 0U; i < p->
l; i++) {
368 for (uint32_t i = 0U; i < p->
k; i++) {
373 for (uint32_t i = 0U; i < p->
k; i++) {
388 uint32_t offset = 0U;
399 for (uint32_t i = 0U; i < p->
l; i++) {
404 for (uint32_t i = 0U; i < p->
k; i++) {
409 for (uint32_t i = 0U; i < p->
k; i++) {
419 const uint8_t *ctilde,
424 uint32_t offset = 0U;
431 for (uint32_t i = 0U; i < p->
l; i++) {
439 uint32_t k_offset = 0U;
440 for (uint32_t i = 0U; i < p->
k; i++) {
441 for (uint32_t j = 0U; j <
MLDSA_N; j++) {
442 if (h[i].coeffs[j] != 0) {
443 sig[offset + k_offset] = (uint8_t) j;
447 sig[offset + p->
omega + i] = (uint8_t) k_offset;
457 uint32_t offset = 0U;
464 for (uint32_t i = 0U; i < p->
l; i++) {
470 uint32_t k_offset = 0U;
471 for (uint32_t i = 0U; i < p->
k; i++) {
472 for (uint32_t j = 0U; j <
MLDSA_N; j++) {
477 for (uint32_t i = 0U; i < p->
k; i++) {
478 uint32_t limit = (uint32_t) sig[offset + p->
omega + i];
480 if (limit < k_offset) {
483 if (limit > p->
omega) {
487 for (uint32_t j = k_offset; j < limit; j++) {
489 if ((j > k_offset) && (sig[offset + j] <= sig[offset + j - 1U])) {
492 h[i].
coeffs[sig[offset + j]] = 1;
499 for (uint32_t j = k_offset; j < p->
omega; j++) {
500 if (sig[offset + j] != 0U) {
void MLDSA_PACK_sig(uint8_t *sig, const uint8_t *ctilde, const mldsa_poly *z, const mldsa_poly *h, const MLDSA_param_info_t *p)
Pack signature (c_tilde || z || h).
uint32_t MLDSA_PACK_polyw1(uint8_t *r, const mldsa_poly *a, int32_t gamma2)
Bit-pack polynomial w1 with coefficients fitting in ceil(log2((q-1)/(2*gamma2))) bits.
uint32_t MLDSA_PACK_unpack_polyeta(mldsa_poly *r, const uint8_t *a, uint8_t eta)
Unpack polynomial with coefficients in [-eta, eta].
void MLDSA_PACK_sk(uint8_t *sk, const uint8_t rho[MLDSA_SEEDBYTES], const uint8_t K[MLDSA_SEEDBYTES], const uint8_t tr[MLDSA_TRBYTES], const mldsa_poly *s1, const mldsa_poly *s2, const mldsa_poly *t0, const MLDSA_param_info_t *p)
Pack the secret key (rho || K || tr || s1 || s2 || t0).
void MLDSA_PACK_unpack_polyt0(mldsa_poly *r, const uint8_t a[MLDSA_POLYT0_PACKEDBYTES])
Unpack polynomial t0 from bytes.
void MLDSA_PACK_unpack_pk(uint8_t rho[MLDSA_SEEDBYTES], mldsa_poly *t1, const uint8_t *pk, const MLDSA_param_info_t *p)
Unpack the public key.
void MLDSA_PACK_unpack_sk(uint8_t rho[MLDSA_SEEDBYTES], uint8_t K[MLDSA_SEEDBYTES], uint8_t tr[MLDSA_TRBYTES], mldsa_poly *s1, mldsa_poly *s2, mldsa_poly *t0, const uint8_t *sk, const MLDSA_param_info_t *p)
Unpack the secret key.
void MLDSA_PACK_polyt1(uint8_t r[MLDSA_POLYT1_PACKEDBYTES], const mldsa_poly *a)
Bit-pack polynomial with coefficients a1 from power2round (10-bit values). Each coefficient uses 10 b...
uint32_t MLDSA_PACK_unpack_polyz(mldsa_poly *r, const uint8_t *a, int32_t gamma1)
Unpack polynomial z.
void MLDSA_PACK_pk(uint8_t *pk, const uint8_t rho[MLDSA_SEEDBYTES], const mldsa_poly *t1, const MLDSA_param_info_t *p)
Pack the public key (rho || t1).
int MLDSA_PACK_unpack_sig(uint8_t *ctilde, mldsa_poly *z, mldsa_poly *h, const uint8_t *sig, const MLDSA_param_info_t *p)
Unpack signature.
void MLDSA_PACK_unpack_polyt1(mldsa_poly *r, const uint8_t a[MLDSA_POLYT1_PACKEDBYTES])
Unpack polynomial t1 from bytes.
void MLDSA_PACK_polyt0(uint8_t r[MLDSA_POLYT0_PACKEDBYTES], const mldsa_poly *a)
Bit-pack polynomial with coefficients a0 from power2round. Coefficients in (-(2^{D-1}-1),...
uint32_t MLDSA_PACK_polyeta(uint8_t *r, const mldsa_poly *a, uint8_t eta)
Bit-pack polynomial with coefficients in [-eta, eta].
uint32_t MLDSA_PACK_polyz(uint8_t *r, const mldsa_poly *a, int32_t gamma1)
Bit-pack polynomial z with coefficients in [-(gamma1-1), gamma1].
#define MLDSA_POLYT0_PACKEDBYTES
#define MLDSA_POLYT1_PACKEDBYTES
ML-DSA parameter set descriptor holding all derived sizes.
uint16_t polyvech_packed_bytes
uint16_t polyz_packed_bytes
uint16_t polyeta_packed_bytes
Polynomial with MLDSA_N int32_t coefficients.