@@ -325,7 +325,8 @@ __contract__(
325
325
invariant (start < MLKEM_N + 2 * len )
326
326
invariant (k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N )
327
327
invariant (array_abs_bound (r , 0 , start , layer * MLKEM_Q + MLKEM_Q ))
328
- invariant (array_abs_bound (r , start , MLKEM_N , layer * MLKEM_Q )))
328
+ invariant (array_abs_bound (r , start , MLKEM_N , layer * MLKEM_Q ))
329
+ )
329
330
{
330
331
const int16_t zeta = zetas [k ++ ];
331
332
unsigned j ;
@@ -358,6 +359,14 @@ __contract__(
358
359
/* Twiddle factors for layer n start at index 2 ** (layer-1) */
359
360
k = 1 << (layer - 1 );
360
361
for (start = 0 ; start < MLKEM_N ; start += 2 * len )
362
+ __loop__ (
363
+ invariant (start < MLKEM_N + 2 * len )
364
+ invariant (len % 2 == 0 )
365
+ invariant (len == 4 || len == 8 || len == 16 || len == 32 || len == 64 || len == 128 )
366
+ invariant (k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N )
367
+ invariant (array_abs_bound (r , 0 , start , (layer + 2 ) * MLKEM_Q ))
368
+ invariant (array_abs_bound (r , start , MLKEM_N , layer * MLKEM_Q ))
369
+ )
361
370
{
362
371
unsigned j ;
363
372
const int16_t this_layer_zeta = zetas [k ];
@@ -366,6 +375,27 @@ __contract__(
366
375
k ++ ;
367
376
368
377
for (j = 0 ; j < len / 2 ; j ++ )
378
+ __loop__ (
379
+ invariant (j <= len / 2 )
380
+ invariant (len % 2 == 0 )
381
+ invariant (len == 4 || len == 8 || len == 16 || len == 32 || len == 64 || len == 128 )
382
+
383
+ invariant (array_abs_bound (r , 0 , start , layer * MLKEM_Q + MLKEM_Q ))
384
+
385
+ invariant (array_abs_bound (r , start , start + j , (layer + 2 ) * MLKEM_Q ))
386
+ invariant (array_abs_bound (r , start + j , start + len / 2 , layer * MLKEM_Q ))
387
+
388
+ invariant (array_abs_bound (r , start + len / 2 , start + len / 2 + j , (layer + 2 ) * MLKEM_Q ))
389
+ invariant (array_abs_bound (r , start + len / 2 + j , start + len , layer * MLKEM_Q ))
390
+
391
+ invariant (array_abs_bound (r , start + len , start + len + j , (layer + 2 ) * MLKEM_Q ))
392
+ invariant (array_abs_bound (r , start + len + j , start + len + len / 2 , layer * MLKEM_Q ))
393
+
394
+ invariant (array_abs_bound (r , start + len + len / 2 , start + len + len / 2 + j , (layer + 2 ) * MLKEM_Q ))
395
+ invariant (array_abs_bound (r , start + len + len / 2 + j , start + 2 * len , layer * MLKEM_Q ))
396
+
397
+ invariant (array_abs_bound (r , start + 2 * len , MLKEM_N , layer * MLKEM_Q ))
398
+ )
369
399
{
370
400
const unsigned ci0 = j + start ;
371
401
const unsigned ci1 = ci0 + len / 2 ;
0 commit comments