Skip to content

Commit cc447ea

Browse files
committed
Support for hybrid authentication (2 ciphers)
1 parent da1e869 commit cc447ea

21 files changed

+1155
-616
lines changed

.github/workflows/test-tpm.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ jobs:
113113
with:
114114
arch: host
115115
config-file: ./config/examples/sim-tpm-seal.config
116-
make-args: SIGN=ECC256 HASH=SHA256 POLICY_FILE=policy.bin
116+
make-args: SIGN=ECC256 HASH=SHA256 POLICY_FILE=policy.bin IMAGE_HEADER_SIZE=512
117117
keyauthstr: TestAuth
118118
sealauthstr: SealAuth
119119

@@ -143,7 +143,7 @@ jobs:
143143
with:
144144
arch: host
145145
config-file: ./config/examples/sim-tpm-seal.config
146-
make-args: SIGN=ECC256 HASH=SHA256 POLICY_FILE=policy.bin
146+
make-args: SIGN=ECC256 HASH=SHA256 POLICY_FILE=policy.bin IMAGE_HEADER_SIZE=512
147147
keyauthstr: TestAuth
148148

149149
sim_tpm_seal_noauth_ecc384:

Makefile

+23-3
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,13 @@ ifeq ($(FLASH_OTP_KEYSTORE),1)
141141
MAIN_TARGET+=tools/keytools/otp/otp-keystore-primer.bin
142142
endif
143143

144+
ifneq ($(SIGN_SECONDARY),)
145+
SECONDARY_PRIVATE_KEY=wolfboot_signing_second_private_key.der
146+
endif
147+
144148
ASFLAGS:=$(CFLAGS)
145149

146-
all: $(MAIN_TARGET)
150+
all: $(SECONDARY_PRIVATE_KEY) $(MAIN_TARGET)
147151

148152
stage1: stage1/loader_stage1.bin
149153
stage1/loader_stage1.bin: wolfboot.elf
@@ -203,6 +207,15 @@ $(PRIVATE_KEY):
203207
$(Q)(test $(SIGN) = NONE) && (echo "// SIGN=NONE" > src/keystore.c) || true
204208
$(Q)(test "$(FLASH_OTP_KEYSTORE)" = "1") && (make -C tools/keytools/otp) || true
205209

210+
$(SECONDARY_PRIVATE_KEY): $(PRIVATE_KEY) keystore.der
211+
$(Q)$(MAKE) keytools_check
212+
$(Q)rm -f src/keystore.c
213+
$(Q)dd if=keystore.der of=pubkey_1.der bs=1 skip=16
214+
$(Q)(test $(SIGN_SECONDARY) = NONE) || ("$(KEYGEN_TOOL)" \
215+
$(KEYGEN_OPTIONS) -i pubkey_1.der $(SECONDARY_KEYGEN_OPTIONS) \
216+
-g $(SECONDARY_PRIVATE_KEY)) || true
217+
$(Q)(test "$(FLASH_OTP_KEYSTORE)" = "1") && (make -C tools/keytools/otp) || true
218+
206219
keytools: include/target.h
207220
@echo "Building key tools"
208221
@$(MAKE) -C tools/keytools -s clean
@@ -220,7 +233,12 @@ swtpmtools:
220233

221234
test-app/image_v1_signed.bin: $(BOOT_IMG)
222235
@echo "\t[SIGN] $(BOOT_IMG)"
223-
$(Q)(test $(SIGN) = NONE) || "$(SIGN_TOOL)" $(SIGN_OPTIONS) $(BOOT_IMG) $(PRIVATE_KEY) 1
236+
@echo "\tSECONDARY_SIGN_OPTIONS=$(SECONDARY_SIGN_OPTIONS)"
237+
@echo "\tSECONDARY_PRIVATE_KEY=$(SECONDARY_PRIVATE_KEY)"
238+
239+
$(Q)(test $(SIGN) = NONE) || "$(SIGN_TOOL)" $(SIGN_OPTIONS) \
240+
$(SECONDARY_SIGN_OPTIONS) $(BOOT_IMG) $(PRIVATE_KEY) \
241+
$(SECONDARY_PRIVATE_KEY) 1 || true
224242
$(Q)(test $(SIGN) = NONE) && "$(SIGN_TOOL)" $(SIGN_OPTIONS) $(BOOT_IMG) 1 || true
225243

226244
test-app/image.elf: wolfboot.elf
@@ -312,7 +330,7 @@ keys: $(PRIVATE_KEY)
312330

313331
clean:
314332
$(Q)rm -f src/*.o hal/*.o hal/spi/*.o test-app/*.o src/x86/*.o
315-
$(Q)rm -f lib/wolfssl/wolfcrypt/src/*.o lib/wolfTPM/src/*.o lib/wolfTPM/hal/*.o
333+
$(Q)rm -f lib/wolfssl/wolfcrypt/src/*.o lib/wolfTPM/src/*.o lib/wolfTPM/hal/*.o lib/wolfTPM/examples/pcr/*.o
316334
$(Q)rm -f lib/wolfssl/wolfcrypt/src/port/Renesas/*.o
317335
$(Q)rm -f wolfboot.bin wolfboot.elf wolfboot.map test-update.rom wolfboot.hex
318336
$(Q)rm -f $(MACHINE_OBJ) $(MAIN_TARGET) $(LSCRIPT)
@@ -408,6 +426,8 @@ tools/keytools/otp/otp-keystore-primer.bin: FORCE
408426
make -C tools/keytools/otp clean
409427
make -C tools/keytools/otp
410428

429+
secondary: $(SECONDARY_PRIVATE_KEY)
430+
411431
%.o:%.c
412432
@echo "\t[CC-$(ARCH)] $@"
413433
$(Q)$(CC) $(CFLAGS) -c $(OUTPUT_FLAG) $@ $^

arch.mk

+10-3
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,13 @@ SPI_TARGET=$(TARGET)
2525
# Default UART driver name
2626
UART_TARGET=$(TARGET)
2727

28-
# Include SHA256 module because it's implicitly needed by RSA
29-
WOLFCRYPT_OBJS+=./lib/wolfssl/wolfcrypt/src/sha256.o
28+
# Include some modules by default
29+
WOLFCRYPT_OBJS+=./lib/wolfssl/wolfcrypt/src/sha256.o \
30+
./lib/wolfssl/wolfcrypt/src/hash.o \
31+
./lib/wolfssl/wolfcrypt/src/memory.o \
32+
./lib/wolfssl/wolfcrypt/src/wc_port.o \
33+
./lib/wolfssl/wolfcrypt/src/wolfmath.o
34+
3035

3136
ifeq ($(ARCH),x86_64)
3237
CFLAGS+=-DARCH_x86_64
@@ -239,7 +244,6 @@ else
239244
CORTEXM_ARM_EXTRA_OBJS=
240245
CORTEXM_ARM_EXTRA_CFLAGS=
241246
SECURE_OBJS+=./src/wc_callable.o
242-
SECURE_OBJS+=./lib/wolfssl/wolfcrypt/src/random.o
243247
CFLAGS+=-DWOLFCRYPT_SECURE_MODE
244248
SECURE_LDFLAGS+=-Wl,--cmse-implib -Wl,--out-implib=./src/wc_secure_calls.o
245249
endif
@@ -1025,9 +1029,12 @@ ifeq ($(TARGET),sim)
10251029
LD_END_GROUP=
10261030
BOOT_IMG=test-app/image.elf
10271031
CFLAGS+=-DARCH_SIM
1032+
CFLAGS+=-DWOLFBOOT_USE_STDLIBC
1033+
LDFLAGS +=-Wl,-gc-sections -Wl,-Map=wolfboot.map
10281034
ifeq ($(FORCE_32BIT),1)
10291035
CFLAGS+=-m32
10301036
LDFLAGS+=-m32
1037+
10311038
endif
10321039
ifeq ($(SPMATH),1)
10331040
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
ARCH=sim
2+
TARGET=sim
3+
SIGN?=ML_DSA
4+
ML_DSA_LEVEL=3
5+
IMAGE_SIGNATURE_SIZE=3309
6+
IMAGE_HEADER_SIZE?=8192
7+
HASH?=SHA256
8+
WOLFBOOT_SMALL_STACK?=0
9+
SPI_FLASH=0
10+
DEBUG=0
11+
WOLFBOOT_UNIVERSAL_KEYSTORE=1
12+
SIGN_SECONDARY=ECC384
13+
14+
# sizes should be multiple of system page size
15+
WOLFBOOT_PARTITION_SIZE=0x40000
16+
WOLFBOOT_SECTOR_SIZE=0x1000
17+
WOLFBOOT_PARTITION_BOOT_ADDRESS=0x80000
18+
# if on external flash, it should be multiple of system page size
19+
WOLFBOOT_PARTITION_UPDATE_ADDRESS=0x100000
20+
WOLFBOOT_PARTITION_SWAP_ADDRESS=0x180000
21+
22+
# required for keytools
23+
WOLFBOOT_FIXED_PARTITIONS=1
24+
25+
# For debugging XMALLOC/XFREE
26+
#CFLAGS_EXTRA+=-DWOLFBOOT_DEBUG_MALLOC

hal/sim.c

+15-14
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
#include "wolfboot/wolfboot.h"
4242
#include "target.h"
43+
#include "printf.h"
4344

4445
/* Global pointer to the internal and external flash base */
4546
uint8_t *sim_ram_base;
@@ -72,7 +73,7 @@ static int mmap_file(const char *path, uint8_t *address, uint8_t** ret_address)
7273

7374
fd = open(path, O_RDWR);
7475
if (fd == -1) {
75-
fprintf(stderr, "can't open %s\n", path);
76+
wolfBoot_printf( "can't open %s\n", path);
7677
return -1;
7778
}
7879

@@ -81,7 +82,7 @@ static int mmap_file(const char *path, uint8_t *address, uint8_t** ret_address)
8182
if (mmaped_addr == MAP_FAILED)
8283
return -1;
8384

84-
fprintf(stderr, "Simulator assigned %s to base %p\n", path, mmaped_addr);
85+
wolfBoot_printf( "Simulator assigned %s to base %p\n", path, mmaped_addr);
8586

8687
*ret_address = mmaped_addr;
8788

@@ -119,8 +120,8 @@ int hal_flash_write(uintptr_t address, const uint8_t *data, int len)
119120
uint8_t *addr = (uint8_t *)address;
120121
if (addr[i] != FLASH_BYTE_ERASED) {
121122
/* no writing to non-erased page in NVM_FLASH_WRITEONCE */
122-
printf("NVM_FLASH_WRITEONCE non-erased write detected at address %p!\n", addr);
123-
printf("Address[%d] = %02x\n", i, addr[i]);
123+
wolfBoot_printf("NVM_FLASH_WRITEONCE non-erased write detected at address %p!\n", addr);
124+
wolfBoot_printf("Address[%d] = %02x\n", i, addr[i]);
124125
return -1;
125126
}
126127
#endif
@@ -137,9 +138,9 @@ int hal_flash_write(uintptr_t address, const uint8_t *data, int len)
137138
int hal_flash_erase(uintptr_t address, int len)
138139
{
139140
/* implicit cast abide compiler warning */
140-
fprintf(stderr, "hal_flash_erase addr %p len %d\n", (void*)address, len);
141+
wolfBoot_printf( "hal_flash_erase addr %p len %d\n", (void*)address, len);
141142
if (address == erasefail_address + WOLFBOOT_PARTITION_BOOT_ADDRESS) {
142-
fprintf(stderr, "POWER FAILURE\n");
143+
wolfBoot_printf( "POWER FAILURE\n");
143144
/* Corrupt page */
144145
memset((void*)address, 0xEE, len);
145146
exit(0);
@@ -156,23 +157,23 @@ void hal_init(void)
156157
ret = mmap_file(INTERNAL_FLASH_FILE,
157158
(uint8_t*)ARCH_FLASH_OFFSET, &sim_ram_base);
158159
if (ret != 0) {
159-
fprintf(stderr, "failed to load internal flash file\n");
160+
wolfBoot_printf( "failed to load internal flash file\n");
160161
exit(-1);
161162
}
162163

163164
#ifdef EXT_FLASH
164165
ret = mmap_file(EXTERNAL_FLASH_FILE,
165166
(uint8_t*)ARCH_FLASH_OFFSET + 0x10000000, &flash_base);
166167
if (ret != 0) {
167-
fprintf(stderr, "failed to load external flash file\n");
168+
wolfBoot_printf( "failed to load external flash file\n");
168169
exit(-1);
169170
}
170171
#endif /* EXT_FLASH */
171172

172173
for (i = 1; i < main_argc; i++) {
173174
if (strcmp(main_argv[i], "powerfail") == 0) {
174175
erasefail_address = strtol(main_argv[++i], NULL, 16);
175-
fprintf(stderr, "Set power fail to erase at address %x\n",
176+
wolfBoot_printf( "Set power fail to erase at address %x\n",
176177
erasefail_address);
177178
}
178179
/* force a bad write of the boot partition to trigger and test the
@@ -262,15 +263,15 @@ void do_boot(const uint32_t *app_offset)
262263

263264
ret = NSCreateObjectFileImageFromMemory(app_buf, app_size, &fileImage);
264265
if (ret != 1 || fileImage == NULL) {
265-
fprintf(stderr, "Error loading object memory!\n");
266+
wolfBoot_printf( "Error loading object memory!\n");
266267
exit(-1);
267268
}
268269
module = NSLinkModule(fileImage, "module",
269270
(NSLINKMODULE_OPTION_PRIVATE | NSLINKMODULE_OPTION_BINDNOW));
270271
symbol = NSLookupSymbolInModule(module, "__mh_execute_header");
271272
pSymbolAddress = NSAddressOfSymbol(symbol);
272273
if (!find_epc(pSymbolAddress, &epc)) {
273-
fprintf(stderr, "Error finding entry point!\n");
274+
wolfBoot_printf( "Error finding entry point!\n");
274275
exit(-1);
275276
}
276277

@@ -283,17 +284,17 @@ void do_boot(const uint32_t *app_offset)
283284
char *envp[1] = {NULL};
284285
int fd = memfd_create("test_app", 0);
285286
if (fd == -1) {
286-
fprintf(stderr, "memfd error\n");
287+
wolfBoot_printf( "memfd error\n");
287288
exit(-1);
288289
}
289290

290291
if ((size_t)write(fd, app_offset, app_size) != app_size) {
291-
fprintf(stderr, "can't write test-app to memfd\n");
292+
wolfBoot_printf( "can't write test-app to memfd\n");
292293
exit(-1);
293294
}
294295

295296
ret = fexecve(fd, main_argv, envp);
296-
fprintf(stderr, "fexecve error\n");
297+
wolfBoot_printf( "fexecve error\n");
297298
#endif
298299
exit(1);
299300
}

include/image.h

+77-7
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,68 @@ int wolfBot_get_dts_size(void *dts_addr);
7979
#define SECT_FLAG_UPDATED 0x0f
8080
#endif
8181

82+
#ifdef WOLFBOOT_SIGN_PRIMARY_ED25519
83+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_ed25519
84+
#endif
85+
#ifdef WOLFBOOT_SIGN_PRIMARY_ED448
86+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_ed448
87+
#endif
88+
#if defined (WOLFBOOT_SIGN_PRIMARY_RSA2048) || \
89+
defined (WOLFBOOT_SIGN_PRIMARY_RSA3072) || \
90+
defined (WOLFBOOT_SIGN_PRIMARY_RSA4096) || \
91+
defined (WOLFBOOT_SIGN_PRIMARY_RSA2048ENC) || \
92+
defined (WOLFBOOT_SIGN_PRIMARY_RSA3072ENC) || \
93+
defined (WOLFBOOT_SIGN_PRIMARY_RSA4096ENC)
94+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_rsa
95+
#endif
96+
#if defined (WOLFBOOT_SIGN_PRIMARY_ECC256) || \
97+
defined (WOLFBOOT_SIGN_PRIMARY_ECC384) || \
98+
defined (WOLFBOOT_SIGN_PRIMARY_ECC521)
99+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_ecc
100+
#endif
101+
#if defined(WOLFBOOT_SIGN_PRIMARY_LMS) || defined(WOLFBOOT_SIGN_PRIMARY_ext_LMS)
102+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_lms
103+
#endif
104+
#if defined(WOLFBOOT_SIGN_PRIMARY_XMSS ) || defined(WOLFBOOT_SIGN_PRIMARY_ext_XMSS)
105+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_xmss
106+
#endif
107+
#ifdef WOLFBOOT_SIGN_PRIMARY_ML_DSA
108+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_ml_dsa
109+
#endif
110+
111+
#ifdef WOLFBOOT_SIGN_SECONDARY_ED25519
112+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_ed25519
113+
#endif
114+
#ifdef WOLFBOOT_SIGN_SECONDARY_ED448
115+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_ed448
116+
#endif
117+
#if defined (WOLFBOOT_SIGN_SECONDARY_RSA2048) || \
118+
defined (WOLFBOOT_SIGN_SECONDARY_RSA3072) || \
119+
defined (WOLFBOOT_SIGN_SECONDARY_RSA4096) || \
120+
defined (WOLFBOOT_SIGN_SECONDARY_RSA2048ENC) || \
121+
defined (WOLFBOOT_SIGN_SECONDARY_RSA3072ENC) || \
122+
defined (WOLFBOOT_SIGN_SECONDARY_RSA4096ENC)
123+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_rsa
124+
#endif
125+
#if defined (WOLFBOOT_SIGN_SECONDARY_ECC256) || \
126+
defined (WOLFBOOT_SIGN_SECONDARY_ECC384) || \
127+
defined (WOLFBOOT_SIGN_SECONDARY_ECC521)
128+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_ecc
129+
#endif
130+
#ifdef WOLFBOOT_SIGN_SECONDARY_LMS
131+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_lms
132+
#endif
133+
#ifdef WOLFBOOT_SIGN_SECONDARY_XMSS
134+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_xmss
135+
#endif
136+
#ifdef WOLFBOOT_SIGN_SECONDARY_ML_DSA
137+
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_ml_dsa
138+
#endif
82139

140+
#if defined(WOLFBOOT_TPM) && defined (WOLFBOOT_TPM_VERIFY)
141+
#undef wolfBoot_verify_signature_primary
142+
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_tpm
143+
#endif
83144

84145

85146
#if (defined(WOLFBOOT_ARMORED) && defined(__WOLFBOOT))
@@ -128,6 +189,16 @@ static void __attribute__((noinline)) wolfBoot_image_confirm_signature_ok(
128189
img->canary_FEED89AB = 0xFEED89ABUL;
129190
}
130191

192+
static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
193+
struct wolfBoot_image *img)
194+
{
195+
img->canary_FEED4567 = 0xFEED4567UL;
196+
img->signature_ok = 0UL;
197+
img->canary_FEED6789 = 0xFEED6789UL;
198+
img->not_signature_ok = 1UL;
199+
img->canary_FEED89AB = 0xFEED89ABUL;
200+
}
201+
131202
/**
132203
* Final sanity check, performed just before do_boot, or before starting an
133204
* update that has been verified.
@@ -330,8 +401,8 @@ static void __attribute__((noinline)) wolfBoot_image_confirm_signature_ok(
330401
}
331402

332403
/**
333-
* ECC / Ed signature verification.
334-
* ECC and Ed verify functions set an additional value 'p_res'
404+
* ECC / Ed / PQ signature verification.
405+
* Those verify functions set an additional value 'p_res'
335406
* which is passed as a pointer.
336407
*
337408
* Ensure that the verification function has been called, and then
@@ -528,15 +599,14 @@ struct wolfBoot_image {
528599
};
529600

530601
/* do not warn if this is not used */
531-
#if !defined(__CCRX__)
532-
static void __attribute__ ((unused)) wolfBoot_image_confirm_signature_ok(
533-
struct wolfBoot_image *img)
534-
#else
535602
static void wolfBoot_image_confirm_signature_ok(struct wolfBoot_image *img)
536-
#endif
537603
{
538604
img->signature_ok = 1;
539605
}
606+
static void wolfBoot_image_clear_signature_ok(struct wolfBoot_image *img)
607+
{
608+
img->signature_ok = 0;
609+
}
540610

541611
#define likely(x) (x)
542612
#define unlikely(x) (x)

include/keystore.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ extern "C" {
3232
#ifndef KEYSTORE_PUBKEY_SIZE
3333
/* allow building version for external API use */
3434
#define KEYSTORE_ANY
35-
#define KEYSTORE_PUBKEY_SIZE 576 /* Max is RSA 4096 */
35+
#ifdef WOLFBOOT_SIGN_ML_DSA
36+
#define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_ML_DSA
37+
#else
38+
#define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_RSA4096
39+
#endif
3640
#endif
3741

3842

0 commit comments

Comments
 (0)