46
46
#include "bootutil/bootutil_log.h"
47
47
48
48
BOOT_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 */
49
52
50
53
#ifdef MCUBOOT_ENC_IMAGES
51
54
#include "bootutil/enc_key.h"
@@ -201,7 +204,8 @@ bootutil_img_validate(struct boot_loader_state *state,
201
204
int seed_len , uint8_t * out_hash
202
205
)
203
206
{
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 )
205
209
int image_index = (state == NULL ? 0 : BOOT_CURR_IMG (state ));
206
210
#endif
207
211
uint32_t off ;
@@ -238,6 +242,14 @@ bootutil_img_validate(struct boot_loader_state *state,
238
242
uint32_t img_security_cnt = 0 ;
239
243
FIH_DECLARE (security_counter_valid , FIH_FAILURE );
240
244
#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
241
253
242
254
BOOT_LOG_DBG ("bootutil_img_validate: flash area %p" , fap );
243
255
@@ -470,6 +482,64 @@ bootutil_img_validate(struct boot_loader_state *state,
470
482
break ;
471
483
}
472
484
#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
473
543
}
474
544
}
475
545
@@ -492,6 +562,19 @@ bootutil_img_validate(struct boot_loader_state *state,
492
562
}
493
563
#endif
494
564
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
+
495
578
out :
496
579
if (rc ) {
497
580
FIH_SET (fih_rc , FIH_FAILURE );
0 commit comments