Skip to content

Commit a60461f

Browse files
committed
Fix XMSS keygen param fallback
F/3306
1 parent afa9641 commit a60461f

3 files changed

Lines changed: 205 additions & 2 deletions

File tree

tools/keytools/keygen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ static void keygen_xmss(const char *priv_fname, uint32_t id_mask)
987987
exit(1);
988988
}
989989

990-
if (xmss_params != NULL)
990+
if (xmss_params == NULL)
991991
xmss_params = WOLFBOOT_XMSS_PARAMS;
992992

993993
ret = wc_XmssKey_SetParamStr(&key, xmss_params);

tools/unit-tests/Makefile

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ TESTS:=unit-parser unit-fdt unit-extflash unit-string unit-spi-flash unit-aes128
5555
unit-update-disk unit-multiboot unit-boot-x86-fsp unit-loader-tpm-init unit-qspi-flash unit-fwtpm-stub unit-tpm-rsa-exp \
5656
unit-image-nopart unit-image-sha384 unit-image-sha3-384 unit-store-sbrk \
5757
unit-tpm-blob unit-policy-create unit-policy-sign unit-rot-auth unit-sdhci-response-bits \
58-
unit-sdhci-disk-unaligned unit-sign-encrypted-output
58+
unit-sdhci-disk-unaligned unit-sign-encrypted-output \
59+
unit-keygen-xmss-params
5960
TESTS+=unit-tpm-check-rot-auth
6061
TESTS+=unit-tpm-api-names
6162

@@ -215,6 +216,13 @@ unit-sign-encrypted-output: ../../include/target.h unit-sign-encrypted-output.c
215216
-DWOLFBOOT_XMSS_PARAMS=\"XMSS-SHA2_10_256\" \
216217
-ffunction-sections -fdata-sections \
217218
$(LDFLAGS) -Wl,--gc-sections
219+
220+
unit-keygen-xmss-params: ../../include/target.h unit-keygen-xmss-params.c
221+
gcc -o $@ $^ -I../keytools $(CFLAGS) -DML_DSA_LEVEL=2 \
222+
-D"LMS_LEVELS=1" -D"LMS_HEIGHT=10" -D"LMS_WINTERNITZ=8" \
223+
-DWOLFBOOT_XMSS_PARAMS=\"XMSS-SHA2_10_256\" \
224+
-ffunction-sections -fdata-sections \
225+
$(LDFLAGS) -Wl,--gc-sections
218226
unit-rot-auth: ../../include/target.h unit-rot-auth.c \
219227
$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/memory.c
220228
gcc -o $@ $^ -I../tpm $(CFLAGS) -I$(WOLFBOOT_LIB_WOLFTPM) -DWOLFBOOT_TPM \
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
#include <check.h>
2+
#include <setjmp.h>
3+
#include <stddef.h>
4+
#include <stdlib.h>
5+
#include <string.h>
6+
7+
static const char *mock_xmss_param;
8+
static int mock_exit_code;
9+
static jmp_buf mock_exit_env;
10+
11+
static void mock_exit(int code);
12+
13+
#define main wolfboot_keygen_main
14+
#define exit mock_exit
15+
#define wc_XmssKey_Init mock_wc_XmssKey_Init
16+
#define wc_XmssKey_SetParamStr mock_wc_XmssKey_SetParamStr
17+
#define wc_XmssKey_SetWriteCb mock_wc_XmssKey_SetWriteCb
18+
#define wc_XmssKey_SetReadCb mock_wc_XmssKey_SetReadCb
19+
#define wc_XmssKey_SetContext mock_wc_XmssKey_SetContext
20+
#define wc_XmssKey_MakeKey mock_wc_XmssKey_MakeKey
21+
#define wc_XmssKey_GetPrivLen mock_wc_XmssKey_GetPrivLen
22+
#define wc_XmssKey_ExportPubRaw mock_wc_XmssKey_ExportPubRaw
23+
#define wc_XmssKey_Free mock_wc_XmssKey_Free
24+
#define wc_ForceZero mock_wc_ForceZero
25+
#include "../keytools/keygen.c"
26+
#undef wc_ForceZero
27+
#undef wc_XmssKey_Free
28+
#undef wc_XmssKey_ExportPubRaw
29+
#undef wc_XmssKey_GetPrivLen
30+
#undef wc_XmssKey_MakeKey
31+
#undef wc_XmssKey_SetContext
32+
#undef wc_XmssKey_SetReadCb
33+
#undef wc_XmssKey_SetWriteCb
34+
#undef wc_XmssKey_SetParamStr
35+
#undef wc_XmssKey_Init
36+
#undef exit
37+
#undef main
38+
39+
static void mock_exit(int code)
40+
{
41+
mock_exit_code = code;
42+
longjmp(mock_exit_env, 1);
43+
}
44+
45+
int mock_wc_XmssKey_Init(XmssKey *key, void *heap, int devId)
46+
{
47+
(void)key;
48+
(void)heap;
49+
(void)devId;
50+
51+
return 0;
52+
}
53+
54+
int mock_wc_XmssKey_SetParamStr(XmssKey *key, const char *str)
55+
{
56+
(void)key;
57+
mock_xmss_param = str;
58+
return 0;
59+
}
60+
61+
int mock_wc_XmssKey_SetWriteCb(XmssKey *key, wc_xmss_write_private_key_cb write_cb)
62+
{
63+
(void)key;
64+
(void)write_cb;
65+
66+
return -1;
67+
}
68+
69+
int mock_wc_XmssKey_SetReadCb(XmssKey *key, wc_xmss_read_private_key_cb read_cb)
70+
{
71+
(void)key;
72+
(void)read_cb;
73+
74+
return 0;
75+
}
76+
77+
int mock_wc_XmssKey_SetContext(XmssKey *key, void *context)
78+
{
79+
(void)key;
80+
(void)context;
81+
82+
return 0;
83+
}
84+
85+
int mock_wc_XmssKey_MakeKey(XmssKey *key, WC_RNG *rng)
86+
{
87+
(void)key;
88+
(void)rng;
89+
90+
return 0;
91+
}
92+
93+
int mock_wc_XmssKey_GetPrivLen(const XmssKey *key, word32 *len)
94+
{
95+
(void)key;
96+
*len = 0;
97+
return 0;
98+
}
99+
100+
int mock_wc_XmssKey_ExportPubRaw(const XmssKey *key, byte *out, word32 *outLen)
101+
{
102+
(void)key;
103+
(void)out;
104+
(void)outLen;
105+
106+
return 0;
107+
}
108+
109+
void mock_wc_XmssKey_Free(XmssKey *key)
110+
{
111+
(void)key;
112+
}
113+
114+
void mock_wc_ForceZero(void *mem, size_t len)
115+
{
116+
(void)mem;
117+
(void)len;
118+
}
119+
120+
static void setup(void)
121+
{
122+
mock_xmss_param = NULL;
123+
mock_exit_code = 0;
124+
unsetenv("XMSS_PARAMS");
125+
}
126+
127+
static void teardown(void)
128+
{
129+
unsetenv("XMSS_PARAMS");
130+
}
131+
132+
static void run_keygen_xmss(void)
133+
{
134+
int jumped;
135+
136+
jumped = setjmp(mock_exit_env);
137+
if (jumped == 0) {
138+
keygen_xmss("ignored.xmss", 0);
139+
}
140+
141+
ck_assert_int_eq(jumped, 1);
142+
ck_assert_int_eq(mock_exit_code, 1);
143+
}
144+
145+
START_TEST(test_keygen_xmss_uses_env_param_when_set)
146+
{
147+
const char *expected = "XMSSMT-SHA2_20/2_256";
148+
149+
ck_assert_int_eq(setenv("XMSS_PARAMS", expected, 1), 0);
150+
151+
run_keygen_xmss();
152+
153+
ck_assert_ptr_nonnull(mock_xmss_param);
154+
ck_assert_str_eq(mock_xmss_param, expected);
155+
}
156+
END_TEST
157+
158+
START_TEST(test_keygen_xmss_uses_default_param_when_env_unset)
159+
{
160+
run_keygen_xmss();
161+
162+
ck_assert_ptr_nonnull(mock_xmss_param);
163+
ck_assert_str_eq(mock_xmss_param, WOLFBOOT_XMSS_PARAMS);
164+
}
165+
END_TEST
166+
167+
static Suite *keygen_xmss_suite(void)
168+
{
169+
Suite *s;
170+
TCase *tc;
171+
172+
s = suite_create("keygen_xmss");
173+
tc = tcase_create("xmss_params");
174+
tcase_add_checked_fixture(tc, setup, teardown);
175+
tcase_add_test(tc, test_keygen_xmss_uses_env_param_when_set);
176+
tcase_add_test(tc, test_keygen_xmss_uses_default_param_when_env_unset);
177+
suite_add_tcase(s, tc);
178+
179+
return s;
180+
}
181+
182+
int main(void)
183+
{
184+
Suite *s;
185+
SRunner *sr;
186+
int failed;
187+
188+
s = keygen_xmss_suite();
189+
sr = srunner_create(s);
190+
srunner_run_all(sr, CK_NORMAL);
191+
failed = srunner_ntests_failed(sr);
192+
srunner_free(sr);
193+
194+
return failed == 0 ? 0 : 1;
195+
}

0 commit comments

Comments
 (0)