Skip to content

Commit c911069

Browse files
nordic-mik7ahasztag
authored andcommitted
[nrf noup] Support for ed25519 signature verification using ITS
Thic commit introduces support for ed25519 signature verification when CONFIG_NCS_BOOT_SIGNATURE_USING_ITS is set (through PSA API). Signed-off-by: Michal Kozikowski <artur.hadasz@nordicsemi.no>
1 parent e1f2ab3 commit c911069

3 files changed

Lines changed: 31 additions & 15 deletions

File tree

boot/bootutil/src/ed25519_psa.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,35 @@ BOOT_LOG_MODULE_REGISTER(ed25519_psa);
2626
#if defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
2727
/* List of KMU stored key ids available for MCUboot */
2828
#define MAKE_PSA_KMU_KEY_ID(id) PSA_KEY_HANDLE_FROM_CRACEN_KMU_SLOT(CRACEN_KMU_KEY_USAGE_SCHEME_RAW, id)
29-
static psa_key_id_t kmu_key_ids[3] = {
29+
static psa_key_id_t key_ids[3] = {
3030
MAKE_PSA_KMU_KEY_ID(226),
3131
MAKE_PSA_KMU_KEY_ID(228),
3232
MAKE_PSA_KMU_KEY_ID(230)
3333
};
3434

35+
#define KEY_SLOTS_COUNT CONFIG_BOOT_SIGNATURE_KMU_SLOTS
36+
3537
#if defined(CONFIG_BOOT_KMU_KEYS_REVOCATION)
3638
#include <bootutil/key_revocation.h>
3739
static psa_key_id_t *validated_with = NULL;
3840
#endif
3941

40-
BUILD_ASSERT(CONFIG_BOOT_SIGNATURE_KMU_SLOTS <= ARRAY_SIZE(kmu_key_ids),
42+
BUILD_ASSERT(CONFIG_BOOT_SIGNATURE_KMU_SLOTS <= ARRAY_SIZE(key_ids),
4143
"Invalid number of KMU slots, up to 3 are supported on nRF54L15");
4244
#endif
4345

44-
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
46+
#if defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
47+
static const psa_key_id_t key_ids[] = {
48+
0x40022100,
49+
0x40022101,
50+
0x40022102,
51+
0x40022103
52+
};
53+
54+
#define KEY_SLOTS_COUNT ARRAY_SIZE(key_ids)
55+
#endif
56+
57+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) && !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
4558
int ED25519_verify(const uint8_t *message, size_t message_len,
4659
const uint8_t signature[EDDSA_SIGNAGURE_LENGTH],
4760
const uint8_t public_key[EDDSA_KEY_LENGTH])
@@ -113,23 +126,24 @@ int ED25519_verify(const uint8_t *message, size_t message_len,
113126

114127
status = PSA_ERROR_BAD_STATE;
115128

116-
for (int i = 0; i < CONFIG_BOOT_SIGNATURE_KMU_SLOTS; ++i) {
117-
psa_key_id_t kid = kmu_key_ids[i];
129+
for (int i = 0; i < KEY_SLOTS_COUNT; ++i) {
130+
psa_key_id_t kid = key_ids[i];
118131

119132
status = psa_verify_message(kid, PSA_ALG_PURE_EDDSA, message,
120133
message_len, signature,
121134
EDDSA_SIGNAGURE_LENGTH);
122135
if (status == PSA_SUCCESS) {
123136
ret = 1;
124137
#if defined(CONFIG_BOOT_KMU_KEYS_REVOCATION)
125-
validated_with = kmu_key_ids + i;
138+
validated_with = key_ids + i;
126139
#endif
127-
break;
140+
return ret;
128141
}
129142

130-
BOOT_LOG_ERR("ED25519 signature verification failed %d", status);
131143
}
132144

145+
BOOT_LOG_ERR("ED25519 signature verification failed %d", status);
146+
133147
return ret;
134148
}
135149
#if defined(CONFIG_BOOT_KMU_KEYS_REVOCATION)
@@ -149,12 +163,12 @@ int exec_revoke(void)
149163
goto out;
150164
}
151165
for (int i = 0; i < CONFIG_BOOT_SIGNATURE_KMU_SLOTS; i++) {
152-
if ((kmu_key_ids + i) == validated_with) {
166+
if ((key_ids + i) == validated_with) {
153167
break;
154168
}
155169
BOOT_LOG_DBG("Invalidating key ID %d", i);
156170

157-
status = psa_destroy_key(kmu_key_ids[i]);
171+
status = psa_destroy_key(key_ids[i]);
158172
if (status == PSA_SUCCESS) {
159173
BOOT_LOG_DBG("Success on key ID %d", i);
160174
} else {

boot/bootutil/src/image_ed25519.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ extern int ED25519_verify(const uint8_t *message, size_t message_len,
3636

3737
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
3838
#if !defined(MCUBOOT_KEY_IMPORT_BYPASS_ASN)
39+
#if !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
3940
/*
4041
* Parse the public key used for signing.
4142
*/
@@ -78,6 +79,7 @@ bootutil_import_key(uint8_t **cp, uint8_t *end)
7879
}
7980
#endif /* !defined(MCUBOOT_KEY_IMPORT_BYPASS_ASN) */
8081
#endif
82+
#endif
8183

8284
/* Signature verification base function.
8385
* The function takes buffer of specified length and tries to verify
@@ -93,7 +95,7 @@ bootutil_verify(uint8_t *buf, uint32_t blen,
9395
int rc;
9496
FIH_DECLARE(fih_rc, FIH_FAILURE);
9597
uint8_t *pubkey = NULL;
96-
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
98+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) && !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
9799
uint8_t *end;
98100
#endif
99101

@@ -106,7 +108,7 @@ bootutil_verify(uint8_t *buf, uint32_t blen,
106108
goto out;
107109
}
108110

109-
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
111+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) && !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
110112
pubkey = (uint8_t *)bootutil_keys[key_id].key;
111113
end = pubkey + *bootutil_keys[key_id].len;
112114

boot/bootutil/src/image_validate.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -772,13 +772,13 @@ bootutil_img_validate(struct boot_loader_state *state,
772772
case EXPECTED_SIG_TLV:
773773
{
774774
BOOT_LOG_DBG("bootutil_img_validate: EXPECTED_SIG_TLV == %d", EXPECTED_SIG_TLV);
775-
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
775+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) && !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
776776
/* Ignore this signature if it is out of bounds. */
777777
if (key_id < 0 || key_id >= bootutil_key_cnt) {
778778
key_id = -1;
779779
continue;
780780
}
781-
#endif /* !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) */
781+
#endif /* !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) && !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS) */
782782
if (!EXPECTED_SIG_LEN(len) || len > sizeof(buf)) {
783783
rc = -1;
784784
goto out;
@@ -1022,7 +1022,7 @@ bootutil_img_validate(struct boot_loader_state *state,
10221022

10231023
if (type == IMAGE_TLV_DECOMP_SIGNATURE) {
10241024
/* Ignore this signature if it is out of bounds. */
1025-
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU)
1025+
#if !defined(CONFIG_BOOT_SIGNATURE_USING_KMU) && !defined(CONFIG_NCS_BOOT_SIGNATURE_USING_ITS)
10261026
if (key_id < 0 || key_id >= bootutil_key_cnt) {
10271027
key_id = -1;
10281028
continue;

0 commit comments

Comments
 (0)