Skip to content

Commit 710b3bb

Browse files
committed
First set of candidate loop invariants for ntt_2_layers()
Signed-off-by: Rod Chapman <[email protected]>
1 parent fe1e6b3 commit 710b3bb

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

mlkem/poly.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ __contract__(
310310
invariant(start < MLKEM_N + 2 * len)
311311
invariant(k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N)
312312
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+
)
314315
{
315316
const int16_t zeta = zetas[k++];
316317
unsigned j;
@@ -343,6 +344,14 @@ __contract__(
343344
/* Twiddle factors for layer n start at index 2 ** (layer-1) */
344345
k = 1 << (layer - 1);
345346
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+
)
346355
{
347356
unsigned j;
348357
const int16_t this_layer_zeta = zetas[k];
@@ -351,6 +360,27 @@ __contract__(
351360
k++;
352361

353362
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+
)
354384
{
355385
const unsigned ci0 = j + start;
356386
const unsigned ci1 = ci0 + len / 2;

0 commit comments

Comments
 (0)