Skip to content

Commit 3af92df

Browse files
de-nordicnordicjm
authored andcommitted
[nrf noup] bootutil: Add support for KMU stored ED25519 signature key
The commit adds verification of image using keys stored in KMU. Signed-off-by: Dominik Ermel <[email protected]> Signed-off-by: Jamie McCrae <[email protected]>
1 parent 53a7490 commit 3af92df

File tree

4 files changed

+86
-7
lines changed

4 files changed

+86
-7
lines changed

boot/bootutil/src/ed25519_psa.c

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,33 @@
1212

1313
#include <psa/crypto.h>
1414
#include <psa/crypto_types.h>
15+
#if defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
16+
#include <cracen_psa_kmu.h>
17+
#endif
1518

1619
BOOT_LOG_MODULE_DECLARE(ed25519_psa);
1720

1821
#define SHA512_DIGEST_LENGTH 64
1922
#define EDDSA_KEY_LENGTH 32
2023
#define EDDSA_SIGNAGURE_LENGTH 64
2124

25+
#if defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
26+
/* List of KMU stored key ids available for MCUboot */
27+
#define MAKE_PSA_KMU_KEY_ID(id) PSA_KEY_HANDLE_FROM_CRACEN_KMU_SLOT(CRACEN_KMU_KEY_USAGE_SCHEME_RAW, id)
28+
29+
static psa_key_id_t kmu_key_ids[] = {
30+
MAKE_PSA_KMU_KEY_ID(226),
31+
MAKE_PSA_KMU_KEY_ID(228),
32+
MAKE_PSA_KMU_KEY_ID(230)
33+
};
34+
35+
#define KMU_KEY_COUNT (sizeof(kmu_key_ids)/sizeof(kmu_key_ids[0]))
36+
#endif
37+
38+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
2239
int ED25519_verify(const uint8_t *message, size_t message_len,
23-
const uint8_t signature[EDDSA_SIGNAGURE_LENGTH],
24-
const uint8_t public_key[EDDSA_KEY_LENGTH])
40+
const uint8_t signature[EDDSA_SIGNAGURE_LENGTH],
41+
const uint8_t public_key[EDDSA_KEY_LENGTH])
2542
{
2643
/* Set to any error */
2744
psa_status_t status = PSA_ERROR_BAD_STATE;
@@ -69,3 +86,39 @@ int ED25519_verify(const uint8_t *message, size_t message_len,
6986

7087
return ret;
7188
}
89+
#else
90+
int ED25519_verify(const uint8_t *message, size_t message_len,
91+
const uint8_t signature[EDDSA_SIGNAGURE_LENGTH],
92+
const uint8_t public_key[EDDSA_KEY_LENGTH])
93+
{
94+
ARG_UNUSED(public_key);
95+
/* Set to any error */
96+
psa_status_t status = PSA_ERROR_BAD_STATE;
97+
int ret = 0; /* Fail by default */
98+
99+
/* Initialize PSA Crypto */
100+
status = psa_crypto_init();
101+
if (status != PSA_SUCCESS) {
102+
BOOT_LOG_ERR("PSA crypto init failed %d", status);
103+
return 0;
104+
}
105+
106+
status = PSA_ERROR_BAD_STATE;
107+
108+
for (int i = 0; i < KMU_KEY_COUNT; ++i) {
109+
psa_key_id_t kid = kmu_key_ids[i];
110+
111+
status = psa_verify_message(kid, PSA_ALG_PURE_EDDSA, message,
112+
message_len, signature,
113+
EDDSA_SIGNAGURE_LENGTH);
114+
if (status == PSA_SUCCESS) {
115+
ret = 1;
116+
break;
117+
}
118+
119+
BOOT_LOG_ERR("ED25519 signature verification failed %d", status);
120+
}
121+
122+
return ret;
123+
}
124+
#endif

boot/bootutil/src/image_ed25519.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@
2525
#include "bootutil/crypto/sha.h"
2626

2727
#define EDDSA_SIGNATURE_LENGTH 64
28-
29-
static const uint8_t ed25519_pubkey_oid[] = MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x65\x70";
3028
#define NUM_ED25519_BYTES 32
3129

3230
extern int ED25519_verify(const uint8_t *message, size_t message_len,
3331
const uint8_t signature[EDDSA_SIGNATURE_LENGTH],
3432
const uint8_t public_key[NUM_ED25519_BYTES]);
3533

34+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
35+
static const uint8_t ed25519_pubkey_oid[] = MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x65\x70";
36+
3637
/*
3738
* Parse the public key used for signing.
3839
*/
@@ -71,21 +72,25 @@ bootutil_import_key(uint8_t **cp, uint8_t *end)
7172

7273
return 0;
7374
}
75+
#endif
7476

7577
fih_ret
7678
bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen,
7779
uint8_t key_id)
7880
{
7981
int rc;
8082
FIH_DECLARE(fih_rc, FIH_FAILURE);
81-
uint8_t *pubkey;
83+
uint8_t *pubkey = NULL;
84+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
8285
uint8_t *end;
86+
#endif
8387

8488
if (hlen != IMAGE_HASH_SIZE || slen != EDDSA_SIGNATURE_LENGTH) {
8589
FIH_SET(fih_rc, FIH_FAILURE);
8690
goto out;
8791
}
8892

93+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
8994
pubkey = (uint8_t *)bootutil_keys[key_id].key;
9095
end = pubkey + *bootutil_keys[key_id].len;
9196

@@ -94,6 +99,7 @@ bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen,
9499
FIH_SET(fih_rc, FIH_FAILURE);
95100
goto out;
96101
}
102+
#endif
97103

98104
rc = ED25519_verify(hash, IMAGE_HASH_SIZE, sig, pubkey);
99105

@@ -115,14 +121,17 @@ bootutil_verify_img(const uint8_t *img, uint32_t size,
115121
{
116122
int rc;
117123
FIH_DECLARE(fih_rc, FIH_FAILURE);
118-
uint8_t *pubkey;
124+
uint8_t *pubkey = NULL;
125+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
119126
uint8_t *end;
127+
#endif
120128

121129
if (slen != EDDSA_SIGNATURE_LENGTH) {
122130
FIH_SET(fih_rc, FIH_FAILURE);
123131
goto out;
124132
}
125133

134+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
126135
pubkey = (uint8_t *)bootutil_keys[key_id].key;
127136
end = pubkey + *bootutil_keys[key_id].len;
128137

@@ -131,6 +140,7 @@ bootutil_verify_img(const uint8_t *img, uint32_t size,
131140
FIH_SET(fih_rc, FIH_FAILURE);
132141
goto out;
133142
}
143+
#endif
134144

135145
rc = ED25519_verify(img, size, sig, pubkey);
136146

boot/zephyr/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ if(CONFIG_MCUBOOT_SERIAL)
297297
endif()
298298
endif()
299299

300-
if(NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "")
300+
if(NOT CONFIG_BOOT_SIGNATURE_USING_KMU OR NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "")
301301
# CONF_FILE points to the KConfig configuration files of the bootloader.
302302
foreach (filepath ${CONF_FILE})
303303
file(READ ${filepath} temp_text)

boot/zephyr/Kconfig

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,20 @@ endif
302302

303303
endchoice
304304

305+
config BOOT_SIGNATURE_USING_KMU
306+
bool "Use KMU stored keys for signature verification"
307+
select PSA_WANT_ALG_GCM
308+
select PSA_WANT_KEY_TYPE_AES
309+
select PSA_WANT_AES_KEY_SIZE_256
310+
select PSA_WANT_ALG_SP800_108_COUNTER_CMAC
311+
select PSA_WANT_ALG_CMAC
312+
select PSA_WANT_ALG_ECB_NO_PADDING
313+
help
314+
The MCUboot will use keys provisioned to board for signature verification
315+
instead of compiling in a key data.
316+
317+
if !BOOT_SIGNATURE_USING_KMU
318+
305319
config BOOT_SIGNATURE_KEY_FILE
306320
string "PEM key file"
307321
default "root-ec-p256.pem" if BOOT_SIGNATURE_TYPE_ECDSA_P256
@@ -319,6 +333,8 @@ config BOOT_SIGNATURE_KEY_FILE
319333
with the public key information will be written in a format expected by
320334
MCUboot.
321335

336+
endif
337+
322338
config MCUBOOT_CLEANUP_ARM_CORE
323339
bool "Perform core cleanup before chain-load the application"
324340
depends on CPU_CORTEX_M

0 commit comments

Comments
 (0)