Skip to content

Commit 13d746a

Browse files
philljjdanielinux
authored andcommitted
Add wc_xmss support.
1 parent cafef6b commit 13d746a

8 files changed

Lines changed: 74 additions & 27 deletions

File tree

.github/workflows/test-renode-nrf52.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ jobs:
6464

6565
# XMSS TEST
6666
- name: Renode Tests XMSS-SHA2_10_256
67-
run: ./tools/renode/docker-test.sh "SIGN=XMSS XMSS_PARAMS='XMSS-SHA2_10_256' WOLFBOOT_SMALL_STACK=0 IMAGE_SIGNATURE_SIZE=2500 IMAGE_HEADER_SIZE=5000"
67+
run: ./tools/renode/docker-test.sh "SIGN=ext_XMSS XMSS_PARAMS='XMSS-SHA2_10_256' WOLFBOOT_SMALL_STACK=0 IMAGE_SIGNATURE_SIZE=2500 IMAGE_HEADER_SIZE=5000"
6868

6969
- name: Upload Output Dir
7070
uses: actions/upload-artifact@v2

options.mk

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ ifeq ($(SIGN),LMS)
381381
endif
382382
endif
383383

384-
ifeq ($(SIGN),XMSS)
384+
ifneq (,$(filter $(SIGN), XMSS ext_XMSS))
385385
ifndef XMSS_PARAMS
386386
$(error XMSS_PARAMS not set)
387387
endif
@@ -393,7 +393,32 @@ ifeq ($(SIGN),XMSS)
393393
ifndef IMAGE_HEADER_SIZE
394394
$(error IMAGE_HEADER_SIZE not set)
395395
endif
396+
endif
396397

398+
ifeq ($(SIGN),XMSS)
399+
# Use wc_xmss implementation.
400+
KEYGEN_OPTIONS+=--xmss
401+
SIGN_OPTIONS+=--xmss
402+
WOLFCRYPT_OBJS+= \
403+
./lib/wolfssl/wolfcrypt/src/wc_xmss.o \
404+
./lib/wolfssl/wolfcrypt/src/wc_xmss_impl.o \
405+
./lib/wolfssl/wolfcrypt/src/memory.o \
406+
./lib/wolfssl/wolfcrypt/src/wc_port.o \
407+
./lib/wolfssl/wolfcrypt/src/hash.o
408+
CFLAGS+=-D"WOLFBOOT_SIGN_XMSS" -D"WOLFSSL_HAVE_XMSS" \
409+
-D"WOLFSSL_WC_XMSS" -D"WOLFSSL_WC_XMSS_SMALL" \
410+
-DWOLFBOOT_XMSS_PARAMS=\"$(XMSS_PARAMS)\" \
411+
-D"IMAGE_SIGNATURE_SIZE"=$(IMAGE_SIGNATURE_SIZE) \
412+
-D"WOLFSSL_XMSS_VERIFY_ONLY" -D"WOLFSSL_XMSS_MAX_HEIGHT=32"
413+
ifeq ($(WOLFBOOT_SMALL_STACK),1)
414+
$(error WOLFBOOT_SMALL_STACK with XMSS not supported)
415+
else
416+
STACK_USAGE=2688
417+
endif
418+
endif
419+
420+
ifeq ($(SIGN),ext_XMSS)
421+
# Use ext_xmss implementation.
397422
XMSSDIR = lib/xmss
398423
KEYGEN_OPTIONS+=--xmss
399424
SIGN_OPTIONS+=--xmss
@@ -411,19 +436,19 @@ ifeq ($(SIGN),XMSS)
411436
./lib/wolfssl/wolfcrypt/src/wc_port.o \
412437
./lib/wolfssl/wolfcrypt/src/hash.o
413438
CFLAGS+=-D"WOLFBOOT_SIGN_XMSS" -D"WOLFSSL_HAVE_XMSS" -D"HAVE_LIBXMSS" \
414-
-DXMSS_PARAMS=\"$(XMSS_PARAMS)\" -I$(XMSSDIR) \
439+
-DWOLFBOOT_XMSS_PARAMS=\"$(XMSS_PARAMS)\" -I$(XMSSDIR) \
415440
-D"IMAGE_SIGNATURE_SIZE"=$(IMAGE_SIGNATURE_SIZE) \
416441
-D"WOLFSSL_XMSS_VERIFY_ONLY" -D"XMSS_VERIFY_ONLY"
417442
ifeq ($(WOLFBOOT_SMALL_STACK),1)
418443
$(error WOLFBOOT_SMALL_STACK with XMSS not supported)
419444
else
420-
STACK_USAGE=18064
445+
STACK_USAGE=2712
421446
endif
422447
endif
423448

424449
# Only needed if using 3rd party integration. This can be
425450
# removed when wc_lms and wc_xmss become default in wolfboot.
426-
ifneq (,$(filter $(SIGN), LMS XMSS))
451+
ifneq (,$(filter $(SIGN), LMS ext_XMSS))
427452
CFLAGS +=-DWOLFSSL_EXPERIMENTAL_SETTINGS
428453
endif
429454

@@ -748,3 +773,7 @@ endif
748773
ifeq ($(SIGN_ALG),)
749774
SIGN_ALG=$(SIGN)
750775
endif
776+
777+
ifeq ($(SIGN_ALG),ext_XMSS)
778+
SIGN_ALG=XMSS
779+
endif

src/image.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ static void wolfBoot_verify_signature(uint8_t key_slot,
386386
#include <wolfssl/wolfcrypt/xmss.h>
387387
#ifdef HAVE_LIBXMSS
388388
#include <wolfssl/wolfcrypt/ext_xmss.h>
389+
#else
390+
#include <wolfssl/wolfcrypt/wc_xmss.h>
389391
#endif
390392

391393
static void wolfBoot_verify_signature(uint8_t key_slot,
@@ -410,18 +412,16 @@ static void wolfBoot_verify_signature(uint8_t key_slot,
410412
return;
411413
}
412414

413-
wolfBoot_printf("info: using XMSS parameters: %s\n", XMSS_PARAMS);
414-
415415
/* Set the XMSS parameters. */
416-
ret = wc_XmssKey_SetParamStr(&xmss, XMSS_PARAMS);
416+
ret = wc_XmssKey_SetParamStr(&xmss, WOLFBOOT_XMSS_PARAMS);
417417
if (ret != 0) {
418418
/* Something is wrong with the pub key or XMSS parameters. */
419419
wolfBoot_printf("error: wc_XmssKey_SetParamStr(%s)" \
420-
" returned %d\n", XMSS_PARAMS, ret);
420+
" returned %d\n", WOLFBOOT_XMSS_PARAMS, ret);
421421
return;
422422
}
423423

424-
wolfBoot_printf("info: using XMSS parameters: %s\n", XMSS_PARAMS);
424+
wolfBoot_printf("info: using XMSS parameters: %s\n", WOLFBOOT_XMSS_PARAMS);
425425

426426
/* Set the public key. */
427427
ret = wc_XmssKey_ImportPubRaw(&xmss, pubkey, KEYSTORE_PUBKEY_SIZE);

tools/keytools/Makefile

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,25 @@ ifeq ($(SIGN),LMS)
2525
-D"LMS_WINTERNITZ=$(LMS_WINTERNITZ)"
2626
endif
2727

28-
ifeq ($(SIGN),XMSS)
28+
ifeq ($(SIGN),ext_XMSS)
2929
$(info xmss params: $(XMSS_PARAMS))
3030
XMSSDIR = $(WOLFBOOTDIR)/lib/xmss
3131
CFLAGS +=-DWOLFBOOT_SIGN_XMSS -DWOLFSSL_HAVE_XMSS -DHAVE_LIBXMSS -I$(XMSSDIR) \
3232
-D"IMAGE_SIGNATURE_SIZE"=$(IMAGE_SIGNATURE_SIZE) \
33-
-DXMSS_PARAMS=\"$(XMSS_PARAMS)\"
33+
-DWOLFBOOT_XMSS_PARAMS=\"$(XMSS_PARAMS)\"
34+
endif
35+
36+
ifeq ($(SIGN),XMSS)
37+
$(info xmss params: $(XMSS_PARAMS))
38+
CFLAGS +=-DWOLFBOOT_SIGN_XMSS -DWOLFSSL_HAVE_XMSS -D"WOLFSSL_WC_XMSS" \
39+
-D"WOLFSSL_XMSS_MAX_HEIGHT=32" \
40+
-D"IMAGE_SIGNATURE_SIZE"=$(IMAGE_SIGNATURE_SIZE) \
41+
-DWOLFBOOT_XMSS_PARAMS=\"$(XMSS_PARAMS)\"
3442
endif
3543

3644
# Only needed if using 3rd party integration. This can be
3745
# removed when wc_lms and wc_xmss become default in wolfboot.
38-
ifneq (,$(filter $(SIGN), LMS XMSS))
46+
ifneq (,$(filter $(SIGN), LMS ext_XMSS))
3947
CFLAGS +=-DWOLFSSL_EXPERIMENTAL_SETTINGS
4048
endif
4149

@@ -89,14 +97,20 @@ OBJS_REAL=\
8997
$(WOLFDIR)/wolfcrypt/src/tfm.o \
9098
$(WOLFDIR)/wolfcrypt/src/wc_port.o \
9199
$(WOLFDIR)/wolfcrypt/src/wolfmath.o \
92-
$(WOLFDIR)/wolfcrypt/src/ext_lms.o \
93-
$(WOLFDIR)/wolfcrypt/src/ext_xmss.o
100+
$(WOLFDIR)/wolfcrypt/src/ext_lms.o
94101

95102
OBJS_REAL+=\
96103
$(WOLFBOOTDIR)/src/delta.o
97104

98105
ifeq ($(SIGN),XMSS)
99106
OBJS_REAL+=\
107+
$(WOLFDIR)/wolfcrypt/src/wc_xmss.o \
108+
$(WOLFDIR)/wolfcrypt/src/wc_xmss_impl.o
109+
endif
110+
111+
ifeq ($(SIGN),ext_XMSS)
112+
OBJS_REAL+=\
113+
$(WOLFDIR)/wolfcrypt/src/ext_xmss.o \
100114
$(XMSSDIR)/params.o \
101115
$(XMSSDIR)/thash.o \
102116
$(XMSSDIR)/hash_address.o \
@@ -112,7 +126,7 @@ vpath %.c $(WOLFDIR)/wolfcrypt/src/
112126
vpath %.c $(WOLFBOOTDIR)/src/
113127
vpath %.c ./
114128

115-
ifeq ($(SIGN),XMSS)
129+
ifeq ($(SIGN),ext_XMSS)
116130
vpath %.c $(XMSSDIR)/
117131
endif
118132

tools/keytools/keygen.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
#include <wolfssl/wolfcrypt/xmss.h>
7373
#ifdef HAVE_LIBXMSS
7474
#include <wolfssl/wolfcrypt/ext_xmss.h>
75+
#else
76+
#include <wolfssl/wolfcrypt/wc_xmss.h>
7577
#endif
7678
#endif
7779

@@ -627,14 +629,14 @@ static void keygen_xmss(const char *priv_fname, uint32_t id_mask)
627629
exit(1);
628630
}
629631

630-
ret = wc_XmssKey_SetParamStr(&key, XMSS_PARAMS);
632+
ret = wc_XmssKey_SetParamStr(&key, WOLFBOOT_XMSS_PARAMS);
631633
if (ret != 0) {
632634
fprintf(stderr, "error: wc_XmssKey_SetParamStr(%s)" \
633-
" returned %d\n", XMSS_PARAMS, ret);
635+
" returned %d\n", WOLFBOOT_XMSS_PARAMS, ret);
634636
exit(1);
635637
}
636638

637-
printf("info: using XMSS parameters: %s\n", XMSS_PARAMS);
639+
printf("info: using XMSS parameters: %s\n", WOLFBOOT_XMSS_PARAMS);
638640

639641
ret = wc_XmssKey_SetWriteCb(&key, xmss_write_key);
640642
if (ret != 0) {

tools/keytools/sign.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ static inline int fp_truncate(FILE *f, size_t len)
117117
#include <wolfssl/wolfcrypt/xmss.h>
118118
#ifdef HAVE_LIBXMSS
119119
#include <wolfssl/wolfcrypt/ext_xmss.h>
120+
#else
121+
#include <wolfssl/wolfcrypt/wc_xmss.h>
120122
#endif
121123
#endif
122124

@@ -781,7 +783,7 @@ static uint8_t *load_key(uint8_t **key_buffer, uint32_t *key_buffer_sz,
781783
*
782784
* If both priv/pub are present:
783785
* - The first ?? bytes is the private key.
784-
* - The next 60 bytes is the public key. */
786+
* - The next 68 bytes is the public key. */
785787
word32 priv_sz = 0;
786788
int xmss_ret = 0;
787789

@@ -969,7 +971,7 @@ static int sign_digest(int sign, int hash_algo,
969971
ret = wc_XmssKey_SetContext(&key.xmss, (void*)CMD.key_file);
970972
}
971973
if (ret == 0) {
972-
ret = wc_XmssKey_SetParamStr(&key.xmss, XMSS_PARAMS);
974+
ret = wc_XmssKey_SetParamStr(&key.xmss, WOLFBOOT_XMSS_PARAMS);
973975
}
974976
if (ret == 0) {
975977
ret = wc_XmssKey_Reload(&key.xmss);
@@ -2297,14 +2299,14 @@ int main(int argc, char** argv)
22972299
exit(1);
22982300
}
22992301

2300-
xmss_ret = wc_XmssKey_SetParamStr(&key.xmss, XMSS_PARAMS);
2302+
xmss_ret = wc_XmssKey_SetParamStr(&key.xmss, WOLFBOOT_XMSS_PARAMS);
23012303
if (xmss_ret != 0) {
23022304
fprintf(stderr, "error: wc_XmssKey_SetParamStr(%s)" \
2303-
" returned %d\n", XMSS_PARAMS, ret);
2305+
" returned %d\n", WOLFBOOT_XMSS_PARAMS, ret);
23042306
exit(1);
23052307
}
23062308

2307-
printf("info: using XMSS parameters: %s\n", XMSS_PARAMS);
2309+
printf("info: using XMSS parameters: %s\n", WOLFBOOT_XMSS_PARAMS);
23082310

23092311
xmss_ret = wc_XmssKey_GetSigLen(&key.xmss, &sig_sz);
23102312
if (xmss_ret != 0) {
@@ -2322,7 +2324,7 @@ int main(int argc, char** argv)
23222324

23232325
if (((CMD.sign != NO_SIGN) && (CMD.signature_sz == 0)) ||
23242326
CMD.header_sz == 0) {
2325-
printf("Invalid hash or signature type!\n");
2327+
printf("Invalid hash or signature type! %d\n", CMD.sign);
23262328
exit(2);
23272329
}
23282330

tools/test-renode.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ RENODE_BINASSEMBLE=tools/bin-assemble/bin-assemble
2020
LMS_OPTS=LMS_LEVELS=2 LMS_HEIGHT=5 LMS_WINTERNITZ=8 WOLFBOOT_SMALL_STACK=0 \
2121
IMAGE_SIGNATURE_SIZE=2644 IMAGE_HEADER_SIZE=5288
2222

23-
XMSS_OPTS=XMSS_PARAMS='XMSS-SHA2_10_256' WOLFBOOT_SMALL_STACK=0 \
23+
XMSS_OPTS=WOLFBOOT_XMSS_PARAMS='XMSS-SHA2_10_256' WOLFBOOT_SMALL_STACK=0 \
2424
IMAGE_SIGNATURE_SIZE=2500 IMAGE_HEADER_SIZE=5000
2525

2626
# python version only supported using

tools/test.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ endif
5454
ifeq ($(SIGN),LMS)
5555
SIGN_ARGS+= --lms
5656
endif
57-
ifeq ($(SIGN),XMSS)
57+
ifneq (,$(filter $(SIGN), XMSS ext_XMSS))
5858
SIGN_ARGS+= --xmss
5959
endif
6060

0 commit comments

Comments
 (0)