Skip to content

Commit a2d630f

Browse files
committed
Add some checking if partition size is too large
1 parent bc4494f commit a2d630f

File tree

6 files changed

+63
-6
lines changed

6 files changed

+63
-6
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ endif
202202

203203
# Environment variables for sign tool
204204
SIGN_ENV=IMAGE_HEADER_SIZE=$(IMAGE_HEADER_SIZE) \
205+
WOLFBOOT_PARTITION_SIZE=$(WOLFBOOT_PARTITION_SIZE) \
205206
WOLFBOOT_SECTOR_SIZE=$(WOLFBOOT_SECTOR_SIZE) \
206207
ML_DSA_LEVEL=$(ML_DSA_LEVEL) \
207208
IMAGE_SIGNATURE_SIZE=$(IMAGE_SIGNATURE_SIZE) \

src/update_flash.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -639,11 +639,13 @@ static int wolfBoot_delta_update(struct wolfBoot_image *boot,
639639
# endif
640640
#endif
641641

642-
/* Reserve space for two sectors in case of NVM_FLASH_WRITEONCE, for redundancy */
642+
/* Max firmware size: partition must hold header + fw + trailer sector(s) */
643643
#ifndef NVM_FLASH_WRITEONCE
644-
#define MAX_UPDATE_SIZE (size_t)((WOLFBOOT_PARTITION_SIZE - WOLFBOOT_SECTOR_SIZE))
644+
#define MAX_UPDATE_SIZE (size_t)((WOLFBOOT_PARTITION_SIZE - \
645+
IMAGE_HEADER_SIZE - WOLFBOOT_SECTOR_SIZE))
645646
#else
646-
#define MAX_UPDATE_SIZE (size_t)((WOLFBOOT_PARTITION_SIZE - (2 *WOLFBOOT_SECTOR_SIZE)))
647+
#define MAX_UPDATE_SIZE (size_t)((WOLFBOOT_PARTITION_SIZE - \
648+
IMAGE_HEADER_SIZE - (2 * WOLFBOOT_SECTOR_SIZE)))
647649
#endif
648650

649651
static int wolfBoot_get_total_size(struct wolfBoot_image* boot,

tools/keytools/sign.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,6 +1739,30 @@ static int make_header_ex(int is_diff, uint8_t *pubkey, uint32_t pubkey_sz,
17391739
header[header_idx++] = 0xFF;
17401740
}
17411741

1742+
/* Check if signed image fits in partition */
1743+
{
1744+
const char *env_psize = getenv("WOLFBOOT_PARTITION_SIZE");
1745+
const char *env_ssize = getenv("WOLFBOOT_SECTOR_SIZE");
1746+
if (env_psize) {
1747+
uint32_t partition_sz = (uint32_t)strtol(env_psize, NULL, 0);
1748+
uint32_t sector_sz = env_ssize ?
1749+
(uint32_t)strtol(env_ssize, NULL, 0) : 0;
1750+
uint32_t total_img_sz = CMD.header_sz + image_sz;
1751+
/* Only subtract sector for trailer when sector < partition.
1752+
* When sector >= partition (e.g. update_ram targets), the
1753+
* entire partition is available for the image. */
1754+
uint32_t max_img_sz = (sector_sz < partition_sz) ?
1755+
(partition_sz - sector_sz) : partition_sz;
1756+
if (total_img_sz > max_img_sz) {
1757+
printf("Error: Image size %u (header %u + firmware %u) "
1758+
"exceeds max %u (partition %u - sector %u)\n",
1759+
total_img_sz, CMD.header_sz, image_sz,
1760+
max_img_sz, partition_sz, sector_sz);
1761+
goto failure;
1762+
}
1763+
}
1764+
}
1765+
17421766
/* Create output image */
17431767
f = fopen(outfile, "w+b");
17441768
if (f == NULL) {

tools/keytools/sign.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
HDR_IMG_TYPE_APP = 0x0001
7373

7474
WOLFBOOT_HEADER_SIZE = 256
75+
WOLFBOOT_PARTITION_SIZE = 0
76+
WOLFBOOT_SECTOR_SIZE = 0
7577

7678
sign="auto"
7779
self_update=False
@@ -386,6 +388,12 @@ def make_header(image_file, fw_version, extra_fields=[]):
386388
val=l.split('=')[1].rstrip('\n')
387389
WOLFBOOT_HEADER_SIZE = int(val,0)
388390
print("IMAGE_HEADER_SIZE (from .config): " + str(WOLFBOOT_HEADER_SIZE))
391+
if "WOLFBOOT_PARTITION_SIZE" in l and "ADDRESS" not in l:
392+
val=l.split('=')[1].rstrip('\n')
393+
WOLFBOOT_PARTITION_SIZE = int(val,0)
394+
if "WOLFBOOT_SECTOR_SIZE" in l:
395+
val=l.split('=')[1].rstrip('\n')
396+
WOLFBOOT_SECTOR_SIZE = int(val,0)
389397

390398
l = cfile.readline()
391399
cfile.close()
@@ -704,6 +712,24 @@ def make_header(image_file, fw_version, extra_fields=[]):
704712
infile.close()
705713
outfile.close()
706714

715+
# Check if signed image fits in partition
716+
if WOLFBOOT_PARTITION_SIZE > 0:
717+
img_size = os.path.getsize(image_file)
718+
total_img_sz = WOLFBOOT_HEADER_SIZE + img_size
719+
# Only subtract sector for trailer when sector < partition.
720+
# When sector >= partition (e.g. update_ram targets), the
721+
# entire partition is available for the image.
722+
if WOLFBOOT_SECTOR_SIZE < WOLFBOOT_PARTITION_SIZE:
723+
max_img_sz = WOLFBOOT_PARTITION_SIZE - WOLFBOOT_SECTOR_SIZE
724+
else:
725+
max_img_sz = WOLFBOOT_PARTITION_SIZE
726+
if total_img_sz > max_img_sz:
727+
print("Error: Image size %d (header %d + firmware %d) "
728+
"exceeds max %d (partition %d - sector %d)" %
729+
(total_img_sz, WOLFBOOT_HEADER_SIZE, img_size,
730+
max_img_sz, WOLFBOOT_PARTITION_SIZE, WOLFBOOT_SECTOR_SIZE))
731+
sys.exit(1)
732+
707733
if (encrypt):
708734
delta_align=64
709735
else:

tools/scripts/va416x0/build_test.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ get_config_value() {
3838
# Extract values from .config
3939
BOOT_ADDRESS=$(get_config_value "WOLFBOOT_PARTITION_BOOT_ADDRESS")
4040
UPDATE_ADDRESS=$(get_config_value "WOLFBOOT_PARTITION_UPDATE_ADDRESS")
41+
PARTITION_SIZE=$(get_config_value "WOLFBOOT_PARTITION_SIZE")
42+
SECTOR_SIZE=$(get_config_value "WOLFBOOT_SECTOR_SIZE")
4143
IMAGE_HEADER_SIZE=$(get_config_value "IMAGE_HEADER_SIZE")
4244
SIGN=$(get_config_value "SIGN")
4345
HASH=$(get_config_value "HASH")
@@ -49,7 +51,10 @@ make clean && make wolfboot.bin && make test-app/image.bin
4951

5052
# Function to sign image
5153
sign_image() {
52-
IMAGE_HEADER_SIZE=${IMAGE_HEADER_SIZE} ./tools/keytools/sign ${SIGN_ARG} ${HASH_ARG} test-app/image.bin wolfboot_signing_private_key.der "$1"
54+
IMAGE_HEADER_SIZE=${IMAGE_HEADER_SIZE} \
55+
WOLFBOOT_PARTITION_SIZE=${PARTITION_SIZE} \
56+
WOLFBOOT_SECTOR_SIZE=${SECTOR_SIZE} \
57+
./tools/keytools/sign ${SIGN_ARG} ${HASH_ARG} test-app/image.bin wolfboot_signing_private_key.der "$1"
5358
}
5459

5560
# Function to print summary
@@ -74,7 +79,6 @@ if [ "$MODE" = "clean" ]; then
7479
${JLINK} -CommanderScript tools/scripts/va416x0/flash_va416xx.jlink
7580
print_summary
7681
else
77-
PARTITION_SIZE=$(get_config_value "WOLFBOOT_PARTITION_SIZE")
7882
TRIGGER_ADDRESS=$(printf "0x%X" $((${UPDATE_ADDRESS} + ${PARTITION_SIZE} - 5)))
7983
PREV_VERSION=$((${VERSION} - 1))
8084
sign_image ${PREV_VERSION} && sign_image ${VERSION}

tools/test.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,5 +1048,5 @@ test-size-all:
10481048
LIMIT=8560 NO_ARM_ASM=1
10491049
make keysclean
10501050
make clean
1051-
make test-size SIGN=ML_DSA ML_DSA_LEVEL=2 LIMIT=19354 \
1051+
make test-size SIGN=ML_DSA ML_DSA_LEVEL=2 LIMIT=19362 \
10521052
IMAGE_SIGNATURE_SIZE=2420 IMAGE_HEADER_SIZE?=8192

0 commit comments

Comments
 (0)