Skip to content

Commit eec746d

Browse files
authored
Merge pull request #30 from itzmeanjan/conform-to-nist-fips-204
Conform to NIST FIPS 204
2 parents 7496a16 + 3f24e74 commit eec746d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+5403
-2180
lines changed

.github/workflows/test_ci.yml

+47-20
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,52 @@ jobs:
1212
strategy:
1313
matrix:
1414
os: [ubuntu-latest, macos-latest]
15+
compiler: [g++, clang++]
16+
build_type: [debug, release]
17+
test_type: [standard, asan, ubsan]
18+
max-parallel: 4
1519

1620
steps:
17-
- uses: actions/checkout@v4
18-
- name: Setup Google-Test
19-
run: |
20-
pushd ~
21-
git clone https://github.com/google/googletest.git -b v1.14.0
22-
pushd googletest
23-
mkdir build
24-
pushd build
25-
cmake .. -DBUILD_GMOCK=OFF
26-
make -j
27-
sudo make install -j
28-
popd
29-
popd
30-
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
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

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
[submodule "gtest-parallel"]
55
path = gtest-parallel
66
url = https://github.com/google/gtest-parallel.git
7-
[submodule "dudect"]
8-
path = dudect
9-
url = https://github.com/oreparaz/dudect.git
7+
[submodule "RandomShake"]
8+
path = RandomShake
9+
url = https://github.com/itzmeanjan/RandomShake.git

Makefile

+31-110
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,45 @@
1-
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
1+
DEFAULT_GOAL := help
82

9-
SHA3_INC_DIR = ./sha3/include
10-
DUDECT_INC_DIR = ./dudect/src
11-
I_FLAGS = -I ./include
12-
DEP_IFLAGS = -I $(SHA3_INC_DIR)
13-
DUDECT_DEP_IFLAGS = $(DEP_IFLAGS) -I $(DUDECT_INC_DIR)
3+
# Collects inspiration from https://github.com/itzmeanjan/ml-kem/blob/61cf680b1c0e2590bd7b650c07cd477e90cab46d/Makefile#L1-L8
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
149

15-
SRC_DIR = include
10+
CXX ?= clang++
11+
CXX_FLAGS := -std=c++20
12+
WARN_FLAGS := -Wall -Wextra -Wpedantic
13+
DEBUG_FLAGS := -O1 -g
14+
RELEASE_FLAGS := -O3 -march=native
15+
LINK_OPT_FLAGS := -flto
16+
17+
I_FLAGS := -I ./include
18+
SHA3_INC_DIR := ./sha3/include
19+
RANDOMSHAKE_INC_DIR := ./RandomShake/include
20+
DEP_IFLAGS := -I $(SHA3_INC_DIR) -I $(RANDOMSHAKE_INC_DIR)
21+
22+
SRC_DIR := include
1623
ML_DSA_SOURCES := $(shell find $(SRC_DIR) -name '*.hpp')
17-
BUILD_DIR = build
18-
ASAN_BUILD_DIR = $(BUILD_DIR)/asan
19-
UBSAN_BUILD_DIR = $(BUILD_DIR)/ubsan
20-
DUDECT_BUILD_DIR = $(BUILD_DIR)/dudect
21-
22-
TEST_DIR = tests
23-
DUDECT_TEST_DIR = $(TEST_DIR)/dudect
24-
TEST_SOURCES := $(wildcard $(TEST_DIR)/*.cpp)
25-
TEST_HEADERS := $(wildcard $(TEST_DIR)/*.hpp)
26-
TEST_OBJECTS := $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
27-
ASAN_TEST_OBJECTS := $(addprefix $(ASAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
28-
UBSAN_TEST_OBJECTS := $(addprefix $(UBSAN_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(TEST_SOURCES))))
29-
DUDECT_TEST_SOURCES := $(wildcard $(DUDECT_TEST_DIR)/*.cpp)
30-
DUDECT_TEST_BINARIES := $(addprefix $(DUDECT_BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.out,$(DUDECT_TEST_SOURCES))))
31-
TEST_LINK_FLAGS = -lgtest -lgtest_main
32-
TEST_BINARY = $(BUILD_DIR)/test.out
33-
ASAN_TEST_BINARY = $(ASAN_BUILD_DIR)/test.out
34-
UBSAN_TEST_BINARY = $(UBSAN_BUILD_DIR)/test.out
35-
GTEST_PARALLEL = ./gtest-parallel/gtest-parallel
36-
37-
BENCHMARK_DIR = benchmarks
38-
BENCHMARK_SOURCES := $(wildcard $(BENCHMARK_DIR)/*.cpp)
39-
BENCHMARK_HEADERS := $(wildcard $(BENCHMARK_DIR)/*.hpp)
40-
BENCHMARK_OBJECTS := $(addprefix $(BUILD_DIR)/, $(notdir $(patsubst %.cpp,%.o,$(BENCHMARK_SOURCES))))
41-
BENCHMARK_LINK_FLAGS = -lbenchmark -lbenchmark_main -lpthread
42-
BENCHMARK_BINARY = $(BUILD_DIR)/bench.out
43-
PERF_LINK_FLAGS = -lbenchmark -lbenchmark_main -lpfm -lpthread
44-
PERF_BINARY = $(BUILD_DIR)/perf.out
45-
46-
all: test
47-
48-
$(DUDECT_BUILD_DIR):
49-
mkdir -p $@
50-
51-
$(ASAN_BUILD_DIR):
52-
mkdir -p $@
24+
BUILD_DIR := build
5325

54-
$(UBSAN_BUILD_DIR):
55-
mkdir -p $@
26+
include tests/test.mk
27+
include benchmarks/bench.mk
28+
include examples/example.mk
5629

57-
$(BUILD_DIR):
58-
mkdir -p $@
30+
$(RANDOMSHAKE_INC_DIR):
31+
git submodule update --init --recursive RandomShake
5932

60-
$(SHA3_INC_DIR):
33+
$(SHA3_INC_DIR): $(RANDOMSHAKE_INC_DIR)
6134
git submodule update --init sha3
6235

6336
$(GTEST_PARALLEL): $(SHA3_INC_DIR)
6437
git submodule update --init gtest-parallel
6538

66-
$(DUDECT_INC_DIR): $(GTEST_PARALLEL)
67-
git submodule update --init dudect
68-
69-
$(BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(BUILD_DIR) $(SHA3_INC_DIR)
70-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
71-
72-
$(ASAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(ASAN_BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR)
73-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(ASAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
74-
75-
$(UBSAN_BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp $(UBSAN_BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR)
76-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(UBSAN_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
77-
78-
$(TEST_BINARY): $(TEST_OBJECTS)
79-
$(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
80-
81-
$(ASAN_TEST_BINARY): $(ASAN_TEST_OBJECTS)
82-
$(CXX) $(ASAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
83-
84-
$(UBSAN_TEST_BINARY): $(UBSAN_TEST_OBJECTS)
85-
$(CXX) $(UBSAN_FLAGS) $^ $(TEST_LINK_FLAGS) -o $@
86-
87-
$(DUDECT_BUILD_DIR)/%.out: $(DUDECT_TEST_DIR)/%.cpp $(DUDECT_BUILD_DIR) $(SHA3_INC_DIR) $(SUBTLE_INC_DIR) $(DUDECT_INC_DIR)
88-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) $(DUDECT_DEP_IFLAGS) -lm $(LINK_FLAGS) $< -o $@
89-
90-
test: $(TEST_BINARY) $(GTEST_PARALLEL)
91-
$(GTEST_PARALLEL) $< --print_test_times
92-
93-
asan_test: $(ASAN_TEST_BINARY) $(GTEST_PARALLEL)
94-
$(GTEST_PARALLEL) $< --print_test_times
95-
96-
ubsan_test: $(UBSAN_TEST_BINARY) $(GTEST_PARALLEL)
97-
$(GTEST_PARALLEL) $< --print_test_times
98-
99-
dudect_test_build: $(DUDECT_TEST_BINARIES)
100-
101-
$(BUILD_DIR)/%.o: $(BENCHMARK_DIR)/%.cpp $(BUILD_DIR) $(SHA3_INC_DIR)
102-
$(CXX) $(CXX_FLAGS) $(WARN_FLAGS) $(OPT_FLAGS) $(I_FLAGS) $(DEP_IFLAGS) -c $< -o $@
103-
104-
$(BENCHMARK_BINARY): $(BENCHMARK_OBJECTS)
105-
$(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(BENCHMARK_LINK_FLAGS) -o $@
106-
107-
benchmark: $(BENCHMARK_BINARY)
108-
# Must *not* build google-benchmark with libPFM
109-
./$< --benchmark_time_unit=us --benchmark_min_warmup_time=.5 --benchmark_enable_random_interleaving=true --benchmark_repetitions=32 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_counters_tabular=true
110-
111-
$(PERF_BINARY): $(BENCHMARK_OBJECTS)
112-
$(CXX) $(OPT_FLAGS) $(LINK_FLAGS) $^ $(PERF_LINK_FLAGS) -o $@
113-
114-
perf: $(PERF_BINARY)
115-
# Must build google-benchmark with libPFM, follow https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7
116-
./$< --benchmark_time_unit=us --benchmark_min_warmup_time=.5 --benchmark_enable_random_interleaving=true --benchmark_repetitions=32 --benchmark_min_time=0.1s --benchmark_display_aggregates_only=true --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES
117-
118-
.PHONY: format clean
119-
120-
clean:
39+
.PHONY: clean
40+
clean: ## Remove build directory
12141
rm -rf $(BUILD_DIR)
12242

123-
format: $(ML_DSA_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(DUDECT_TEST_SOURCES) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS)
43+
.PHONY: format
44+
format: $(ML_DSA_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) $(EXAMPLE_SOURCES) $(EXAMPLE_HEADERS) ## Format source code
12445
clang-format -i $^

0 commit comments

Comments
 (0)