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