Skip to content

Commit c811439

Browse files
L-serieshanno-becker
authored andcommitted
testing: add rng failure test
Tests that crypto_kem_enc and crypto_kem_keypair, correctly return MLD_ERR_RNG_FAIL when randombytes() fails. We systematically inject failures at each invocation point. This test is based off the work from the test_alloc implementation. Signed-off-by: Andreas Hatziiliou <[email protected]>
1 parent 3a60108 commit c811439

File tree

6 files changed

+316
-10
lines changed

6 files changed

+316
-10
lines changed

Makefile

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

4-
.PHONY: func kat acvp stack alloc \
5-
func_512 kat_512 acvp_512 stack_512 alloc_512 \
6-
func_768 kat_768 acvp_768 stack_768 alloc_768 \
7-
func_1024 kat_1024 acvp_1024 stack_1024 alloc_1024 \
8-
run_func run_kat run_acvp run_stack run_alloc \
9-
run_func_512 run_kat_512 run_stack_512 run_alloc_512 \
10-
run_func_768 run_kat_768 run_stack_768 run_alloc_768 \
11-
run_func_1024 run_kat_1024 run_stack_1024 run_alloc_1024 \
4+
.PHONY: func kat acvp stack alloc rng_fail \
5+
func_512 kat_512 acvp_512 stack_512 alloc_512 rng_fail_512 \
6+
func_768 kat_768 acvp_768 stack_768 alloc_768 rng_fail_768 \
7+
func_1024 kat_1024 acvp_1024 stack_1024 alloc_1024 rng_fail_1024 \
8+
run_func run_kat run_acvp run_stack run_alloc run_rng_fail \
9+
run_func_512 run_kat_512 run_stack_512 run_alloc_512 run_rng_fail_512 \
10+
run_func_768 run_kat_768 run_stack_768 run_alloc_768 run_rng_fail_768 \
11+
run_func_1024 run_kat_1024 run_stack_1024 run_alloc_1024 run_rng_fail_1024 \
1212
bench_512 bench_768 bench_1024 bench \
1313
run_bench_512 run_bench_768 run_bench_1024 run_bench \
1414
bench_components_512 bench_components_768 bench_components_1024 bench_components \
@@ -46,7 +46,7 @@ quickcheck: test
4646
build: func kat acvp
4747
$(Q)echo " Everything builds fine!"
4848

49-
test: run_kat run_func run_acvp run_unit run_alloc
49+
test: run_kat run_func run_acvp run_unit run_alloc run_rng_fail
5050
$(Q)echo " Everything checks fine!"
5151

5252
# Detect available SHA256 command
@@ -155,6 +155,22 @@ run_alloc_1024: alloc_1024
155155
$(W) $(MLKEM1024_DIR)/bin/test_alloc1024
156156
run_alloc: run_alloc_512 run_alloc_768 run_alloc_1024
157157

158+
rng_fail_512: $(MLKEM512_DIR)/bin/test_rng_fail512
159+
$(Q)echo " RNG_FAIL ML-KEM-512: $^"
160+
rng_fail_768: $(MLKEM768_DIR)/bin/test_rng_fail768
161+
$(Q)echo " RNG_FAIL ML-KEM-768: $^"
162+
rng_fail_1024: $(MLKEM1024_DIR)/bin/test_rng_fail1024
163+
$(Q)echo " RNG_FAIL ML-KEM-1024: $^"
164+
rng_fail: rng_fail_512 rng_fail_768 rng_fail_1024
165+
166+
run_rng_fail_512: rng_fail_512
167+
$(W) $(MLKEM512_DIR)/bin/test_rng_fail512
168+
run_rng_fail_768: rng_fail_768
169+
$(W) $(MLKEM768_DIR)/bin/test_rng_fail768
170+
run_rng_fail_1024: rng_fail_1024
171+
$(W) $(MLKEM1024_DIR)/bin/test_rng_fail1024
172+
run_rng_fail: run_rng_fail_512 run_rng_fail_768 run_rng_fail_1024
173+
158174
lib: $(BUILD_DIR)/libmlkem.a $(BUILD_DIR)/libmlkem512.a $(BUILD_DIR)/libmlkem768.a $(BUILD_DIR)/libmlkem1024.a
159175

160176
# Enforce setting CYCLES make variable when

scripts/tests

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ class TEST_TYPES(Enum):
212212
BASIC_DETERMINISTIC = 18
213213
UNIT = 19
214214
ALLOC = 20
215+
RNG_FAIL = 21
215216

216217
def is_benchmark(self):
217218
return self in [TEST_TYPES.BENCH, TEST_TYPES.BENCH_COMPONENTS]
@@ -288,6 +289,8 @@ class TEST_TYPES(Enum):
288289
return "Unit Test"
289290
if self == TEST_TYPES.ALLOC:
290291
return "Alloc Test"
292+
if self == TEST_TYPES.RNG_FAIL:
293+
return "RNG Failure Test"
291294

292295
def make_dir(self):
293296
if self == TEST_TYPES.BRING_YOUR_OWN_FIPS202:
@@ -355,6 +358,8 @@ class TEST_TYPES(Enum):
355358
return "unit"
356359
if self == TEST_TYPES.ALLOC:
357360
return "alloc"
361+
if self == TEST_TYPES.RNG_FAIL:
362+
return "rng_fail"
358363

359364
def make_run_target(self, scheme):
360365
t = self.make_target()
@@ -667,6 +672,19 @@ class Tests:
667672

668673
self.check_fail()
669674

675+
def rng_fail(self):
676+
def _rng_fail(opt):
677+
self._compile_schemes(TEST_TYPES.RNG_FAIL, opt)
678+
if self.args.run:
679+
self._run_schemes(TEST_TYPES.RNG_FAIL, opt)
680+
681+
if self.do_no_opt():
682+
_rng_fail(False)
683+
if self.do_opt():
684+
_rng_fail(True)
685+
686+
self.check_fail()
687+
670688
def acvp(self):
671689
def _acvp(opt):
672690
self._compile_schemes(TEST_TYPES.ACVP, opt)
@@ -802,6 +820,7 @@ class Tests:
802820
stack = self.args.stack
803821
unit = self.args.unit
804822
alloc = self.args.alloc
823+
rng_fail = self.args.rng_fail
805824

806825
def _all(opt):
807826
if func is True:
@@ -816,6 +835,8 @@ class Tests:
816835
self._compile_schemes(TEST_TYPES.UNIT, opt)
817836
if alloc is True:
818837
self._compile_schemes(TEST_TYPES.ALLOC, opt)
838+
if rng_fail is True:
839+
self._compile_schemes(TEST_TYPES.RNG_FAIL, opt)
819840

820841
if self.args.check_namespace is True:
821842
p = subprocess.run(
@@ -841,6 +862,8 @@ class Tests:
841862
self._run_schemes(TEST_TYPES.UNIT, opt)
842863
if alloc is True:
843864
self._run_schemes(TEST_TYPES.ALLOC, opt)
865+
if rng_fail is True:
866+
self._run_schemes(TEST_TYPES.RNG_FAIL, opt)
844867

845868
if self.do_no_opt():
846869
_all(False)
@@ -1232,6 +1255,21 @@ def cli():
12321255
help="Do not run alloc tests",
12331256
)
12341257

1258+
rng_fail_group = all_parser.add_mutually_exclusive_group()
1259+
rng_fail_group.add_argument(
1260+
"--rng-fail",
1261+
action="store_true",
1262+
dest="rng_fail",
1263+
help="Run RNG failure tests",
1264+
default=True,
1265+
)
1266+
rng_fail_group.add_argument(
1267+
"--no-rng-fail",
1268+
action="store_false",
1269+
dest="rng_fail",
1270+
help="Do not run RNG failure tests",
1271+
)
1272+
12351273
# acvp arguments
12361274
acvp_parser = cmd_subparsers.add_parser(
12371275
"acvp", help="Run ACVP client", parents=[common_parser]
@@ -1451,6 +1489,13 @@ def cli():
14511489
parents=[common_parser],
14521490
)
14531491

1492+
# rng_fail arguments
1493+
rng_fail_parser = cmd_subparsers.add_parser(
1494+
"rng_fail",
1495+
help="Run the RNG failure tests for all parameter sets",
1496+
parents=[common_parser],
1497+
)
1498+
14541499
args = main_parser.parse_args()
14551500

14561501
if not hasattr(args, "mac_taskpolicy"):
@@ -1484,6 +1529,8 @@ def cli():
14841529
Tests(args).size()
14851530
elif args.cmd == "alloc":
14861531
Tests(args).alloc()
1532+
elif args.cmd == "rng_fail":
1533+
Tests(args).rng_fail()
14871534

14881535

14891536
if __name__ == "__main__":

test/configs/configs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,3 +449,4 @@ configs:
449449
#endif /* !__ASSEMBLER__ */
450450
MLK_CONFIG_FILE:
451451
comment: "/* No need to set this -- we _are_ already in a custom config */"
452+

test/mk/components.mk

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ ACVP_TESTS = acvp_mlkem
1717
BENCH_TESTS = bench_mlkem bench_components_mlkem
1818
UNIT_TESTS = test_unit
1919
ALLOC_TESTS = test_alloc
20+
RNG_FAIL_TESTS = test_rng_fail
2021
ALL_TESTS = $(BASIC_TESTS) $(ACVP_TESTS) $(BENCH_TESTS) $(UNIT_TESTS) $(ALLOC_TESTS)
2122

2223
MLKEM512_DIR = $(BUILD_DIR)/mlkem512
@@ -46,7 +47,6 @@ $(MLKEM768_ALLOC_OBJS): CFLAGS += -DMLK_CONFIG_PARAMETER_SET=768 -DMLK_CONFIG_FI
4647
MLKEM1024_ALLOC_OBJS = $(call MAKE_OBJS,$(MLKEM1024_DIR)/alloc,$(SOURCES) $(FIPS202_SRCS))
4748
$(MLKEM1024_ALLOC_OBJS): CFLAGS += -DMLK_CONFIG_PARAMETER_SET=1024 -DMLK_CONFIG_FILE=\"../test/configs/test_alloc_config.h\"
4849

49-
5050
CFLAGS += -Imlkem
5151

5252
$(BUILD_DIR)/libmlkem512.a: $(MLKEM512_OBJS)
@@ -118,6 +118,12 @@ $(BUILD_DIR)/$(1)/bin/test_alloc$(subst mlkem,,$(1)): LDLIBS += -L$(BUILD_DIR) -
118118
$(BUILD_DIR)/$(1)/bin/test_alloc$(subst mlkem,,$(1)): $(BUILD_DIR)/$(1)/test/src/test_alloc.c.o $(BUILD_DIR)/lib$(1)_alloc.a $(call MAKE_OBJS, $(BUILD_DIR)/$(1), $(wildcard test/notrandombytes/*.c))
119119
endef
120120

121+
# Special rule for test_rng_fail - link against rng_fail libraries with custom randombytes config
122+
define ADD_SOURCE_RNG_FAIL
123+
$(BUILD_DIR)/$(1)/bin/test_rng_fail$(subst mlkem,,$(1)): LDLIBS += -L$(BUILD_DIR) -l$(1)
124+
$(BUILD_DIR)/$(1)/bin/test_rng_fail$(subst mlkem,,$(1)): $(BUILD_DIR)/$(1)/test/src/test_rng_fail.c.o $(BUILD_DIR)/lib$(1).a
125+
endef
126+
121127
$(foreach scheme,mlkem512 mlkem768 mlkem1024, \
122128
$(foreach test,$(ACVP_TESTS), \
123129
$(eval $(call ADD_SOURCE,$(scheme),$(test),acvp)) \
@@ -130,6 +136,7 @@ $(foreach scheme,mlkem512 mlkem768 mlkem1024, \
130136
) \
131137
$(eval $(call ADD_SOURCE_UNIT,$(scheme))) \
132138
$(eval $(call ADD_SOURCE_ALLOC,$(scheme))) \
139+
$(eval $(call ADD_SOURCE_RNG_FAIL,$(scheme))) \
133140
)
134141

135142
$(ALL_TESTS:%=$(MLKEM512_DIR)/bin/%512): $(call MAKE_OBJS, $(MLKEM512_DIR), $(wildcard test/notrandombytes/*.c) $(EXTRA_SOURCES))

test/mk/rules.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,4 @@ $(BUILD_DIR)/mlkem1024/alloc/%.S.o: %.S $(CONFIG)
111111
$(Q)echo " AS $@"
112112
$(Q)[ -d $(@D) ] || mkdir -p $(@D)
113113
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
114+

0 commit comments

Comments
 (0)