diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b9416d..27f6cb7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,10 @@
   `component_opaque_data` fields to correctly parse their contents.
 - firmware_update: Add 1.3.0 version updates.
 
+- firmware update: Add support for DSP0267 v1.3.0 by: Adding
+  `reference_manifest_data` and `payload_checksum` fields to correctly parse
+  their contents.
+
 ### Changed
 
 - Stabilised `decode_get_event_receiver_resp()`
diff --git a/include/libpldm/firmware_update.h b/include/libpldm/firmware_update.h
index 7d61c55..e62635c 100644
--- a/include/libpldm/firmware_update.h
+++ b/include/libpldm/firmware_update.h
@@ -2207,6 +2207,16 @@
 /** @brief Firmware update v1.2 package header format revision */
 #define PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H 0x03
 
+/** @brief Firmware update v1.3 package header identifier */
+#define PLDM_PACKAGE_HEADER_IDENTIFIER_V1_3                                    \
+	{                                                                      \
+		0x7b, 0x29, 0x1c, 0x99, 0x6d, 0xb6, 0x42, 0x08,                \
+		0x80, 0x1b, 0x02, 0x02, 0x6e, 0x46, 0x3c, 0x78,                \
+	}
+
+/** @brief Firmware update v1.3 package header format revision */
+#define PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H 0x04
+
 /** @brief Consumer-side version pinning for package format parsing
  *
  * Parsing a firmware update package requires the package to be of a revision
@@ -2224,6 +2234,7 @@
  * - @ref DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR01H
  * - @ref DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR02H
  * - @ref DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR03H
+ * - @ref DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR04H
  *
  * The package pinning operates by providing versioning over multiple structs
  * required to perform the package parsing. See [Conventions for extensible
@@ -2327,6 +2338,21 @@
 	 */
 	struct variable_field record_descriptors;
 	struct variable_field firmware_device_package_data;
+
+	/**
+	 * An optional field that can contain a Reference Manifest for the firmware
+	 * update package. If present, this field points to the Reference Manifest
+	 * data, which describes the firmware update provided by this package. The
+	 * UA (Update Agent) may use this data as a reference for the firmware
+	 * version.
+	 *
+	 * Note that this data shall not be transferred to the firmware device (FD).
+	 * The format of the data is either a Standard Body or Vendor-Defined Header,
+	 * followed by the Reference Manifest data.
+	 *
+	 * See Table 7, DSP0267 v1.3.0
+	 */
+	struct variable_field reference_manifest_data;
 };
 
 /**
@@ -2369,6 +2395,14 @@
 	 * If present, points into the provided package data.
 	 */
 	struct variable_field package_data;
+
+	/**
+	* A field pointing to a Reference Manifest for the downstream device.
+	* If present, this field points to the Reference Manifest data, which describes
+	*
+	* See Table 7, DSP0267 v1.3.0
+	*/
+	struct variable_field reference_manifest_data;
 };
 
 /**
@@ -2966,6 +3000,33 @@
 		} \
 	}
 
+/**
+ * Declare consumer support for at most revision 4 of the firmware update
+ * package header
+ *
+ * @param name The name for the pin object
+ *
+ * The pin object must be provided to @ref decode_pldm_firmware_update_package
+ */
+#define DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR04H(name)                             \
+	struct pldm_package_format_pin name = { \
+		.meta = { \
+			.magic = ( \
+				LIBPLDM_SIZEAT(struct pldm__package_header_information, package) + \
+				LIBPLDM_SIZEAT(struct pldm_package_firmware_device_id_record, reference_manifest_data) + \
+				LIBPLDM_SIZEAT(struct pldm_descriptor, descriptor_data) + \
+				LIBPLDM_SIZEAT(struct pldm_package_downstream_device_id_record, reference_manifest_data) + \
+				LIBPLDM_SIZEAT(struct pldm_package_component_image_information, component_opaque_data) + \
+				LIBPLDM_SIZEAT(struct pldm_package_iter, infos) \
+			), \
+			.version = 0u, \
+		}, \
+		.format = { \
+			.identifier = PLDM_PACKAGE_HEADER_IDENTIFIER_V1_3, \
+			.revision = PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H, \
+		} \
+	}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/dsp/firmware_update.c b/src/dsp/firmware_update.c
index d733d0a..d7e238b 100644
--- a/src/dsp/firmware_update.c
+++ b/src/dsp/firmware_update.c
@@ -341,7 +341,7 @@
 	static const struct pldm_package_header_format_revision_info {
 		pldm_uuid identifier;
 		size_t magic;
-	} revision_info[1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H] = {
+	} revision_info[1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H] = {
 		[0] = {
 			.identifier = {0},
 			.magic = 0,
@@ -375,14 +375,27 @@
 				LIBPLDM_SIZEAT(struct pldm_package_component_image_information, component_opaque_data) +
 				LIBPLDM_SIZEAT(struct pldm_package_iter, infos),
 		},
+		[PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H] = { /* PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H */
+			.identifier = PLDM_PACKAGE_HEADER_IDENTIFIER_V1_3,
+			.magic =
+				LIBPLDM_SIZEAT(struct pldm__package_header_information, package) +
+				LIBPLDM_SIZEAT(struct pldm_package_firmware_device_id_record, reference_manifest_data) +
+				LIBPLDM_SIZEAT(struct pldm_descriptor, descriptor_data) +
+				LIBPLDM_SIZEAT(struct pldm_package_downstream_device_id_record, reference_manifest_data) +
+				LIBPLDM_SIZEAT(struct pldm_package_component_image_information, component_opaque_data) +
+				LIBPLDM_SIZEAT(struct pldm_package_iter, infos),
+		},
 	};
 
 	const struct pldm_package_header_format_revision_info *info;
+	uint32_t package_payload_checksum = 0;
 	uint32_t package_header_checksum = 0;
 	size_t package_header_variable_size;
 	size_t package_header_payload_size;
 	size_t package_header_areas_size;
 	uint16_t package_header_size;
+	void *package_payload_offset;
+	size_t package_payload_size;
 	PLDM_MSGBUF_DEFINE_P(buf);
 	int checksums = 1;
 	int rc;
@@ -395,11 +408,11 @@
 		return -EINVAL;
 	}
 
-	if (pin->format.revision > PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H) {
+	if (pin->format.revision > PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
 		return -ENOTSUP;
 	}
 	static_assert(ARRAY_SIZE(revision_info) ==
-			      1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H,
+			      1 + PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H,
 		      "Mismatched array bounds test");
 
 	info = &revision_info[pin->format.revision];
@@ -437,6 +450,10 @@
 	    memcmp(revision_info[PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR03H]
 			   .identifier,
 		   hdr->package_header_identifier,
+		   sizeof(hdr->package_header_identifier)) != 0 &&
+	    memcmp(revision_info[PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H]
+			   .identifier,
+		   hdr->package_header_identifier,
 		   sizeof(hdr->package_header_identifier)) != 0) {
 		return pldm_msgbuf_discard(buf, -ENOTSUP);
 	}
@@ -449,6 +466,11 @@
 		return pldm_msgbuf_discard(buf, -ENOTSUP);
 	}
 
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		checksums = 2;
+	}
+
 	rc = pldm_msgbuf_extract(buf, package_header_size);
 	if (rc) {
 		return pldm_msgbuf_discard(buf, rc);
@@ -511,6 +533,19 @@
 
 	pldm_msgbuf_extract(buf, package_header_checksum);
 
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		pldm_msgbuf_extract(buf, package_payload_checksum);
+		rc = pldm_msgbuf_span_remaining(buf, &package_payload_offset,
+						&package_payload_size);
+		if (rc) {
+			return pldm_msgbuf_discard(buf, rc);
+		}
+	} else {
+		package_payload_offset = NULL;
+		package_payload_size = 0;
+	}
+
 	rc = pldm_msgbuf_complete(buf);
 	if (rc) {
 		return rc;
@@ -525,6 +560,19 @@
 		return rc;
 	}
 
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		rc = pldm_edac_crc32_validate(package_payload_checksum,
+					      package_payload_offset,
+					      package_payload_size);
+		if (rc) {
+#if 0
+			printf("payload checksum failure, expected: %#08" PRIx32 ", found: %#08" PRIx32 "\n", package_payload_checksum, pldm_edac_crc32(package_payload_offset, package_payload_size));
+#endif
+			return rc;
+		}
+	}
+
 	/* We stash these to resolve component images later */
 	hdr->package.ptr = data;
 	hdr->package.length = length;
@@ -636,6 +684,7 @@
 	struct variable_field *field,
 	struct pldm_package_firmware_device_id_record *rec)
 {
+	size_t firmware_device_package_data_offset;
 	PLDM_MSGBUF_DEFINE_P(buf);
 	uint16_t record_len = 0;
 	int rc;
@@ -686,6 +735,17 @@
 		return pldm_msgbuf_discard(buf, rc);
 	}
 
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		rc = pldm_msgbuf_extract_uint32_to_size(
+			buf, rec->reference_manifest_data.length);
+		if (rc) {
+			return pldm_msgbuf_discard(buf, rc);
+		}
+	} else {
+		rec->reference_manifest_data.length = 0;
+	}
+
 	rc = pldm_msgbuf_span_required(
 		buf, hdr->component_bitmap_bit_length / 8,
 		(void **)&rec->applicable_components.bitmap.ptr);
@@ -699,7 +759,12 @@
 		buf, rec->component_image_set_version_string.length,
 		(void **)&rec->component_image_set_version_string.ptr);
 
-	pldm_msgbuf_span_until(buf, rec->firmware_device_package_data.length,
+	/* The total length reserved for `package_data` and `reference_manifest_data` */
+	firmware_device_package_data_offset =
+		rec->firmware_device_package_data.length +
+		rec->reference_manifest_data.length;
+
+	pldm_msgbuf_span_until(buf, firmware_device_package_data_offset,
 			       (void **)&rec->record_descriptors.ptr,
 			       &rec->record_descriptors.length);
 
@@ -710,6 +775,17 @@
 		rec->firmware_device_package_data.ptr = NULL;
 	}
 
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		pldm_msgbuf_span_required(
+			buf, rec->reference_manifest_data.length,
+			(void **)&rec->reference_manifest_data.ptr);
+
+	} else {
+		assert(rec->reference_manifest_data.length == 0);
+		rec->reference_manifest_data.ptr = NULL;
+	}
+
 	return pldm_msgbuf_complete_consumed(buf);
 }
 
@@ -3269,6 +3345,7 @@
 	struct pldm_package_downstream_device_id_record_iter *iter,
 	struct pldm_package_downstream_device_id_record *rec)
 {
+	size_t package_data_offset;
 	PLDM_MSGBUF_DEFINE_P(buf);
 	uint16_t record_len = 0;
 	int rc;
@@ -3324,6 +3401,14 @@
 		return pldm_msgbuf_discard(buf, rc);
 	}
 
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		pldm_msgbuf_extract_uint32_to_size(
+			buf, rec->reference_manifest_data.length);
+	} else {
+		rec->reference_manifest_data.length = 0;
+	}
+
 	rc = pldm_msgbuf_span_required(
 		buf, hdr->component_bitmap_bit_length / 8,
 		(void **)&rec->applicable_components.bitmap.ptr);
@@ -3344,13 +3429,28 @@
 		rec->self_contained_activation_min_version_comparison_stamp = 0;
 	}
 
-	pldm_msgbuf_span_until(buf, rec->package_data.length,
+	/* The total length reserved for `package_data` and `reference_manifest_data` */
+	package_data_offset =
+		rec->package_data.length + rec->reference_manifest_data.length;
+
+	pldm_msgbuf_span_until(buf, package_data_offset,
 			       (void **)&rec->record_descriptors.ptr,
 			       &rec->record_descriptors.length);
 
 	pldm_msgbuf_span_required(buf, rec->package_data.length,
 				  (void **)&rec->package_data.ptr);
 
+	/* Supported in package header revision 1.3 (FR04H) and above. */
+	if (hdr->package_header_format_revision >=
+	    PLDM_PACKAGE_HEADER_FORMAT_REVISION_FR04H) {
+		pldm_msgbuf_span_required(
+			buf, rec->reference_manifest_data.length,
+			(void **)&rec->reference_manifest_data.ptr);
+	} else {
+		assert(rec->reference_manifest_data.length == 0);
+		rec->reference_manifest_data.ptr = NULL;
+	}
+
 	return pldm_msgbuf_complete_consumed(buf);
 }
 
diff --git a/tests/dsp/firmware_update.cpp b/tests/dsp/firmware_update.cpp
index 4e16552..21b65ca 100644
--- a/tests/dsp/firmware_update.cpp
+++ b/tests/dsp/firmware_update.cpp
@@ -60,6 +60,11 @@
                                              0x4a, 0x99, 0xaf, 0x6d, 0x46, 0xf8,
                                              0xb1, 0x21, 0xf6, 0xbf};
 
+static constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH>
+    PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_3{0x7b, 0x29, 0x1c, 0x99, 0x6d, 0xb6,
+                                             0x42, 0x08, 0x80, 0x1B, 0x02, 0x02,
+                                             0x6E, 0x46, 0x3C, 0x78};
+
 static constexpr size_t PLDM_FWUP_PACKAGE_HEADER_EMPTY_SIZE_V1_0 = 43;
 
 static constexpr std::array<uint8_t, PLDM_TIMESTAMP104_SIZE>
@@ -5653,4 +5658,254 @@
 
     EXPECT_EQ(nr_infos, 2);
 }
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(DecodePldmFirmwareUpdatePackage, v4h1fd1fdd1dd1ddd2cii)
+{
+    const std::array<uint8_t, 182> package{
+        0x7B, 0x29, 0x1C, 0x99, 0x6D, 0xB6, 0x42, 0x08, 0x80, 0x1B, 0x02, 0x02,
+        0x6E, 0x46, 0x3C, 0x78, 0x04, 0xB4, 0x00, 0x00, 0xe9, 0x07, 0x03, 0x0b,
+        0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x76, 0x02, 0x08, 0x00, 0x01, 0x04,
+        't',  'e',  's',  't',
+
+        0x01, 0x1E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
+        0x02, 0x00, 0x00, 0x00, 0x01, 'v',  '0',  '.',  '1',  0x01, 0x00, 0x04,
+        0x00, 0x9c, 0x01, 0x00, 0x00, 0x87, 0x65,
+
+        0x01, 0x1E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00,
+        0x02, 0x00, 0x00, 0x00, 0x02, 'v',  '1',  '.',  '0',  0x01, 0x00, 0x04,
+        0x00, 0x9c, 0x01, 0x00, 0x00, 0x87, 0x65,
+
+        0x02, 0x00,
+
+        0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00,
+        0xB4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 'v',  '0',
+        '.',  '2',  0x04, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78,
+
+        0x0a, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00,
+        0xB5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 'v',  '2',
+        '.',  '0',  0x04, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78,
+
+        0xf7, 0xf7, 0xfd, 0x79,
+
+        0x46, 0xf0, 0x31, 0xa7,
+
+        0x5a,
+
+        0xa5,
+
+    };
+
+    struct pldm_package_downstream_device_id_record ddrec;
+    struct pldm_package_component_image_information info;
+    struct pldm_package_firmware_device_id_record fdrec;
+    DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR04H(pin);
+    pldm_package_header_information_pad hdr;
+    struct pldm_package_iter iter;
+    int nr_fdrec_desc = 0;
+    int nr_ddrec_desc = 0;
+    int nr_fdrec = 0;
+    int nr_ddrec = 0;
+    int nr_infos = 0;
+    int rc;
+
+    rc = decode_pldm_firmware_update_package(package.data(), package.size(),
+                                             &pin, &hdr, &iter);
+    ASSERT_EQ(rc, 0);
+
+    EXPECT_EQ(memcmp(PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_3.data(),
+                     hdr.package_header_identifier,
+                     PLDM_FWUP_PACKAGE_HEADER_IDENTIFIER_V1_3.size()),
+              0);
+    EXPECT_EQ(hdr.package_header_format_revision, 4);
+
+    static const std::array<uint8_t, 13> timestamp{0x00, 0xe9, 0x07, 0x03, 0x0b,
+                                                   0x16, 0x03, 0x00, 0x00, 0x00,
+                                                   0x00, 0x76, 0x02};
+    ASSERT_EQ(timestamp.size(), sizeof(hdr.package_release_date_time));
+    EXPECT_EQ(memcmp(timestamp.data(), hdr.package_release_date_time,
+                     timestamp.size()),
+              0);
+
+    EXPECT_EQ(hdr.component_bitmap_bit_length, 8);
+    EXPECT_EQ(hdr.package_version_string_type, 1);
+    ASSERT_EQ(hdr.package_version_string.length, 4);
+    EXPECT_EQ(memcmp("test", hdr.package_version_string.ptr,
+                     hdr.package_version_string.length),
+              0);
+    EXPECT_NE(hdr.areas.ptr, nullptr);
+    EXPECT_NE(hdr.areas.length, 0);
+    EXPECT_NE(hdr.package.ptr, nullptr);
+    EXPECT_NE(hdr.package.length, 0);
+
+    foreach_pldm_package_firmware_device_id_record(iter, fdrec, rc)
+    {
+        struct pldm_descriptor desc;
+
+        static const uint8_t expected_reference_manifest_data[] = {0x87, 0x65};
+
+        EXPECT_EQ(fdrec.descriptor_count, 1);
+        EXPECT_EQ(fdrec.device_update_option_flags.value, 0);
+        EXPECT_EQ(fdrec.component_image_set_version_string_type, 1);
+        ASSERT_EQ(fdrec.component_image_set_version_string.length, 4);
+        EXPECT_EQ(memcmp("v0.1", fdrec.component_image_set_version_string.ptr,
+                         fdrec.component_image_set_version_string.length),
+                  0);
+        ASSERT_EQ(fdrec.applicable_components.bitmap.length, 1);
+        EXPECT_EQ(*fdrec.applicable_components.bitmap.ptr, 1);
+        EXPECT_NE(fdrec.record_descriptors.length, 0);
+        EXPECT_NE(fdrec.record_descriptors.ptr, nullptr);
+        ASSERT_EQ(fdrec.firmware_device_package_data.length, 0);
+        EXPECT_EQ(fdrec.reference_manifest_data.length,
+                  sizeof(expected_reference_manifest_data));
+        EXPECT_EQ(memcmp(fdrec.reference_manifest_data.ptr,
+                         expected_reference_manifest_data,
+                         sizeof(expected_reference_manifest_data)),
+                  0);
+        foreach_pldm_package_firmware_device_id_record_descriptor(iter, fdrec,
+                                                                  desc, rc)
+        {
+            static const uint8_t iana_pen_dmtf[] = {0x9c, 0x01, 0x00, 0x00};
+
+            EXPECT_EQ(desc.descriptor_type, 1);
+            ASSERT_EQ(desc.descriptor_length, sizeof(iana_pen_dmtf));
+            EXPECT_EQ(memcmp(iana_pen_dmtf, desc.descriptor_data,
+                             sizeof(iana_pen_dmtf)),
+                      0);
+
+            nr_fdrec_desc++;
+        }
+        ASSERT_EQ(rc, 0);
+
+        nr_fdrec++;
+    }
+    ASSERT_EQ(rc, 0);
+
+    EXPECT_EQ(nr_fdrec, 1);
+    EXPECT_EQ(nr_fdrec_desc, 1);
+
+    foreach_pldm_package_downstream_device_id_record(iter, ddrec, rc)
+    {
+        struct pldm_descriptor desc;
+
+        static const uint8_t expected_reference_manifest_data[] = {0x87, 0x65};
+
+        EXPECT_EQ(ddrec.descriptor_count, 1);
+        EXPECT_EQ(ddrec.update_option_flags.value, 0);
+        EXPECT_EQ(ddrec.self_contained_activation_min_version_string_type, 1);
+        ASSERT_EQ(ddrec.self_contained_activation_min_version_string.length, 4);
+        EXPECT_EQ(
+            memcmp("v1.0",
+                   ddrec.self_contained_activation_min_version_string.ptr,
+                   ddrec.self_contained_activation_min_version_string.length),
+            0);
+        EXPECT_EQ(ddrec.self_contained_activation_min_version_comparison_stamp,
+                  0);
+        ASSERT_EQ(ddrec.applicable_components.bitmap.length, 1);
+        EXPECT_EQ(*ddrec.applicable_components.bitmap.ptr, 2);
+        EXPECT_NE(ddrec.record_descriptors.length, 0);
+        EXPECT_NE(ddrec.record_descriptors.ptr, nullptr);
+        EXPECT_EQ(ddrec.package_data.length, 0);
+        EXPECT_EQ(fdrec.reference_manifest_data.length,
+                  sizeof(expected_reference_manifest_data));
+        EXPECT_EQ(memcmp(fdrec.reference_manifest_data.ptr,
+                         expected_reference_manifest_data,
+                         sizeof(expected_reference_manifest_data)),
+                  0);
+
+        foreach_pldm_package_downstream_device_id_record_descriptor(iter, ddrec,
+                                                                    desc, rc)
+        {
+            static const uint8_t iana_pen_dmtf[] = {0x9c, 0x01, 0x00, 0x00};
+
+            EXPECT_EQ(desc.descriptor_type, 1);
+            ASSERT_EQ(desc.descriptor_length, sizeof(iana_pen_dmtf));
+            EXPECT_EQ(memcmp(iana_pen_dmtf, desc.descriptor_data,
+                             sizeof(iana_pen_dmtf)),
+                      0);
+
+            nr_ddrec_desc++;
+        }
+        ASSERT_EQ(rc, 0);
+
+        nr_ddrec++;
+    }
+    ASSERT_EQ(rc, 0);
+
+    EXPECT_EQ(nr_ddrec, 1);
+    EXPECT_EQ(nr_ddrec_desc, 1);
+
+    static const std::array<const char*, 2> component_versions = {
+        "v0.2",
+        "v2.0",
+    };
+
+    static std::array<uint8_t, 4> expected_opaque_data = {0x12, 0x34, 0x56,
+                                                          0x78};
+
+    static const std::array<pldm_package_component_image_information, 2>
+        expected_infos{
+            {{0x000a,
+              0x0000,
+              0xffffffff,
+              {0},
+              {1},
+              {nullptr, 1},
+              0x01,
+              {nullptr, 0},
+              {expected_opaque_data.data(), expected_opaque_data.size()}},
+             {0x000a,
+              0x0000,
+              0xffffffff,
+              {0},
+              {1},
+              {nullptr, 1},
+              0x01,
+              {nullptr, 0},
+              {expected_opaque_data.data(), expected_opaque_data.size()}}}};
+    static const std::array<uint8_t, 2> expected_images{0x5a, 0xa5};
+
+    foreach_pldm_package_component_image_information(iter, info, rc)
+    {
+        const struct pldm_package_component_image_information* expected;
+        const char* version;
+        uint8_t image;
+
+        expected = &expected_infos.at(nr_infos);
+        version = component_versions.at(nr_infos);
+        image = expected_images.at(nr_infos);
+
+        EXPECT_EQ(info.component_classification,
+                  expected->component_classification);
+        EXPECT_EQ(info.component_identifier, expected->component_identifier);
+        EXPECT_EQ(info.component_comparison_stamp,
+                  expected->component_comparison_stamp);
+        EXPECT_EQ(info.component_options.value,
+                  expected->component_options.value);
+        EXPECT_EQ(info.requested_component_activation_method.value,
+                  expected->requested_component_activation_method.value);
+        EXPECT_NE(info.component_image.ptr, expected->component_image.ptr);
+        EXPECT_EQ(info.component_image.length,
+                  expected->component_image.length);
+        EXPECT_EQ(*info.component_image.ptr, image);
+        EXPECT_EQ(info.component_version_string_type,
+                  expected->component_version_string_type);
+        ASSERT_EQ(info.component_version_string.length, 4);
+        EXPECT_EQ(memcmp(version, info.component_version_string.ptr,
+                         info.component_version_string.length),
+                  0);
+        EXPECT_EQ(info.component_opaque_data.length,
+                  expected->component_opaque_data.length);
+        EXPECT_EQ(memcmp(info.component_opaque_data.ptr,
+                         expected->component_opaque_data.ptr,
+                         expected->component_opaque_data.length),
+                  0);
+
+        nr_infos++;
+    }
+    ASSERT_EQ(rc, 0);
+
+    EXPECT_EQ(nr_infos, 2);
+}
 #endif
\ No newline at end of file
