Skip to content

Commit 39a25df

Browse files
committed
First set of candidate loop invariants for ntt_2_layers()
Signed-off-by: Rod Chapman <rodchap@amazon.com>
1 parent 9fc47e2 commit 39a25df

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

mlkem/src/poly.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,8 @@ __contract__(
325325
invariant(start < MLKEM_N + 2 * len)
326326
invariant(k <= MLKEM_N / 2 && 2 * len * k == start + MLKEM_N)
327327
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+
)
329330
{
330331
const int16_t zeta = zetas[k++];
331332
unsigned j;
@@ -358,6 +359,14 @@ __contract__(
358359
/* Twiddle factors for layer n start at index 2 ** (layer-1) */
359360
k = 1 << (layer - 1);
360361
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+
)
361370
{
362371
unsigned j;
363372
const int16_t this_layer_zeta = zetas[k];
@@ -366,6 +375,27 @@ __contract__(
366375
k++;
367376

368377
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+
)
369399
{
370400
const unsigned ci0 = j + start;
371401
const unsigned ci1 = ci0 + len / 2;

0 commit comments

Comments
 (0)