4646#include "bootutil/bootutil_log.h"
4747
4848BOOT_LOG_MODULE_DECLARE (mcuboot );
49+ #if defined(MCUBOOT_UUID_VID ) || defined(MCUBOOT_UUID_CID )
50+ #include "bootutil/mcuboot_uuid.h"
51+ #endif /* MCUBOOT_UUID_VID || MCUBOOT_UUID_CID */
4952
5053#ifdef MCUBOOT_ENC_IMAGES
5154#include "bootutil/enc_key.h"
@@ -201,7 +204,8 @@ bootutil_img_validate(struct boot_loader_state *state,
201204 int seed_len , uint8_t * out_hash
202205 )
203206{
204- #if (defined(EXPECTED_KEY_TLV ) && defined(MCUBOOT_HW_KEY )) || defined(MCUBOOT_HW_ROLLBACK_PROT )
207+ #if (defined(EXPECTED_KEY_TLV ) && defined(MCUBOOT_HW_KEY )) || defined(MCUBOOT_HW_ROLLBACK_PROT ) \
208+ || defined(MCUBOOT_UUID_VID ) || defined(MCUBOOT_UUID_CID )
205209 int image_index = (state == NULL ? 0 : BOOT_CURR_IMG (state ));
206210#endif
207211 uint32_t off ;
@@ -238,6 +242,14 @@ bootutil_img_validate(struct boot_loader_state *state,
238242 uint32_t img_security_cnt = 0 ;
239243 FIH_DECLARE (security_counter_valid , FIH_FAILURE );
240244#endif
245+ #ifdef MCUBOOT_UUID_VID
246+ struct image_uuid img_uuid_vid = {0x00 };
247+ FIH_DECLARE (uuid_vid_valid , FIH_FAILURE );
248+ #endif
249+ #ifdef MCUBOOT_UUID_CID
250+ struct image_uuid img_uuid_cid = {0x00 };
251+ FIH_DECLARE (uuid_cid_valid , FIH_FAILURE );
252+ #endif
241253
242254 BOOT_LOG_DBG ("bootutil_img_validate: flash area %p" , fap );
243255
@@ -470,6 +482,64 @@ bootutil_img_validate(struct boot_loader_state *state,
470482 break ;
471483 }
472484#endif /* MCUBOOT_HW_ROLLBACK_PROT */
485+ #ifdef MCUBOOT_UUID_VID
486+ case IMAGE_TLV_UUID_VID :
487+ {
488+ /*
489+ * Verify the image's vendor ID length.
490+ * This must always be present.
491+ */
492+ if (len != sizeof (img_uuid_vid )) {
493+ /* Vendor UUID is not valid. */
494+ rc = -1 ;
495+ goto out ;
496+ }
497+
498+ rc = LOAD_IMAGE_DATA (hdr , fap , off , img_uuid_vid .raw , len );
499+ if (rc ) {
500+ goto out ;
501+ }
502+
503+ FIH_CALL (boot_uuid_vid_match , fih_rc , image_index , & img_uuid_vid );
504+ if (FIH_NOT_EQ (fih_rc , FIH_SUCCESS )) {
505+ FIH_SET (uuid_vid_valid , FIH_FAILURE );
506+ goto out ;
507+ }
508+
509+ /* The image's vendor identifier has been successfully verified. */
510+ uuid_vid_valid = fih_rc ;
511+ break ;
512+ }
513+ #endif
514+ #ifdef MCUBOOT_UUID_CID
515+ case IMAGE_TLV_UUID_CID :
516+ {
517+ /*
518+ * Verify the image's class ID length.
519+ * This must always be present.
520+ */
521+ if (len != sizeof (img_uuid_cid )) {
522+ /* Image class UUID is not valid. */
523+ rc = -1 ;
524+ goto out ;
525+ }
526+
527+ rc = LOAD_IMAGE_DATA (hdr , fap , off , img_uuid_cid .raw , len );
528+ if (rc ) {
529+ goto out ;
530+ }
531+
532+ FIH_CALL (boot_uuid_cid_match , fih_rc , image_index , & img_uuid_cid );
533+ if (FIH_NOT_EQ (fih_rc , FIH_SUCCESS )) {
534+ FIH_SET (uuid_cid_valid , FIH_FAILURE );
535+ goto out ;
536+ }
537+
538+ /* The image's class identifier has been successfully verified. */
539+ uuid_cid_valid = fih_rc ;
540+ break ;
541+ }
542+ #endif
473543 }
474544 }
475545
@@ -492,6 +562,19 @@ bootutil_img_validate(struct boot_loader_state *state,
492562 }
493563#endif
494564
565+ #ifdef MCUBOOT_UUID_VID
566+ if (FIH_NOT_EQ (uuid_vid_valid , FIH_SUCCESS )) {
567+ rc = -1 ;
568+ goto out ;
569+ }
570+ #endif
571+ #ifdef MCUBOOT_UUID_CID
572+ if (FIH_NOT_EQ (uuid_cid_valid , FIH_SUCCESS )) {
573+ rc = -1 ;
574+ goto out ;
575+ }
576+ #endif
577+
495578out :
496579 if (rc ) {
497580 FIH_SET (fih_rc , FIH_FAILURE );
0 commit comments