Skip to content

Commit

Permalink
bootutil: Allow bypassing ASN.1 encoding for ED25519 key import
Browse files Browse the repository at this point in the history
The commit adds MCUBOOT_KEY_IMPORT_BYPASS_ASN configuration option
that allows bypassing ASN.1 decoding of ED25519 public key, compiled
into MCUboot.
When the option is enabled the key will be accessed directly
and ASN.1 processing is not compiled in, resulting in smaller
footprint of MCUboot, at a cost of reduced detection of invalid
key, i.e. public key designated for different method than
compiled in.

Signed-off-by: Dominik Ermel <[email protected]>
  • Loading branch information
de-nordic committed Oct 9, 2024
1 parent 6cd7edc commit e94cd20
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
19 changes: 18 additions & 1 deletion boot/bootutil/src/image_ed25519.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,18 @@

#define EDDSA_SIGNATURE_LENGTH 64

static const uint8_t ed25519_pubkey_oid[] = MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x65\x70";
#define NUM_ED25519_BYTES 32

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

#if !defined(MCUBOOT_KEY_IMPORT_BYPASS_ASN)
/*
* Parse the public key used for signing.
*/
static const uint8_t ed25519_pubkey_oid[] = MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x65\x70";

static int
bootutil_import_key(uint8_t **cp, uint8_t *end)
{
Expand Down Expand Up @@ -71,6 +73,7 @@ bootutil_import_key(uint8_t **cp, uint8_t *end)

return 0;
}
#endif /* !defined(MCUBOOT_KEY_IMPORT_BYPASS_ASN) */

fih_ret
bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen,
Expand All @@ -89,11 +92,25 @@ bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, size_t slen,
pubkey = (uint8_t *)bootutil_keys[key_id].key;
end = pubkey + *bootutil_keys[key_id].len;

#if !defined(MCUBOOT_KEY_IMPORT_BYPASS_ASN)
rc = bootutil_import_key(&pubkey, end);
if (rc) {
FIH_SET(fih_rc, FIH_FAILURE);
goto out;
}
#else
/* Directly use the key contents from the ASN stream,
* these are the last NUM_ED25519_BYTES.
* There is no check whether this is the correct key,
* here, by the algorithm selected.
*/
if (*bootutil_keys[key_id].len < NUM_ED25519_BYTES) {
FIH_SET(fih_rc, FIH_FAILURE);
goto out;
}

pubkey = end - NUM_ED25519_BYTES;
#endif

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

Expand Down
4 changes: 4 additions & 0 deletions boot/zephyr/include/mcuboot_config/mcuboot_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
# error "One crypto library implementation allowed at a time."
#endif

#if defined(CONFIG_BOOT_KEY_IMPORT_BYPASS_ASN)
#define MCUBOOT_KEY_IMPORT_BYPASS_ASN
#endif

#ifdef CONFIG_BOOT_USE_MBEDTLS
#define MCUBOOT_USE_MBED_TLS
#elif defined(CONFIG_BOOT_USE_TINYCRYPT)
Expand Down

0 comments on commit e94cd20

Please sign in to comment.