Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions boot/boot_serial/src/boot_serial_encryption.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ boot_image_validate_encrypted(struct boot_loader_state *state,
int rc;

if (MUST_DECRYPT(fa_p, BOOT_CURR_IMG(state), hdr)) {
#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_en_take_key(bs->enckey[BOOT_SLOT_SECONDARY], BOOT_CUR_IMG(state), BOOT_SLOT_SECONDARY);
#else
rc = boot_enc_load(state, BOOT_SLOT_SECONDARY, hdr, fa_p, bs);
#endif
if (rc < 0) {
FIH_RET(fih_rc);
}
Expand Down Expand Up @@ -232,7 +236,11 @@ decrypt_image_inplace(const struct flash_area *fa_p,
}
#endif
/* Load the encryption keys into cache */
#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_take_enc_key(bs->enckey[BOOT_SLOT_PRIMARY], BOOT_CURR_IMG(state), BOOT_SLOT_PRIMARY);
#else
rc = boot_enc_load(state, BOOT_SLOT_PRIMARY, hdr, fa_p, bs);
#endif
if (rc < 0) {
goto total_out;
}
Expand Down
3 changes: 3 additions & 0 deletions boot/bootutil/include/bootutil/enc_key.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ void boot_enc_decrypt(struct enc_key_data *enc_state,
/* Note that boot_enc_zeorize takes BOOT_CURR_ENC, not BOOT_CURR_ENC_SLOT */
void boot_enc_zeroize(struct enc_key_data *enc_state);

/* Retrieve key for a slot */
int boot_take_enc_key(uint8_t *key, int image, int slot);

#ifdef __cplusplus
}
#endif
Expand Down
4 changes: 4 additions & 0 deletions boot/bootutil/src/bootutil_loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,11 @@ boot_check_image(struct boot_loader_state *state, struct boot_status *bs, int sl
*/
#if defined(MCUBOOT_ENC_IMAGES) && !defined(MCUBOOT_RAM_LOAD)
if (MUST_DECRYPT(fap, BOOT_CURR_IMG(state), hdr)) {
#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_take_enc_key(bs->enckey[BOOT_SLOT_SECONDARY], BOOT_CURR_IMG(state), BOOT_SLOT_SECONDARY);
#else
rc = boot_enc_load(state, BOOT_SLOT_SECONDARY, hdr, fap, bs);
#endif
if (rc < 0) {
FIH_RET(fih_rc);
}
Expand Down
2 changes: 1 addition & 1 deletion boot/bootutil/src/bootutil_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ boot_read_unprotected_tlv_sizes(const struct flash_area *fap, uint16_t *tlv_size
}
#endif

#ifdef MCUBOOT_ENC_IMAGES
#if defined(MCUBOOT_ENC_IMAGES) && !defined(MCUBOOT_EMBEDDED_ENC_KEY)
int
boot_read_enc_key(const struct flash_area *fap, uint8_t slot, struct boot_status *bs)
{
Expand Down
4 changes: 4 additions & 0 deletions boot/bootutil/src/encrypted.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ static int fake_rng(void *p_rng, unsigned char *output, size_t len)
#endif /* (MCUBOOT_ENCRYPT_RSA && MCUBOOT_USE_MBED_TLS && !MCUBOOT_USE_PSA_CRYPTO) ||
(MCUBOOT_ENCRYPT_EC256 && MCUBOOT_USE_MBED_TLS) */

#if !defined(MCUBOOT_EMBEDDED_ENC_KEY)
/*
* Decrypt an encryption key TLV.
*
Expand Down Expand Up @@ -564,7 +565,9 @@ boot_decrypt_key(const uint8_t *buf, uint8_t *enckey)
return rc;
}
#endif /* CONFIG_BOOT_ED25519_PSA && CONFIG_BOOT_ECDSA_PSA */
#endif /* defined(MCUBOOT_EMBEDDED_ENC_KEY) */

#if !defined(MCUBOOT_EMBEDDED_ENC_KEY)
/*
* Load encryption key.
*/
Expand Down Expand Up @@ -625,6 +628,7 @@ boot_enc_load(struct boot_loader_state *state, int slot,

return boot_decrypt_key(buf, bs->enckey[slot]);
}
#endif /* defined(MCUBOOT_EMBEDDED_ENC_KEY */

int
boot_enc_init(struct enc_key_data *enc_state)
Expand Down
18 changes: 17 additions & 1 deletion boot/bootutil/src/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -1006,9 +1006,13 @@ boot_copy_image(struct boot_loader_state *state, struct boot_status *bs)

#ifdef MCUBOOT_ENC_IMAGES
if (IS_ENCRYPTED(boot_img_hdr(state, BOOT_SLOT_SECONDARY))) {
#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_take_enc_key(bs->enckey[BOOT_SLOT_SECONDARY], BOOT_CURR_IMG(state), BOOT_SLOT_SECONDARY);
#else
rc = boot_enc_load(state, BOOT_SLOT_SECONDARY,
boot_img_hdr(state, BOOT_SLOT_SECONDARY),
fap_secondary_slot, bs);
#endif /* MCUBOOT_EMBEDDED_ENC_KEY */

if (rc < 0) {
return BOOT_EBADIMAGE;
Expand Down Expand Up @@ -1130,7 +1134,11 @@ boot_swap_image(struct boot_loader_state *state, struct boot_status *bs)
#ifdef MCUBOOT_ENC_IMAGES
if (IS_ENCRYPTED(hdr)) {
fap = BOOT_IMG_AREA(state, BOOT_SLOT_PRIMARY);
#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_take_enc_key(bs->enckey[BOOT_SLOT_PRIMARY], BOOT_CURR_IMG(state), BOOT_SLOT_PRIMARY);
#else
rc = boot_enc_load(state, BOOT_SLOT_PRIMARY, hdr, fap, bs);
#endif /* MCUBOOT_EMBEDDED_ENC_KEY */
assert(rc >= 0);

if (rc == 0) {
Expand All @@ -1154,7 +1162,11 @@ boot_swap_image(struct boot_loader_state *state, struct boot_status *bs)
hdr = boot_img_hdr(state, BOOT_SLOT_SECONDARY);
if (IS_ENCRYPTED(hdr)) {
fap = BOOT_IMG_AREA(state, BOOT_SLOT_SECONDARY);
#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_take_enc_key(bs->enckey[BOOT_SLOT_SECONDARY], BOOT_CURR_IMG(state), BOOT_SLOT_SECONDARY);
#else
rc = boot_enc_load(state, BOOT_SLOT_SECONDARY, hdr, fap, bs);
#endif /* MCUBOOT_EMBEDDED_ENC_KEY */
assert(rc >= 0);

if (rc == 0) {
Expand Down Expand Up @@ -1191,15 +1203,19 @@ boot_swap_image(struct boot_loader_state *state, struct boot_status *bs)

boot_enc_init(BOOT_CURR_ENC_SLOT(state, slot));

#ifdef MCUBOOT_EMBEDDED_ENC_KEY
rc = boot_take_enc_key(bs->enckey[slot], image_index, slot);
#else
rc = boot_read_enc_key(fap, slot, bs);
#endif /* MCUBOOT_EMBEDDED_ENC_KEY */
if (rc) {
BOOT_LOG_DBG("boot_swap_image: Failed loading key (%d, %d)",
image_index, slot);
} else {
boot_enc_set_key(BOOT_CURR_ENC_SLOT(state, slot), bs->enckey[slot]);
}
}
#endif
#endif /* MCUBOOT_ENC_IMAGES */
flash_area_close(fap);
}

Expand Down
1 change: 1 addition & 0 deletions boot/mynewt/src/single_loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ boot_image_validate(const struct flash_area *fa_p,
* was performed. We will try to validate the image, and if still
* encrypted the validation will fail, and go in panic mode
*/
BOOT_LOG_DBG("boot_image_validate: clearing encryption flags");
hdr->ih_flags &= ~(ENCRYPTIONFLAGS);
}
FIH_CALL(bootutil_img_validate, fih_rc, NULL, hdr, fa_p, tmpbuf,
Expand Down
88 changes: 53 additions & 35 deletions boot/zephyr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -383,45 +383,48 @@ if(NOT CONFIG_BOOT_SIGNATURE_TYPE_NONE AND NOT CONFIG_BOOT_SIGNATURE_KEY_FILE ST
endif()

if(CONFIG_BOOT_ENCRYPTION_KEY_FILE AND NOT CONFIG_BOOT_ENCRYPTION_KEY_FILE STREQUAL "")
set(key_file "${CONFIG_BOOT_ENCRYPTION_KEY_FILE}")
string(CONFIGURE "${key_file}" key_file)
if(CONFIG_BOOT_ENCRYPT_IMAGE_WITH_SHARED_KEY)
set(key_file "${CONFIG_BOOT_ENCRYPTION_KEY_FILE}")
string(CONFIGURE "${key_file}" key_file)

if(IS_ABSOLUTE ${key_file})
set(encryption_key_file ${key_file})
elseif(EXISTS ${APPLICATION_CONFIG_DIR}/${key_file})
set(encryption_key_file ${APPLICATION_CONFIG_DIR}/${key_file})
else()
set(encryption_key_file ${MCUBOOT_DIR}/${key_file})
endif()
message("MCUBoot bootloader encryption key file: ${encryption_key_file}")

# Emit a warning if using one of the default MCUboot key files
set(mcuboot_default_encryption_files
${MCUBOOT_DIR}/enc-ec256-priv.pem
${MCUBOOT_DIR}/enc-ec256-pub.pem
${MCUBOOT_DIR}/enc-rsa2048-priv.pem
${MCUBOOT_DIR}/enc-rsa2048-pub.pem
${MCUBOOT_DIR}/enc-x25519-priv.pem
${MCUBOOT_DIR}/enc-x25519-pub.pem
)

if(IS_ABSOLUTE ${key_file})
set(encryption_key_file ${key_file})
elseif(EXISTS ${APPLICATION_CONFIG_DIR}/${key_file})
set(encryption_key_file ${APPLICATION_CONFIG_DIR}/${key_file})
else()
set(encryption_key_file ${MCUBOOT_DIR}/${key_file})
endif()
message("MCUBoot bootloader encryption key file: ${encryption_key_file}")
if(${encryption_key_file} IN_LIST mcuboot_default_encryption_files)
message(WARNING "WARNING: Using default MCUboot encryption key file, this file is for debug use only and is not secure!")
endif()

# Emit a warning if using one of the default MCUboot key files
set(mcuboot_default_encryption_files
${MCUBOOT_DIR}/enc-ec256-priv.pem
${MCUBOOT_DIR}/enc-ec256-pub.pem
${MCUBOOT_DIR}/enc-rsa2048-priv.pem
${MCUBOOT_DIR}/enc-rsa2048-pub.pem
${MCUBOOT_DIR}/enc-x25519-priv.pem
${MCUBOOT_DIR}/enc-x25519-pub.pem
)
set(GENERATED_ENCKEY ${ZEPHYR_BINARY_DIR}/autogen-enckey.c)
add_custom_command(
OUTPUT ${GENERATED_ENCKEY}
COMMAND
${PYTHON_EXECUTABLE}
${MCUBOOT_DIR}/scripts/imgtool.py
getpriv
-k
${encryption_key_file}
> ${GENERATED_ENCKEY}
DEPENDS ${encryption_key_file}
)

if(${encryption_key_file} IN_LIST mcuboot_default_encryption_files)
message(WARNING "WARNING: Using default MCUboot encryption key file, this file is for debug use only and is not secure!")
zephyr_library_sources(${GENERATED_ENCKEY})
endif()

set(GENERATED_ENCKEY ${ZEPHYR_BINARY_DIR}/autogen-enckey.c)
add_custom_command(
OUTPUT ${GENERATED_ENCKEY}
COMMAND
${PYTHON_EXECUTABLE}
${MCUBOOT_DIR}/scripts/imgtool.py
getpriv
-k
${encryption_key_file}
> ${GENERATED_ENCKEY}
DEPENDS ${encryption_key_file}
)
zephyr_library_sources(${GENERATED_ENCKEY})
endif()

if(CONFIG_MCUBOOT_CLEANUP_ARM_CORE)
Expand Down Expand Up @@ -709,3 +712,18 @@ if(SYSBUILD)
set(mcuboot_image_footer_size ${required_size} CACHE INTERNAL "Estimated MCUboot image trailer size" FORCE)
set(mcuboot_image_upgrade_footer_size ${required_upgrade_size} CACHE INTERNAL "Estimated MCUboot update image trailer size" FORCE)
endif()

if(${CONFIG_BOOT_ENCRYPT_IMAGE_GENERATE_BASIC_KEY_PROVIDER})
# Need to generate single key provider source, from template.
# Take provided key, in form of a string and make it into C array, BOOT_AES_RAW_KEY_HEX_ARRAY,
# of byte size hex values.
set(BOOT_AES_RAW_KEY_HEX_STRING ${CONFIG_BOOT_ENCRYPT_IMAGE_EMBEDDED_RAW_KEY})
string(REGEX REPLACE "(..)" "0x\\1, " BOOT_AES_RAW_KEY_HEX_ARRAY "${BOOT_AES_RAW_KEY_HEX_STRING}")

# The tamplate references BOOT_AES_RAW_KEY_HEX_ARRAY where it expects the array to be substituted.
set(OUTPUT_BOOT_AES_RAW_KEY_SRC ${ZEPHYR_BINARY_DIR}/mcuboot_generated/builtin_aes_key_provider.c)
configure_file(templates/single_builtin_aes_key_provider.c.template ${OUTPUT_BOOT_AES_RAW_KEY_SRC} @ONLY)

# Add generated source file to build
zephyr_library_sources(${OUTPUT_BOOT_AES_RAW_KEY_SRC})
endif()
65 changes: 60 additions & 5 deletions boot/zephyr/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ config BOOT_ED25519_PSA_DEPENDENCIES

if BOOT_ENCRYPT_IMAGE

if !BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY

config BOOT_X25519_PSA_DEPENDENCIES
bool
select PSA_WANT_ALG_ECDH
Expand All @@ -112,6 +114,8 @@ config BOOT_X25519_PSA_DEPENDENCIES
to use with it; the others are used for shared key decryption
and derivation.

endif # !BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY

endif # BOOT_ENCRYPT_IMAGE

config BOOT_ECDSA_PSA_DEPENDENCIES
Expand Down Expand Up @@ -353,7 +357,7 @@ config BOOT_ED25519_PSA
select BOOT_IMG_HASH_ALG_SHA256_ALLOW
select BOOT_IMG_HASH_ALG_SHA512_ALLOW
select BOOT_ED25519_PSA_DEPENDENCIES
select BOOT_X25519_PSA_DEPENDENCIES if BOOT_ENCRYPT_IMAGE
select BOOT_X25519_PSA_DEPENDENCIES if BOOT_ENCRYPT_IMAGE_WITH_SHARED_KEY

endchoice

Expand Down Expand Up @@ -609,7 +613,8 @@ config BOOT_BOOTSTRAP

config BOOT_SWAP_SAVE_ENCTLV
bool "Save encrypted key TLVs instead of plaintext keys in swap metadata"
depends on BOOT_ENCRYPT_IMAGE
depends on BOOT_ENCRYPT_IMAGE_WITH_SHARED_KEY
depends on !BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY
help
If y, instead of saving the encrypted image keys in plaintext in the
swap resume metadata, save the encrypted image TLVs. This should be used
Expand Down Expand Up @@ -669,12 +674,62 @@ config BOOT_ENCRYPTION_SUPPORT
help
Hidden option used to check if image encryption is supported.

config BOOT_ENCRYPT_IMAGE
bool "Support for encrypted image updates"
depends on BOOT_ENCRYPTION_SUPPORT
config BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY
bool "Use key that is already on board with MCUboot"
depends on BOOT_ENCRYPT_IMAGE
help
The key is supposed to be either compiled in or on board.
User is responsible for providing boot_enc_take_key
function that will be able to retrieve the key.

if BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY

choice BOOT_ENCRYPT_IMAGE_EMBEDDED_KEY_PROVIDER
prompt "Embedded AES key provider"
default BOOT_ENCRYPT_IMAGE_GENERATE_BASIC_KEY_PROVIDER

config BOOT_ENCRYPT_IMAGE_GENERATE_BASIC_KEY_PROVIDER
bool "Generate basic boot_enc_take_key"
depends on BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY
help
Basic implementation of boot_enc_take_key will be implemented,
that will have single key built in, used for all images and
slots.

config BOOT_ENCRYPT_IMAGE_USE_CUSTOM_KEY_PROVIDER
bool "User provides source code for key provider"
help
User is required to provide implementation for
the boot_enc_take_key function.

endchoice # BOOT_ENCRYPT_IMAGE_EMBEDDED_KEY_PROVIDER

config BOOT_ENCRYPT_IMAGE_EMBEDDED_RAW_KEY
string "Hexadecimal string representing AES key"
depends on BOOT_ENCRYPT_IMAGE_GENERATE_BASIC_KEY_PROVIDER
help
AES key in form of hexadecimal string that will be used to
generate boot_enc_take_key function, returning the key for
decryption and encryption of image.
The key character length should be the double of expected
AES key length in bytes.

endif # BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY

config BOOT_ENCRYPT_IMAGE_WITH_SHARED_KEY
bool
default y if !BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY
depends on BOOT_ENCRYPT_IMAGE
select BOOT_ENCRYPT_RSA if BOOT_SIGNATURE_TYPE_RSA
select BOOT_ENCRYPT_EC256 if BOOT_SIGNATURE_TYPE_ECDSA_P256
select BOOT_ENCRYPT_X25519 if BOOT_SIGNATURE_TYPE_ED25519
help
Hidden option for default behaviour where AES encryption key
is derived from Public Key Cryptography key exchange.

config BOOT_ENCRYPT_IMAGE
bool "Support for encrypted image updates"
depends on BOOT_ENCRYPTION_SUPPORT
depends on !SINGLE_APPLICATION_SLOT || MCUBOOT_SERIAL
help
If y, images in the secondary slot can be encrypted and are decrypted
Expand Down
5 changes: 5 additions & 0 deletions boot/zephyr/include/mcuboot_config/mcuboot_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@
#define MCUBOOT_USE_TLV_ALLOW_LIST 1
#endif

#ifdef CONFIG_BOOT_ENCRYPT_IMAGE_WITH_EMBEDDED_KEY
#define MCUBOOT_ENC_IMAGES
#define MCUBOOT_EMBEDDED_ENC_KEY
#endif

#ifdef CONFIG_BOOT_ENCRYPT_RSA
#define MCUBOOT_ENC_IMAGES
#define MCUBOOT_ENCRYPT_RSA
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
*/

#include <stddef.h>
#include <stdbool.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>

#include "mcuboot_config/mcuboot_config.h"
#include "bootutil/enc_key.h"

int boot_take_enc_key(uint8_t *key, int image, int slot)
{
const unsigned char array[] = {
@BOOT_AES_RAW_KEY_HEX_ARRAY@
};

memcpy(key, array, sizeof(array));

return 0;
}
Loading
Loading