From 3011760996d0436ce62ff006944dd37a323cf5f0 Mon Sep 17 00:00:00 2001 From: Michael Eskowitz Date: Wed, 2 Jul 2025 09:35:41 -0400 Subject: [PATCH 1/2] scripts: imgtool: Add script to combine multiple image as single MCUBoot multi image support mode requires each image be procedded individually that requires multiple signature check during boot. If there be 4 imageis it requires 4 times signature validatation. This feature increase boot time. Depend on the project requirement long boot time may not be accepted. To provide a solution for this case we propose to - Generate each image as regular mcuboot format - Concatanate them and re generate a main mcuboot image. As below ------------------------- | Header | ------------------------- | Image-1 | | (Header+Data+Footer) | ------------------------- | Image-2 | | (Header+Data+Footer) | ------------------------- | ..... | ------------------------- | Footer | ------------------------- During boot time if top level image be validated sub image can be just copied to the target location without to recheck them. There will be two commit to implement this feature 1- Add a script that combine images 2- Update mcuboot source code to process subimages This commit is for #1, it adds a script which called as combine_images.py. Any imgtool parameters can be passed to the script It will directly pass them to the imgtool. Usage: python combine_images.py --config combine_images.yaml --imgtool imgtool --output combine_images.yaml file is added as reference file it need to be updated as per of the project need. Signed-off-by: Sadik Ozer Signed-off-by: Michael Eskowitz --- docs/combine_images.md | 58 +++++++++++++++ docs/images/AppPack.png | Bin 0 -> 80307 bytes docs/index.md | 1 + scripts/combine_images.py | 137 ++++++++++++++++++++++++++++++++++++ scripts/combine_images.yaml | 36 ++++++++++ 5 files changed, 232 insertions(+) create mode 100644 docs/combine_images.md create mode 100644 docs/images/AppPack.png create mode 100644 scripts/combine_images.py create mode 100644 scripts/combine_images.yaml diff --git a/docs/combine_images.md b/docs/combine_images.md new file mode 100644 index 0000000000..cba9712357 --- /dev/null +++ b/docs/combine_images.md @@ -0,0 +1,58 @@ +# [combine_images Extensions to MCUboot for Multi-Core SoC Image Distribution](#combine_images_for_multi-core_SoC_image_distribution) + +In multi-core system-on-chip based platforms, each processor core typically runs separate firmware +as every core may have distinct responsibilities. Packaging and distributing firmware images for +these systems presents a challenge as multiple independent images must be bundled, versioned, and +delivered as a single update while preserving the ability to secure and authenticate each image. The +combine_images extensions to MCUboot allow for the bundling and distribution of multiple images +together as an MCUboot AppPack. + +# [AppPack Structure](#apppack_structure) + +The purpose of this method to handle multiple images in a single image pack is to decrease the number +of signature checks required during bootup. An example AppPack layout is shown in the image below. +This example contains the standard MCUboot header and trailer surrounding a number of images. Each +of the enclosed images may itself be an AppPack. + +![AppPack Structure](./images/AppPack.png) + +# [AppPack Generation](#apppack_generation) + +## [combine_images.py](#combine_images.py) + +In order to generate an AppPack you will need to call the combine_images.py script. + + Usage: python combine_images.py --config [yaml file] --imgtool [path to imgtool] --output [output directory] + + Options: + --config [yaml file] yaml file specifying content of the AppPack to + be generated. The yaml file will specify input + binaries, output file names and the path to any + signing keys. + --imgtool [path to imgtool] Path to ImgTool which can be either a python file + or binary. The provided ImgTool is called to + package binaries and create an AppPack structure + defined according to the specified yaml file. + --output [output directory] Path to an directory which will be used to store + any intermediary file products and the final + AppPack itself. + +## [combine_images.yaml](#combine_images.yaml) + +The combine_images.py script requires a yaml config file to define the layout of the desired AppPack. +The structure of the yaml file is shown below. In this example there is a top level AppPack which +may or may not contain an inputfile. The top level AppPack may also contain some number of nested +AppPacks which can contain additional AppPacks itself. + + [AppPack Name]_pack: + # Optional: top-level infline can be omitted if not needed + infile: [filename] + + # Required + outfile: [filename] + params: [imgtool parameter string] + + [Nested AppPack Name]_pack: + infile: [filename] + outfile: [filename] + params: [imgtool parameter string] diff --git a/docs/images/AppPack.png b/docs/images/AppPack.png new file mode 100644 index 0000000000000000000000000000000000000000..4083faf475d2272034c4a87491ca6928f5736b4a GIT binary patch literal 80307 zcmZr&2Ut_t*2S@l0#=l+sGtZ)?;xV0C`|~xs7P-@=q(5;AOb2NHB@P#L`vuZktSVA z2ps`w2~~Q{e{P5~@6G%3ee(@UOzu5rpS{;wd+i&bq9lLf7{f6tDykC??%#P#MRibv zifaFhBZt7>)G+bw2mjj#e=L8SDyNlc8vNmasjQ+b6;*Bs_4d<);Lk^2+}DOvQ8D{L z|LqGIUo@toBBeaIBdhLWFf&N)9pt!Mzu5N07^ZPOIqB?UcHN#!0Y|Pegee4EDl#j| zOKmrPklPWKj-3i=e|`IPm&)g7btz#TiX{;|_SbMa!qzR@@x$|yZBYWIaZleoZH2dP zVLT_dw!Maj;S(zEtalqC1u+xu>B{^gCyc+2IfcJlAN_wA>AxOY;vZjsVheF%Q0 zHy>Bw>5j|M*PV<akl-Dh$MeV9z^EE*=!n*(MGH%*!&b2;Mb1x#DJ-k#<93#TV8=KTHHxCqUOSs}AHFFb3dKHYj^rD=b3SG)A#rbwZe814?YCX|=}X%u zp=;)6vz|i#Y%oF``m)tq*ngPaUP)DB0?p0Yw zym{8Ww*%O_bO%0|ofOogY`a{|Kr!KW6R)%UYwX&Pdtbh3Na~}gq-Y^alqTB1<{;In zrhyXp%3RsJJtZ7ZAh;FN3)WidJL4wgCN3(PyalI~KwvuE0m-*%54^4hXS zIuE(7_Gn?3RQlI3ZOj!^}Shie+NZ_QV>{n?c})6>(189Hf7 z%!={SQUmHj(SqhlGP{c*tHnAPi^2?smj06Q9UUu&RF;`d`qMlb**X}9{@bL|fV;ky zVwODJpWBuuMam{;d2QUY{o5+Xuj!lP_0st)Jqg0R9oDKL^ub|QOV>+Pqe&aeS0s4( zd7?h^#=>V@;}yGVy)4UL$P9Do9+Ot)J?7;_SbR)-$>~ps)de$W78D3FJ9eo$rCE&C z1q~`xaKw8&78!C$9>i@fcPjUb+16VGF$m2#YM-pEh;|6jF}6}q3t$v1TnJ~&sx697 zt$-7za`5!&$}K-)oehE}G>O}UL@^n}44;lB9)9?wuylt)#G}n3uOfVa4DXLoS;ql| z&$SF5I)+&Fkw^OWuAV!s$naG{W_aMrL>)q+z7ig{^=z_aQZrDRxA8%Q*+RT-21;y5 zQahsHLUz#PYI~*I8?T=CwtgCwH(_JLJyRZ~N{xDw8rg3>RBA#GQlFdhrIkL?6%3%MkfOiY_rX8X(L>a6ADCC1DlqexpEyRB8NsC1p7 zu>mTOUl=t;%I@qD-X+qf;bE0xjt-NSOVvR*UJiX!H?8=jqLwXV-j%IwMxjDnirdV) zky4V#+VtEEOZ4wuDRGiWJ279V*ha<}>6JDV*{_>+M{1~z7_VAsvo_s=h|iFqZ&i&~ z!)}f)xCTzFsGcx2scf5HYOp{o?(cKixSWkh51-#uJl#j^@Do9`G6yaz#1po>B zyjF0U`|(=iph7_}rdP4Cu`lG7bL&~S@-i&c(^X`5w$|3LcHxU4&GZ=t3Oxom(v`AMkgp(Ocf!2_B9`)mMJfG3dS

LmCux764xlt)igd58QEgjfq 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 4b36dc389a..374ef9e5a1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -40,6 +40,7 @@ The MCUboot documentation is composed of the following pages: - [Bootloader design](design.md) - [Encrypted images](encrypted_images.md) - [imgtool](imgtool.md) - image signing and key management +- [Combine Images](combine_images.md) - Combine images feature - [ECDSA](ecdsa.md) - information about ECDSA signature formats - [Serial Recovery](serial_recovery.md) - MCUmgr as the serial recovery protocol - Usage instructions: diff --git a/scripts/combine_images.py b/scripts/combine_images.py new file mode 100644 index 0000000000..e5523046a9 --- /dev/null +++ b/scripts/combine_images.py @@ -0,0 +1,137 @@ +#! /usr/bin/env python3 +# +# Copyright (C) 2025 Analog Devices, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import pathlib +import subprocess +import sys + +import yaml +import shutil + + +def main(): + global img_tool + global output_dir + global config_path + + parser = argparse.ArgumentParser(description="Create application package", allow_abbrev=False) + parser.add_argument('--config', help="The path to config yaml file", required=True) + parser.add_argument('--imgtool', help="The path to ImgTool", required=True) + parser.add_argument('--output', help="Output directory", required=True) + + args = parser.parse_args() + + if not os.path.isfile(args.config): + print(f"Error: The config file '{args.config}' does not exist") + return + + config_path = os.path.dirname(os.path.abspath(args.config)) + print(f"config_path: {config_path}") + + with open(args.config) as config_file: + config = yaml.safe_load(config_file) + + img_tool = args.imgtool + if img_tool.endswith('.py'): + if not os.path.exists(img_tool): # Is python file exist? + print(f"Error: The '{img_tool}' not found") + return + else: + if not shutil.which(img_tool): # Is binary file exist? + print(f"Error: The '{img_tool}' not found in the path") + return + + + output_dir = args.output + os.makedirs(output_dir, exist_ok=True) + + parse_app_pack(config, None) + + print(f"\nCreated {package_name}") + + +def verify_file_exists(filename): + filepath = pathlib.Path(filename) + + if not filepath.exists(): + print("ERROR: File " + filename + " not found") + sys.exit(1) + + +def parse_app_pack(app_pack, name): + params = None + image = [] + global package_name + + for key in app_pack: + if key.endswith("_pack"): + imagename = parse_app_pack(app_pack[key], name) + image += [imagename] + if key.lower() == "params": + params = app_pack[key] + if key.lower() == "infile": + if app_pack[key] != "": + image_path = os.path.join(config_path, app_pack[key]) + verify_file_exists(image_path) + image += [image_path] + if key.lower() == "outfile": + name = app_pack[key] + + # Exit if params or image are not specified + if (params is None) or (image is None): + return None + + cmd = [] + if img_tool.endswith('.py'): + cmd += [sys.executable] + + cmd += [img_tool] + cmd += ["sign"] + cmd += params.split() + + # Combine images for parent package (top level package) + if len(image) > 1: + combined_images = os.path.join(output_dir, "combined.bin") + + with open(combined_images, 'wb') as outfile: + for fname in image: + with open(fname, 'rb') as infile: + outfile.write(infile.read()) + infile.close() + outfile.close() + + image_input = combined_images + else: + image_input = image[0] + + image_output = os.path.join(output_dir, name) + + cmd += [image_input] + cmd += [image_output] + + print(f'Calling imgtool to generate file {image_output}') + package_name = image_output + subprocess.run(cmd) + + return image_output + + +if __name__ == "__main__": + main() diff --git a/scripts/combine_images.yaml b/scripts/combine_images.yaml new file mode 100644 index 0000000000..77f865f8e7 --- /dev/null +++ b/scripts/combine_images.yaml @@ -0,0 +1,36 @@ +# +# Copyright (C) 2025 Analog Devices, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +img0_pack: + outfile: combined_signed.bin + params: "--key ../root-rsa-2048.pem --header-size 0x20 --align 4 --load-addr 0x20080000 --pad-header --version 1.0.0 --slot-size 0x100000" + + img1_pack: + infile: img1.bin + outfile: img1_signed.bin + params: "--key ../root-rsa-2048.pem --header-size 0x20 --align 4 --load-addr 0x20010000 --pad-header --version 1.0.0 --slot-size 0x10000" + + img2_pack: + infile: img2.bin + outfile: img2_signed.bin + params: "--key ../root-rsa-2048.pem --header-size 0x20 --align 4 --load-addr 0x20020000 --pad-header --version 1.0.0 --slot-size 0x10000" + + img3_pack: + infile: img3.bin + outfile: img3_signed.bin + params: "--key ../root-rsa-2048.pem --header-size 0x20 --align 4 --load-addr 0x20030000 --pad-header --version 1.0.0 --slot-size 0x10000" From c19b1ff53c32319708da46dd0bfa3bfccadf97db Mon Sep 17 00:00:00 2001 From: Sadik Ozer Date: Wed, 24 Sep 2025 16:34:57 +0300 Subject: [PATCH 2/2] boot: bootutils: Add image in image support This is source code update to provide images in images feature support. As mentioned in prev commit: MCUBoot multi image support mode requires each image be procedded individually that requires multiple signature check during boot. If there be 4 imageis it requires 4 times signature validatation. This feature increase boot time. Depend on the project requirement long boot time may not be accapted. In this commit the loader.c file update to search subimages and copy them in the related load_address. By this solution: - Image update will be handled as regularly - Signature check will be executed for combined image - Boot time will be decreased This featue only support for (BOOT_IMAGE_NUMBER == 1 && MCUBOOT_RAM_LOAD) case. Signed-off-by: Sadik Ozer --- boot/bootutil/src/loader.c | 137 +++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/boot/bootutil/src/loader.c b/boot/bootutil/src/loader.c index 9769428b4d..07b6c93475 100644 --- a/boot/bootutil/src/loader.c +++ b/boot/bootutil/src/loader.c @@ -5,6 +5,7 @@ * Copyright (c) 2016-2019 JUUL Labs * Copyright (c) 2019-2023 Arm Limited * Copyright (c) 2024-2025 Nordic Semiconductor ASA + * Portions Copyright (c) 2025 Analog Devices Inc. * * Original license: * @@ -2990,6 +2991,138 @@ boot_update_hw_rollback_protection(struct boot_loader_state *state) #endif } + +#if (BOOT_IMAGE_NUMBER == 1) && defined(MCUBOOT_RAM_LOAD) + +static int +read_image_info(uint32_t addr, struct image_header *hdr, + uint32_t *total_size, uint32_t *footer_size) +{ + struct image_tlv_info info; + uint32_t off; + uint32_t protect_tlv_size; + + memcpy(hdr, (unsigned char *)addr, sizeof(struct image_header)); + if (hdr->ih_magic != IMAGE_MAGIC) { + return BOOT_EBADIMAGE; + } + + off = BOOT_TLV_OFF(hdr); + + memcpy(&info, (unsigned char *)(addr + off), sizeof(info)); + + protect_tlv_size = hdr->ih_protect_tlv_size; + if (info.it_magic == IMAGE_TLV_PROT_INFO_MAGIC) { + if (protect_tlv_size != info.it_tlv_tot) { + return BOOT_EBADIMAGE; + } + + memcpy(&info, (unsigned char *)(addr + off + info.it_tlv_tot), sizeof(info)); + } else if (protect_tlv_size != 0) { + return BOOT_EBADIMAGE; + } + + if (info.it_magic != IMAGE_TLV_INFO_MAGIC) { + return BOOT_EBADIMAGE; + } + + *footer_size = protect_tlv_size + info.it_tlv_tot; + *total_size = off + *footer_size; + + return 0; +} + +/** + * Check the main image and find sub images, then copy them to the target addr. + * Set boot image address with the first image that found in the list. + * + * ------------------------- + * | Header | + * ------------------------- + * | SubImage (optional) | + * | (Header+Data+Footer) | + * ------------------------- + * | SubImage (optional) | + * | (Header+Data+Footer) | + * ------------------------- + * | ..... | + * ------------------------- + * | Footer | + * ------------------------- + * + * @param addr Image start address + * @param rsp On success, indicates how booting should occur. + * + * @return 0 on success; nonzero on failure. + */ +static int +process_sub_images(uint32_t addr, struct boot_rsp *rsp) +{ + int rc = 0; + bool first_subimage = true; + uint32_t main_image_size; + struct image_header hdr; + uint32_t img_total_size; + uint32_t img_footer_size; + uint32_t subimg_count = 0; + + /* read main image info */ + rc = read_image_info(addr, &hdr, &img_total_size, &img_footer_size); + if (rc != 0) { + /* No valid image header, main image format not correct. */ + BOOT_LOG_INF("Image header read failed."); + return rc; + } + + /* Set main image size */ + main_image_size = img_total_size; + /* Decrease image header size and footer size */ + main_image_size -= (hdr.ih_hdr_size + img_footer_size); + + /* Pass image header */ + addr += hdr.ih_hdr_size; + + while (main_image_size) { + /* read sub image info */ + rc = read_image_info(addr, &hdr, &img_total_size, &img_footer_size); + if (rc != 0) { + /* No valid sub-image header */ + if (subimg_count == 0) { + /* it is single image return 0 */ + rc = 0; + } else { + BOOT_LOG_INF("Sub image header read failed."); + } + break; + } + + /* copy image to target addr */ + if (hdr.ih_flags & IMAGE_F_RAM_LOAD) { + /* + * For heterogenous system that have multi core on same IC. + * Assuming main core that execute MCUBoot able to access other cores ITCM/DTCM + */ + memcpy((unsigned char *)(hdr.ih_load_addr), (unsigned char *)addr, img_total_size); + BOOT_LOG_INF("Copying image from 0x%x to 0x%x is succeeded.", addr, hdr.ih_load_addr); + } + + /* Execute first sub image */ + if ((first_subimage) && !(hdr.ih_flags & IMAGE_F_NON_BOOTABLE)) { + first_subimage = false; + rsp->br_hdr = (struct image_header *)hdr.ih_load_addr; + } + + /* go next image */ + main_image_size -= img_total_size; + addr += img_total_size; + + ++subimg_count; /* Increase number of sub image */ + } + + return rc; +} +#endif // #if (BOOT_IMAGE_NUMBER == 1) && defined(MCUBOOT_RAM_LOAD) + fih_ret context_boot_go(struct boot_loader_state *state, struct boot_rsp *rsp) { @@ -3055,6 +3188,10 @@ context_boot_go(struct boot_loader_state *state, struct boot_rsp *rsp) fill_rsp(state, rsp); +#if (BOOT_IMAGE_NUMBER == 1) && defined(MCUBOOT_RAM_LOAD) + rc = process_sub_images(rsp->br_hdr->ih_load_addr, rsp); +#endif + close: boot_close_all_flash_areas(state);