Skip to content

Commit 9b3c37e

Browse files
willieyzmkannwischer
authored andcommitted
Backend unit tests: (mld_polyz_unpack/_c)
- Add test infrastructure in Makefile and scripts/tests - Update build rules in test/mk/ for component testing - Create test_unit.c and implement unit tests for mld_polyz_unpack and mld_polyz_unpack_c Signed-off-by: willieyz <willie.zhao@chelpis.com>
1 parent 2227d0b commit 9b3c37e

File tree

5 files changed

+285
-12
lines changed

5 files changed

+285
-12
lines changed

Makefile

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
# Copyright (c) The mldsa-native project authors
33
# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
44

5-
.PHONY: func kat acvp stack \
6-
func_44 kat_44 acvp_44 stack_44 \
7-
func_65 kat_65 acvp_65 stack_65 \
8-
func_87 kat_87 acvp_87 stack_87 \
9-
run_func run_kat run_acvp run_stack \
10-
run_func_44 run_kat_44 run_stack_44 \
11-
run_func_65 run_kat_65 run_stack_65 \
12-
run_func_87 run_kat_87 run_stack_87 \
5+
.PHONY: func kat acvp stack unit \
6+
func_44 kat_44 acvp_44 stack_44 unit_44 \
7+
func_65 kat_65 acvp_65 stack_65 unit_65 \
8+
func_87 kat_87 acvp_87 stack_87 unit_87 \
9+
run_func run_kat run_acvp run_stack run_unit \
10+
run_func_44 run_kat_44 run_stack_44 run_unit_44 \
11+
run_func_65 run_kat_65 run_stack_65 run_unit_65 \
12+
run_func_87 run_kat_87 run_stack_87 run_unit_87 \
1313
bench_44 bench_65 bench_87 bench \
1414
run_bench_44 run_bench_65 run_bench_87 run_bench \
1515
bench_components_44 bench_components_65 bench_components_87 bench_components \
@@ -49,7 +49,7 @@ quickcheck: test
4949
build: func kat acvp
5050
$(Q)echo " Everything builds fine!"
5151

52-
test: run_kat run_func run_acvp
52+
test: run_kat run_func run_acvp run_unit
5353
$(Q)echo " Everything checks fine!"
5454

5555
run_kat_44: kat_44
@@ -68,6 +68,14 @@ run_func_87: func_87
6868
$(W) $(MLDSA87_DIR)/bin/test_mldsa87
6969
run_func: run_func_44 run_func_65 run_func_87
7070

71+
run_unit_44: unit_44
72+
$(W) $(MLDSA44_DIR)/bin/test_unit44
73+
run_unit_65: unit_65
74+
$(W) $(MLDSA65_DIR)/bin/test_unit65
75+
run_unit_87: unit_87
76+
$(W) $(MLDSA87_DIR)/bin/test_unit87
77+
run_unit: run_unit_44 run_unit_65 run_unit_87
78+
7179
run_acvp: acvp
7280
EXEC_WRAPPER="$(EXEC_WRAPPER)" python3 ./test/acvp_client.py $(if $(ACVP_VERSION),--version $(ACVP_VERSION))
7381

@@ -79,6 +87,14 @@ func_87: $(MLDSA87_DIR)/bin/test_mldsa87
7987
$(Q)echo " FUNC ML-DSA-87: $^"
8088
func: func_44 func_65 func_87
8189

90+
unit_44: $(MLDSA44_DIR)/bin/test_unit44
91+
$(Q)echo " UNIT ML-DSA-44: $^"
92+
unit_65: $(MLDSA65_DIR)/bin/test_unit65
93+
$(Q)echo " UNIT ML-DSA-65: $^"
94+
unit_87: $(MLDSA87_DIR)/bin/test_unit87
95+
$(Q)echo " UNIT ML-DSA-87: $^"
96+
unit: unit_44 unit_65 unit_87
97+
8298
kat_44: $(MLDSA44_DIR)/bin/gen_KAT44
8399
$(Q)echo " KAT ML-DSA-44: $^"
84100
kat_65: $(MLDSA65_DIR)/bin/gen_KAT65

scripts/tests

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ class TEST_TYPES(Enum):
211211
CUSTOM_BACKEND = 16
212212
MULTILEVEL_BUILD = 17
213213
MULTILEVEL_BUILD_NATIVE = 18
214+
UNIT = 19
214215

215216
def is_benchmark(self):
216217
return self in [TEST_TYPES.BENCH, TEST_TYPES.BENCH_COMPONENTS]
@@ -283,6 +284,8 @@ class TEST_TYPES(Enum):
283284
return "Example (multilevel build)"
284285
if self == TEST_TYPES.MULTILEVEL_BUILD_NATIVE:
285286
return "Example (multilevel build, native)"
287+
if self == TEST_TYPES.UNIT:
288+
return "Unit Test"
286289

287290
def make_dir(self):
288291
if self == TEST_TYPES.BASIC:
@@ -346,6 +349,8 @@ class TEST_TYPES(Enum):
346349
return ""
347350
if self == TEST_TYPES.MULTILEVEL_BUILD_NATIVE:
348351
return ""
352+
if self == TEST_TYPES.UNIT:
353+
return "unit"
349354

350355
def make_run_target(self, scheme):
351356
t = self.make_target()
@@ -632,6 +637,19 @@ class Tests:
632637

633638
self.check_fail()
634639

640+
def unit(self):
641+
def _unit(opt):
642+
self._compile_schemes(TEST_TYPES.UNIT, opt)
643+
if self.args.run:
644+
self._run_schemes(TEST_TYPES.UNIT, opt)
645+
646+
if self.do_no_opt():
647+
_unit(False)
648+
if self.do_opt():
649+
_unit(True)
650+
651+
self.check_fail()
652+
635653
def acvp(self):
636654
def _acvp(opt):
637655
self._compile_schemes(TEST_TYPES.ACVP, opt)
@@ -765,6 +783,7 @@ class Tests:
765783
acvp = self.args.acvp
766784
examples = self.args.examples
767785
stack = self.args.stack
786+
unit = self.args.unit
768787

769788
def _all(opt):
770789
if func is True:
@@ -775,6 +794,8 @@ class Tests:
775794
self._compile_schemes(TEST_TYPES.ACVP, opt)
776795
if stack is True:
777796
self._compile_schemes(TEST_TYPES.STACK, opt)
797+
if unit is True:
798+
self._compile_schemes(TEST_TYPES.UNIT, opt)
778799

779800
if self.args.check_namespace is True:
780801
p = subprocess.run(
@@ -796,6 +817,8 @@ class Tests:
796817
self._run_scheme(TEST_TYPES.ACVP, opt, None)
797818
if stack is True:
798819
self._run_schemes(TEST_TYPES.STACK, opt, suppress_output=False)
820+
if unit is True:
821+
self._run_schemes(TEST_TYPES.UNIT, opt)
799822

800823
if self.do_no_opt():
801824
_all(False)
@@ -1104,6 +1127,14 @@ def cli():
11041127
"--no-acvp", action="store_false", dest="acvp", help="Do not run acvp test"
11051128
)
11061129

1130+
unit_group = all_parser.add_mutually_exclusive_group()
1131+
unit_group.add_argument(
1132+
"--unit", action="store_true", dest="unit", help="Run unit test", default=True
1133+
)
1134+
unit_group.add_argument(
1135+
"--no-unit", action="store_false", dest="unit", help="Do not run unit test"
1136+
)
1137+
11071138
examples_group = all_parser.add_mutually_exclusive_group()
11081139
examples_group.add_argument(
11091140
"--examples",
@@ -1333,6 +1364,13 @@ def cli():
13331364
"kat", help="Run the kat tests for all parameter sets", parents=[common_parser]
13341365
)
13351366

1367+
# unit arguments
1368+
unit_parser = cmd_subparsers.add_parser(
1369+
"unit",
1370+
help="Run the unit tests for all parameter sets",
1371+
parents=[common_parser],
1372+
)
1373+
13361374
# stack arguments
13371375
stack_parser = cmd_subparsers.add_parser(
13381376
"stack",
@@ -1377,6 +1415,8 @@ def cli():
13771415
Tests(args).func()
13781416
elif args.cmd == "kat":
13791417
Tests(args).kat()
1418+
elif args.cmd == "unit":
1419+
Tests(args).unit()
13801420
elif args.cmd == "stack":
13811421
Tests(args).stack()
13821422
elif args.cmd == "size":

test/mk/components.mk

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ ifeq ($(OPT),1)
1414
CFLAGS += -DMLD_CONFIG_USE_NATIVE_BACKEND_ARITH -DMLD_CONFIG_USE_NATIVE_BACKEND_FIPS202
1515
endif
1616

17-
ALL_TESTS = test_mldsa acvp_mldsa bench_mldsa bench_components_mldsa gen_KAT test_stack
17+
ALL_TESTS = test_mldsa test_unit acvp_mldsa bench_mldsa bench_components_mldsa gen_KAT test_stack
1818

1919
MLDSA44_DIR = $(BUILD_DIR)/mldsa44
2020
MLDSA65_DIR = $(BUILD_DIR)/mldsa65
@@ -27,13 +27,26 @@ $(MLDSA65_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65
2727
MLDSA87_OBJS = $(call MAKE_OBJS,$(MLDSA87_DIR),$(SOURCES) $(FIPS202_SRCS))
2828
$(MLDSA87_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87
2929

30+
# Unit test object files - same sources but with MLD_STATIC_TESTABLE=
31+
MLDSA44_UNIT_OBJS = $(call MAKE_OBJS,$(MLDSA44_DIR)/unit,$(SOURCES) $(FIPS202_SRCS))
32+
$(MLDSA44_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
33+
MLDSA65_UNIT_OBJS = $(call MAKE_OBJS,$(MLDSA65_DIR)/unit,$(SOURCES) $(FIPS202_SRCS))
34+
$(MLDSA65_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
35+
MLDSA87_UNIT_OBJS = $(call MAKE_OBJS,$(MLDSA87_DIR)/unit,$(SOURCES) $(FIPS202_SRCS))
36+
$(MLDSA87_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
3037

3138
CFLAGS += -Imldsa
3239

3340
$(BUILD_DIR)/libmldsa44.a: $(MLDSA44_OBJS)
3441
$(BUILD_DIR)/libmldsa65.a: $(MLDSA65_OBJS)
3542
$(BUILD_DIR)/libmldsa87.a: $(MLDSA87_OBJS)
3643

44+
# Unit libraries with exposed internal functions
45+
$(BUILD_DIR)/libmldsa44_unit.a: $(MLDSA44_UNIT_OBJS)
46+
$(BUILD_DIR)/libmldsa65_unit.a: $(MLDSA65_UNIT_OBJS)
47+
$(BUILD_DIR)/libmldsa87_unit.a: $(MLDSA87_UNIT_OBJS)
48+
49+
3750
$(BUILD_DIR)/libmldsa.a: $(MLDSA44_OBJS) $(MLDSA65_OBJS) $(MLDSA87_OBJS)
3851

3952
$(MLDSA44_DIR)/bin/bench_mldsa44: CFLAGS += -Itest/hal
@@ -47,6 +60,16 @@ $(MLDSA44_DIR)/bin/test_stack44: CFLAGS += -Imldsa -fstack-usage
4760
$(MLDSA65_DIR)/bin/test_stack65: CFLAGS += -Imldsa -fstack-usage
4861
$(MLDSA87_DIR)/bin/test_stack87: CFLAGS += -Imldsa -fstack-usage
4962

63+
$(MLDSA44_DIR)/bin/test_unit44: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
64+
$(MLDSA65_DIR)/bin/test_unit65: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
65+
$(MLDSA87_DIR)/bin/test_unit87: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
66+
67+
# Unit library object files compiled with MLD_STATIC_TESTABLE=
68+
$(MLDSA44_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
69+
$(MLDSA65_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
70+
$(MLDSA87_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
71+
72+
5073
$(MLDSA44_DIR)/bin/bench_mldsa44: $(MLDSA44_DIR)/test/hal/hal.c.o
5174
$(MLDSA65_DIR)/bin/bench_mldsa65: $(MLDSA65_DIR)/test/hal/hal.c.o
5275
$(MLDSA87_DIR)/bin/bench_mldsa87: $(MLDSA87_DIR)/test/hal/hal.c.o
@@ -58,18 +81,30 @@ $(MLDSA44_DIR)/bin/%: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44
5881
$(MLDSA65_DIR)/bin/%: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65
5982
$(MLDSA87_DIR)/bin/%: CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87
6083

61-
# Link tests with respective library
84+
# Link tests with respective library (except test_unit which includes sources directly)
6285
define ADD_SOURCE
6386
$(BUILD_DIR)/$(1)/bin/$(2)$(shell echo $(1) | tr -d -c 0-9): LDLIBS += -L$(BUILD_DIR) -l$(1)
6487
$(BUILD_DIR)/$(1)/bin/$(2)$(shell echo $(1) | tr -d -c 0-9): $(BUILD_DIR)/$(1)/test/$(2).c.o $(BUILD_DIR)/lib$(1).a
6588
endef
6689

90+
91+
# Special rule for test_unit - link against unit libraries with exposed internal functions
92+
define ADD_SOURCE_UNIT
93+
$(BUILD_DIR)/$(1)/bin/test_unit$(shell echo $(1) | tr -d -c 0-9): LDLIBS += -L$(BUILD_DIR) -l$(1)_unit
94+
$(BUILD_DIR)/$(1)/bin/test_unit$(shell echo $(1) | tr -d -c 0-9): $(BUILD_DIR)/$(1)/test/test_unit.c.o $(BUILD_DIR)/lib$(1)_unit.a $(call MAKE_OBJS, $(BUILD_DIR)/$(1), $(wildcard test/notrandombytes/*.c))
95+
endef
96+
97+
6798
$(foreach scheme,mldsa44 mldsa65 mldsa87, \
68-
$(foreach test,$(ALL_TESTS), \
99+
$(foreach test,$(filter-out test_unit,$(ALL_TESTS)), \
69100
$(eval $(call ADD_SOURCE,$(scheme),$(test))) \
70101
) \
71102
)
72103

104+
$(foreach scheme,mldsa44 mldsa65 mldsa87, \
105+
$(eval $(call ADD_SOURCE_UNIT,$(scheme))) \
106+
)
107+
73108
$(ALL_TESTS:%=$(MLDSA44_DIR)/bin/%44): $(call MAKE_OBJS, $(MLDSA44_DIR), $(wildcard test/notrandombytes/*.c) $(EXTRA_SOURCES))
74109
$(ALL_TESTS:%=$(MLDSA65_DIR)/bin/%65): $(call MAKE_OBJS, $(MLDSA65_DIR), $(wildcard test/notrandombytes/*.c) $(EXTRA_SOURCES))
75110
$(ALL_TESTS:%=$(MLDSA87_DIR)/bin/%87): $(call MAKE_OBJS, $(MLDSA87_DIR), $(wildcard test/notrandombytes/*.c) $(EXTRA_SOURCES))

test/mk/rules.mk

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,34 @@ $(BUILD_DIR)/mldsa87/%.S.o: %.S $(CONFIG)
5252
$(Q)echo " AS $@"
5353
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
5454
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
55+
56+
57+
$(BUILD_DIR)/mldsa44/unit/%.c.o: %.c $(CONFIG)
58+
$(Q)echo " CC $@"
59+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
60+
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
61+
62+
$(BUILD_DIR)/mldsa44/unit/%.S.o: %.S $(CONFIG)
63+
$(Q)echo " AS $@"
64+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
65+
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
66+
67+
$(BUILD_DIR)/mldsa65/unit/%.c.o: %.c $(CONFIG)
68+
$(Q)echo " CC $@"
69+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
70+
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
71+
72+
$(BUILD_DIR)/mldsa65/unit/%.S.o: %.S $(CONFIG)
73+
$(Q)echo " AS $@"
74+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
75+
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
76+
77+
$(BUILD_DIR)/mldsa87/unit/%.c.o: %.c $(CONFIG)
78+
$(Q)echo " CC $@"
79+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
80+
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
81+
82+
$(BUILD_DIR)/mldsa87/unit/%.S.o: %.S $(CONFIG)
83+
$(Q)echo " AS $@"
84+
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
85+
$(Q)$(CC) -c -o $@ $(CFLAGS) $<

0 commit comments

Comments
 (0)