Skip to content

Commit b43b819

Browse files
authored
Merge pull request #52 from itzmeanjan/conform-to-fips-203-standard
Conform to NIST Standard FIPS 203
2 parents f1d5f4d + a52a5de commit b43b819

34 files changed

+1873
-2293
lines changed

.github/workflows/test_ci.yml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Test Ml_kem Key Encapsulation Mechanism
1+
name: Test ML-KEM Key Encapsulation Mechanism (NIST FIPS 203)
22

33
on:
44
push:
@@ -11,14 +11,15 @@ jobs:
1111
runs-on: ${{matrix.os}}
1212
strategy:
1313
matrix:
14-
os: [ubuntu-latest, macos-latest]
14+
os: [ubuntu-24.04, macos-latest]
15+
compiler: [g++, clang++]
1516

1617
steps:
1718
- uses: actions/checkout@v4
1819
- name: Setup Google-Test
1920
run: |
2021
pushd ~
21-
git clone https://github.com/google/googletest.git -b v1.14.0
22+
git clone https://github.com/google/googletest.git -b v1.15.0
2223
pushd googletest
2324
mkdir build
2425
pushd build
@@ -28,9 +29,13 @@ jobs:
2829
popd
2930
popd
3031
popd
31-
- name: Execute Tests on ${{matrix.os}}
32-
run: make -j
33-
- name: Execute Tests with AddressSanitizer on ${{matrix.os}}
34-
run: make asan_test -j
35-
- name: Execute Tests with UndefinedBehaviourSanitizer on ${{matrix.os}}
36-
run: make ubsan_test -j
32+
- name: Execute Tests on ${{matrix.os}}, compiled with ${{matrix.compiler}}
33+
run: CXX=${{matrix.compiler}} make -j
34+
- name: Execute Tests with AddressSanitizer, in DEBUG mode, on ${{matrix.os}}, compiled with ${{matrix.compiler}}
35+
run: CXX=${{matrix.compiler}} make debug_asan_test -j
36+
- name: Execute Tests with AddressSanitizer, in RELEASE mode, on ${{matrix.os}}, compiled with ${{matrix.compiler}}
37+
run: CXX=${{matrix.compiler}} make release_asan_test -j
38+
- name: Execute Tests with UndefinedBehaviourSanitizer, in DEBUG mode, on ${{matrix.os}}, compiled with ${{matrix.compiler}}
39+
run: CXX=${{matrix.compiler}} make debug_ubsan_test -j
40+
- name: Execute Tests with UndefinedBehaviourSanitizer, in RELEASE mode, on ${{matrix.os}}, compiled with ${{matrix.compiler}}
41+
run: CXX=${{matrix.compiler}} make release_ubsan_test -j

.gitmodules

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
[submodule "subtle"]
55
path = subtle
66
url = https://github.com/itzmeanjan/subtle.git
7-
[submodule "dudect"]
8-
path = dudect
9-
url = https://github.com/oreparaz/dudect.git
107
[submodule "gtest-parallel"]
118
path = gtest-parallel
129
url = https://github.com/google/gtest-parallel.git

Makefile

Lines changed: 92 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,119 +1,145 @@
11
CXX ?= clang++
2-
CXX_FLAGS = -std=c++20
3-
WARN_FLAGS = -Wall -Wextra -pedantic
4-
OPT_FLAGS = -O3 -march=native
5-
LINK_FLAGS = -flto
6-
ASAN_FLAGS = -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address # From https://clang.llvm.org/docs/AddressSanitizer.html
7-
UBSAN_FLAGS = -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=undefined # From https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
8-
2+
CXX_FLAGS := -std=c++20
3+
WARN_FLAGS := -Wall -Wextra -Wpedantic
4+
DEBUG_FLAGS := -O1 -g
5+
RELEASE_FLAGS := -O3 -march=native
6+
LINK_OPT_FLAGS := -flto
7+
ASAN_FLAGS := -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=address # From https://clang.llvm.org/docs/AddressSanitizer.html
8+
DEBUG_ASAN_FLAGS := $(DEBUG_FLAGS) $(ASAN_FLAGS)
9+
RELEASE_ASAN_FLAGS := -g $(RELEASE_FLAGS) $(ASAN_FLAGS)
10+
UBSAN_FLAGS := -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=undefined # From https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
11+
DEBUG_UBSAN_FLAGS := $(DEBUG_FLAGS) $(UBSAN_FLAGS)
12+
RELEASE_UBSAN_FLAGS := -g $(RELEASE_FLAGS) $(UBSAN_FLAGS)
13+
14+
I_FLAGS := -I ./include
915
SHA3_INC_DIR = ./sha3/include
1016
SUBTLE_INC_DIR = ./subtle/include
11-
DUDECT_INC_DIR = ./dudect/src
12-
I_FLAGS = -I ./include
1317
DEP_IFLAGS = -I $(SHA3_INC_DIR) -I $(SUBTLE_INC_DIR)
14-
DUDECT_DEP_IFLAGS = $(DEP_IFLAGS) -I $(DUDECT_INC_DIR)
1518

16-
SRC_DIR = include
19+
SRC_DIR := include
1720
ML_KEM_SOURCES := $(shell find $(SRC_DIR) -name '*.hpp')
18-
BUILD_DIR = build
19-
DUDECT_BUILD_DIR = $(BUILD_DIR)/dudect
20-
ASAN_BUILD_DIR = $(BUILD_DIR)/asan
21-
UBSAN_BUILD_DIR = $(BUILD_DIR)/ubsan
22-
23-
TEST_DIR = tests
24-
DUDECT_TEST_DIR = $(TEST_DIR)/dudect
21+
BUILD_DIR := build
22+
TEST_BUILD_DIR := $(BUILD_DIR)/test
23+
BENCHMARK_BUILD_DIR := $(BUILD_DIR)/benchmark
24+
ASAN_BUILD_DIR := $(BUILD_DIR)/asan
25+
DEBUG_ASAN_BUILD_DIR := $(ASAN_BUILD_DIR)/debug
26+
RELEASE_ASAN_BUILD_DIR := $(ASAN_BUILD_DIR)/release
27+
UBSAN_BUILD_DIR := $(BUILD_DIR)/ubsan
28+
DEBUG_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/debug
29+
RELEASE_UBSAN_BUILD_DIR := $(UBSAN_BUILD_DIR)/release
30+
31+
TEST_DIR := tests
2532
TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp)
2633
TEST_HEADERS := $(wildcard $(TEST_DIR)/*.hpp)
27-
DUDECT_TEST_SOURCES := $(wildcard $(DUDECT_TEST_DIR)/*.cpp)
28-
TEST_OBJECTS := $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
29-
ASAN_TEST_OBJECTS := $(addprefix $(ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
30-
UBSAN_TEST_OBJECTS := $(addprefix $(UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
31-
TEST_LINK_FLAGS = -lgtest -lgtest_main
32-
TEST_BINARY = $(BUILD_DIR)/test.out
33-
DUDECT_TEST_BINARIES := $(addprefix $(DUDECT_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.out,$(DUDECT_TEST_SOURCES))))
34-
ASAN_TEST_BINARY = $(ASAN_BUILD_DIR)/test.out
35-
UBSAN_TEST_BINARY = $(UBSAN_BUILD_DIR)/test.out
36-
GTEST_PARALLEL = ./gtest-parallel/gtest-parallel
37-
38-
BENCHMARK_DIR = benchmarks
34+
TEST_OBJECTS := $(addprefix $(TEST_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
35+
TEST_BINARY := $(TEST_BUILD_DIR)/test.out
36+
TEST_LINK_FLAGS := -lgtest -lgtest_main
37+
GTEST_PARALLEL := ./gtest-parallel/gtest-parallel
38+
DEBUG_ASAN_TEST_OBJECTS := $(addprefix $(DEBUG_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
39+
RELEASE_ASAN_TEST_OBJECTS := $(addprefix $(RELEASE_ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
40+
DEBUG_ASAN_TEST_BINARY := $(DEBUG_ASAN_BUILD_DIR)/test.out
41+
RELEASE_ASAN_TEST_BINARY := $(RELEASE_ASAN_BUILD_DIR)/test.out
42+
DEBUG_UBSAN_TEST_OBJECTS := $(addprefix $(DEBUG_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
43+
RELEASE_UBSAN_TEST_OBJECTS := $(addprefix $(RELEASE_UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
44+
DEBUG_UBSAN_TEST_BINARY := $(DEBUG_UBSAN_BUILD_DIR)/test.out
45+
RELEASE_UBSAN_TEST_BINARY := $(RELEASE_UBSAN_BUILD_DIR)/test.out
46+
47+
BENCHMARK_DIR := benchmarks
3948
BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp)
4049
BENCHMARK_HEADERS := $(wildcard $(BENCHMARK_DIR)/*.hpp)
41-
BENCHMARK_OBJECTS := $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES))))
42-
BENCHMARK_LINK_FLAGS = -lbenchmark -lbenchmark_main -lpthread
43-
BENCHMARK_BINARY = $(BUILD_DIR)/bench.out
44-
PERF_LINK_FLAGS = -lbenchmark -lbenchmark_main -lpfm -lpthread
45-
PERF_BINARY = $(BUILD_DIR)/perf.out
50+
BENCHMARK_OBJECTS := $(addprefix $(BENCHMARK_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES))))
51+
BENCHMARK_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpthread
52+
BENCHMARK_BINARY := $(BENCHMARK_BUILD_DIR)/bench.out
53+
PERF_LINK_FLAGS := -lbenchmark -lbenchmark_main -lpfm -lpthread
54+
PERF_BINARY := $(BENCHMARK_BUILD_DIR)/perf.out
55+
BENCHMARK_OUT_FILE := bench_result_on_$(shell uname -s)_$(shell uname -r)_$(shell uname -m)_with_$(CXX)_$(shell $(CXX) -dumpversion).json
4656

4757
all: test
4858

49-
$(DUDECT_BUILD_DIR):
59+
$(DEBUG_ASAN_BUILD_DIR):
5060
mkdir -p $@
5161

52-
$(ASAN_BUILD_DIR):
62+
$(RELEASE_ASAN_BUILD_DIR):
5363
mkdir -p $@
5464

55-
$(UBSAN_BUILD_DIR):
65+
$(DEBUG_UBSAN_BUILD_DIR):
5666
mkdir -p $@
5767

58-
$(BUILD_DIR):
68+
$(RELEASE_UBSAN_BUILD_DIR):
5969
mkdir -p $@
6070

61-
$(SHA3_INC_DIR):
62-
git submodule update --init sha3
71+
$(TEST_BUILD_DIR):
72+
mkdir -p $@
6373

64-
$(DUDECT_INC_DIR): $(SHA3_INC_DIR)
65-
git submodule update --init dudect
74+
$(BENCHMARK_BUILD_DIR):
75+
mkdir -p $@
6676

67-
$(SUBTLE_INC_DIR): $(DUDECT_INC_DIR)
77+
$(SUBTLE_INC_DIR):
6878
git submodule update --init subtle
6979

70-
$(GTEST_PARALLEL): $(SUBTLE_INC_DIR)
80+
$(SHA3_INC_DIR): $(SUBTLE_INC_DIR)
81+
git submodule update --init sha3
82+
83+
$(GTEST_PARALLEL): $(SHA3_INC_DIR)
7184
git submodule update --init gtest-parallel
7285

73-
$(BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR)
74-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
86+
$(TEST_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(TEST_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR)
87+
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
7588

76-
$(ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(ASAN_BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR)
77-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(ASAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
89+
$(DEBUG_ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(DEBUG_ASAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR)
90+
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(DEBUG_ASAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
7891

79-
$(UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(UBSAN_BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR)
80-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(UBSAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
92+
$(RELEASE_ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(RELEASE_ASAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR)
93+
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_ASAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
94+
95+
$(DEBUG_UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(DEBUG_UBSAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR)
96+
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(DEBUG_UBSAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
97+
98+
$(RELEASE_UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(RELEASE_UBSAN_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR)
99+
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_UBSAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
81100

82101
$(TEST_BINARY): $(TEST_OBJECTS)
83-
$(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
102+
$(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
103+
104+
$(DEBUG_ASAN_TEST_BINARY): $(DEBUG_ASAN_TEST_OBJECTS)
105+
$(CXX) $(DEBUG_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
84106

85-
$(DUDECT_BUILD_DIR)/%.out: $(DUDECT_TEST_DIR)/%.cpp $(DUDECT_BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR) $(DUDECT_INC_DIR)
86-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) $(DUDECT_DEP_IFLAGS) -lm $(LINK_FLAGS) $< -o $@
107+
$(RELEASE_ASAN_TEST_BINARY): $(RELEASE_ASAN_TEST_OBJECTS)
108+
$(CXX) $(RELEASE_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
87109

88-
$(ASAN_TEST_BINARY): $(ASAN_TEST_OBJECTS)
89-
$(CXX) $(ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
110+
$(DEBUG_UBSAN_TEST_BINARY): $(DEBUG_UBSAN_TEST_OBJECTS)
111+
$(CXX) $(DEBUG_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
90112

91-
$(UBSAN_TEST_BINARY): $(UBSAN_TEST_OBJECTS)
92-
$(CXX) $(UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
113+
$(RELEASE_UBSAN_TEST_BINARY): $(RELEASE_UBSAN_TEST_OBJECTS)
114+
$(CXX) $(RELEASE_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
93115

94116
test: $(TEST_BINARY) $(GTEST_PARALLEL)
95117
$(GTEST_PARALLEL) $< --print_test_times
96118

97-
dudect_test_build: $(DUDECT_TEST_BINARIES)
119+
debug_asan_test: $(DEBUG_ASAN_TEST_BINARY) $(GTEST_PARALLEL)
120+
$(GTEST_PARALLEL) $< --print_test_times
121+
122+
release_asan_test: $(RELEASE_ASAN_TEST_BINARY) $(GTEST_PARALLEL)
123+
$(GTEST_PARALLEL) $< --print_test_times
98124

99-
asan_test: $(ASAN_TEST_BINARY) $(GTEST_PARALLEL)
125+
debug_ubsan_test: $(DEBUG_UBSAN_TEST_BINARY) $(GTEST_PARALLEL)
100126
$(GTEST_PARALLEL) $< --print_test_times
101127

102-
ubsan_test: $(UBSAN_TEST_BINARY) $(GTEST_PARALLEL)
128+
release_ubsan_test: $(RELEASE_UBSAN_TEST_BINARY) $(GTEST_PARALLEL)
103129
$(GTEST_PARALLEL) $< --print_test_times
104130

105-
$(BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR)
106-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
131+
$(BENCHMARK_BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BENCHMARK_BUILD_DIR) $(SHA3_INC_DIR) $(ASCON_INC_DIR) $(SUBTLE_INC_DIR)
132+
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(RELEASE_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
107133

108134
$(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS)
109-
$(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@
135+
$(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@
110136

111137
benchmark: $(BENCHMARK_BINARY)
112138
# Must *not* build google-benchmark with libPFM
113139
./$< --benchmark_time_unit=us --benchmark_min_warmup_time=.5 --benchmark_enable_random_interleaving=true --benchmark_repetitions=10 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_counters_tabular=true
114140

115141
$(PERF_BINARY): $(BENCHMARK_OBJECTS)
116-
$(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@
142+
$(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@
117143

118144
perf: $(PERF_BINARY)
119145
# Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7
@@ -124,5 +150,5 @@ perf: $(PERF_BINARY)
124150
clean:
125151
rm -rf $(BUILD_DIR)
126152

127-
format: $(ML_KEM_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(DUDECT_TEST_SOURCES) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS)
153+
format: $(ML_KEM_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS)
128154
clang-format -i $^

0 commit comments

Comments
 (0)