|
44 | 44 | #include "bootutil/bootutil_log.h"
|
45 | 45 |
|
46 | 46 | BOOT_LOG_MODULE_DECLARE(mcuboot);
|
| 47 | +#if defined(MCUBOOT_UUID_VID) || defined(MCUBOOT_UUID_CID) |
| 48 | +#include "bootutil/mcuboot_uuid.h" |
| 49 | +#endif /* MCUBOOT_UUID_VID || MCUBOOT_UUID_CID */ |
47 | 50 |
|
48 | 51 | #ifdef MCUBOOT_ENC_IMAGES
|
49 | 52 | #include "bootutil/enc_key.h"
|
@@ -507,7 +510,8 @@ bootutil_img_validate(struct boot_loader_state *state,
|
507 | 510 | #endif
|
508 | 511 | )
|
509 | 512 | {
|
510 |
| -#if (defined(EXPECTED_KEY_TLV) && defined(MCUBOOT_HW_KEY)) || defined(MCUBOOT_HW_ROLLBACK_PROT) |
| 513 | +#if (defined(EXPECTED_KEY_TLV) && defined(MCUBOOT_HW_KEY)) || defined(MCUBOOT_HW_ROLLBACK_PROT) \ |
| 514 | + || defined(MCUBOOT_UUID_VID) || defined(MCUBOOT_UUID_CID) |
511 | 515 | int image_index = (state == NULL ? 0 : BOOT_CURR_IMG(state));
|
512 | 516 | #endif
|
513 | 517 | uint32_t off;
|
@@ -553,6 +557,14 @@ bootutil_img_validate(struct boot_loader_state *state,
|
553 | 557 | goto out;
|
554 | 558 | }
|
555 | 559 | #endif
|
| 560 | +#ifdef MCUBOOT_UUID_VID |
| 561 | + struct image_uuid img_uuid_vid = {0x00}; |
| 562 | + FIH_DECLARE(uuid_vid_valid, FIH_FAILURE); |
| 563 | +#endif |
| 564 | +#ifdef MCUBOOT_UUID_CID |
| 565 | + struct image_uuid img_uuid_cid = {0x00}; |
| 566 | + FIH_DECLARE(uuid_cid_valid, FIH_FAILURE); |
| 567 | +#endif |
556 | 568 |
|
557 | 569 | BOOT_LOG_DBG("bootutil_img_validate: flash area %p", fap);
|
558 | 570 |
|
@@ -793,6 +805,64 @@ bootutil_img_validate(struct boot_loader_state *state,
|
793 | 805 | break;
|
794 | 806 | }
|
795 | 807 | #endif /* MCUBOOT_HW_ROLLBACK_PROT */
|
| 808 | +#ifdef MCUBOOT_UUID_VID |
| 809 | + case IMAGE_TLV_UUID_VID: |
| 810 | + { |
| 811 | + /* |
| 812 | + * Verify the image's vendor ID length. |
| 813 | + * This must always be present. |
| 814 | + */ |
| 815 | + if (len != sizeof(img_uuid_vid)) { |
| 816 | + /* Vendor UUID is not valid. */ |
| 817 | + rc = -1; |
| 818 | + goto out; |
| 819 | + } |
| 820 | + |
| 821 | + rc = LOAD_IMAGE_DATA(hdr, fap, off, img_uuid_vid.raw, len); |
| 822 | + if (rc) { |
| 823 | + goto out; |
| 824 | + } |
| 825 | + |
| 826 | + FIH_CALL(boot_uuid_vid_match, fih_rc, image_index, &img_uuid_vid); |
| 827 | + if (FIH_NOT_EQ(fih_rc, FIH_SUCCESS)) { |
| 828 | + FIH_SET(uuid_vid_valid, FIH_FAILURE); |
| 829 | + goto out; |
| 830 | + } |
| 831 | + |
| 832 | + /* The image's vendor identifier has been successfully verified. */ |
| 833 | + uuid_vid_valid = fih_rc; |
| 834 | + break; |
| 835 | + } |
| 836 | +#endif |
| 837 | +#ifdef MCUBOOT_UUID_CID |
| 838 | + case IMAGE_TLV_UUID_CID: |
| 839 | + { |
| 840 | + /* |
| 841 | + * Verify the image's class ID length. |
| 842 | + * This must always be present. |
| 843 | + */ |
| 844 | + if (len != sizeof(img_uuid_cid)) { |
| 845 | + /* Image class UUID is not valid. */ |
| 846 | + rc = -1; |
| 847 | + goto out; |
| 848 | + } |
| 849 | + |
| 850 | + rc = LOAD_IMAGE_DATA(hdr, fap, off, img_uuid_cid.raw, len); |
| 851 | + if (rc) { |
| 852 | + goto out; |
| 853 | + } |
| 854 | + |
| 855 | + FIH_CALL(boot_uuid_cid_match, fih_rc, image_index, &img_uuid_cid); |
| 856 | + if (FIH_NOT_EQ(fih_rc, FIH_SUCCESS)) { |
| 857 | + FIH_SET(uuid_cid_valid, FIH_FAILURE); |
| 858 | + goto out; |
| 859 | + } |
| 860 | + |
| 861 | + /* The image's class identifier has been successfully verified. */ |
| 862 | + uuid_cid_valid = fih_rc; |
| 863 | + break; |
| 864 | + } |
| 865 | +#endif |
796 | 866 | }
|
797 | 867 | }
|
798 | 868 |
|
@@ -821,6 +891,19 @@ bootutil_img_validate(struct boot_loader_state *state,
|
821 | 891 | skip_security_counter_check:
|
822 | 892 | #endif
|
823 | 893 |
|
| 894 | +#ifdef MCUBOOT_UUID_VID |
| 895 | + if (FIH_NOT_EQ(uuid_vid_valid, FIH_SUCCESS)) { |
| 896 | + rc = -1; |
| 897 | + goto out; |
| 898 | + } |
| 899 | +#endif |
| 900 | +#ifdef MCUBOOT_UUID_CID |
| 901 | + if (FIH_NOT_EQ(uuid_cid_valid, FIH_SUCCESS)) { |
| 902 | + rc = -1; |
| 903 | + goto out; |
| 904 | + } |
| 905 | +#endif |
| 906 | + |
824 | 907 | out:
|
825 | 908 | if (rc) {
|
826 | 909 | FIH_SET(fih_rc, FIH_FAILURE);
|
|
0 commit comments