Skip to content

Commit cfcdb38

Browse files
committed
prevent duplicate asm labels in ARMORED mode
1 parent 5442acc commit cfcdb38

File tree

1 file changed

+46
-38
lines changed

1 file changed

+46
-38
lines changed

include/image.h

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
388388
* double checking its return value contains a valid
389389
* len (>= WOLFBOOT_SHA_DIGEST_SIZE).
390390
*
391+
* Uses GAS local numeric labels (1f/1:) so the macro can be safely expanded
392+
* multiple times in the same function (e.g. RSA PKCS#1.5 + RSA-PSS paths).
391393
*/
392394
#define RSA_VERIFY_FN(ret,fn,...) \
393395
{ \
@@ -406,22 +408,22 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
406408
asm volatile("cmp r0, r2":::"cc"); \
407409
asm volatile("cmp r0, r2":::"cc"); \
408410
asm volatile("cmp r0, r2":::"cc"); \
409-
asm volatile("blt nope"); \
411+
asm volatile("blt 1f"); \
410412
asm volatile("cmp r0, r2":::"cc"); \
411413
asm volatile("cmp r0, r2":::"cc"); \
412414
asm volatile("cmp r0, r2":::"cc"); \
413-
asm volatile("blt nope"); \
415+
asm volatile("blt 1f"); \
414416
asm volatile("cmp r0, r2":::"cc"); \
415417
asm volatile("cmp r0, r2":::"cc"); \
416418
asm volatile("cmp r0, r2":::"cc"); \
417-
asm volatile("blt nope"); \
419+
asm volatile("blt 1f"); \
418420
asm volatile("cmp r0, r2":::"cc"); \
419421
asm volatile("cmp r0, r2":::"cc"); \
420422
asm volatile("cmp r0, r2":::"cc"); \
421-
asm volatile("blt nope"); \
423+
asm volatile("blt 1f"); \
422424
/* Return value is set here in case of success */ \
423425
ret = tmp_ret; \
424-
asm volatile("nope:"); \
426+
asm volatile("1:"); \
425427
asm volatile("nop"); \
426428
}
427429

@@ -430,12 +432,14 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
430432
*
431433
* Compare the digest twice, then confirm via
432434
* wolfBoot_image_confirm_signature_ok();
435+
*
436+
* Uses GAS local numeric labels (2f/2:) for safe multi-expansion.
433437
*/
434438
#define RSA_VERIFY_HASH(img,digest) \
435439
{ \
436440
volatile int compare_res; \
437441
if (!img || !digest) \
438-
asm volatile("b hnope"); \
442+
asm volatile("b 2f"); \
439443
/* Redundant set of r0=50*/ \
440444
asm volatile("mov r0, #50":::"r0"); \
441445
asm volatile("mov r0, #50":::"r0"); \
@@ -445,42 +449,42 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
445449
asm volatile("cmp r0, #0":::"cc"); \
446450
asm volatile("cmp r0, #0":::"cc"); \
447451
asm volatile("cmp r0, #0":::"cc"); \
448-
asm volatile("bne hnope":::"cc"); \
452+
asm volatile("bne 2f":::"cc"); \
449453
asm volatile("cmp r0, #0"); \
450454
asm volatile("cmp r0, #0"); \
451455
asm volatile("cmp r0, #0"); \
452-
asm volatile("bne hnope":::"cc"); \
456+
asm volatile("bne 2f":::"cc"); \
453457
asm volatile("cmp r0, #0":::"cc"); \
454458
asm volatile("cmp r0, #0":::"cc"); \
455459
asm volatile("cmp r0, #0":::"cc"); \
456-
asm volatile("bne hnope"); \
460+
asm volatile("bne 2f"); \
457461
asm volatile("cmp r0, #0":::"cc"); \
458462
asm volatile("cmp r0, #0":::"cc"); \
459463
asm volatile("cmp r0, #0":::"cc"); \
460-
asm volatile("bne hnope"); \
464+
asm volatile("bne 2f"); \
461465
/* Repeat memcmp call */ \
462466
compare_res = XMEMCMP(digest, img->sha_hash, WOLFBOOT_SHA_DIGEST_SIZE); \
463467
compare_res; \
464468
/* Redundant checks that ensure the function actually returned 0 */ \
465469
asm volatile("cmp r0, #0":::"cc"); \
466470
asm volatile("cmp r0, #0":::"cc"); \
467471
asm volatile("cmp r0, #0":::"cc"); \
468-
asm volatile("bne hnope"); \
472+
asm volatile("bne 2f"); \
469473
asm volatile("cmp r0, #0":::"cc"); \
470474
asm volatile("cmp r0, #0":::"cc"); \
471475
asm volatile("cmp r0, #0":::"cc"); \
472-
asm volatile("bne hnope"); \
476+
asm volatile("bne 2f"); \
473477
asm volatile("cmp r0, #0":::"cc"); \
474478
asm volatile("cmp r0, #0":::"cc"); \
475479
asm volatile("cmp r0, #0":::"cc"); \
476-
asm volatile("bne hnope"); \
480+
asm volatile("bne 2f"); \
477481
asm volatile("cmp r0, #0":::"cc"); \
478482
asm volatile("cmp r0, #0":::"cc"); \
479483
asm volatile("cmp r0, #0":::"cc"); \
480-
asm volatile("bne hnope"); \
484+
asm volatile("bne 2f"); \
481485
/* Confirm that the signature is OK */ \
482486
wolfBoot_image_confirm_signature_ok(img); \
483-
asm volatile("hnope:"); \
487+
asm volatile("2:"); \
484488
asm volatile("nop"); \
485489
}
486490

@@ -489,12 +493,14 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
489493
*
490494
* Call wc_RsaPSS_CheckPadding twice, then confirm via
491495
* wolfBoot_image_confirm_signature_ok();
496+
*
497+
* Uses GAS local numeric labels (3f/3:) for safe multi-expansion.
492498
*/
493499
#define RSA_PSS_VERIFY_HASH(img, pss_data, pss_data_sz, hash_type) \
494500
{ \
495501
volatile int pss_res; \
496502
if (!img || !pss_data) \
497-
asm volatile("b pnope"); \
503+
asm volatile("b 3f"); \
498504
/* Redundant set of r0=50*/ \
499505
asm volatile("mov r0, #50":::"r0"); \
500506
asm volatile("mov r0, #50":::"r0"); \
@@ -505,19 +511,19 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
505511
asm volatile("cmp r0, #0":::"cc"); \
506512
asm volatile("cmp r0, #0":::"cc"); \
507513
asm volatile("cmp r0, #0":::"cc"); \
508-
asm volatile("bne pnope":::"cc"); \
514+
asm volatile("bne 3f":::"cc"); \
509515
asm volatile("cmp r0, #0"); \
510516
asm volatile("cmp r0, #0"); \
511517
asm volatile("cmp r0, #0"); \
512-
asm volatile("bne pnope":::"cc"); \
518+
asm volatile("bne 3f":::"cc"); \
513519
asm volatile("cmp r0, #0":::"cc"); \
514520
asm volatile("cmp r0, #0":::"cc"); \
515521
asm volatile("cmp r0, #0":::"cc"); \
516-
asm volatile("bne pnope"); \
522+
asm volatile("bne 3f"); \
517523
asm volatile("cmp r0, #0":::"cc"); \
518524
asm volatile("cmp r0, #0":::"cc"); \
519525
asm volatile("cmp r0, #0":::"cc"); \
520-
asm volatile("bne pnope"); \
526+
asm volatile("bne 3f"); \
521527
/* Repeat wc_RsaPSS_CheckPadding call */ \
522528
pss_res = wc_RsaPSS_CheckPadding(img->sha_hash, WOLFBOOT_SHA_DIGEST_SIZE, \
523529
pss_data, pss_data_sz, hash_type); \
@@ -526,22 +532,22 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
526532
asm volatile("cmp r0, #0":::"cc"); \
527533
asm volatile("cmp r0, #0":::"cc"); \
528534
asm volatile("cmp r0, #0":::"cc"); \
529-
asm volatile("bne pnope"); \
535+
asm volatile("bne 3f"); \
530536
asm volatile("cmp r0, #0":::"cc"); \
531537
asm volatile("cmp r0, #0":::"cc"); \
532538
asm volatile("cmp r0, #0":::"cc"); \
533-
asm volatile("bne pnope"); \
539+
asm volatile("bne 3f"); \
534540
asm volatile("cmp r0, #0":::"cc"); \
535541
asm volatile("cmp r0, #0":::"cc"); \
536542
asm volatile("cmp r0, #0":::"cc"); \
537-
asm volatile("bne pnope"); \
543+
asm volatile("bne 3f"); \
538544
asm volatile("cmp r0, #0":::"cc"); \
539545
asm volatile("cmp r0, #0":::"cc"); \
540546
asm volatile("cmp r0, #0":::"cc"); \
541-
asm volatile("bne pnope"); \
547+
asm volatile("bne 3f"); \
542548
/* Confirm that the signature is OK */ \
543549
wolfBoot_image_confirm_signature_ok(img); \
544-
asm volatile("pnope:"); \
550+
asm volatile("3:"); \
545551
asm volatile("nop"); \
546552
}
547553

@@ -554,6 +560,8 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
554560
* set the return value accordingly.
555561
*
556562
* Double check by reading the value in p_res from memory a few times.
563+
*
564+
* Uses GAS local numeric labels (4f/4:) for safe multi-expansion.
557565
*/
558566
#if defined(__GNUC__)
559567

@@ -568,63 +576,63 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
568576
asm volatile("cmp r0, #0":::"cc"); \
569577
asm volatile("cmp r0, #0":::"cc"); \
570578
asm volatile("cmp r0, #0":::"cc"); \
571-
asm volatile("bne nope"); \
579+
asm volatile("bne 4f"); \
572580
asm volatile("cmp r0, #0":::"cc"); \
573581
asm volatile("cmp r0, #0":::"cc"); \
574582
asm volatile("cmp r0, #0":::"cc"); \
575-
asm volatile("bne nope"); \
583+
asm volatile("bne 4f"); \
576584
asm volatile("cmp r0, #0":::"cc"); \
577585
asm volatile("cmp r0, #0":::"cc"); \
578586
asm volatile("cmp r0, #0":::"cc"); \
579-
asm volatile("bne nope"); \
587+
asm volatile("bne 4f"); \
580588
asm volatile("cmp r0, #0":::"cc"); \
581589
asm volatile("cmp r0, #0":::"cc"); \
582590
asm volatile("cmp r0, #0":::"cc"); \
583-
asm volatile("bne nope"); \
591+
asm volatile("bne 4f"); \
584592
/* Check that res = 1, a few times, reading the value from memory */ \
585593
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
586594
asm volatile("cmp r2, #1":::"cc"); \
587595
asm volatile("cmp r2, #1":::"cc"); \
588596
asm volatile("cmp r2, #1":::"cc"); \
589-
asm volatile("bne nope"); \
597+
asm volatile("bne 4f"); \
590598
asm volatile("mvn r3, r2":::"r3"); \
591599
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
592600
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
593601
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
594-
asm volatile("bne nope"); \
602+
asm volatile("bne 4f"); \
595603
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
596604
asm volatile("cmp r2, #1":::"cc"); \
597605
asm volatile("cmp r2, #1":::"cc"); \
598606
asm volatile("cmp r2, #1":::"cc"); \
599-
asm volatile("bne nope"); \
607+
asm volatile("bne 4f"); \
600608
asm volatile("mvn r3, r2":::"r3"); \
601609
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
602610
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
603611
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
604-
asm volatile("bne nope"); \
612+
asm volatile("bne 4f"); \
605613
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
606614
asm volatile("cmp r2, #1":::"cc"); \
607615
asm volatile("cmp r2, #1":::"cc"); \
608616
asm volatile("cmp r2, #1":::"cc"); \
609-
asm volatile("bne nope"); \
617+
asm volatile("bne 4f"); \
610618
asm volatile("mvn r3, r2":::"r3"); \
611619
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
612620
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
613621
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
614-
asm volatile("bne nope"); \
622+
asm volatile("bne 4f"); \
615623
asm volatile("ldr r2, [%0]" ::"r"(p_res)); \
616624
asm volatile("cmp r2, #1":::"cc"); \
617625
asm volatile("cmp r2, #1":::"cc"); \
618626
asm volatile("cmp r2, #1":::"cc"); \
619-
asm volatile("bne nope"); \
627+
asm volatile("bne 4f"); \
620628
asm volatile("mvn r3, r2":::"r3"); \
621629
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
622630
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
623631
asm volatile("cmp r3, #0xFFFFFFFE":::"cc"); \
624-
asm volatile("bne nope"); \
632+
asm volatile("bne 4f"); \
625633
/* Confirm that the signature is OK */ \
626634
wolfBoot_image_confirm_signature_ok(img); \
627-
asm volatile("nope:"); \
635+
asm volatile("4:"); \
628636
asm volatile("nop") \
629637

630638
#elif defined(__ICCARM__) && defined(__IAR_SYSTEMS_ICC__)

0 commit comments

Comments
 (0)