firmware_update: Add DSP0267 v1.3.0 version updates

- Added `reference_manifest_data` and `payload_checksum` fields
  to relevant data structures.
- Implemented decode functionality for these fields to correctly
  parse their contents.
- Added unit tests for DSP0267 v1.3.0 to verify the new
  decoding functionality.

Change-Id: I4403ab18daffcec5a51247a8ba6cd426072dd764
Signed-off-by: Carter Chen <carter.chen.wiwynn@gmail.com>
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