Skip to content

Commit e6c1976

Browse files
committed
Fixed wolfBoot_panic() visibility in lib + Fenrir comments
1 parent 857cd36 commit e6c1976

File tree

5 files changed

+93
-5
lines changed

5 files changed

+93
-5
lines changed

hal/library.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ void hal_prepare_boot(void)
8383
return;
8484
}
8585

86-
static void library_panic(void)
86+
void WEAKFUNCTION wolfBoot_panic(void)
8787
{
8888
wolfBoot_printf("wolfBoot: PANIC!\n");
8989
exit('P');
@@ -150,6 +150,10 @@ int wolfBoot_start(void)
150150
wolfBoot_printf("Firmware Valid\n");
151151

152152
#ifndef WOLFBOOT_SKIP_BOOT_VERIFY
153+
if ((os_image.hdr_ok != 1U) || (os_image.sha_ok != 1U) ||
154+
(os_image.signature_ok != 1U)) {
155+
wolfBoot_panic();
156+
}
153157
PART_SANITY_CHECK(&os_image);
154158
#endif
155159
do_boot((uint32_t*)os_image.fw_base);

src/image.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ static uint8_t digest[WOLFBOOT_SHA_DIGEST_SIZE] XALIGNED(4);
6161
int NOINLINEFUNCTION image_CT_compare(
6262
const uint8_t *expected, const uint8_t *actual, uint32_t len)
6363
{
64-
volatile uint8_t diff = 0;
64+
volatile uint32_t diff = 0U;
6565
uint32_t i;
6666

6767
for (i = 0; i < len; i++) {
68-
diff |= expected[i] ^ actual[i];
68+
diff |= (uint32_t)(expected[i] ^ actual[i]);
6969
}
7070

71-
return diff;
71+
return (diff != 0U) ? 1 : 0;
7272
}
7373

7474
#if defined(WOLFBOOT_CERT_CHAIN_VERIFY) && \

src/tpm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ int NOINLINEFUNCTION wolfBoot_constant_compare(const uint8_t* a, const uint8_t*
5454
diff |= (uint32_t)(a[i] ^ b[i]);
5555
}
5656

57-
return (int)diff;
57+
return (diff != 0U) ? 1 : 0;
5858
}
5959

6060
void wolfBoot_print_hexstr(const unsigned char* bin, unsigned long sz,

tools/unit-tests/unit-delta.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,31 @@ START_TEST(test_wb_diff_get_sector_size_rejects_values_above_16bit)
542542
}
543543
END_TEST
544544

545+
START_TEST(test_wb_diff_get_sector_size_accepts_16bit_limit)
546+
{
547+
const char *saved = getenv("WOLFBOOT_SECTOR_SIZE");
548+
char *saved_copy = saved ? strdup(saved) : NULL;
549+
int setenv_ok = 0;
550+
int sector_size = 0;
551+
552+
setenv_ok = (setenv("WOLFBOOT_SECTOR_SIZE", "0xFFFF", 1) == 0);
553+
if (setenv_ok) {
554+
sector_size = wb_diff_get_sector_size();
555+
}
556+
557+
if (saved_copy != NULL) {
558+
ck_assert_int_eq(setenv("WOLFBOOT_SECTOR_SIZE", saved_copy, 1), 0);
559+
free(saved_copy);
560+
}
561+
else {
562+
ck_assert_int_eq(unsetenv("WOLFBOOT_SECTOR_SIZE"), 0);
563+
}
564+
565+
ck_assert(setenv_ok);
566+
ck_assert_int_eq(sector_size, 0xFFFF);
567+
}
568+
END_TEST
569+
545570
START_TEST(test_wb_patch_and_diff_size_changing_update)
546571
{
547572
uint8_t src_a[2048];
@@ -601,6 +626,7 @@ Suite *patch_diff_suite(void)
601626
tcase_add_test(tc_wolfboot_delta, test_wb_patch_and_diff_completely_different_images);
602627
tcase_add_test(tc_wolfboot_delta, test_wb_patch_and_diff_all_escape_images);
603628
tcase_add_test(tc_wolfboot_delta, test_wb_patch_and_diff_multi_sector_images);
629+
tcase_add_test(tc_wolfboot_delta, test_wb_diff_get_sector_size_accepts_16bit_limit);
604630
tcase_add_test(tc_wolfboot_delta, test_wb_diff_get_sector_size_rejects_values_above_16bit);
605631
tcase_add_test(tc_wolfboot_delta, test_wb_patch_and_diff_size_changing_update);
606632
tcase_add_test(tc_wolfboot_delta, test_wb_patch_and_diff_single_byte_difference);

tools/unit-tests/unit-update-flash.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,24 @@ static uint16_t host_to_img_u16(uint16_t val)
8585
#endif
8686
}
8787

88+
static void ext_flash_write_le16(uintptr_t addr, uint16_t val)
89+
{
90+
uint8_t le[2];
91+
le[0] = (uint8_t)(val & 0xFFu);
92+
le[1] = (uint8_t)((val >> 8) & 0xFFu);
93+
ext_flash_write(addr, le, sizeof(le));
94+
}
95+
96+
static void ext_flash_write_le32(uintptr_t addr, uint32_t val)
97+
{
98+
uint8_t le[4];
99+
le[0] = (uint8_t)(val & 0xFFu);
100+
le[1] = (uint8_t)((val >> 8) & 0xFFu);
101+
le[2] = (uint8_t)((val >> 16) & 0xFFu);
102+
le[3] = (uint8_t)((val >> 24) & 0xFFu);
103+
ext_flash_write(addr, le, sizeof(le));
104+
}
105+
88106
#ifdef DELTA_UPDATES
89107
static int mock_wb_patch_init_calls = 0;
90108
static uint8_t *mock_wb_patch_init_patch = NULL;
@@ -1063,6 +1081,44 @@ START_TEST (test_get_total_size_preserves_uint32_range)
10631081
}
10641082
END_TEST
10651083

1084+
START_TEST (test_diffbase_version_reads_from_little_endian_bytes)
1085+
{
1086+
uint32_t magic = WOLFBOOT_MAGIC;
1087+
uint16_t img_type = HDR_IMG_TYPE_AUTH | HDR_IMG_TYPE_APP;
1088+
uint32_t version = 0x01020304;
1089+
uint32_t delta_base = 0x55667788;
1090+
uint32_t tag;
1091+
1092+
reset_mock_stats();
1093+
prepare_flash();
1094+
1095+
ext_flash_unlock();
1096+
ext_flash_write(WOLFBOOT_PARTITION_UPDATE_ADDRESS,
1097+
(const uint8_t *)&magic, sizeof(magic));
1098+
ext_flash_write_le32(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 4, TEST_SIZE_SMALL);
1099+
1100+
tag = (4u << 16) | HDR_VERSION;
1101+
ext_flash_write_le32(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 8, tag);
1102+
ext_flash_write_le32(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 12, version);
1103+
1104+
tag = (2u << 16) | HDR_IMG_TYPE;
1105+
ext_flash_write_le32(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 16, tag);
1106+
ext_flash_write_le16(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 20, img_type);
1107+
1108+
tag = (4u << 16) | HDR_IMG_DELTA_BASE;
1109+
ext_flash_write_le32(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 24, tag);
1110+
ext_flash_write_le32(WOLFBOOT_PARTITION_UPDATE_ADDRESS + 28, delta_base);
1111+
ext_flash_lock();
1112+
1113+
ck_assert_uint_eq(wolfBoot_get_image_version(PART_UPDATE), version);
1114+
ck_assert_uint_eq(wolfBoot_get_diffbase_version(PART_UPDATE), delta_base);
1115+
ck_assert_uint_eq(wolfBoot_get_blob_diffbase_version(
1116+
(uint8_t *)(uintptr_t)WOLFBOOT_PARTITION_UPDATE_ADDRESS), delta_base);
1117+
1118+
cleanup_flash();
1119+
}
1120+
END_TEST
1121+
10661122
#ifdef DELTA_UPDATES
10671123
START_TEST (test_delta_zero_size_valid_header_rejected_without_recovery_heuristic)
10681124
{
@@ -1187,6 +1243,7 @@ START_TEST (test_delta_base_version_match_accepts)
11871243
ret = wolfBoot_delta_update(&boot, &update, &swap, 0, 0);
11881244
ck_assert_int_eq(ret, 0);
11891245
ck_assert_int_eq(mock_wb_patch_init_calls, 1);
1246+
ck_assert_ptr_eq(mock_wb_patch_init_patch, update.hdr + IMAGE_HEADER_SIZE);
11901247
ck_assert_uint_eq(mock_wb_patch_init_psz, delta_sz);
11911248

11921249
cleanup_flash();
@@ -1350,6 +1407,7 @@ Suite *wolfboot_suite(void)
13501407
tcase_add_test(empty_boot_but_update_sha_corrupted_denied, test_empty_boot_but_update_sha_corrupted_denied);
13511408
tcase_add_test(swap_resume, test_swap_resume_noop);
13521409
tcase_add_test(diffbase_version, test_diffbase_version_reads);
1410+
tcase_add_test(diffbase_version, test_diffbase_version_reads_from_little_endian_bytes);
13531411
tcase_add_test(get_total_size, test_get_total_size_preserves_uint32_range);
13541412
tcase_add_test(boot_success, test_boot_success_sets_state);
13551413
#ifdef DELTA_UPDATES

0 commit comments

Comments
 (0)