Skip to content

Commit 3a853f7

Browse files
committed
Unit-test: add consistency tests for mld_poly_uniform*_x1/x4
In mldsa-native, there are three functions that have both scalar and 4-way batched variants: - mld_poly_uniform_gamma1 / mld_poly_uniform_gamma1_4x - mld_poly_uniform_eta / mld_poly_uniform_eta_4x - mld_poly_uniform / mld_poly_uniform_4x For each of the above pairs, this PR implements consistency test functions in test_unit.c that compare the outputs of the scalar and 4-way batched variants. For mld_poly_uniform_eta and mld_poly_uniform_eta_4x, the two variants are not defined under the same compilation conditions in poly_kl.h. To enable testing both variants, this commit introduces a new macro: MLD_UNIT_TEST which is made available in test_unit.c to override the conditional compilation and allow both implementations to be exercised in the unit tests. Signed-off-by: willieyz <willie.zhao@chelpis.com>
1 parent b87337f commit 3a853f7

6 files changed

Lines changed: 140 additions & 17 deletions

File tree

mldsa/src/poly_kl.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ __contract__(
341341
return mld_rej_eta_c(a, target, offset, buf, buflen);
342342
}
343343

344-
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY)
344+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) || defined(MLD_UNIT_TEST)
345345
MLD_INTERNAL_API
346346
void mld_poly_uniform_eta_4x(mld_poly *r0, mld_poly *r1, mld_poly *r2,
347347
mld_poly *r3, const uint8_t seed[MLDSA_CRHBYTES],
@@ -425,7 +425,9 @@ void mld_poly_uniform_eta_4x(mld_poly *r0, mld_poly *r1, mld_poly *r2,
425425
mld_zeroize(buf, sizeof(buf));
426426
mld_zeroize(extseed, sizeof(extseed));
427427
}
428-
#else /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */
428+
#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY || MLD_UNIT_TEST */
429+
430+
#if defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) || defined(MLD_UNIT_TEST)
429431

430432
MLD_INTERNAL_API
431433
void mld_poly_uniform_eta(mld_poly *r, const uint8_t seed[MLDSA_CRHBYTES],
@@ -482,7 +484,7 @@ void mld_poly_uniform_eta(mld_poly *r, const uint8_t seed[MLDSA_CRHBYTES],
482484
mld_zeroize(buf, sizeof(buf));
483485
mld_zeroize(extseed, sizeof(extseed));
484486
}
485-
#endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY */
487+
#endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY || MLD_UNIT_TEST */
486488

487489
#define MLD_POLY_UNIFORM_GAMMA1_NBLOCKS \
488490
((MLDSA_POLYZ_PACKEDBYTES + MLD_STREAM256_BLOCKBYTES - 1) / \

mldsa/src/poly_kl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ __contract__(
9292
ensures(array_bound(b->coeffs, 0, MLDSA_N, 0, (MLDSA_Q-1)/(2*MLDSA_GAMMA2)))
9393
);
9494

95-
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY)
95+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) || defined(MLD_UNIT_TEST)
9696
#define mld_poly_uniform_eta_4x MLD_NAMESPACE_KL(poly_uniform_eta_4x)
9797
/*************************************************
9898
* Name: mld_poly_uniform_eta
@@ -132,9 +132,9 @@ __contract__(
132132
ensures(array_abs_bound(r2->coeffs, 0, MLDSA_N, MLDSA_ETA + 1))
133133
ensures(array_abs_bound(r3->coeffs, 0, MLDSA_N, MLDSA_ETA + 1))
134134
);
135-
#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY */
135+
#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY || MLD_UNIT_TEST */
136136

137-
#if defined(MLD_CONFIG_SERIAL_FIPS202_ONLY)
137+
#if defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) || defined(MLD_UNIT_TEST)
138138
#define mld_poly_uniform_eta MLD_NAMESPACE_KL(poly_uniform_eta)
139139
/*************************************************
140140
* Name: mld_poly_uniform_eta
@@ -157,7 +157,7 @@ __contract__(
157157
assigns(memory_slice(r, sizeof(mld_poly)))
158158
ensures(array_abs_bound(r->coeffs, 0, MLDSA_N, MLDSA_ETA + 1))
159159
);
160-
#endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY */
160+
#endif /* MLD_CONFIG_SERIAL_FIPS202_ONLY || MLD_UNIT_TEST */
161161

162162
#if MLD_CONFIG_PARAMETER_SET == 65 || defined(MLD_CONFIG_SERIAL_FIPS202_ONLY)
163163
#define mld_poly_uniform_gamma1 MLD_NAMESPACE_KL(poly_uniform_gamma1)

mldsa/src/symmetric.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "common.h"
1111

1212
#include MLD_FIPS202_HEADER_FILE
13-
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY)
13+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) || defined(MLD_UNIT_TEST)
1414
#include MLD_FIPS202X4_HEADER_FILE
1515
#endif
1616

scripts/autogen

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1786,6 +1786,7 @@ def get_config_options():
17861786
"MLD_CONFIG_XXX",
17871787
"MLD_CONFIG_API_CONSTANTS_ONLY",
17881788
"MLD_PREHASH_",
1789+
"MLD_UNIT_TEST",
17891790
]
17901791

17911792
return configs

test/mk/components.mk

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ $(MLDSA87_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87
3535

3636
# Unit test object files - same sources but with MLD_STATIC_TESTABLE=
3737
MLDSA44_UNIT_OBJS = $(call MAKE_OBJS,$(MLDSA44_DIR)/unit,$(SOURCES) $(FIPS202_SRCS))
38-
$(MLDSA44_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
38+
$(MLDSA44_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=44 -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
3939
MLDSA65_UNIT_OBJS = $(call MAKE_OBJS,$(MLDSA65_DIR)/unit,$(SOURCES) $(FIPS202_SRCS))
40-
$(MLDSA65_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
40+
$(MLDSA65_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=65 -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
4141
MLDSA87_UNIT_OBJS = $(call MAKE_OBJS,$(MLDSA87_DIR)/unit,$(SOURCES) $(FIPS202_SRCS))
42-
$(MLDSA87_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
42+
$(MLDSA87_UNIT_OBJS): CFLAGS += -DMLD_CONFIG_PARAMETER_SET=87 -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
4343

4444
# Alloc test object files - same sources but with custom alloc config
4545
MLDSA44_ALLOC_OBJS = $(call MAKE_OBJS,$(MLDSA44_DIR)/alloc,$(SOURCES) $(FIPS202_SRCS))
@@ -100,14 +100,14 @@ $(MLDSA44_DIR)/test/src/test_rng_fail.c.o: CFLAGS += -DMLD_CONFIG_FILE=\"../test
100100
$(MLDSA65_DIR)/test/src/test_rng_fail.c.o: CFLAGS += -DMLD_CONFIG_FILE=\"../test/configs/test_rng_fail_config.h\"
101101
$(MLDSA87_DIR)/test/src/test_rng_fail.c.o: CFLAGS += -DMLD_CONFIG_FILE=\"../test/configs/test_rng_fail_config.h\"
102102

103-
$(MLDSA44_DIR)/bin/test_unit44: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
104-
$(MLDSA65_DIR)/bin/test_unit65: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
105-
$(MLDSA87_DIR)/bin/test_unit87: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
103+
$(MLDSA44_DIR)/bin/test_unit44: CFLAGS += -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
104+
$(MLDSA65_DIR)/bin/test_unit65: CFLAGS += -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
105+
$(MLDSA87_DIR)/bin/test_unit87: CFLAGS += -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
106106

107107
# Unit library object files compiled with MLD_STATIC_TESTABLE=
108-
$(MLDSA44_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
109-
$(MLDSA65_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
110-
$(MLDSA87_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -Wno-missing-prototypes
108+
$(MLDSA44_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
109+
$(MLDSA65_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
110+
$(MLDSA87_DIR)/unit_%: CFLAGS += -DMLD_STATIC_TESTABLE= -DMLD_UNIT_TEST -Wno-missing-prototypes
111111

112112

113113
$(MLDSA44_DIR)/bin/bench_mldsa44: $(MLDSA44_DIR)/test/hal/hal.c.o

test/src/test_unit.c

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
#endif
2121
#endif /* !NUM_RANDOM_TESTS */
2222

23+
#ifndef NUM_RANDOM_TESTS_UNIFORM
24+
#ifdef MLDSA_DEBUG
25+
#define NUM_RANDOM_TESTS_UNIFORM 100
26+
#else
27+
#define NUM_RANDOM_TESTS_UNIFORM 1000
28+
#endif
29+
#endif /* !NUM_RANDOM_TESTS_UNIFORM */
30+
2331
#define CHECK(x) \
2432
do \
2533
{ \
@@ -581,6 +589,107 @@ static int test_backend_units(void)
581589
MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 || \
582590
MLD_USE_NATIVE_POLYZ_UNPACK_17 || MLD_USE_NATIVE_POLYZ_UNPACK_19 */
583591

592+
593+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) && MLD_CONFIG_PARAMETER_SET == 65
594+
static int test_poly_uniform_gamma1_consistency(void)
595+
{
596+
mld_poly r0_x4, r1_x4, r2_x4, r3_x4, r0_x1, r1_x1, r2_x1, r3_x1;
597+
uint8_t seed[MLDSA_CRHBYTES];
598+
uint16_t nonce0, nonce1, nonce2, nonce3;
599+
int i;
600+
for (i = 0; i < NUM_RANDOM_TESTS_UNIFORM; i++)
601+
{
602+
randombytes(seed, MLDSA_CRHBYTES);
603+
randombytes((uint8_t *)&nonce0, sizeof(uint16_t));
604+
nonce1 = nonce0 + 1;
605+
nonce2 = nonce0 + 2;
606+
nonce3 = nonce0 + 3;
607+
/* Call 4x version */
608+
mld_poly_uniform_gamma1_4x(&r0_x4, &r1_x4, &r2_x4, &r3_x4, seed, nonce0,
609+
nonce1, nonce2, nonce3);
610+
/* Call scalar version 4 times */
611+
mld_poly_uniform_gamma1(&r0_x1, seed, nonce0);
612+
mld_poly_uniform_gamma1(&r1_x1, seed, nonce1);
613+
mld_poly_uniform_gamma1(&r2_x1, seed, nonce2);
614+
mld_poly_uniform_gamma1(&r3_x1, seed, nonce3);
615+
616+
CHECK(memcmp(r0_x4.coeffs, r0_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
617+
CHECK(memcmp(r1_x4.coeffs, r1_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
618+
CHECK(memcmp(r2_x4.coeffs, r2_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
619+
CHECK(memcmp(r3_x4.coeffs, r3_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
620+
}
621+
return 0;
622+
}
623+
#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY && MLD_CONFIG_PARAMETER_SET == 65 */
624+
625+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) && !defined(MLD_CONFIG_REDUCE_RAM)
626+
static int test_poly_uniform_consistency(void)
627+
{
628+
mld_poly r0_x4, r1_x4, r2_x4, r3_x4, r0_x1, r1_x1, r2_x1, r3_x1;
629+
MLD_ALIGN uint8_t seed[4][MLD_ALIGN_UP(MLDSA_SEEDBYTES + 2)];
630+
int i, j;
631+
632+
for (i = 0; i < NUM_RANDOM_TESTS_UNIFORM; i++)
633+
{
634+
for (j = 0; j < 4; j++)
635+
{
636+
randombytes(seed[j], MLDSA_SEEDBYTES + 2);
637+
}
638+
639+
/* Call 4x version */
640+
mld_poly_uniform_4x(&r0_x4, &r1_x4, &r2_x4, &r3_x4, seed);
641+
642+
/* Call scalar version 4 times */
643+
mld_poly_uniform(&r0_x1, seed[0]);
644+
mld_poly_uniform(&r1_x1, seed[1]);
645+
mld_poly_uniform(&r2_x1, seed[2]);
646+
mld_poly_uniform(&r3_x1, seed[3]);
647+
648+
CHECK(memcmp(r0_x4.coeffs, r0_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
649+
CHECK(memcmp(r1_x4.coeffs, r1_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
650+
CHECK(memcmp(r2_x4.coeffs, r2_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
651+
CHECK(memcmp(r3_x4.coeffs, r3_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
652+
}
653+
return 0;
654+
}
655+
#endif /* !MLD_CONFIG_SERIAL_FIPS202_ONLY && !MLD_CONFIG_REDUCE_RAM */
656+
657+
#if defined(MLD_UNIT_TEST)
658+
static int test_poly_uniform_eta_consistency(void)
659+
{
660+
mld_poly r0_x4, r1_x4, r2_x4, r3_x4, r0_x1, r1_x1, r2_x1, r3_x1;
661+
uint8_t seed[MLDSA_CRHBYTES];
662+
uint8_t nonce0, nonce1, nonce2, nonce3;
663+
int i;
664+
665+
for (i = 0; i < NUM_RANDOM_TESTS_UNIFORM; i++)
666+
{
667+
randombytes(seed, MLDSA_CRHBYTES);
668+
randombytes(&nonce0, sizeof(uint8_t));
669+
nonce1 = (uint8_t)(nonce0 + 1);
670+
nonce2 = (uint8_t)(nonce0 + 2);
671+
nonce3 = (uint8_t)(nonce0 + 3);
672+
673+
/* Call 4x version */
674+
mld_poly_uniform_eta_4x(&r0_x4, &r1_x4, &r2_x4, &r3_x4, seed, nonce0,
675+
nonce1, nonce2, nonce3);
676+
677+
/* Call scalar version 4 times */
678+
mld_poly_uniform_eta(&r0_x1, seed, nonce0);
679+
mld_poly_uniform_eta(&r1_x1, seed, nonce1);
680+
mld_poly_uniform_eta(&r2_x1, seed, nonce2);
681+
mld_poly_uniform_eta(&r3_x1, seed, nonce3);
682+
683+
CHECK(memcmp(r0_x4.coeffs, r0_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
684+
CHECK(memcmp(r1_x4.coeffs, r1_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
685+
CHECK(memcmp(r2_x4.coeffs, r2_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
686+
CHECK(memcmp(r3_x4.coeffs, r3_x1.coeffs, MLDSA_N * sizeof(int32_t)) == 0);
687+
}
688+
return 0;
689+
}
690+
#endif /* MLD_UNIT_TEST */
691+
692+
584693
int main(void)
585694
{
586695
/* WARNING: Test-only
@@ -612,6 +721,17 @@ int main(void)
612721
MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 || \
613722
MLD_USE_NATIVE_POLYZ_UNPACK_17 || MLD_USE_NATIVE_POLYZ_UNPACK_19 */
614723

724+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) && MLD_CONFIG_PARAMETER_SET == 65
725+
CHECK(test_poly_uniform_gamma1_consistency() == 0);
726+
#endif
727+
728+
#if !defined(MLD_CONFIG_SERIAL_FIPS202_ONLY) && !defined(MLD_CONFIG_REDUCE_RAM)
729+
CHECK(test_poly_uniform_consistency() == 0);
730+
#endif
731+
732+
#if defined(MLD_UNIT_TEST)
733+
CHECK(test_poly_uniform_eta_consistency() == 0);
734+
#endif
615735

616736
return 0;
617737
}

0 commit comments

Comments
 (0)