Skip to content

Commit 890b6db

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

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
@@ -306,7 +306,8 @@ __contract__(
306306
invariant(start < MLKEM_N + 2 * len)
307307
invariant(k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N)
308308
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+
)
310311
{
311312
const int16_t zeta = zetas[k++];
312313
unsigned j;
@@ -339,6 +340,14 @@ __contract__(
339340
/* Twiddle factors for layer n start at index 2 ** (layer-1) */
340341
k = 1 << (layer - 1);
341342
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+
)
342351
{
343352
unsigned j;
344353
const int16_t this_layer_zeta = zetas[k];
@@ -347,6 +356,27 @@ __contract__(
347356
k++;
348357

349358
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+
)
350380
{
351381
const unsigned ci0 = j + start;
352382
const unsigned ci1 = ci0 + len / 2;

0 commit comments

Comments
 (0)