Skip to content

Commit 61cf680

Browse files
authored
Merge pull request #53 from itzmeanjan/use-randomshake-as-csprng
Switch to using "RandomShake" as CSPRNG
2 parents b43b819 + 08d2b7b commit 61cf680

28 files changed

+3222
-533
lines changed

.github/workflows/test_ci.yml

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Test ML-KEM Key Encapsulation Mechanism (NIST FIPS 203)
1+
name: Test ML-KEM i.e. NIST FIPS 203
22

33
on:
44
push:
@@ -11,31 +11,53 @@ jobs:
1111
runs-on: ${{matrix.os}}
1212
strategy:
1313
matrix:
14-
os: [ubuntu-24.04, macos-latest]
14+
os: [ubuntu-latest, macos-latest]
1515
compiler: [g++, clang++]
16+
build_type: [debug, release]
17+
test_type: [standard, asan, ubsan]
18+
max-parallel: 4
1619

1720
steps:
18-
- uses: actions/checkout@v4
19-
- name: Setup Google-Test
20-
run: |
21-
pushd ~
22-
git clone https://github.com/google/googletest.git -b v1.15.0
23-
pushd googletest
24-
mkdir build
25-
pushd build
26-
cmake .. -DBUILD_GMOCK=OFF
27-
make
28-
sudo make install
29-
popd
30-
popd
31-
popd
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
21+
- uses: actions/checkout@v4
22+
23+
- name: Setup Google Test
24+
uses: Bacondish2023/setup-googletest@v1
25+
with:
26+
tag: v1.15.2
27+
28+
29+
- name: Build and Test (${{ matrix.compiler }}, ${{ matrix.build_type }}, ${{ matrix.test_type }})
30+
run: |
31+
CXX=${{ matrix.compiler }}
32+
if [[ ${{ matrix.test_type }} == "standard" ]]; then
33+
make test -j 2>&1 | tee build.log
34+
else
35+
make ${{ matrix.build_type }}_${{ matrix.test_type }}_test -j 2>&1 | tee build.log
36+
fi
37+
if [ $? -ne 0 ]; then
38+
echo "Build or Test Failed! See build.log for details."
39+
exit 1
40+
fi
41+
42+
- name: Upload Build Log
43+
uses: actions/upload-artifact@v3
44+
with:
45+
name: build-log-${{ matrix.compiler }}-${{ matrix.build_type }}-${{ matrix.test_type }}
46+
path: build.log
47+
48+
49+
- name: Run Examples
50+
if: ${{ matrix.test_type == 'standard' && matrix.build_type == 'release' }}
51+
run: |
52+
CXX=${{ matrix.compiler }} make example -j 2>&1 | tee example.log
53+
if [ $? -ne 0 ]; then
54+
echo "Example execution Failed! See example.log for details."
55+
exit 1
56+
fi
57+
58+
- name: Upload Example Log (if failed)
59+
if: ${{ steps.Run_Examples.outcome != 'success' && matrix.test_type == 'standard' && matrix.build_type == 'release' }}
60+
uses: actions/upload-artifact@v3
61+
with:
62+
name: example-log-${{ matrix.compiler }}
63+
path: example.log

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@
77
[submodule "gtest-parallel"]
88
path = gtest-parallel
99
url = https://github.com/google/gtest-parallel.git
10+
[submodule "RandomShake"]
11+
path = RandomShake
12+
url = https://github.com/itzmeanjan/RandomShake.git

Makefile

Lines changed: 24 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,154 +1,49 @@
1+
DEFAULT_GOAL := help
2+
3+
# Collects inspiration from https://github.com/itzmeanjan/RandomShake/blob/a9cd4085a4d38d7b99ee42caadc56fc2d64ec1dc/Makefile#L1-L9
4+
.PHONY: help
5+
help:
6+
@for file in $(MAKEFILE_LIST); do \
7+
grep -E '^[a-zA-Z_-]+:.*?## .*$$' $${file} | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}';\
8+
done
9+
110
CXX ?= clang++
211
CXX_FLAGS := -std=c++20
312
WARN_FLAGS := -Wall -Wextra -Wpedantic
413
DEBUG_FLAGS := -O1 -g
514
RELEASE_FLAGS := -O3 -march=native
615
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)
1316

1417
I_FLAGS := -I ./include
15-
SHA3_INC_DIR = ./sha3/include
16-
SUBTLE_INC_DIR = ./subtle/include
17-
DEP_IFLAGS = -I $(SHA3_INC_DIR) -I $(SUBTLE_INC_DIR)
18+
SHA3_INC_DIR := ./sha3/include
19+
SUBTLE_INC_DIR := ./subtle/include
20+
RANDOMSHAKE_INC_DIR := ./RandomShake/include
21+
DEP_IFLAGS := -I $(SHA3_INC_DIR) -I $(SUBTLE_INC_DIR) -I $(RANDOMSHAKE_INC_DIR)
1822

1923
SRC_DIR := include
2024
ML_KEM_SOURCES := $(shell find $(SRC_DIR) -name '*.hpp')
2125
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
32-
TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp)
33-
TEST_HEADERS := $(wildcard $(TEST_DIR)/*.hpp)
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
48-
BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp)
49-
BENCHMARK_HEADERS := $(wildcard $(BENCHMARK_DIR)/*.hpp)
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
56-
57-
all: test
58-
59-
$(DEBUG_ASAN_BUILD_DIR):
60-
mkdir -p $@
61-
62-
$(RELEASE_ASAN_BUILD_DIR):
63-
mkdir -p $@
64-
65-
$(DEBUG_UBSAN_BUILD_DIR):
66-
mkdir -p $@
6726

68-
$(RELEASE_UBSAN_BUILD_DIR):
69-
mkdir -p $@
70-
71-
$(TEST_BUILD_DIR):
72-
mkdir -p $@
73-
74-
$(BENCHMARK_BUILD_DIR):
75-
mkdir -p $@
27+
include tests/test.mk
28+
include benchmarks/bench.mk
29+
include examples/example.mk
7630

7731
$(SUBTLE_INC_DIR):
7832
git submodule update --init subtle
7933

80-
$(SHA3_INC_DIR): $(SUBTLE_INC_DIR)
34+
$(RANDOMSHAKE_INC_DIR): $(SUBTLE_INC_DIR)
35+
git submodule update --init --recursive RandomShake
36+
37+
$(SHA3_INC_DIR): $(RANDOMSHAKE_INC_DIR)
8138
git submodule update --init sha3
8239

8340
$(GTEST_PARALLEL): $(SHA3_INC_DIR)
8441
git submodule update --init gtest-parallel
8542

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 $@
88-
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 $@
91-
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 $@
100-
101-
$(TEST_BINARY): $(TEST_OBJECTS)
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 $@
106-
107-
$(RELEASE_ASAN_TEST_BINARY): $(RELEASE_ASAN_TEST_OBJECTS)
108-
$(CXX) $(RELEASE_ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
109-
110-
$(DEBUG_UBSAN_TEST_BINARY): $(DEBUG_UBSAN_TEST_OBJECTS)
111-
$(CXX) $(DEBUG_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
112-
113-
$(RELEASE_UBSAN_TEST_BINARY): $(RELEASE_UBSAN_TEST_OBJECTS)
114-
$(CXX) $(RELEASE_UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
115-
116-
test: $(TEST_BINARY) $(GTEST_PARALLEL)
117-
$(GTEST_PARALLEL) $< --print_test_times
118-
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
124-
125-
debug_ubsan_test: $(DEBUG_UBSAN_TEST_BINARY) $(GTEST_PARALLEL)
126-
$(GTEST_PARALLEL) $< --print_test_times
127-
128-
release_ubsan_test: $(RELEASE_UBSAN_TEST_BINARY) $(GTEST_PARALLEL)
129-
$(GTEST_PARALLEL) $< --print_test_times
130-
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 $@
133-
134-
$(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS)
135-
$(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@
136-
137-
benchmark: $(BENCHMARK_BINARY)
138-
# Must *not* build google-benchmark with libPFM
139-
./$< --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
140-
141-
$(PERF_BINARY): $(BENCHMARK_OBJECTS)
142-
$(CXX) $(RELEASE_FLAGS) $(LINK_OPT_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@
143-
144-
perf: $(PERF_BINARY)
145-
# Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7
146-
./$< --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 --benchmark_perf_counters=CYCLES
147-
148-
.PHONY: format clean
149-
150-
clean:
43+
.PHONY: clean
44+
clean: ## Remove build directory
15145
rm -rf $(BUILD_DIR)
15246

153-
format: $(ML_KEM_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS)
47+
.PHONY: format
48+
format: $(ML_KEM_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) ## Format source code
15449
clang-format -i $^

0 commit comments

Comments
 (0)