diff --git a/include/image.h b/include/image.h index 7241df15..2d9aefa1 100644 --- a/include/image.h +++ b/include/image.h @@ -292,6 +292,55 @@ static void NOINLINEFUNCTION wolfBoot_image_clear_sha_ok( asm volatile("mov r2, #0":::"r2"); \ asm volatile("mov r2, #0":::"r2"); \ asm volatile("mov r2, #0":::"r2"); \ + /* Loading ~(sha_ok) flag, verifying */ \ + asm volatile("mov r2, %0" ::"r"((p)->not_sha_ok):"r2"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("bne ."); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("bne .-4"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("bne .-8"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("cmp r2, #0xFFFFFFFE":::"cc"); \ + asm volatile("bne .-12"); \ + /* Redundant set of r2=0 */ \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + /* Loading canary value, verifying */ \ + asm volatile("mov r2, %0" ::"r"((p)->canary_FEEDCAFE):"r2"); \ + asm volatile("mov r0, %0" ::"r"(0xFEEDCAFE):"r0"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("bne ."); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("bne .-4"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("bne .-8"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("cmp r2, r0":::"cc"); \ + asm volatile("bne .-12"); \ + /* Redundant set of r2=0 */ \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ + asm volatile("mov r2, #0":::"r2"); \ /* Loading signature_ok flag, verifying */ \ asm volatile("mov r2, %0" ::"r"((p)->signature_ok):"r2"); \ asm volatile("cmp r2, #1":::"cc"); \ diff --git a/src/image.c b/src/image.c index d6019f53..97841b66 100644 --- a/src/image.c +++ b/src/image.c @@ -1641,6 +1641,12 @@ int wolfBoot_verify_integrity(struct wolfBoot_image *img) { uint8_t *stored_sha; uint16_t stored_sha_len; + /* Reset any cached integrity state up-front, so that a stale sha_ok (and + * its complement/canary) left over from a previous verification of a + * re-used image cannot survive a failed comparison and produce a + * false-positive SHA_OK() result below. */ + img->sha_hash = NULL; + wolfBoot_image_clear_sha_ok(img); stored_sha_len = get_header(img, WOLFBOOT_SHA_HDR, &stored_sha); if (stored_sha_len != WOLFBOOT_SHA_DIGEST_SIZE) return -1;