Skip to content

Commit d9713d7

Browse files
committed
[ARMORED] Improved redundancy of verification
1 parent 385e13e commit d9713d7

3 files changed

Lines changed: 187 additions & 108 deletions

File tree

include/image.h

Lines changed: 144 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -419,15 +419,27 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
419419
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
420420
asm volatile("cmp r2, #1":::"cc"); \
421421
asm volatile("bne nope"); \
422+
asm volatile("mvn r3, r2":::"r3"); \
423+
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
424+
asm volatile("bne nope"); \
422425
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
423426
asm volatile("cmp r2, #1":::"cc"); \
424427
asm volatile("bne nope"); \
428+
asm volatile("mvn r3, r2":::"r3"); \
429+
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
430+
asm volatile("bne nope"); \
425431
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
426432
asm volatile("cmp r2, #1":::"cc"); \
427433
asm volatile("bne nope"); \
434+
asm volatile("mvn r3, r2":::"r3"); \
435+
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
436+
asm volatile("bne nope"); \
428437
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
429438
asm volatile("cmp r2, #1":::"cc"); \
430439
asm volatile("bne nope"); \
440+
asm volatile("mvn r3, r2":::"r3"); \
441+
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
442+
asm volatile("bne nope"); \
431443
/* Confirm that the signature is OK */ \
432444
wolfBoot_image_confirm_signature_ok(img); \
433445
asm volatile("nope:"); \
@@ -460,15 +472,27 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
460472
"ldr r2, [%0]\n" \
461473
"cmp r2, #1\n" \
462474
"bne 1f\n" \
475+
"mvn r3, r2\n" \
476+
"cmp r3, #0xFFFFFFFE\n" \
477+
"bne 1f\n" \
463478
"ldr r2, [%0]\n" \
464479
"cmp r2, #1\n" \
465480
"bne 1f\n" \
481+
"mvn r3, r2\n" \
482+
"cmp r3, #0xFFFFFFFE\n" \
483+
"bne 1f\n" \
466484
"ldr r2, [%0]\n" \
467485
"cmp r2, #1\n" \
468486
"bne 1f\n" \
487+
"mvn r3, r2\n" \
488+
"cmp r3, #0xFFFFFFFE\n" \
489+
"bne 1f\n" \
469490
"ldr r2, [%0]\n" \
470491
"cmp r2, #1\n" \
471492
"bne 1f\n" \
493+
"mvn r3, r2\n" \
494+
"cmp r3, #0xFFFFFFFE\n" \
495+
"bne 1f\n" \
472496
/* Load 'img' into r0 (first argument to the function) */ \
473497
"mov r0, %1\n" \
474498
/* Load the function pointer into r3 */ \
@@ -480,7 +504,7 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
480504
"2:\n" \
481505
: /* No output operands */ \
482506
: "r"(p_res), "r"(img), "r"(confirm_func) /* Input operands */ \
483-
: "r0", "r2", "lr" /* Clobbered registers */ \
507+
: "r0", "r2", "r3", "lr" /* Clobbered registers */ \
484508
); \
485509
} while (0)
486510
#endif
@@ -507,93 +531,94 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
507531
#if defined(__GNUC__)
508532

509533
#define VERIFY_VERSION_ALLOWED(fb_ok) \
510-
/* Stash the registry values */ \
511-
asm volatile("push {r4, r5, r6, r7}"); \
512-
/* Redundant initialization with 'failure' values */ \
513-
asm volatile("mov r0, #0":::"r0"); \
514-
asm volatile("mov r4, #1":::"r4"); \
515-
asm volatile("mov r5, #0":::"r5"); \
516-
asm volatile("mov r6, #2":::"r6"); \
517-
asm volatile("mov r7, #0":::"r7"); \
518-
asm volatile("mov r0, #0":::"r0"); \
519-
asm volatile("mov r4, #1":::"r4"); \
520-
asm volatile("mov r5, #0":::"r5"); \
521-
asm volatile("mov r6, #2":::"r6"); \
522-
asm volatile("mov r7, #0":::"r7"); \
523-
/* Read the fb_ok flag, jump to end_check \
524-
* if proven fb_ok == 1 */ \
525-
asm volatile("mov r0, %0" ::"r"(fb_ok):"r0"); \
526-
asm volatile("cmp r0, #1":::"cc"); \
527-
asm volatile("bne do_check"); \
528-
asm volatile("cmp r0, #1":::"cc"); \
529-
asm volatile("bne do_check"); \
530-
asm volatile("cmp r0, #1":::"cc"); \
531-
asm volatile("bne do_check"); \
532-
asm volatile("b end_check"); \
533-
/* Do the actual version check: */ \
534-
asm volatile("do_check:"); \
535-
/* Read update versions to reg r5 and r7 */ \
536-
asm volatile("mov r0, #1":::"r0"); \
537-
asm volatile("mov r0, #1":::"r0"); \
538-
asm volatile("mov r0, #1":::"r0"); \
539-
asm volatile("bl wolfBoot_get_image_version"); \
540-
asm volatile("mov r5, r0":::"r5"); \
541-
asm volatile("mov r5, r0":::"r5"); \
542-
asm volatile("mov r5, r0":::"r5"); \
543-
asm volatile("mov r0, #1":::"r0"); \
544-
asm volatile("mov r0, #1":::"r0"); \
545-
asm volatile("mov r0, #1":::"r0"); \
546-
asm volatile("bl wolfBoot_get_image_version"); \
547-
asm volatile("mov r7, r0":::"r7"); \
548-
asm volatile("mov r7, r0":::"r7"); \
549-
asm volatile("mov r7, r0":::"r7"); \
550-
/* Compare r5 and r7, if not equal, something went very wrong, */ \
551-
asm volatile("cmp r5, r7":::"cc"); \
552-
asm volatile("bne ."); \
553-
asm volatile("cmp r5, r7":::"cc"); \
554-
asm volatile("bne .-4"); \
555-
asm volatile("cmp r5, r7":::"cc"); \
556-
asm volatile("bne .-8"); \
557-
asm volatile("cmp r5, r7":::"cc"); \
558-
asm volatile("bne .-12"); \
559-
/* Read current versions to reg r4 and r6 */ \
560-
asm volatile("mov r0, #0":::"r0"); \
561-
asm volatile("mov r0, #0":::"r0"); \
562-
asm volatile("mov r0, #0":::"r0"); \
563-
asm volatile("bl wolfBoot_get_image_version"); \
564-
asm volatile("mov r4, r0":::"r4"); \
565-
asm volatile("mov r4, r0":::"r4"); \
566-
asm volatile("mov r4, r0":::"r4"); \
567-
asm volatile("mov r0, #0":::"r0"); \
568-
asm volatile("mov r0, #0":::"r0"); \
569-
asm volatile("mov r0, #0":::"r0"); \
570-
asm volatile("bl wolfBoot_get_image_version"); \
571-
asm volatile("mov r6, r0":::"r6"); \
572-
asm volatile("mov r6, r0":::"r6"); \
573-
asm volatile("mov r6, r0":::"r6"); \
574-
asm volatile("cmp r4, r6":::"cc"); \
575-
asm volatile("bne ."); \
576-
asm volatile("cmp r4, r6":::"cc"); \
577-
asm volatile("bne .-4"); \
578-
asm volatile("cmp r4, r6":::"cc"); \
579-
asm volatile("bne .-8"); \
580-
asm volatile("cmp r4, r6":::"cc"); \
581-
asm volatile("bne .-12"); \
582-
asm volatile("mov r0, #0":::"r0"); \
583-
asm volatile("mov r0, #0":::"r0"); \
584-
asm volatile("mov r0, #0":::"r0"); \
585-
/* Compare the two versions in registries */ \
586-
asm volatile("cmp r4, r5":::"cc"); \
587-
asm volatile("bge ."); \
588-
asm volatile("cmp r6, r7":::"cc"); \
589-
asm volatile("bge .-4"); \
590-
asm volatile("cmp r4, r5":::"cc"); \
591-
asm volatile("bge .-8"); \
592-
asm volatile("cmp r6, r7":::"cc"); \
593-
asm volatile("bge .-12"); \
594-
asm volatile("end_check:"); \
595-
/* Restore previously saved registry values */ \
596-
asm volatile("pop {r4, r5, r6, r7}":::"r4", "r5", "r6", "r7")
534+
asm volatile( \
535+
"push {r4, r5, r6, r7}\n" \
536+
"mov r0, #0\n" \
537+
"mov r4, #1\n" \
538+
"mov r5, #0\n" \
539+
"mov r6, #2\n" \
540+
"mov r7, #0\n" \
541+
"mov r0, #0\n" \
542+
"mov r4, #1\n" \
543+
"mov r5, #0\n" \
544+
"mov r6, #2\n" \
545+
"mov r7, #0\n" \
546+
"mov r0, %0\n" \
547+
"mov r4, %0\n" \
548+
"cmp r0, #1\n" \
549+
"bne do_check\n" \
550+
"cmp r4, #1\n" \
551+
"bne do_check\n" \
552+
"cmp r0, r4\n" \
553+
"bne do_check\n" \
554+
"cmp r0, #1\n" \
555+
"bne do_check\n" \
556+
"b end_check\n" \
557+
"do_check:\n" \
558+
"mov r0, #1\n" \
559+
"mov r0, #1\n" \
560+
"mov r0, #1\n" \
561+
"bl wolfBoot_get_image_version\n" \
562+
"mov r5, r0\n" \
563+
"mov r5, r0\n" \
564+
"mov r5, r0\n" \
565+
"mov r0, #1\n" \
566+
"mov r0, #1\n" \
567+
"mov r0, #1\n" \
568+
"bl wolfBoot_get_image_version\n" \
569+
"mov r7, r0\n" \
570+
"mov r7, r0\n" \
571+
"mov r7, r0\n" \
572+
"cmp r5, r7\n" \
573+
"bne ver_panic\n" \
574+
"cmp r5, r7\n" \
575+
"bne ver_panic\n" \
576+
"cmp r5, r7\n" \
577+
"bne ver_panic\n" \
578+
"cmp r5, r7\n" \
579+
"bne ver_panic\n" \
580+
"mov r0, #0\n" \
581+
"mov r0, #0\n" \
582+
"mov r0, #0\n" \
583+
"bl wolfBoot_get_image_version\n" \
584+
"mov r4, r0\n" \
585+
"mov r4, r0\n" \
586+
"mov r4, r0\n" \
587+
"mov r0, #0\n" \
588+
"mov r0, #0\n" \
589+
"mov r0, #0\n" \
590+
"bl wolfBoot_get_image_version\n" \
591+
"mov r6, r0\n" \
592+
"mov r6, r0\n" \
593+
"mov r6, r0\n" \
594+
"cmp r4, r6\n" \
595+
"bne ver_panic\n" \
596+
"cmp r4, r6\n" \
597+
"bne ver_panic\n" \
598+
"cmp r4, r6\n" \
599+
"bne ver_panic\n" \
600+
"cmp r4, r6\n" \
601+
"bne ver_panic\n" \
602+
"mov r0, #0\n" \
603+
"mov r0, #0\n" \
604+
"mov r0, #0\n" \
605+
"cmp r4, r5\n" \
606+
"bhs ver_panic\n" \
607+
"cmp r6, r7\n" \
608+
"bhs ver_panic\n" \
609+
"cmp r4, r5\n" \
610+
"bhs ver_panic\n" \
611+
"cmp r6, r7\n" \
612+
"bhs ver_panic\n" \
613+
"b end_check\n" \
614+
"ver_panic:\n" \
615+
"b .\n" \
616+
"end_check:\n" \
617+
"pop {r4, r5, r6, r7}\n" \
618+
: \
619+
: "r"(fb_ok) \
620+
: "r0", "r4", "r5", "r6", "r7", "lr", "cc", "memory" \
621+
)
597622

598623
#elif defined(__ICCARM__) && defined(__IAR_SYSTEMS_ICC__)
599624

@@ -612,10 +637,25 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
612637
"mov r6, #2\n" \
613638
"mov r7, #0\n" \
614639
"mov r0, %0\n" \
640+
"mov r4, %0\n" \
641+
"cmp r0, #0\n" \
642+
"beq 4f\n" \
615643
"cmp r0, #1\n" \
616-
"bne 1f\n" \
644+
"beq 4f\n" \
645+
"bkpt 0xE1\n" \
646+
"4:\n" \
647+
"cmp r4, #0\n" \
648+
"beq 5f\n" \
649+
"cmp r4, #1\n" \
650+
"beq 5f\n" \
651+
"bkpt 0xE1\n" \
652+
"5:\n" \
617653
"cmp r0, #1\n" \
618654
"bne 1f\n" \
655+
"cmp r4, #1\n" \
656+
"bne 1f\n" \
657+
"cmp r0, r4\n" \
658+
"bne 1f\n" \
619659
"cmp r0, #1\n" \
620660
"bne 1f\n" \
621661
"b 2f\n" \
@@ -635,13 +675,13 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
635675
"mov r7, r0\n" \
636676
"mov r7, r0\n" \
637677
"cmp r5, r7\n" \
638-
"bne .\n" \
678+
"bne 3f\n" \
639679
"cmp r5, r7\n" \
640-
"bne .-4\n" \
680+
"bne 3f\n" \
641681
"cmp r5, r7\n" \
642-
"bne .-8\n" \
682+
"bne 3f\n" \
643683
"cmp r5, r7\n" \
644-
"bne .-12\n" \
684+
"bne 3f\n" \
645685
"mov r0, #0\n" \
646686
"mov r0, #0\n" \
647687
"mov r0, #0\n" \
@@ -657,24 +697,27 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
657697
"mov r6, r0\n" \
658698
"mov r6, r0\n" \
659699
"cmp r4, r6\n" \
660-
"bne .\n" \
700+
"bne 3f\n" \
661701
"cmp r4, r6\n" \
662-
"bne .-4\n" \
702+
"bne 3f\n" \
663703
"cmp r4, r6\n" \
664-
"bne .-8\n" \
704+
"bne 3f\n" \
665705
"cmp r4, r6\n" \
666-
"bne .-12\n" \
706+
"bne 3f\n" \
667707
"mov r0, #0\n" \
668708
"mov r0, #0\n" \
669709
"mov r0, #0\n" \
670710
"cmp r4, r5\n" \
671-
"bge .\n" \
711+
"bhs 3f\n" \
672712
"cmp r6, r7\n" \
673-
"bge .-4\n" \
713+
"bhs 3f\n" \
674714
"cmp r4, r5\n" \
675-
"bge .-8\n" \
715+
"bhs 3f\n" \
676716
"cmp r6, r7\n" \
677-
"bge .-12\n" \
717+
"bhs 3f\n" \
718+
"b 2f\n" \
719+
"3:\n" \
720+
"b .\n" \
678721
"2:\n" \
679722
"pop {r4, r5, r6, r7}\n" \
680723
: /* No output operands */ \

src/image.c

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,26 @@ static void wolfBoot_verify_signature_ml_dsa(uint8_t key_slot,
803803
img->sha_hash, WOLFBOOT_SHA_DIGEST_SIZE,
804804
&verify_res);
805805

806+
#ifdef WOLFBOOT_ARMORED
807+
if (ret == 0) {
808+
uint32_t v = (uint32_t)verify_res;
809+
uint32_t v_inv = ~v;
810+
if ((v == 1U) && (v_inv == 0xFFFFFFFEU) &&
811+
(v == (uint32_t)verify_res) &&
812+
(v_inv == ~(uint32_t)verify_res)) {
813+
wolfBoot_printf("info: wc_MlDsaKey_Verify returned OK\n");
814+
wolfBoot_image_confirm_signature_ok(img);
815+
}
816+
else {
817+
wolfBoot_printf("error: wc_MlDsaKey_Verify returned: ret=%d, "
818+
"res=%d\n", ret, verify_res);
819+
}
820+
}
821+
else {
822+
wolfBoot_printf("error: wc_MlDsaKey_Verify returned: ret=%d, "
823+
"res=%d\n", ret, verify_res);
824+
}
825+
#else
806826
if (ret == 0 && verify_res == 1) {
807827
wolfBoot_printf("info: wc_MlDsaKey_Verify returned OK\n");
808828
wolfBoot_image_confirm_signature_ok(img);
@@ -811,6 +831,7 @@ static void wolfBoot_verify_signature_ml_dsa(uint8_t key_slot,
811831
wolfBoot_printf("error: wc_MlDsaKey_Verify returned: ret=%d, "
812832
"res=%d\n", ret, verify_res);
813833
}
834+
#endif
814835
}
815836

816837
wc_MlDsaKey_Free(&ml_dsa);
@@ -2150,8 +2171,15 @@ int wolfBoot_verify_authenticity(struct wolfBoot_image *img)
21502171
wolfBoot_verify_signature_primary(key_slot, img, stored_signature);
21512172
(void)stored_signature_size;
21522173

2174+
#ifdef WOLFBOOT_ARMORED
2175+
#define SIG_OK(imgp) (((imgp)->signature_ok == 1) && \
2176+
((imgp)->not_signature_ok == ~(uint32_t)1))
2177+
#else
2178+
#define SIG_OK(imgp) ((imgp)->signature_ok == 1)
2179+
#endif
2180+
21532181
#ifdef SIGN_HYBRID
2154-
if (img->signature_ok == 1) {
2182+
if (SIG_OK(img)) {
21552183
uint8_t *stored_secondary_signature;
21562184
uint16_t stored_secondary_signature_size;
21572185
/* Invalidate the signature_ok flag */
@@ -2177,10 +2205,18 @@ int wolfBoot_verify_authenticity(struct wolfBoot_image *img)
21772205
}
21782206
}
21792207
#endif
2180-
if (img->signature_ok == 1) {
2208+
#ifdef WOLFBOOT_ARMORED
2209+
if (SIG_OK(img)) {
21812210
return 0;
21822211
}
21832212
return -2;
2213+
#else
2214+
if (SIG_OK(img)) {
2215+
return 0;
2216+
}
2217+
return -2;
2218+
#endif
2219+
#undef SIG_OK
21842220
}
21852221
#endif
21862222

0 commit comments

Comments
 (0)