Skip to content

Commit 3680726

Browse files
committed
HOL Light proofs infrastructure for x86 and basemul proof
Signed-off-by: Dusan Kostic <[email protected]>
1 parent 5039f6b commit 3680726

18 files changed

+8780
-45
lines changed

.github/workflows/hol_light.yml

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ on:
1212
- 'proofs/hol_light/arm/Makefile'
1313
- 'proofs/hol_light/arm/**/*.S'
1414
- 'proofs/hol_light/arm/**/*.ml'
15+
- 'proofs/hol_light/x86/Makefile'
16+
- 'proofs/hol_light/x86/**/*.S'
17+
- 'proofs/hol_light/x86/**/*.ml'
1518
- 'flake.nix'
1619
- 'flake.lock'
1720
- 'nix/hol_light/*'
@@ -23,6 +26,9 @@ on:
2326
- 'proofs/hol_light/arm/Makefile'
2427
- 'proofs/hol_light/arm/**/*.S'
2528
- 'proofs/hol_light/arm/**/*.ml'
29+
- 'proofs/hol_light/x86/Makefile'
30+
- 'proofs/hol_light/x86/**/*.S'
31+
- 'proofs/hol_light/x86/**/*.ml'
2632
- 'flake.nix'
2733
- 'flake.lock'
2834
- 'nix/hol_light/*'
@@ -142,3 +148,88 @@ jobs:
142148
nix-shell: 'hol_light'
143149
script: |
144150
tests hol_light -p ${{ matrix.proof.name }} --verbose
151+
152+
# x86_64 proofs
153+
hol_light_bytecode:
154+
name: HOL-Light bytecode check
155+
runs-on: pqcp-x64
156+
if: github.repository_owner == 'pq-code-package' && !github.event.pull_request.head.repo.fork
157+
steps:
158+
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
159+
with:
160+
fetch-depth: 0
161+
- uses: ./.github/actions/setup-shell
162+
with:
163+
gh_token: ${{ secrets.GITHUB_TOKEN }}
164+
nix-shell: 'hol_light'
165+
script: |
166+
autogen --update-hol-light-bytecode --dry-run
167+
# TODO: fix the interactive mode to work for both x86 and arm.
168+
# hol_light_interactive:
169+
# name: HOL-Light interactive shell test
170+
# runs-on: pqcp-x64
171+
# needs: [ hol_light_bytecode ]
172+
# if: github.repository_owner == 'pq-code-package' && !github.event.pull_request.head.repo.fork
173+
# steps:
174+
# - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
175+
# with:
176+
# fetch-depth: 0
177+
# - uses: ./.github/actions/setup-shell
178+
# with:
179+
# gh_token: ${{ secrets.GITHUB_TOKEN }}
180+
# nix-shell: 'hol_light'
181+
# script: |
182+
# make -C proofs/hol_light/x86 mlkem/mlkem_poly_basemul_acc_montgomery_cached_k2.o
183+
# echo 'needs "proofs/mlkem_poly_basemul_acc_montgomery_cached_k2.ml";;' | hol.sh
184+
hol_light_proofs:
185+
needs: [ hol_light_bytecode ]
186+
strategy:
187+
fail-fast: false
188+
matrix:
189+
proof:
190+
# Dependencies on {name}.{S,ml} are implicit
191+
- name: mlkem_poly_basemul_acc_montgomery_cached_k2
192+
needs: ["mlkem_specs.ml"]
193+
- name: mlkem_poly_basemul_acc_montgomery_cached_k3
194+
needs: ["mlkem_specs.ml"]
195+
- name: mlkem_poly_basemul_acc_montgomery_cached_k4
196+
needs: ["mlkem_specs.ml"]
197+
name: HOL Light proof for ${{ matrix.proof.name }}.S
198+
runs-on: pqcp-x64
199+
if: github.repository_owner == 'pq-code-package' && !github.event.pull_request.head.repo.fork
200+
steps:
201+
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
202+
with:
203+
fetch-depth: 0
204+
- name: Get changed files
205+
id: changed-files
206+
uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
207+
- name: Check if dependencies changed
208+
id: check_run
209+
shell: bash
210+
run: |
211+
run_needed=0
212+
changed_files="${{ steps.changed-files.outputs.all_changed_files }}"
213+
dependencies="${{ join(matrix.proof.needs, ' ') }} ${{ format('{0}.S {0}.ml', matrix.proof.name) }}"
214+
for changed in $changed_files; do
215+
for needs in $dependencies; do
216+
if [[ "$changed" == *"$needs" ]]; then
217+
run_needed=1
218+
fi
219+
done
220+
done
221+
222+
# Always re-run upon change to nix files for HOL-Light
223+
if [[ "$changed_files" == *"nix/"* ]] || [[ "$changed_files" == *"hol_light.yml"* ]] || [[ "$changed_files" == *"flake"* ]] || [[ "$changed_files" == *"proofs/hol_light/x86/Makefile"* ]]; then
224+
run_needed=1
225+
fi
226+
227+
echo "run_needed=${run_needed}" >> $GITHUB_OUTPUT
228+
- uses: ./.github/actions/setup-shell
229+
if: |
230+
steps.check_run.outputs.run_needed == '1'
231+
with:
232+
gh_token: ${{ secrets.GITHUB_TOKEN }}
233+
nix-shell: 'hol_light'
234+
script: |
235+
tests hol_light -p ${{ matrix.proof.name }} --verbose

BIBLIOGRAPHY.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ source code and documentation.
113113
- [mlkem/src/fips202/native/aarch64/auto.h](mlkem/src/fips202/native/aarch64/auto.h)
114114
- [mlkem/src/fips202/native/aarch64/src/keccak_f1600_x1_v84a_asm.S](mlkem/src/fips202/native/aarch64/src/keccak_f1600_x1_v84a_asm.S)
115115
- [mlkem/src/fips202/native/aarch64/src/keccak_f1600_x2_v84a_asm.S](mlkem/src/fips202/native/aarch64/src/keccak_f1600_x2_v84a_asm.S)
116-
- [proofs/hol_light/arm/README.md](proofs/hol_light/arm/README.md)
116+
- [proofs/hol_light/README.md](proofs/hol_light/README.md)
117117
- [proofs/hol_light/arm/mlkem/keccak_f1600_x1_v84a.S](proofs/hol_light/arm/mlkem/keccak_f1600_x1_v84a.S)
118118
- [proofs/hol_light/arm/mlkem/keccak_f1600_x2_v84a.S](proofs/hol_light/arm/mlkem/keccak_f1600_x2_v84a.S)
119119

@@ -248,7 +248,7 @@ source code and documentation.
248248
* URL: https://github.com/slothy-optimizer/slothy/
249249
* Referenced from:
250250
- [dev/README.md](dev/README.md)
251-
- [proofs/hol_light/arm/README.md](proofs/hol_light/arm/README.md)
251+
- [proofs/hol_light/README.md](proofs/hol_light/README.md)
252252

253253
### `SLOTHY_Paper`
254254

nix/hol_light/default.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ hol_light.overrideAttrs (old: {
1111
src = fetchFromGitHub {
1212
owner = "jrh13";
1313
repo = "hol-light";
14-
rev = "bed58fa74649fa74015176f8f90e77f7af5cf8e3";
15-
hash = "sha256-QDubbUUChvv04239BdcKPSU+E2gdSzqAWfAETK2Xtg0=";
14+
rev = "08bcac75772d37c2447a90c90d1dff9ab415f217";
15+
hash = "sha256-kYOzGW7uQGOM/b+JPWQfpqqtgMmMku/BkN58WZTtokU=";
1616
};
1717
patches = [
1818
./0005-Configure-hol-sh-for-mlkem-native.patch

nix/s2n_bignum/default.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
{ stdenv, fetchFromGitHub, writeText, ... }:
33
stdenv.mkDerivation rec {
44
pname = "s2n_bignum";
5-
version = "2ab2252b8505e58a7c3392f8ad823782032b61e7";
5+
version = "84a604317b94cbca9f14c7b2b771afc2827ab99f";
66
src = fetchFromGitHub {
77
owner = "awslabs";
88
repo = "s2n-bignum";
99
rev = "${version}";
10-
hash = "sha256-7lil3jAFo5NiyNOSBYZcRjduXkotV3x4PlxXSKt63M8=";
10+
hash = "sha256-J2tVZ2x23ZHP+ZNkbiUqyaci5bu4zNfkXuRemnuB+N0=";
1111
};
1212
setupHook = writeText "setup-hook.sh" ''
1313
export S2N_BIGNUM_DIR="$1"

proofs/hol_light/arm/README.md renamed to proofs/hol_light/README.md

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
# HOL Light functional correctness proofs
44

5-
This directory contains functional correctness proofs for all AArch64 assembly routines
6-
used in mlkem-native. The proofs were largely developed by John Harrison
5+
This directory contains functional correctness proofs for all AArch64 and some x86_64 assembly routines
6+
used in mlkem-native. The proofs were largely developed by John Harrison and Dusan Kostic
77
and are written in the [HOL Light](https://hol-light.github.io/) theorem
88
prover, utilizing the assembly verification infrastructure from [s2n-bignum](https://github.com/awslabs/s2n-bignum).
99

10-
Each function is proved in a separate `.ml` file in [proofs/](proofs). Each file
10+
Each function is proved in a separate `.ml` file in [arm/proofs/](arm/proofs) and [x86/proofs/](x86/proofs). Each file
1111
contains the byte code being verified, as well as the specification that is being
1212
proved.
1313

@@ -16,7 +16,7 @@ proved.
1616
Proofs are 'post-hoc' in the sense that HOL-Light/s2n-bignum operate on the final object code. In particular, the means by which the code was generated (including the [SLOTHY](https://github.com/slothy-optimizer/slothy/) superoptimizer) need not be trusted.
1717

1818
Specifications are essentially [Hoare triples](https://en.wikipedia.org/wiki/Hoare_logic), with the noteworthy difference that the program is implicit as the content of memory at the PC; which is asserted to
19-
be the code under verification as part of the precondition. For example, the following is the specification of the `poly_reduce` function:
19+
be the code under verification as part of the precondition. For example, the following is the specification of the aarch64 `poly_reduce` function:
2020

2121
```ocaml
2222
(* For all (abbreviated by `!` in HOL):
@@ -67,6 +67,11 @@ from mlkem-native's base directory. Then
6767
```bash
6868
make -C proofs/hol_light/arm
6969
```
70+
or
71+
72+
```bash
73+
make -C proofs/hol_light/x86
74+
```
7075

7176
will build and run the proofs. Note that this make take hours even on powerful machines.
7277

@@ -77,23 +82,27 @@ For convenience, you can also use `tests hol_light` which wraps the `make` invoc
7782
All AArch64 assembly routines used in mlkem-native are covered. Those are:
7883

7984
- ML-KEM Arithmetic:
80-
* AArch64 forward NTT: [mlkem_ntt.S](mlkem/mlkem_ntt.S)
81-
* AArch64 inverse NTT: [mlkem_intt.S](mlkem/mlkem_intt.S)
82-
* AArch64 base multiplications: [mlkem_poly_basemul_acc_montgomery_cached_k2.S](mlkem/mlkem_poly_basemul_acc_montgomery_cached_k2.S) [mlkem_poly_basemul_acc_montgomery_cached_k3.S](mlkem/mlkem_poly_basemul_acc_montgomery_cached_k3.S) [mlkem_poly_basemul_acc_montgomery_cached_k4.S](mlkem/mlkem_poly_basemul_acc_montgomery_cached_k4.S)
83-
* AArch64 conversion to Montgomery form: [mlkem_poly_tomont.S](mlkem/mlkem_poly_tomont.S)
84-
* AArch64 modular reduction: [mlkem_poly_reduce.S](mlkem/mlkem_poly_reduce.S)
85-
* AArch64 'multiplication cache' computation: [mlkem_poly_mulcache_compute.S](mlkem/mlkem_poly_mulcache_compute.S)
86-
* AArch64 rejection sampling: [mlkem_rej_uniform.S](mlkem/mlkem_rej_uniform.S)
87-
* AArch64 polynomial compresseion: [mlkem_poly_tobytes.S](mlkem/mlkem_poly_tobytes.S)
85+
* AArch64 forward NTT: [mlkem_ntt.S](arm/mlkem/mlkem_ntt.S)
86+
* AArch64 inverse NTT: [mlkem_intt.S](arm/mlkem/mlkem_intt.S)
87+
* AArch64 base multiplications: [mlkem_poly_basemul_acc_montgomery_cached_k2.S](arm/mlkem/mlkem_poly_basemul_acc_montgomery_cached_k2.S) [mlkem_poly_basemul_acc_montgomery_cached_k3.S](arm/mlkem/mlkem_poly_basemul_acc_montgomery_cached_k3.S) [mlkem_poly_basemul_acc_montgomery_cached_k4.S](arm/mlkem/mlkem_poly_basemul_acc_montgomery_cached_k4.S)
88+
* AArch64 conversion to Montgomery form: [mlkem_poly_tomont.S](arm/mlkem/mlkem_poly_tomont.S)
89+
* AArch64 modular reduction: [mlkem_poly_reduce.S](arm/mlkem/mlkem_poly_reduce.S)
90+
* AArch64 'multiplication cache' computation: [mlkem_poly_mulcache_compute.S](arm/mlkem/mlkem_poly_mulcache_compute.S)
91+
* AArch64 rejection sampling: [mlkem_rej_uniform.S](arm/mlkem/mlkem_rej_uniform.S)
92+
* AArch64 polynomial compresseion: [mlkem_poly_tobytes.S](arm/mlkem/mlkem_poly_tobytes.S)
8893
- FIPS202:
89-
* Keccak-F1600 using lazy rotations[^HYBRID]: [keccak_f1600_x1_scalar.S](mlkem/keccak_f1600_x1_scalar.S)
90-
* Keccak-F1600 using v8.4-A SHA3 instructions: [keccak_f1600_x1_v84a.S](mlkem/keccak_f1600_x1_v84a.S)
91-
* 2-fold Keccak-F1600 using v8.4-A SHA3 instructions: [keccak_f1600_x2_v84a.S](mlkem/keccak_f1600_x2_v84a.S)
92-
* 'Hybrid' 4-fold Keccak-F1600 using scalar and v8-A Neon instructions: [keccak_f1600_x4_v8a_scalar.S](mlkem/keccak_f1600_x4_v8a_scalar.S)
93-
* 'Triple hybrid' 4-fold Keccak-F1600 using scalar, v8-A Neon and v8.4-A+SHA3 Neon instructions:[keccak_f1600_x4_v8a_v84a_scalar.S](mlkem/keccak_f1600_x4_v8a_v84a_scalar.S)
94+
* Keccak-F1600 using lazy rotations[^HYBRID]: [keccak_f1600_x1_scalar.S](arm/mlkem/keccak_f1600_x1_scalar.S)
95+
* Keccak-F1600 using v8.4-A SHA3 instructions: [keccak_f1600_x1_v84a.S](arm/mlkem/keccak_f1600_x1_v84a.S)
96+
* 2-fold Keccak-F1600 using v8.4-A SHA3 instructions: [keccak_f1600_x2_v84a.S](arm/mlkem/keccak_f1600_x2_v84a.S)
97+
* 'Hybrid' 4-fold Keccak-F1600 using scalar and v8-A Neon instructions: [keccak_f1600_x4_v8a_scalar.S](arm/mlkem/keccak_f1600_x4_v8a_scalar.S)
98+
* 'Triple hybrid' 4-fold Keccak-F1600 using scalar, v8-A Neon and v8.4-A+SHA3 Neon instructions:[keccak_f1600_x4_v8a_v84a_scalar.S](arm/mlkem/keccak_f1600_x4_v8a_v84a_scalar.S)
9499

95100
The NTT and invNTT functions are super-optimized using [SLOTHY](https://github.com/slothy-optimizer/slothy/).
96101

102+
The following x86_64 assembly routines used in mlkem-native are covered:
103+
- ML-KEM Arithmetic:
104+
* x86_64 base multiplications: [mlkem_poly_basemul_acc_montgomery_cached_k2.S](x86/mlkem/mlkem_poly_basemul_acc_montgomery_cached_k2.S) [mlkem_poly_basemul_acc_montgomery_cached_k3.S](x86/mlkem/mlkem_poly_basemul_acc_montgomery_cached_k3.S) [mlkem_poly_basemul_acc_montgomery_cached_k4.S](x86/mlkem/mlkem_poly_basemul_acc_montgomery_cached_k4.S)
105+
97106
<!--- bibliography --->
98107
[^HYBRID]: Becker, Kannwischer: Hybrid scalar/vector implementations of Keccak and SPHINCS+ on AArch64, [https://eprint.iacr.org/2022/1243](https://eprint.iacr.org/2022/1243)
99108
[^SLOTHY]: Abdulrahman, Becker, Kannwischer, Klein: SLOTHY superoptimizer, [https://github.com/slothy-optimizer/slothy/](https://github.com/slothy-optimizer/slothy/)

proofs/hol_light/x86/Makefile

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#############################################################################
2+
# Copyright (c) The mlkem-native project authors
3+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4+
# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT-0
5+
#############################################################################
6+
7+
#
8+
# This Makefile is derived from the Makefile x86/Makefile in s2n-bignum.
9+
# - Remove all s2n-bignum proofs and tutorial, add mlkem-native proofs
10+
# - Minor path modifications to support base theories from s2n-bignum
11+
# to reside in a separate read-only directory
12+
#
13+
14+
.DEFAULT_GOAL := run_proofs
15+
16+
OSTYPE_RESULT=$(shell uname -s)
17+
ARCHTYPE_RESULT=$(shell uname -m)
18+
19+
SRC ?= $(S2N_BIGNUM_DIR)
20+
SRC_X86 ?= $(SRC)/x86
21+
22+
# Add explicit language input parameter to cpp, otherwise the use of #n for
23+
# numeric literals in x86 code is a problem when used inside #define macros
24+
# since normally that means stringization.
25+
#
26+
# Some clang-based preprocessors seem to behave differently, and get confused
27+
# by single-quote characters in comments, so we eliminate // comments first.
28+
29+
ifeq ($(OSTYPE_RESULT),Darwin)
30+
PREPROCESS=sed -e 's/\/\/.*//' | $(CC) -E -xassembler-with-cpp -
31+
else
32+
PREPROCESS=$(CC) -E -xassembler-with-cpp -
33+
endif
34+
35+
# Generally GNU-type assemblers are happy with multiple instructions on
36+
# a line, but we split them up anyway just in case.
37+
38+
SPLIT=tr ';' '\n'
39+
40+
# If actually on an x86_64 machine, just use the assembler (as). Otherwise
41+
# use a cross-assembling version so that the code can still be assembled
42+
# and the proofs checked against the object files (though you won't be able
43+
# to run code without additional emulation infrastructure). For the clang
44+
# version on OS X we just add the "-arch x86_64" option. For the Linux/gcc
45+
# toolchain we assume the presence of the special cross-assembler. This
46+
# can be installed via something like:
47+
#
48+
# sudo apt-get install binutils-x86-64-linux-gnu
49+
50+
ifeq ($(ARCHTYPE_RESULT),x86_64)
51+
ASSEMBLE=as
52+
OBJDUMP=objdump -d
53+
else
54+
ifeq ($(OSTYPE_RESULT),Darwin)
55+
ASSEMBLE=as -arch x86_64
56+
OBJDUMP=otool -tvV
57+
else
58+
ASSEMBLE=x86_64-linux-gnu-as
59+
OBJDUMP=x86_64-linux-gnu-objdump -d
60+
endif
61+
endif
62+
63+
OBJ = mlkem/mlkem_poly_basemul_acc_montgomery_cached_k2.o \
64+
mlkem/mlkem_poly_basemul_acc_montgomery_cached_k3.o \
65+
mlkem/mlkem_poly_basemul_acc_montgomery_cached_k4.o
66+
67+
# Build object files from assembly sources
68+
$(OBJ): %.o : %.S
69+
@echo "Preparing $@ ..."
70+
@echo "AS: `$(ASSEMBLE) --version`"
71+
@echo "OBJDUMP: `$(OBJDUMP) --version`"
72+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
73+
cat $< | $(PREPROCESS) | $(SPLIT) | $(ASSEMBLE) -o $@ -
74+
# MacOS may generate relocations in non-text sections that break
75+
# the object file parser in HOL-Light
76+
strip $@
77+
78+
clean:; rm -f */*.o */*/*.o */*.correct */*.native
79+
80+
# Proof-related parts
81+
#
82+
# The proof files are all independent, though each one loads the
83+
# same common infrastructure "base.ml". So you can potentially
84+
# run the proofs in parallel for more speed, e.g.
85+
#
86+
# nohup make -j 16 proofs &
87+
#
88+
# If you build hol-light yourself (see https://github.com/jrh13/hol-light)
89+
# in your home directory, and do "make" inside the subdirectory hol-light,
90+
# then the following HOLDIR setting should be right:
91+
92+
HOLDIR?=$(HOLLIGHTDIR)
93+
HOLLIGHT:=$(HOLDIR)/hol.sh
94+
95+
BASE?=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
96+
97+
PROOF_BINS = $(OBJ:.o=.native)
98+
PROOF_LOGS = $(OBJ:.o=.correct)
99+
100+
# Build precompiled binary for dumping bytecodes
101+
proofs/dump_bytecode.native: proofs/dump_bytecode.ml $(OBJ)
102+
./proofs/build-proof.sh $(BASE)/$< "$(HOLLIGHT)" "$@"
103+
104+
# Build precompiled native binaries of HOL Light proofs
105+
106+
.SECONDEXPANSION:
107+
%.native: proofs/$$(*F).ml %.o ; ./proofs/build-proof.sh $(BASE)/$< "$(HOLLIGHT)" "$@"
108+
109+
# Run them and print the standard output+error at *.correct
110+
%.correct: %.native
111+
$< 2>&1 | tee $@
112+
@if (grep -i "error:\|exception:" "$@" >/dev/null); then \
113+
echo "$< had errors!"; \
114+
exit 1; \
115+
else \
116+
echo "$< OK"; \
117+
fi
118+
119+
build_proofs: $(PROOF_BINS);
120+
run_proofs: build_proofs $(PROOF_LOGS);
121+
122+
proofs: run_proofs ; $(SRC)/tools/count-proofs.sh .
123+
124+
dump_bytecode: proofs/dump_bytecode.native
125+
./$<
126+
127+
.PHONY: proofs build_proofs run_proofs sematest clean dump_bytecode
128+
129+
# Always run sematest regardless of dependency check
130+
FORCE: ;
131+
# Always use max. # of cores because in Makefile one cannot get the passed number of -j.
132+
# A portable way of getting the number of max. cores:
133+
# https://stackoverflow.com/a/23569003/1488216
134+
NUM_CORES_FOR_SEMATEST = $(shell getconf _NPROCESSORS_ONLN)
135+
sematest: FORCE $(OBJ) $(SRC_X86)/proofs/simulator_iclasses.ml $(SRC_X86)/proofs/simulator.native
136+
$(SRC)/tools/run-sematest.sh x86 $(NUM_CORES_FOR_SEMATEST)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env bash
2+
# Copyright (c) The mlkem-native project authors
3+
# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
4+
#
5+
# This tiny script just lists the names of source files for which
6+
# we have a spec and proof in HOL-Light.
7+
8+
ROOT=$(git rev-parse --show-toplevel)
9+
cd $ROOT
10+
ls -1 proofs/hol_light/x86/mlkem/*.S | cut -d '/' -f 5 | sed 's/\.S//'

0 commit comments

Comments
 (0)