@@ -478,6 +478,67 @@ static void __attribute__((noinline)) wolfBoot_image_clear_signature_ok(
478478 asm volatile ("nop" ); \
479479 }
480480
481+ /**
482+ * Second part of RSA-PSS verification.
483+ *
484+ * Call wc_RsaPSS_CheckPadding twice, then confirm via
485+ * wolfBoot_image_confirm_signature_ok();
486+ */
487+ #define RSA_PSS_VERIFY_HASH (img , pss_data , pss_data_sz , hash_type ) \
488+ { \
489+ volatile int pss_res; \
490+ if (!img || !pss_data) \
491+ asm volatile("b pnope"); \
492+ /* Redundant set of r0=50*/ \
493+ asm volatile ("mov r0, #50" :::"r0" ); \
494+ asm volatile ("mov r0, #50" :::"r0" ); \
495+ asm volatile ("mov r0, #50" :::"r0" ); \
496+ pss_res = wc_RsaPSS_CheckPadding (img -> sha_hash , WOLFBOOT_SHA_DIGEST_SIZE , \
497+ pss_data , pss_data_sz , hash_type ); \
498+ /* Redundant checks that ensure the function actually returned 0 */ \
499+ asm volatile ("cmp r0, #0" :::"cc" ); \
500+ asm volatile ("cmp r0, #0" :::"cc" ); \
501+ asm volatile ("cmp r0, #0" :::"cc" ); \
502+ asm volatile ("bne pnope" :::"cc" ); \
503+ asm volatile ("cmp r0, #0" ); \
504+ asm volatile ("cmp r0, #0" ); \
505+ asm volatile ("cmp r0, #0" ); \
506+ asm volatile ("bne pnope" :::"cc" ); \
507+ asm volatile ("cmp r0, #0" :::"cc" ); \
508+ asm volatile ("cmp r0, #0" :::"cc" ); \
509+ asm volatile ("cmp r0, #0" :::"cc" ); \
510+ asm volatile ("bne pnope" ); \
511+ asm volatile ("cmp r0, #0" :::"cc" ); \
512+ asm volatile ("cmp r0, #0" :::"cc" ); \
513+ asm volatile ("cmp r0, #0" :::"cc" ); \
514+ asm volatile ("bne pnope" ); \
515+ /* Repeat wc_RsaPSS_CheckPadding call */ \
516+ pss_res = wc_RsaPSS_CheckPadding (img -> sha_hash , WOLFBOOT_SHA_DIGEST_SIZE , \
517+ pss_data , pss_data_sz , hash_type ); \
518+ pss_res ; \
519+ /* Redundant checks that ensure the function actually returned 0 */ \
520+ asm volatile ("cmp r0, #0" :::"cc" ); \
521+ asm volatile ("cmp r0, #0" :::"cc" ); \
522+ asm volatile ("cmp r0, #0" :::"cc" ); \
523+ asm volatile ("bne pnope" ); \
524+ asm volatile ("cmp r0, #0" :::"cc" ); \
525+ asm volatile ("cmp r0, #0" :::"cc" ); \
526+ asm volatile ("cmp r0, #0" :::"cc" ); \
527+ asm volatile ("bne pnope" ); \
528+ asm volatile ("cmp r0, #0" :::"cc" ); \
529+ asm volatile ("cmp r0, #0" :::"cc" ); \
530+ asm volatile ("cmp r0, #0" :::"cc" ); \
531+ asm volatile ("bne pnope" ); \
532+ asm volatile ("cmp r0, #0" :::"cc" ); \
533+ asm volatile ("cmp r0, #0" :::"cc" ); \
534+ asm volatile ("cmp r0, #0" :::"cc" ); \
535+ asm volatile ("bne pnope" ); \
536+ /* Confirm that the signature is OK */ \
537+ wolfBoot_image_confirm_signature_ok (img ); \
538+ asm volatile ("pnope:" ); \
539+ asm volatile ("nop" ); \
540+ }
541+
481542/**
482543 * ECC / Ed / PQ signature verification.
483544 * Those verify functions set an additional value 'p_res'
@@ -1247,6 +1308,11 @@ static void UNUSEDFUNCTION wolfBoot_image_clear_signature_ok(
12471308 if (XMEMCMP(img->sha_hash, digest, WOLFBOOT_SHA_DIGEST_SIZE) == 0) \
12481309 wolfBoot_image_confirm_signature_ok(img);
12491310
1311+ #define RSA_PSS_VERIFY_HASH (img , pss_data , pss_data_sz , hash_type ) \
1312+ if (wc_RsaPSS_CheckPadding(img->sha_hash, WOLFBOOT_SHA_DIGEST_SIZE, \
1313+ pss_data, pss_data_sz, hash_type) == 0) \
1314+ wolfBoot_image_confirm_signature_ok(img);
1315+
12501316#define PART_SANITY_CHECK (p ) \
12511317 if (((p)->hdr_ok != 1) || ((p)->sha_ok != 1) || ((p)->signature_ok != 1)) \
12521318 wolfBoot_panic()
0 commit comments