@@ -25,7 +25,24 @@ void polyvecl_uniform_gamma1(polyvecl *v, const uint8_t seed[MLDSA_CRHBYTES],
25
25
uint16_t nonce );
26
26
27
27
#define polyvecl_reduce MLD_NAMESPACE(polyvecl_reduce)
28
- void polyvecl_reduce (polyvecl * v );
28
+ /*************************************************
29
+ * Name: polyvecl_reduce
30
+ *
31
+ * Description: Inplace reduction of all coefficients of all polynomial in a
32
+ * vector of length MLDSA_L to
33
+ * representative in [-6283008,6283008].
34
+ *
35
+ * Arguments: - poly *v: pointer to input/output vector
36
+ **************************************************/
37
+ void polyvecl_reduce (polyvecl * v )
38
+ __contract__ (
39
+ requires (memory_no_alias (v , sizeof (polyvecl )))
40
+ requires (forall (k0 , 0 , MLDSA_L ,
41
+ array_bound (v - > vec [k0 ].coeffs , 0 , MLDSA_N , INT32_MIN , REDUCE_DOMAIN_MAX )))
42
+ assigns (memory_slice (v , sizeof (polyvecl )))
43
+ ensures (forall (k1 , 0 , MLDSA_L ,
44
+ array_bound (v - > vec [k1 ].coeffs , 0 , MLDSA_N , - REDUCE_RANGE_MAX , REDUCE_RANGE_MAX )))
45
+ );
29
46
30
47
#define polyvecl_add MLD_NAMESPACE(polyvecl_add)
31
48
/*************************************************
@@ -38,7 +55,17 @@ void polyvecl_reduce(polyvecl *v);
38
55
* - const polyvecl *u: pointer to first summand
39
56
* - const polyvecl *v: pointer to second summand
40
57
**************************************************/
41
- void polyvecl_add (polyvecl * w , const polyvecl * u , const polyvecl * v );
58
+ void polyvecl_add (polyvecl * w , const polyvecl * u , const polyvecl * v )
59
+ __contract__ (
60
+ requires (memory_no_alias (w , sizeof (polyvecl )))
61
+ requires (memory_no_alias (u , sizeof (polyvecl )))
62
+ requires (memory_no_alias (v , sizeof (polyvecl )))
63
+ requires (forall (k0 , 0 , MLDSA_L ,
64
+ forall (k1 , 0 , MLDSA_N , (int64_t ) u -> vec [k0 ].coeffs [k1 ] + v - > vec [k0 ].coeffs [k1 ] <= INT32_MAX )))
65
+ requires (forall (k2 , 0 , MLDSA_L ,
66
+ forall (k3 , 0 , MLDSA_N , (int64_t ) u -> vec [k2 ].coeffs [k3 ] + v - > vec [k2 ].coeffs [k3 ] >= INT32_MIN )))
67
+ assigns (memory_slice (w , sizeof (polyvecl )))
68
+ );
42
69
43
70
#define polyvecl_ntt MLD_NAMESPACE(polyvecl_ntt)
44
71
/*************************************************
@@ -109,7 +136,16 @@ void polyveck_uniform_eta(polyveck *v, const uint8_t seed[MLDSA_CRHBYTES],
109
136
*
110
137
* Arguments: - polyveck *v: pointer to input/output vector
111
138
**************************************************/
112
- void polyveck_reduce (polyveck * v );
139
+ void polyveck_reduce (polyveck * v )
140
+ __contract__ (
141
+ requires (memory_no_alias (v , sizeof (polyveck )))
142
+ requires (forall (k0 , 0 , MLDSA_K ,
143
+ array_bound (v - > vec [k0 ].coeffs , 0 , MLDSA_N , INT32_MIN , REDUCE_DOMAIN_MAX )))
144
+ assigns (memory_slice (v , sizeof (polyveck )))
145
+ ensures (forall (k1 , 0 , MLDSA_K ,
146
+ array_bound (v - > vec [k1 ].coeffs , 0 , MLDSA_N , - REDUCE_RANGE_MAX , REDUCE_RANGE_MAX )))
147
+ );
148
+
113
149
#define polyveck_caddq MLD_NAMESPACE(polyveck_caddq)
114
150
/*************************************************
115
151
* Name: polyveck_caddq
@@ -132,7 +168,19 @@ void polyveck_caddq(polyveck *v);
132
168
* - const polyveck *u: pointer to first summand
133
169
* - const polyveck *v: pointer to second summand
134
170
**************************************************/
135
- void polyveck_add (polyveck * w , const polyveck * u , const polyveck * v );
171
+ void polyveck_add (polyveck * w , const polyveck * u , const polyveck * v )
172
+ __contract__ (
173
+ requires (memory_no_alias (w , sizeof (polyveck )))
174
+ requires (memory_no_alias (u , sizeof (polyveck )))
175
+ requires (memory_no_alias (v , sizeof (polyveck )))
176
+ requires (forall (k0 , 0 , MLDSA_K ,
177
+ forall (k1 , 0 , MLDSA_N , (int64_t ) u -> vec [k0 ].coeffs [k1 ] + v - > vec [k0 ].coeffs [k1 ] <= INT32_MAX )))
178
+ requires (forall (k2 , 0 , MLDSA_K ,
179
+ forall (k3 , 0 , MLDSA_N , (int64_t ) u -> vec [k2 ].coeffs [k3 ] + v - > vec [k2 ].coeffs [k3 ] >= INT32_MIN )))
180
+ assigns (memory_slice (w , sizeof (polyveck )))
181
+ );
182
+
183
+ #define polyveck_sub MLD_NAMESPACE(polyveck_sub)
136
184
/*************************************************
137
185
* Name: polyveck_sub
138
186
*
@@ -144,8 +192,18 @@ void polyveck_add(polyveck *w, const polyveck *u, const polyveck *v);
144
192
* - const polyveck *v: pointer to second input vector to be
145
193
* subtracted from first input vector
146
194
**************************************************/
147
- #define polyveck_sub MLD_NAMESPACE(polyveck_sub)
148
- void polyveck_sub (polyveck * w , const polyveck * u , const polyveck * v );
195
+ void polyveck_sub (polyveck * w , const polyveck * u , const polyveck * v )
196
+ __contract__ (
197
+ requires (memory_no_alias (w , sizeof (polyveck )))
198
+ requires (memory_no_alias (u , sizeof (polyveck )))
199
+ requires (memory_no_alias (v , sizeof (polyveck )))
200
+ requires (forall (k0 , 0 , MLDSA_K ,
201
+ forall (k1 , 0 , MLDSA_N , (int64_t ) u -> vec [k0 ].coeffs [k1 ] - v - > vec [k0 ].coeffs [k1 ] <= INT32_MAX )))
202
+ requires (forall (k2 , 0 , MLDSA_K ,
203
+ forall (k3 , 0 , MLDSA_N , (int64_t ) u -> vec [k2 ].coeffs [k3 ] - v - > vec [k2 ].coeffs [k3 ] >= INT32_MIN )))
204
+ assigns (memory_slice (w , sizeof (polyveck )))
205
+ );
206
+
149
207
#define polyveck_shiftl MLD_NAMESPACE(polyveck_shiftl)
150
208
/*************************************************
151
209
* Name: polyveck_shiftl
@@ -278,11 +336,50 @@ __contract__(
278
336
* - const polyveck *u: pointer to input vector
279
337
* - const polyveck *h: pointer to input hint vector
280
338
**************************************************/
281
- void polyveck_use_hint (polyveck * w , const polyveck * v , const polyveck * h );
339
+ void polyveck_use_hint (polyveck * w , const polyveck * v , const polyveck * h )
340
+ __contract__ (
341
+ requires (memory_no_alias (w , sizeof (polyveck )))
342
+ requires (memory_no_alias (v , sizeof (polyveck )))
343
+ requires (memory_no_alias (h , sizeof (polyveck )))
344
+ requires (forall (k0 , 0 , MLDSA_K ,
345
+ array_bound (v - > vec [k0 ].coeffs , 0 , MLDSA_N , 0 , MLDSA_Q )))
346
+ requires (forall (k1 , 0 , MLDSA_K ,
347
+ array_bound (h - > vec [k1 ].coeffs , 0 , MLDSA_N , 0 , 2 )))
348
+ assigns (memory_slice (w , sizeof (polyveck )))
349
+ requires (forall (k2 , 0 , MLDSA_K ,
350
+ array_bound (w - > vec [k2 ].coeffs , 0 , MLDSA_N , 0 , (MLDSA_Q - 1 )/(2 * MLDSA_GAMMA2 ))))
351
+ );
282
352
283
353
#define polyveck_pack_w1 MLD_NAMESPACE(polyveck_pack_w1)
354
+ /*************************************************
355
+ * Name: polyveck_pack_w1
356
+ *
357
+ * Description: Bit-pack polynomial vector w1 with coefficients in [0,15] or
358
+ * [0,43].
359
+ * Input coefficients are assumed to be standard representatives.
360
+ *
361
+ * Arguments: - uint8_t *r: pointer to output byte array with at least
362
+ * MLDSA_K* MLDSA_POLYW1_PACKEDBYTES bytes
363
+ * - const polyveck *a: pointer to input polynomial vector
364
+ **************************************************/
284
365
void polyveck_pack_w1 (uint8_t r [MLDSA_K * MLDSA_POLYW1_PACKEDBYTES ],
285
- const polyveck * w1 );
366
+ const polyveck * w1 )
367
+ #if MLDSA_MODE == 2
368
+ __contract__ (
369
+ requires (memory_no_alias (r , MLDSA_K * MLDSA_POLYW1_PACKEDBYTES ))
370
+ requires (memory_no_alias (w1 , sizeof (polyveck )))
371
+ requires (forall (k1 , 0 , MLDSA_K ,
372
+ array_bound (w1 - > vec [k1 ].coeffs , 0 , MLDSA_N , 0 , 44 )))
373
+ assigns (object_whole (r )));
374
+ #else /* MLDSA_MODE == 2 */
375
+ __contract__ (
376
+ requires (memory_no_alias (r , MLDSA_K * MLDSA_POLYW1_PACKEDBYTES ))
377
+ requires (memory_no_alias (w1 , sizeof (polyveck )))
378
+ requires (forall (k1 , 0 , MLDSA_K ,
379
+ array_bound (w1 - > vec [k1 ].coeffs , 0 , MLDSA_N , 0 , 16 )))
380
+ assigns (object_whole (r )));
381
+ #endif /* MLDSA_MODE != 2 */
382
+
286
383
287
384
#define polyveck_pack_eta MLD_NAMESPACE(polyveck_pack_eta)
288
385
void polyveck_pack_eta (uint8_t r [MLDSA_K * MLDSA_POLYETA_PACKEDBYTES ],
0 commit comments