@@ -310,7 +310,8 @@ __contract__(
310
310
invariant (start < MLKEM_N + 2 * len )
311
311
invariant (k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N )
312
312
invariant (array_abs_bound (r , 0 , start , layer * MLKEM_Q + MLKEM_Q ))
313
- invariant (array_abs_bound (r , start , MLKEM_N , layer * MLKEM_Q )))
313
+ invariant (array_abs_bound (r , start , MLKEM_N , layer * MLKEM_Q ))
314
+ )
314
315
{
315
316
const int16_t zeta = zetas [k ++ ];
316
317
unsigned j ;
@@ -343,6 +344,14 @@ __contract__(
343
344
/* Twiddle factors for layer n start at index 2 ** (layer-1) */
344
345
k = 1 << (layer - 1 );
345
346
for (start = 0 ; start < MLKEM_N ; start += 2 * len )
347
+ __loop__ (
348
+ invariant (start < MLKEM_N + 2 * len )
349
+ invariant (len % 2 == 0 )
350
+ invariant (len == 4 || len == 8 || len == 16 || len == 32 || len == 64 || len == 128 )
351
+ invariant (k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N )
352
+ invariant (array_abs_bound (r , 0 , start , (layer + 2 ) * MLKEM_Q ))
353
+ invariant (array_abs_bound (r , start , MLKEM_N , layer * MLKEM_Q ))
354
+ )
346
355
{
347
356
unsigned j ;
348
357
const int16_t this_layer_zeta = zetas [k ];
@@ -351,6 +360,27 @@ __contract__(
351
360
k ++ ;
352
361
353
362
for (j = 0 ; j < len / 2 ; j ++ )
363
+ __loop__ (
364
+ invariant (j <= len / 2 )
365
+ invariant (len % 2 == 0 )
366
+ invariant (len == 4 || len == 8 || len == 16 || len == 32 || len == 64 || len == 128 )
367
+
368
+ invariant (array_abs_bound (r , 0 , start , layer * MLKEM_Q + MLKEM_Q ))
369
+
370
+ invariant (array_abs_bound (r , start , start + j , (layer + 2 ) * MLKEM_Q ))
371
+ invariant (array_abs_bound (r , start + j , start + len / 2 , layer * MLKEM_Q ))
372
+
373
+ invariant (array_abs_bound (r , start + len / 2 , start + len / 2 + j , (layer + 2 ) * MLKEM_Q ))
374
+ invariant (array_abs_bound (r , start + len / 2 + j , start + len , layer * MLKEM_Q ))
375
+
376
+ invariant (array_abs_bound (r , start + len , start + len + j , (layer + 2 ) * MLKEM_Q ))
377
+ invariant (array_abs_bound (r , start + len + j , start + len + len / 2 , layer * MLKEM_Q ))
378
+
379
+ invariant (array_abs_bound (r , start + len + len / 2 , start + len + len / 2 + j , (layer + 2 ) * MLKEM_Q ))
380
+ invariant (array_abs_bound (r , start + len + len / 2 + j , start + 2 * len , layer * MLKEM_Q ))
381
+
382
+ invariant (array_abs_bound (r , start + 2 * len , MLKEM_N , layer * MLKEM_Q ))
383
+ )
354
384
{
355
385
const unsigned ci0 = j + start ;
356
386
const unsigned ci1 = ci0 + len / 2 ;
0 commit comments