Skip to content

Commit 438c097

Browse files
committed
Draft: support for hybrid authentication (2 algos)
1 parent 7891960 commit 438c097

File tree

11 files changed

+704
-303
lines changed

11 files changed

+704
-303
lines changed

Makefile

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ 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+
MAIN_TARGET+=$(SECONDARY_PRIVATE_KEY)
147+
endif
148+
144149
ASFLAGS:=$(CFLAGS)
145150

146151
all: $(MAIN_TARGET)
@@ -203,6 +208,14 @@ $(PRIVATE_KEY):
203208
$(Q)(test $(SIGN) = NONE) && (echo "// SIGN=NONE" > src/keystore.c) || true
204209
$(Q)(test "$(FLASH_OTP_KEYSTORE)" = "1") && (make -C tools/keytools/otp) || true
205210

211+
$(SECONDARY_PRIVATE_KEY):
212+
$(Q)$(MAKE) keytools_check
213+
$(Q)rm -f src/keystore.c
214+
$(Q)(test $(SIGN_SECONDARY) = NONE) || ("$(KEYGEN_TOOL)" \
215+
$(KEYGEN_OPTIONS) -i $(PRIVATE_KEY) $(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
@@ -400,6 +418,8 @@ tools/keytools/otp/otp-keystore-primer.bin: FORCE
400418
make -C tools/keytools/otp clean
401419
make -C tools/keytools/otp
402420

421+
secondary: $(SECONDARY_PRIVATE_KEY)
422+
403423
%.o:%.c
404424
@echo "\t[CC-$(ARCH)] $@"
405425
$(Q)$(CC) $(CFLAGS) -c $(OUTPUT_FLAG) $@ $^

arch.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,9 +997,11 @@ ifeq ($(TARGET),sim)
997997
LD_END_GROUP=
998998
BOOT_IMG=test-app/image.elf
999999
CFLAGS+=-DARCH_SIM
1000+
LDFLAGS +=-Wl,-gc-sections -Wl,-Map=wolfboot.map
10001001
ifeq ($(FORCE_32BIT),1)
10011002
CFLAGS+=-m32
10021003
LDFLAGS+=-m32
1004+
10031005
endif
10041006
ifeq ($(SPMATH),1)
10051007
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
Lines changed: 26 additions & 0 deletions
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=1
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

include/image.h

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,29 @@ int wolfBot_get_dts_size(void *dts_addr);
7979
#define SECT_FLAG_UPDATED 0x0f
8080
#endif
8181

82+
#define WOLFBOOT_SIGN_PRIMARY_ML_DSA
8283

84+
#ifdef WOLFBOOT_SIGN_PRIMARY_ED25519
85+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ed25519
86+
#endif
87+
#ifdef WOLFBOOT_SIGN_PRIMARY_ED448
88+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ed448
89+
#endif
90+
#ifdef WOLFBOOT_SIGN_PRIMARY_RSA
91+
#define wolfBoot_verify_signature wolfBoot_verify_signature_rsa
92+
#endif
93+
#ifdef WOLFBOOT_SIGN_PRIMARY_ECC
94+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ecc
95+
#endif
96+
#ifdef WOLFBOOT_SIGN_PRIMARY_LMS
97+
#define wolfBoot_verify_signature wolfBoot_verify_signature_lms
98+
#endif
99+
#ifdef WOLFBOOT_SIGN_PRIMARY_XMSS
100+
#define wolfBoot_verify_signature wolfBoot_verify_signature_xmss
101+
#endif
102+
#ifdef WOLFBOOT_SIGN_PRIMARY_ML_DSA
103+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ml_dsa
104+
#endif
83105

84106

85107
#if (defined(WOLFBOOT_ARMORED) && defined(__WOLFBOOT))
@@ -128,6 +150,16 @@ static void __attribute__((noinline)) wolfBoot_image_confirm_signature_ok(
128150
img->canary_FEED89AB = 0xFEED89ABUL;
129151
}
130152

153+
static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
154+
struct wolfBoot_image *img)
155+
{
156+
img->canary_FEED4567 = 0xFEED4567UL;
157+
img->signature_ok = 0UL;
158+
img->canary_FEED6789 = 0xFEED6789UL;
159+
img->not_signature_ok = 1UL;
160+
img->canary_FEED89AB = 0xFEED89ABUL;
161+
}
162+
131163
/**
132164
* Final sanity check, performed just before do_boot, or before starting an
133165
* update that has been verified.
@@ -330,8 +362,8 @@ static void __attribute__((noinline)) wolfBoot_image_confirm_signature_ok(
330362
}
331363

332364
/**
333-
* ECC / Ed signature verification.
334-
* ECC and Ed verify functions set an additional value 'p_res'
365+
* ECC / Ed / PQ signature verification.
366+
* Those verify functions set an additional value 'p_res'
335367
* which is passed as a pointer.
336368
*
337369
* Ensure that the verification function has been called, and then
@@ -531,12 +563,22 @@ struct wolfBoot_image {
531563
#if !defined(__CCRX__)
532564
static void __attribute__ ((unused)) wolfBoot_image_confirm_signature_ok(
533565
struct wolfBoot_image *img)
566+
{
567+
}
568+
static void __attribute__ ((unused)) wolfBoot_image_clear_signature_ok(
569+
struct wolfBoot_image *img)
570+
{
571+
}
534572
#else
535573
static void wolfBoot_image_confirm_signature_ok(struct wolfBoot_image *img)
536-
#endif
537574
{
538575
img->signature_ok = 1;
539576
}
577+
static void wolfBoot_image_clear_signature_ok(struct wolfBoot_image *img)
578+
{
579+
img->signature_ok = 0;
580+
}
581+
#endif
540582

541583
#define likely(x) (x)
542584
#define unlikely(x) (x)

include/keystore.h

Lines changed: 5 additions & 1 deletion
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 ML_DSA_LEVEL
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

include/loader.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,28 @@ extern "C" {
7777
# error "No public key available for given signing algorithm."
7878
#endif /* Algorithm selection */
7979

80+
#ifdef WOLFBOOT_SIGN_PRIMARY_ED25519
81+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ed25519
82+
#endif
83+
#ifdef WOLFBOOT_SIGN_PRIMARY_ED448
84+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ed448
85+
#endif
86+
#ifdef WOLFBOOT_SIGN_PRIMARY_RSA
87+
#define wolfBoot_verify_signature wolfBoot_verify_signature_rsa
88+
#endif
89+
#ifdef WOLFBOOT_SIGN_PRIMARY_ECC
90+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ecc
91+
#endif
92+
#ifdef WOLFBOOT_SIGN_PRIMARY_LMS
93+
#define wolfBoot_verify_signature wolfBoot_verify_signature_lms
94+
#endif
95+
#ifdef WOLFBOOT_SIGN_PRIMARY_XMSS
96+
#define wolfBoot_verify_signature wolfBoot_verify_signature_xmss
97+
#endif
98+
#ifdef WOLFBOOT_SIGN_PRIMARY_ML_DSA
99+
#define wolfBoot_verify_signature wolfBoot_verify_signature_ml_dsa
100+
#endif
101+
80102
void wolfBoot_start(void);
81103

82104
#if defined(ARCH_ARM) && defined(WOLFBOOT_ARMORED)

include/wolfboot/wolfboot.h

Lines changed: 62 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,14 @@ extern "C" {
6767
#define HDR_IMG_DELTA_BASE 0x05
6868
#define HDR_IMG_DELTA_SIZE 0x06
6969
#define HDR_PUBKEY 0x10
70+
#define HDR_SECONDARY_PUBKEY 0x12
7071
#define HDR_SHA3_384 0x13
7172
#define HDR_SHA384 0x14
7273
#define HDR_IMG_DELTA_INVERSE 0x15
7374
#define HDR_IMG_DELTA_INVERSE_SIZE 0x16
7475
#define HDR_SIGNATURE 0x20
7576
#define HDR_POLICY_SIGNATURE 0x21
77+
#define HDR_SECONDARY_SIGNATURE 0x22
7678
#define HDR_PADDING 0xFF
7779

7880
/* Auth Key types */
@@ -118,72 +120,71 @@ extern "C" {
118120
#define HDR_IMG_TYPE_APP 0x0001
119121
#endif
120122

121-
#define KEYSTORE_PUBKEY_SIZE_NONE 0
122-
#define KEYSTORE_PUBKEY_SIZE_ED25519 32
123-
#define KEYSTORE_PUBKEY_SIZE_ED448 57
124-
#define KEYSTORE_PUBKEY_SIZE_ECC256 64
125-
#define KEYSTORE_PUBKEY_SIZE_ECC384 96
126-
#define KEYSTORE_PUBKEY_SIZE_ECC521 132
127-
#define KEYSTORE_PUBKEY_SIZE_RSA2048 320
128-
#define KEYSTORE_PUBKEY_SIZE_RSA3072 448
129-
#define KEYSTORE_PUBKEY_SIZE_RSA4096 576
130-
#define KEYSTORE_PUBKEY_SIZE_LMS 60
131-
#define KEYSTORE_PUBKEY_SIZE_XMSS 68
132-
/* ML-DSA pub key size is a function of parameters.
133-
* This needs to be configurable. Default to security
134-
* category 2. */
135-
#ifdef ML_DSA_LEVEL
136-
#if ML_DSA_LEVEL == 2
137-
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 1312
138-
#elif ML_DSA_LEVEL == 3
139-
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 1952
140-
#elif ML_DSA_LEVEL == 5
141-
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 2592
142-
#else
143-
#error "Invalid ML_DSA_LEVEL!"
144-
#endif
145-
#else
146-
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 1312
147-
#endif /* ML_DSA_LEVEL */
123+
#define KEYSTORE_PUBKEY_SIZE_NONE 0
124+
#define KEYSTORE_PUBKEY_SIZE_ED25519 32
125+
#define KEYSTORE_PUBKEY_SIZE_ED448 57
126+
#define KEYSTORE_PUBKEY_SIZE_ECC256 64
127+
#define KEYSTORE_PUBKEY_SIZE_ECC384 96
128+
#define KEYSTORE_PUBKEY_SIZE_ECC521 132
129+
#define KEYSTORE_PUBKEY_SIZE_RSA2048 320
130+
#define KEYSTORE_PUBKEY_SIZE_RSA3072 448
131+
#define KEYSTORE_PUBKEY_SIZE_RSA4096 576
132+
#define KEYSTORE_PUBKEY_SIZE_LMS 60
133+
#define KEYSTORE_PUBKEY_SIZE_XMSS 68
134+
135+
/* ML-DSA pub key size is a function of parameters.
136+
* This needs to be configurable. Default to security
137+
* category 2. */
138+
#ifdef ML_DSA_LEVEL
139+
#if ML_DSA_LEVEL == 2
140+
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 1312
141+
#elif ML_DSA_LEVEL == 3
142+
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 1952
143+
#elif ML_DSA_LEVEL == 5
144+
#define KEYSTORE_PUBKEY_SIZE_ML_DSA 2592
145+
#else
146+
#error "Invalid ML_DSA_LEVEL!"
147+
#endif
148+
#endif /* ML_DSA_LEVEL */
148149

149150
/* Mask for key permissions */
150-
#define KEY_VERIFY_ALL (0xFFFFFFFFU)
151-
#define KEY_VERIFY_ONLY_ID(X) (1U << X)
152-
#define KEY_VERIFY_SELF_ONLY KEY_VERIFY_ONLY_ID(0)
153-
#define KEY_VERIFY_APP_ONLY KEY_VERIFY_ONLY_ID(1)
151+
#define KEY_VERIFY_ALL (0xFFFFFFFFU)
152+
#define KEY_VERIFY_ONLY_ID(X) (1U << X)
153+
#define KEY_VERIFY_SELF_ONLY KEY_VERIFY_ONLY_ID(0)
154+
#define KEY_VERIFY_APP_ONLY KEY_VERIFY_ONLY_ID(1)
154155

155156
#if defined(__WOLFBOOT) || defined(UNIT_TEST_AUTH)
156157

157-
/* Hashing configuration */
158-
#if defined(WOLFBOOT_HASH_SHA256)
159-
# ifndef WOLFBOOT_SHA_BLOCK_SIZE
160-
# define WOLFBOOT_SHA_BLOCK_SIZE (256)
161-
# endif
162-
# define WOLFBOOT_SHA_HDR HDR_SHA256
163-
# define WOLFBOOT_SHA_DIGEST_SIZE (32)
164-
# define image_hash image_sha256
165-
# define key_hash key_sha256
166-
# define self_hash self_sha256
167-
#elif defined(WOLFBOOT_HASH_SHA384)
168-
# ifndef WOLFBOOT_SHA_BLOCK_SIZE
169-
# define WOLFBOOT_SHA_BLOCK_SIZE (256)
170-
# endif
171-
# define WOLFBOOT_SHA_HDR HDR_SHA384
172-
# define WOLFBOOT_SHA_DIGEST_SIZE (48)
173-
# define image_hash image_sha384
174-
# define key_hash key_sha384
175-
# define self_hash self_sha384
176-
#elif defined(WOLFBOOT_HASH_SHA3_384)
177-
# ifndef WOLFBOOT_SHA_BLOCK_SIZE
178-
# define WOLFBOOT_SHA_BLOCK_SIZE (128)
179-
# endif
180-
# define WOLFBOOT_SHA_HDR HDR_SHA3_384
181-
# define WOLFBOOT_SHA_DIGEST_SIZE (48)
182-
# define image_hash image_sha3_384
183-
# define key_hash key_sha3_384
184-
#else
185-
# error "No valid hash algorithm defined!"
186-
#endif
158+
/* Hashing configuration */
159+
#if defined(WOLFBOOT_HASH_SHA256)
160+
# ifndef WOLFBOOT_SHA_BLOCK_SIZE
161+
# define WOLFBOOT_SHA_BLOCK_SIZE (256)
162+
# endif
163+
# define WOLFBOOT_SHA_HDR HDR_SHA256
164+
# define WOLFBOOT_SHA_DIGEST_SIZE (32)
165+
# define image_hash image_sha256
166+
# define key_hash key_sha256
167+
# define self_hash self_sha256
168+
#elif defined(WOLFBOOT_HASH_SHA384)
169+
# ifndef WOLFBOOT_SHA_BLOCK_SIZE
170+
# define WOLFBOOT_SHA_BLOCK_SIZE (256)
171+
# endif
172+
# define WOLFBOOT_SHA_HDR HDR_SHA384
173+
# define WOLFBOOT_SHA_DIGEST_SIZE (48)
174+
# define image_hash image_sha384
175+
# define key_hash key_sha384
176+
# define self_hash self_sha384
177+
#elif defined(WOLFBOOT_HASH_SHA3_384)
178+
# ifndef WOLFBOOT_SHA_BLOCK_SIZE
179+
# define WOLFBOOT_SHA_BLOCK_SIZE (128)
180+
# endif
181+
# define WOLFBOOT_SHA_HDR HDR_SHA3_384
182+
# define WOLFBOOT_SHA_DIGEST_SIZE (48)
183+
# define image_hash image_sha3_384
184+
# define key_hash key_sha3_384
185+
#else
186+
# error "No valid hash algorithm defined!"
187+
#endif
187188

188189
#ifdef WOLFBOOT_TPM
189190
#if defined(WOLFBOOT_HASH_SHA256)

options.mk

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,14 @@ ifeq ($(SIGN),ML_DSA)
507507
endif
508508
endif
509509

510+
ifneq ($(SIGN_SECONDARY),)
511+
LOWERCASE_SECONDARY=$(shell echo $(SIGN_SECONDARY) | tr '[:upper:]' '[:lower:]')
512+
SECONDARY_KEYGEN_OPTIONS=--$(LOWERCASE_SECONDARY)
513+
SECONDARY_SIGN_OPTIONS=--$(LOWERCASE_SECONDARY)
514+
CFLAGS+=-DSIGN_HYBRID
515+
CFLAGS+=-DSIGN_SECONDARY_$(SIGN_SECONDARY)
516+
endif
517+
510518
ifeq ($(RAM_CODE),1)
511519
CFLAGS+= -D"RAM_CODE"
512520
endif

0 commit comments

Comments
 (0)