Skip to content

Commit 6138d02

Browse files
committed
SLH-DSA: add external interface testing and prehash testing
Convert self test to external interface testing. Signed-off-by: Stephan Mueller <smueller@chronox.de>
1 parent 65ac321 commit 6138d02

26 files changed

+60214
-19592
lines changed

TODO

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,3 @@
2626
- SHA2 Neon: check whether it works on ARMv7
2727

2828
- RISCV asm: check whether it works for RISCV32
29-
30-
- SLH-DSA: use external interface for self tests
31-
32-
- SLH-DSA: add tests for external interface / pre-hash

internal/api/visibility.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@
6767
#define LC_INTERFACE_FUNCTION(ret, symbol, param...) \
6868
DSO_PUBLIC ret symbol(param)
6969

70-
#define LC_INIT_FUNCTION(ret, symbol, param...) \
71-
DSO_PUBLIC ret symbol(param)
70+
#define LC_INIT_FUNCTION(ret, symbol, param...) DSO_PUBLIC ret symbol(param)
7271

7372
#define LC_TEST_FUNC(ret, symbol, param...) ret symbol(param)
7473

internal/src/compare.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,20 @@ LC_INTERFACE_FUNCTION(int, lc_compare, const uint8_t *act, const uint8_t *exp,
5757
unsigned int i;
5858

5959
printf("Expected %s ", info);
60-
for (i = 0; i < len; i++)
60+
for (i = 0; i < len; i++) {
6161
printf("0x%.2x ", *(exp + i));
62+
if (!((i + 1) % 8))
63+
printf("\n");
64+
}
6265

6366
printf("\n");
6467

6568
printf("Actual %s ", info);
66-
for (i = 0; i < len; i++)
69+
for (i = 0; i < len; i++) {
6770
printf("0x%.2x ", *(act + i));
71+
if (!((i + 1) % 8))
72+
printf("\n");
73+
}
6874

6975
printf("\n");
7076

slh-dsa/src/sphincs_selftest.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,6 @@ static inline int _sphincs_selftest_siggen(void)
9494
LC_SPHINCS_CTX_ON_STACK(ctx);
9595
LC_DECLARE_MEM(ws, struct workspace, sizeof(uint64_t));
9696

97-
/*
98-
* The entire test data derived from the upstream reference
99-
* implementation covers the internal testing only.
100-
*/
101-
ctx->slh_dsa_internal = 1;
102-
10397
CKINT(lc_sphincs_sign_ctx(&ws->sig, ctx, tc->msg, sizeof(tc->msg),
10498
(struct lc_sphincs_sk *)tc->sk, NULL));
10599
lc_compare((uint8_t *)&ws->sig, tc->sig, sizeof(tc->sig), "SIG");
@@ -130,12 +124,6 @@ static inline int _sphincs_selftest_sigver(void)
130124
int ret;
131125
LC_SPHINCS_CTX_ON_STACK(ctx);
132126

133-
/*
134-
* The entire test data derived from the upstream reference
135-
* implementation covers the internal testing only.
136-
*/
137-
ctx->slh_dsa_internal = 1;
138-
139127
CKINT(lc_sphincs_verify_ctx((struct lc_sphincs_sig *)tc->sig, ctx,
140128
tc->msg, sizeof(tc->msg),
141129
(struct lc_sphincs_pk *)tc->pk));

slh-dsa/tests/meson.build

Lines changed: 159 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,127 @@ if get_option('sphincs_shake_256s').enabled()
6060
c_args : '-DLC_SPHINCS_TYPE_128F',
6161
link_with: leancrypto_static_lib
6262
)
63+
64+
sphincs_internal_tester_256s = executable('sphincs_internal_tester_256s',
65+
[ 'sphincs_internal_tester.c' ],
66+
include_directories: [
67+
include_dirs,
68+
include_internal_dirs,
69+
include_sphincs_internal
70+
],
71+
link_with: leancrypto_static_lib
72+
)
73+
sphincs_internal_tester_256f = executable('sphincs_internal_tester_256f',
74+
[ 'sphincs_internal_tester.c' ],
75+
include_directories: [
76+
include_dirs,
77+
include_internal_dirs,
78+
include_sphincs_internal
79+
],
80+
c_args : '-DLC_SPHINCS_TYPE_256F',
81+
link_with: leancrypto_static_lib
82+
)
83+
sphincs_internal_tester_192s = executable('sphincs_internal_tester_192s',
84+
[ 'sphincs_internal_tester.c' ],
85+
include_directories: [
86+
include_dirs,
87+
include_internal_dirs,
88+
include_sphincs_internal
89+
],
90+
c_args : '-DLC_SPHINCS_TYPE_192S',
91+
link_with: leancrypto_static_lib
92+
)
93+
sphincs_internal_tester_192f = executable('sphincs_internal_tester_192f',
94+
[ 'sphincs_internal_tester.c' ],
95+
include_directories: [
96+
include_dirs,
97+
include_internal_dirs,
98+
include_sphincs_internal
99+
],
100+
c_args : '-DLC_SPHINCS_TYPE_192F',
101+
link_with: leancrypto_static_lib
102+
)
103+
sphincs_internal_tester_128s = executable('sphincs_internal_tester_128s',
104+
[ 'sphincs_internal_tester.c' ],
105+
include_directories: [
106+
include_dirs,
107+
include_internal_dirs,
108+
include_sphincs_internal
109+
],
110+
c_args : '-DLC_SPHINCS_TYPE_128S',
111+
link_with: leancrypto_static_lib
112+
)
113+
sphincs_internal_tester_128f = executable('sphincs_internal_tester_128f',
114+
[ 'sphincs_internal_tester.c' ],
115+
include_directories: [
116+
include_dirs,
117+
include_internal_dirs,
118+
include_sphincs_internal
119+
],
120+
c_args : '-DLC_SPHINCS_TYPE_128F',
121+
link_with: leancrypto_static_lib
122+
)
123+
124+
sphincs_prehash_tester_256s = executable('sphincs_prehash_tester_256s',
125+
[ 'sphincs_prehash_tester.c' ],
126+
include_directories: [
127+
include_dirs,
128+
include_internal_dirs,
129+
include_sphincs_internal
130+
],
131+
link_with: leancrypto_static_lib
132+
)
133+
sphincs_prehash_tester_256f = executable('sphincs_prehash_tester_256f',
134+
[ 'sphincs_prehash_tester.c' ],
135+
include_directories: [
136+
include_dirs,
137+
include_internal_dirs,
138+
include_sphincs_internal
139+
],
140+
c_args : '-DLC_SPHINCS_TYPE_256F',
141+
link_with: leancrypto_static_lib
142+
)
143+
sphincs_prehash_tester_192s = executable('sphincs_prehash_tester_192s',
144+
[ 'sphincs_prehash_tester.c' ],
145+
include_directories: [
146+
include_dirs,
147+
include_internal_dirs,
148+
include_sphincs_internal
149+
],
150+
c_args : '-DLC_SPHINCS_TYPE_192S',
151+
link_with: leancrypto_static_lib
152+
)
153+
sphincs_prehash_tester_192f = executable('sphincs_prehash_tester_192f',
154+
[ 'sphincs_prehash_tester.c' ],
155+
include_directories: [
156+
include_dirs,
157+
include_internal_dirs,
158+
include_sphincs_internal
159+
],
160+
c_args : '-DLC_SPHINCS_TYPE_192F',
161+
link_with: leancrypto_static_lib
162+
)
163+
sphincs_prehash_tester_128s = executable('sphincs_prehash_tester_128s',
164+
[ 'sphincs_prehash_tester.c' ],
165+
include_directories: [
166+
include_dirs,
167+
include_internal_dirs,
168+
include_sphincs_internal
169+
],
170+
c_args : '-DLC_SPHINCS_TYPE_128S',
171+
link_with: leancrypto_static_lib
172+
)
173+
sphincs_prehash_tester_128f = executable('sphincs_prehash_tester_128f',
174+
[ 'sphincs_prehash_tester.c' ],
175+
include_directories: [
176+
include_dirs,
177+
include_internal_dirs,
178+
include_sphincs_internal
179+
],
180+
c_args : '-DLC_SPHINCS_TYPE_128F',
181+
link_with: leancrypto_static_lib
182+
)
183+
63184
sphincs_official_tester = executable('sphincs_official_tester',
64185
[ 'sphincs_official_tester.c' ],
65186
include_directories: [
@@ -77,12 +198,44 @@ if get_option('sphincs_shake_256s').enabled()
77198
dependencies: leancrypto
78199
)
79200

80-
test('Sphincs+ SHAKE 256s Accel', sphincs_tester_256s, timeout: 600, suite: regression)
81-
test('Sphincs+ SHAKE 256f Accel', sphincs_tester_256f, timeout: 600, suite: regression)
82-
test('Sphincs+ SHAKE 192s Accel', sphincs_tester_192s, timeout: 600, suite: regression)
83-
test('Sphincs+ SHAKE 192f Accel', sphincs_tester_192f, timeout: 600, suite: regression)
84-
test('Sphincs+ SHAKE 128s Accel', sphincs_tester_128s, timeout: 600, suite: regression)
85-
test('Sphincs+ SHAKE 128f Accel', sphincs_tester_128f, timeout: 600, suite: regression)
201+
test('Sphincs+ SHAKE 256s Accel', sphincs_tester_256s, timeout: 600,
202+
suite: regression)
203+
test('Sphincs+ SHAKE 256f Accel', sphincs_tester_256f, timeout: 600,
204+
suite: regression)
205+
test('Sphincs+ SHAKE 192s Accel', sphincs_tester_192s, timeout: 600,
206+
suite: regression)
207+
test('Sphincs+ SHAKE 192f Accel', sphincs_tester_192f, timeout: 600,
208+
suite: regression)
209+
test('Sphincs+ SHAKE 128s Accel', sphincs_tester_128s, timeout: 600,
210+
suite: regression)
211+
test('Sphincs+ SHAKE 128f Accel', sphincs_tester_128f, timeout: 600,
212+
suite: regression)
213+
214+
test('Sphincs+ SHAKE 256s internal Accel', sphincs_internal_tester_256s,
215+
timeout: 600, suite: regression)
216+
test('Sphincs+ SHAKE 256f internal Accel', sphincs_internal_tester_256f,
217+
timeout: 600, suite: regression)
218+
test('Sphincs+ SHAKE 192s internal Accel', sphincs_internal_tester_192s,
219+
timeout: 600, suite: regression)
220+
test('Sphincs+ SHAKE 192f internal Accel', sphincs_internal_tester_192f,
221+
timeout: 600, suite: regression)
222+
test('Sphincs+ SHAKE 128s internal Accel', sphincs_internal_tester_128s,
223+
timeout: 600, suite: regression)
224+
test('Sphincs+ SHAKE 128f internal Accel', sphincs_internal_tester_128f,
225+
timeout: 600, suite: regression)
226+
227+
test('Sphincs+ SHAKE 256s prehash Accel', sphincs_prehash_tester_256s,
228+
timeout: 600, suite: regression)
229+
test('Sphincs+ SHAKE 256f prehash Accel', sphincs_prehash_tester_256f,
230+
timeout: 600, suite: regression)
231+
test('Sphincs+ SHAKE 192s prehash Accel', sphincs_prehash_tester_192s,
232+
timeout: 600, suite: regression)
233+
test('Sphincs+ SHAKE 192f prehash Accel', sphincs_prehash_tester_192f,
234+
timeout: 600, suite: regression)
235+
test('Sphincs+ SHAKE 128s prehash Accel', sphincs_prehash_tester_128s,
236+
timeout: 600, suite: regression)
237+
test('Sphincs+ SHAKE 128f prehash Accel', sphincs_prehash_tester_128f,
238+
timeout: 600, suite: regression)
86239

87240
test('Sphincs+ SHAKE 256s Keygen 100 Accel', sphincs_tester_256s,
88241
args : [ 'k' ], timeout: 1000, is_parallel: false, suite: performance)

0 commit comments

Comments
 (0)