diff --git a/libpldm/entity.h b/libpldm/entity.h
index 40372ff..9bc50eb 100644
--- a/libpldm/entity.h
+++ b/libpldm/entity.h
@@ -1,152 +1,152 @@
-#ifndef ENTITY_H
-#define ENTITY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @brief PLDM Entity ID Codes in DSP0249_1.1.0 specification
- */
-enum pldm_entity_id_codes {
-	PLDM_ENTITY_UNSPECIFIED = 0,
-	PLDM_ENTITY_OTHER = 1,
-
-	/* Miscellaneous Entities */
-	PLDM_ENTITY_NETWORK = 2,
-	PLDM_ENTITY_GROUP = 3,
-	PLDM_ENTITY_REMOTE_MGMT_COMM_DEVICE = 4,
-	PLDM_ENTITY_EXTERNAL_ENVIRONMENT = 5,
-	PLDM_ENTITY_COMM_CHANNEL = 6,
-	PLDM_ENTITY_TERMINUS = 7,
-	PLDM_ENTITY_PLATFORM_EVENT_LOG = 8,
-
-	/* Human Interface Entities */
-	PLDM_ENTITY_KEYPAD = 15,
-	PLDM_ENTITY_SWITCH = 16,
-	PLDM_ENTITY_PUSHBUTTON = 17,
-	PLDM_ENTITY_DISPLAY = 18,
-	PLDM_ENTITY_INDICATOR = 19,
-
-	/* Software/Firmware Entities */
-	PLDM_ENTITY_SYS_MGMT_SW = 30,
-	PLDM_ENTITY_SYS_FIRMWARE = 31,
-	PLDM_ENTITY_OPERATING_SYS = 32,
-	PLDM_ENTITY_VIRTUAL_MACHINE_MANAGER = 33,
-	PLDM_ENTITY_OS_LOADER = 34,
-	PLDM_ENTITY_DEVICE_DRIVER = 35,
-	PLDM_ENTITY_MGMT_CONTROLLER_FW = 36,
-
-	/* Chassis/Enclosure Entities */
-	PLDM_ENTITY_SYSTEM_CHASSIS = 45,
-	PLDM_ENTITY_SUB_CHASSIS = 46,
-	PLDM_ENTITY_DISK_DRIVE_BAY = 47,
-	PLDM_ENTITY_PERIPHERAL_BAY = 48,
-	PLDM_ENTITY_DEVICE_BAY = 49,
-	PLDM_ENTITY_DOOR = 50,
-	PLDM_ENTITY_ACCESS_PANEL = 51,
-	PLDM_ENTITY_COVER = 52,
-
-	/* Board/Card/Module Entities */
-	PLDM_ENTITY_BOARD = 60,
-	PLDM_ENTITY_CARD = 61,
-	PLDM_ENTITY_MODULE = 62,
-	PLDM_ENTITY_SYS_MGMT_MODULE = 63,
-	PLDM_ENTITY_SYS_BOARD = 64,
-	PLDM_ENTITY_MEMORY_BOARD = 65,
-	PLDM_ENTITY_MEMORY_MODULE = 66,
-	PLDM_ENTITY_PROC_MODULE = 67,
-	PLDM_ENTITY_ADD_IN_CARD = 68,
-	PLDM_ENTITY_CHASSIS_FRONT_PANEL_BOARD = 69,
-	PLDM_ENTITY_BACK_PANEL_BOARD = 70,
-	PLDM_ENTITY_POWER_MGMT = 71,
-	PLDM_ENTITY_POWER_SYS_BOARD = 72,
-	PLDM_ENTITY_DRIVE_BACKPLANE = 73,
-	PLDM_ENTITY_SYS_INTERNAL_EXPANSION_BOARD = 74,
-	PLDM_ENTITY_OTHER_SYS_BOARD = 75,
-	PLDM_ENTITY_CHASSIS_BACK_PANEL_BOARD = 76,
-	PLDM_ENTITY_PROCESSING_BLADE = 77,
-	PLDM_ENTITY_CONNECTIVITY_SWITCH = 78,
-	PLDM_ENTITY_PROC_MEMORY_MODULE = 79,
-	PLDM_ENTITY_IO_MODULE = 80,
-	PLDM_ENTITY_PROC_IO_MODULE = 81,
-
-	/* Cooling Entities */
-	PLDM_ENTITY_COOLING_DEVICE = 90,
-	PLDM_ENTITY_COOLING_SUBSYSTEM = 91,
-	PLDM_ENTITY_COOLING_UNIT = 92,
-	PLDM_ENTITY_FAN = 93,
-	PLDM_ENTITY_PELTIER_COOLING_DEVICE = 94,
-	PLDM_ENTITY_LIQUID_COOLING_DEVICE = 95,
-	PLDM_ENTITY_LIQUID_COOLING_SUBSYSTEM = 96,
-
-	/* Storage Device Entities */
-	PLDM_ENTITY_OTHER_STORAGE_DEVICE = 105,
-	PLDM_ENTITY_FLOPPY_DRIVE = 106,
-	PLDM_ENTITY_FIXED_DISK_HARD_DRIVE = 107,
-	PLDM_ENTITY_CD_DRIVE = 108,
-	PLDM_ENTITY_CD_DVD_DRIVE = 109,
-	PLDM_ENTITY_OTHER_SILICON_STORAGE_DEVICE = 110,
-	PLDM_ENTITY_SOLID_STATE_SRIVE = 111,
-
-	/* Power Entities */
-	PLDM_ENTITY_POWER_SUPPLY = 120,
-	PLDM_ENTITY_BATTERY = 121,
-	PLDM_ENTITY_SUPER_CAPACITOR = 122,
-	PLDM_ENTITY_POWER_CONVERTER = 123,
-	PLDM_ENTITY_DC_DC_CONVERTER = 124,
-	PLDM_ENTITY_AC_MAINS_POWER_SUPPLY = 125,
-	PLDM_ENTITY_DC_MAINS_POWER_SUPPLY = 126,
-
-	/* Chip Entities */
-	PLDM_ENTITY_PROC = 135,
-	PLDM_ENTITY_CHIPSET_COMPONENT = 136,
-	PLDM_ENTITY_MGMT_CONTROLLER = 137,
-	PLDM_ENTITY_PERIPHERAL_CONTROLLER = 138,
-	PLDM_ENTITY_SEEPROM = 139,
-	PLDM_ENTITY_NVRAM_CHIP = 140,
-	PLDM_ENTITY_FLASH_MEMORY_CHIP = 141,
-	PLDM_ENTITY_MEMORY_CHIP = 142,
-	PLDM_ENTITY_MEMORY_CONTROLLER = 143,
-	PLDM_ENTITY_NETWORK_CONTROLLER = 144,
-	PLDM_ENTITY_IO_CONTROLLER = 145,
-	PLDM_ENTITY_SOUTH_BRIDGE = 146,
-	PLDM_ENTITY_REAL_TIME_CLOCK = 147,
-	PLDM_ENTITY_FPGA_CPLD_DEVICE = 148,
-	/* Bus Entities */
-	PLDM_ENTITY_OTHER_BUS = 160,
-	PLDM_ENTITY_SYS_BUS = 161,
-	PLDM_ENTITY_I2C_BUS = 162,
-	PLDM_ENTITY_SMBUS_BUS = 163,
-	PLDM_ENTITY_SPI_BUS = 164,
-	PLDM_ENTITY_PCI_BUS = 165,
-	PLDM_ENTITY_PCI_EXPRESS_BUS = 166,
-	PLDM_ENTITY_PECI_BUS = 167,
-	PLDM_ENTITY_LPC_BUS = 168,
-	PLDM_ENTITY_USB_BUS = 169,
-	PLDM_ENTITY_FIREWIRE_BUS = 170,
-	PLDM_ENTITY_SCSI_BUS = 171,
-	PLDM_ENTITY_SATA_SAS_BUS = 172,
-	PLDM_ENTITY_PROC_FRONT_SIDE_BUS = 173,
-	PLDM_ENTITY_INTER_PROC_BUS = 174,
-
-	/* Connectors/Cables */
-	PLDM_ENTITY_CONNECTOR = 185,
-	PLDM_ENTITY_SLOT = 186,
-	PLDM_ENTITY_CABLE = 187,
-	PLDM_ENTITY_INTERCONNECT = 188,
-	PLDM_ENTITY_PLUG = 189,
-	PLDM_ENTITY_SOCKET = 190,
-
-	/* Logical */
-	PLDM_ENTITY_SYSTEM_LOGICAL = 11521,
-
-	/* OEM ranges */
-	PLDM_OEM_ENTITY_TYPE_START = 24576,
-	PLDM_OEM_ENTITY_TYPE_END = 32767,
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ENTITY_H */
+#ifndef ENTITY_H
+#define ENTITY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief PLDM Entity ID Codes in DSP0249_1.1.0 specification
+ */
+enum pldm_entity_id_codes {
+	PLDM_ENTITY_UNSPECIFIED = 0,
+	PLDM_ENTITY_OTHER = 1,
+
+	/* Miscellaneous Entities */
+	PLDM_ENTITY_NETWORK = 2,
+	PLDM_ENTITY_GROUP = 3,
+	PLDM_ENTITY_REMOTE_MGMT_COMM_DEVICE = 4,
+	PLDM_ENTITY_EXTERNAL_ENVIRONMENT = 5,
+	PLDM_ENTITY_COMM_CHANNEL = 6,
+	PLDM_ENTITY_TERMINUS = 7,
+	PLDM_ENTITY_PLATFORM_EVENT_LOG = 8,
+
+	/* Human Interface Entities */
+	PLDM_ENTITY_KEYPAD = 15,
+	PLDM_ENTITY_SWITCH = 16,
+	PLDM_ENTITY_PUSHBUTTON = 17,
+	PLDM_ENTITY_DISPLAY = 18,
+	PLDM_ENTITY_INDICATOR = 19,
+
+	/* Software/Firmware Entities */
+	PLDM_ENTITY_SYS_MGMT_SW = 30,
+	PLDM_ENTITY_SYS_FIRMWARE = 31,
+	PLDM_ENTITY_OPERATING_SYS = 32,
+	PLDM_ENTITY_VIRTUAL_MACHINE_MANAGER = 33,
+	PLDM_ENTITY_OS_LOADER = 34,
+	PLDM_ENTITY_DEVICE_DRIVER = 35,
+	PLDM_ENTITY_MGMT_CONTROLLER_FW = 36,
+
+	/* Chassis/Enclosure Entities */
+	PLDM_ENTITY_SYSTEM_CHASSIS = 45,
+	PLDM_ENTITY_SUB_CHASSIS = 46,
+	PLDM_ENTITY_DISK_DRIVE_BAY = 47,
+	PLDM_ENTITY_PERIPHERAL_BAY = 48,
+	PLDM_ENTITY_DEVICE_BAY = 49,
+	PLDM_ENTITY_DOOR = 50,
+	PLDM_ENTITY_ACCESS_PANEL = 51,
+	PLDM_ENTITY_COVER = 52,
+
+	/* Board/Card/Module Entities */
+	PLDM_ENTITY_BOARD = 60,
+	PLDM_ENTITY_CARD = 61,
+	PLDM_ENTITY_MODULE = 62,
+	PLDM_ENTITY_SYS_MGMT_MODULE = 63,
+	PLDM_ENTITY_SYS_BOARD = 64,
+	PLDM_ENTITY_MEMORY_BOARD = 65,
+	PLDM_ENTITY_MEMORY_MODULE = 66,
+	PLDM_ENTITY_PROC_MODULE = 67,
+	PLDM_ENTITY_ADD_IN_CARD = 68,
+	PLDM_ENTITY_CHASSIS_FRONT_PANEL_BOARD = 69,
+	PLDM_ENTITY_BACK_PANEL_BOARD = 70,
+	PLDM_ENTITY_POWER_MGMT = 71,
+	PLDM_ENTITY_POWER_SYS_BOARD = 72,
+	PLDM_ENTITY_DRIVE_BACKPLANE = 73,
+	PLDM_ENTITY_SYS_INTERNAL_EXPANSION_BOARD = 74,
+	PLDM_ENTITY_OTHER_SYS_BOARD = 75,
+	PLDM_ENTITY_CHASSIS_BACK_PANEL_BOARD = 76,
+	PLDM_ENTITY_PROCESSING_BLADE = 77,
+	PLDM_ENTITY_CONNECTIVITY_SWITCH = 78,
+	PLDM_ENTITY_PROC_MEMORY_MODULE = 79,
+	PLDM_ENTITY_IO_MODULE = 80,
+	PLDM_ENTITY_PROC_IO_MODULE = 81,
+
+	/* Cooling Entities */
+	PLDM_ENTITY_COOLING_DEVICE = 90,
+	PLDM_ENTITY_COOLING_SUBSYSTEM = 91,
+	PLDM_ENTITY_COOLING_UNIT = 92,
+	PLDM_ENTITY_FAN = 93,
+	PLDM_ENTITY_PELTIER_COOLING_DEVICE = 94,
+	PLDM_ENTITY_LIQUID_COOLING_DEVICE = 95,
+	PLDM_ENTITY_LIQUID_COOLING_SUBSYSTEM = 96,
+
+	/* Storage Device Entities */
+	PLDM_ENTITY_OTHER_STORAGE_DEVICE = 105,
+	PLDM_ENTITY_FLOPPY_DRIVE = 106,
+	PLDM_ENTITY_FIXED_DISK_HARD_DRIVE = 107,
+	PLDM_ENTITY_CD_DRIVE = 108,
+	PLDM_ENTITY_CD_DVD_DRIVE = 109,
+	PLDM_ENTITY_OTHER_SILICON_STORAGE_DEVICE = 110,
+	PLDM_ENTITY_SOLID_STATE_SRIVE = 111,
+
+	/* Power Entities */
+	PLDM_ENTITY_POWER_SUPPLY = 120,
+	PLDM_ENTITY_BATTERY = 121,
+	PLDM_ENTITY_SUPER_CAPACITOR = 122,
+	PLDM_ENTITY_POWER_CONVERTER = 123,
+	PLDM_ENTITY_DC_DC_CONVERTER = 124,
+	PLDM_ENTITY_AC_MAINS_POWER_SUPPLY = 125,
+	PLDM_ENTITY_DC_MAINS_POWER_SUPPLY = 126,
+
+	/* Chip Entities */
+	PLDM_ENTITY_PROC = 135,
+	PLDM_ENTITY_CHIPSET_COMPONENT = 136,
+	PLDM_ENTITY_MGMT_CONTROLLER = 137,
+	PLDM_ENTITY_PERIPHERAL_CONTROLLER = 138,
+	PLDM_ENTITY_SEEPROM = 139,
+	PLDM_ENTITY_NVRAM_CHIP = 140,
+	PLDM_ENTITY_FLASH_MEMORY_CHIP = 141,
+	PLDM_ENTITY_MEMORY_CHIP = 142,
+	PLDM_ENTITY_MEMORY_CONTROLLER = 143,
+	PLDM_ENTITY_NETWORK_CONTROLLER = 144,
+	PLDM_ENTITY_IO_CONTROLLER = 145,
+	PLDM_ENTITY_SOUTH_BRIDGE = 146,
+	PLDM_ENTITY_REAL_TIME_CLOCK = 147,
+	PLDM_ENTITY_FPGA_CPLD_DEVICE = 148,
+	/* Bus Entities */
+	PLDM_ENTITY_OTHER_BUS = 160,
+	PLDM_ENTITY_SYS_BUS = 161,
+	PLDM_ENTITY_I2C_BUS = 162,
+	PLDM_ENTITY_SMBUS_BUS = 163,
+	PLDM_ENTITY_SPI_BUS = 164,
+	PLDM_ENTITY_PCI_BUS = 165,
+	PLDM_ENTITY_PCI_EXPRESS_BUS = 166,
+	PLDM_ENTITY_PECI_BUS = 167,
+	PLDM_ENTITY_LPC_BUS = 168,
+	PLDM_ENTITY_USB_BUS = 169,
+	PLDM_ENTITY_FIREWIRE_BUS = 170,
+	PLDM_ENTITY_SCSI_BUS = 171,
+	PLDM_ENTITY_SATA_SAS_BUS = 172,
+	PLDM_ENTITY_PROC_FRONT_SIDE_BUS = 173,
+	PLDM_ENTITY_INTER_PROC_BUS = 174,
+
+	/* Connectors/Cables */
+	PLDM_ENTITY_CONNECTOR = 185,
+	PLDM_ENTITY_SLOT = 186,
+	PLDM_ENTITY_CABLE = 187,
+	PLDM_ENTITY_INTERCONNECT = 188,
+	PLDM_ENTITY_PLUG = 189,
+	PLDM_ENTITY_SOCKET = 190,
+
+	/* Logical */
+	PLDM_ENTITY_SYSTEM_LOGICAL = 11521,
+
+	/* OEM ranges */
+	PLDM_OEM_ENTITY_TYPE_START = 24576,
+	PLDM_OEM_ENTITY_TYPE_END = 32767,
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ENTITY_H */
diff --git a/libpldm/firmware_update.c b/libpldm/firmware_update.c
index fd66549..1aa0ed1 100644
--- a/libpldm/firmware_update.c
+++ b/libpldm/firmware_update.c
@@ -1,1565 +1,1565 @@
-#include "firmware_update.h"
-#include <endian.h>
-#include <string.h>
-
-/** @brief Check whether string type value is valid
- *
- *  @return true if string type value is valid, false if not
- */
-static bool is_string_type_valid(uint8_t string_type)
-{
-	switch (string_type) {
-	case PLDM_STR_TYPE_UNKNOWN:
-		return false;
-	case PLDM_STR_TYPE_ASCII:
-	case PLDM_STR_TYPE_UTF_8:
-	case PLDM_STR_TYPE_UTF_16:
-	case PLDM_STR_TYPE_UTF_16LE:
-	case PLDM_STR_TYPE_UTF_16BE:
-		return true;
-	default:
-		return false;
-	}
-}
-
-/** @brief Return the length of the descriptor type described in firmware update
- *         specification
- *
- *  @return length of the descriptor type if descriptor type is valid else
- *          return 0
- */
-static uint16_t get_descriptor_type_length(uint16_t descriptor_type)
-{
-	switch (descriptor_type) {
-
-	case PLDM_FWUP_PCI_VENDOR_ID:
-		return PLDM_FWUP_PCI_VENDOR_ID_LENGTH;
-	case PLDM_FWUP_IANA_ENTERPRISE_ID:
-		return PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH;
-	case PLDM_FWUP_UUID:
-		return PLDM_FWUP_UUID_LENGTH;
-	case PLDM_FWUP_PNP_VENDOR_ID:
-		return PLDM_FWUP_PNP_VENDOR_ID_LENGTH;
-	case PLDM_FWUP_ACPI_VENDOR_ID:
-		return PLDM_FWUP_ACPI_VENDOR_ID_LENGTH;
-	case PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID:
-		return PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID_LENGTH;
-	case PLDM_FWUP_SCSI_VENDOR_ID:
-		return PLDM_FWUP_SCSI_VENDOR_ID_LENGTH;
-	case PLDM_FWUP_PCI_DEVICE_ID:
-		return PLDM_FWUP_PCI_DEVICE_ID_LENGTH;
-	case PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID:
-		return PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID_LENGTH;
-	case PLDM_FWUP_PCI_SUBSYSTEM_ID:
-		return PLDM_FWUP_PCI_SUBSYSTEM_ID_LENGTH;
-	case PLDM_FWUP_PCI_REVISION_ID:
-		return PLDM_FWUP_PCI_REVISION_ID_LENGTH;
-	case PLDM_FWUP_PNP_PRODUCT_IDENTIFIER:
-		return PLDM_FWUP_PNP_PRODUCT_IDENTIFIER_LENGTH;
-	case PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER:
-		return PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER_LENGTH;
-	case PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING:
-		return PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING_LENGTH;
-	case PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING:
-		return PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING_LENGTH;
-	case PLDM_FWUP_SCSI_PRODUCT_ID:
-		return PLDM_FWUP_SCSI_PRODUCT_ID_LENGTH;
-	case PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE:
-		return PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE_LENGTH;
-	default:
-		return 0;
-	}
-}
-
-/** @brief Check whether ComponentResponse is valid
- *
- *  @return true if ComponentResponse is valid, false if not
- */
-static bool is_comp_resp_valid(uint8_t comp_resp)
-{
-	switch (comp_resp) {
-	case PLDM_CR_COMP_CAN_BE_UPDATED:
-	case PLDM_CR_COMP_MAY_BE_UPDATEABLE:
-		return true;
-
-	default:
-		return false;
-	}
-}
-
-/** @brief Check whether ComponentResponseCode is valid
- *
- *  @return true if ComponentResponseCode is valid, false if not
- */
-static bool is_comp_resp_code_valid(uint8_t comp_resp_code)
-{
-	switch (comp_resp_code) {
-	case PLDM_CRC_COMP_CAN_BE_UPDATED:
-	case PLDM_CRC_COMP_COMPARISON_STAMP_IDENTICAL:
-	case PLDM_CRC_COMP_COMPARISON_STAMP_LOWER:
-	case PLDM_CRC_INVALID_COMP_COMPARISON_STAMP:
-	case PLDM_CRC_COMP_CONFLICT:
-	case PLDM_CRC_COMP_PREREQUISITES_NOT_MET:
-	case PLDM_CRC_COMP_NOT_SUPPORTED:
-	case PLDM_CRC_COMP_SECURITY_RESTRICTIONS:
-	case PLDM_CRC_INCOMPLETE_COMP_IMAGE_SET:
-	case PLDM_CRC_ACTIVE_IMAGE_NOT_UPDATEABLE_SUBSEQUENTLY:
-	case PLDM_CRC_COMP_VER_STR_IDENTICAL:
-	case PLDM_CRC_COMP_VER_STR_LOWER:
-		return true;
-
-	default:
-		if (comp_resp_code >=
-			PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MIN &&
-		    comp_resp_code <=
-			PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MAX) {
-			return true;
-		}
-		return false;
-	}
-}
-
-/** @brief Check whether ComponentCompatibilityResponse is valid
- *
- *  @return true if ComponentCompatibilityResponse is valid, false if not
- */
-static bool is_comp_compatibility_resp_valid(uint8_t comp_compatibility_resp)
-{
-	switch (comp_compatibility_resp) {
-	case PLDM_CCR_COMP_CAN_BE_UPDATED:
-	case PLDM_CCR_COMP_CANNOT_BE_UPDATED:
-		return true;
-
-	default:
-		return false;
-	}
-}
-
-/** @brief Check whether ComponentCompatibilityResponse Code is valid
- *
- *  @return true if ComponentCompatibilityResponse Code is valid, false if not
- */
-static bool
-is_comp_compatibility_resp_code_valid(uint8_t comp_compatibility_resp_code)
-{
-	switch (comp_compatibility_resp_code) {
-	case PLDM_CCRC_NO_RESPONSE_CODE:
-	case PLDM_CCRC_COMP_COMPARISON_STAMP_IDENTICAL:
-	case PLDM_CCRC_COMP_COMPARISON_STAMP_LOWER:
-	case PLDM_CCRC_INVALID_COMP_COMPARISON_STAMP:
-	case PLDM_CCRC_COMP_CONFLICT:
-	case PLDM_CCRC_COMP_PREREQUISITES_NOT_MET:
-	case PLDM_CCRC_COMP_NOT_SUPPORTED:
-	case PLDM_CCRC_COMP_SECURITY_RESTRICTIONS:
-	case PLDM_CRC_INCOMPLETE_COMP_IMAGE_SET:
-	case PLDM_CCRC_COMP_INFO_NO_MATCH:
-	case PLDM_CCRC_COMP_VER_STR_IDENTICAL:
-	case PLDM_CCRC_COMP_VER_STR_LOWER:
-		return true;
-
-	default:
-		if (comp_compatibility_resp_code >=
-			PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MIN &&
-		    comp_compatibility_resp_code <=
-			PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MAX) {
-			return true;
-		}
-		return false;
-	}
-}
-
-/** @brief Check whether SelfContainedActivationRequest is valid
- *
- *  @return true if SelfContainedActivationRequest is valid, false if not
- */
-static bool
-is_self_contained_activation_req_valid(bool8_t self_contained_activation_req)
-{
-	switch (self_contained_activation_req) {
-	case PLDM_NOT_ACTIVATE_SELF_CONTAINED_COMPONENTS:
-	case PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS:
-		return true;
-
-	default:
-		return false;
-	}
-}
-
-/** @brief Check if current or previous status in GetStatus command response is
- *         valid
- *
- *	@param[in] state - current or previous different state machine state of
- *                     the FD
- *	@return true if state is valid, false if not
- */
-static bool is_state_valid(uint8_t state)
-{
-	switch (state) {
-	case PLDM_FD_STATE_IDLE:
-	case PLDM_FD_STATE_LEARN_COMPONENTS:
-	case PLDM_FD_STATE_READY_XFER:
-	case PLDM_FD_STATE_DOWNLOAD:
-	case PLDM_FD_STATE_VERIFY:
-	case PLDM_FD_STATE_APPLY:
-	case PLDM_FD_STATE_ACTIVATE:
-		return true;
-
-	default:
-		return false;
-	}
-}
-
-/** @brief Check if aux state in GetStatus command response is valid
- *
- *  @param[in] aux_state - provides additional information to the UA to describe
- *                         the current operation state of the FD/FDP
- *
- *	@return true if aux state is valid, false if not
- */
-static bool is_aux_state_valid(uint8_t aux_state)
-{
-	switch (aux_state) {
-	case PLDM_FD_OPERATION_IN_PROGRESS:
-	case PLDM_FD_OPERATION_SUCCESSFUL:
-	case PLDM_FD_OPERATION_FAILED:
-	case PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER:
-		return true;
-
-	default:
-		return false;
-	}
-}
-
-/** @brief Check if aux state status in GetStatus command response is valid
- *
- *	@param[in] aux_state_status - aux state status
- *
- *	@return true if aux state status is valid, false if not
- */
-static bool is_aux_state_status_valid(uint8_t aux_state_status)
-{
-	if (aux_state_status == PLDM_FD_AUX_STATE_IN_PROGRESS_OR_SUCCESS ||
-	    aux_state_status == PLDM_FD_TIMEOUT ||
-	    aux_state_status == PLDM_FD_GENERIC_ERROR) {
-		return true;
-	} else if (aux_state_status >=
-		       PLDM_FD_VENDOR_DEFINED_STATUS_CODE_START &&
-		   aux_state_status <= PLDM_FD_VENDOR_DEFINED_STATUS_CODE_END) {
-		return true;
-	}
-
-	return false;
-}
-
-/** @brief Check if reason code in GetStatus command response is valid
- *
- *	@param[in] reason_code - provides the reason for why the current state
- *                           entered the IDLE state
- *
- *	@return true if reason code is valid, false if not
- */
-static bool is_reason_code_valid(uint8_t reason_code)
-{
-
-	switch (reason_code) {
-	case PLDM_FD_INITIALIZATION:
-	case PLDM_FD_ACTIVATE_FW:
-	case PLDM_FD_CANCEL_UPDATE:
-	case PLDM_FD_TIMEOUT_LEARN_COMPONENT:
-	case PLDM_FD_TIMEOUT_READY_XFER:
-	case PLDM_FD_TIMEOUT_DOWNLOAD:
-	case PLDM_FD_TIMEOUT_VERIFY:
-	case PLDM_FD_TIMEOUT_APPLY:
-		return true;
-
-	default:
-		if (reason_code >= PLDM_FD_STATUS_VENDOR_DEFINED_MIN) {
-			return true;
-		}
-		return false;
-	}
-}
-
-/** @brief Check if non functioning component indication in CancelUpdate
- *         response is valid
- *
- *  @return true if non functioning component indication is valid, false if not
- */
-static bool is_non_functioning_component_indication_valid(
-    bool8_t non_functioning_component_indication)
-{
-	switch (non_functioning_component_indication) {
-	case PLDM_FWUP_COMPONENTS_FUNCTIONING:
-	case PLDM_FWUP_COMPONENTS_NOT_FUNCTIONING:
-		return true;
-
-	default:
-		return false;
-	}
-}
-
-int decode_pldm_package_header_info(
-    const uint8_t *data, size_t length,
-    struct pldm_package_header_information *package_header_info,
-    struct variable_field *package_version_str)
-{
-	if (data == NULL || package_header_info == NULL ||
-	    package_version_str == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_package_header_information)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_package_header_information *data_header =
-	    (struct pldm_package_header_information *)(data);
-
-	if (!is_string_type_valid(data_header->package_version_string_type) ||
-	    (data_header->package_version_string_length == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_package_header_information) +
-			 data_header->package_version_string_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if ((data_header->component_bitmap_bit_length %
-	     PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	memcpy(package_header_info->uuid, data_header->uuid,
-	       sizeof(data_header->uuid));
-	package_header_info->package_header_format_version =
-	    data_header->package_header_format_version;
-	package_header_info->package_header_size =
-	    le16toh(data_header->package_header_size);
-	memcpy(package_header_info->timestamp104, data_header->timestamp104,
-	       sizeof(data_header->timestamp104));
-	package_header_info->component_bitmap_bit_length =
-	    le16toh(data_header->component_bitmap_bit_length);
-	package_header_info->package_version_string_type =
-	    data_header->package_version_string_type;
-	package_header_info->package_version_string_length =
-	    data_header->package_version_string_length;
-	package_version_str->ptr =
-	    data + sizeof(struct pldm_package_header_information);
-	package_version_str->length =
-	    package_header_info->package_version_string_length;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_firmware_device_id_record(
-    const uint8_t *data, size_t length, uint16_t component_bitmap_bit_length,
-    struct pldm_firmware_device_id_record *fw_device_id_record,
-    struct variable_field *applicable_components,
-    struct variable_field *comp_image_set_version_str,
-    struct variable_field *record_descriptors,
-    struct variable_field *fw_device_pkg_data)
-{
-	if (data == NULL || fw_device_id_record == NULL ||
-	    applicable_components == NULL ||
-	    comp_image_set_version_str == NULL || record_descriptors == NULL ||
-	    fw_device_pkg_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_firmware_device_id_record)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if ((component_bitmap_bit_length %
-	     PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	struct pldm_firmware_device_id_record *data_record =
-	    (struct pldm_firmware_device_id_record *)(data);
-
-	if (!is_string_type_valid(
-		data_record->comp_image_set_version_string_type) ||
-	    (data_record->comp_image_set_version_string_length == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	fw_device_id_record->record_length =
-	    le16toh(data_record->record_length);
-	fw_device_id_record->descriptor_count = data_record->descriptor_count;
-	fw_device_id_record->device_update_option_flags.value =
-	    le32toh(data_record->device_update_option_flags.value);
-	fw_device_id_record->comp_image_set_version_string_type =
-	    data_record->comp_image_set_version_string_type;
-	fw_device_id_record->comp_image_set_version_string_length =
-	    data_record->comp_image_set_version_string_length;
-	fw_device_id_record->fw_device_pkg_data_length =
-	    le16toh(data_record->fw_device_pkg_data_length);
-
-	if (length < fw_device_id_record->record_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	uint16_t applicable_components_length =
-	    component_bitmap_bit_length / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE;
-	uint16_t calc_min_record_length =
-	    sizeof(struct pldm_firmware_device_id_record) +
-	    applicable_components_length +
-	    data_record->comp_image_set_version_string_length +
-	    PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN +
-	    fw_device_id_record->fw_device_pkg_data_length;
-
-	if (fw_device_id_record->record_length < calc_min_record_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	applicable_components->ptr =
-	    data + sizeof(struct pldm_firmware_device_id_record);
-	applicable_components->length = applicable_components_length;
-
-	comp_image_set_version_str->ptr =
-	    applicable_components->ptr + applicable_components->length;
-	comp_image_set_version_str->length =
-	    fw_device_id_record->comp_image_set_version_string_length;
-
-	record_descriptors->ptr = comp_image_set_version_str->ptr +
-				  comp_image_set_version_str->length;
-	record_descriptors->length =
-	    fw_device_id_record->record_length -
-	    sizeof(struct pldm_firmware_device_id_record) -
-	    applicable_components_length -
-	    fw_device_id_record->comp_image_set_version_string_length -
-	    fw_device_id_record->fw_device_pkg_data_length;
-
-	if (fw_device_id_record->fw_device_pkg_data_length) {
-		fw_device_pkg_data->ptr =
-		    record_descriptors->ptr + record_descriptors->length;
-		fw_device_pkg_data->length =
-		    fw_device_id_record->fw_device_pkg_data_length;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
-					uint16_t *descriptor_type,
-					struct variable_field *descriptor_data)
-{
-	uint16_t descriptor_length = 0;
-
-	if (data == NULL || descriptor_type == NULL ||
-	    descriptor_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_descriptor_tlv *entry =
-	    (struct pldm_descriptor_tlv *)(data);
-
-	*descriptor_type = le16toh(entry->descriptor_type);
-	descriptor_length = le16toh(entry->descriptor_length);
-	if (*descriptor_type != PLDM_FWUP_VENDOR_DEFINED) {
-		if (descriptor_length !=
-		    get_descriptor_type_length(*descriptor_type)) {
-			return PLDM_ERROR_INVALID_LENGTH;
-		}
-	}
-
-	if (length < (sizeof(*descriptor_type) + sizeof(descriptor_length) +
-		      descriptor_length)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	descriptor_data->ptr = entry->descriptor_data;
-	descriptor_data->length = descriptor_length;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_vendor_defined_descriptor_value(
-    const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
-    struct variable_field *descriptor_title_str,
-    struct variable_field *descriptor_data)
-{
-	if (data == NULL || descriptor_title_str_type == NULL ||
-	    descriptor_title_str == NULL || descriptor_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_vendor_defined_descriptor_title_data)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_vendor_defined_descriptor_title_data *entry =
-	    (struct pldm_vendor_defined_descriptor_title_data *)(data);
-	if (!is_string_type_valid(
-		entry->vendor_defined_descriptor_title_str_type) ||
-	    (entry->vendor_defined_descriptor_title_str_len == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	// Assuming atleast 1 byte of VendorDefinedDescriptorData
-	if (length < (sizeof(struct pldm_vendor_defined_descriptor_title_data) +
-		      entry->vendor_defined_descriptor_title_str_len)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	*descriptor_title_str_type =
-	    entry->vendor_defined_descriptor_title_str_type;
-	descriptor_title_str->ptr = entry->vendor_defined_descriptor_title_str;
-	descriptor_title_str->length =
-	    entry->vendor_defined_descriptor_title_str_len;
-
-	descriptor_data->ptr =
-	    descriptor_title_str->ptr + descriptor_title_str->length;
-	descriptor_data->length =
-	    length - sizeof(entry->vendor_defined_descriptor_title_str_type) -
-	    sizeof(entry->vendor_defined_descriptor_title_str_len) -
-	    descriptor_title_str->length;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_pldm_comp_image_info(
-    const uint8_t *data, size_t length,
-    struct pldm_component_image_information *pldm_comp_image_info,
-    struct variable_field *comp_version_str)
-{
-	if (data == NULL || pldm_comp_image_info == NULL ||
-	    comp_version_str == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_component_image_information)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_component_image_information *data_header =
-	    (struct pldm_component_image_information *)(data);
-
-	if (!is_string_type_valid(data_header->comp_version_string_type) ||
-	    (data_header->comp_version_string_length == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_component_image_information) +
-			 data_header->comp_version_string_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	pldm_comp_image_info->comp_classification =
-	    le16toh(data_header->comp_classification);
-	pldm_comp_image_info->comp_identifier =
-	    le16toh(data_header->comp_identifier);
-	pldm_comp_image_info->comp_comparison_stamp =
-	    le32toh(data_header->comp_comparison_stamp);
-	pldm_comp_image_info->comp_options.value =
-	    le16toh(data_header->comp_options.value);
-	pldm_comp_image_info->requested_comp_activation_method.value =
-	    le16toh(data_header->requested_comp_activation_method.value);
-	pldm_comp_image_info->comp_location_offset =
-	    le32toh(data_header->comp_location_offset);
-	pldm_comp_image_info->comp_size = le32toh(data_header->comp_size);
-	pldm_comp_image_info->comp_version_string_type =
-	    data_header->comp_version_string_type;
-	pldm_comp_image_info->comp_version_string_length =
-	    data_header->comp_version_string_length;
-
-	if ((pldm_comp_image_info->comp_options.bits.bit1 == false &&
-	     pldm_comp_image_info->comp_comparison_stamp !=
-		 PLDM_FWUP_INVALID_COMPONENT_COMPARISON_TIMESTAMP)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (pldm_comp_image_info->comp_location_offset == 0 ||
-	    pldm_comp_image_info->comp_size == 0) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	comp_version_str->ptr =
-	    data + sizeof(struct pldm_component_image_information);
-	comp_version_str->length =
-	    pldm_comp_image_info->comp_version_string_length;
-
-	return PLDM_SUCCESS;
-}
-
-int encode_query_device_identifiers_req(uint8_t instance_id,
-					size_t payload_length,
-					struct pldm_msg *msg)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,
-				       PLDM_QUERY_DEVICE_IDENTIFIERS, msg);
-}
-
-int decode_query_device_identifiers_resp(const struct pldm_msg *msg,
-					 size_t payload_length,
-					 uint8_t *completion_code,
-					 uint32_t *device_identifiers_len,
-					 uint8_t *descriptor_count,
-					 uint8_t **descriptor_data)
-{
-	if (msg == NULL || completion_code == NULL ||
-	    device_identifiers_len == NULL || descriptor_count == NULL ||
-	    descriptor_data == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (PLDM_SUCCESS != *completion_code) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length <
-	    sizeof(struct pldm_query_device_identifiers_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_query_device_identifiers_resp *response =
-	    (struct pldm_query_device_identifiers_resp *)msg->payload;
-	*device_identifiers_len = le32toh(response->device_identifiers_len);
-
-	if (*device_identifiers_len < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if (payload_length !=
-	    sizeof(struct pldm_query_device_identifiers_resp) +
-		*device_identifiers_len) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-	*descriptor_count = response->descriptor_count;
-
-	if (*descriptor_count == 0) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	*descriptor_data =
-	    (uint8_t *)(msg->payload +
-			sizeof(struct pldm_query_device_identifiers_resp));
-	return PLDM_SUCCESS;
-}
-
-int encode_get_firmware_parameters_req(uint8_t instance_id,
-				       size_t payload_length,
-				       struct pldm_msg *msg)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,
-				       PLDM_GET_FIRMWARE_PARAMETERS, msg);
-}
-
-int decode_get_firmware_parameters_resp(
-    const struct pldm_msg *msg, size_t payload_length,
-    struct pldm_get_firmware_parameters_resp *resp_data,
-    struct variable_field *active_comp_image_set_ver_str,
-    struct variable_field *pending_comp_image_set_ver_str,
-    struct variable_field *comp_parameter_table)
-{
-	if (msg == NULL || resp_data == NULL ||
-	    active_comp_image_set_ver_str == NULL ||
-	    pending_comp_image_set_ver_str == NULL ||
-	    comp_parameter_table == NULL || !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	resp_data->completion_code = msg->payload[0];
-	if (PLDM_SUCCESS != resp_data->completion_code) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length < sizeof(struct pldm_get_firmware_parameters_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_get_firmware_parameters_resp *response =
-	    (struct pldm_get_firmware_parameters_resp *)msg->payload;
-
-	if (!is_string_type_valid(
-		response->active_comp_image_set_ver_str_type) ||
-	    (response->active_comp_image_set_ver_str_len == 0)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (response->pending_comp_image_set_ver_str_len == 0) {
-		if (response->pending_comp_image_set_ver_str_type !=
-		    PLDM_STR_TYPE_UNKNOWN) {
-			return PLDM_ERROR_INVALID_DATA;
-		}
-	} else {
-		if (!is_string_type_valid(
-			response->pending_comp_image_set_ver_str_type)) {
-			return PLDM_ERROR_INVALID_DATA;
-		}
-	}
-
-	size_t partial_response_length =
-	    sizeof(struct pldm_get_firmware_parameters_resp) +
-	    response->active_comp_image_set_ver_str_len +
-	    response->pending_comp_image_set_ver_str_len;
-
-	if (payload_length < partial_response_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	resp_data->capabilities_during_update.value =
-	    le32toh(response->capabilities_during_update.value);
-	resp_data->comp_count = le16toh(response->comp_count);
-	resp_data->active_comp_image_set_ver_str_type =
-	    response->active_comp_image_set_ver_str_type;
-	resp_data->active_comp_image_set_ver_str_len =
-	    response->active_comp_image_set_ver_str_len;
-	resp_data->pending_comp_image_set_ver_str_type =
-	    response->pending_comp_image_set_ver_str_type;
-	resp_data->pending_comp_image_set_ver_str_len =
-	    response->pending_comp_image_set_ver_str_len;
-
-	active_comp_image_set_ver_str->ptr =
-	    msg->payload + sizeof(struct pldm_get_firmware_parameters_resp);
-	active_comp_image_set_ver_str->length =
-	    resp_data->active_comp_image_set_ver_str_len;
-
-	if (resp_data->pending_comp_image_set_ver_str_len != 0) {
-		pending_comp_image_set_ver_str->ptr =
-		    msg->payload +
-		    sizeof(struct pldm_get_firmware_parameters_resp) +
-		    resp_data->active_comp_image_set_ver_str_len;
-		pending_comp_image_set_ver_str->length =
-		    resp_data->pending_comp_image_set_ver_str_len;
-	} else {
-		pending_comp_image_set_ver_str->ptr = NULL;
-		pending_comp_image_set_ver_str->length = 0;
-	}
-
-	if (payload_length > partial_response_length && resp_data->comp_count) {
-		comp_parameter_table->ptr =
-		    msg->payload +
-		    sizeof(struct pldm_get_firmware_parameters_resp) +
-		    resp_data->active_comp_image_set_ver_str_len +
-		    resp_data->pending_comp_image_set_ver_str_len;
-		comp_parameter_table->length =
-		    payload_length - partial_response_length;
-	} else {
-		comp_parameter_table->ptr = NULL;
-		comp_parameter_table->length = 0;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int decode_get_firmware_parameters_resp_comp_entry(
-    const uint8_t *data, size_t length,
-    struct pldm_component_parameter_entry *component_data,
-    struct variable_field *active_comp_ver_str,
-    struct variable_field *pending_comp_ver_str)
-{
-	if (data == NULL || component_data == NULL ||
-	    active_comp_ver_str == NULL || pending_comp_ver_str == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (length < sizeof(struct pldm_component_parameter_entry)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_component_parameter_entry *entry =
-	    (struct pldm_component_parameter_entry *)(data);
-	if (entry->active_comp_ver_str_len == 0) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	size_t entry_length = sizeof(struct pldm_component_parameter_entry) +
-			      entry->active_comp_ver_str_len +
-			      entry->pending_comp_ver_str_len;
-
-	if (length < entry_length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	component_data->comp_classification =
-	    le16toh(entry->comp_classification);
-	component_data->comp_identifier = le16toh(entry->comp_identifier);
-	component_data->comp_classification_index =
-	    entry->comp_classification_index;
-	component_data->active_comp_comparison_stamp =
-	    le32toh(entry->active_comp_comparison_stamp);
-	component_data->active_comp_ver_str_type =
-	    entry->active_comp_ver_str_type;
-	component_data->active_comp_ver_str_len =
-	    entry->active_comp_ver_str_len;
-	memcpy(component_data->active_comp_release_date,
-	       entry->active_comp_release_date,
-	       sizeof(entry->active_comp_release_date));
-	component_data->pending_comp_comparison_stamp =
-	    le32toh(entry->pending_comp_comparison_stamp);
-	component_data->pending_comp_ver_str_type =
-	    entry->pending_comp_ver_str_type;
-	component_data->pending_comp_ver_str_len =
-	    entry->pending_comp_ver_str_len;
-	memcpy(component_data->pending_comp_release_date,
-	       entry->pending_comp_release_date,
-	       sizeof(entry->pending_comp_release_date));
-	component_data->comp_activation_methods.value =
-	    le16toh(entry->comp_activation_methods.value);
-	component_data->capabilities_during_update.value =
-	    le32toh(entry->capabilities_during_update.value);
-
-	active_comp_ver_str->ptr =
-	    data + sizeof(struct pldm_component_parameter_entry);
-	active_comp_ver_str->length = entry->active_comp_ver_str_len;
-
-	if (entry->pending_comp_ver_str_len != 0) {
-
-		pending_comp_ver_str->ptr =
-		    data + sizeof(struct pldm_component_parameter_entry) +
-		    entry->active_comp_ver_str_len;
-		pending_comp_ver_str->length = entry->pending_comp_ver_str_len;
-	} else {
-		pending_comp_ver_str->ptr = NULL;
-		pending_comp_ver_str->length = 0;
-	}
-	return PLDM_SUCCESS;
-}
-
-int encode_request_update_req(uint8_t instance_id, uint32_t max_transfer_size,
-			      uint16_t num_of_comp,
-			      uint8_t max_outstanding_transfer_req,
-			      uint16_t pkg_data_len,
-			      uint8_t comp_image_set_ver_str_type,
-			      uint8_t comp_image_set_ver_str_len,
-			      const struct variable_field *comp_img_set_ver_str,
-			      struct pldm_msg *msg, size_t payload_length)
-{
-	if (comp_img_set_ver_str == NULL || comp_img_set_ver_str->ptr == NULL ||
-	    msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(struct pldm_request_update_req) +
-				  comp_img_set_ver_str->length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if ((comp_image_set_ver_str_len == 0) ||
-	    (comp_image_set_ver_str_len != comp_img_set_ver_str->length)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if ((max_transfer_size < PLDM_FWUP_BASELINE_TRANSFER_SIZE) ||
-	    (max_outstanding_transfer_req < PLDM_FWUP_MIN_OUTSTANDING_REQ)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (!is_string_type_valid(comp_image_set_ver_str_type)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_REQUEST_UPDATE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	struct pldm_request_update_req *request =
-	    (struct pldm_request_update_req *)msg->payload;
-
-	request->max_transfer_size = htole32(max_transfer_size);
-	request->num_of_comp = htole16(num_of_comp);
-	request->max_outstanding_transfer_req = max_outstanding_transfer_req;
-	request->pkg_data_len = htole16(pkg_data_len);
-	request->comp_image_set_ver_str_type = comp_image_set_ver_str_type;
-	request->comp_image_set_ver_str_len = comp_image_set_ver_str_len;
-
-	memcpy(msg->payload + sizeof(struct pldm_request_update_req),
-	       comp_img_set_ver_str->ptr, comp_img_set_ver_str->length);
-
-	return PLDM_SUCCESS;
-}
-
-int decode_request_update_resp(const struct pldm_msg *msg,
-			       size_t payload_length, uint8_t *completion_code,
-			       uint16_t *fd_meta_data_len,
-			       uint8_t *fd_will_send_pkg_data)
-{
-	if (msg == NULL || completion_code == NULL ||
-	    fd_meta_data_len == NULL || fd_will_send_pkg_data == NULL ||
-	    !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (*completion_code != PLDM_SUCCESS) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length != sizeof(struct pldm_request_update_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_request_update_resp *response =
-	    (struct pldm_request_update_resp *)msg->payload;
-
-	*fd_meta_data_len = le16toh(response->fd_meta_data_len);
-	*fd_will_send_pkg_data = response->fd_will_send_pkg_data;
-
-	return PLDM_SUCCESS;
-}
-
-int encode_pass_component_table_req(
-    uint8_t instance_id, uint8_t transfer_flag, uint16_t comp_classification,
-    uint16_t comp_identifier, uint8_t comp_classification_index,
-    uint32_t comp_comparison_stamp, uint8_t comp_ver_str_type,
-    uint8_t comp_ver_str_len, const struct variable_field *comp_ver_str,
-    struct pldm_msg *msg, size_t payload_length)
-{
-	if (comp_ver_str == NULL || comp_ver_str->ptr == NULL || msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(struct pldm_pass_component_table_req) +
-				  comp_ver_str->length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if ((comp_ver_str_len == 0) ||
-	    (comp_ver_str_len != comp_ver_str->length)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (!is_transfer_flag_valid(transfer_flag)) {
-		return PLDM_INVALID_TRANSFER_OPERATION_FLAG;
-	}
-
-	if (!is_string_type_valid(comp_ver_str_type)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_PASS_COMPONENT_TABLE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	struct pldm_pass_component_table_req *request =
-	    (struct pldm_pass_component_table_req *)msg->payload;
-
-	request->transfer_flag = transfer_flag;
-	request->comp_classification = htole16(comp_classification);
-	request->comp_identifier = htole16(comp_identifier);
-	request->comp_classification_index = comp_classification_index;
-	request->comp_comparison_stamp = htole32(comp_comparison_stamp);
-	request->comp_ver_str_type = comp_ver_str_type;
-	request->comp_ver_str_len = comp_ver_str_len;
-
-	memcpy(msg->payload + sizeof(struct pldm_pass_component_table_req),
-	       comp_ver_str->ptr, comp_ver_str->length);
-
-	return PLDM_SUCCESS;
-}
-
-int decode_pass_component_table_resp(const struct pldm_msg *msg,
-				     const size_t payload_length,
-				     uint8_t *completion_code,
-				     uint8_t *comp_resp,
-				     uint8_t *comp_resp_code)
-{
-	if (msg == NULL || completion_code == NULL || comp_resp == NULL ||
-	    comp_resp_code == NULL || !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (*completion_code != PLDM_SUCCESS) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length != sizeof(struct pldm_pass_component_table_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_pass_component_table_resp *response =
-	    (struct pldm_pass_component_table_resp *)msg->payload;
-
-	if (!is_comp_resp_valid(response->comp_resp)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (!is_comp_resp_code_valid(response->comp_resp_code)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*comp_resp = response->comp_resp;
-	*comp_resp_code = response->comp_resp_code;
-
-	return PLDM_SUCCESS;
-}
-
-int encode_update_component_req(
-    uint8_t instance_id, uint16_t comp_classification, uint16_t comp_identifier,
-    uint8_t comp_classification_index, uint32_t comp_comparison_stamp,
-    uint32_t comp_image_size, bitfield32_t update_option_flags,
-    uint8_t comp_ver_str_type, uint8_t comp_ver_str_len,
-    const struct variable_field *comp_ver_str, struct pldm_msg *msg,
-    size_t payload_length)
-{
-	if (comp_ver_str == NULL || comp_ver_str->ptr == NULL || msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length !=
-	    sizeof(struct pldm_update_component_req) + comp_ver_str->length) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if (!comp_image_size) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if ((comp_ver_str_len == 0) ||
-	    (comp_ver_str_len != comp_ver_str->length)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (!is_string_type_valid(comp_ver_str_type)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_UPDATE_COMPONENT;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	struct pldm_update_component_req *request =
-	    (struct pldm_update_component_req *)msg->payload;
-
-	request->comp_classification = htole16(comp_classification);
-	request->comp_identifier = htole16(comp_identifier);
-	request->comp_classification_index = comp_classification_index;
-	request->comp_comparison_stamp = htole32(comp_comparison_stamp);
-	request->comp_image_size = htole32(comp_image_size);
-	request->update_option_flags.value = htole32(update_option_flags.value);
-	request->comp_ver_str_type = comp_ver_str_type;
-	request->comp_ver_str_len = comp_ver_str_len;
-
-	memcpy(msg->payload + sizeof(struct pldm_update_component_req),
-	       comp_ver_str->ptr, comp_ver_str->length);
-
-	return PLDM_SUCCESS;
-}
-
-int decode_update_component_resp(const struct pldm_msg *msg,
-				 size_t payload_length,
-				 uint8_t *completion_code,
-				 uint8_t *comp_compatability_resp,
-				 uint8_t *comp_compatability_resp_code,
-				 bitfield32_t *update_option_flags_enabled,
-				 uint16_t *time_before_req_fw_data)
-{
-	if (msg == NULL || completion_code == NULL ||
-	    comp_compatability_resp == NULL ||
-	    comp_compatability_resp_code == NULL ||
-	    update_option_flags_enabled == NULL ||
-	    time_before_req_fw_data == NULL || !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (*completion_code != PLDM_SUCCESS) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length != sizeof(struct pldm_update_component_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_update_component_resp *response =
-	    (struct pldm_update_component_resp *)msg->payload;
-
-	if (!is_comp_compatibility_resp_valid(
-		response->comp_compatability_resp)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (!is_comp_compatibility_resp_code_valid(
-		response->comp_compatability_resp_code)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*comp_compatability_resp = response->comp_compatability_resp;
-	*comp_compatability_resp_code = response->comp_compatability_resp_code;
-	update_option_flags_enabled->value =
-	    le32toh(response->update_option_flags_enabled.value);
-	*time_before_req_fw_data = le16toh(response->time_before_req_fw_data);
-
-	return PLDM_SUCCESS;
-}
-
-int decode_request_firmware_data_req(const struct pldm_msg *msg,
-				     size_t payload_length, uint32_t *offset,
-				     uint32_t *length)
-{
-	if (msg == NULL || offset == NULL || length == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	if (payload_length != sizeof(struct pldm_request_firmware_data_req)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-	struct pldm_request_firmware_data_req *request =
-	    (struct pldm_request_firmware_data_req *)msg->payload;
-	*offset = le32toh(request->offset);
-	*length = le32toh(request->length);
-
-	if (*length < PLDM_FWUP_BASELINE_TRANSFER_SIZE) {
-		return PLDM_FWUP_INVALID_TRANSFER_LENGTH;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int encode_request_firmware_data_resp(uint8_t instance_id,
-				      uint8_t completion_code,
-				      struct pldm_msg *msg,
-				      size_t payload_length)
-{
-	if (msg == NULL || !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_RESPONSE;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_REQUEST_FIRMWARE_DATA;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	msg->payload[0] = completion_code;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_transfer_complete_req(const struct pldm_msg *msg,
-				 size_t payload_length,
-				 uint8_t *transfer_result)
-{
-	if (msg == NULL || transfer_result == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(*transfer_result)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	*transfer_result = msg->payload[0];
-	return PLDM_SUCCESS;
-}
-
-int encode_transfer_complete_resp(uint8_t instance_id, uint8_t completion_code,
-				  struct pldm_msg *msg, size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(completion_code)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_RESPONSE;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_TRANSFER_COMPLETE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	msg->payload[0] = completion_code;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_verify_complete_req(const struct pldm_msg *msg,
-			       size_t payload_length, uint8_t *verify_result)
-{
-	if (msg == NULL || verify_result == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(*verify_result)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	*verify_result = msg->payload[0];
-	return PLDM_SUCCESS;
-}
-
-int encode_verify_complete_resp(uint8_t instance_id, uint8_t completion_code,
-				struct pldm_msg *msg, size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(completion_code)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_RESPONSE;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_VERIFY_COMPLETE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	msg->payload[0] = completion_code;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_apply_complete_req(
-    const struct pldm_msg *msg, size_t payload_length, uint8_t *apply_result,
-    bitfield16_t *comp_activation_methods_modification)
-{
-	if (msg == NULL || apply_result == NULL ||
-	    comp_activation_methods_modification == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(struct pldm_apply_complete_req)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_apply_complete_req *request =
-	    (struct pldm_apply_complete_req *)msg->payload;
-
-	*apply_result = request->apply_result;
-	comp_activation_methods_modification->value =
-	    le16toh(request->comp_activation_methods_modification.value);
-
-	if ((*apply_result != PLDM_FWUP_APPLY_SUCCESS_WITH_ACTIVATION_METHOD) &&
-	    comp_activation_methods_modification->value) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int encode_apply_complete_resp(uint8_t instance_id, uint8_t completion_code,
-			       struct pldm_msg *msg, size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(completion_code)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_RESPONSE;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_APPLY_COMPLETE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	msg->payload[0] = completion_code;
-
-	return PLDM_SUCCESS;
-}
-
-int encode_activate_firmware_req(uint8_t instance_id,
-				 bool8_t self_contained_activation_req,
-				 struct pldm_msg *msg, size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(struct pldm_activate_firmware_req)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	if (!is_self_contained_activation_req_valid(
-		self_contained_activation_req)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_ACTIVATE_FIRMWARE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	struct pldm_activate_firmware_req *request =
-	    (struct pldm_activate_firmware_req *)msg->payload;
-
-	request->self_contained_activation_req = self_contained_activation_req;
-
-	return PLDM_SUCCESS;
-}
-
-int decode_activate_firmware_resp(const struct pldm_msg *msg,
-				  size_t payload_length,
-				  uint8_t *completion_code,
-				  uint16_t *estimated_time_activation)
-{
-	if (msg == NULL || completion_code == NULL ||
-	    estimated_time_activation == NULL || !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (*completion_code != PLDM_SUCCESS) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length != sizeof(struct pldm_activate_firmware_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_activate_firmware_resp *response =
-	    (struct pldm_activate_firmware_resp *)msg->payload;
-
-	*estimated_time_activation =
-	    le16toh(response->estimated_time_activation);
-
-	return PLDM_SUCCESS;
-}
-
-int encode_get_status_req(uint8_t instance_id, struct pldm_msg *msg,
-			  size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != PLDM_GET_STATUS_REQ_BYTES) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_GET_STATUS;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int decode_get_status_resp(const struct pldm_msg *msg, size_t payload_length,
-			   uint8_t *completion_code, uint8_t *current_state,
-			   uint8_t *previous_state, uint8_t *aux_state,
-			   uint8_t *aux_state_status, uint8_t *progress_percent,
-			   uint8_t *reason_code,
-			   bitfield32_t *update_option_flags_enabled)
-{
-	if (msg == NULL || completion_code == NULL || current_state == NULL ||
-	    previous_state == NULL || aux_state == NULL ||
-	    aux_state_status == NULL || progress_percent == NULL ||
-	    reason_code == NULL || update_option_flags_enabled == NULL ||
-	    !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (*completion_code != PLDM_SUCCESS) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length != sizeof(struct pldm_get_status_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-	struct pldm_get_status_resp *response =
-	    (struct pldm_get_status_resp *)msg->payload;
-
-	if (!is_state_valid(response->current_state)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	if (!is_state_valid(response->previous_state)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	if (!is_aux_state_valid(response->aux_state)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	if (!is_aux_state_status_valid(response->aux_state_status)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	if (response->progress_percent > PLDM_FWUP_MAX_PROGRESS_PERCENT) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-	if (!is_reason_code_valid(response->reason_code)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if ((response->current_state == PLDM_FD_STATE_IDLE) ||
-	    (response->current_state == PLDM_FD_STATE_LEARN_COMPONENTS) ||
-	    (response->current_state == PLDM_FD_STATE_READY_XFER)) {
-		if (response->aux_state !=
-		    PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER) {
-			return PLDM_ERROR_INVALID_DATA;
-		}
-	}
-
-	*current_state = response->current_state;
-	*previous_state = response->previous_state;
-	*aux_state = response->aux_state;
-	*aux_state_status = response->aux_state_status;
-	*progress_percent = response->progress_percent;
-	*reason_code = response->reason_code;
-	update_option_flags_enabled->value =
-	    le32toh(response->update_option_flags_enabled.value);
-
-	return PLDM_SUCCESS;
-}
-
-int encode_cancel_update_component_req(uint8_t instance_id,
-				       struct pldm_msg *msg,
-				       size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_CANCEL_UPDATE_COMPONENT;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int decode_cancel_update_component_resp(const struct pldm_msg *msg,
-					size_t payload_length,
-					uint8_t *completion_code)
-{
-	if (msg == NULL || completion_code == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != sizeof(*completion_code)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	*completion_code = msg->payload[0];
-	return PLDM_SUCCESS;
-}
-
-int encode_cancel_update_req(uint8_t instance_id, struct pldm_msg *msg,
-			     size_t payload_length)
-{
-	if (msg == NULL) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	if (payload_length != PLDM_CANCEL_UPDATE_REQ_BYTES) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-
-	struct pldm_header_info header = {0};
-	header.instance = instance_id;
-	header.msg_type = PLDM_REQUEST;
-	header.pldm_type = PLDM_FWUP;
-	header.command = PLDM_CANCEL_UPDATE;
-	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
-	if (rc) {
-		return rc;
-	}
-
-	return PLDM_SUCCESS;
-}
-
-int decode_cancel_update_resp(const struct pldm_msg *msg, size_t payload_length,
-			      uint8_t *completion_code,
-			      bool8_t *non_functioning_component_indication,
-			      bitfield64_t *non_functioning_component_bitmap)
-{
-	if (msg == NULL || completion_code == NULL ||
-	    non_functioning_component_indication == NULL ||
-	    non_functioning_component_bitmap == NULL || !payload_length) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*completion_code = msg->payload[0];
-	if (*completion_code != PLDM_SUCCESS) {
-		return PLDM_SUCCESS;
-	}
-
-	if (payload_length != sizeof(struct pldm_cancel_update_resp)) {
-		return PLDM_ERROR_INVALID_LENGTH;
-	}
-	struct pldm_cancel_update_resp *response =
-	    (struct pldm_cancel_update_resp *)msg->payload;
-
-	if (!is_non_functioning_component_indication_valid(
-		response->non_functioning_component_indication)) {
-		return PLDM_ERROR_INVALID_DATA;
-	}
-
-	*non_functioning_component_indication =
-	    response->non_functioning_component_indication;
-
-	if (*non_functioning_component_indication) {
-		non_functioning_component_bitmap->value =
-		    le64toh(response->non_functioning_component_bitmap);
-	}
-
-	return PLDM_SUCCESS;
-}
+#include "firmware_update.h"
+#include <endian.h>
+#include <string.h>
+
+/** @brief Check whether string type value is valid
+ *
+ *  @return true if string type value is valid, false if not
+ */
+static bool is_string_type_valid(uint8_t string_type)
+{
+	switch (string_type) {
+	case PLDM_STR_TYPE_UNKNOWN:
+		return false;
+	case PLDM_STR_TYPE_ASCII:
+	case PLDM_STR_TYPE_UTF_8:
+	case PLDM_STR_TYPE_UTF_16:
+	case PLDM_STR_TYPE_UTF_16LE:
+	case PLDM_STR_TYPE_UTF_16BE:
+		return true;
+	default:
+		return false;
+	}
+}
+
+/** @brief Return the length of the descriptor type described in firmware update
+ *         specification
+ *
+ *  @return length of the descriptor type if descriptor type is valid else
+ *          return 0
+ */
+static uint16_t get_descriptor_type_length(uint16_t descriptor_type)
+{
+	switch (descriptor_type) {
+
+	case PLDM_FWUP_PCI_VENDOR_ID:
+		return PLDM_FWUP_PCI_VENDOR_ID_LENGTH;
+	case PLDM_FWUP_IANA_ENTERPRISE_ID:
+		return PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH;
+	case PLDM_FWUP_UUID:
+		return PLDM_FWUP_UUID_LENGTH;
+	case PLDM_FWUP_PNP_VENDOR_ID:
+		return PLDM_FWUP_PNP_VENDOR_ID_LENGTH;
+	case PLDM_FWUP_ACPI_VENDOR_ID:
+		return PLDM_FWUP_ACPI_VENDOR_ID_LENGTH;
+	case PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID:
+		return PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID_LENGTH;
+	case PLDM_FWUP_SCSI_VENDOR_ID:
+		return PLDM_FWUP_SCSI_VENDOR_ID_LENGTH;
+	case PLDM_FWUP_PCI_DEVICE_ID:
+		return PLDM_FWUP_PCI_DEVICE_ID_LENGTH;
+	case PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID:
+		return PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID_LENGTH;
+	case PLDM_FWUP_PCI_SUBSYSTEM_ID:
+		return PLDM_FWUP_PCI_SUBSYSTEM_ID_LENGTH;
+	case PLDM_FWUP_PCI_REVISION_ID:
+		return PLDM_FWUP_PCI_REVISION_ID_LENGTH;
+	case PLDM_FWUP_PNP_PRODUCT_IDENTIFIER:
+		return PLDM_FWUP_PNP_PRODUCT_IDENTIFIER_LENGTH;
+	case PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER:
+		return PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER_LENGTH;
+	case PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING:
+		return PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING_LENGTH;
+	case PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING:
+		return PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING_LENGTH;
+	case PLDM_FWUP_SCSI_PRODUCT_ID:
+		return PLDM_FWUP_SCSI_PRODUCT_ID_LENGTH;
+	case PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE:
+		return PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE_LENGTH;
+	default:
+		return 0;
+	}
+}
+
+/** @brief Check whether ComponentResponse is valid
+ *
+ *  @return true if ComponentResponse is valid, false if not
+ */
+static bool is_comp_resp_valid(uint8_t comp_resp)
+{
+	switch (comp_resp) {
+	case PLDM_CR_COMP_CAN_BE_UPDATED:
+	case PLDM_CR_COMP_MAY_BE_UPDATEABLE:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/** @brief Check whether ComponentResponseCode is valid
+ *
+ *  @return true if ComponentResponseCode is valid, false if not
+ */
+static bool is_comp_resp_code_valid(uint8_t comp_resp_code)
+{
+	switch (comp_resp_code) {
+	case PLDM_CRC_COMP_CAN_BE_UPDATED:
+	case PLDM_CRC_COMP_COMPARISON_STAMP_IDENTICAL:
+	case PLDM_CRC_COMP_COMPARISON_STAMP_LOWER:
+	case PLDM_CRC_INVALID_COMP_COMPARISON_STAMP:
+	case PLDM_CRC_COMP_CONFLICT:
+	case PLDM_CRC_COMP_PREREQUISITES_NOT_MET:
+	case PLDM_CRC_COMP_NOT_SUPPORTED:
+	case PLDM_CRC_COMP_SECURITY_RESTRICTIONS:
+	case PLDM_CRC_INCOMPLETE_COMP_IMAGE_SET:
+	case PLDM_CRC_ACTIVE_IMAGE_NOT_UPDATEABLE_SUBSEQUENTLY:
+	case PLDM_CRC_COMP_VER_STR_IDENTICAL:
+	case PLDM_CRC_COMP_VER_STR_LOWER:
+		return true;
+
+	default:
+		if (comp_resp_code >=
+			PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MIN &&
+		    comp_resp_code <=
+			PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MAX) {
+			return true;
+		}
+		return false;
+	}
+}
+
+/** @brief Check whether ComponentCompatibilityResponse is valid
+ *
+ *  @return true if ComponentCompatibilityResponse is valid, false if not
+ */
+static bool is_comp_compatibility_resp_valid(uint8_t comp_compatibility_resp)
+{
+	switch (comp_compatibility_resp) {
+	case PLDM_CCR_COMP_CAN_BE_UPDATED:
+	case PLDM_CCR_COMP_CANNOT_BE_UPDATED:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/** @brief Check whether ComponentCompatibilityResponse Code is valid
+ *
+ *  @return true if ComponentCompatibilityResponse Code is valid, false if not
+ */
+static bool
+is_comp_compatibility_resp_code_valid(uint8_t comp_compatibility_resp_code)
+{
+	switch (comp_compatibility_resp_code) {
+	case PLDM_CCRC_NO_RESPONSE_CODE:
+	case PLDM_CCRC_COMP_COMPARISON_STAMP_IDENTICAL:
+	case PLDM_CCRC_COMP_COMPARISON_STAMP_LOWER:
+	case PLDM_CCRC_INVALID_COMP_COMPARISON_STAMP:
+	case PLDM_CCRC_COMP_CONFLICT:
+	case PLDM_CCRC_COMP_PREREQUISITES_NOT_MET:
+	case PLDM_CCRC_COMP_NOT_SUPPORTED:
+	case PLDM_CCRC_COMP_SECURITY_RESTRICTIONS:
+	case PLDM_CRC_INCOMPLETE_COMP_IMAGE_SET:
+	case PLDM_CCRC_COMP_INFO_NO_MATCH:
+	case PLDM_CCRC_COMP_VER_STR_IDENTICAL:
+	case PLDM_CCRC_COMP_VER_STR_LOWER:
+		return true;
+
+	default:
+		if (comp_compatibility_resp_code >=
+			PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MIN &&
+		    comp_compatibility_resp_code <=
+			PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MAX) {
+			return true;
+		}
+		return false;
+	}
+}
+
+/** @brief Check whether SelfContainedActivationRequest is valid
+ *
+ *  @return true if SelfContainedActivationRequest is valid, false if not
+ */
+static bool
+is_self_contained_activation_req_valid(bool8_t self_contained_activation_req)
+{
+	switch (self_contained_activation_req) {
+	case PLDM_NOT_ACTIVATE_SELF_CONTAINED_COMPONENTS:
+	case PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/** @brief Check if current or previous status in GetStatus command response is
+ *         valid
+ *
+ *	@param[in] state - current or previous different state machine state of
+ *                     the FD
+ *	@return true if state is valid, false if not
+ */
+static bool is_state_valid(uint8_t state)
+{
+	switch (state) {
+	case PLDM_FD_STATE_IDLE:
+	case PLDM_FD_STATE_LEARN_COMPONENTS:
+	case PLDM_FD_STATE_READY_XFER:
+	case PLDM_FD_STATE_DOWNLOAD:
+	case PLDM_FD_STATE_VERIFY:
+	case PLDM_FD_STATE_APPLY:
+	case PLDM_FD_STATE_ACTIVATE:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/** @brief Check if aux state in GetStatus command response is valid
+ *
+ *  @param[in] aux_state - provides additional information to the UA to describe
+ *                         the current operation state of the FD/FDP
+ *
+ *	@return true if aux state is valid, false if not
+ */
+static bool is_aux_state_valid(uint8_t aux_state)
+{
+	switch (aux_state) {
+	case PLDM_FD_OPERATION_IN_PROGRESS:
+	case PLDM_FD_OPERATION_SUCCESSFUL:
+	case PLDM_FD_OPERATION_FAILED:
+	case PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/** @brief Check if aux state status in GetStatus command response is valid
+ *
+ *	@param[in] aux_state_status - aux state status
+ *
+ *	@return true if aux state status is valid, false if not
+ */
+static bool is_aux_state_status_valid(uint8_t aux_state_status)
+{
+	if (aux_state_status == PLDM_FD_AUX_STATE_IN_PROGRESS_OR_SUCCESS ||
+	    aux_state_status == PLDM_FD_TIMEOUT ||
+	    aux_state_status == PLDM_FD_GENERIC_ERROR) {
+		return true;
+	} else if (aux_state_status >=
+		       PLDM_FD_VENDOR_DEFINED_STATUS_CODE_START &&
+		   aux_state_status <= PLDM_FD_VENDOR_DEFINED_STATUS_CODE_END) {
+		return true;
+	}
+
+	return false;
+}
+
+/** @brief Check if reason code in GetStatus command response is valid
+ *
+ *	@param[in] reason_code - provides the reason for why the current state
+ *                           entered the IDLE state
+ *
+ *	@return true if reason code is valid, false if not
+ */
+static bool is_reason_code_valid(uint8_t reason_code)
+{
+
+	switch (reason_code) {
+	case PLDM_FD_INITIALIZATION:
+	case PLDM_FD_ACTIVATE_FW:
+	case PLDM_FD_CANCEL_UPDATE:
+	case PLDM_FD_TIMEOUT_LEARN_COMPONENT:
+	case PLDM_FD_TIMEOUT_READY_XFER:
+	case PLDM_FD_TIMEOUT_DOWNLOAD:
+	case PLDM_FD_TIMEOUT_VERIFY:
+	case PLDM_FD_TIMEOUT_APPLY:
+		return true;
+
+	default:
+		if (reason_code >= PLDM_FD_STATUS_VENDOR_DEFINED_MIN) {
+			return true;
+		}
+		return false;
+	}
+}
+
+/** @brief Check if non functioning component indication in CancelUpdate
+ *         response is valid
+ *
+ *  @return true if non functioning component indication is valid, false if not
+ */
+static bool is_non_functioning_component_indication_valid(
+    bool8_t non_functioning_component_indication)
+{
+	switch (non_functioning_component_indication) {
+	case PLDM_FWUP_COMPONENTS_FUNCTIONING:
+	case PLDM_FWUP_COMPONENTS_NOT_FUNCTIONING:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+int decode_pldm_package_header_info(
+    const uint8_t *data, size_t length,
+    struct pldm_package_header_information *package_header_info,
+    struct variable_field *package_version_str)
+{
+	if (data == NULL || package_header_info == NULL ||
+	    package_version_str == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_package_header_information)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_package_header_information *data_header =
+	    (struct pldm_package_header_information *)(data);
+
+	if (!is_string_type_valid(data_header->package_version_string_type) ||
+	    (data_header->package_version_string_length == 0)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_package_header_information) +
+			 data_header->package_version_string_length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if ((data_header->component_bitmap_bit_length %
+	     PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	memcpy(package_header_info->uuid, data_header->uuid,
+	       sizeof(data_header->uuid));
+	package_header_info->package_header_format_version =
+	    data_header->package_header_format_version;
+	package_header_info->package_header_size =
+	    le16toh(data_header->package_header_size);
+	memcpy(package_header_info->timestamp104, data_header->timestamp104,
+	       sizeof(data_header->timestamp104));
+	package_header_info->component_bitmap_bit_length =
+	    le16toh(data_header->component_bitmap_bit_length);
+	package_header_info->package_version_string_type =
+	    data_header->package_version_string_type;
+	package_header_info->package_version_string_length =
+	    data_header->package_version_string_length;
+	package_version_str->ptr =
+	    data + sizeof(struct pldm_package_header_information);
+	package_version_str->length =
+	    package_header_info->package_version_string_length;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_firmware_device_id_record(
+    const uint8_t *data, size_t length, uint16_t component_bitmap_bit_length,
+    struct pldm_firmware_device_id_record *fw_device_id_record,
+    struct variable_field *applicable_components,
+    struct variable_field *comp_image_set_version_str,
+    struct variable_field *record_descriptors,
+    struct variable_field *fw_device_pkg_data)
+{
+	if (data == NULL || fw_device_id_record == NULL ||
+	    applicable_components == NULL ||
+	    comp_image_set_version_str == NULL || record_descriptors == NULL ||
+	    fw_device_pkg_data == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_firmware_device_id_record)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if ((component_bitmap_bit_length %
+	     PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) != 0) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	struct pldm_firmware_device_id_record *data_record =
+	    (struct pldm_firmware_device_id_record *)(data);
+
+	if (!is_string_type_valid(
+		data_record->comp_image_set_version_string_type) ||
+	    (data_record->comp_image_set_version_string_length == 0)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	fw_device_id_record->record_length =
+	    le16toh(data_record->record_length);
+	fw_device_id_record->descriptor_count = data_record->descriptor_count;
+	fw_device_id_record->device_update_option_flags.value =
+	    le32toh(data_record->device_update_option_flags.value);
+	fw_device_id_record->comp_image_set_version_string_type =
+	    data_record->comp_image_set_version_string_type;
+	fw_device_id_record->comp_image_set_version_string_length =
+	    data_record->comp_image_set_version_string_length;
+	fw_device_id_record->fw_device_pkg_data_length =
+	    le16toh(data_record->fw_device_pkg_data_length);
+
+	if (length < fw_device_id_record->record_length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	uint16_t applicable_components_length =
+	    component_bitmap_bit_length / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE;
+	uint16_t calc_min_record_length =
+	    sizeof(struct pldm_firmware_device_id_record) +
+	    applicable_components_length +
+	    data_record->comp_image_set_version_string_length +
+	    PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN +
+	    fw_device_id_record->fw_device_pkg_data_length;
+
+	if (fw_device_id_record->record_length < calc_min_record_length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	applicable_components->ptr =
+	    data + sizeof(struct pldm_firmware_device_id_record);
+	applicable_components->length = applicable_components_length;
+
+	comp_image_set_version_str->ptr =
+	    applicable_components->ptr + applicable_components->length;
+	comp_image_set_version_str->length =
+	    fw_device_id_record->comp_image_set_version_string_length;
+
+	record_descriptors->ptr = comp_image_set_version_str->ptr +
+				  comp_image_set_version_str->length;
+	record_descriptors->length =
+	    fw_device_id_record->record_length -
+	    sizeof(struct pldm_firmware_device_id_record) -
+	    applicable_components_length -
+	    fw_device_id_record->comp_image_set_version_string_length -
+	    fw_device_id_record->fw_device_pkg_data_length;
+
+	if (fw_device_id_record->fw_device_pkg_data_length) {
+		fw_device_pkg_data->ptr =
+		    record_descriptors->ptr + record_descriptors->length;
+		fw_device_pkg_data->length =
+		    fw_device_id_record->fw_device_pkg_data_length;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
+					uint16_t *descriptor_type,
+					struct variable_field *descriptor_data)
+{
+	uint16_t descriptor_length = 0;
+
+	if (data == NULL || descriptor_type == NULL ||
+	    descriptor_data == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_descriptor_tlv *entry =
+	    (struct pldm_descriptor_tlv *)(data);
+
+	*descriptor_type = le16toh(entry->descriptor_type);
+	descriptor_length = le16toh(entry->descriptor_length);
+	if (*descriptor_type != PLDM_FWUP_VENDOR_DEFINED) {
+		if (descriptor_length !=
+		    get_descriptor_type_length(*descriptor_type)) {
+			return PLDM_ERROR_INVALID_LENGTH;
+		}
+	}
+
+	if (length < (sizeof(*descriptor_type) + sizeof(descriptor_length) +
+		      descriptor_length)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	descriptor_data->ptr = entry->descriptor_data;
+	descriptor_data->length = descriptor_length;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_vendor_defined_descriptor_value(
+    const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
+    struct variable_field *descriptor_title_str,
+    struct variable_field *descriptor_data)
+{
+	if (data == NULL || descriptor_title_str_type == NULL ||
+	    descriptor_title_str == NULL || descriptor_data == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_vendor_defined_descriptor_title_data)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_vendor_defined_descriptor_title_data *entry =
+	    (struct pldm_vendor_defined_descriptor_title_data *)(data);
+	if (!is_string_type_valid(
+		entry->vendor_defined_descriptor_title_str_type) ||
+	    (entry->vendor_defined_descriptor_title_str_len == 0)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	// Assuming atleast 1 byte of VendorDefinedDescriptorData
+	if (length < (sizeof(struct pldm_vendor_defined_descriptor_title_data) +
+		      entry->vendor_defined_descriptor_title_str_len)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	*descriptor_title_str_type =
+	    entry->vendor_defined_descriptor_title_str_type;
+	descriptor_title_str->ptr = entry->vendor_defined_descriptor_title_str;
+	descriptor_title_str->length =
+	    entry->vendor_defined_descriptor_title_str_len;
+
+	descriptor_data->ptr =
+	    descriptor_title_str->ptr + descriptor_title_str->length;
+	descriptor_data->length =
+	    length - sizeof(entry->vendor_defined_descriptor_title_str_type) -
+	    sizeof(entry->vendor_defined_descriptor_title_str_len) -
+	    descriptor_title_str->length;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_pldm_comp_image_info(
+    const uint8_t *data, size_t length,
+    struct pldm_component_image_information *pldm_comp_image_info,
+    struct variable_field *comp_version_str)
+{
+	if (data == NULL || pldm_comp_image_info == NULL ||
+	    comp_version_str == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_component_image_information)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_component_image_information *data_header =
+	    (struct pldm_component_image_information *)(data);
+
+	if (!is_string_type_valid(data_header->comp_version_string_type) ||
+	    (data_header->comp_version_string_length == 0)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_component_image_information) +
+			 data_header->comp_version_string_length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	pldm_comp_image_info->comp_classification =
+	    le16toh(data_header->comp_classification);
+	pldm_comp_image_info->comp_identifier =
+	    le16toh(data_header->comp_identifier);
+	pldm_comp_image_info->comp_comparison_stamp =
+	    le32toh(data_header->comp_comparison_stamp);
+	pldm_comp_image_info->comp_options.value =
+	    le16toh(data_header->comp_options.value);
+	pldm_comp_image_info->requested_comp_activation_method.value =
+	    le16toh(data_header->requested_comp_activation_method.value);
+	pldm_comp_image_info->comp_location_offset =
+	    le32toh(data_header->comp_location_offset);
+	pldm_comp_image_info->comp_size = le32toh(data_header->comp_size);
+	pldm_comp_image_info->comp_version_string_type =
+	    data_header->comp_version_string_type;
+	pldm_comp_image_info->comp_version_string_length =
+	    data_header->comp_version_string_length;
+
+	if ((pldm_comp_image_info->comp_options.bits.bit1 == false &&
+	     pldm_comp_image_info->comp_comparison_stamp !=
+		 PLDM_FWUP_INVALID_COMPONENT_COMPARISON_TIMESTAMP)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (pldm_comp_image_info->comp_location_offset == 0 ||
+	    pldm_comp_image_info->comp_size == 0) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	comp_version_str->ptr =
+	    data + sizeof(struct pldm_component_image_information);
+	comp_version_str->length =
+	    pldm_comp_image_info->comp_version_string_length;
+
+	return PLDM_SUCCESS;
+}
+
+int encode_query_device_identifiers_req(uint8_t instance_id,
+					size_t payload_length,
+					struct pldm_msg *msg)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,
+				       PLDM_QUERY_DEVICE_IDENTIFIERS, msg);
+}
+
+int decode_query_device_identifiers_resp(const struct pldm_msg *msg,
+					 size_t payload_length,
+					 uint8_t *completion_code,
+					 uint32_t *device_identifiers_len,
+					 uint8_t *descriptor_count,
+					 uint8_t **descriptor_data)
+{
+	if (msg == NULL || completion_code == NULL ||
+	    device_identifiers_len == NULL || descriptor_count == NULL ||
+	    descriptor_data == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (PLDM_SUCCESS != *completion_code) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length <
+	    sizeof(struct pldm_query_device_identifiers_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_query_device_identifiers_resp *response =
+	    (struct pldm_query_device_identifiers_resp *)msg->payload;
+	*device_identifiers_len = le32toh(response->device_identifiers_len);
+
+	if (*device_identifiers_len < PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if (payload_length !=
+	    sizeof(struct pldm_query_device_identifiers_resp) +
+		*device_identifiers_len) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+	*descriptor_count = response->descriptor_count;
+
+	if (*descriptor_count == 0) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	*descriptor_data =
+	    (uint8_t *)(msg->payload +
+			sizeof(struct pldm_query_device_identifiers_resp));
+	return PLDM_SUCCESS;
+}
+
+int encode_get_firmware_parameters_req(uint8_t instance_id,
+				       size_t payload_length,
+				       struct pldm_msg *msg)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	return encode_pldm_header_only(PLDM_REQUEST, instance_id, PLDM_FWUP,
+				       PLDM_GET_FIRMWARE_PARAMETERS, msg);
+}
+
+int decode_get_firmware_parameters_resp(
+    const struct pldm_msg *msg, size_t payload_length,
+    struct pldm_get_firmware_parameters_resp *resp_data,
+    struct variable_field *active_comp_image_set_ver_str,
+    struct variable_field *pending_comp_image_set_ver_str,
+    struct variable_field *comp_parameter_table)
+{
+	if (msg == NULL || resp_data == NULL ||
+	    active_comp_image_set_ver_str == NULL ||
+	    pending_comp_image_set_ver_str == NULL ||
+	    comp_parameter_table == NULL || !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	resp_data->completion_code = msg->payload[0];
+	if (PLDM_SUCCESS != resp_data->completion_code) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length < sizeof(struct pldm_get_firmware_parameters_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_get_firmware_parameters_resp *response =
+	    (struct pldm_get_firmware_parameters_resp *)msg->payload;
+
+	if (!is_string_type_valid(
+		response->active_comp_image_set_ver_str_type) ||
+	    (response->active_comp_image_set_ver_str_len == 0)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (response->pending_comp_image_set_ver_str_len == 0) {
+		if (response->pending_comp_image_set_ver_str_type !=
+		    PLDM_STR_TYPE_UNKNOWN) {
+			return PLDM_ERROR_INVALID_DATA;
+		}
+	} else {
+		if (!is_string_type_valid(
+			response->pending_comp_image_set_ver_str_type)) {
+			return PLDM_ERROR_INVALID_DATA;
+		}
+	}
+
+	size_t partial_response_length =
+	    sizeof(struct pldm_get_firmware_parameters_resp) +
+	    response->active_comp_image_set_ver_str_len +
+	    response->pending_comp_image_set_ver_str_len;
+
+	if (payload_length < partial_response_length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	resp_data->capabilities_during_update.value =
+	    le32toh(response->capabilities_during_update.value);
+	resp_data->comp_count = le16toh(response->comp_count);
+	resp_data->active_comp_image_set_ver_str_type =
+	    response->active_comp_image_set_ver_str_type;
+	resp_data->active_comp_image_set_ver_str_len =
+	    response->active_comp_image_set_ver_str_len;
+	resp_data->pending_comp_image_set_ver_str_type =
+	    response->pending_comp_image_set_ver_str_type;
+	resp_data->pending_comp_image_set_ver_str_len =
+	    response->pending_comp_image_set_ver_str_len;
+
+	active_comp_image_set_ver_str->ptr =
+	    msg->payload + sizeof(struct pldm_get_firmware_parameters_resp);
+	active_comp_image_set_ver_str->length =
+	    resp_data->active_comp_image_set_ver_str_len;
+
+	if (resp_data->pending_comp_image_set_ver_str_len != 0) {
+		pending_comp_image_set_ver_str->ptr =
+		    msg->payload +
+		    sizeof(struct pldm_get_firmware_parameters_resp) +
+		    resp_data->active_comp_image_set_ver_str_len;
+		pending_comp_image_set_ver_str->length =
+		    resp_data->pending_comp_image_set_ver_str_len;
+	} else {
+		pending_comp_image_set_ver_str->ptr = NULL;
+		pending_comp_image_set_ver_str->length = 0;
+	}
+
+	if (payload_length > partial_response_length && resp_data->comp_count) {
+		comp_parameter_table->ptr =
+		    msg->payload +
+		    sizeof(struct pldm_get_firmware_parameters_resp) +
+		    resp_data->active_comp_image_set_ver_str_len +
+		    resp_data->pending_comp_image_set_ver_str_len;
+		comp_parameter_table->length =
+		    payload_length - partial_response_length;
+	} else {
+		comp_parameter_table->ptr = NULL;
+		comp_parameter_table->length = 0;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int decode_get_firmware_parameters_resp_comp_entry(
+    const uint8_t *data, size_t length,
+    struct pldm_component_parameter_entry *component_data,
+    struct variable_field *active_comp_ver_str,
+    struct variable_field *pending_comp_ver_str)
+{
+	if (data == NULL || component_data == NULL ||
+	    active_comp_ver_str == NULL || pending_comp_ver_str == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (length < sizeof(struct pldm_component_parameter_entry)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_component_parameter_entry *entry =
+	    (struct pldm_component_parameter_entry *)(data);
+	if (entry->active_comp_ver_str_len == 0) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	size_t entry_length = sizeof(struct pldm_component_parameter_entry) +
+			      entry->active_comp_ver_str_len +
+			      entry->pending_comp_ver_str_len;
+
+	if (length < entry_length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	component_data->comp_classification =
+	    le16toh(entry->comp_classification);
+	component_data->comp_identifier = le16toh(entry->comp_identifier);
+	component_data->comp_classification_index =
+	    entry->comp_classification_index;
+	component_data->active_comp_comparison_stamp =
+	    le32toh(entry->active_comp_comparison_stamp);
+	component_data->active_comp_ver_str_type =
+	    entry->active_comp_ver_str_type;
+	component_data->active_comp_ver_str_len =
+	    entry->active_comp_ver_str_len;
+	memcpy(component_data->active_comp_release_date,
+	       entry->active_comp_release_date,
+	       sizeof(entry->active_comp_release_date));
+	component_data->pending_comp_comparison_stamp =
+	    le32toh(entry->pending_comp_comparison_stamp);
+	component_data->pending_comp_ver_str_type =
+	    entry->pending_comp_ver_str_type;
+	component_data->pending_comp_ver_str_len =
+	    entry->pending_comp_ver_str_len;
+	memcpy(component_data->pending_comp_release_date,
+	       entry->pending_comp_release_date,
+	       sizeof(entry->pending_comp_release_date));
+	component_data->comp_activation_methods.value =
+	    le16toh(entry->comp_activation_methods.value);
+	component_data->capabilities_during_update.value =
+	    le32toh(entry->capabilities_during_update.value);
+
+	active_comp_ver_str->ptr =
+	    data + sizeof(struct pldm_component_parameter_entry);
+	active_comp_ver_str->length = entry->active_comp_ver_str_len;
+
+	if (entry->pending_comp_ver_str_len != 0) {
+
+		pending_comp_ver_str->ptr =
+		    data + sizeof(struct pldm_component_parameter_entry) +
+		    entry->active_comp_ver_str_len;
+		pending_comp_ver_str->length = entry->pending_comp_ver_str_len;
+	} else {
+		pending_comp_ver_str->ptr = NULL;
+		pending_comp_ver_str->length = 0;
+	}
+	return PLDM_SUCCESS;
+}
+
+int encode_request_update_req(uint8_t instance_id, uint32_t max_transfer_size,
+			      uint16_t num_of_comp,
+			      uint8_t max_outstanding_transfer_req,
+			      uint16_t pkg_data_len,
+			      uint8_t comp_image_set_ver_str_type,
+			      uint8_t comp_image_set_ver_str_len,
+			      const struct variable_field *comp_img_set_ver_str,
+			      struct pldm_msg *msg, size_t payload_length)
+{
+	if (comp_img_set_ver_str == NULL || comp_img_set_ver_str->ptr == NULL ||
+	    msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(struct pldm_request_update_req) +
+				  comp_img_set_ver_str->length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if ((comp_image_set_ver_str_len == 0) ||
+	    (comp_image_set_ver_str_len != comp_img_set_ver_str->length)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if ((max_transfer_size < PLDM_FWUP_BASELINE_TRANSFER_SIZE) ||
+	    (max_outstanding_transfer_req < PLDM_FWUP_MIN_OUTSTANDING_REQ)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (!is_string_type_valid(comp_image_set_ver_str_type)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_REQUEST_UPDATE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	struct pldm_request_update_req *request =
+	    (struct pldm_request_update_req *)msg->payload;
+
+	request->max_transfer_size = htole32(max_transfer_size);
+	request->num_of_comp = htole16(num_of_comp);
+	request->max_outstanding_transfer_req = max_outstanding_transfer_req;
+	request->pkg_data_len = htole16(pkg_data_len);
+	request->comp_image_set_ver_str_type = comp_image_set_ver_str_type;
+	request->comp_image_set_ver_str_len = comp_image_set_ver_str_len;
+
+	memcpy(msg->payload + sizeof(struct pldm_request_update_req),
+	       comp_img_set_ver_str->ptr, comp_img_set_ver_str->length);
+
+	return PLDM_SUCCESS;
+}
+
+int decode_request_update_resp(const struct pldm_msg *msg,
+			       size_t payload_length, uint8_t *completion_code,
+			       uint16_t *fd_meta_data_len,
+			       uint8_t *fd_will_send_pkg_data)
+{
+	if (msg == NULL || completion_code == NULL ||
+	    fd_meta_data_len == NULL || fd_will_send_pkg_data == NULL ||
+	    !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (*completion_code != PLDM_SUCCESS) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length != sizeof(struct pldm_request_update_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_request_update_resp *response =
+	    (struct pldm_request_update_resp *)msg->payload;
+
+	*fd_meta_data_len = le16toh(response->fd_meta_data_len);
+	*fd_will_send_pkg_data = response->fd_will_send_pkg_data;
+
+	return PLDM_SUCCESS;
+}
+
+int encode_pass_component_table_req(
+    uint8_t instance_id, uint8_t transfer_flag, uint16_t comp_classification,
+    uint16_t comp_identifier, uint8_t comp_classification_index,
+    uint32_t comp_comparison_stamp, uint8_t comp_ver_str_type,
+    uint8_t comp_ver_str_len, const struct variable_field *comp_ver_str,
+    struct pldm_msg *msg, size_t payload_length)
+{
+	if (comp_ver_str == NULL || comp_ver_str->ptr == NULL || msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(struct pldm_pass_component_table_req) +
+				  comp_ver_str->length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if ((comp_ver_str_len == 0) ||
+	    (comp_ver_str_len != comp_ver_str->length)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (!is_transfer_flag_valid(transfer_flag)) {
+		return PLDM_INVALID_TRANSFER_OPERATION_FLAG;
+	}
+
+	if (!is_string_type_valid(comp_ver_str_type)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_PASS_COMPONENT_TABLE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	struct pldm_pass_component_table_req *request =
+	    (struct pldm_pass_component_table_req *)msg->payload;
+
+	request->transfer_flag = transfer_flag;
+	request->comp_classification = htole16(comp_classification);
+	request->comp_identifier = htole16(comp_identifier);
+	request->comp_classification_index = comp_classification_index;
+	request->comp_comparison_stamp = htole32(comp_comparison_stamp);
+	request->comp_ver_str_type = comp_ver_str_type;
+	request->comp_ver_str_len = comp_ver_str_len;
+
+	memcpy(msg->payload + sizeof(struct pldm_pass_component_table_req),
+	       comp_ver_str->ptr, comp_ver_str->length);
+
+	return PLDM_SUCCESS;
+}
+
+int decode_pass_component_table_resp(const struct pldm_msg *msg,
+				     const size_t payload_length,
+				     uint8_t *completion_code,
+				     uint8_t *comp_resp,
+				     uint8_t *comp_resp_code)
+{
+	if (msg == NULL || completion_code == NULL || comp_resp == NULL ||
+	    comp_resp_code == NULL || !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (*completion_code != PLDM_SUCCESS) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length != sizeof(struct pldm_pass_component_table_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_pass_component_table_resp *response =
+	    (struct pldm_pass_component_table_resp *)msg->payload;
+
+	if (!is_comp_resp_valid(response->comp_resp)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (!is_comp_resp_code_valid(response->comp_resp_code)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*comp_resp = response->comp_resp;
+	*comp_resp_code = response->comp_resp_code;
+
+	return PLDM_SUCCESS;
+}
+
+int encode_update_component_req(
+    uint8_t instance_id, uint16_t comp_classification, uint16_t comp_identifier,
+    uint8_t comp_classification_index, uint32_t comp_comparison_stamp,
+    uint32_t comp_image_size, bitfield32_t update_option_flags,
+    uint8_t comp_ver_str_type, uint8_t comp_ver_str_len,
+    const struct variable_field *comp_ver_str, struct pldm_msg *msg,
+    size_t payload_length)
+{
+	if (comp_ver_str == NULL || comp_ver_str->ptr == NULL || msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length !=
+	    sizeof(struct pldm_update_component_req) + comp_ver_str->length) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if (!comp_image_size) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if ((comp_ver_str_len == 0) ||
+	    (comp_ver_str_len != comp_ver_str->length)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (!is_string_type_valid(comp_ver_str_type)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_UPDATE_COMPONENT;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	struct pldm_update_component_req *request =
+	    (struct pldm_update_component_req *)msg->payload;
+
+	request->comp_classification = htole16(comp_classification);
+	request->comp_identifier = htole16(comp_identifier);
+	request->comp_classification_index = comp_classification_index;
+	request->comp_comparison_stamp = htole32(comp_comparison_stamp);
+	request->comp_image_size = htole32(comp_image_size);
+	request->update_option_flags.value = htole32(update_option_flags.value);
+	request->comp_ver_str_type = comp_ver_str_type;
+	request->comp_ver_str_len = comp_ver_str_len;
+
+	memcpy(msg->payload + sizeof(struct pldm_update_component_req),
+	       comp_ver_str->ptr, comp_ver_str->length);
+
+	return PLDM_SUCCESS;
+}
+
+int decode_update_component_resp(const struct pldm_msg *msg,
+				 size_t payload_length,
+				 uint8_t *completion_code,
+				 uint8_t *comp_compatability_resp,
+				 uint8_t *comp_compatability_resp_code,
+				 bitfield32_t *update_option_flags_enabled,
+				 uint16_t *time_before_req_fw_data)
+{
+	if (msg == NULL || completion_code == NULL ||
+	    comp_compatability_resp == NULL ||
+	    comp_compatability_resp_code == NULL ||
+	    update_option_flags_enabled == NULL ||
+	    time_before_req_fw_data == NULL || !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (*completion_code != PLDM_SUCCESS) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length != sizeof(struct pldm_update_component_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_update_component_resp *response =
+	    (struct pldm_update_component_resp *)msg->payload;
+
+	if (!is_comp_compatibility_resp_valid(
+		response->comp_compatability_resp)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (!is_comp_compatibility_resp_code_valid(
+		response->comp_compatability_resp_code)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*comp_compatability_resp = response->comp_compatability_resp;
+	*comp_compatability_resp_code = response->comp_compatability_resp_code;
+	update_option_flags_enabled->value =
+	    le32toh(response->update_option_flags_enabled.value);
+	*time_before_req_fw_data = le16toh(response->time_before_req_fw_data);
+
+	return PLDM_SUCCESS;
+}
+
+int decode_request_firmware_data_req(const struct pldm_msg *msg,
+				     size_t payload_length, uint32_t *offset,
+				     uint32_t *length)
+{
+	if (msg == NULL || offset == NULL || length == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	if (payload_length != sizeof(struct pldm_request_firmware_data_req)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+	struct pldm_request_firmware_data_req *request =
+	    (struct pldm_request_firmware_data_req *)msg->payload;
+	*offset = le32toh(request->offset);
+	*length = le32toh(request->length);
+
+	if (*length < PLDM_FWUP_BASELINE_TRANSFER_SIZE) {
+		return PLDM_FWUP_INVALID_TRANSFER_LENGTH;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int encode_request_firmware_data_resp(uint8_t instance_id,
+				      uint8_t completion_code,
+				      struct pldm_msg *msg,
+				      size_t payload_length)
+{
+	if (msg == NULL || !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_RESPONSE;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_REQUEST_FIRMWARE_DATA;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	msg->payload[0] = completion_code;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_transfer_complete_req(const struct pldm_msg *msg,
+				 size_t payload_length,
+				 uint8_t *transfer_result)
+{
+	if (msg == NULL || transfer_result == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(*transfer_result)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	*transfer_result = msg->payload[0];
+	return PLDM_SUCCESS;
+}
+
+int encode_transfer_complete_resp(uint8_t instance_id, uint8_t completion_code,
+				  struct pldm_msg *msg, size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(completion_code)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_RESPONSE;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_TRANSFER_COMPLETE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	msg->payload[0] = completion_code;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_verify_complete_req(const struct pldm_msg *msg,
+			       size_t payload_length, uint8_t *verify_result)
+{
+	if (msg == NULL || verify_result == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(*verify_result)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	*verify_result = msg->payload[0];
+	return PLDM_SUCCESS;
+}
+
+int encode_verify_complete_resp(uint8_t instance_id, uint8_t completion_code,
+				struct pldm_msg *msg, size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(completion_code)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_RESPONSE;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_VERIFY_COMPLETE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	msg->payload[0] = completion_code;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_apply_complete_req(
+    const struct pldm_msg *msg, size_t payload_length, uint8_t *apply_result,
+    bitfield16_t *comp_activation_methods_modification)
+{
+	if (msg == NULL || apply_result == NULL ||
+	    comp_activation_methods_modification == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(struct pldm_apply_complete_req)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_apply_complete_req *request =
+	    (struct pldm_apply_complete_req *)msg->payload;
+
+	*apply_result = request->apply_result;
+	comp_activation_methods_modification->value =
+	    le16toh(request->comp_activation_methods_modification.value);
+
+	if ((*apply_result != PLDM_FWUP_APPLY_SUCCESS_WITH_ACTIVATION_METHOD) &&
+	    comp_activation_methods_modification->value) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int encode_apply_complete_resp(uint8_t instance_id, uint8_t completion_code,
+			       struct pldm_msg *msg, size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(completion_code)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_RESPONSE;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_APPLY_COMPLETE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	msg->payload[0] = completion_code;
+
+	return PLDM_SUCCESS;
+}
+
+int encode_activate_firmware_req(uint8_t instance_id,
+				 bool8_t self_contained_activation_req,
+				 struct pldm_msg *msg, size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(struct pldm_activate_firmware_req)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	if (!is_self_contained_activation_req_valid(
+		self_contained_activation_req)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_ACTIVATE_FIRMWARE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	struct pldm_activate_firmware_req *request =
+	    (struct pldm_activate_firmware_req *)msg->payload;
+
+	request->self_contained_activation_req = self_contained_activation_req;
+
+	return PLDM_SUCCESS;
+}
+
+int decode_activate_firmware_resp(const struct pldm_msg *msg,
+				  size_t payload_length,
+				  uint8_t *completion_code,
+				  uint16_t *estimated_time_activation)
+{
+	if (msg == NULL || completion_code == NULL ||
+	    estimated_time_activation == NULL || !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (*completion_code != PLDM_SUCCESS) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length != sizeof(struct pldm_activate_firmware_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_activate_firmware_resp *response =
+	    (struct pldm_activate_firmware_resp *)msg->payload;
+
+	*estimated_time_activation =
+	    le16toh(response->estimated_time_activation);
+
+	return PLDM_SUCCESS;
+}
+
+int encode_get_status_req(uint8_t instance_id, struct pldm_msg *msg,
+			  size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != PLDM_GET_STATUS_REQ_BYTES) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_GET_STATUS;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int decode_get_status_resp(const struct pldm_msg *msg, size_t payload_length,
+			   uint8_t *completion_code, uint8_t *current_state,
+			   uint8_t *previous_state, uint8_t *aux_state,
+			   uint8_t *aux_state_status, uint8_t *progress_percent,
+			   uint8_t *reason_code,
+			   bitfield32_t *update_option_flags_enabled)
+{
+	if (msg == NULL || completion_code == NULL || current_state == NULL ||
+	    previous_state == NULL || aux_state == NULL ||
+	    aux_state_status == NULL || progress_percent == NULL ||
+	    reason_code == NULL || update_option_flags_enabled == NULL ||
+	    !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (*completion_code != PLDM_SUCCESS) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length != sizeof(struct pldm_get_status_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+	struct pldm_get_status_resp *response =
+	    (struct pldm_get_status_resp *)msg->payload;
+
+	if (!is_state_valid(response->current_state)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	if (!is_state_valid(response->previous_state)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	if (!is_aux_state_valid(response->aux_state)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	if (!is_aux_state_status_valid(response->aux_state_status)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	if (response->progress_percent > PLDM_FWUP_MAX_PROGRESS_PERCENT) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+	if (!is_reason_code_valid(response->reason_code)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if ((response->current_state == PLDM_FD_STATE_IDLE) ||
+	    (response->current_state == PLDM_FD_STATE_LEARN_COMPONENTS) ||
+	    (response->current_state == PLDM_FD_STATE_READY_XFER)) {
+		if (response->aux_state !=
+		    PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER) {
+			return PLDM_ERROR_INVALID_DATA;
+		}
+	}
+
+	*current_state = response->current_state;
+	*previous_state = response->previous_state;
+	*aux_state = response->aux_state;
+	*aux_state_status = response->aux_state_status;
+	*progress_percent = response->progress_percent;
+	*reason_code = response->reason_code;
+	update_option_flags_enabled->value =
+	    le32toh(response->update_option_flags_enabled.value);
+
+	return PLDM_SUCCESS;
+}
+
+int encode_cancel_update_component_req(uint8_t instance_id,
+				       struct pldm_msg *msg,
+				       size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_CANCEL_UPDATE_COMPONENT;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int decode_cancel_update_component_resp(const struct pldm_msg *msg,
+					size_t payload_length,
+					uint8_t *completion_code)
+{
+	if (msg == NULL || completion_code == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != sizeof(*completion_code)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	*completion_code = msg->payload[0];
+	return PLDM_SUCCESS;
+}
+
+int encode_cancel_update_req(uint8_t instance_id, struct pldm_msg *msg,
+			     size_t payload_length)
+{
+	if (msg == NULL) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	if (payload_length != PLDM_CANCEL_UPDATE_REQ_BYTES) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+
+	struct pldm_header_info header = {0};
+	header.instance = instance_id;
+	header.msg_type = PLDM_REQUEST;
+	header.pldm_type = PLDM_FWUP;
+	header.command = PLDM_CANCEL_UPDATE;
+	uint8_t rc = pack_pldm_header(&header, &(msg->hdr));
+	if (rc) {
+		return rc;
+	}
+
+	return PLDM_SUCCESS;
+}
+
+int decode_cancel_update_resp(const struct pldm_msg *msg, size_t payload_length,
+			      uint8_t *completion_code,
+			      bool8_t *non_functioning_component_indication,
+			      bitfield64_t *non_functioning_component_bitmap)
+{
+	if (msg == NULL || completion_code == NULL ||
+	    non_functioning_component_indication == NULL ||
+	    non_functioning_component_bitmap == NULL || !payload_length) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*completion_code = msg->payload[0];
+	if (*completion_code != PLDM_SUCCESS) {
+		return PLDM_SUCCESS;
+	}
+
+	if (payload_length != sizeof(struct pldm_cancel_update_resp)) {
+		return PLDM_ERROR_INVALID_LENGTH;
+	}
+	struct pldm_cancel_update_resp *response =
+	    (struct pldm_cancel_update_resp *)msg->payload;
+
+	if (!is_non_functioning_component_indication_valid(
+		response->non_functioning_component_indication)) {
+		return PLDM_ERROR_INVALID_DATA;
+	}
+
+	*non_functioning_component_indication =
+	    response->non_functioning_component_indication;
+
+	if (*non_functioning_component_indication) {
+		non_functioning_component_bitmap->value =
+		    le64toh(response->non_functioning_component_bitmap);
+	}
+
+	return PLDM_SUCCESS;
+}
diff --git a/libpldm/firmware_update.h b/libpldm/firmware_update.h
index ed403bb..a47d80b 100644
--- a/libpldm/firmware_update.h
+++ b/libpldm/firmware_update.h
@@ -1,1132 +1,1132 @@
-#ifndef FW_UPDATE_H
-#define FW_UPDATE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "base.h"
-#include "stdbool.h"
-#include "utils.h"
-
-#define PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE 8
-#define PLDM_FWUP_INVALID_COMPONENT_COMPARISON_TIMESTAMP 0xFFFFFFFF
-#define PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES 0
-/** @brief Minimum length of device descriptor, 2 bytes for descriptor type,
- *         2 bytes for descriptor length and atleast 1 byte of descriptor data
- */
-#define PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN 5
-#define PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES 0
-#define PLDM_FWUP_BASELINE_TRANSFER_SIZE 32
-#define PLDM_FWUP_MIN_OUTSTANDING_REQ 1
-#define PLDM_GET_STATUS_REQ_BYTES 0
-/* Maximum progress percentage value*/
-#define PLDM_FWUP_MAX_PROGRESS_PERCENT 0x65
-#define PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES 0
-#define PLDM_CANCEL_UPDATE_REQ_BYTES 0
-
-/** @brief PLDM Firmware update commands
- */
-enum pldm_firmware_update_commands {
-	PLDM_QUERY_DEVICE_IDENTIFIERS = 0x01,
-	PLDM_GET_FIRMWARE_PARAMETERS = 0x02,
-	PLDM_REQUEST_UPDATE = 0x10,
-	PLDM_PASS_COMPONENT_TABLE = 0x13,
-	PLDM_UPDATE_COMPONENT = 0x14,
-	PLDM_REQUEST_FIRMWARE_DATA = 0x15,
-	PLDM_TRANSFER_COMPLETE = 0x16,
-	PLDM_VERIFY_COMPLETE = 0x17,
-	PLDM_APPLY_COMPLETE = 0x18,
-	PLDM_ACTIVATE_FIRMWARE = 0x1A,
-	PLDM_GET_STATUS = 0x1B,
-	PLDM_CANCEL_UPDATE_COMPONENT = 0x1C,
-	PLDM_CANCEL_UPDATE = 0x1D
-};
-
-/** @brief PLDM Firmware update completion codes
- */
-enum pldm_firmware_update_completion_codes {
-	PLDM_FWUP_NOT_IN_UPDATE_MODE = 0x80,
-	PLDM_FWUP_ALREADY_IN_UPDATE_MODE = 0x81,
-	PLDM_FWUP_DATA_OUT_OF_RANGE = 0x82,
-	PLDM_FWUP_INVALID_TRANSFER_LENGTH = 0x83,
-	PLDM_FWUP_INVALID_STATE_FOR_COMMAND = 0x84,
-	PLDM_FWUP_INCOMPLETE_UPDATE = 0x85,
-	PLDM_FWUP_BUSY_IN_BACKGROUND = 0x86,
-	PLDM_FWUP_CANCEL_PENDING = 0x87,
-	PLDM_FWUP_COMMAND_NOT_EXPECTED = 0x87,
-	PLDM_FWUP_RETRY_REQUEST_FW_DATA = 0x89,
-	PLDM_FWUP_UNABLE_TO_INITIATE_UPDATE = 0x8A,
-	PLDM_FWUP_ACTIVATION_NOT_REQUIRED = 0x8B,
-	PLDM_FWUP_SELF_CONTAINED_ACTIVATION_NOT_PERMITTED = 0x8C,
-	PLDM_FWUP_NO_DEVICE_METADATA = 0x8D,
-	PLDM_FWUP_RETRY_REQUEST_UPDATE = 0x8E,
-	PLDM_FWUP_NO_PACKAGE_DATA = 0x8F,
-	PLDM_FWUP_INVALID_TRANSFER_HANDLE = 0x90,
-	PLDM_FWUP_INVALID_TRANSFER_OPERATION_FLAG = 0x91,
-	PLDM_FWUP_ACTIVATE_PENDING_IMAGE_NOT_PERMITTED = 0x92,
-	PLDM_FWUP_PACKAGE_DATA_ERROR = 0x93
-};
-
-/** @brief String type values defined in the PLDM firmware update specification
- */
-enum pldm_firmware_update_string_type {
-	PLDM_STR_TYPE_UNKNOWN = 0,
-	PLDM_STR_TYPE_ASCII = 1,
-	PLDM_STR_TYPE_UTF_8 = 2,
-	PLDM_STR_TYPE_UTF_16 = 3,
-	PLDM_STR_TYPE_UTF_16LE = 4,
-	PLDM_STR_TYPE_UTF_16BE = 5
-};
-
-/** @brief Descriptor types defined in PLDM firmware update specification
- */
-enum pldm_firmware_update_descriptor_types {
-	PLDM_FWUP_PCI_VENDOR_ID = 0x0000,
-	PLDM_FWUP_IANA_ENTERPRISE_ID = 0x0001,
-	PLDM_FWUP_UUID = 0x0002,
-	PLDM_FWUP_PNP_VENDOR_ID = 0x0003,
-	PLDM_FWUP_ACPI_VENDOR_ID = 0x0004,
-	PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID = 0x0005,
-	PLDM_FWUP_SCSI_VENDOR_ID = 0x0006,
-	PLDM_FWUP_PCI_DEVICE_ID = 0x0100,
-	PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID = 0x0101,
-	PLDM_FWUP_PCI_SUBSYSTEM_ID = 0x0102,
-	PLDM_FWUP_PCI_REVISION_ID = 0x0103,
-	PLDM_FWUP_PNP_PRODUCT_IDENTIFIER = 0x0104,
-	PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER = 0x0105,
-	PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING = 0x0106,
-	PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING = 0x0107,
-	PLDM_FWUP_SCSI_PRODUCT_ID = 0x0108,
-	PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE = 0x0109,
-	PLDM_FWUP_VENDOR_DEFINED = 0xFFFF
-};
-
-/** @brief Descriptor types length defined in PLDM firmware update specification
- */
-enum pldm_firmware_update_descriptor_types_length {
-	PLDM_FWUP_PCI_VENDOR_ID_LENGTH = 2,
-	PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH = 4,
-	PLDM_FWUP_UUID_LENGTH = 16,
-	PLDM_FWUP_PNP_VENDOR_ID_LENGTH = 3,
-	PLDM_FWUP_ACPI_VENDOR_ID_LENGTH = 4,
-	PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID_LENGTH = 3,
-	PLDM_FWUP_SCSI_VENDOR_ID_LENGTH = 8,
-	PLDM_FWUP_PCI_DEVICE_ID_LENGTH = 2,
-	PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID_LENGTH = 2,
-	PLDM_FWUP_PCI_SUBSYSTEM_ID_LENGTH = 2,
-	PLDM_FWUP_PCI_REVISION_ID_LENGTH = 1,
-	PLDM_FWUP_PNP_PRODUCT_IDENTIFIER_LENGTH = 4,
-	PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER_LENGTH = 4,
-	PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING_LENGTH = 40,
-	PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING_LENGTH = 10,
-	PLDM_FWUP_SCSI_PRODUCT_ID_LENGTH = 16,
-	PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE_LENGTH = 4
-};
-
-/** @brief ComponentClassification values defined in firmware update
- *         specification
- */
-enum pldm_component_classification_values {
-	PLDM_COMP_UNKNOWN = 0x0000,
-	PLDM_COMP_OTHER = 0x0001,
-	PLDM_COMP_DRIVER = 0x0002,
-	PLDM_COMP_CONFIGURATION_SOFTWARE = 0x0003,
-	PLDM_COMP_APPLICATION_SOFTWARE = 0x0004,
-	PLDM_COMP_INSTRUMENTATION = 0x0005,
-	PLDM_COMP_FIRMWARE_OR_BIOS = 0x0006,
-	PLDM_COMP_DIAGNOSTIC_SOFTWARE = 0x0007,
-	PLDM_COMP_OPERATING_SYSTEM = 0x0008,
-	PLDM_COMP_MIDDLEWARE = 0x0009,
-	PLDM_COMP_FIRMWARE = 0x000A,
-	PLDM_COMP_BIOS_OR_FCODE = 0x000B,
-	PLDM_COMP_SUPPORT_OR_SERVICEPACK = 0x000C,
-	PLDM_COMP_SOFTWARE_BUNDLE = 0x000D,
-	PLDM_COMP_DOWNSTREAM_DEVICE = 0xFFFF
-};
-
-/** @brief ComponentActivationMethods is the bit position in the bitfield that
- *         provides the capability of the FD for firmware activation. Multiple
- *         activation methods can be supported.
- */
-enum pldm_comp_activation_methods {
-	PLDM_ACTIVATION_AUTOMATIC = 0,
-	PLDM_ACTIVATION_SELF_CONTAINED = 1,
-	PLDM_ACTIVATION_MEDIUM_SPECIFIC_RESET = 2,
-	PLDM_ACTIVATION_SYSTEM_REBOOT = 3,
-	PLDM_ACTIVATION_DC_POWER_CYCLE = 4,
-	PLDM_ACTIVATION_AC_POWER_CYCLE = 5,
-	PLDM_SUPPORTS_ACTIVATE_PENDING_IMAGE = 6,
-	PLDM_SUPPORTS_ACTIVATE_PENDING_IMAGE_SET = 7
-};
-
-/** @brief ComponentResponse values in the response of PassComponentTable
- */
-enum pldm_component_responses {
-	PLDM_CR_COMP_CAN_BE_UPDATED = 0,
-	PLDM_CR_COMP_MAY_BE_UPDATEABLE = 1
-};
-
-/** @brief ComponentResponseCode values in the response of PassComponentTable
- */
-enum pldm_component_response_codes {
-	PLDM_CRC_COMP_CAN_BE_UPDATED = 0x00,
-	PLDM_CRC_COMP_COMPARISON_STAMP_IDENTICAL = 0x01,
-	PLDM_CRC_COMP_COMPARISON_STAMP_LOWER = 0x02,
-	PLDM_CRC_INVALID_COMP_COMPARISON_STAMP = 0x03,
-	PLDM_CRC_COMP_CONFLICT = 0x04,
-	PLDM_CRC_COMP_PREREQUISITES_NOT_MET = 0x05,
-	PLDM_CRC_COMP_NOT_SUPPORTED = 0x06,
-	PLDM_CRC_COMP_SECURITY_RESTRICTIONS = 0x07,
-	PLDM_CRC_INCOMPLETE_COMP_IMAGE_SET = 0x08,
-	PLDM_CRC_ACTIVE_IMAGE_NOT_UPDATEABLE_SUBSEQUENTLY = 0x09,
-	PLDM_CRC_COMP_VER_STR_IDENTICAL = 0x0A,
-	PLDM_CRC_COMP_VER_STR_LOWER = 0x0B,
-	PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MIN = 0xD0,
-	PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MAX = 0xEF
-};
-
-/** @brief ComponentCompatibilityResponse values in the response of
- *         UpdateComponent
- */
-enum pldm_component_compatability_responses {
-	PLDM_CCR_COMP_CAN_BE_UPDATED = 0,
-	PLDM_CCR_COMP_CANNOT_BE_UPDATED = 1
-};
-
-/** @brief ComponentCompatibilityResponse Code values in the response of
- *         UpdateComponent
- */
-enum pldm_component_compatability_response_codes {
-	PLDM_CCRC_NO_RESPONSE_CODE = 0x00,
-	PLDM_CCRC_COMP_COMPARISON_STAMP_IDENTICAL = 0x01,
-	PLDM_CCRC_COMP_COMPARISON_STAMP_LOWER = 0x02,
-	PLDM_CCRC_INVALID_COMP_COMPARISON_STAMP = 0x03,
-	PLDM_CCRC_COMP_CONFLICT = 0x04,
-	PLDM_CCRC_COMP_PREREQUISITES_NOT_MET = 0x05,
-	PLDM_CCRC_COMP_NOT_SUPPORTED = 0x06,
-	PLDM_CCRC_COMP_SECURITY_RESTRICTIONS = 0x07,
-	PLDM_CCRC_INCOMPLETE_COMP_IMAGE_SET = 0x08,
-	PLDM_CCRC_COMP_INFO_NO_MATCH = 0x09,
-	PLDM_CCRC_COMP_VER_STR_IDENTICAL = 0x0A,
-	PLDM_CCRC_COMP_VER_STR_LOWER = 0x0B,
-	PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MIN = 0xD0,
-	PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MAX = 0xEF
-};
-
-/** @brief Common error codes in TransferComplete, VerifyComplete and
- *        ApplyComplete request
- */
-enum pldm_firmware_update_common_error_codes {
-	PLDM_FWUP_TIME_OUT = 0x09,
-	PLDM_FWUP_GENERIC_ERROR = 0x0A
-};
-
-/** @brief TransferResult values in the request of TransferComplete
- */
-enum pldm_firmware_update_transfer_result_values {
-	PLDM_FWUP_TRANSFER_SUCCESS = 0x00,
-	PLDM_FWUP_TRANSFER_ERROR_IMAGE_CORRUPT = 0x02,
-	PLDM_FWUP_TRANSFER_ERROR_VERSION_MISMATCH = 0x02,
-	PLDM_FWUP_FD_ABORTED_TRANSFER = 0x03,
-	PLDM_FWUP_FD_ABORTED_TRANSFER_LOW_POWER_STATE = 0x0B,
-	PLDM_FWUP_FD_ABORTED_TRANSFER_RESET_NEEDED = 0x0C,
-	PLDM_FWUP_FD_ABORTED_TRANSFER_STORAGE_ISSUE = 0x0D,
-	PLDM_FWUP_VENDOR_TRANSFER_RESULT_RANGE_MIN = 0x70,
-	PLDM_FWUP_VENDOR_TRANSFER_RESULT_RANGE_MAX = 0x8F
-};
-
-/**@brief VerifyResult values in the request of VerifyComplete
- */
-enum pldm_firmware_update_verify_result_values {
-	PLDM_FWUP_VERIFY_SUCCESS = 0x00,
-	PLDM_FWUP_VERIFY_ERROR_VERIFICATION_FAILURE = 0x01,
-	PLDM_FWUP_VERIFY_ERROR_VERSION_MISMATCH = 0x02,
-	PLDM_FWUP_VERIFY_FAILED_FD_SECURITY_CHECKS = 0x03,
-	PLDM_FWUP_VERIFY_ERROR_IMAGE_INCOMPLETE = 0x04,
-	PLDM_FWUP_VENDOR_VERIFY_RESULT_RANGE_MIN = 0x90,
-	PLDM_FWUP_VENDOR_VERIFY_RESULT_RANGE_MAX = 0xAF
-};
-
-/**@brief ApplyResult values in the request of ApplyComplete
- */
-enum pldm_firmware_update_apply_result_values {
-	PLDM_FWUP_APPLY_SUCCESS = 0x00,
-	PLDM_FWUP_APPLY_SUCCESS_WITH_ACTIVATION_METHOD = 0x01,
-	PLDM_FWUP_APPLY_FAILURE_MEMORY_ISSUE = 0x02,
-	PLDM_FWUP_VENDOR_APPLY_RESULT_RANGE_MIN = 0xB0,
-	PLDM_FWUP_VENDOR_APPLY_RESULT_RANGE_MAX = 0xCF
-};
-
-/** @brief SelfContainedActivationRequest in the request of ActivateFirmware
- */
-enum pldm_self_contained_activation_req {
-	PLDM_NOT_ACTIVATE_SELF_CONTAINED_COMPONENTS = false,
-	PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS = true
-};
-
-/** @brief Current state/previous state of the FD or FDP returned in GetStatus
- *         response
- */
-enum pldm_firmware_device_states {
-	PLDM_FD_STATE_IDLE = 0,
-	PLDM_FD_STATE_LEARN_COMPONENTS = 1,
-	PLDM_FD_STATE_READY_XFER = 2,
-	PLDM_FD_STATE_DOWNLOAD = 3,
-	PLDM_FD_STATE_VERIFY = 4,
-	PLDM_FD_STATE_APPLY = 5,
-	PLDM_FD_STATE_ACTIVATE = 6
-};
-
-/** @brief Firmware device aux state in GetStatus response
- */
-enum pldm_get_status_aux_states {
-	PLDM_FD_OPERATION_IN_PROGRESS = 0,
-	PLDM_FD_OPERATION_SUCCESSFUL = 1,
-	PLDM_FD_OPERATION_FAILED = 2,
-	PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER = 3
-};
-
-/** @brief Firmware device aux state status in GetStatus response
- */
-enum pldm_get_status_aux_state_status_values {
-	PLDM_FD_AUX_STATE_IN_PROGRESS_OR_SUCCESS = 0x00,
-	PLDM_FD_TIMEOUT = 0x09,
-	PLDM_FD_GENERIC_ERROR = 0x0A,
-	PLDM_FD_VENDOR_DEFINED_STATUS_CODE_START = 0x70,
-	PLDM_FD_VENDOR_DEFINED_STATUS_CODE_END = 0xEF
-};
-
-/** @brief Firmware device reason code in GetStatus response
- */
-enum pldm_get_status_reason_code_values {
-	PLDM_FD_INITIALIZATION = 0,
-	PLDM_FD_ACTIVATE_FW = 1,
-	PLDM_FD_CANCEL_UPDATE = 2,
-	PLDM_FD_TIMEOUT_LEARN_COMPONENT = 3,
-	PLDM_FD_TIMEOUT_READY_XFER = 4,
-	PLDM_FD_TIMEOUT_DOWNLOAD = 5,
-	PLDM_FD_TIMEOUT_VERIFY = 6,
-	PLDM_FD_TIMEOUT_APPLY = 7,
-	PLDM_FD_STATUS_VENDOR_DEFINED_MIN = 200,
-	PLDM_FD_STATUS_VENDOR_DEFINED_MAX = 255
-};
-
-/** @brief Components functional indicator in CancelUpdate response
- */
-enum pldm_firmware_update_non_functioning_component_indication {
-	PLDM_FWUP_COMPONENTS_FUNCTIONING = 0,
-	PLDM_FWUP_COMPONENTS_NOT_FUNCTIONING = 1
-};
-
-/** @struct pldm_package_header_information
- *
- *  Structure representing fixed part of package header information
- */
-struct pldm_package_header_information {
-	uint8_t uuid[PLDM_FWUP_UUID_LENGTH];
-	uint8_t package_header_format_version;
-	uint16_t package_header_size;
-	uint8_t timestamp104[PLDM_TIMESTAMP104_SIZE];
-	uint16_t component_bitmap_bit_length;
-	uint8_t package_version_string_type;
-	uint8_t package_version_string_length;
-} __attribute__((packed));
-
-/** @struct pldm_firmware_device_id_record
- *
- *  Structure representing firmware device ID record
- */
-struct pldm_firmware_device_id_record {
-	uint16_t record_length;
-	uint8_t descriptor_count;
-	bitfield32_t device_update_option_flags;
-	uint8_t comp_image_set_version_string_type;
-	uint8_t comp_image_set_version_string_length;
-	uint16_t fw_device_pkg_data_length;
-} __attribute__((packed));
-
-/** @struct pldm_descriptor_tlv
- *
- *  Structure representing descriptor type, length and value
- */
-struct pldm_descriptor_tlv {
-	uint16_t descriptor_type;
-	uint16_t descriptor_length;
-	uint8_t descriptor_data[1];
-} __attribute__((packed));
-
-/** @struct pldm_vendor_defined_descriptor_title_data
- *
- *  Structure representing vendor defined descriptor title sections
- */
-struct pldm_vendor_defined_descriptor_title_data {
-	uint8_t vendor_defined_descriptor_title_str_type;
-	uint8_t vendor_defined_descriptor_title_str_len;
-	uint8_t vendor_defined_descriptor_title_str[1];
-} __attribute__((packed));
-
-/** @struct pldm_component_image_information
- *
- *  Structure representing fixed part of individual component information in
- *  PLDM firmware update package
- */
-struct pldm_component_image_information {
-	uint16_t comp_classification;
-	uint16_t comp_identifier;
-	uint32_t comp_comparison_stamp;
-	bitfield16_t comp_options;
-	bitfield16_t requested_comp_activation_method;
-	uint32_t comp_location_offset;
-	uint32_t comp_size;
-	uint8_t comp_version_string_type;
-	uint8_t comp_version_string_length;
-} __attribute__((packed));
-
-/** @struct pldm_query_device_identifiers_resp
- *
- *  Structure representing query device identifiers response.
- */
-struct pldm_query_device_identifiers_resp {
-	uint8_t completion_code;
-	uint32_t device_identifiers_len;
-	uint8_t descriptor_count;
-} __attribute__((packed));
-
-/** @struct pldm_get_firmware_parameters_resp
- *
- *  Structure representing the fixed part of GetFirmwareParameters response
- */
-struct pldm_get_firmware_parameters_resp {
-	uint8_t completion_code;
-	bitfield32_t capabilities_during_update;
-	uint16_t comp_count;
-	uint8_t active_comp_image_set_ver_str_type;
-	uint8_t active_comp_image_set_ver_str_len;
-	uint8_t pending_comp_image_set_ver_str_type;
-	uint8_t pending_comp_image_set_ver_str_len;
-} __attribute__((packed));
-
-/** @struct pldm_component_parameter_entry
- *
- *  Structure representing component parameter table entry.
- */
-struct pldm_component_parameter_entry {
-	uint16_t comp_classification;
-	uint16_t comp_identifier;
-	uint8_t comp_classification_index;
-	uint32_t active_comp_comparison_stamp;
-	uint8_t active_comp_ver_str_type;
-	uint8_t active_comp_ver_str_len;
-	uint8_t active_comp_release_date[8];
-	uint32_t pending_comp_comparison_stamp;
-	uint8_t pending_comp_ver_str_type;
-	uint8_t pending_comp_ver_str_len;
-	uint8_t pending_comp_release_date[8];
-	bitfield16_t comp_activation_methods;
-	bitfield32_t capabilities_during_update;
-} __attribute__((packed));
-
-/** @struct pldm_request_update_req
- *
- *  Structure representing fixed part of Request Update request
- */
-struct pldm_request_update_req {
-	uint32_t max_transfer_size;
-	uint16_t num_of_comp;
-	uint8_t max_outstanding_transfer_req;
-	uint16_t pkg_data_len;
-	uint8_t comp_image_set_ver_str_type;
-	uint8_t comp_image_set_ver_str_len;
-} __attribute__((packed));
-
-/** @struct pldm_request_update_resp
- *
- *  Structure representing Request Update response
- */
-struct pldm_request_update_resp {
-	uint8_t completion_code;
-	uint16_t fd_meta_data_len;
-	uint8_t fd_will_send_pkg_data;
-} __attribute__((packed));
-
-/** @struct pldm_pass_component_table_req
- *
- *  Structure representing PassComponentTable request
- */
-struct pldm_pass_component_table_req {
-	uint8_t transfer_flag;
-	uint16_t comp_classification;
-	uint16_t comp_identifier;
-	uint8_t comp_classification_index;
-	uint32_t comp_comparison_stamp;
-	uint8_t comp_ver_str_type;
-	uint8_t comp_ver_str_len;
-} __attribute__((packed));
-
-/** @struct pldm_pass_component_table_resp
- *
- *  Structure representing PassComponentTable response
- */
-struct pldm_pass_component_table_resp {
-	uint8_t completion_code;
-	uint8_t comp_resp;
-	uint8_t comp_resp_code;
-} __attribute__((packed));
-
-/** @struct pldm_update_component_req
- *
- *  Structure representing UpdateComponent request
- */
-struct pldm_update_component_req {
-	uint16_t comp_classification;
-	uint16_t comp_identifier;
-	uint8_t comp_classification_index;
-	uint32_t comp_comparison_stamp;
-	uint32_t comp_image_size;
-	bitfield32_t update_option_flags;
-	uint8_t comp_ver_str_type;
-	uint8_t comp_ver_str_len;
-} __attribute__((packed));
-
-/** @struct pldm_update_component_resp
- *
- *  Structure representing UpdateComponent response
- */
-struct pldm_update_component_resp {
-	uint8_t completion_code;
-	uint8_t comp_compatability_resp;
-	uint8_t comp_compatability_resp_code;
-	bitfield32_t update_option_flags_enabled;
-	uint16_t time_before_req_fw_data;
-} __attribute__((packed));
-
-/** @struct pldm_request_firmware_data_req
- *
- *  Structure representing RequestFirmwareData request.
- */
-struct pldm_request_firmware_data_req {
-	uint32_t offset;
-	uint32_t length;
-} __attribute__((packed));
-
-/** @struct pldm_apply_complete_req
- *
- *  Structure representing ApplyComplete request.
- */
-struct pldm_apply_complete_req {
-	uint8_t apply_result;
-	bitfield16_t comp_activation_methods_modification;
-} __attribute__((packed));
-
-/** @struct pldm_activate_firmware_req
- *
- *  Structure representing ActivateFirmware request
- */
-struct pldm_activate_firmware_req {
-	bool8_t self_contained_activation_req;
-} __attribute__((packed));
-
-/** @struct activate_firmware_resp
- *
- *  Structure representing Activate Firmware response
- */
-struct pldm_activate_firmware_resp {
-	uint8_t completion_code;
-	uint16_t estimated_time_activation;
-} __attribute__((packed));
-
-/** @struct pldm_get_status_resp
- *
- *  Structure representing GetStatus response.
- */
-struct pldm_get_status_resp {
-	uint8_t completion_code;
-	uint8_t current_state;
-	uint8_t previous_state;
-	uint8_t aux_state;
-	uint8_t aux_state_status;
-	uint8_t progress_percent;
-	uint8_t reason_code;
-	bitfield32_t update_option_flags_enabled;
-} __attribute__((packed));
-
-/** @struct pldm_cancel_update_resp
- *
- *  Structure representing CancelUpdate response.
- */
-struct pldm_cancel_update_resp {
-	uint8_t completion_code;
-	bool8_t non_functioning_component_indication;
-	uint64_t non_functioning_component_bitmap;
-} __attribute__((packed));
-
-/** @brief Decode the PLDM package header information
- *
- *  @param[in] data - pointer to package header information
- *  @param[in] length - available length in the firmware update package
- *  @param[out] package_header_info - pointer to fixed part of PLDM package
- *                                    header information
- *  @param[out] package_version_str - pointer to package version string
- *
- *  @return pldm_completion_codes
- */
-int decode_pldm_package_header_info(
-    const uint8_t *data, size_t length,
-    struct pldm_package_header_information *package_header_info,
-    struct variable_field *package_version_str);
-
-/** @brief Decode individual firmware device ID record
- *
- *  @param[in] data - pointer to firmware device ID record
- *  @param[in] length - available length in the firmware update package
- *  @param[in] component_bitmap_bit_length - ComponentBitmapBitLengthfield
- *                                           parsed from the package header info
- *  @param[out] fw_device_id_record - pointer to fixed part of firmware device
- *                                    id record
- *  @param[out] applicable_components - pointer to ApplicableComponents
- *  @param[out] comp_image_set_version_str - pointer to
- *                                           ComponentImageSetVersionString
- *  @param[out] record_descriptors - pointer to RecordDescriptors
- *  @param[out] fw_device_pkg_data - pointer to FirmwareDevicePackageData
- *
- *  @return pldm_completion_codes
- */
-int decode_firmware_device_id_record(
-    const uint8_t *data, size_t length, uint16_t component_bitmap_bit_length,
-    struct pldm_firmware_device_id_record *fw_device_id_record,
-    struct variable_field *applicable_components,
-    struct variable_field *comp_image_set_version_str,
-    struct variable_field *record_descriptors,
-    struct variable_field *fw_device_pkg_data);
-
-/** @brief Decode the record descriptor entries in the firmware update package
- *         and the Descriptors in the QueryDeviceIDentifiers command
- *
- *  @param[in] data - pointer to descriptor entry
- *  @param[in] length - remaining length of the descriptor data
- *  @param[out] descriptor_type - pointer to descriptor type
- *  @param[out] descriptor_data - pointer to descriptor data
- *
- *  @return pldm_completion_codes
- */
-int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
-					uint16_t *descriptor_type,
-					struct variable_field *descriptor_data);
-
-/** @brief Decode the vendor defined descriptor value
- *
- *  @param[in] data - pointer to vendor defined descriptor value
- *  @param[in] length - length of the vendor defined descriptor value
- *  @param[out] descriptor_title_str_type - pointer to vendor defined descriptor
- *                                          title string type
- *  @param[out] descriptor_title_str - pointer to vendor defined descriptor
- *                                     title string
- *  @param[out] descriptor_data - pointer to vendor defined descriptor data
- *
- *  @return pldm_completion_codes
- */
-int decode_vendor_defined_descriptor_value(
-    const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
-    struct variable_field *descriptor_title_str,
-    struct variable_field *descriptor_data);
-
-/** @brief Decode individual component image information
- *
- *  @param[in] data - pointer to component image information
- *  @param[in] length - available length in the firmware update package
- *  @param[out] pldm_comp_image_info - pointer to fixed part of component image
- *                                     information
- *  @param[out] comp_version_str - pointer to component version string
- *
- *  @return pldm_completion_codes
- */
-int decode_pldm_comp_image_info(
-    const uint8_t *data, size_t length,
-    struct pldm_component_image_information *pldm_comp_image_info,
-    struct variable_field *comp_version_str);
-
-/** @brief Create a PLDM request message for QueryDeviceIdentifiers
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] payload_length - Length of the request message payload
- *  @param[in,out] msg - Message will be written to this
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_query_device_identifiers_req(uint8_t instance_id,
-					size_t payload_length,
-					struct pldm_msg *msg);
-
-/** @brief Decode QueryDeviceIdentifiers response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to response msg's PLDM completion code
- *  @param[out] device_identifiers_len - Pointer to device identifiers length
- *  @param[out] descriptor_count - Pointer to descriptor count
- *  @param[out] descriptor_data - Pointer to descriptor data
- *
- *  @return pldm_completion_codes
- */
-int decode_query_device_identifiers_resp(const struct pldm_msg *msg,
-					 size_t payload_length,
-					 uint8_t *completion_code,
-					 uint32_t *device_identifiers_len,
-					 uint8_t *descriptor_count,
-					 uint8_t **descriptor_data);
-
-/** @brief Create a PLDM request message for GetFirmwareParameters
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] payload_length - Length of the request message payload
- *  @param[in,out] msg - Message will be written to this
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_get_firmware_parameters_req(uint8_t instance_id,
-				       size_t payload_length,
-				       struct pldm_msg *msg);
-
-/** @brief Decode GetFirmwareParameters response
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] resp_data - Pointer to get firmware parameters response
- *  @param[out] active_comp_image_set_ver_str - Pointer to active component
- *                                              image set version string
- *  @param[out] pending_comp_image_set_ver_str - Pointer to pending component
- *                                               image set version string
- *  @param[out] comp_parameter_table - Pointer to component parameter table
- *
- *  @return pldm_completion_codes
- */
-int decode_get_firmware_parameters_resp(
-    const struct pldm_msg *msg, size_t payload_length,
-    struct pldm_get_firmware_parameters_resp *resp_data,
-    struct variable_field *active_comp_image_set_ver_str,
-    struct variable_field *pending_comp_image_set_ver_str,
-    struct variable_field *comp_parameter_table);
-
-/** @brief Decode component entries in the component parameter table which is
- *         part of the response of GetFirmwareParameters command
- *
- *  @param[in] data - Component entry
- *  @param[in] length - Length of component entry
- *  @param[out] component_data - Pointer to component parameter table
- *  @param[out] active_comp_ver_str - Pointer to active component version string
- *  @param[out] pending_comp_ver_str - Pointer to pending component version
- *                                     string
- *
- *  @return pldm_completion_codes
- */
-int decode_get_firmware_parameters_resp_comp_entry(
-    const uint8_t *data, size_t length,
-    struct pldm_component_parameter_entry *component_data,
-    struct variable_field *active_comp_ver_str,
-    struct variable_field *pending_comp_ver_str);
-
-/** @brief Create PLDM request message for RequestUpdate
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] max_transfer_size - Maximum size of the variable payload allowed
- *                                 to be requested via RequestFirmwareData
- *                                 command
- *  @param[in] num_of_comp - Total number of components that will be passed to
- *                           the FD during the update
- *  @param[in] max_outstanding_transfer_req - Total number of outstanding
- * 											  RequestFirmwareData
- * commands that can be sent by the FD
- *  @param[in] pkg_data_len - Value of the FirmwareDevicePackageDataLength field
- *                            present in firmware package header
- *  @param[in] comp_image_set_ver_str_type - StringType of
- *                                           ComponentImageSetVersionString
- *  @param[in] comp_image_set_ver_str_len - The length of the
- *                                          ComponentImageSetVersionString
- *  @param[in] comp_img_set_ver_str - Component Image Set version information
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note Caller is responsible for memory alloc and dealloc of param
- *        'msg.payload'
- */
-int encode_request_update_req(uint8_t instance_id, uint32_t max_transfer_size,
-			      uint16_t num_of_comp,
-			      uint8_t max_outstanding_transfer_req,
-			      uint16_t pkg_data_len,
-			      uint8_t comp_image_set_ver_str_type,
-			      uint8_t comp_image_set_ver_str_len,
-			      const struct variable_field *comp_img_set_ver_str,
-			      struct pldm_msg *msg, size_t payload_length);
-
-/** @brief Decode a RequestUpdate response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to hold the completion code
- *  @param[out] fd_meta_data_len - Pointer to hold the length of FD metadata
- *  @param[out] fd_will_send_pkg_data - Pointer to hold information whether FD
- *                                      will send GetPackageData command
- *  @return pldm_completion_codes
- */
-int decode_request_update_resp(const struct pldm_msg *msg,
-			       size_t payload_length, uint8_t *completion_code,
-			       uint16_t *fd_meta_data_len,
-			       uint8_t *fd_will_send_pkg_data);
-
-/** @brief Create PLDM request message for PassComponentTable
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] transfer_flag - TransferFlag
- *  @param[in] comp_classification - ComponentClassification
- *  @param[in] comp_identifier - ComponentIdentifier
- *  @param[in] comp_classification_index - ComponentClassificationIndex
- *  @param[in] comp_comparison_stamp - ComponentComparisonStamp
- *  @param[in] comp_ver_str_type - ComponentVersionStringType
- *  @param[in] comp_ver_str_len - ComponentVersionStringLength
- *  @param[in] comp_ver_str - ComponentVersionString
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *                              information
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_pass_component_table_req(
-    uint8_t instance_id, uint8_t transfer_flag, uint16_t comp_classification,
-    uint16_t comp_identifier, uint8_t comp_classification_index,
-    uint32_t comp_comparison_stamp, uint8_t comp_ver_str_type,
-    uint8_t comp_ver_str_len, const struct variable_field *comp_ver_str,
-    struct pldm_msg *msg, size_t payload_length);
-
-/** @brief Decode PassComponentTable response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to hold completion code
- *  @param[out] comp_resp - Pointer to hold component response
- *  @param[out] comp_resp_code - Pointer to hold component response code
- *
- *  @return pldm_completion_codes
- */
-int decode_pass_component_table_resp(const struct pldm_msg *msg,
-				     size_t payload_length,
-				     uint8_t *completion_code,
-				     uint8_t *comp_resp,
-				     uint8_t *comp_resp_code);
-
-/** @brief Create PLDM request message for UpdateComponent
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] comp_classification - ComponentClassification
- *  @param[in] comp_identifier - ComponentIdentifier
- *  @param[in] comp_classification_index - ComponentClassificationIndex
- *  @param[in] comp_comparison_stamp - ComponentComparisonStamp
- *  @param[in] comp_image_size - ComponentImageSize
- *  @param[in] update_option_flags - UpdateOptionFlags
- *  @param[in] comp_ver_str_type - ComponentVersionStringType
- *  @param[in] comp_ver_str_len - ComponentVersionStringLength
- *  @param[in] comp_ver_str - ComponentVersionString
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *                              information
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_update_component_req(
-    uint8_t instance_id, uint16_t comp_classification, uint16_t comp_identifier,
-    uint8_t comp_classification_index, uint32_t comp_comparison_stamp,
-    uint32_t comp_image_size, bitfield32_t update_option_flags,
-    uint8_t comp_ver_str_type, uint8_t comp_ver_str_len,
-    const struct variable_field *comp_ver_str, struct pldm_msg *msg,
-    size_t payload_length);
-
-/** @brief Decode UpdateComponent response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to hold completion code
- *  @param[out] comp_compatability_resp - Pointer to hold component
- *                                        compatibility response
- *  @param[out] comp_compatability_resp_code - Pointer to hold component
- *                                             compatibility response code
- *  @param[out] update_option_flags_enabled - Pointer to hold
- *                                            UpdateOptionsFlagEnabled
- *  @param[out] time_before_req_fw_data - Pointer to hold the estimated time
- *                                        before sending RequestFirmwareData
- *
- *  @return pldm_completion_codes
- */
-int decode_update_component_resp(const struct pldm_msg *msg,
-				 size_t payload_length,
-				 uint8_t *completion_code,
-				 uint8_t *comp_compatability_resp,
-				 uint8_t *comp_compatability_resp_code,
-				 bitfield32_t *update_option_flags_enabled,
-				 uint16_t *time_before_req_fw_data);
-
-/** @brief Decode RequestFirmwareData request message
- *
- *	@param[in] msg - Request message
- *	@param[in] payload_length - Length of request message payload
- *	@param[out] offset - Pointer to hold offset
- *	@param[out] length - Pointer to hold the size of the component image
- *                       segment requested by the FD/FDP
- *
- *	@return pldm_completion_codes
- */
-int decode_request_firmware_data_req(const struct pldm_msg *msg,
-				     size_t payload_length, uint32_t *offset,
-				     uint32_t *length);
-
-/** @brief Create PLDM response message for RequestFirmwareData
- *
- *  The ComponentImagePortion is not encoded in the PLDM response message
- *  by encode_request_firmware_data_resp to avoid an additional copy. Populating
- *  ComponentImagePortion in the PLDM response message is handled by the user
- *  of this API. The payload_length validation considers only the
- *  CompletionCode.
- *
- *	@param[in] instance_id - Message's instance id
- *	@param[in] completion_code - CompletionCode
- *	@param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of response message payload
- *
- *	@return pldm_completion_codes
- *
- *	@note  Caller is responsible for memory alloc and dealloc of param
- *		   'msg.payload'
- */
-int encode_request_firmware_data_resp(uint8_t instance_id,
-				      uint8_t completion_code,
-				      struct pldm_msg *msg,
-				      size_t payload_length);
-
-/** @brief Decode TransferComplete request message
- *
- *  @param[in] msg - Request message
- *  @param[in] payload_length - Length of request message payload
- *  @param[out] transfer_result - Pointer to hold TransferResult
- *
- *  @return pldm_completion_codes
- */
-int decode_transfer_complete_req(const struct pldm_msg *msg,
-				 size_t payload_length,
-				 uint8_t *transfer_result);
-
-/** @brief Create PLDM response message for TransferComplete
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] completion_code - CompletionCode
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of response message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_transfer_complete_resp(uint8_t instance_id, uint8_t completion_code,
-				  struct pldm_msg *msg, size_t payload_length);
-
-/** @brief Decode VerifyComplete request message
- *
- *  @param[in] msg - Request message
- *  @param[in] payload_length - Length of request message payload
- *  @param[in] verify_result - Pointer to hold VerifyResult
- *
- *  @return pldm_completion_codes
- */
-int decode_verify_complete_req(const struct pldm_msg *msg,
-			       size_t payload_length, uint8_t *verify_result);
-
-/** @brief Create PLDM response message for VerifyComplete
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] completion_code - CompletionCode
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of response message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_verify_complete_resp(uint8_t instance_id, uint8_t completion_code,
-				struct pldm_msg *msg, size_t payload_length);
-
-/** @brief Decode ApplyComplete request message
- *
- *  @param[in] msg - Request message
- *  @param[in] payload_length - Length of request message payload
- *  @param[in] apply_result - Pointer to hold ApplyResult
- *  @param[in] comp_activation_methods_modification - Pointer to hold the
- *                                        ComponentActivationMethodsModification
- *
- *  @return pldm_completion_codes
- */
-int decode_apply_complete_req(
-    const struct pldm_msg *msg, size_t payload_length, uint8_t *apply_result,
-    bitfield16_t *comp_activation_methods_modification);
-
-/** @brief Create PLDM response message for ApplyComplete
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] completion_code - CompletionCode
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of response message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note Caller is responsible for memory alloc and dealloc of param
- *        'msg.payload'
- */
-int encode_apply_complete_resp(uint8_t instance_id, uint8_t completion_code,
-			       struct pldm_msg *msg, size_t payload_length);
-
-/** @brief Create PLDM request message for ActivateFirmware
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in] self_contained_activation_req SelfContainedActivationRequest
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_activate_firmware_req(uint8_t instance_id,
-				 bool8_t self_contained_activation_req,
-				 struct pldm_msg *msg, size_t payload_length);
-
-/** @brief Decode ActivateFirmware response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to hold CompletionCode
- *  @param[out] estimated_time_activation - Pointer to hold
- *                                       EstimatedTimeForSelfContainedActivation
- *
- *  @return pldm_completion_codes
- */
-int decode_activate_firmware_resp(const struct pldm_msg *msg,
-				  size_t payload_length,
-				  uint8_t *completion_code,
-				  uint16_t *estimated_time_activation);
-
-/** @brief Create PLDM request message for GetStatus
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note Caller is responsible for memory alloc and dealloc of param
- *        'msg.payload'
- */
-int encode_get_status_req(uint8_t instance_id, struct pldm_msg *msg,
-			  size_t payload_length);
-
-/** @brief Decode GetStatus response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to completion code
- *  @param[out] current_state - Pointer to current state machine state
- *  @param[out] previous_state - Pointer to previous different state machine
- *                               state
- *  @param[out] aux_state - Pointer to current operation state of FD/FDP
- *  @param[out] aux_state_status - Pointer to aux state status
- *  @param[out] progress_percent - Pointer to progress percentage
- *  @param[out] reason_code - Pointer to reason for entering current state
- *  @param[out] update_option_flags_enabled - Pointer to update option flags
- *                                            enabled
- *
- *  @return pldm_completion_codes
- */
-int decode_get_status_resp(const struct pldm_msg *msg, size_t payload_length,
-			   uint8_t *completion_code, uint8_t *current_state,
-			   uint8_t *previous_state, uint8_t *aux_state,
-			   uint8_t *aux_state_status, uint8_t *progress_percent,
-			   uint8_t *reason_code,
-			   bitfield32_t *update_option_flags_enabled);
-
-/** @brief Create PLDM request message for CancelUpdateComponent
- *
- *  @param[in] instance_id - Message's instance id
- *  @param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *
- *  @return pldm_completion_codes
- *
- *  @note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_cancel_update_component_req(uint8_t instance_id,
-				       struct pldm_msg *msg,
-				       size_t payload_length);
-
-/** @brief Decode CancelUpdateComponent response message
- *
- *  @param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *  @param[out] completion_code - Pointer to the completion code
- *
- *  @return pldm_completion_codes
- */
-int decode_cancel_update_component_resp(const struct pldm_msg *msg,
-					size_t payload_length,
-					uint8_t *completion_code);
-
-/** @brief Create PLDM request message for CancelUpdate
- *
- *	@param[in] instance_id - Message's instance id
- *	@param[in,out] msg - Message will be written to this
- *  @param[in] payload_length - Length of request message payload
- *
- *	@return pldm_completion_codes
- *
- *	@note  Caller is responsible for memory alloc and dealloc of param
- *         'msg.payload'
- */
-int encode_cancel_update_req(uint8_t instance_id, struct pldm_msg *msg,
-			     size_t payload_length);
-
-/** @brief Decode CancelUpdate response message
- *
- *	@param[in] msg - Response message
- *  @param[in] payload_length - Length of response message payload
- *	@param[out] completion_code - Pointer to completion code
- *	@param[out] non_functioning_component_indication - Pointer to non
-						       functioning
- *                                                     component indication
- *	@param[out] non_functioning_component_bitmap - Pointer to non
- functioning
- *                                                 component bitmap
- *
- *	@return pldm_completion_codes
- */
-int decode_cancel_update_resp(const struct pldm_msg *msg, size_t payload_length,
-			      uint8_t *completion_code,
-			      bool8_t *non_functioning_component_indication,
-			      bitfield64_t *non_functioning_component_bitmap);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // End of FW_UPDATE_H
+#ifndef FW_UPDATE_H
+#define FW_UPDATE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "base.h"
+#include "stdbool.h"
+#include "utils.h"
+
+#define PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE 8
+#define PLDM_FWUP_INVALID_COMPONENT_COMPARISON_TIMESTAMP 0xFFFFFFFF
+#define PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES 0
+/** @brief Minimum length of device descriptor, 2 bytes for descriptor type,
+ *         2 bytes for descriptor length and atleast 1 byte of descriptor data
+ */
+#define PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN 5
+#define PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES 0
+#define PLDM_FWUP_BASELINE_TRANSFER_SIZE 32
+#define PLDM_FWUP_MIN_OUTSTANDING_REQ 1
+#define PLDM_GET_STATUS_REQ_BYTES 0
+/* Maximum progress percentage value*/
+#define PLDM_FWUP_MAX_PROGRESS_PERCENT 0x65
+#define PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES 0
+#define PLDM_CANCEL_UPDATE_REQ_BYTES 0
+
+/** @brief PLDM Firmware update commands
+ */
+enum pldm_firmware_update_commands {
+	PLDM_QUERY_DEVICE_IDENTIFIERS = 0x01,
+	PLDM_GET_FIRMWARE_PARAMETERS = 0x02,
+	PLDM_REQUEST_UPDATE = 0x10,
+	PLDM_PASS_COMPONENT_TABLE = 0x13,
+	PLDM_UPDATE_COMPONENT = 0x14,
+	PLDM_REQUEST_FIRMWARE_DATA = 0x15,
+	PLDM_TRANSFER_COMPLETE = 0x16,
+	PLDM_VERIFY_COMPLETE = 0x17,
+	PLDM_APPLY_COMPLETE = 0x18,
+	PLDM_ACTIVATE_FIRMWARE = 0x1A,
+	PLDM_GET_STATUS = 0x1B,
+	PLDM_CANCEL_UPDATE_COMPONENT = 0x1C,
+	PLDM_CANCEL_UPDATE = 0x1D
+};
+
+/** @brief PLDM Firmware update completion codes
+ */
+enum pldm_firmware_update_completion_codes {
+	PLDM_FWUP_NOT_IN_UPDATE_MODE = 0x80,
+	PLDM_FWUP_ALREADY_IN_UPDATE_MODE = 0x81,
+	PLDM_FWUP_DATA_OUT_OF_RANGE = 0x82,
+	PLDM_FWUP_INVALID_TRANSFER_LENGTH = 0x83,
+	PLDM_FWUP_INVALID_STATE_FOR_COMMAND = 0x84,
+	PLDM_FWUP_INCOMPLETE_UPDATE = 0x85,
+	PLDM_FWUP_BUSY_IN_BACKGROUND = 0x86,
+	PLDM_FWUP_CANCEL_PENDING = 0x87,
+	PLDM_FWUP_COMMAND_NOT_EXPECTED = 0x87,
+	PLDM_FWUP_RETRY_REQUEST_FW_DATA = 0x89,
+	PLDM_FWUP_UNABLE_TO_INITIATE_UPDATE = 0x8A,
+	PLDM_FWUP_ACTIVATION_NOT_REQUIRED = 0x8B,
+	PLDM_FWUP_SELF_CONTAINED_ACTIVATION_NOT_PERMITTED = 0x8C,
+	PLDM_FWUP_NO_DEVICE_METADATA = 0x8D,
+	PLDM_FWUP_RETRY_REQUEST_UPDATE = 0x8E,
+	PLDM_FWUP_NO_PACKAGE_DATA = 0x8F,
+	PLDM_FWUP_INVALID_TRANSFER_HANDLE = 0x90,
+	PLDM_FWUP_INVALID_TRANSFER_OPERATION_FLAG = 0x91,
+	PLDM_FWUP_ACTIVATE_PENDING_IMAGE_NOT_PERMITTED = 0x92,
+	PLDM_FWUP_PACKAGE_DATA_ERROR = 0x93
+};
+
+/** @brief String type values defined in the PLDM firmware update specification
+ */
+enum pldm_firmware_update_string_type {
+	PLDM_STR_TYPE_UNKNOWN = 0,
+	PLDM_STR_TYPE_ASCII = 1,
+	PLDM_STR_TYPE_UTF_8 = 2,
+	PLDM_STR_TYPE_UTF_16 = 3,
+	PLDM_STR_TYPE_UTF_16LE = 4,
+	PLDM_STR_TYPE_UTF_16BE = 5
+};
+
+/** @brief Descriptor types defined in PLDM firmware update specification
+ */
+enum pldm_firmware_update_descriptor_types {
+	PLDM_FWUP_PCI_VENDOR_ID = 0x0000,
+	PLDM_FWUP_IANA_ENTERPRISE_ID = 0x0001,
+	PLDM_FWUP_UUID = 0x0002,
+	PLDM_FWUP_PNP_VENDOR_ID = 0x0003,
+	PLDM_FWUP_ACPI_VENDOR_ID = 0x0004,
+	PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID = 0x0005,
+	PLDM_FWUP_SCSI_VENDOR_ID = 0x0006,
+	PLDM_FWUP_PCI_DEVICE_ID = 0x0100,
+	PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID = 0x0101,
+	PLDM_FWUP_PCI_SUBSYSTEM_ID = 0x0102,
+	PLDM_FWUP_PCI_REVISION_ID = 0x0103,
+	PLDM_FWUP_PNP_PRODUCT_IDENTIFIER = 0x0104,
+	PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER = 0x0105,
+	PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING = 0x0106,
+	PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING = 0x0107,
+	PLDM_FWUP_SCSI_PRODUCT_ID = 0x0108,
+	PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE = 0x0109,
+	PLDM_FWUP_VENDOR_DEFINED = 0xFFFF
+};
+
+/** @brief Descriptor types length defined in PLDM firmware update specification
+ */
+enum pldm_firmware_update_descriptor_types_length {
+	PLDM_FWUP_PCI_VENDOR_ID_LENGTH = 2,
+	PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH = 4,
+	PLDM_FWUP_UUID_LENGTH = 16,
+	PLDM_FWUP_PNP_VENDOR_ID_LENGTH = 3,
+	PLDM_FWUP_ACPI_VENDOR_ID_LENGTH = 4,
+	PLDM_FWUP_IEEE_ASSIGNED_COMPANY_ID_LENGTH = 3,
+	PLDM_FWUP_SCSI_VENDOR_ID_LENGTH = 8,
+	PLDM_FWUP_PCI_DEVICE_ID_LENGTH = 2,
+	PLDM_FWUP_PCI_SUBSYSTEM_VENDOR_ID_LENGTH = 2,
+	PLDM_FWUP_PCI_SUBSYSTEM_ID_LENGTH = 2,
+	PLDM_FWUP_PCI_REVISION_ID_LENGTH = 1,
+	PLDM_FWUP_PNP_PRODUCT_IDENTIFIER_LENGTH = 4,
+	PLDM_FWUP_ACPI_PRODUCT_IDENTIFIER_LENGTH = 4,
+	PLDM_FWUP_ASCII_MODEL_NUMBER_LONG_STRING_LENGTH = 40,
+	PLDM_FWUP_ASCII_MODEL_NUMBER_SHORT_STRING_LENGTH = 10,
+	PLDM_FWUP_SCSI_PRODUCT_ID_LENGTH = 16,
+	PLDM_FWUP_UBM_CONTROLLER_DEVICE_CODE_LENGTH = 4
+};
+
+/** @brief ComponentClassification values defined in firmware update
+ *         specification
+ */
+enum pldm_component_classification_values {
+	PLDM_COMP_UNKNOWN = 0x0000,
+	PLDM_COMP_OTHER = 0x0001,
+	PLDM_COMP_DRIVER = 0x0002,
+	PLDM_COMP_CONFIGURATION_SOFTWARE = 0x0003,
+	PLDM_COMP_APPLICATION_SOFTWARE = 0x0004,
+	PLDM_COMP_INSTRUMENTATION = 0x0005,
+	PLDM_COMP_FIRMWARE_OR_BIOS = 0x0006,
+	PLDM_COMP_DIAGNOSTIC_SOFTWARE = 0x0007,
+	PLDM_COMP_OPERATING_SYSTEM = 0x0008,
+	PLDM_COMP_MIDDLEWARE = 0x0009,
+	PLDM_COMP_FIRMWARE = 0x000A,
+	PLDM_COMP_BIOS_OR_FCODE = 0x000B,
+	PLDM_COMP_SUPPORT_OR_SERVICEPACK = 0x000C,
+	PLDM_COMP_SOFTWARE_BUNDLE = 0x000D,
+	PLDM_COMP_DOWNSTREAM_DEVICE = 0xFFFF
+};
+
+/** @brief ComponentActivationMethods is the bit position in the bitfield that
+ *         provides the capability of the FD for firmware activation. Multiple
+ *         activation methods can be supported.
+ */
+enum pldm_comp_activation_methods {
+	PLDM_ACTIVATION_AUTOMATIC = 0,
+	PLDM_ACTIVATION_SELF_CONTAINED = 1,
+	PLDM_ACTIVATION_MEDIUM_SPECIFIC_RESET = 2,
+	PLDM_ACTIVATION_SYSTEM_REBOOT = 3,
+	PLDM_ACTIVATION_DC_POWER_CYCLE = 4,
+	PLDM_ACTIVATION_AC_POWER_CYCLE = 5,
+	PLDM_SUPPORTS_ACTIVATE_PENDING_IMAGE = 6,
+	PLDM_SUPPORTS_ACTIVATE_PENDING_IMAGE_SET = 7
+};
+
+/** @brief ComponentResponse values in the response of PassComponentTable
+ */
+enum pldm_component_responses {
+	PLDM_CR_COMP_CAN_BE_UPDATED = 0,
+	PLDM_CR_COMP_MAY_BE_UPDATEABLE = 1
+};
+
+/** @brief ComponentResponseCode values in the response of PassComponentTable
+ */
+enum pldm_component_response_codes {
+	PLDM_CRC_COMP_CAN_BE_UPDATED = 0x00,
+	PLDM_CRC_COMP_COMPARISON_STAMP_IDENTICAL = 0x01,
+	PLDM_CRC_COMP_COMPARISON_STAMP_LOWER = 0x02,
+	PLDM_CRC_INVALID_COMP_COMPARISON_STAMP = 0x03,
+	PLDM_CRC_COMP_CONFLICT = 0x04,
+	PLDM_CRC_COMP_PREREQUISITES_NOT_MET = 0x05,
+	PLDM_CRC_COMP_NOT_SUPPORTED = 0x06,
+	PLDM_CRC_COMP_SECURITY_RESTRICTIONS = 0x07,
+	PLDM_CRC_INCOMPLETE_COMP_IMAGE_SET = 0x08,
+	PLDM_CRC_ACTIVE_IMAGE_NOT_UPDATEABLE_SUBSEQUENTLY = 0x09,
+	PLDM_CRC_COMP_VER_STR_IDENTICAL = 0x0A,
+	PLDM_CRC_COMP_VER_STR_LOWER = 0x0B,
+	PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MIN = 0xD0,
+	PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MAX = 0xEF
+};
+
+/** @brief ComponentCompatibilityResponse values in the response of
+ *         UpdateComponent
+ */
+enum pldm_component_compatability_responses {
+	PLDM_CCR_COMP_CAN_BE_UPDATED = 0,
+	PLDM_CCR_COMP_CANNOT_BE_UPDATED = 1
+};
+
+/** @brief ComponentCompatibilityResponse Code values in the response of
+ *         UpdateComponent
+ */
+enum pldm_component_compatability_response_codes {
+	PLDM_CCRC_NO_RESPONSE_CODE = 0x00,
+	PLDM_CCRC_COMP_COMPARISON_STAMP_IDENTICAL = 0x01,
+	PLDM_CCRC_COMP_COMPARISON_STAMP_LOWER = 0x02,
+	PLDM_CCRC_INVALID_COMP_COMPARISON_STAMP = 0x03,
+	PLDM_CCRC_COMP_CONFLICT = 0x04,
+	PLDM_CCRC_COMP_PREREQUISITES_NOT_MET = 0x05,
+	PLDM_CCRC_COMP_NOT_SUPPORTED = 0x06,
+	PLDM_CCRC_COMP_SECURITY_RESTRICTIONS = 0x07,
+	PLDM_CCRC_INCOMPLETE_COMP_IMAGE_SET = 0x08,
+	PLDM_CCRC_COMP_INFO_NO_MATCH = 0x09,
+	PLDM_CCRC_COMP_VER_STR_IDENTICAL = 0x0A,
+	PLDM_CCRC_COMP_VER_STR_LOWER = 0x0B,
+	PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MIN = 0xD0,
+	PLDM_CCRC_VENDOR_COMP_RESP_CODE_RANGE_MAX = 0xEF
+};
+
+/** @brief Common error codes in TransferComplete, VerifyComplete and
+ *        ApplyComplete request
+ */
+enum pldm_firmware_update_common_error_codes {
+	PLDM_FWUP_TIME_OUT = 0x09,
+	PLDM_FWUP_GENERIC_ERROR = 0x0A
+};
+
+/** @brief TransferResult values in the request of TransferComplete
+ */
+enum pldm_firmware_update_transfer_result_values {
+	PLDM_FWUP_TRANSFER_SUCCESS = 0x00,
+	PLDM_FWUP_TRANSFER_ERROR_IMAGE_CORRUPT = 0x02,
+	PLDM_FWUP_TRANSFER_ERROR_VERSION_MISMATCH = 0x02,
+	PLDM_FWUP_FD_ABORTED_TRANSFER = 0x03,
+	PLDM_FWUP_FD_ABORTED_TRANSFER_LOW_POWER_STATE = 0x0B,
+	PLDM_FWUP_FD_ABORTED_TRANSFER_RESET_NEEDED = 0x0C,
+	PLDM_FWUP_FD_ABORTED_TRANSFER_STORAGE_ISSUE = 0x0D,
+	PLDM_FWUP_VENDOR_TRANSFER_RESULT_RANGE_MIN = 0x70,
+	PLDM_FWUP_VENDOR_TRANSFER_RESULT_RANGE_MAX = 0x8F
+};
+
+/**@brief VerifyResult values in the request of VerifyComplete
+ */
+enum pldm_firmware_update_verify_result_values {
+	PLDM_FWUP_VERIFY_SUCCESS = 0x00,
+	PLDM_FWUP_VERIFY_ERROR_VERIFICATION_FAILURE = 0x01,
+	PLDM_FWUP_VERIFY_ERROR_VERSION_MISMATCH = 0x02,
+	PLDM_FWUP_VERIFY_FAILED_FD_SECURITY_CHECKS = 0x03,
+	PLDM_FWUP_VERIFY_ERROR_IMAGE_INCOMPLETE = 0x04,
+	PLDM_FWUP_VENDOR_VERIFY_RESULT_RANGE_MIN = 0x90,
+	PLDM_FWUP_VENDOR_VERIFY_RESULT_RANGE_MAX = 0xAF
+};
+
+/**@brief ApplyResult values in the request of ApplyComplete
+ */
+enum pldm_firmware_update_apply_result_values {
+	PLDM_FWUP_APPLY_SUCCESS = 0x00,
+	PLDM_FWUP_APPLY_SUCCESS_WITH_ACTIVATION_METHOD = 0x01,
+	PLDM_FWUP_APPLY_FAILURE_MEMORY_ISSUE = 0x02,
+	PLDM_FWUP_VENDOR_APPLY_RESULT_RANGE_MIN = 0xB0,
+	PLDM_FWUP_VENDOR_APPLY_RESULT_RANGE_MAX = 0xCF
+};
+
+/** @brief SelfContainedActivationRequest in the request of ActivateFirmware
+ */
+enum pldm_self_contained_activation_req {
+	PLDM_NOT_ACTIVATE_SELF_CONTAINED_COMPONENTS = false,
+	PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS = true
+};
+
+/** @brief Current state/previous state of the FD or FDP returned in GetStatus
+ *         response
+ */
+enum pldm_firmware_device_states {
+	PLDM_FD_STATE_IDLE = 0,
+	PLDM_FD_STATE_LEARN_COMPONENTS = 1,
+	PLDM_FD_STATE_READY_XFER = 2,
+	PLDM_FD_STATE_DOWNLOAD = 3,
+	PLDM_FD_STATE_VERIFY = 4,
+	PLDM_FD_STATE_APPLY = 5,
+	PLDM_FD_STATE_ACTIVATE = 6
+};
+
+/** @brief Firmware device aux state in GetStatus response
+ */
+enum pldm_get_status_aux_states {
+	PLDM_FD_OPERATION_IN_PROGRESS = 0,
+	PLDM_FD_OPERATION_SUCCESSFUL = 1,
+	PLDM_FD_OPERATION_FAILED = 2,
+	PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER = 3
+};
+
+/** @brief Firmware device aux state status in GetStatus response
+ */
+enum pldm_get_status_aux_state_status_values {
+	PLDM_FD_AUX_STATE_IN_PROGRESS_OR_SUCCESS = 0x00,
+	PLDM_FD_TIMEOUT = 0x09,
+	PLDM_FD_GENERIC_ERROR = 0x0A,
+	PLDM_FD_VENDOR_DEFINED_STATUS_CODE_START = 0x70,
+	PLDM_FD_VENDOR_DEFINED_STATUS_CODE_END = 0xEF
+};
+
+/** @brief Firmware device reason code in GetStatus response
+ */
+enum pldm_get_status_reason_code_values {
+	PLDM_FD_INITIALIZATION = 0,
+	PLDM_FD_ACTIVATE_FW = 1,
+	PLDM_FD_CANCEL_UPDATE = 2,
+	PLDM_FD_TIMEOUT_LEARN_COMPONENT = 3,
+	PLDM_FD_TIMEOUT_READY_XFER = 4,
+	PLDM_FD_TIMEOUT_DOWNLOAD = 5,
+	PLDM_FD_TIMEOUT_VERIFY = 6,
+	PLDM_FD_TIMEOUT_APPLY = 7,
+	PLDM_FD_STATUS_VENDOR_DEFINED_MIN = 200,
+	PLDM_FD_STATUS_VENDOR_DEFINED_MAX = 255
+};
+
+/** @brief Components functional indicator in CancelUpdate response
+ */
+enum pldm_firmware_update_non_functioning_component_indication {
+	PLDM_FWUP_COMPONENTS_FUNCTIONING = 0,
+	PLDM_FWUP_COMPONENTS_NOT_FUNCTIONING = 1
+};
+
+/** @struct pldm_package_header_information
+ *
+ *  Structure representing fixed part of package header information
+ */
+struct pldm_package_header_information {
+	uint8_t uuid[PLDM_FWUP_UUID_LENGTH];
+	uint8_t package_header_format_version;
+	uint16_t package_header_size;
+	uint8_t timestamp104[PLDM_TIMESTAMP104_SIZE];
+	uint16_t component_bitmap_bit_length;
+	uint8_t package_version_string_type;
+	uint8_t package_version_string_length;
+} __attribute__((packed));
+
+/** @struct pldm_firmware_device_id_record
+ *
+ *  Structure representing firmware device ID record
+ */
+struct pldm_firmware_device_id_record {
+	uint16_t record_length;
+	uint8_t descriptor_count;
+	bitfield32_t device_update_option_flags;
+	uint8_t comp_image_set_version_string_type;
+	uint8_t comp_image_set_version_string_length;
+	uint16_t fw_device_pkg_data_length;
+} __attribute__((packed));
+
+/** @struct pldm_descriptor_tlv
+ *
+ *  Structure representing descriptor type, length and value
+ */
+struct pldm_descriptor_tlv {
+	uint16_t descriptor_type;
+	uint16_t descriptor_length;
+	uint8_t descriptor_data[1];
+} __attribute__((packed));
+
+/** @struct pldm_vendor_defined_descriptor_title_data
+ *
+ *  Structure representing vendor defined descriptor title sections
+ */
+struct pldm_vendor_defined_descriptor_title_data {
+	uint8_t vendor_defined_descriptor_title_str_type;
+	uint8_t vendor_defined_descriptor_title_str_len;
+	uint8_t vendor_defined_descriptor_title_str[1];
+} __attribute__((packed));
+
+/** @struct pldm_component_image_information
+ *
+ *  Structure representing fixed part of individual component information in
+ *  PLDM firmware update package
+ */
+struct pldm_component_image_information {
+	uint16_t comp_classification;
+	uint16_t comp_identifier;
+	uint32_t comp_comparison_stamp;
+	bitfield16_t comp_options;
+	bitfield16_t requested_comp_activation_method;
+	uint32_t comp_location_offset;
+	uint32_t comp_size;
+	uint8_t comp_version_string_type;
+	uint8_t comp_version_string_length;
+} __attribute__((packed));
+
+/** @struct pldm_query_device_identifiers_resp
+ *
+ *  Structure representing query device identifiers response.
+ */
+struct pldm_query_device_identifiers_resp {
+	uint8_t completion_code;
+	uint32_t device_identifiers_len;
+	uint8_t descriptor_count;
+} __attribute__((packed));
+
+/** @struct pldm_get_firmware_parameters_resp
+ *
+ *  Structure representing the fixed part of GetFirmwareParameters response
+ */
+struct pldm_get_firmware_parameters_resp {
+	uint8_t completion_code;
+	bitfield32_t capabilities_during_update;
+	uint16_t comp_count;
+	uint8_t active_comp_image_set_ver_str_type;
+	uint8_t active_comp_image_set_ver_str_len;
+	uint8_t pending_comp_image_set_ver_str_type;
+	uint8_t pending_comp_image_set_ver_str_len;
+} __attribute__((packed));
+
+/** @struct pldm_component_parameter_entry
+ *
+ *  Structure representing component parameter table entry.
+ */
+struct pldm_component_parameter_entry {
+	uint16_t comp_classification;
+	uint16_t comp_identifier;
+	uint8_t comp_classification_index;
+	uint32_t active_comp_comparison_stamp;
+	uint8_t active_comp_ver_str_type;
+	uint8_t active_comp_ver_str_len;
+	uint8_t active_comp_release_date[8];
+	uint32_t pending_comp_comparison_stamp;
+	uint8_t pending_comp_ver_str_type;
+	uint8_t pending_comp_ver_str_len;
+	uint8_t pending_comp_release_date[8];
+	bitfield16_t comp_activation_methods;
+	bitfield32_t capabilities_during_update;
+} __attribute__((packed));
+
+/** @struct pldm_request_update_req
+ *
+ *  Structure representing fixed part of Request Update request
+ */
+struct pldm_request_update_req {
+	uint32_t max_transfer_size;
+	uint16_t num_of_comp;
+	uint8_t max_outstanding_transfer_req;
+	uint16_t pkg_data_len;
+	uint8_t comp_image_set_ver_str_type;
+	uint8_t comp_image_set_ver_str_len;
+} __attribute__((packed));
+
+/** @struct pldm_request_update_resp
+ *
+ *  Structure representing Request Update response
+ */
+struct pldm_request_update_resp {
+	uint8_t completion_code;
+	uint16_t fd_meta_data_len;
+	uint8_t fd_will_send_pkg_data;
+} __attribute__((packed));
+
+/** @struct pldm_pass_component_table_req
+ *
+ *  Structure representing PassComponentTable request
+ */
+struct pldm_pass_component_table_req {
+	uint8_t transfer_flag;
+	uint16_t comp_classification;
+	uint16_t comp_identifier;
+	uint8_t comp_classification_index;
+	uint32_t comp_comparison_stamp;
+	uint8_t comp_ver_str_type;
+	uint8_t comp_ver_str_len;
+} __attribute__((packed));
+
+/** @struct pldm_pass_component_table_resp
+ *
+ *  Structure representing PassComponentTable response
+ */
+struct pldm_pass_component_table_resp {
+	uint8_t completion_code;
+	uint8_t comp_resp;
+	uint8_t comp_resp_code;
+} __attribute__((packed));
+
+/** @struct pldm_update_component_req
+ *
+ *  Structure representing UpdateComponent request
+ */
+struct pldm_update_component_req {
+	uint16_t comp_classification;
+	uint16_t comp_identifier;
+	uint8_t comp_classification_index;
+	uint32_t comp_comparison_stamp;
+	uint32_t comp_image_size;
+	bitfield32_t update_option_flags;
+	uint8_t comp_ver_str_type;
+	uint8_t comp_ver_str_len;
+} __attribute__((packed));
+
+/** @struct pldm_update_component_resp
+ *
+ *  Structure representing UpdateComponent response
+ */
+struct pldm_update_component_resp {
+	uint8_t completion_code;
+	uint8_t comp_compatability_resp;
+	uint8_t comp_compatability_resp_code;
+	bitfield32_t update_option_flags_enabled;
+	uint16_t time_before_req_fw_data;
+} __attribute__((packed));
+
+/** @struct pldm_request_firmware_data_req
+ *
+ *  Structure representing RequestFirmwareData request.
+ */
+struct pldm_request_firmware_data_req {
+	uint32_t offset;
+	uint32_t length;
+} __attribute__((packed));
+
+/** @struct pldm_apply_complete_req
+ *
+ *  Structure representing ApplyComplete request.
+ */
+struct pldm_apply_complete_req {
+	uint8_t apply_result;
+	bitfield16_t comp_activation_methods_modification;
+} __attribute__((packed));
+
+/** @struct pldm_activate_firmware_req
+ *
+ *  Structure representing ActivateFirmware request
+ */
+struct pldm_activate_firmware_req {
+	bool8_t self_contained_activation_req;
+} __attribute__((packed));
+
+/** @struct activate_firmware_resp
+ *
+ *  Structure representing Activate Firmware response
+ */
+struct pldm_activate_firmware_resp {
+	uint8_t completion_code;
+	uint16_t estimated_time_activation;
+} __attribute__((packed));
+
+/** @struct pldm_get_status_resp
+ *
+ *  Structure representing GetStatus response.
+ */
+struct pldm_get_status_resp {
+	uint8_t completion_code;
+	uint8_t current_state;
+	uint8_t previous_state;
+	uint8_t aux_state;
+	uint8_t aux_state_status;
+	uint8_t progress_percent;
+	uint8_t reason_code;
+	bitfield32_t update_option_flags_enabled;
+} __attribute__((packed));
+
+/** @struct pldm_cancel_update_resp
+ *
+ *  Structure representing CancelUpdate response.
+ */
+struct pldm_cancel_update_resp {
+	uint8_t completion_code;
+	bool8_t non_functioning_component_indication;
+	uint64_t non_functioning_component_bitmap;
+} __attribute__((packed));
+
+/** @brief Decode the PLDM package header information
+ *
+ *  @param[in] data - pointer to package header information
+ *  @param[in] length - available length in the firmware update package
+ *  @param[out] package_header_info - pointer to fixed part of PLDM package
+ *                                    header information
+ *  @param[out] package_version_str - pointer to package version string
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_pldm_package_header_info(
+    const uint8_t *data, size_t length,
+    struct pldm_package_header_information *package_header_info,
+    struct variable_field *package_version_str);
+
+/** @brief Decode individual firmware device ID record
+ *
+ *  @param[in] data - pointer to firmware device ID record
+ *  @param[in] length - available length in the firmware update package
+ *  @param[in] component_bitmap_bit_length - ComponentBitmapBitLengthfield
+ *                                           parsed from the package header info
+ *  @param[out] fw_device_id_record - pointer to fixed part of firmware device
+ *                                    id record
+ *  @param[out] applicable_components - pointer to ApplicableComponents
+ *  @param[out] comp_image_set_version_str - pointer to
+ *                                           ComponentImageSetVersionString
+ *  @param[out] record_descriptors - pointer to RecordDescriptors
+ *  @param[out] fw_device_pkg_data - pointer to FirmwareDevicePackageData
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_firmware_device_id_record(
+    const uint8_t *data, size_t length, uint16_t component_bitmap_bit_length,
+    struct pldm_firmware_device_id_record *fw_device_id_record,
+    struct variable_field *applicable_components,
+    struct variable_field *comp_image_set_version_str,
+    struct variable_field *record_descriptors,
+    struct variable_field *fw_device_pkg_data);
+
+/** @brief Decode the record descriptor entries in the firmware update package
+ *         and the Descriptors in the QueryDeviceIDentifiers command
+ *
+ *  @param[in] data - pointer to descriptor entry
+ *  @param[in] length - remaining length of the descriptor data
+ *  @param[out] descriptor_type - pointer to descriptor type
+ *  @param[out] descriptor_data - pointer to descriptor data
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_descriptor_type_length_value(const uint8_t *data, size_t length,
+					uint16_t *descriptor_type,
+					struct variable_field *descriptor_data);
+
+/** @brief Decode the vendor defined descriptor value
+ *
+ *  @param[in] data - pointer to vendor defined descriptor value
+ *  @param[in] length - length of the vendor defined descriptor value
+ *  @param[out] descriptor_title_str_type - pointer to vendor defined descriptor
+ *                                          title string type
+ *  @param[out] descriptor_title_str - pointer to vendor defined descriptor
+ *                                     title string
+ *  @param[out] descriptor_data - pointer to vendor defined descriptor data
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_vendor_defined_descriptor_value(
+    const uint8_t *data, size_t length, uint8_t *descriptor_title_str_type,
+    struct variable_field *descriptor_title_str,
+    struct variable_field *descriptor_data);
+
+/** @brief Decode individual component image information
+ *
+ *  @param[in] data - pointer to component image information
+ *  @param[in] length - available length in the firmware update package
+ *  @param[out] pldm_comp_image_info - pointer to fixed part of component image
+ *                                     information
+ *  @param[out] comp_version_str - pointer to component version string
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_pldm_comp_image_info(
+    const uint8_t *data, size_t length,
+    struct pldm_component_image_information *pldm_comp_image_info,
+    struct variable_field *comp_version_str);
+
+/** @brief Create a PLDM request message for QueryDeviceIdentifiers
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] payload_length - Length of the request message payload
+ *  @param[in,out] msg - Message will be written to this
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_query_device_identifiers_req(uint8_t instance_id,
+					size_t payload_length,
+					struct pldm_msg *msg);
+
+/** @brief Decode QueryDeviceIdentifiers response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to response msg's PLDM completion code
+ *  @param[out] device_identifiers_len - Pointer to device identifiers length
+ *  @param[out] descriptor_count - Pointer to descriptor count
+ *  @param[out] descriptor_data - Pointer to descriptor data
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_query_device_identifiers_resp(const struct pldm_msg *msg,
+					 size_t payload_length,
+					 uint8_t *completion_code,
+					 uint32_t *device_identifiers_len,
+					 uint8_t *descriptor_count,
+					 uint8_t **descriptor_data);
+
+/** @brief Create a PLDM request message for GetFirmwareParameters
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] payload_length - Length of the request message payload
+ *  @param[in,out] msg - Message will be written to this
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_get_firmware_parameters_req(uint8_t instance_id,
+				       size_t payload_length,
+				       struct pldm_msg *msg);
+
+/** @brief Decode GetFirmwareParameters response
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] resp_data - Pointer to get firmware parameters response
+ *  @param[out] active_comp_image_set_ver_str - Pointer to active component
+ *                                              image set version string
+ *  @param[out] pending_comp_image_set_ver_str - Pointer to pending component
+ *                                               image set version string
+ *  @param[out] comp_parameter_table - Pointer to component parameter table
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_get_firmware_parameters_resp(
+    const struct pldm_msg *msg, size_t payload_length,
+    struct pldm_get_firmware_parameters_resp *resp_data,
+    struct variable_field *active_comp_image_set_ver_str,
+    struct variable_field *pending_comp_image_set_ver_str,
+    struct variable_field *comp_parameter_table);
+
+/** @brief Decode component entries in the component parameter table which is
+ *         part of the response of GetFirmwareParameters command
+ *
+ *  @param[in] data - Component entry
+ *  @param[in] length - Length of component entry
+ *  @param[out] component_data - Pointer to component parameter table
+ *  @param[out] active_comp_ver_str - Pointer to active component version string
+ *  @param[out] pending_comp_ver_str - Pointer to pending component version
+ *                                     string
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_get_firmware_parameters_resp_comp_entry(
+    const uint8_t *data, size_t length,
+    struct pldm_component_parameter_entry *component_data,
+    struct variable_field *active_comp_ver_str,
+    struct variable_field *pending_comp_ver_str);
+
+/** @brief Create PLDM request message for RequestUpdate
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] max_transfer_size - Maximum size of the variable payload allowed
+ *                                 to be requested via RequestFirmwareData
+ *                                 command
+ *  @param[in] num_of_comp - Total number of components that will be passed to
+ *                           the FD during the update
+ *  @param[in] max_outstanding_transfer_req - Total number of outstanding
+ * 											  RequestFirmwareData
+ * commands that can be sent by the FD
+ *  @param[in] pkg_data_len - Value of the FirmwareDevicePackageDataLength field
+ *                            present in firmware package header
+ *  @param[in] comp_image_set_ver_str_type - StringType of
+ *                                           ComponentImageSetVersionString
+ *  @param[in] comp_image_set_ver_str_len - The length of the
+ *                                          ComponentImageSetVersionString
+ *  @param[in] comp_img_set_ver_str - Component Image Set version information
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note Caller is responsible for memory alloc and dealloc of param
+ *        'msg.payload'
+ */
+int encode_request_update_req(uint8_t instance_id, uint32_t max_transfer_size,
+			      uint16_t num_of_comp,
+			      uint8_t max_outstanding_transfer_req,
+			      uint16_t pkg_data_len,
+			      uint8_t comp_image_set_ver_str_type,
+			      uint8_t comp_image_set_ver_str_len,
+			      const struct variable_field *comp_img_set_ver_str,
+			      struct pldm_msg *msg, size_t payload_length);
+
+/** @brief Decode a RequestUpdate response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to hold the completion code
+ *  @param[out] fd_meta_data_len - Pointer to hold the length of FD metadata
+ *  @param[out] fd_will_send_pkg_data - Pointer to hold information whether FD
+ *                                      will send GetPackageData command
+ *  @return pldm_completion_codes
+ */
+int decode_request_update_resp(const struct pldm_msg *msg,
+			       size_t payload_length, uint8_t *completion_code,
+			       uint16_t *fd_meta_data_len,
+			       uint8_t *fd_will_send_pkg_data);
+
+/** @brief Create PLDM request message for PassComponentTable
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] transfer_flag - TransferFlag
+ *  @param[in] comp_classification - ComponentClassification
+ *  @param[in] comp_identifier - ComponentIdentifier
+ *  @param[in] comp_classification_index - ComponentClassificationIndex
+ *  @param[in] comp_comparison_stamp - ComponentComparisonStamp
+ *  @param[in] comp_ver_str_type - ComponentVersionStringType
+ *  @param[in] comp_ver_str_len - ComponentVersionStringLength
+ *  @param[in] comp_ver_str - ComponentVersionString
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *                              information
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_pass_component_table_req(
+    uint8_t instance_id, uint8_t transfer_flag, uint16_t comp_classification,
+    uint16_t comp_identifier, uint8_t comp_classification_index,
+    uint32_t comp_comparison_stamp, uint8_t comp_ver_str_type,
+    uint8_t comp_ver_str_len, const struct variable_field *comp_ver_str,
+    struct pldm_msg *msg, size_t payload_length);
+
+/** @brief Decode PassComponentTable response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to hold completion code
+ *  @param[out] comp_resp - Pointer to hold component response
+ *  @param[out] comp_resp_code - Pointer to hold component response code
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_pass_component_table_resp(const struct pldm_msg *msg,
+				     size_t payload_length,
+				     uint8_t *completion_code,
+				     uint8_t *comp_resp,
+				     uint8_t *comp_resp_code);
+
+/** @brief Create PLDM request message for UpdateComponent
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] comp_classification - ComponentClassification
+ *  @param[in] comp_identifier - ComponentIdentifier
+ *  @param[in] comp_classification_index - ComponentClassificationIndex
+ *  @param[in] comp_comparison_stamp - ComponentComparisonStamp
+ *  @param[in] comp_image_size - ComponentImageSize
+ *  @param[in] update_option_flags - UpdateOptionFlags
+ *  @param[in] comp_ver_str_type - ComponentVersionStringType
+ *  @param[in] comp_ver_str_len - ComponentVersionStringLength
+ *  @param[in] comp_ver_str - ComponentVersionString
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *                              information
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_update_component_req(
+    uint8_t instance_id, uint16_t comp_classification, uint16_t comp_identifier,
+    uint8_t comp_classification_index, uint32_t comp_comparison_stamp,
+    uint32_t comp_image_size, bitfield32_t update_option_flags,
+    uint8_t comp_ver_str_type, uint8_t comp_ver_str_len,
+    const struct variable_field *comp_ver_str, struct pldm_msg *msg,
+    size_t payload_length);
+
+/** @brief Decode UpdateComponent response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to hold completion code
+ *  @param[out] comp_compatability_resp - Pointer to hold component
+ *                                        compatibility response
+ *  @param[out] comp_compatability_resp_code - Pointer to hold component
+ *                                             compatibility response code
+ *  @param[out] update_option_flags_enabled - Pointer to hold
+ *                                            UpdateOptionsFlagEnabled
+ *  @param[out] time_before_req_fw_data - Pointer to hold the estimated time
+ *                                        before sending RequestFirmwareData
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_update_component_resp(const struct pldm_msg *msg,
+				 size_t payload_length,
+				 uint8_t *completion_code,
+				 uint8_t *comp_compatability_resp,
+				 uint8_t *comp_compatability_resp_code,
+				 bitfield32_t *update_option_flags_enabled,
+				 uint16_t *time_before_req_fw_data);
+
+/** @brief Decode RequestFirmwareData request message
+ *
+ *	@param[in] msg - Request message
+ *	@param[in] payload_length - Length of request message payload
+ *	@param[out] offset - Pointer to hold offset
+ *	@param[out] length - Pointer to hold the size of the component image
+ *                       segment requested by the FD/FDP
+ *
+ *	@return pldm_completion_codes
+ */
+int decode_request_firmware_data_req(const struct pldm_msg *msg,
+				     size_t payload_length, uint32_t *offset,
+				     uint32_t *length);
+
+/** @brief Create PLDM response message for RequestFirmwareData
+ *
+ *  The ComponentImagePortion is not encoded in the PLDM response message
+ *  by encode_request_firmware_data_resp to avoid an additional copy. Populating
+ *  ComponentImagePortion in the PLDM response message is handled by the user
+ *  of this API. The payload_length validation considers only the
+ *  CompletionCode.
+ *
+ *	@param[in] instance_id - Message's instance id
+ *	@param[in] completion_code - CompletionCode
+ *	@param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of response message payload
+ *
+ *	@return pldm_completion_codes
+ *
+ *	@note  Caller is responsible for memory alloc and dealloc of param
+ *		   'msg.payload'
+ */
+int encode_request_firmware_data_resp(uint8_t instance_id,
+				      uint8_t completion_code,
+				      struct pldm_msg *msg,
+				      size_t payload_length);
+
+/** @brief Decode TransferComplete request message
+ *
+ *  @param[in] msg - Request message
+ *  @param[in] payload_length - Length of request message payload
+ *  @param[out] transfer_result - Pointer to hold TransferResult
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_transfer_complete_req(const struct pldm_msg *msg,
+				 size_t payload_length,
+				 uint8_t *transfer_result);
+
+/** @brief Create PLDM response message for TransferComplete
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] completion_code - CompletionCode
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of response message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_transfer_complete_resp(uint8_t instance_id, uint8_t completion_code,
+				  struct pldm_msg *msg, size_t payload_length);
+
+/** @brief Decode VerifyComplete request message
+ *
+ *  @param[in] msg - Request message
+ *  @param[in] payload_length - Length of request message payload
+ *  @param[in] verify_result - Pointer to hold VerifyResult
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_verify_complete_req(const struct pldm_msg *msg,
+			       size_t payload_length, uint8_t *verify_result);
+
+/** @brief Create PLDM response message for VerifyComplete
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] completion_code - CompletionCode
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of response message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_verify_complete_resp(uint8_t instance_id, uint8_t completion_code,
+				struct pldm_msg *msg, size_t payload_length);
+
+/** @brief Decode ApplyComplete request message
+ *
+ *  @param[in] msg - Request message
+ *  @param[in] payload_length - Length of request message payload
+ *  @param[in] apply_result - Pointer to hold ApplyResult
+ *  @param[in] comp_activation_methods_modification - Pointer to hold the
+ *                                        ComponentActivationMethodsModification
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_apply_complete_req(
+    const struct pldm_msg *msg, size_t payload_length, uint8_t *apply_result,
+    bitfield16_t *comp_activation_methods_modification);
+
+/** @brief Create PLDM response message for ApplyComplete
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] completion_code - CompletionCode
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of response message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note Caller is responsible for memory alloc and dealloc of param
+ *        'msg.payload'
+ */
+int encode_apply_complete_resp(uint8_t instance_id, uint8_t completion_code,
+			       struct pldm_msg *msg, size_t payload_length);
+
+/** @brief Create PLDM request message for ActivateFirmware
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in] self_contained_activation_req SelfContainedActivationRequest
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_activate_firmware_req(uint8_t instance_id,
+				 bool8_t self_contained_activation_req,
+				 struct pldm_msg *msg, size_t payload_length);
+
+/** @brief Decode ActivateFirmware response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to hold CompletionCode
+ *  @param[out] estimated_time_activation - Pointer to hold
+ *                                       EstimatedTimeForSelfContainedActivation
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_activate_firmware_resp(const struct pldm_msg *msg,
+				  size_t payload_length,
+				  uint8_t *completion_code,
+				  uint16_t *estimated_time_activation);
+
+/** @brief Create PLDM request message for GetStatus
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note Caller is responsible for memory alloc and dealloc of param
+ *        'msg.payload'
+ */
+int encode_get_status_req(uint8_t instance_id, struct pldm_msg *msg,
+			  size_t payload_length);
+
+/** @brief Decode GetStatus response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to completion code
+ *  @param[out] current_state - Pointer to current state machine state
+ *  @param[out] previous_state - Pointer to previous different state machine
+ *                               state
+ *  @param[out] aux_state - Pointer to current operation state of FD/FDP
+ *  @param[out] aux_state_status - Pointer to aux state status
+ *  @param[out] progress_percent - Pointer to progress percentage
+ *  @param[out] reason_code - Pointer to reason for entering current state
+ *  @param[out] update_option_flags_enabled - Pointer to update option flags
+ *                                            enabled
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_get_status_resp(const struct pldm_msg *msg, size_t payload_length,
+			   uint8_t *completion_code, uint8_t *current_state,
+			   uint8_t *previous_state, uint8_t *aux_state,
+			   uint8_t *aux_state_status, uint8_t *progress_percent,
+			   uint8_t *reason_code,
+			   bitfield32_t *update_option_flags_enabled);
+
+/** @brief Create PLDM request message for CancelUpdateComponent
+ *
+ *  @param[in] instance_id - Message's instance id
+ *  @param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *
+ *  @return pldm_completion_codes
+ *
+ *  @note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_cancel_update_component_req(uint8_t instance_id,
+				       struct pldm_msg *msg,
+				       size_t payload_length);
+
+/** @brief Decode CancelUpdateComponent response message
+ *
+ *  @param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *  @param[out] completion_code - Pointer to the completion code
+ *
+ *  @return pldm_completion_codes
+ */
+int decode_cancel_update_component_resp(const struct pldm_msg *msg,
+					size_t payload_length,
+					uint8_t *completion_code);
+
+/** @brief Create PLDM request message for CancelUpdate
+ *
+ *	@param[in] instance_id - Message's instance id
+ *	@param[in,out] msg - Message will be written to this
+ *  @param[in] payload_length - Length of request message payload
+ *
+ *	@return pldm_completion_codes
+ *
+ *	@note  Caller is responsible for memory alloc and dealloc of param
+ *         'msg.payload'
+ */
+int encode_cancel_update_req(uint8_t instance_id, struct pldm_msg *msg,
+			     size_t payload_length);
+
+/** @brief Decode CancelUpdate response message
+ *
+ *	@param[in] msg - Response message
+ *  @param[in] payload_length - Length of response message payload
+ *	@param[out] completion_code - Pointer to completion code
+ *	@param[out] non_functioning_component_indication - Pointer to non
+						       functioning
+ *                                                     component indication
+ *	@param[out] non_functioning_component_bitmap - Pointer to non
+ functioning
+ *                                                 component bitmap
+ *
+ *	@return pldm_completion_codes
+ */
+int decode_cancel_update_resp(const struct pldm_msg *msg, size_t payload_length,
+			      uint8_t *completion_code,
+			      bool8_t *non_functioning_component_indication,
+			      bitfield64_t *non_functioning_component_bitmap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // End of FW_UPDATE_H
diff --git a/libpldm/state_set.h b/libpldm/state_set.h
index aa0849d..23fd91c 100644
--- a/libpldm/state_set.h
+++ b/libpldm/state_set.h
@@ -1,236 +1,236 @@
-#ifndef STATE_SET_H
-#define STATE_SET_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @brief PLDM State Set IDs in DSP0249_1.1.0 specification
- */
-enum pldm_state_set_ids {
-
-	/* Table 1 - General State Sets */
-	PLDM_STATE_SET_HEALTH_STATE = 1,
-	PLDM_STATE_SET_AVAILABILITY = 2,
-	PLDM_STATE_SET_PREDICTIVE_CONDITION = 3,
-	PLDM_STATE_SET_REDUNDANCY_STATUS = 4,
-	PLDM_STATE_SET_HEALTH_REDUNDANCY_TREND = 5,
-	PLDM_STATE_SET_GROUP_RESOURCE_LEVEL = 6,
-	PLDM_STATE_SET_REDUNDANCY_ENTITY_ROLE = 7,
-	PLDM_STATE_SET_OPERATIONAL_STATUS = 8,
-	PLDM_STATE_SET_OPERATIONAL_STRESS_STATUS = 9,
-	PLDM_STATE_SET_OPERATIONAL_FAULT_STATUS = 10,
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS = 11,
-	PLDM_STATE_SET_OPERATIONAL_CONNECTION_STATUS = 12,
-	PLDM_STATE_SET_PRESENCE = 13,
-	PLDM_STATE_SET_PERFORMANCE = 14,
-	PLDM_STATE_SET_CONFIGURATION_STATE = 15,
-	PLDM_STATE_SET_CHANGED_CONFIGURATION = 16,
-	PLDM_STATE_SET_IDENTIFY_STATE = 17,
-	PLDM_STATE_SET_VERSION = 18,
-	PLDM_STATE_SET_ALARM_STATE = 19,
-	PLDM_STATE_SET_DEVICE_INITIALIZATION = 20,
-	PLDM_STATE_SET_THERMAL_TRIP = 21,
-
-	/* Table 2 - Communication State Sets */
-	PLDM_STATE_SET_HEARTBEAT = 32,
-	PLDM_STATE_SET_LINK_STATE = 33,
-
-	/* Table 3 - General Sensor State Sets */
-	PLDM_STATE_SET_SMOKE_STATE = 64,
-	PLDM_STATE_SET_HUMIDITY_STATE = 65,
-	PLDM_STATE_SET_DOOR_STATE = 66,
-	PLDM_STATE_SET_SWITCH_STATE = 67,
-
-	/* Table 4 - Security-Related State Sets */
-	PLDM_STATE_SET_LOCK_STATE = 96,
-	PLDM_STATE_SET_PHYSICAL_SECURITY = 97,
-	PLDM_STATE_SET_DOCK_AUTHORIZATION = 98,
-	PLDM_STATE_SET_HW_SECURITY = 99,
-	PLDM_STATE_SET_PHYSICAL_COMM_CONNECTION = 100,
-	PLDM_STATE_SET_COMM_LEASH_STATUS = 101,
-	PLDM_STATE_SET_FOREIGN_NW_DETECTION_STATUS = 102,
-	PLDM_STATE_SET_PASSWORD_PROTECTED_ACCESS_SECURITY = 103,
-	PLDM_STATE_SET_SECURITY_ACCESS_PRIVILEGE_LEVEL = 104,
-	PLDM_STATE_SET_SESSION_AUDIT = 105,
-
-	/* Table 5 - Software-Related State Sets */
-	PLDM_STATE_SET_SW_TERMINATION_STATUS = 129,
-
-	/* Table 6 - Redundant Storage Media (RAID) State Sets */
-	PLDM_STATE_SET_STORAGE_MEDIA_ACTIVITY = 160,
-
-	/* Table 7 - Boot-Related State Sets */
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE = 192,
-	PLDM_STATE_SET_BOOT_RESTART_REQUEST = 193,
-	PLDM_STATE_SET_ENTITY_BOOT_STATUS = 194,
-	PLDM_STATE_SET_BOOT_ERROR_STATUS = 195,
-	PLDM_STATE_SET_BOOT_PROGRESS = 196,
-	PLDM_STATE_SET_SYS_FIRMWARE_HANG = 197,
-	PLDM_STATE_SET_POST_ERRORS = 198,
-
-	/* Table 8 - Monitored System-Related State Sets */
-	PLDM_STATE_SET_LOG_FILL_STATUS = 225,
-	PLDM_STATE_SET_LOG_FILTER_STATUS = 226,
-	PLDM_STATE_SET_LOG_TIMESTAMP_CHANGE = 227,
-	PLDM_STATE_SET_INTERRUPT_REQUESTED = 228,
-	PLDM_STATE_SET_INTERRUPT_RECEIVED = 229,
-	PLDM_STATE_SET_DIAGNOSTIC_INTERRUPT_REQUESTED = 230,
-	PLDM_STATE_SET_DIAGNOSTIC_INTERRUPT_RECEIVED = 231,
-	PLDM_STATE_SET_IO_CHANNEL_CHECK_NMI_REQUESTED = 232,
-	PLDM_STATE_SET_IO_CHANNEL_CHECK_NMI_RECEIVED = 233,
-	PLDM_STATE_SET_FATAL_NMI_REQUESTED = 234,
-	PLDM_STATE_SET_FATAL_NMI_RECEIVED = 235,
-	PLDM_STATE_SET_SOFTWARE_NMI_REQUESTED = 236,
-	PLDM_STATE_SET_SOFTWARE_NMI_RECEIVED = 237,
-	PLDM_STATE_SET_SMI_REQUESTED = 238,
-	PLDM_STATE_SET_SMI_RECEIVED = 238,
-	PLDM_STATE_SET_PCI_PERR_REQUESTED = 239,
-	PLDM_STATE_SET_PCI_PERR_RECEIVED = 240,
-	PLDM_STATE_SET_PCI_SERR_REQUESTED = 241,
-	PLDM_STATE_SET_PCI_SERR_RECEIVED = 242,
-	PLDM_STATE_SET_BUS_ERROR_STATUS = 243,
-	PLDM_STATE_SET_WATCHDOG_STATUS = 244,
-
-	/* Table 9 - Power-Related State Sets */
-	PLDM_STATE_SET_POWER_SUPPLY_STATE = 256,
-	PLDM_STATE_SET_DEVICE_POWER_STATE = 257,
-	PLDM_STATE_SET_ACPI_POWER_STATE = 258,
-	PLDM_STATE_SET_BACKUP_POWER_SOURCE = 259,
-	PLDM_STATE_SET_SYSTEM_POWER_STATE = 260,
-	PLDM_STATE_SET_BATTERY_ACTIVITY = 261,
-	PLDM_STATE_SET_BATTERY_STATE = 262,
-
-	/* Table 10 - Processor-Related State Sets */
-	PLDM_STATE_SET_PROC_POWER_STATE = 288,
-	PLDM_STATE_SET_POWER_PERFORMANCE_STATE = 289,
-	PLDM_STATE_SET_PROC_ERROR_STATUS = 290,
-	PLDM_STATE_SET_BIST_FAILURE_STATUS = 291,
-	PLDM_STATE_SET_IBIST_FAILURE_STATUS = 292,
-	PLDM_STATE_SET_PROC_HANG_IN_POST = 293,
-	PLDM_STATE_SET_PROC_STARTUP_FAILURE = 294,
-	PLDM_STATE_SET_UNCORRECTABLE_CPU_ERROR = 295,
-	PLDM_STATE_SET_MACHINE_CHECK_ERROR = 296,
-	PLDM_STATE_SET_CORRECTED_MACHINE_CHECK = 297,
-
-	/* Table 11 - Memory-Related State Sets */
-	PLDM_STATE_SET_CACHE_STATUS = 320,
-	PLDM_STATE_SET_MEMORY_ERROR_STATUS = 321,
-	PLDM_STATE_SET_REDUNDANT_MEMORY_ACTIVITY_STATUS = 322,
-
-	/* Table 12 - Storage Device State Sets */
-	PLDM_STATE_SET_ERROR_DETECTION_STATUS = 330,
-	PLDM_STATE_SET_STUCK_BIT_STATUS = 331,
-	PLDM_STATE_SET_SCRUB_STATUS = 332,
-
-	/* Table 13 - Slot/Module State Sets */
-	PLDM_STATE_SET_SLOT_OCCUPANCY = 352,
-	PLDM_STATE_SET_SLOT_STATE = 353,
-};
-
-/* @brief List of states for the Health State state set (ID 1).
- */
-enum pldm_state_set_health_state_values {
-	PLDM_STATE_SET_HEALTH_STATE_NORMAL = 1,
-	PLDM_STATE_SET_HEALTH_STATE_NON_CRITICAL = 2,
-	PLDM_STATE_SET_HEALTH_STATE_CRITICAL = 3,
-	PLDM_STATE_SET_HEALTH_STATE_FATAL = 4,
-	PLDM_STATE_SET_HEALTH_STATE_UPPER_NON_CRITICAL = 5,
-	PLDM_STATE_SET_HEALTH_STATE_LOWER_NON_CRITICAL = 6,
-	PLDM_STATE_SET_HEALTH_STATE_UPPER_CRITICAL = 7,
-	PLDM_STATE_SET_HEALTH_STATE_LOWER_CRITICAL = 8,
-	PLDM_STATE_SET_HEALTH_STATE_UPPER_FATAL = 9,
-	PLDM_STATE_SET_HEALTH_STATE_LOWER_FATAL = 10,
-};
-
-/* @brief List of states for the State Set Availability (ID 2),
- */
-enum pldm_state_set_availability_values {
-	PLDM_STATE_SET_AVAILABILITY_REBOOTING = 8
-};
-
-/* @brief List of states for the Operational Fault status (ID 10).
- */
-enum pldm_state_set_operational_fault_status_values {
-	PLDM_STATE_SET_OPERATIONAL_FAULT_STATUS_NORMAL = 1,
-	PLDM_STATE_SET_OPERATIONAL_FAULT_STATUS_STRESSED = 2,
-};
-
-/* @brief List of states for the Operational Running Status state set (ID 11).
- */
-enum pldm_state_set_operational_running_status_values {
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_STARTING = 1,
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_STOPPING = 2,
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_STOPPED = 3,
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_IN_SERVICE = 4,
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_ABORTED = 5,
-	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_DORMANT = 6
-};
-
-/* @brief List of states for the Set Identify state (ID 17).
- */
-enum pldm_state_set_identify_state_values {
-	PLDM_STATE_SET_IDENTIFY_STATE_UNASSERTED = 1,
-	PLDM_STATE_SET_IDENTIFY_STATE_ASSERTED = 2,
-};
-
-/* @brief List of states for the Set Thermal Trip state set (ID 21).
- */
-enum pldm_state_set_thermal_trip_values {
-	PLDM_STATE_SET_THERMAL_TRIP_STATUS_NORMAL = 1,
-	PLDM_STATE_SET_THERMAL_TRIP_STATUS_THERMAL_TRIP = 2,
-};
-
-/* @brief List of states for the Software-related state set (ID 129).
- */
-enum pldm_software_termination_status_values {
-	PLDM_SW_TERM_NORMAL = 1,
-	PLDM_SW_TERM_SOFTWARE_TERMINATION_DETECTED = 2,
-	PLDM_SW_TERM_CRITICAL_STOP_DURING_LOAD_INITIALIZATION = 3,
-	PLDM_SW_TERM_RUN_TIME_CRITICAL_STOP = 4,
-	PLDM_SW_TERM_GRACEFUL_SHUTDOWN_REQUESTED = 5,
-	PLDM_SW_TERM_GRACEFUL_RESTART_REQUESTED = 6,
-	PLDM_SW_TERM_GRACEFUL_SHUTDOWN = 7,
-	PLDM_SW_TERM_TERMINATION_REQUEST_FAILED = 8,
-};
-
-/* @brief List of states for the Boot Restart Cause state set (ID 192).
- */
-enum pldm_state_set_boot_restart_cause_values {
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_POWERED_UP = 1,
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_HARD_RESET = 2,
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_WARM_RESET = 3,
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_MANUAL_HARD_RESET = 4,
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_MANUAL_WARM_RESET = 5,
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_SYSTEM_RESTART = 6,
-	PLDM_STATE_SET_BOOT_RESTART_CAUSE_WATCHDOG_TIMEOUT = 7
-};
-
-/* @brief List of states for the Boot Progress state set (ID 196).
- */
-enum pldm_state_set_boot_progress_state_values {
-	PLDM_STATE_SET_BOOT_PROG_STATE_NOT_ACTIVE = 1,
-	PLDM_STATE_SET_BOOT_PROG_STATE_COMPLETED = 2,
-	PLDM_STATE_SET_BOOT_PROG_STATE_MEM_INITIALIZATION = 3,
-	PLDM_STATE_SET_BOOT_PROG_STATE_SEC_PROC_INITIALIZATION = 5,
-	PLDM_STATE_SET_BOOT_PROG_STATE_PCI_RESORUCE_CONFIG = 9,
-	PLDM_STATE_SET_BOOT_PROG_STATE_STARTING_OP_SYS = 21,
-	PLDM_STATE_SET_BOOT_PROG_STATE_BASE_BOARD_INITIALIZATION = 22,
-	PLDM_STATE_SET_BOOT_PROG_STATE_PRIMARY_PROC_INITIALIZATION = 26,
-};
-
-/* @brief List of states for the System Power State set (ID 260).
- */
-enum pldm_state_set_system_power_state_values {
-	PLDM_STATE_SET_SYS_POWER_STATE_OFF_SOFT_GRACEFUL = 9
-};
-
-/* OEM ranges */
-#define PLDM_OEM_STATE_SET_ID_START 32768
-#define PLDM_OEM_STATE_SET_ID_END 65535
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* STATE_SET_H */
+#ifndef STATE_SET_H
+#define STATE_SET_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief PLDM State Set IDs in DSP0249_1.1.0 specification
+ */
+enum pldm_state_set_ids {
+
+	/* Table 1 - General State Sets */
+	PLDM_STATE_SET_HEALTH_STATE = 1,
+	PLDM_STATE_SET_AVAILABILITY = 2,
+	PLDM_STATE_SET_PREDICTIVE_CONDITION = 3,
+	PLDM_STATE_SET_REDUNDANCY_STATUS = 4,
+	PLDM_STATE_SET_HEALTH_REDUNDANCY_TREND = 5,
+	PLDM_STATE_SET_GROUP_RESOURCE_LEVEL = 6,
+	PLDM_STATE_SET_REDUNDANCY_ENTITY_ROLE = 7,
+	PLDM_STATE_SET_OPERATIONAL_STATUS = 8,
+	PLDM_STATE_SET_OPERATIONAL_STRESS_STATUS = 9,
+	PLDM_STATE_SET_OPERATIONAL_FAULT_STATUS = 10,
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS = 11,
+	PLDM_STATE_SET_OPERATIONAL_CONNECTION_STATUS = 12,
+	PLDM_STATE_SET_PRESENCE = 13,
+	PLDM_STATE_SET_PERFORMANCE = 14,
+	PLDM_STATE_SET_CONFIGURATION_STATE = 15,
+	PLDM_STATE_SET_CHANGED_CONFIGURATION = 16,
+	PLDM_STATE_SET_IDENTIFY_STATE = 17,
+	PLDM_STATE_SET_VERSION = 18,
+	PLDM_STATE_SET_ALARM_STATE = 19,
+	PLDM_STATE_SET_DEVICE_INITIALIZATION = 20,
+	PLDM_STATE_SET_THERMAL_TRIP = 21,
+
+	/* Table 2 - Communication State Sets */
+	PLDM_STATE_SET_HEARTBEAT = 32,
+	PLDM_STATE_SET_LINK_STATE = 33,
+
+	/* Table 3 - General Sensor State Sets */
+	PLDM_STATE_SET_SMOKE_STATE = 64,
+	PLDM_STATE_SET_HUMIDITY_STATE = 65,
+	PLDM_STATE_SET_DOOR_STATE = 66,
+	PLDM_STATE_SET_SWITCH_STATE = 67,
+
+	/* Table 4 - Security-Related State Sets */
+	PLDM_STATE_SET_LOCK_STATE = 96,
+	PLDM_STATE_SET_PHYSICAL_SECURITY = 97,
+	PLDM_STATE_SET_DOCK_AUTHORIZATION = 98,
+	PLDM_STATE_SET_HW_SECURITY = 99,
+	PLDM_STATE_SET_PHYSICAL_COMM_CONNECTION = 100,
+	PLDM_STATE_SET_COMM_LEASH_STATUS = 101,
+	PLDM_STATE_SET_FOREIGN_NW_DETECTION_STATUS = 102,
+	PLDM_STATE_SET_PASSWORD_PROTECTED_ACCESS_SECURITY = 103,
+	PLDM_STATE_SET_SECURITY_ACCESS_PRIVILEGE_LEVEL = 104,
+	PLDM_STATE_SET_SESSION_AUDIT = 105,
+
+	/* Table 5 - Software-Related State Sets */
+	PLDM_STATE_SET_SW_TERMINATION_STATUS = 129,
+
+	/* Table 6 - Redundant Storage Media (RAID) State Sets */
+	PLDM_STATE_SET_STORAGE_MEDIA_ACTIVITY = 160,
+
+	/* Table 7 - Boot-Related State Sets */
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE = 192,
+	PLDM_STATE_SET_BOOT_RESTART_REQUEST = 193,
+	PLDM_STATE_SET_ENTITY_BOOT_STATUS = 194,
+	PLDM_STATE_SET_BOOT_ERROR_STATUS = 195,
+	PLDM_STATE_SET_BOOT_PROGRESS = 196,
+	PLDM_STATE_SET_SYS_FIRMWARE_HANG = 197,
+	PLDM_STATE_SET_POST_ERRORS = 198,
+
+	/* Table 8 - Monitored System-Related State Sets */
+	PLDM_STATE_SET_LOG_FILL_STATUS = 225,
+	PLDM_STATE_SET_LOG_FILTER_STATUS = 226,
+	PLDM_STATE_SET_LOG_TIMESTAMP_CHANGE = 227,
+	PLDM_STATE_SET_INTERRUPT_REQUESTED = 228,
+	PLDM_STATE_SET_INTERRUPT_RECEIVED = 229,
+	PLDM_STATE_SET_DIAGNOSTIC_INTERRUPT_REQUESTED = 230,
+	PLDM_STATE_SET_DIAGNOSTIC_INTERRUPT_RECEIVED = 231,
+	PLDM_STATE_SET_IO_CHANNEL_CHECK_NMI_REQUESTED = 232,
+	PLDM_STATE_SET_IO_CHANNEL_CHECK_NMI_RECEIVED = 233,
+	PLDM_STATE_SET_FATAL_NMI_REQUESTED = 234,
+	PLDM_STATE_SET_FATAL_NMI_RECEIVED = 235,
+	PLDM_STATE_SET_SOFTWARE_NMI_REQUESTED = 236,
+	PLDM_STATE_SET_SOFTWARE_NMI_RECEIVED = 237,
+	PLDM_STATE_SET_SMI_REQUESTED = 238,
+	PLDM_STATE_SET_SMI_RECEIVED = 238,
+	PLDM_STATE_SET_PCI_PERR_REQUESTED = 239,
+	PLDM_STATE_SET_PCI_PERR_RECEIVED = 240,
+	PLDM_STATE_SET_PCI_SERR_REQUESTED = 241,
+	PLDM_STATE_SET_PCI_SERR_RECEIVED = 242,
+	PLDM_STATE_SET_BUS_ERROR_STATUS = 243,
+	PLDM_STATE_SET_WATCHDOG_STATUS = 244,
+
+	/* Table 9 - Power-Related State Sets */
+	PLDM_STATE_SET_POWER_SUPPLY_STATE = 256,
+	PLDM_STATE_SET_DEVICE_POWER_STATE = 257,
+	PLDM_STATE_SET_ACPI_POWER_STATE = 258,
+	PLDM_STATE_SET_BACKUP_POWER_SOURCE = 259,
+	PLDM_STATE_SET_SYSTEM_POWER_STATE = 260,
+	PLDM_STATE_SET_BATTERY_ACTIVITY = 261,
+	PLDM_STATE_SET_BATTERY_STATE = 262,
+
+	/* Table 10 - Processor-Related State Sets */
+	PLDM_STATE_SET_PROC_POWER_STATE = 288,
+	PLDM_STATE_SET_POWER_PERFORMANCE_STATE = 289,
+	PLDM_STATE_SET_PROC_ERROR_STATUS = 290,
+	PLDM_STATE_SET_BIST_FAILURE_STATUS = 291,
+	PLDM_STATE_SET_IBIST_FAILURE_STATUS = 292,
+	PLDM_STATE_SET_PROC_HANG_IN_POST = 293,
+	PLDM_STATE_SET_PROC_STARTUP_FAILURE = 294,
+	PLDM_STATE_SET_UNCORRECTABLE_CPU_ERROR = 295,
+	PLDM_STATE_SET_MACHINE_CHECK_ERROR = 296,
+	PLDM_STATE_SET_CORRECTED_MACHINE_CHECK = 297,
+
+	/* Table 11 - Memory-Related State Sets */
+	PLDM_STATE_SET_CACHE_STATUS = 320,
+	PLDM_STATE_SET_MEMORY_ERROR_STATUS = 321,
+	PLDM_STATE_SET_REDUNDANT_MEMORY_ACTIVITY_STATUS = 322,
+
+	/* Table 12 - Storage Device State Sets */
+	PLDM_STATE_SET_ERROR_DETECTION_STATUS = 330,
+	PLDM_STATE_SET_STUCK_BIT_STATUS = 331,
+	PLDM_STATE_SET_SCRUB_STATUS = 332,
+
+	/* Table 13 - Slot/Module State Sets */
+	PLDM_STATE_SET_SLOT_OCCUPANCY = 352,
+	PLDM_STATE_SET_SLOT_STATE = 353,
+};
+
+/* @brief List of states for the Health State state set (ID 1).
+ */
+enum pldm_state_set_health_state_values {
+	PLDM_STATE_SET_HEALTH_STATE_NORMAL = 1,
+	PLDM_STATE_SET_HEALTH_STATE_NON_CRITICAL = 2,
+	PLDM_STATE_SET_HEALTH_STATE_CRITICAL = 3,
+	PLDM_STATE_SET_HEALTH_STATE_FATAL = 4,
+	PLDM_STATE_SET_HEALTH_STATE_UPPER_NON_CRITICAL = 5,
+	PLDM_STATE_SET_HEALTH_STATE_LOWER_NON_CRITICAL = 6,
+	PLDM_STATE_SET_HEALTH_STATE_UPPER_CRITICAL = 7,
+	PLDM_STATE_SET_HEALTH_STATE_LOWER_CRITICAL = 8,
+	PLDM_STATE_SET_HEALTH_STATE_UPPER_FATAL = 9,
+	PLDM_STATE_SET_HEALTH_STATE_LOWER_FATAL = 10,
+};
+
+/* @brief List of states for the State Set Availability (ID 2),
+ */
+enum pldm_state_set_availability_values {
+	PLDM_STATE_SET_AVAILABILITY_REBOOTING = 8
+};
+
+/* @brief List of states for the Operational Fault status (ID 10).
+ */
+enum pldm_state_set_operational_fault_status_values {
+	PLDM_STATE_SET_OPERATIONAL_FAULT_STATUS_NORMAL = 1,
+	PLDM_STATE_SET_OPERATIONAL_FAULT_STATUS_STRESSED = 2,
+};
+
+/* @brief List of states for the Operational Running Status state set (ID 11).
+ */
+enum pldm_state_set_operational_running_status_values {
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_STARTING = 1,
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_STOPPING = 2,
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_STOPPED = 3,
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_IN_SERVICE = 4,
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_ABORTED = 5,
+	PLDM_STATE_SET_OPERATIONAL_RUNNING_STATUS_DORMANT = 6
+};
+
+/* @brief List of states for the Set Identify state (ID 17).
+ */
+enum pldm_state_set_identify_state_values {
+	PLDM_STATE_SET_IDENTIFY_STATE_UNASSERTED = 1,
+	PLDM_STATE_SET_IDENTIFY_STATE_ASSERTED = 2,
+};
+
+/* @brief List of states for the Set Thermal Trip state set (ID 21).
+ */
+enum pldm_state_set_thermal_trip_values {
+	PLDM_STATE_SET_THERMAL_TRIP_STATUS_NORMAL = 1,
+	PLDM_STATE_SET_THERMAL_TRIP_STATUS_THERMAL_TRIP = 2,
+};
+
+/* @brief List of states for the Software-related state set (ID 129).
+ */
+enum pldm_software_termination_status_values {
+	PLDM_SW_TERM_NORMAL = 1,
+	PLDM_SW_TERM_SOFTWARE_TERMINATION_DETECTED = 2,
+	PLDM_SW_TERM_CRITICAL_STOP_DURING_LOAD_INITIALIZATION = 3,
+	PLDM_SW_TERM_RUN_TIME_CRITICAL_STOP = 4,
+	PLDM_SW_TERM_GRACEFUL_SHUTDOWN_REQUESTED = 5,
+	PLDM_SW_TERM_GRACEFUL_RESTART_REQUESTED = 6,
+	PLDM_SW_TERM_GRACEFUL_SHUTDOWN = 7,
+	PLDM_SW_TERM_TERMINATION_REQUEST_FAILED = 8,
+};
+
+/* @brief List of states for the Boot Restart Cause state set (ID 192).
+ */
+enum pldm_state_set_boot_restart_cause_values {
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_POWERED_UP = 1,
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_HARD_RESET = 2,
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_WARM_RESET = 3,
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_MANUAL_HARD_RESET = 4,
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_MANUAL_WARM_RESET = 5,
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_SYSTEM_RESTART = 6,
+	PLDM_STATE_SET_BOOT_RESTART_CAUSE_WATCHDOG_TIMEOUT = 7
+};
+
+/* @brief List of states for the Boot Progress state set (ID 196).
+ */
+enum pldm_state_set_boot_progress_state_values {
+	PLDM_STATE_SET_BOOT_PROG_STATE_NOT_ACTIVE = 1,
+	PLDM_STATE_SET_BOOT_PROG_STATE_COMPLETED = 2,
+	PLDM_STATE_SET_BOOT_PROG_STATE_MEM_INITIALIZATION = 3,
+	PLDM_STATE_SET_BOOT_PROG_STATE_SEC_PROC_INITIALIZATION = 5,
+	PLDM_STATE_SET_BOOT_PROG_STATE_PCI_RESORUCE_CONFIG = 9,
+	PLDM_STATE_SET_BOOT_PROG_STATE_STARTING_OP_SYS = 21,
+	PLDM_STATE_SET_BOOT_PROG_STATE_BASE_BOARD_INITIALIZATION = 22,
+	PLDM_STATE_SET_BOOT_PROG_STATE_PRIMARY_PROC_INITIALIZATION = 26,
+};
+
+/* @brief List of states for the System Power State set (ID 260).
+ */
+enum pldm_state_set_system_power_state_values {
+	PLDM_STATE_SET_SYS_POWER_STATE_OFF_SOFT_GRACEFUL = 9
+};
+
+/* OEM ranges */
+#define PLDM_OEM_STATE_SET_ID_START 32768
+#define PLDM_OEM_STATE_SET_ID_END 65535
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* STATE_SET_H */
diff --git a/libpldm/tests/libpldm_firmware_update_test.cpp b/libpldm/tests/libpldm_firmware_update_test.cpp
index 746dfd6..9343b89 100644
--- a/libpldm/tests/libpldm_firmware_update_test.cpp
+++ b/libpldm/tests/libpldm_firmware_update_test.cpp
@@ -1,2922 +1,2922 @@
-#include <bitset>
-#include <cstring>
-
-#include "libpldm/base.h"
-#include "libpldm/firmware_update.h"
-
-#include <gtest/gtest.h>
-
-constexpr auto hdrSize = sizeof(pldm_msg_hdr);
-
-TEST(DecodePackageHeaderInfo, goodPath)
-{
-    // Package header identifier for Version 1.0.x
-    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
-        0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43,
-        0x98, 0x00, 0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02};
-    // Package header version for DSP0267 version 1.0.x
-    constexpr uint8_t pkgHeaderFormatRevision = 0x01;
-    // Random PackageHeaderSize
-    constexpr uint16_t pkgHeaderSize = 303;
-    // PackageReleaseDateTime - "25/12/2021 00:00:00"
-    std::array<uint8_t, PLDM_TIMESTAMP104_SIZE> timestamp104{
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00};
-    constexpr uint16_t componentBitmapBitLength = 8;
-    // PackageVersionString
-    constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
-    constexpr size_t packagerHeaderSize =
-        sizeof(pldm_package_header_information) + packageVersionStr.size();
-
-    constexpr std::array<uint8_t, packagerHeaderSize> packagerHeaderInfo{
-        0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2F,
-        0x05, 0x9a, 0xca, 0x02, 0x01, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x01, 0x0b,
-        0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
-    pldm_package_header_information pkgHeader{};
-    variable_field packageVersion{};
-
-    auto rc = decode_pldm_package_header_info(packagerHeaderInfo.data(),
-                                              packagerHeaderInfo.size(),
-                                              &pkgHeader, &packageVersion);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(true,
-              std::equal(pkgHeader.uuid, pkgHeader.uuid + PLDM_FWUP_UUID_LENGTH,
-                         uuid.begin(), uuid.end()));
-    EXPECT_EQ(pkgHeader.package_header_format_version, pkgHeaderFormatRevision);
-    EXPECT_EQ(pkgHeader.package_header_size, pkgHeaderSize);
-    EXPECT_EQ(true, std::equal(pkgHeader.timestamp104,
-                               pkgHeader.timestamp104 + PLDM_TIMESTAMP104_SIZE,
-                               timestamp104.begin(), timestamp104.end()));
-    EXPECT_EQ(pkgHeader.component_bitmap_bit_length, componentBitmapBitLength);
-    EXPECT_EQ(pkgHeader.package_version_string_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(pkgHeader.package_version_string_length,
-              packageVersionStr.size());
-    std::string packageVersionString(
-        reinterpret_cast<const char*>(packageVersion.ptr),
-        packageVersion.length);
-    EXPECT_EQ(packageVersionString, packageVersionStr);
-}
-
-TEST(DecodePackageHeaderInfo, errorPaths)
-{
-    int rc = 0;
-    constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
-    constexpr size_t packagerHeaderSize =
-        sizeof(pldm_package_header_information) + packageVersionStr.size();
-
-    // Invalid Package Version String Type - 0x06
-    constexpr std::array<uint8_t, packagerHeaderSize>
-        invalidPackagerHeaderInfo1{
-            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
-            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
-            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
-            0x07, 0x00, 0x08, 0x00, 0x06, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
-            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
-
-    pldm_package_header_information packageHeader{};
-    variable_field packageVersion{};
-
-    rc = decode_pldm_package_header_info(nullptr,
-                                         invalidPackagerHeaderInfo1.size(),
-                                         &packageHeader, &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo1.data(),
-                                         invalidPackagerHeaderInfo1.size(),
-                                         nullptr, &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo1.data(),
-                                         invalidPackagerHeaderInfo1.size(),
-                                         &packageHeader, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pldm_package_header_info(
-        invalidPackagerHeaderInfo1.data(),
-        sizeof(pldm_package_header_information) - 1, &packageHeader,
-        &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo1.data(),
-                                         invalidPackagerHeaderInfo1.size(),
-                                         &packageHeader, &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid Package Version String Length - 0x00
-    constexpr std::array<uint8_t, packagerHeaderSize>
-        invalidPackagerHeaderInfo2{
-            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
-            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
-            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
-            0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4f, 0x70, 0x65, 0x6e,
-            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
-    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo2.data(),
-                                         invalidPackagerHeaderInfo2.size(),
-                                         &packageHeader, &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Package version string length less than in the header information
-    constexpr std::array<uint8_t, packagerHeaderSize - 1>
-        invalidPackagerHeaderInfo3{
-            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
-            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
-            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
-            0x07, 0x00, 0x08, 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
-            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e};
-    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo3.data(),
-                                         invalidPackagerHeaderInfo3.size(),
-                                         &packageHeader, &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    // ComponentBitmapBitLength not a multiple of 8
-    constexpr std::array<uint8_t, packagerHeaderSize>
-        invalidPackagerHeaderInfo4{
-            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
-            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
-            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
-            0x07, 0x00, 0x09, 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
-            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
-    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo4.data(),
-                                         invalidPackagerHeaderInfo4.size(),
-                                         &packageHeader, &packageVersion);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(DecodeFirmwareDeviceIdRecord, goodPath)
-{
-    constexpr uint8_t descriptorCount = 1;
-    // Continue component updates after failure
-    constexpr std::bitset<32> deviceUpdateFlag{1};
-    constexpr uint16_t componentBitmapBitLength = 16;
-    // Applicable Components - 1,2,5,8,9
-    std::vector<std::bitset<8>> applicableComponentsBitfield{0x93, 0x01};
-    // ComponentImageSetVersionString
-    constexpr std::string_view imageSetVersionStr{"VersionString1"};
-    // Initial descriptor - UUID
-    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
-        0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
-        0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
-    constexpr uint16_t fwDevicePkgDataLen = 2;
-    // FirmwareDevicePackageData
-    constexpr std::array<uint8_t, fwDevicePkgDataLen> fwDevicePkgData{0xab,
-                                                                      0xcd};
-    // Size of the firmware device ID record
-    constexpr uint16_t recordLen =
-        sizeof(pldm_firmware_device_id_record) +
-        (componentBitmapBitLength / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) +
-        imageSetVersionStr.size() + sizeof(pldm_descriptor_tlv) - 1 +
-        uuid.size() + fwDevicePkgData.size();
-    // Firmware device ID record
-    constexpr std::array<uint8_t, recordLen> record{
-        0x31, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x02,
-        0x00, 0x93, 0x01, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-        0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x02, 0x00, 0x10,
-        0x00, 0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, 0xa0,
-        0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b, 0xab, 0xcd};
-
-    pldm_firmware_device_id_record deviceIdRecHeader{};
-    variable_field applicableComponents{};
-    variable_field outCompImageSetVersionStr{};
-    variable_field recordDescriptors{};
-    variable_field outFwDevicePkgData{};
-
-    auto rc = decode_firmware_device_id_record(
-        record.data(), record.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(deviceIdRecHeader.record_length, recordLen);
-    EXPECT_EQ(deviceIdRecHeader.descriptor_count, descriptorCount);
-    EXPECT_EQ(deviceIdRecHeader.device_update_option_flags.value,
-              deviceUpdateFlag);
-    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_type,
-              PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_length,
-              imageSetVersionStr.size());
-    EXPECT_EQ(deviceIdRecHeader.fw_device_pkg_data_length, fwDevicePkgDataLen);
-
-    EXPECT_EQ(applicableComponents.length, applicableComponentsBitfield.size());
-    EXPECT_EQ(true,
-              std::equal(applicableComponents.ptr,
-                         applicableComponents.ptr + applicableComponents.length,
-                         applicableComponentsBitfield.begin(),
-                         applicableComponentsBitfield.end()));
-
-    EXPECT_EQ(outCompImageSetVersionStr.length, imageSetVersionStr.size());
-    std::string compImageSetVersionStr(
-        reinterpret_cast<const char*>(outCompImageSetVersionStr.ptr),
-        outCompImageSetVersionStr.length);
-    EXPECT_EQ(compImageSetVersionStr, imageSetVersionStr);
-
-    uint16_t descriptorType = 0;
-    uint16_t descriptorLen = 0;
-    variable_field descriptorData{};
-    // DescriptorCount is 1, so decode_descriptor_type_length_value called once
-    rc = decode_descriptor_type_length_value(recordDescriptors.ptr,
-                                             recordDescriptors.length,
-                                             &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(recordDescriptors.length, sizeof(descriptorType) +
-                                            sizeof(descriptorLen) +
-                                            descriptorData.length);
-    EXPECT_EQ(descriptorType, PLDM_FWUP_UUID);
-    EXPECT_EQ(descriptorData.length, PLDM_FWUP_UUID_LENGTH);
-    EXPECT_EQ(true, std::equal(descriptorData.ptr,
-                               descriptorData.ptr + descriptorData.length,
-                               uuid.begin(), uuid.end()));
-
-    EXPECT_EQ(outFwDevicePkgData.length, fwDevicePkgData.size());
-    EXPECT_EQ(true,
-              std::equal(outFwDevicePkgData.ptr,
-                         outFwDevicePkgData.ptr + outFwDevicePkgData.length,
-                         fwDevicePkgData.begin(), fwDevicePkgData.end()));
-}
-
-TEST(DecodeFirmwareDeviceIdRecord, goodPathNofwDevicePkgData)
-{
-    constexpr uint8_t descriptorCount = 1;
-    // Continue component updates after failure
-    constexpr std::bitset<32> deviceUpdateFlag{1};
-    constexpr uint16_t componentBitmapBitLength = 8;
-    // Applicable Components - 1,2
-    std::vector<std::bitset<8>> applicableComponentsBitfield{0x03};
-    // ComponentImageSetVersionString
-    constexpr std::string_view imageSetVersionStr{"VersionString1"};
-    // Initial descriptor - UUID
-    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
-        0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
-        0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
-    constexpr uint16_t fwDevicePkgDataLen = 0;
-
-    // Size of the firmware device ID record
-    constexpr uint16_t recordLen =
-        sizeof(pldm_firmware_device_id_record) +
-        (componentBitmapBitLength / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) +
-        imageSetVersionStr.size() +
-        sizeof(pldm_descriptor_tlv().descriptor_type) +
-        sizeof(pldm_descriptor_tlv().descriptor_length) + uuid.size() +
-        fwDevicePkgDataLen;
-    // Firmware device ID record
-    constexpr std::array<uint8_t, recordLen> record{
-        0x2e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x00, 0x03,
-        0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e,
-        0x67, 0x31, 0x02, 0x00, 0x10, 0x00, 0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d,
-        0x47, 0x18, 0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
-
-    pldm_firmware_device_id_record deviceIdRecHeader{};
-    variable_field applicableComponents{};
-    variable_field outCompImageSetVersionStr{};
-    variable_field recordDescriptors{};
-    variable_field outFwDevicePkgData{};
-
-    auto rc = decode_firmware_device_id_record(
-        record.data(), record.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(deviceIdRecHeader.record_length, recordLen);
-    EXPECT_EQ(deviceIdRecHeader.descriptor_count, descriptorCount);
-    EXPECT_EQ(deviceIdRecHeader.device_update_option_flags.value,
-              deviceUpdateFlag);
-    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_type,
-              PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_length,
-              imageSetVersionStr.size());
-    EXPECT_EQ(deviceIdRecHeader.fw_device_pkg_data_length, 0);
-
-    EXPECT_EQ(applicableComponents.length, applicableComponentsBitfield.size());
-    EXPECT_EQ(true,
-              std::equal(applicableComponents.ptr,
-                         applicableComponents.ptr + applicableComponents.length,
-                         applicableComponentsBitfield.begin(),
-                         applicableComponentsBitfield.end()));
-
-    EXPECT_EQ(outCompImageSetVersionStr.length, imageSetVersionStr.size());
-    std::string compImageSetVersionStr(
-        reinterpret_cast<const char*>(outCompImageSetVersionStr.ptr),
-        outCompImageSetVersionStr.length);
-    EXPECT_EQ(compImageSetVersionStr, imageSetVersionStr);
-
-    uint16_t descriptorType = 0;
-    uint16_t descriptorLen = 0;
-    variable_field descriptorData{};
-    // DescriptorCount is 1, so decode_descriptor_type_length_value called once
-    rc = decode_descriptor_type_length_value(recordDescriptors.ptr,
-                                             recordDescriptors.length,
-                                             &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(recordDescriptors.length, sizeof(descriptorType) +
-                                            sizeof(descriptorLen) +
-                                            descriptorData.length);
-    EXPECT_EQ(descriptorType, PLDM_FWUP_UUID);
-    EXPECT_EQ(descriptorData.length, PLDM_FWUP_UUID_LENGTH);
-    EXPECT_EQ(true, std::equal(descriptorData.ptr,
-                               descriptorData.ptr + descriptorData.length,
-                               uuid.begin(), uuid.end()));
-
-    EXPECT_EQ(outFwDevicePkgData.ptr, nullptr);
-    EXPECT_EQ(outFwDevicePkgData.length, 0);
-}
-
-TEST(DecodeFirmwareDeviceIdRecord, ErrorPaths)
-{
-    constexpr uint16_t componentBitmapBitLength = 8;
-    // Invalid ComponentImageSetVersionStringType
-    constexpr std::array<uint8_t, 11> invalidRecord1{
-        0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x00};
-
-    int rc = 0;
-    pldm_firmware_device_id_record deviceIdRecHeader{};
-    variable_field applicableComponents{};
-    variable_field outCompImageSetVersionStr{};
-    variable_field recordDescriptors{};
-    variable_field outFwDevicePkgData{};
-
-    rc = decode_firmware_device_id_record(
-        nullptr, invalidRecord1.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
-        nullptr, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, nullptr, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, nullptr, &recordDescriptors,
-        &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        nullptr, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size() - 1,
-        componentBitmapBitLength, &deviceIdRecHeader, &applicableComponents,
-        &outCompImageSetVersionStr, &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(),
-        componentBitmapBitLength + 1, &deviceIdRecHeader, &applicableComponents,
-        &outCompImageSetVersionStr, &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_firmware_device_id_record(
-        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid ComponentImageSetVersionStringLength
-    constexpr std::array<uint8_t, 11> invalidRecord2{
-        0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
-    rc = decode_firmware_device_id_record(
-        invalidRecord2.data(), invalidRecord2.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // invalidRecord3 size is less than RecordLength
-    constexpr std::array<uint8_t, 11> invalidRecord3{
-        0x2e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x00};
-    rc = decode_firmware_device_id_record(
-        invalidRecord3.data(), invalidRecord3.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    // RecordLength is less than the calculated RecordLength
-    constexpr std::array<uint8_t, 11> invalidRecord4{
-        0x15, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x02, 0x00};
-    rc = decode_firmware_device_id_record(
-        invalidRecord4.data(), invalidRecord4.size(), componentBitmapBitLength,
-        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
-        &recordDescriptors, &outFwDevicePkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(DecodeDescriptors, goodPath3Descriptors)
-{
-    // In the descriptor data there are 3 descriptor entries
-    // 1) IANA enterprise ID
-    constexpr std::array<uint8_t, PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH> iana{
-        0x0a, 0x0b, 0x0c, 0xd};
-    // 2) UUID
-    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
-        0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
-        0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
-    // 3) Vendor Defined
-    constexpr std::string_view vendorTitle{"OpenBMC"};
-    constexpr size_t vendorDescriptorLen = 2;
-    constexpr std::array<uint8_t, vendorDescriptorLen> vendorDescriptorData{
-        0x01, 0x02};
-
-    constexpr size_t vendorDefinedDescriptorLen =
-        sizeof(pldm_vendor_defined_descriptor_title_data()
-                   .vendor_defined_descriptor_title_str_type) +
-        sizeof(pldm_vendor_defined_descriptor_title_data()
-                   .vendor_defined_descriptor_title_str_len) +
-        vendorTitle.size() + vendorDescriptorData.size();
-
-    constexpr size_t descriptorsLength =
-        3 * (sizeof(pldm_descriptor_tlv().descriptor_type) +
-             sizeof(pldm_descriptor_tlv().descriptor_length)) +
-        iana.size() + uuid.size() + vendorDefinedDescriptorLen;
-
-    constexpr std::array<uint8_t, descriptorsLength> descriptors{
-        0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x02, 0x00, 0x10,
-        0x00, 0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, 0xa0, 0x30,
-        0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b, 0xFF, 0xFF, 0x0B, 0x00, 0x01,
-        0x07, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x01, 0x02};
-
-    size_t descriptorCount = 1;
-    size_t descriptorsRemainingLength = descriptorsLength;
-    int rc = 0;
-
-    while (descriptorsRemainingLength && (descriptorCount <= 3))
-    {
-        uint16_t descriptorType = 0;
-        uint16_t descriptorLen = 0;
-        variable_field descriptorData{};
-
-        rc = decode_descriptor_type_length_value(
-            descriptors.data() + descriptorsLength - descriptorsRemainingLength,
-            descriptorsRemainingLength, &descriptorType, &descriptorData);
-        EXPECT_EQ(rc, PLDM_SUCCESS);
-
-        if (descriptorCount == 1)
-        {
-            EXPECT_EQ(descriptorType, PLDM_FWUP_IANA_ENTERPRISE_ID);
-            EXPECT_EQ(descriptorData.length,
-                      PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH);
-            EXPECT_EQ(true,
-                      std::equal(descriptorData.ptr,
-                                 descriptorData.ptr + descriptorData.length,
-                                 iana.begin(), iana.end()));
-        }
-        else if (descriptorCount == 2)
-        {
-            EXPECT_EQ(descriptorType, PLDM_FWUP_UUID);
-            EXPECT_EQ(descriptorData.length, PLDM_FWUP_UUID_LENGTH);
-            EXPECT_EQ(true,
-                      std::equal(descriptorData.ptr,
-                                 descriptorData.ptr + descriptorData.length,
-                                 uuid.begin(), uuid.end()));
-        }
-        else if (descriptorCount == 3)
-        {
-            EXPECT_EQ(descriptorType, PLDM_FWUP_VENDOR_DEFINED);
-            EXPECT_EQ(descriptorData.length, vendorDefinedDescriptorLen);
-
-            uint8_t descriptorTitleStrType = 0;
-            variable_field descriptorTitleStr{};
-            variable_field vendorDefinedDescriptorData{};
-
-            rc = decode_vendor_defined_descriptor_value(
-                descriptorData.ptr, descriptorData.length,
-                &descriptorTitleStrType, &descriptorTitleStr,
-                &vendorDefinedDescriptorData);
-            EXPECT_EQ(rc, PLDM_SUCCESS);
-
-            EXPECT_EQ(descriptorTitleStrType, PLDM_STR_TYPE_ASCII);
-            EXPECT_EQ(descriptorTitleStr.length, vendorTitle.size());
-            std::string vendorTitleStr(
-                reinterpret_cast<const char*>(descriptorTitleStr.ptr),
-                descriptorTitleStr.length);
-            EXPECT_EQ(vendorTitleStr, vendorTitle);
-
-            EXPECT_EQ(vendorDefinedDescriptorData.length,
-                      vendorDescriptorData.size());
-            EXPECT_EQ(true, std::equal(vendorDefinedDescriptorData.ptr,
-                                       vendorDefinedDescriptorData.ptr +
-                                           vendorDefinedDescriptorData.length,
-                                       vendorDescriptorData.begin(),
-                                       vendorDescriptorData.end()));
-        }
-
-        descriptorsRemainingLength -= sizeof(descriptorType) +
-                                      sizeof(descriptorLen) +
-                                      descriptorData.length;
-        descriptorCount++;
-    }
-}
-
-TEST(DecodeDescriptors, errorPathDecodeDescriptorTLV)
-{
-    int rc = 0;
-    // IANA Enterprise ID descriptor length incorrect
-    constexpr std::array<uint8_t, 7> invalidIANADescriptor1{
-        0x01, 0x00, 0x03, 0x00, 0x0a, 0x0b, 0x0c};
-    uint16_t descriptorType = 0;
-    variable_field descriptorData{};
-
-    rc = decode_descriptor_type_length_value(nullptr,
-                                             invalidIANADescriptor1.size(),
-                                             &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
-                                             invalidIANADescriptor1.size(),
-                                             nullptr, &descriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
-                                             invalidIANADescriptor1.size(),
-                                             &descriptorType, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_descriptor_type_length_value(
-        invalidIANADescriptor1.data(), PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN - 1,
-        &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
-                                             invalidIANADescriptor1.size(),
-                                             &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    // IANA Enterprise ID descriptor data less than length
-    std::array<uint8_t, 7> invalidIANADescriptor2{0x01, 0x00, 0x04, 0x00,
-                                                  0x0a, 0x0b, 0x0c};
-    rc = decode_descriptor_type_length_value(invalidIANADescriptor2.data(),
-                                             invalidIANADescriptor2.size(),
-                                             &descriptorType, &descriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(DecodeDescriptors, errorPathVendorDefinedDescriptor)
-{
-    int rc = 0;
-    // VendorDefinedDescriptorTitleStringType is invalid
-    constexpr std::array<uint8_t, 9> invalidVendorDescriptor1{
-        0x06, 0x07, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43};
-    uint8_t descriptorStringType = 0;
-    variable_field descriptorTitleStr{};
-    variable_field vendorDefinedDescriptorData{};
-
-    rc = decode_vendor_defined_descriptor_value(
-        nullptr, invalidVendorDescriptor1.size(), &descriptorStringType,
-        &descriptorTitleStr, &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
-        &descriptorStringType, &descriptorTitleStr,
-        &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
-        nullptr, &descriptorTitleStr, &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
-        &descriptorStringType, nullptr, &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
-        &descriptorStringType, &descriptorTitleStr, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor1.data(),
-        sizeof(pldm_vendor_defined_descriptor_title_data) - 1,
-        &descriptorStringType, &descriptorTitleStr,
-        &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
-        &descriptorStringType, &descriptorTitleStr,
-        &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // VendorDefinedDescriptorTitleStringLength is 0
-    std::array<uint8_t, 9> invalidVendorDescriptor2{
-        0x01, 0x00, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43};
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor2.data(), invalidVendorDescriptor2.size(),
-        &descriptorStringType, &descriptorTitleStr,
-        &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // VendorDefinedDescriptorData not present in the data
-    std::array<uint8_t, 9> invalidVendorDescriptor3{
-        0x01, 0x07, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43};
-    rc = decode_vendor_defined_descriptor_value(
-        invalidVendorDescriptor3.data(), invalidVendorDescriptor3.size(),
-        &descriptorStringType, &descriptorTitleStr,
-        &vendorDefinedDescriptorData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(DecodeComponentImageInfo, goodPath)
-{
-    // Firmware
-    constexpr uint16_t compClassification = 16;
-    constexpr uint16_t compIdentifier = 300;
-    constexpr uint32_t compComparisonStamp = 0xFFFFFFFF;
-    // Force update
-    constexpr std::bitset<16> compOptions{1};
-    // System reboot[Bit position 3] & Medium-specific reset[Bit position 2]
-    constexpr std::bitset<16> reqCompActivationMethod{0x0c};
-    // Random ComponentLocationOffset
-    constexpr uint32_t compLocOffset = 357;
-    // Random ComponentSize
-    constexpr uint32_t compSize = 27;
-    // ComponentVersionString
-    constexpr std::string_view compVersionStr{"VersionString1"};
-    constexpr size_t compImageInfoSize =
-        sizeof(pldm_component_image_information) + compVersionStr.size();
-
-    constexpr std::array<uint8_t, compImageInfoSize> compImageInfo{
-        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
-        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
-        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
-    pldm_component_image_information outCompImageInfo{};
-    variable_field outCompVersionStr{};
-
-    auto rc =
-        decode_pldm_comp_image_info(compImageInfo.data(), compImageInfo.size(),
-                                    &outCompImageInfo, &outCompVersionStr);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outCompImageInfo.comp_classification, compClassification);
-    EXPECT_EQ(outCompImageInfo.comp_identifier, compIdentifier);
-    EXPECT_EQ(outCompImageInfo.comp_comparison_stamp, compComparisonStamp);
-    EXPECT_EQ(outCompImageInfo.comp_options.value, compOptions);
-    EXPECT_EQ(outCompImageInfo.requested_comp_activation_method.value,
-              reqCompActivationMethod);
-    EXPECT_EQ(outCompImageInfo.comp_location_offset, compLocOffset);
-    EXPECT_EQ(outCompImageInfo.comp_size, compSize);
-    EXPECT_EQ(outCompImageInfo.comp_version_string_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(outCompImageInfo.comp_version_string_length,
-              compVersionStr.size());
-
-    EXPECT_EQ(outCompVersionStr.length,
-              outCompImageInfo.comp_version_string_length);
-    std::string componentVersionString(
-        reinterpret_cast<const char*>(outCompVersionStr.ptr),
-        outCompVersionStr.length);
-    EXPECT_EQ(componentVersionString, compVersionStr);
-}
-
-TEST(DecodeComponentImageInfo, errorPaths)
-{
-    int rc = 0;
-    // ComponentVersionString
-    constexpr std::string_view compVersionStr{"VersionString1"};
-    constexpr size_t compImageInfoSize =
-        sizeof(pldm_component_image_information) + compVersionStr.size();
-    // Invalid ComponentVersionStringType - 0x06
-    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo1{
-        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
-        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x56, 0x65,
-        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
-    pldm_component_image_information outCompImageInfo{};
-    variable_field outCompVersionStr{};
-
-    rc = decode_pldm_comp_image_info(nullptr, invalidCompImageInfo1.size(),
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
-                                     invalidCompImageInfo1.size(), nullptr,
-                                     &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
-                                     invalidCompImageInfo1.size(),
-                                     &outCompImageInfo, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
-                                     sizeof(pldm_component_image_information) -
-                                         1,
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
-                                     invalidCompImageInfo1.size(),
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid ComponentVersionStringLength - 0x00
-    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo2{
-        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
-        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0x65,
-        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo2.data(),
-                                     invalidCompImageInfo2.size(),
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Use Component Comparison Stamp is not set, but ComponentComparisonStamp
-    // is not 0xFFFFFFFF
-    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo3{
-        0x10, 0x00, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00,
-        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
-        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
-
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo3.data(),
-                                     invalidCompImageInfo3.size() - 1,
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo3.data(),
-                                     invalidCompImageInfo3.size(),
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid ComponentLocationOffset - 0
-    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo4{
-        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
-        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo4.data(),
-                                     invalidCompImageInfo4.size(),
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid ComponentSize - 0
-    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo5{
-        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
-        0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
-        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
-    rc = decode_pldm_comp_image_info(invalidCompImageInfo5.data(),
-                                     invalidCompImageInfo5.size(),
-                                     &outCompImageInfo, &outCompVersionStr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(QueryDeviceIdentifiers, goodPathEncodeRequest)
-{
-    std::array<uint8_t, sizeof(pldm_msg_hdr)> requestMsg{};
-    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
-
-    uint8_t instanceId = 0x01;
-
-    auto rc = encode_query_device_identifiers_req(
-        instanceId, PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES, requestPtr);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
-    EXPECT_EQ(requestPtr->hdr.instance_id, instanceId);
-    EXPECT_EQ(requestPtr->hdr.type, PLDM_FWUP);
-    EXPECT_EQ(requestPtr->hdr.command, PLDM_QUERY_DEVICE_IDENTIFIERS);
-}
-
-TEST(QueryDeviceIdentifiers, goodPathDecodeResponse)
-{
-    // descriptorDataLen is not fixed here taking it as 6
-    constexpr uint8_t descriptorDataLen = 6;
-    std::array<uint8_t, hdrSize +
-                            sizeof(struct pldm_query_device_identifiers_resp) +
-                            descriptorDataLen>
-        responseMsg{};
-    auto inResp = reinterpret_cast<struct pldm_query_device_identifiers_resp*>(
-        responseMsg.data() + hdrSize);
-
-    inResp->completion_code = PLDM_SUCCESS;
-    inResp->device_identifiers_len = htole32(descriptorDataLen);
-    inResp->descriptor_count = 1;
-
-    // filling descriptor data
-    std::fill_n(responseMsg.data() + hdrSize +
-                    sizeof(struct pldm_query_device_identifiers_resp),
-                descriptorDataLen, 0xFF);
-
-    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
-    uint8_t completionCode = PLDM_SUCCESS;
-    uint32_t deviceIdentifiersLen = 0;
-    uint8_t descriptorCount = 0;
-    uint8_t* outDescriptorData = nullptr;
-
-    auto rc = decode_query_device_identifiers_resp(
-        response, responseMsg.size() - hdrSize, &completionCode,
-        &deviceIdentifiersLen, &descriptorCount, &outDescriptorData);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(deviceIdentifiersLen, inResp->device_identifiers_len);
-    EXPECT_EQ(descriptorCount, inResp->descriptor_count);
-    EXPECT_EQ(true,
-              std::equal(outDescriptorData,
-                         outDescriptorData + deviceIdentifiersLen,
-                         responseMsg.begin() + hdrSize +
-                             sizeof(struct pldm_query_device_identifiers_resp),
-                         responseMsg.end()));
-}
-
-TEST(GetFirmwareParameters, goodPathEncodeRequest)
-{
-    std::array<uint8_t, sizeof(pldm_msg_hdr)> requestMsg{};
-    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
-    uint8_t instanceId = 0x01;
-
-    auto rc = encode_get_firmware_parameters_req(
-        instanceId, PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES, requestPtr);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
-    EXPECT_EQ(requestPtr->hdr.instance_id, instanceId);
-    EXPECT_EQ(requestPtr->hdr.type, PLDM_FWUP);
-    EXPECT_EQ(requestPtr->hdr.command, PLDM_GET_FIRMWARE_PARAMETERS);
-}
-
-TEST(GetFirmwareParameters, decodeResponse)
-{
-    // CapabilitiesDuringUpdate of the firmware device
-    // Firmware device downgrade restrictions [Bit position 8] &
-    // Firmware Device Partial Updates [Bit position 3]
-    constexpr std::bitset<32> fdCapabilities{0x00000104};
-    constexpr uint16_t compCount = 1;
-    constexpr std::string_view activeCompImageSetVersion{"VersionString1"};
-    constexpr std::string_view pendingCompImageSetVersion{"VersionString2"};
-
-    // constexpr uint16_t compClassification = 16;
-    // constexpr uint16_t compIdentifier = 300;
-    // constexpr uint8_t compClassificationIndex = 20;
-    // constexpr uint32_t activeCompComparisonStamp = 0xABCDEFAB;
-    // constexpr std::array<uint8_t, 8> activeComponentReleaseData = {
-    //     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
-    // constexpr uint32_t pendingCompComparisonStamp = 0x12345678;
-    // constexpr std::array<uint8_t, 8> pendingComponentReleaseData = {
-    //     0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01};
-    constexpr std::string_view activeCompVersion{"VersionString3"};
-    constexpr std::string_view pendingCompVersion{"VersionString4"};
-    // ComponentActivationMethods
-    // DC Power cycle [Bit position 4] & Self-Contained[Bit position 2]
-    constexpr std::bitset<16> compActivationMethod{0x12};
-    // CapabilitiesDuringUpdate of the firmware component
-    // Component downgrade capability [Bit position 2]
-    constexpr std::bitset<32> compCapabilities{0x02};
-
-    constexpr size_t compParamTableSize =
-        sizeof(pldm_component_parameter_entry) + activeCompVersion.size() +
-        pendingCompVersion.size();
-
-    constexpr std::array<uint8_t, compParamTableSize> compParamTable{
-        0x10, 0x00, 0x2c, 0x01, 0x14, 0xAB, 0xEF, 0xCD, 0xAB, 0x01, 0x0e, 0x01,
-        0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x78, 0x56, 0x34, 0x12, 0x01,
-        0x0e, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x12, 0x00, 0x02,
-        0x00, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74,
-        0x72, 0x69, 0x6e, 0x67, 0x33, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-        0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x34};
-
-    constexpr size_t getFwParamsPayloadLen =
-        sizeof(pldm_get_firmware_parameters_resp) +
-        activeCompImageSetVersion.size() + pendingCompImageSetVersion.size() +
-        compParamTableSize;
-
-    constexpr std::array<uint8_t, hdrSize + getFwParamsPayloadLen>
-        getFwParamsResponse{
-            0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01,
-            0x0e, 0x01, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53,
-            0x74, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x56, 0x65, 0x72, 0x73, 0x69,
-            0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x10, 0x00,
-            0x2c, 0x01, 0x14, 0xAB, 0xEF, 0xCD, 0xAB, 0x01, 0x0e, 0x01, 0x02,
-            0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x78, 0x56, 0x34, 0x12, 0x01,
-            0x0e, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x12, 0x00,
-            0x02, 0x00, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-            0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x33, 0x56, 0x65, 0x72, 0x73,
-            0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x34};
-
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
-    pldm_get_firmware_parameters_resp outResp{};
-    variable_field outActiveCompImageSetVersion{};
-    variable_field outPendingCompImageSetVersion{};
-    variable_field outCompParameterTable{};
-
-    auto rc = decode_get_firmware_parameters_resp(
-        responseMsg, getFwParamsPayloadLen, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.completion_code, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.capabilities_during_update.value, fdCapabilities);
-    EXPECT_EQ(outResp.comp_count, compCount);
-    EXPECT_EQ(outResp.active_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(outResp.active_comp_image_set_ver_str_len,
-              activeCompImageSetVersion.size());
-    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_len,
-              pendingCompImageSetVersion.size());
-    std::string activeCompImageSetVersionStr(
-        reinterpret_cast<const char*>(outActiveCompImageSetVersion.ptr),
-        outActiveCompImageSetVersion.length);
-    EXPECT_EQ(activeCompImageSetVersionStr, activeCompImageSetVersion);
-    std::string pendingCompImageSetVersionStr(
-        reinterpret_cast<const char*>(outPendingCompImageSetVersion.ptr),
-        outPendingCompImageSetVersion.length);
-    EXPECT_EQ(pendingCompImageSetVersionStr, pendingCompImageSetVersion);
-    EXPECT_EQ(outCompParameterTable.length, compParamTableSize);
-    EXPECT_EQ(true, std::equal(outCompParameterTable.ptr,
-                               outCompParameterTable.ptr +
-                                   outCompParameterTable.length,
-                               compParamTable.begin(), compParamTable.end()));
-}
-
-TEST(GetFirmwareParameters, decodeResponseZeroCompCount)
-{
-    // CapabilitiesDuringUpdate of the firmware device
-    // FD Host Functionality during Firmware Update [Bit position 2] &
-    // Component Update Failure Retry Capability [Bit position 1]
-    constexpr std::bitset<32> fdCapabilities{0x06};
-    constexpr uint16_t compCount = 0;
-    constexpr std::string_view activeCompImageSetVersion{"VersionString1"};
-    constexpr std::string_view pendingCompImageSetVersion{"VersionString2"};
-
-    constexpr size_t getFwParamsPayloadLen =
-        sizeof(pldm_get_firmware_parameters_resp) +
-        activeCompImageSetVersion.size() + pendingCompImageSetVersion.size();
-
-    constexpr std::array<uint8_t, hdrSize + getFwParamsPayloadLen>
-        getFwParamsResponse{
-            0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-            0x0e, 0x01, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53,
-            0x74, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x56, 0x65, 0x72, 0x73, 0x69,
-            0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32};
-
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
-    pldm_get_firmware_parameters_resp outResp{};
-    variable_field outActiveCompImageSetVersion{};
-    variable_field outPendingCompImageSetVersion{};
-    variable_field outCompParameterTable{};
-
-    auto rc = decode_get_firmware_parameters_resp(
-        responseMsg, getFwParamsPayloadLen, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.completion_code, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.capabilities_during_update.value, fdCapabilities);
-    EXPECT_EQ(outResp.comp_count, compCount);
-    EXPECT_EQ(outResp.active_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(outResp.active_comp_image_set_ver_str_len,
-              activeCompImageSetVersion.size());
-    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_len,
-              pendingCompImageSetVersion.size());
-    std::string activeCompImageSetVersionStr(
-        reinterpret_cast<const char*>(outActiveCompImageSetVersion.ptr),
-        outActiveCompImageSetVersion.length);
-    EXPECT_EQ(activeCompImageSetVersionStr, activeCompImageSetVersion);
-    std::string pendingCompImageSetVersionStr(
-        reinterpret_cast<const char*>(outPendingCompImageSetVersion.ptr),
-        outPendingCompImageSetVersion.length);
-    EXPECT_EQ(pendingCompImageSetVersionStr, pendingCompImageSetVersion);
-    EXPECT_EQ(outCompParameterTable.ptr, nullptr);
-    EXPECT_EQ(outCompParameterTable.length, 0);
-}
-
-TEST(GetFirmwareParameters,
-     decodeResponseNoPendingCompImageVersionStrZeroCompCount)
-{
-    // CapabilitiesDuringUpdate of the firmware device
-    // FD Host Functionality during Firmware Update [Bit position 2] &
-    // Component Update Failure Retry Capability [Bit position 1]
-    constexpr std::bitset<32> fdCapabilities{0x06};
-    constexpr uint16_t compCount = 0;
-    constexpr std::string_view activeCompImageSetVersion{"VersionString"};
-
-    constexpr size_t getFwParamsPayloadLen =
-        sizeof(pldm_get_firmware_parameters_resp) +
-        activeCompImageSetVersion.size();
-
-    constexpr std::array<uint8_t, hdrSize + getFwParamsPayloadLen>
-        getFwParamsResponse{0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
-                            0x00, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00,
-                            0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-                            0x53, 0x74, 0x72, 0x69, 0x6e, 0x67};
-
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
-    pldm_get_firmware_parameters_resp outResp{};
-    variable_field outActiveCompImageSetVersion{};
-    variable_field outPendingCompImageSetVersion{};
-    variable_field outCompParameterTable{};
-
-    auto rc = decode_get_firmware_parameters_resp(
-        responseMsg, getFwParamsPayloadLen, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.completion_code, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.capabilities_during_update.value, fdCapabilities);
-    EXPECT_EQ(outResp.comp_count, compCount);
-    EXPECT_EQ(outResp.active_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
-    EXPECT_EQ(outResp.active_comp_image_set_ver_str_len,
-              activeCompImageSetVersion.size());
-    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_type,
-              PLDM_STR_TYPE_UNKNOWN);
-    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_len, 0);
-    std::string activeCompImageSetVersionStr(
-        reinterpret_cast<const char*>(outActiveCompImageSetVersion.ptr),
-        outActiveCompImageSetVersion.length);
-    EXPECT_EQ(activeCompImageSetVersionStr, activeCompImageSetVersion);
-    EXPECT_EQ(outPendingCompImageSetVersion.ptr, nullptr);
-    EXPECT_EQ(outPendingCompImageSetVersion.length, 0);
-    EXPECT_EQ(outCompParameterTable.ptr, nullptr);
-    EXPECT_EQ(outCompParameterTable.length, 0);
-}
-
-TEST(GetFirmwareParameters, decodeResponseErrorCompletionCode)
-{
-    constexpr std::array<uint8_t, hdrSize + sizeof(uint8_t)>
-        getFwParamsResponse{0x00, 0x00, 0x00, 0x01};
-
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
-    pldm_get_firmware_parameters_resp outResp{};
-    variable_field outActiveCompImageSetVersion{};
-    variable_field outPendingCompImageSetVersion{};
-    variable_field outCompParameterTable{};
-
-    auto rc = decode_get_firmware_parameters_resp(
-        responseMsg, getFwParamsResponse.size(), &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outResp.completion_code, PLDM_ERROR);
-}
-
-TEST(GetFirmwareParameters, errorPathdecodeResponse)
-{
-    int rc = 0;
-    // Invalid ActiveComponentImageSetVersionStringType
-    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse1{
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x00};
-
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse1.data());
-    pldm_get_firmware_parameters_resp outResp{};
-    variable_field outActiveCompImageSetVersion{};
-    variable_field outPendingCompImageSetVersion{};
-    variable_field outCompParameterTable{};
-
-    rc = decode_get_firmware_parameters_resp(
-        nullptr, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, nullptr,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
-        nullptr, &outPendingCompImageSetVersion, &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, nullptr, &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, 0, &outResp, &outActiveCompImageSetVersion,
-        &outPendingCompImageSetVersion, &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse1.size() - 1 - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid ActiveComponentImageSetVersionStringLength
-    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse2{
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
-    responseMsg =
-        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse2.data());
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse2.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid PendingComponentImageSetVersionStringType &
-    // PendingComponentImageSetVersionStringLength
-    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse3{
-        0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x00};
-    responseMsg =
-        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse3.data());
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse3.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Invalid PendingComponentImageSetVersionStringType &
-    // PendingComponentImageSetVersionStringLength
-    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse4{
-        0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x01, 0x0e, 0x06, 0x0e};
-    responseMsg =
-        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse4.data());
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse4.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // Total payload length less than expected
-    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse5{
-        0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x0e};
-    responseMsg =
-        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse5.data());
-    rc = decode_get_firmware_parameters_resp(
-        responseMsg, invalidGetFwParamsResponse5.size() - hdrSize, &outResp,
-        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
-        &outCompParameterTable);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(GetFirmwareParameters, goodPathDecodeComponentParameterEntry)
-{
-    // Random value for component classification
-    constexpr uint16_t compClassification = 0x0A0B;
-    // Random value for component classification
-    constexpr uint16_t compIdentifier = 0x0C0D;
-    // Random value for component classification
-    constexpr uint32_t timestamp = 0X12345678;
-    // Random value for component activation methods
-    constexpr uint16_t compActivationMethods = 0xBBDD;
-    // Random value for capabilities during update
-    constexpr uint32_t capabilitiesDuringUpdate = 0xBADBEEFE;
-
-    // ActiveCompImageSetVerStrLen is not fixed here taking it as 8
-    constexpr uint8_t activeCompVerStrLen = 8;
-    // PendingCompImageSetVerStrLen is not fixed here taking it as 8
-    constexpr uint8_t pendingCompVerStrLen = 8;
-    constexpr size_t entryLength =
-        sizeof(struct pldm_component_parameter_entry) + activeCompVerStrLen +
-        pendingCompVerStrLen;
-    std::array<uint8_t, entryLength> entry{};
-
-    auto inEntry =
-        reinterpret_cast<struct pldm_component_parameter_entry*>(entry.data());
-
-    inEntry->comp_classification = htole16(compClassification);
-    inEntry->comp_identifier = htole16(compIdentifier);
-    inEntry->comp_classification_index = 0x0F;
-    inEntry->active_comp_comparison_stamp = htole32(timestamp);
-    inEntry->active_comp_ver_str_type = 1;
-    inEntry->active_comp_ver_str_len = activeCompVerStrLen;
-    std::fill_n(inEntry->active_comp_release_date,
-                sizeof(inEntry->active_comp_release_date), 0xFF);
-    inEntry->pending_comp_comparison_stamp = htole32(timestamp);
-    inEntry->pending_comp_ver_str_type = 1;
-    inEntry->pending_comp_ver_str_len = pendingCompVerStrLen;
-    std::fill_n(inEntry->pending_comp_release_date,
-                sizeof(inEntry->pending_comp_release_date), 0xFF);
-    inEntry->comp_activation_methods.value = htole16(compActivationMethods);
-    inEntry->capabilities_during_update.value =
-        htole32(capabilitiesDuringUpdate);
-    constexpr auto activeCompVerStrPos =
-        sizeof(struct pldm_component_parameter_entry);
-    std::fill_n(entry.data() + activeCompVerStrPos, activeCompVerStrLen, 0xAA);
-    constexpr auto pendingCompVerStrPos =
-        activeCompVerStrPos + activeCompVerStrLen;
-    std::fill_n(entry.data() + pendingCompVerStrPos, pendingCompVerStrLen,
-                0xBB);
-
-    struct pldm_component_parameter_entry outEntry;
-    struct variable_field outActiveCompVerStr;
-    struct variable_field outPendingCompVerStr;
-
-    auto rc = decode_get_firmware_parameters_resp_comp_entry(
-        entry.data(), entryLength, &outEntry, &outActiveCompVerStr,
-        &outPendingCompVerStr);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    EXPECT_EQ(outEntry.comp_classification, compClassification);
-    EXPECT_EQ(outEntry.comp_identifier, compIdentifier);
-    EXPECT_EQ(inEntry->comp_classification_index,
-              outEntry.comp_classification_index);
-    EXPECT_EQ(outEntry.active_comp_comparison_stamp, timestamp);
-    EXPECT_EQ(inEntry->active_comp_ver_str_type,
-              outEntry.active_comp_ver_str_type);
-    EXPECT_EQ(inEntry->active_comp_ver_str_len,
-              outEntry.active_comp_ver_str_len);
-    EXPECT_EQ(0, memcmp(inEntry->active_comp_release_date,
-                        outEntry.active_comp_release_date,
-                        sizeof(inEntry->active_comp_release_date)));
-    EXPECT_EQ(outEntry.pending_comp_comparison_stamp, timestamp);
-    EXPECT_EQ(inEntry->pending_comp_ver_str_type,
-              outEntry.pending_comp_ver_str_type);
-    EXPECT_EQ(inEntry->pending_comp_ver_str_len,
-              outEntry.pending_comp_ver_str_len);
-    EXPECT_EQ(0, memcmp(inEntry->pending_comp_release_date,
-                        outEntry.pending_comp_release_date,
-                        sizeof(inEntry->pending_comp_release_date)));
-    EXPECT_EQ(outEntry.comp_activation_methods.value, compActivationMethods);
-    EXPECT_EQ(outEntry.capabilities_during_update.value,
-              capabilitiesDuringUpdate);
-
-    EXPECT_EQ(0, memcmp(outActiveCompVerStr.ptr,
-                        entry.data() + activeCompVerStrPos,
-                        outActiveCompVerStr.length));
-    EXPECT_EQ(0, memcmp(outPendingCompVerStr.ptr,
-                        entry.data() + pendingCompVerStrPos,
-                        outPendingCompVerStr.length));
-}
-
-TEST(RequestUpdate, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 1;
-    constexpr uint32_t maxTransferSize = 512;
-    constexpr uint16_t numOfComp = 3;
-    constexpr uint8_t maxOutstandingTransferReq = 2;
-    constexpr uint16_t pkgDataLen = 0x1234;
-    constexpr std::string_view compImgSetVerStr = "0penBmcv1.0";
-    constexpr uint8_t compImgSetVerStrLen =
-        static_cast<uint8_t>(compImgSetVerStr.size());
-    variable_field compImgSetVerStrInfo{};
-    compImgSetVerStrInfo.ptr =
-        reinterpret_cast<const uint8_t*>(compImgSetVerStr.data());
-    compImgSetVerStrInfo.length = compImgSetVerStrLen;
-
-    std::array<uint8_t, hdrSize + sizeof(struct pldm_request_update_req) +
-                            compImgSetVerStrLen>
-        request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, requestMsg,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    std::array<uint8_t, hdrSize + sizeof(struct pldm_request_update_req) +
-                            compImgSetVerStrLen>
-        outRequest{0x81, 0x05, 0x10, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00,
-                   0x02, 0x34, 0x12, 0x01, 0x0b, 0x30, 0x70, 0x65, 0x6e,
-                   0x42, 0x6d, 0x63, 0x76, 0x31, 0x2e, 0x30};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(RequestUpdate, errorPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 1;
-    uint32_t maxTransferSize = 512;
-    constexpr uint16_t numOfComp = 3;
-    uint8_t maxOutstandingTransferReq = 2;
-    constexpr uint16_t pkgDataLen = 0x1234;
-    constexpr std::string_view compImgSetVerStr = "0penBmcv1.0";
-    uint8_t compImgSetVerStrLen = static_cast<uint8_t>(compImgSetVerStr.size());
-    variable_field compImgSetVerStrInfo{};
-    compImgSetVerStrInfo.ptr =
-        reinterpret_cast<const uint8_t*>(compImgSetVerStr.data());
-    compImgSetVerStrInfo.length = compImgSetVerStrLen;
-
-    std::array<uint8_t, hdrSize + sizeof(struct pldm_request_update_req) +
-                            compImgSetVerStr.size()>
-        request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen, nullptr,
-        requestMsg,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    compImgSetVerStrInfo.ptr = nullptr;
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, requestMsg,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    compImgSetVerStrInfo.ptr =
-        reinterpret_cast<const uint8_t*>(compImgSetVerStr.data());
-
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, nullptr,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_request_update_req(instanceId, maxTransferSize, numOfComp,
-                                   maxOutstandingTransferReq, pkgDataLen,
-                                   PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-                                   &compImgSetVerStrInfo, requestMsg, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    compImgSetVerStrLen = 0;
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, 0, &compImgSetVerStrInfo, nullptr,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    compImgSetVerStrLen = static_cast<uint8_t>(compImgSetVerStr.size());
-
-    compImgSetVerStrInfo.length = 0xFFFF;
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, nullptr,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    compImgSetVerStrInfo.length = compImgSetVerStrLen;
-
-    maxTransferSize = PLDM_FWUP_BASELINE_TRANSFER_SIZE - 1;
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, nullptr,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    maxTransferSize = PLDM_FWUP_BASELINE_TRANSFER_SIZE;
-
-    maxOutstandingTransferReq = PLDM_FWUP_MIN_OUTSTANDING_REQ - 1;
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, nullptr,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    maxOutstandingTransferReq = PLDM_FWUP_MIN_OUTSTANDING_REQ;
-
-    rc = encode_request_update_req(
-        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
-        pkgDataLen, PLDM_STR_TYPE_UNKNOWN, compImgSetVerStrLen,
-        &compImgSetVerStrInfo, nullptr,
-        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(RequestUpdate, goodPathDecodeResponse)
-{
-    constexpr uint16_t fdMetaDataLen = 1024;
-    constexpr uint8_t fdWillSendPkgData = 1;
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_request_update_resp)>
-        requestUpdateResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01};
-
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(requestUpdateResponse1.data());
-    uint8_t outCompletionCode = 0;
-    uint16_t outFdMetaDataLen = 0;
-    uint8_t outFdWillSendPkgData = 0;
-
-    auto rc = decode_request_update_resp(
-        responseMsg1, requestUpdateResponse1.size() - hdrSize,
-        &outCompletionCode, &outFdMetaDataLen, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outCompletionCode, PLDM_SUCCESS);
-    EXPECT_EQ(outFdMetaDataLen, fdMetaDataLen);
-    EXPECT_EQ(outFdWillSendPkgData, fdWillSendPkgData);
-
-    outCompletionCode = 0;
-    outFdMetaDataLen = 0;
-    outFdWillSendPkgData = 0;
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(outCompletionCode)>
-        requestUpdateResponse2{0x00, 0x00, 0x00, 0x81};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(requestUpdateResponse2.data());
-    rc = decode_request_update_resp(
-        responseMsg2, requestUpdateResponse2.size() - hdrSize,
-        &outCompletionCode, &outFdMetaDataLen, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outCompletionCode, PLDM_FWUP_ALREADY_IN_UPDATE_MODE);
-}
-
-TEST(RequestUpdate, errorPathDecodeResponse)
-{
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_request_update_resp) - 1>
-        requestUpdateResponse{0x00, 0x00, 0x00, 0x00, 0x00, 0x04};
-
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(requestUpdateResponse.data());
-    uint8_t outCompletionCode = 0;
-    uint16_t outFdMetaDataLen = 0;
-    uint8_t outFdWillSendPkgData = 0;
-
-    auto rc = decode_request_update_resp(
-        nullptr, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
-        &outFdMetaDataLen, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_update_resp(
-        responseMsg, requestUpdateResponse.size() - hdrSize, nullptr,
-        &outFdMetaDataLen, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_update_resp(
-        responseMsg, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
-        nullptr, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_update_resp(
-        responseMsg, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
-        &outFdMetaDataLen, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_update_resp(responseMsg, 0, &outCompletionCode,
-                                    &outFdMetaDataLen, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_update_resp(
-        responseMsg, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
-        &outFdMetaDataLen, &outFdWillSendPkgData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(PassComponentTable, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 1;
-    constexpr uint16_t compIdentifier = 400;
-    constexpr uint8_t compClassificationIndex = 40;
-    constexpr uint32_t compComparisonStamp = 0x12345678;
-    constexpr std::string_view compVerStr = "0penBmcv1.1";
-    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
-    variable_field compVerStrInfo{};
-    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
-    compVerStrInfo.length = compVerStrLen;
-
-    std::array<uint8_t,
-               hdrSize + sizeof(pldm_pass_component_table_req) + compVerStrLen>
-        request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    std::array<uint8_t,
-               hdrSize + sizeof(pldm_pass_component_table_req) + compVerStrLen>
-        outRequest{0x81, 0x05, 0x13, 0x05, 0x0A, 0x00, 0x90, 0x01, 0x28,
-                   0x78, 0x56, 0x34, 0x12, 0x01, 0x0B, 0x30, 0x70, 0x65,
-                   0x6E, 0x42, 0x6D, 0x63, 0x76, 0x31, 0x2E, 0x31};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(PassComponentTable, errorPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 1;
-    constexpr uint16_t compIdentifier = 400;
-    constexpr uint8_t compClassificationIndex = 40;
-    constexpr uint32_t compComparisonStamp = 0x12345678;
-    constexpr std::string_view compVerStr = "0penBmcv1.1";
-    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
-    variable_field compVerStrInfo{};
-    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
-    compVerStrInfo.length = compVerStrLen;
-
-    std::array<uint8_t,
-               hdrSize + sizeof(pldm_pass_component_table_req) + compVerStrLen>
-        request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, nullptr, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    compVerStrInfo.ptr = nullptr;
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
-
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, &compVerStrInfo, nullptr,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req));
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII, 0,
-        &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen - 1, &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END + 1, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_INVALID_TRANSFER_OPERATION_FLAG);
-
-    rc = encode_pass_component_table_req(
-        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
-        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_UNKNOWN,
-        compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_pass_component_table_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(PassComponentTable, goodPathDecodeResponse)
-{
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp)>
-        passCompTableResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse1.data());
-
-    uint8_t completionCode = 0;
-    uint8_t compResp = 0;
-    uint8_t compRespCode = 0;
-
-    auto rc = decode_pass_component_table_resp(
-        responseMsg1, sizeof(pldm_pass_component_table_resp), &completionCode,
-        &compResp, &compRespCode);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(compResp, PLDM_CR_COMP_CAN_BE_UPDATED);
-    EXPECT_EQ(compRespCode, PLDM_CRC_COMP_COMPARISON_STAMP_IDENTICAL);
-
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp)>
-        passCompTableResponse2{0x00, 0x00, 0x00, 0x00, 0x00, 0xD0};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse2.data());
-    rc = decode_pass_component_table_resp(
-        responseMsg2, sizeof(pldm_pass_component_table_resp), &completionCode,
-        &compResp, &compRespCode);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(compResp, PLDM_CR_COMP_CAN_BE_UPDATED);
-    EXPECT_EQ(compRespCode, PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MIN);
-
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp)>
-        passCompTableResponse3{0x00, 0x00, 0x00, 0x80};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse3.data());
-
-    rc = decode_pass_component_table_resp(
-        responseMsg3, sizeof(pldm_pass_component_table_resp), &completionCode,
-        &compResp, &compRespCode);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_FWUP_NOT_IN_UPDATE_MODE);
-}
-
-TEST(PassComponentTable, errorPathDecodeResponse)
-{
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp) - 1>
-        passCompTableResponse1{0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse1.data());
-
-    uint8_t completionCode = 0;
-    uint8_t compResp = 0;
-    uint8_t compRespCode = 0;
-
-    auto rc = decode_pass_component_table_resp(
-        nullptr, sizeof(pldm_pass_component_table_resp) - 1, &completionCode,
-        &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pass_component_table_resp(
-        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1, nullptr,
-        &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pass_component_table_resp(
-        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1,
-        &completionCode, nullptr, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pass_component_table_resp(
-        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1,
-        &completionCode, &compResp, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pass_component_table_resp(responseMsg1, 0, &completionCode,
-                                          &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_pass_component_table_resp(
-        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1,
-        &completionCode, &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp)>
-        passCompTableResponse2{0x00, 0x00, 0x00, 0x00, 0x02, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse2.data());
-    rc = decode_pass_component_table_resp(
-        responseMsg2, sizeof(pldm_pass_component_table_resp), &completionCode,
-        &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp)>
-        passCompTableResponse3{0x00, 0x00, 0x00, 0x00, 0x00, 0x0C};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse3.data());
-    rc = decode_pass_component_table_resp(
-        responseMsg3, sizeof(pldm_pass_component_table_resp), &completionCode,
-        &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_pass_component_table_resp)>
-        passCompTableResponse4{0x00, 0x00, 0x00, 0x00, 0x00, 0xF0};
-    auto responseMsg4 =
-        reinterpret_cast<const pldm_msg*>(passCompTableResponse4.data());
-    rc = decode_pass_component_table_resp(
-        responseMsg4, sizeof(pldm_pass_component_table_resp), &completionCode,
-        &compResp, &compRespCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(UpdateComponent, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 2;
-    constexpr uint16_t compIdentifier = 500;
-    constexpr uint8_t compClassificationIndex = 50;
-    constexpr uint32_t compComparisonStamp = 0x89ABCDEF;
-    constexpr uint32_t compImageSize = 4096;
-    constexpr bitfield32_t updateOptionFlags{1};
-    constexpr std::string_view compVerStr = "OpenBmcv2.2";
-    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
-    variable_field compVerStrInfo{};
-    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
-    compVerStrInfo.length = compVerStrLen;
-
-    std::array<uint8_t,
-               hdrSize + sizeof(pldm_update_component_req) + compVerStrLen>
-        request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    std::array<uint8_t,
-               hdrSize + sizeof(pldm_update_component_req) + compVerStrLen>
-        outRequest{0x82, 0x05, 0x14, 0x0A, 0x00, 0xF4, 0x01, 0x32, 0xEF,
-                   0xCD, 0xAB, 0x89, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
-                   0x00, 0x00, 0x01, 0x0B, 0x4f, 0x70, 0x65, 0x6E, 0x42,
-                   0x6D, 0x63, 0x76, 0x32, 0x2E, 0x32};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(UpdateComponent, errorPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 2;
-    constexpr uint16_t compIdentifier = 500;
-    constexpr uint8_t compClassificationIndex = 50;
-    constexpr uint32_t compComparisonStamp = 0x89ABCDEF;
-    constexpr uint32_t compImageSize = 4096;
-    constexpr bitfield32_t updateOptionFlags{1};
-    constexpr std::string_view compVerStr = "OpenBmcv2.2";
-    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
-    variable_field compVerStrInfo{};
-    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
-    compVerStrInfo.length = compVerStrLen;
-
-    std::array<uint8_t,
-               hdrSize + sizeof(pldm_update_component_req) + compVerStrLen>
-        request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, compVerStrLen, nullptr, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    compVerStrInfo.ptr = nullptr;
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
-
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, nullptr,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req));
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, 0, updateOptionFlags, PLDM_STR_TYPE_ASCII,
-        compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, 0, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_ASCII, compVerStrLen - 1, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_update_component_req(
-        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
-        compComparisonStamp, compImageSize, updateOptionFlags,
-        PLDM_STR_TYPE_UNKNOWN, compVerStrLen, &compVerStrInfo, requestMsg,
-        sizeof(pldm_update_component_req) + compVerStrLen);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(UpdateComponent, goodPathDecodeResponse)
-{
-    constexpr std::bitset<32> forceUpdateComp{1};
-    constexpr uint16_t timeBeforeSendingReqFwData100s = 100;
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
-        updateComponentResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse1.data());
-
-    uint8_t completionCode = 0;
-    uint8_t compCompatibilityResp = 0;
-    uint8_t compCompatibilityRespCode = 0;
-    bitfield32_t updateOptionFlagsEnabled{};
-    uint16_t timeBeforeReqFWData = 0;
-
-    auto rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp), &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(compCompatibilityResp, PLDM_CCR_COMP_CAN_BE_UPDATED);
-    EXPECT_EQ(compCompatibilityRespCode, PLDM_CCRC_NO_RESPONSE_CODE);
-    EXPECT_EQ(updateOptionFlagsEnabled.value, forceUpdateComp);
-    EXPECT_EQ(timeBeforeReqFWData, timeBeforeSendingReqFwData100s);
-
-    constexpr std::bitset<32> noFlags{};
-    constexpr uint16_t timeBeforeSendingReqFwData0s = 0;
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
-        updateComponentResponse2{0x00, 0x00, 0x00, 0x00, 0x01, 0x09,
-                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse2.data());
-    rc = decode_update_component_resp(
-        responseMsg2, sizeof(pldm_update_component_resp), &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(compCompatibilityResp, PLDM_CCR_COMP_CANNOT_BE_UPDATED);
-    EXPECT_EQ(compCompatibilityRespCode, PLDM_CCRC_COMP_INFO_NO_MATCH);
-    EXPECT_EQ(updateOptionFlagsEnabled.value, noFlags);
-    EXPECT_EQ(timeBeforeReqFWData, timeBeforeSendingReqFwData0s);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
-        updateComponentResponse3{0x00, 0x00, 0x00, 0x80};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse3.data());
-
-    rc = decode_update_component_resp(
-        responseMsg3, sizeof(pldm_update_component_resp), &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_FWUP_NOT_IN_UPDATE_MODE);
-}
-
-TEST(UpdateComponent, errorPathDecodeResponse)
-{
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_update_component_resp) - 1>
-        updateComponentResponse1{0x00, 0x00, 0x00, 0x00, 0x01, 0x09,
-                                 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse1.data());
-
-    uint8_t completionCode = 0;
-    uint8_t compCompatibilityResp = 0;
-    uint8_t compCompatibilityRespCode = 0;
-    bitfield32_t updateOptionFlagsEnabled{};
-    uint16_t timeBeforeReqFWData = 0;
-
-    auto rc = decode_update_component_resp(
-        nullptr, sizeof(pldm_update_component_resp) - 1, &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp) - 1, nullptr,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
-        nullptr, &compCompatibilityRespCode, &updateOptionFlagsEnabled,
-        &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
-        &compCompatibilityResp, nullptr, &updateOptionFlagsEnabled,
-        &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode, nullptr,
-        &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, 0, &completionCode, &compCompatibilityResp,
-        &compCompatibilityRespCode, &updateOptionFlagsEnabled,
-        &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_update_component_resp(
-        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
-        updateComponentResponse2{0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
-                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse2.data());
-    rc = decode_update_component_resp(
-        responseMsg2, sizeof(pldm_update_component_resp), &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
-        updateComponentResponse3{0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
-                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse3.data());
-    rc = decode_update_component_resp(
-        responseMsg3, sizeof(pldm_update_component_resp), &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
-        updateComponentResponse4{0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
-                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
-    auto responseMsg4 =
-        reinterpret_cast<const pldm_msg*>(updateComponentResponse4.data());
-    rc = decode_update_component_resp(
-        responseMsg4, sizeof(pldm_update_component_resp), &completionCode,
-        &compCompatibilityResp, &compCompatibilityRespCode,
-        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(RequestFirmwareData, goodPathDecodeRequest)
-{
-    constexpr uint32_t offset = 300;
-    constexpr uint32_t length = 255;
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_request_firmware_data_req)>
-        reqFWDataReq{0x00, 0x00, 0x00, 0x2C, 0x01, 0x00,
-                     0x00, 0xFF, 0x00, 0x00, 0x00};
-    auto requestMsg = reinterpret_cast<const pldm_msg*>(reqFWDataReq.data());
-
-    uint32_t outOffset = 0;
-    uint32_t outLength = 0;
-    auto rc = decode_request_firmware_data_req(
-        requestMsg, sizeof(pldm_request_firmware_data_req), &outOffset,
-        &outLength);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outOffset, offset);
-    EXPECT_EQ(outLength, length);
-}
-
-TEST(RequestFirmwareData, errorPathDecodeRequest)
-{
-    constexpr std::array<uint8_t,
-                         hdrSize + sizeof(pldm_request_firmware_data_req)>
-        reqFWDataReq{0x00, 0x00, 0x00, 0x2C, 0x01, 0x00,
-                     0x00, 0x1F, 0x00, 0x00, 0x00};
-    auto requestMsg = reinterpret_cast<const pldm_msg*>(reqFWDataReq.data());
-
-    uint32_t outOffset = 0;
-    uint32_t outLength = 0;
-    auto rc = decode_request_firmware_data_req(
-        nullptr, sizeof(pldm_request_firmware_data_req), &outOffset,
-        &outLength);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_firmware_data_req(
-        requestMsg, sizeof(pldm_request_firmware_data_req), nullptr,
-        &outLength);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_firmware_data_req(
-        requestMsg, sizeof(pldm_request_firmware_data_req), &outOffset,
-        nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_request_firmware_data_req(
-        requestMsg, sizeof(pldm_request_firmware_data_req) - 1, &outOffset,
-        &outLength);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = decode_request_firmware_data_req(
-        requestMsg, sizeof(pldm_request_firmware_data_req), &outOffset,
-        &outLength);
-    EXPECT_EQ(rc, PLDM_FWUP_INVALID_TRANSFER_LENGTH);
-}
-
-TEST(RequestFirmwareData, goodPathEncodeResponse)
-{
-    constexpr uint8_t instanceId = 3;
-    constexpr uint8_t completionCode = PLDM_SUCCESS;
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode) +
-                                      PLDM_FWUP_BASELINE_TRANSFER_SIZE>
-        outReqFwDataResponse1{0x03, 0x05, 0x15, 0x00, 0x01, 0x02, 0x03, 0x04,
-                              0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
-                              0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
-                              0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
-                              0x1D, 0x1E, 0x1F, 0x20};
-    std::array<uint8_t, hdrSize + sizeof(completionCode) +
-                            PLDM_FWUP_BASELINE_TRANSFER_SIZE>
-        reqFwDataResponse1{0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
-                           0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
-                           0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
-                           0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
-                           0x1D, 0x1E, 0x1F, 0x20};
-    auto responseMsg1 = reinterpret_cast<pldm_msg*>(reqFwDataResponse1.data());
-    auto rc = encode_request_firmware_data_resp(
-        instanceId, completionCode, responseMsg1,
-        sizeof(completionCode) + PLDM_FWUP_BASELINE_TRANSFER_SIZE);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(reqFwDataResponse1, outReqFwDataResponse1);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outReqFwDataResponse2{0x03, 0x05, 0x15, 0x82};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)> reqFwDataResponse2{
-        0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 = reinterpret_cast<pldm_msg*>(reqFwDataResponse2.data());
-    rc = encode_request_firmware_data_resp(
-        instanceId, PLDM_FWUP_DATA_OUT_OF_RANGE, responseMsg2,
-        sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(reqFwDataResponse2, outReqFwDataResponse2);
-}
-
-TEST(RequestFirmwareData, errorPathEncodeResponse)
-{
-    std::array<uint8_t, hdrSize> reqFwDataResponse{0x00, 0x00, 0x00};
-    auto responseMsg = reinterpret_cast<pldm_msg*>(reqFwDataResponse.data());
-    auto rc = encode_request_firmware_data_resp(0, PLDM_SUCCESS, nullptr, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_request_firmware_data_resp(0, PLDM_SUCCESS, responseMsg, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(TransferComplete, goodPathDecodeRequest)
-{
-    constexpr uint8_t transferResult = PLDM_FWUP_TRANSFER_SUCCESS;
-    constexpr std::array<uint8_t, hdrSize + sizeof(transferResult)>
-        transferCompleteReq1{0x00, 0x00, 0x00, 0x00};
-    auto requestMsg1 =
-        reinterpret_cast<const pldm_msg*>(transferCompleteReq1.data());
-    uint8_t outTransferResult = 0;
-
-    auto rc = decode_transfer_complete_req(requestMsg1, sizeof(transferResult),
-                                           &outTransferResult);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outTransferResult, transferResult);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(transferResult)>
-        transferCompleteReq2{0x00, 0x00, 0x00, 0x02};
-    auto requestMsg2 =
-        reinterpret_cast<const pldm_msg*>(transferCompleteReq2.data());
-    rc = decode_transfer_complete_req(requestMsg2, sizeof(transferResult),
-                                      &outTransferResult);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outTransferResult, PLDM_FWUP_TRANSFER_ERROR_IMAGE_CORRUPT);
-}
-
-TEST(TransferComplete, errorPathDecodeRequest)
-{
-    constexpr std::array<uint8_t, hdrSize> transferCompleteReq{0x00, 0x00,
-                                                               0x00};
-    auto requestMsg =
-        reinterpret_cast<const pldm_msg*>(transferCompleteReq.data());
-    uint8_t outTransferResult = 0;
-
-    auto rc = decode_transfer_complete_req(nullptr, 0, &outTransferResult);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_transfer_complete_req(requestMsg, 0, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_transfer_complete_req(requestMsg, 0, &outTransferResult);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(TransferComplete, goodPathEncodeResponse)
-{
-    constexpr uint8_t instanceId = 4;
-    constexpr uint8_t completionCode = PLDM_SUCCESS;
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outTransferCompleteResponse1{0x04, 0x05, 0x16, 0x00};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        transferCompleteResponse1{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<pldm_msg*>(transferCompleteResponse1.data());
-    auto rc = encode_transfer_complete_resp(
-        instanceId, completionCode, responseMsg1, sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(transferCompleteResponse1, outTransferCompleteResponse1);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outTransferCompleteResponse2{0x04, 0x05, 0x16, 0x87};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        transferCompleteResponse2{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<pldm_msg*>(transferCompleteResponse2.data());
-    rc = encode_transfer_complete_resp(instanceId,
-                                       PLDM_FWUP_COMMAND_NOT_EXPECTED,
-                                       responseMsg2, sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(transferCompleteResponse2, outTransferCompleteResponse2);
-}
-
-TEST(TransferComplete, errorPathEncodeResponse)
-{
-    std::array<uint8_t, hdrSize> transferCompleteResponse{0x00, 0x00, 0x00};
-    auto responseMsg =
-        reinterpret_cast<pldm_msg*>(transferCompleteResponse.data());
-    auto rc = encode_transfer_complete_resp(0, PLDM_SUCCESS, nullptr, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_transfer_complete_resp(0, PLDM_SUCCESS, responseMsg, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(VerifyComplete, goodPathDecodeRequest)
-{
-    constexpr uint8_t verifyResult = PLDM_FWUP_VERIFY_SUCCESS;
-    constexpr std::array<uint8_t, hdrSize + sizeof(verifyResult)>
-        verifyCompleteReq1{0x00, 0x00, 0x00, 0x00};
-    auto requestMsg1 =
-        reinterpret_cast<const pldm_msg*>(verifyCompleteReq1.data());
-    uint8_t outVerifyResult = 0;
-
-    auto rc = decode_verify_complete_req(requestMsg1, sizeof(verifyResult),
-                                         &outVerifyResult);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outVerifyResult, verifyResult);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(verifyResult)>
-        verifyCompleteReq2{0x00, 0x00, 0x00, 0x03};
-    auto requestMsg2 =
-        reinterpret_cast<const pldm_msg*>(verifyCompleteReq2.data());
-    rc = decode_verify_complete_req(requestMsg2, sizeof(verifyResult),
-                                    &outVerifyResult);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outVerifyResult, PLDM_FWUP_VERIFY_FAILED_FD_SECURITY_CHECKS);
-}
-
-TEST(VerifyComplete, errorPathDecodeRequest)
-{
-    constexpr std::array<uint8_t, hdrSize> verifyCompleteReq{0x00, 0x00, 0x00};
-    auto requestMsg =
-        reinterpret_cast<const pldm_msg*>(verifyCompleteReq.data());
-    uint8_t outVerifyResult = 0;
-
-    auto rc = decode_verify_complete_req(nullptr, 0, &outVerifyResult);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_verify_complete_req(requestMsg, 0, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_verify_complete_req(requestMsg, 0, &outVerifyResult);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(VerifyComplete, goodPathEncodeResponse)
-{
-    constexpr uint8_t instanceId = 5;
-    constexpr uint8_t completionCode = PLDM_SUCCESS;
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outVerifyCompleteResponse1{0x05, 0x05, 0x17, 0x00};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        verifyCompleteResponse1{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<pldm_msg*>(verifyCompleteResponse1.data());
-    auto rc = encode_verify_complete_resp(instanceId, completionCode,
-                                          responseMsg1, sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(verifyCompleteResponse1, outVerifyCompleteResponse1);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outVerifyCompleteResponse2{0x05, 0x05, 0x17, 0x87};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        verifyCompleteResponse2{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<pldm_msg*>(verifyCompleteResponse2.data());
-    rc = encode_verify_complete_resp(instanceId, PLDM_FWUP_COMMAND_NOT_EXPECTED,
-                                     responseMsg2, sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(verifyCompleteResponse2, outVerifyCompleteResponse2);
-}
-
-TEST(VerifyComplete, errorPathEncodeResponse)
-{
-    std::array<uint8_t, hdrSize> verifyCompleteResponse{0x00, 0x00, 0x00};
-    auto responseMsg =
-        reinterpret_cast<pldm_msg*>(verifyCompleteResponse.data());
-    auto rc = encode_verify_complete_resp(0, PLDM_SUCCESS, nullptr, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_verify_complete_resp(0, PLDM_SUCCESS, responseMsg, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ApplyComplete, goodPathDecodeRequest)
-{
-    constexpr uint8_t applyResult1 =
-        PLDM_FWUP_APPLY_SUCCESS_WITH_ACTIVATION_METHOD;
-    // DC power cycle [Bit position 4] & AC power cycle [Bit position 5]
-    constexpr std::bitset<16> compActivationModification1{0x30};
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_apply_complete_req)>
-        applyCompleteReq1{0x00, 0x00, 0x00, 0x01, 0x30, 0x00};
-    auto requestMsg1 =
-        reinterpret_cast<const pldm_msg*>(applyCompleteReq1.data());
-    uint8_t outApplyResult = 0;
-    bitfield16_t outCompActivationModification{};
-    auto rc = decode_apply_complete_req(
-        requestMsg1, sizeof(pldm_apply_complete_req), &outApplyResult,
-        &outCompActivationModification);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outApplyResult, applyResult1);
-    EXPECT_EQ(outCompActivationModification.value, compActivationModification1);
-
-    constexpr uint8_t applyResult2 = PLDM_FWUP_APPLY_SUCCESS;
-    constexpr std::bitset<16> compActivationModification2{};
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_apply_complete_req)>
-        applyCompleteReq2{0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto requestMsg2 =
-        reinterpret_cast<const pldm_msg*>(applyCompleteReq2.data());
-    rc = decode_apply_complete_req(requestMsg2, sizeof(pldm_apply_complete_req),
-                                   &outApplyResult,
-                                   &outCompActivationModification);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(outApplyResult, applyResult2);
-    EXPECT_EQ(outCompActivationModification.value, compActivationModification2);
-}
-
-TEST(ApplyComplete, errorPathDecodeRequest)
-{
-    constexpr std::array<uint8_t, hdrSize> applyCompleteReq1{0x00, 0x00, 0x00};
-    auto requestMsg1 =
-        reinterpret_cast<const pldm_msg*>(applyCompleteReq1.data());
-    uint8_t outApplyResult = 0;
-    bitfield16_t outCompActivationModification{};
-
-    auto rc = decode_apply_complete_req(
-        nullptr, sizeof(pldm_apply_complete_req), &outApplyResult,
-        &outCompActivationModification);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_apply_complete_req(requestMsg1, sizeof(pldm_apply_complete_req),
-                                   nullptr, &outCompActivationModification);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_apply_complete_req(requestMsg1, sizeof(pldm_apply_complete_req),
-                                   &outApplyResult, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_apply_complete_req(requestMsg1, 0, &outApplyResult,
-                                   &outCompActivationModification);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_apply_complete_req)>
-        applyCompleteReq2{0x00, 0x00, 0x00, 0x00, 0x01, 0x00};
-    auto requestMsg2 =
-        reinterpret_cast<const pldm_msg*>(applyCompleteReq2.data());
-    rc = decode_apply_complete_req(requestMsg2, sizeof(pldm_apply_complete_req),
-                                   &outApplyResult,
-                                   &outCompActivationModification);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(ApplyComplete, goodPathEncodeResponse)
-{
-    constexpr uint8_t instanceId = 6;
-    constexpr uint8_t completionCode = PLDM_SUCCESS;
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outApplyCompleteResponse1{0x06, 0x05, 0x18, 0x00};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        applyCompleteResponse1{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<pldm_msg*>(applyCompleteResponse1.data());
-    auto rc = encode_apply_complete_resp(instanceId, completionCode,
-                                         responseMsg1, sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(applyCompleteResponse1, outApplyCompleteResponse1);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        outApplyCompleteResponse2{0x06, 0x05, 0x18, 0x87};
-    std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        applyCompleteResponse2{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<pldm_msg*>(applyCompleteResponse2.data());
-    rc = encode_apply_complete_resp(instanceId, PLDM_FWUP_COMMAND_NOT_EXPECTED,
-                                    responseMsg2, sizeof(completionCode));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(applyCompleteResponse2, outApplyCompleteResponse2);
-}
-
-TEST(ApplyComplete, errorPathEncodeResponse)
-{
-    std::array<uint8_t, hdrSize> applyCompleteResponse{0x00, 0x00, 0x00};
-    auto responseMsg =
-        reinterpret_cast<pldm_msg*>(applyCompleteResponse.data());
-    auto rc = encode_apply_complete_resp(0, PLDM_SUCCESS, nullptr, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_apply_complete_resp(0, PLDM_SUCCESS, responseMsg, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ActivateFirmware, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 7;
-
-    std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_req)> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_activate_firmware_req(
-        instanceId, PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS, requestMsg,
-        sizeof(pldm_activate_firmware_req));
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_req)>
-        outRequest{0x87, 0x05, 0x1A, 0x01};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(ActivateFirmware, errorPathEncodeRequest)
-{
-    std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_req)> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_activate_firmware_req(
-        0, PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS, nullptr,
-        sizeof(pldm_activate_firmware_req));
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_activate_firmware_req(
-        0, PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS, requestMsg, 0);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    rc = encode_activate_firmware_req(0, 2, requestMsg,
-                                      sizeof(pldm_activate_firmware_req));
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(ActivateFirmware, goodPathDecodeResponse)
-{
-    constexpr uint16_t estimatedTimeForActivation100s = 100;
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_resp)>
-        activateFirmwareResponse1{0x00, 0x00, 0x00, 0x00, 0x64, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(activateFirmwareResponse1.data());
-
-    uint8_t completionCode = 0;
-    uint16_t estimatedTimeForActivation = 0;
-
-    auto rc = decode_activate_firmware_resp(
-        responseMsg1, sizeof(pldm_activate_firmware_resp), &completionCode,
-        &estimatedTimeForActivation);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(estimatedTimeForActivation, estimatedTimeForActivation100s);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        activateFirmwareResponse2{0x00, 0x00, 0x00, 0x85};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(activateFirmwareResponse2.data());
-
-    rc = decode_activate_firmware_resp(responseMsg2, sizeof(completionCode),
-                                       &completionCode,
-                                       &estimatedTimeForActivation);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_FWUP_INCOMPLETE_UPDATE);
-}
-
-TEST(ActivateFirmware, errorPathDecodeResponse)
-{
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_resp)>
-        activateFirmwareResponse{0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(activateFirmwareResponse.data());
-
-    uint8_t completionCode = 0;
-    uint16_t estimatedTimeForActivation = 0;
-
-    auto rc = decode_activate_firmware_resp(
-        nullptr, sizeof(pldm_activate_firmware_resp), &completionCode,
-        &estimatedTimeForActivation);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_activate_firmware_resp(responseMsg,
-                                       sizeof(pldm_activate_firmware_resp),
-                                       nullptr, &estimatedTimeForActivation);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_activate_firmware_resp(responseMsg,
-                                       sizeof(pldm_activate_firmware_resp),
-                                       &completionCode, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_activate_firmware_resp(responseMsg, 0, &completionCode,
-                                       &estimatedTimeForActivation);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_activate_firmware_resp(
-        responseMsg, sizeof(pldm_activate_firmware_resp) - 1, &completionCode,
-        &estimatedTimeForActivation);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(GetStatus, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 8;
-    std::array<uint8_t, hdrSize> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_get_status_req(instanceId, requestMsg,
-                                    PLDM_GET_STATUS_REQ_BYTES);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    constexpr std::array<uint8_t, hdrSize> outRequest{0x88, 0x05, 0x1B};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(GetStatus, errorPathEncodeRequest)
-{
-    std::array<uint8_t, hdrSize + sizeof(uint8_t)> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_get_status_req(0, nullptr, PLDM_GET_STATUS_REQ_BYTES);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_get_status_req(0, requestMsg, PLDM_GET_STATUS_REQ_BYTES + 1);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(GetStatus, goodPathDecodeResponse)
-{
-    constexpr std::bitset<32> updateOptionFlagsEnabled1{0};
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03,
-                           0x09, 0x65, 0x05, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse1.data());
-
-    uint8_t completionCode = 0;
-    uint8_t currentState = 0;
-    uint8_t previousState = 0;
-    uint8_t auxState = 0;
-    uint8_t auxStateStatus = 0;
-    uint8_t progressPercent = 0;
-    uint8_t reasonCode = 0;
-    bitfield32_t updateOptionFlagsEnabled{0};
-
-    auto rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(currentState, PLDM_FD_STATE_IDLE);
-    EXPECT_EQ(previousState, PLDM_FD_STATE_DOWNLOAD);
-    EXPECT_EQ(auxState, PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER);
-    EXPECT_EQ(auxStateStatus, PLDM_FD_TIMEOUT);
-    EXPECT_EQ(progressPercent, PLDM_FWUP_MAX_PROGRESS_PERCENT);
-    EXPECT_EQ(reasonCode, PLDM_FD_TIMEOUT_DOWNLOAD);
-    EXPECT_EQ(updateOptionFlagsEnabled.value, updateOptionFlagsEnabled1);
-
-    // Bit position 0 - Force update of component – FD will perform a force
-    // update of the component.
-    constexpr std::bitset<32> updateOptionFlagsEnabled2{1};
-    constexpr uint8_t progressPercent2 = 50;
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse2{0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00,
-                           0x70, 0x32, 0x05, 0x01, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse2.data());
-
-    rc = decode_get_status_resp(
-        responseMsg2, getStatusResponse2.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(currentState, PLDM_FD_STATE_VERIFY);
-    EXPECT_EQ(previousState, PLDM_FD_STATE_DOWNLOAD);
-    EXPECT_EQ(auxState, PLDM_FD_OPERATION_IN_PROGRESS);
-    EXPECT_EQ(auxStateStatus, PLDM_FD_VENDOR_DEFINED_STATUS_CODE_START);
-    EXPECT_EQ(progressPercent, progressPercent2);
-    EXPECT_EQ(reasonCode, PLDM_FD_TIMEOUT_DOWNLOAD);
-    EXPECT_EQ(updateOptionFlagsEnabled.value, updateOptionFlagsEnabled2);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        getStatusResponse3{0x00, 0x00, 0x00, 0x04};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse3.data());
-    rc = decode_get_status_resp(
-        responseMsg3, getStatusResponse3.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_ERROR_NOT_READY);
-}
-
-TEST(GetStatus, errorPathDecodeResponse)
-{
-    uint8_t completionCode = 0;
-    uint8_t currentState = 0;
-    uint8_t previousState = 0;
-    uint8_t auxState = 0;
-    uint8_t auxStateStatus = 0;
-    uint8_t progressPercent = 0;
-    uint8_t reasonCode = 0;
-    bitfield32_t updateOptionFlagsEnabled{0};
-
-    constexpr std::array<uint8_t, hdrSize> getStatusResponse1{0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse1.data());
-
-    auto rc = decode_get_status_resp(
-        nullptr, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, nullptr,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        nullptr, &previousState, &auxState, &auxStateStatus, &progressPercent,
-        &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, nullptr, &auxState, &auxStateStatus, &progressPercent,
-        &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, nullptr, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, nullptr, &progressPercent,
-        &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus, nullptr,
-        &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, nullptr, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_get_status_resp(
-        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp) - 1>
-        getStatusResponse2{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse2.data());
-    rc = decode_get_status_resp(
-        responseMsg2, getStatusResponse2.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse3{0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse3.data());
-    rc = decode_get_status_resp(
-        responseMsg3, getStatusResponse3.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse4{0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg4 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse4.data());
-    rc = decode_get_status_resp(
-        responseMsg4, getStatusResponse4.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse5{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
-                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg5 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse5.data());
-    rc = decode_get_status_resp(
-        responseMsg5, getStatusResponse5.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse6{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                           0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg6 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse6.data());
-    rc = decode_get_status_resp(
-        responseMsg6, getStatusResponse6.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse7{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                           0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg7 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse7.data());
-    rc = decode_get_status_resp(
-        responseMsg7, getStatusResponse7.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse8{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                           0x00, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg8 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse8.data());
-    rc = decode_get_status_resp(
-        responseMsg8, getStatusResponse8.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    // AuxState is not PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER when the state is
-    // IDLE
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
-        getStatusResponse9{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg9 =
-        reinterpret_cast<const pldm_msg*>(getStatusResponse9.data());
-    rc = decode_get_status_resp(
-        responseMsg9, getStatusResponse9.size() - hdrSize, &completionCode,
-        &currentState, &previousState, &auxState, &auxStateStatus,
-        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(CancelUpdateComponent, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 9;
-    std::array<uint8_t, hdrSize> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_cancel_update_component_req(
-        instanceId, requestMsg, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    constexpr std::array<uint8_t, hdrSize> outRequest{0x89, 0x05, 0x1C};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(CancelUpdateComponent, errorPathEncodeRequest)
-{
-    std::array<uint8_t, hdrSize + sizeof(uint8_t)> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_cancel_update_component_req(
-        0, nullptr, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_cancel_update_component_req(
-        0, requestMsg, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES + 1);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(CancelUpdateComponent, testGoodDecodeResponse)
-{
-    uint8_t completionCode = 0;
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        cancelUpdateComponentResponse1{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 = reinterpret_cast<const pldm_msg*>(
-        cancelUpdateComponentResponse1.data());
-    auto rc = decode_cancel_update_component_resp(
-        responseMsg1, cancelUpdateComponentResponse1.size() - hdrSize,
-        &completionCode);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        cancelUpdateComponentResponse2{0x00, 0x00, 0x00, 0x86};
-    auto responseMsg2 = reinterpret_cast<const pldm_msg*>(
-        cancelUpdateComponentResponse2.data());
-    rc = decode_cancel_update_component_resp(
-        responseMsg2, cancelUpdateComponentResponse2.size() - hdrSize,
-        &completionCode);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_FWUP_BUSY_IN_BACKGROUND);
-}
-
-TEST(CancelUpdateComponent, testBadDecodeResponse)
-{
-    uint8_t completionCode = 0;
-    constexpr std::array<uint8_t, hdrSize> cancelUpdateComponentResponse{
-        0x00, 0x00, 0x00};
-    auto responseMsg =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateComponentResponse.data());
-
-    auto rc = decode_cancel_update_component_resp(
-        nullptr, cancelUpdateComponentResponse.size() - hdrSize,
-        &completionCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_cancel_update_component_resp(
-        responseMsg, cancelUpdateComponentResponse.size() - hdrSize, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_cancel_update_component_resp(
-        responseMsg, cancelUpdateComponentResponse.size() - hdrSize,
-        &completionCode);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(CancelUpdate, goodPathEncodeRequest)
-{
-    constexpr uint8_t instanceId = 10;
-    std::array<uint8_t, hdrSize> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc = encode_cancel_update_req(instanceId, requestMsg,
-                                       PLDM_CANCEL_UPDATE_REQ_BYTES);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-
-    constexpr std::array<uint8_t, hdrSize> outRequest{0x8A, 0x05, 0x1D};
-    EXPECT_EQ(request, outRequest);
-}
-
-TEST(CancelUpdate, errorPathEncodeRequest)
-{
-    std::array<uint8_t, hdrSize + sizeof(uint8_t)> request{};
-    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
-
-    auto rc =
-        encode_cancel_update_req(0, nullptr, PLDM_CANCEL_UPDATE_REQ_BYTES);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = encode_cancel_update_req(0, requestMsg,
-                                  PLDM_CANCEL_UPDATE_REQ_BYTES + 1);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(CancelUpdate, goodPathDecodeResponse)
-{
-    constexpr std::bitset<64> nonFunctioningComponentBitmap1{0};
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_cancel_update_resp)>
-        cancelUpdateResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse1.data());
-    uint8_t completionCode = 0;
-    bool8_t nonFunctioningComponentIndication = 0;
-    bitfield64_t nonFunctioningComponentBitmap{0};
-    auto rc = decode_cancel_update_resp(
-        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(nonFunctioningComponentIndication,
-              PLDM_FWUP_COMPONENTS_FUNCTIONING);
-    EXPECT_EQ(nonFunctioningComponentBitmap.value,
-              nonFunctioningComponentBitmap1);
-
-    constexpr std::bitset<64> nonFunctioningComponentBitmap2{0x0101};
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_cancel_update_resp)>
-        cancelUpdateResponse2{0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
-                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse2.data());
-    rc = decode_cancel_update_resp(
-        responseMsg2, cancelUpdateResponse2.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_SUCCESS);
-    EXPECT_EQ(nonFunctioningComponentIndication,
-              PLDM_FWUP_COMPONENTS_NOT_FUNCTIONING);
-    EXPECT_EQ(nonFunctioningComponentBitmap.value,
-              nonFunctioningComponentBitmap2);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        cancelUpdateResponse3{0x00, 0x00, 0x00, 0x86};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse3.data());
-    rc = decode_cancel_update_resp(
-        responseMsg3, cancelUpdateResponse3.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_SUCCESS);
-    EXPECT_EQ(completionCode, PLDM_FWUP_BUSY_IN_BACKGROUND);
-}
-
-TEST(CancelUpdate, errorPathDecodeResponse)
-{
-    constexpr std::array<uint8_t, hdrSize> cancelUpdateResponse1{0x00, 0x00,
-                                                                 0x00};
-    auto responseMsg1 =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse1.data());
-    uint8_t completionCode = 0;
-    bool8_t nonFunctioningComponentIndication = 0;
-    bitfield64_t nonFunctioningComponentBitmap{0};
-
-    auto rc = decode_cancel_update_resp(
-        nullptr, cancelUpdateResponse1.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_cancel_update_resp(
-        responseMsg1, cancelUpdateResponse1.size() - hdrSize, nullptr,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_cancel_update_resp(
-        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
-        nullptr, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_cancel_update_resp(
-        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, nullptr);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    rc = decode_cancel_update_resp(
-        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
-        cancelUpdateResponse2{0x00, 0x00, 0x00, 0x00};
-    auto responseMsg2 =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse2.data());
-    rc = decode_cancel_update_resp(
-        responseMsg2, cancelUpdateResponse2.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_cancel_update_resp)>
-        cancelUpdateResponse3{0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
-                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    auto responseMsg3 =
-        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse3.data());
-    rc = decode_cancel_update_resp(
-        responseMsg3, cancelUpdateResponse3.size() - hdrSize, &completionCode,
-        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
-    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
+#include <bitset>
+#include <cstring>
+
+#include "libpldm/base.h"
+#include "libpldm/firmware_update.h"
+
+#include <gtest/gtest.h>
+
+constexpr auto hdrSize = sizeof(pldm_msg_hdr);
+
+TEST(DecodePackageHeaderInfo, goodPath)
+{
+    // Package header identifier for Version 1.0.x
+    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
+        0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43,
+        0x98, 0x00, 0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02};
+    // Package header version for DSP0267 version 1.0.x
+    constexpr uint8_t pkgHeaderFormatRevision = 0x01;
+    // Random PackageHeaderSize
+    constexpr uint16_t pkgHeaderSize = 303;
+    // PackageReleaseDateTime - "25/12/2021 00:00:00"
+    std::array<uint8_t, PLDM_TIMESTAMP104_SIZE> timestamp104{
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00};
+    constexpr uint16_t componentBitmapBitLength = 8;
+    // PackageVersionString
+    constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
+    constexpr size_t packagerHeaderSize =
+        sizeof(pldm_package_header_information) + packageVersionStr.size();
+
+    constexpr std::array<uint8_t, packagerHeaderSize> packagerHeaderInfo{
+        0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00, 0xa0, 0x2F,
+        0x05, 0x9a, 0xca, 0x02, 0x01, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5, 0x07, 0x00, 0x08, 0x00, 0x01, 0x0b,
+        0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+    pldm_package_header_information pkgHeader{};
+    variable_field packageVersion{};
+
+    auto rc = decode_pldm_package_header_info(packagerHeaderInfo.data(),
+                                              packagerHeaderInfo.size(),
+                                              &pkgHeader, &packageVersion);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(true,
+              std::equal(pkgHeader.uuid, pkgHeader.uuid + PLDM_FWUP_UUID_LENGTH,
+                         uuid.begin(), uuid.end()));
+    EXPECT_EQ(pkgHeader.package_header_format_version, pkgHeaderFormatRevision);
+    EXPECT_EQ(pkgHeader.package_header_size, pkgHeaderSize);
+    EXPECT_EQ(true, std::equal(pkgHeader.timestamp104,
+                               pkgHeader.timestamp104 + PLDM_TIMESTAMP104_SIZE,
+                               timestamp104.begin(), timestamp104.end()));
+    EXPECT_EQ(pkgHeader.component_bitmap_bit_length, componentBitmapBitLength);
+    EXPECT_EQ(pkgHeader.package_version_string_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(pkgHeader.package_version_string_length,
+              packageVersionStr.size());
+    std::string packageVersionString(
+        reinterpret_cast<const char*>(packageVersion.ptr),
+        packageVersion.length);
+    EXPECT_EQ(packageVersionString, packageVersionStr);
+}
+
+TEST(DecodePackageHeaderInfo, errorPaths)
+{
+    int rc = 0;
+    constexpr std::string_view packageVersionStr{"OpenBMCv1.0"};
+    constexpr size_t packagerHeaderSize =
+        sizeof(pldm_package_header_information) + packageVersionStr.size();
+
+    // Invalid Package Version String Type - 0x06
+    constexpr std::array<uint8_t, packagerHeaderSize>
+        invalidPackagerHeaderInfo1{
+            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
+            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
+            0x07, 0x00, 0x08, 0x00, 0x06, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
+            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+
+    pldm_package_header_information packageHeader{};
+    variable_field packageVersion{};
+
+    rc = decode_pldm_package_header_info(nullptr,
+                                         invalidPackagerHeaderInfo1.size(),
+                                         &packageHeader, &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo1.data(),
+                                         invalidPackagerHeaderInfo1.size(),
+                                         nullptr, &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo1.data(),
+                                         invalidPackagerHeaderInfo1.size(),
+                                         &packageHeader, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pldm_package_header_info(
+        invalidPackagerHeaderInfo1.data(),
+        sizeof(pldm_package_header_information) - 1, &packageHeader,
+        &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo1.data(),
+                                         invalidPackagerHeaderInfo1.size(),
+                                         &packageHeader, &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid Package Version String Length - 0x00
+    constexpr std::array<uint8_t, packagerHeaderSize>
+        invalidPackagerHeaderInfo2{
+            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
+            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
+            0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4f, 0x70, 0x65, 0x6e,
+            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo2.data(),
+                                         invalidPackagerHeaderInfo2.size(),
+                                         &packageHeader, &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Package version string length less than in the header information
+    constexpr std::array<uint8_t, packagerHeaderSize - 1>
+        invalidPackagerHeaderInfo3{
+            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
+            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
+            0x07, 0x00, 0x08, 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
+            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e};
+    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo3.data(),
+                                         invalidPackagerHeaderInfo3.size(),
+                                         &packageHeader, &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    // ComponentBitmapBitLength not a multiple of 8
+    constexpr std::array<uint8_t, packagerHeaderSize>
+        invalidPackagerHeaderInfo4{
+            0xf0, 0x18, 0x87, 0x8c, 0xcb, 0x7d, 0x49, 0x43, 0x98, 0x00,
+            0xa0, 0x2F, 0x05, 0x9a, 0xca, 0x02, 0x02, 0x2f, 0x01, 0x00,
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x0c, 0xe5,
+            0x07, 0x00, 0x09, 0x00, 0x01, 0x0b, 0x4f, 0x70, 0x65, 0x6e,
+            0x42, 0x4d, 0x43, 0x76, 0x31, 0x2e, 0x30};
+    rc = decode_pldm_package_header_info(invalidPackagerHeaderInfo4.data(),
+                                         invalidPackagerHeaderInfo4.size(),
+                                         &packageHeader, &packageVersion);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(DecodeFirmwareDeviceIdRecord, goodPath)
+{
+    constexpr uint8_t descriptorCount = 1;
+    // Continue component updates after failure
+    constexpr std::bitset<32> deviceUpdateFlag{1};
+    constexpr uint16_t componentBitmapBitLength = 16;
+    // Applicable Components - 1,2,5,8,9
+    std::vector<std::bitset<8>> applicableComponentsBitfield{0x93, 0x01};
+    // ComponentImageSetVersionString
+    constexpr std::string_view imageSetVersionStr{"VersionString1"};
+    // Initial descriptor - UUID
+    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
+        0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
+        0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
+    constexpr uint16_t fwDevicePkgDataLen = 2;
+    // FirmwareDevicePackageData
+    constexpr std::array<uint8_t, fwDevicePkgDataLen> fwDevicePkgData{0xab,
+                                                                      0xcd};
+    // Size of the firmware device ID record
+    constexpr uint16_t recordLen =
+        sizeof(pldm_firmware_device_id_record) +
+        (componentBitmapBitLength / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) +
+        imageSetVersionStr.size() + sizeof(pldm_descriptor_tlv) - 1 +
+        uuid.size() + fwDevicePkgData.size();
+    // Firmware device ID record
+    constexpr std::array<uint8_t, recordLen> record{
+        0x31, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x02,
+        0x00, 0x93, 0x01, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+        0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x02, 0x00, 0x10,
+        0x00, 0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, 0xa0,
+        0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b, 0xab, 0xcd};
+
+    pldm_firmware_device_id_record deviceIdRecHeader{};
+    variable_field applicableComponents{};
+    variable_field outCompImageSetVersionStr{};
+    variable_field recordDescriptors{};
+    variable_field outFwDevicePkgData{};
+
+    auto rc = decode_firmware_device_id_record(
+        record.data(), record.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(deviceIdRecHeader.record_length, recordLen);
+    EXPECT_EQ(deviceIdRecHeader.descriptor_count, descriptorCount);
+    EXPECT_EQ(deviceIdRecHeader.device_update_option_flags.value,
+              deviceUpdateFlag);
+    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_type,
+              PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_length,
+              imageSetVersionStr.size());
+    EXPECT_EQ(deviceIdRecHeader.fw_device_pkg_data_length, fwDevicePkgDataLen);
+
+    EXPECT_EQ(applicableComponents.length, applicableComponentsBitfield.size());
+    EXPECT_EQ(true,
+              std::equal(applicableComponents.ptr,
+                         applicableComponents.ptr + applicableComponents.length,
+                         applicableComponentsBitfield.begin(),
+                         applicableComponentsBitfield.end()));
+
+    EXPECT_EQ(outCompImageSetVersionStr.length, imageSetVersionStr.size());
+    std::string compImageSetVersionStr(
+        reinterpret_cast<const char*>(outCompImageSetVersionStr.ptr),
+        outCompImageSetVersionStr.length);
+    EXPECT_EQ(compImageSetVersionStr, imageSetVersionStr);
+
+    uint16_t descriptorType = 0;
+    uint16_t descriptorLen = 0;
+    variable_field descriptorData{};
+    // DescriptorCount is 1, so decode_descriptor_type_length_value called once
+    rc = decode_descriptor_type_length_value(recordDescriptors.ptr,
+                                             recordDescriptors.length,
+                                             &descriptorType, &descriptorData);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(recordDescriptors.length, sizeof(descriptorType) +
+                                            sizeof(descriptorLen) +
+                                            descriptorData.length);
+    EXPECT_EQ(descriptorType, PLDM_FWUP_UUID);
+    EXPECT_EQ(descriptorData.length, PLDM_FWUP_UUID_LENGTH);
+    EXPECT_EQ(true, std::equal(descriptorData.ptr,
+                               descriptorData.ptr + descriptorData.length,
+                               uuid.begin(), uuid.end()));
+
+    EXPECT_EQ(outFwDevicePkgData.length, fwDevicePkgData.size());
+    EXPECT_EQ(true,
+              std::equal(outFwDevicePkgData.ptr,
+                         outFwDevicePkgData.ptr + outFwDevicePkgData.length,
+                         fwDevicePkgData.begin(), fwDevicePkgData.end()));
+}
+
+TEST(DecodeFirmwareDeviceIdRecord, goodPathNofwDevicePkgData)
+{
+    constexpr uint8_t descriptorCount = 1;
+    // Continue component updates after failure
+    constexpr std::bitset<32> deviceUpdateFlag{1};
+    constexpr uint16_t componentBitmapBitLength = 8;
+    // Applicable Components - 1,2
+    std::vector<std::bitset<8>> applicableComponentsBitfield{0x03};
+    // ComponentImageSetVersionString
+    constexpr std::string_view imageSetVersionStr{"VersionString1"};
+    // Initial descriptor - UUID
+    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
+        0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
+        0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
+    constexpr uint16_t fwDevicePkgDataLen = 0;
+
+    // Size of the firmware device ID record
+    constexpr uint16_t recordLen =
+        sizeof(pldm_firmware_device_id_record) +
+        (componentBitmapBitLength / PLDM_FWUP_COMPONENT_BITMAP_MULTIPLE) +
+        imageSetVersionStr.size() +
+        sizeof(pldm_descriptor_tlv().descriptor_type) +
+        sizeof(pldm_descriptor_tlv().descriptor_length) + uuid.size() +
+        fwDevicePkgDataLen;
+    // Firmware device ID record
+    constexpr std::array<uint8_t, recordLen> record{
+        0x2e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x00, 0x03,
+        0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e,
+        0x67, 0x31, 0x02, 0x00, 0x10, 0x00, 0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d,
+        0x47, 0x18, 0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
+
+    pldm_firmware_device_id_record deviceIdRecHeader{};
+    variable_field applicableComponents{};
+    variable_field outCompImageSetVersionStr{};
+    variable_field recordDescriptors{};
+    variable_field outFwDevicePkgData{};
+
+    auto rc = decode_firmware_device_id_record(
+        record.data(), record.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(deviceIdRecHeader.record_length, recordLen);
+    EXPECT_EQ(deviceIdRecHeader.descriptor_count, descriptorCount);
+    EXPECT_EQ(deviceIdRecHeader.device_update_option_flags.value,
+              deviceUpdateFlag);
+    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_type,
+              PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(deviceIdRecHeader.comp_image_set_version_string_length,
+              imageSetVersionStr.size());
+    EXPECT_EQ(deviceIdRecHeader.fw_device_pkg_data_length, 0);
+
+    EXPECT_EQ(applicableComponents.length, applicableComponentsBitfield.size());
+    EXPECT_EQ(true,
+              std::equal(applicableComponents.ptr,
+                         applicableComponents.ptr + applicableComponents.length,
+                         applicableComponentsBitfield.begin(),
+                         applicableComponentsBitfield.end()));
+
+    EXPECT_EQ(outCompImageSetVersionStr.length, imageSetVersionStr.size());
+    std::string compImageSetVersionStr(
+        reinterpret_cast<const char*>(outCompImageSetVersionStr.ptr),
+        outCompImageSetVersionStr.length);
+    EXPECT_EQ(compImageSetVersionStr, imageSetVersionStr);
+
+    uint16_t descriptorType = 0;
+    uint16_t descriptorLen = 0;
+    variable_field descriptorData{};
+    // DescriptorCount is 1, so decode_descriptor_type_length_value called once
+    rc = decode_descriptor_type_length_value(recordDescriptors.ptr,
+                                             recordDescriptors.length,
+                                             &descriptorType, &descriptorData);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(recordDescriptors.length, sizeof(descriptorType) +
+                                            sizeof(descriptorLen) +
+                                            descriptorData.length);
+    EXPECT_EQ(descriptorType, PLDM_FWUP_UUID);
+    EXPECT_EQ(descriptorData.length, PLDM_FWUP_UUID_LENGTH);
+    EXPECT_EQ(true, std::equal(descriptorData.ptr,
+                               descriptorData.ptr + descriptorData.length,
+                               uuid.begin(), uuid.end()));
+
+    EXPECT_EQ(outFwDevicePkgData.ptr, nullptr);
+    EXPECT_EQ(outFwDevicePkgData.length, 0);
+}
+
+TEST(DecodeFirmwareDeviceIdRecord, ErrorPaths)
+{
+    constexpr uint16_t componentBitmapBitLength = 8;
+    // Invalid ComponentImageSetVersionStringType
+    constexpr std::array<uint8_t, 11> invalidRecord1{
+        0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x00};
+
+    int rc = 0;
+    pldm_firmware_device_id_record deviceIdRecHeader{};
+    variable_field applicableComponents{};
+    variable_field outCompImageSetVersionStr{};
+    variable_field recordDescriptors{};
+    variable_field outFwDevicePkgData{};
+
+    rc = decode_firmware_device_id_record(
+        nullptr, invalidRecord1.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
+        nullptr, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, nullptr, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, nullptr, &recordDescriptors,
+        &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        nullptr, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size() - 1,
+        componentBitmapBitLength, &deviceIdRecHeader, &applicableComponents,
+        &outCompImageSetVersionStr, &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(),
+        componentBitmapBitLength + 1, &deviceIdRecHeader, &applicableComponents,
+        &outCompImageSetVersionStr, &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_firmware_device_id_record(
+        invalidRecord1.data(), invalidRecord1.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid ComponentImageSetVersionStringLength
+    constexpr std::array<uint8_t, 11> invalidRecord2{
+        0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
+    rc = decode_firmware_device_id_record(
+        invalidRecord2.data(), invalidRecord2.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // invalidRecord3 size is less than RecordLength
+    constexpr std::array<uint8_t, 11> invalidRecord3{
+        0x2e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x00};
+    rc = decode_firmware_device_id_record(
+        invalidRecord3.data(), invalidRecord3.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    // RecordLength is less than the calculated RecordLength
+    constexpr std::array<uint8_t, 11> invalidRecord4{
+        0x15, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x02, 0x00};
+    rc = decode_firmware_device_id_record(
+        invalidRecord4.data(), invalidRecord4.size(), componentBitmapBitLength,
+        &deviceIdRecHeader, &applicableComponents, &outCompImageSetVersionStr,
+        &recordDescriptors, &outFwDevicePkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(DecodeDescriptors, goodPath3Descriptors)
+{
+    // In the descriptor data there are 3 descriptor entries
+    // 1) IANA enterprise ID
+    constexpr std::array<uint8_t, PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH> iana{
+        0x0a, 0x0b, 0x0c, 0xd};
+    // 2) UUID
+    constexpr std::array<uint8_t, PLDM_FWUP_UUID_LENGTH> uuid{
+        0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
+        0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b};
+    // 3) Vendor Defined
+    constexpr std::string_view vendorTitle{"OpenBMC"};
+    constexpr size_t vendorDescriptorLen = 2;
+    constexpr std::array<uint8_t, vendorDescriptorLen> vendorDescriptorData{
+        0x01, 0x02};
+
+    constexpr size_t vendorDefinedDescriptorLen =
+        sizeof(pldm_vendor_defined_descriptor_title_data()
+                   .vendor_defined_descriptor_title_str_type) +
+        sizeof(pldm_vendor_defined_descriptor_title_data()
+                   .vendor_defined_descriptor_title_str_len) +
+        vendorTitle.size() + vendorDescriptorData.size();
+
+    constexpr size_t descriptorsLength =
+        3 * (sizeof(pldm_descriptor_tlv().descriptor_type) +
+             sizeof(pldm_descriptor_tlv().descriptor_length)) +
+        iana.size() + uuid.size() + vendorDefinedDescriptorLen;
+
+    constexpr std::array<uint8_t, descriptorsLength> descriptors{
+        0x01, 0x00, 0x04, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x02, 0x00, 0x10,
+        0x00, 0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, 0xa0, 0x30,
+        0xfc, 0x8a, 0x56, 0x58, 0x7d, 0x5b, 0xFF, 0xFF, 0x0B, 0x00, 0x01,
+        0x07, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x01, 0x02};
+
+    size_t descriptorCount = 1;
+    size_t descriptorsRemainingLength = descriptorsLength;
+    int rc = 0;
+
+    while (descriptorsRemainingLength && (descriptorCount <= 3))
+    {
+        uint16_t descriptorType = 0;
+        uint16_t descriptorLen = 0;
+        variable_field descriptorData{};
+
+        rc = decode_descriptor_type_length_value(
+            descriptors.data() + descriptorsLength - descriptorsRemainingLength,
+            descriptorsRemainingLength, &descriptorType, &descriptorData);
+        EXPECT_EQ(rc, PLDM_SUCCESS);
+
+        if (descriptorCount == 1)
+        {
+            EXPECT_EQ(descriptorType, PLDM_FWUP_IANA_ENTERPRISE_ID);
+            EXPECT_EQ(descriptorData.length,
+                      PLDM_FWUP_IANA_ENTERPRISE_ID_LENGTH);
+            EXPECT_EQ(true,
+                      std::equal(descriptorData.ptr,
+                                 descriptorData.ptr + descriptorData.length,
+                                 iana.begin(), iana.end()));
+        }
+        else if (descriptorCount == 2)
+        {
+            EXPECT_EQ(descriptorType, PLDM_FWUP_UUID);
+            EXPECT_EQ(descriptorData.length, PLDM_FWUP_UUID_LENGTH);
+            EXPECT_EQ(true,
+                      std::equal(descriptorData.ptr,
+                                 descriptorData.ptr + descriptorData.length,
+                                 uuid.begin(), uuid.end()));
+        }
+        else if (descriptorCount == 3)
+        {
+            EXPECT_EQ(descriptorType, PLDM_FWUP_VENDOR_DEFINED);
+            EXPECT_EQ(descriptorData.length, vendorDefinedDescriptorLen);
+
+            uint8_t descriptorTitleStrType = 0;
+            variable_field descriptorTitleStr{};
+            variable_field vendorDefinedDescriptorData{};
+
+            rc = decode_vendor_defined_descriptor_value(
+                descriptorData.ptr, descriptorData.length,
+                &descriptorTitleStrType, &descriptorTitleStr,
+                &vendorDefinedDescriptorData);
+            EXPECT_EQ(rc, PLDM_SUCCESS);
+
+            EXPECT_EQ(descriptorTitleStrType, PLDM_STR_TYPE_ASCII);
+            EXPECT_EQ(descriptorTitleStr.length, vendorTitle.size());
+            std::string vendorTitleStr(
+                reinterpret_cast<const char*>(descriptorTitleStr.ptr),
+                descriptorTitleStr.length);
+            EXPECT_EQ(vendorTitleStr, vendorTitle);
+
+            EXPECT_EQ(vendorDefinedDescriptorData.length,
+                      vendorDescriptorData.size());
+            EXPECT_EQ(true, std::equal(vendorDefinedDescriptorData.ptr,
+                                       vendorDefinedDescriptorData.ptr +
+                                           vendorDefinedDescriptorData.length,
+                                       vendorDescriptorData.begin(),
+                                       vendorDescriptorData.end()));
+        }
+
+        descriptorsRemainingLength -= sizeof(descriptorType) +
+                                      sizeof(descriptorLen) +
+                                      descriptorData.length;
+        descriptorCount++;
+    }
+}
+
+TEST(DecodeDescriptors, errorPathDecodeDescriptorTLV)
+{
+    int rc = 0;
+    // IANA Enterprise ID descriptor length incorrect
+    constexpr std::array<uint8_t, 7> invalidIANADescriptor1{
+        0x01, 0x00, 0x03, 0x00, 0x0a, 0x0b, 0x0c};
+    uint16_t descriptorType = 0;
+    variable_field descriptorData{};
+
+    rc = decode_descriptor_type_length_value(nullptr,
+                                             invalidIANADescriptor1.size(),
+                                             &descriptorType, &descriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
+                                             invalidIANADescriptor1.size(),
+                                             nullptr, &descriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
+                                             invalidIANADescriptor1.size(),
+                                             &descriptorType, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_descriptor_type_length_value(
+        invalidIANADescriptor1.data(), PLDM_FWUP_DEVICE_DESCRIPTOR_MIN_LEN - 1,
+        &descriptorType, &descriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_descriptor_type_length_value(invalidIANADescriptor1.data(),
+                                             invalidIANADescriptor1.size(),
+                                             &descriptorType, &descriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    // IANA Enterprise ID descriptor data less than length
+    std::array<uint8_t, 7> invalidIANADescriptor2{0x01, 0x00, 0x04, 0x00,
+                                                  0x0a, 0x0b, 0x0c};
+    rc = decode_descriptor_type_length_value(invalidIANADescriptor2.data(),
+                                             invalidIANADescriptor2.size(),
+                                             &descriptorType, &descriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(DecodeDescriptors, errorPathVendorDefinedDescriptor)
+{
+    int rc = 0;
+    // VendorDefinedDescriptorTitleStringType is invalid
+    constexpr std::array<uint8_t, 9> invalidVendorDescriptor1{
+        0x06, 0x07, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43};
+    uint8_t descriptorStringType = 0;
+    variable_field descriptorTitleStr{};
+    variable_field vendorDefinedDescriptorData{};
+
+    rc = decode_vendor_defined_descriptor_value(
+        nullptr, invalidVendorDescriptor1.size(), &descriptorStringType,
+        &descriptorTitleStr, &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
+        &descriptorStringType, &descriptorTitleStr,
+        &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
+        nullptr, &descriptorTitleStr, &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
+        &descriptorStringType, nullptr, &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
+        &descriptorStringType, &descriptorTitleStr, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor1.data(),
+        sizeof(pldm_vendor_defined_descriptor_title_data) - 1,
+        &descriptorStringType, &descriptorTitleStr,
+        &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor1.data(), invalidVendorDescriptor1.size(),
+        &descriptorStringType, &descriptorTitleStr,
+        &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // VendorDefinedDescriptorTitleStringLength is 0
+    std::array<uint8_t, 9> invalidVendorDescriptor2{
+        0x01, 0x00, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43};
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor2.data(), invalidVendorDescriptor2.size(),
+        &descriptorStringType, &descriptorTitleStr,
+        &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // VendorDefinedDescriptorData not present in the data
+    std::array<uint8_t, 9> invalidVendorDescriptor3{
+        0x01, 0x07, 0x4f, 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43};
+    rc = decode_vendor_defined_descriptor_value(
+        invalidVendorDescriptor3.data(), invalidVendorDescriptor3.size(),
+        &descriptorStringType, &descriptorTitleStr,
+        &vendorDefinedDescriptorData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(DecodeComponentImageInfo, goodPath)
+{
+    // Firmware
+    constexpr uint16_t compClassification = 16;
+    constexpr uint16_t compIdentifier = 300;
+    constexpr uint32_t compComparisonStamp = 0xFFFFFFFF;
+    // Force update
+    constexpr std::bitset<16> compOptions{1};
+    // System reboot[Bit position 3] & Medium-specific reset[Bit position 2]
+    constexpr std::bitset<16> reqCompActivationMethod{0x0c};
+    // Random ComponentLocationOffset
+    constexpr uint32_t compLocOffset = 357;
+    // Random ComponentSize
+    constexpr uint32_t compSize = 27;
+    // ComponentVersionString
+    constexpr std::string_view compVersionStr{"VersionString1"};
+    constexpr size_t compImageInfoSize =
+        sizeof(pldm_component_image_information) + compVersionStr.size();
+
+    constexpr std::array<uint8_t, compImageInfoSize> compImageInfo{
+        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
+        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
+        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
+    pldm_component_image_information outCompImageInfo{};
+    variable_field outCompVersionStr{};
+
+    auto rc =
+        decode_pldm_comp_image_info(compImageInfo.data(), compImageInfo.size(),
+                                    &outCompImageInfo, &outCompVersionStr);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outCompImageInfo.comp_classification, compClassification);
+    EXPECT_EQ(outCompImageInfo.comp_identifier, compIdentifier);
+    EXPECT_EQ(outCompImageInfo.comp_comparison_stamp, compComparisonStamp);
+    EXPECT_EQ(outCompImageInfo.comp_options.value, compOptions);
+    EXPECT_EQ(outCompImageInfo.requested_comp_activation_method.value,
+              reqCompActivationMethod);
+    EXPECT_EQ(outCompImageInfo.comp_location_offset, compLocOffset);
+    EXPECT_EQ(outCompImageInfo.comp_size, compSize);
+    EXPECT_EQ(outCompImageInfo.comp_version_string_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(outCompImageInfo.comp_version_string_length,
+              compVersionStr.size());
+
+    EXPECT_EQ(outCompVersionStr.length,
+              outCompImageInfo.comp_version_string_length);
+    std::string componentVersionString(
+        reinterpret_cast<const char*>(outCompVersionStr.ptr),
+        outCompVersionStr.length);
+    EXPECT_EQ(componentVersionString, compVersionStr);
+}
+
+TEST(DecodeComponentImageInfo, errorPaths)
+{
+    int rc = 0;
+    // ComponentVersionString
+    constexpr std::string_view compVersionStr{"VersionString1"};
+    constexpr size_t compImageInfoSize =
+        sizeof(pldm_component_image_information) + compVersionStr.size();
+    // Invalid ComponentVersionStringType - 0x06
+    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo1{
+        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
+        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x56, 0x65,
+        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
+    pldm_component_image_information outCompImageInfo{};
+    variable_field outCompVersionStr{};
+
+    rc = decode_pldm_comp_image_info(nullptr, invalidCompImageInfo1.size(),
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
+                                     invalidCompImageInfo1.size(), nullptr,
+                                     &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
+                                     invalidCompImageInfo1.size(),
+                                     &outCompImageInfo, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
+                                     sizeof(pldm_component_image_information) -
+                                         1,
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo1.data(),
+                                     invalidCompImageInfo1.size(),
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid ComponentVersionStringLength - 0x00
+    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo2{
+        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
+        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0x65,
+        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo2.data(),
+                                     invalidCompImageInfo2.size(),
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Use Component Comparison Stamp is not set, but ComponentComparisonStamp
+    // is not 0xFFFFFFFF
+    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo3{
+        0x10, 0x00, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00,
+        0x65, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
+        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
+
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo3.data(),
+                                     invalidCompImageInfo3.size() - 1,
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo3.data(),
+                                     invalidCompImageInfo3.size(),
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid ComponentLocationOffset - 0
+    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo4{
+        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
+        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo4.data(),
+                                     invalidCompImageInfo4.size(),
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid ComponentSize - 0
+    constexpr std::array<uint8_t, compImageInfoSize> invalidCompImageInfo5{
+        0x10, 0x00, 0x2c, 0x01, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x0c, 0x00,
+        0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x56, 0x65,
+        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31};
+    rc = decode_pldm_comp_image_info(invalidCompImageInfo5.data(),
+                                     invalidCompImageInfo5.size(),
+                                     &outCompImageInfo, &outCompVersionStr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(QueryDeviceIdentifiers, goodPathEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr)> requestMsg{};
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    uint8_t instanceId = 0x01;
+
+    auto rc = encode_query_device_identifiers_req(
+        instanceId, PLDM_QUERY_DEVICE_IDENTIFIERS_REQ_BYTES, requestPtr);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
+    EXPECT_EQ(requestPtr->hdr.instance_id, instanceId);
+    EXPECT_EQ(requestPtr->hdr.type, PLDM_FWUP);
+    EXPECT_EQ(requestPtr->hdr.command, PLDM_QUERY_DEVICE_IDENTIFIERS);
+}
+
+TEST(QueryDeviceIdentifiers, goodPathDecodeResponse)
+{
+    // descriptorDataLen is not fixed here taking it as 6
+    constexpr uint8_t descriptorDataLen = 6;
+    std::array<uint8_t, hdrSize +
+                            sizeof(struct pldm_query_device_identifiers_resp) +
+                            descriptorDataLen>
+        responseMsg{};
+    auto inResp = reinterpret_cast<struct pldm_query_device_identifiers_resp*>(
+        responseMsg.data() + hdrSize);
+
+    inResp->completion_code = PLDM_SUCCESS;
+    inResp->device_identifiers_len = htole32(descriptorDataLen);
+    inResp->descriptor_count = 1;
+
+    // filling descriptor data
+    std::fill_n(responseMsg.data() + hdrSize +
+                    sizeof(struct pldm_query_device_identifiers_resp),
+                descriptorDataLen, 0xFF);
+
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    uint8_t completionCode = PLDM_SUCCESS;
+    uint32_t deviceIdentifiersLen = 0;
+    uint8_t descriptorCount = 0;
+    uint8_t* outDescriptorData = nullptr;
+
+    auto rc = decode_query_device_identifiers_resp(
+        response, responseMsg.size() - hdrSize, &completionCode,
+        &deviceIdentifiersLen, &descriptorCount, &outDescriptorData);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(deviceIdentifiersLen, inResp->device_identifiers_len);
+    EXPECT_EQ(descriptorCount, inResp->descriptor_count);
+    EXPECT_EQ(true,
+              std::equal(outDescriptorData,
+                         outDescriptorData + deviceIdentifiersLen,
+                         responseMsg.begin() + hdrSize +
+                             sizeof(struct pldm_query_device_identifiers_resp),
+                         responseMsg.end()));
+}
+
+TEST(GetFirmwareParameters, goodPathEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr)> requestMsg{};
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    uint8_t instanceId = 0x01;
+
+    auto rc = encode_get_firmware_parameters_req(
+        instanceId, PLDM_GET_FIRMWARE_PARAMETERS_REQ_BYTES, requestPtr);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
+    EXPECT_EQ(requestPtr->hdr.instance_id, instanceId);
+    EXPECT_EQ(requestPtr->hdr.type, PLDM_FWUP);
+    EXPECT_EQ(requestPtr->hdr.command, PLDM_GET_FIRMWARE_PARAMETERS);
+}
+
+TEST(GetFirmwareParameters, decodeResponse)
+{
+    // CapabilitiesDuringUpdate of the firmware device
+    // Firmware device downgrade restrictions [Bit position 8] &
+    // Firmware Device Partial Updates [Bit position 3]
+    constexpr std::bitset<32> fdCapabilities{0x00000104};
+    constexpr uint16_t compCount = 1;
+    constexpr std::string_view activeCompImageSetVersion{"VersionString1"};
+    constexpr std::string_view pendingCompImageSetVersion{"VersionString2"};
+
+    // constexpr uint16_t compClassification = 16;
+    // constexpr uint16_t compIdentifier = 300;
+    // constexpr uint8_t compClassificationIndex = 20;
+    // constexpr uint32_t activeCompComparisonStamp = 0xABCDEFAB;
+    // constexpr std::array<uint8_t, 8> activeComponentReleaseData = {
+    //     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
+    // constexpr uint32_t pendingCompComparisonStamp = 0x12345678;
+    // constexpr std::array<uint8_t, 8> pendingComponentReleaseData = {
+    //     0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01};
+    constexpr std::string_view activeCompVersion{"VersionString3"};
+    constexpr std::string_view pendingCompVersion{"VersionString4"};
+    // ComponentActivationMethods
+    // DC Power cycle [Bit position 4] & Self-Contained[Bit position 2]
+    constexpr std::bitset<16> compActivationMethod{0x12};
+    // CapabilitiesDuringUpdate of the firmware component
+    // Component downgrade capability [Bit position 2]
+    constexpr std::bitset<32> compCapabilities{0x02};
+
+    constexpr size_t compParamTableSize =
+        sizeof(pldm_component_parameter_entry) + activeCompVersion.size() +
+        pendingCompVersion.size();
+
+    constexpr std::array<uint8_t, compParamTableSize> compParamTable{
+        0x10, 0x00, 0x2c, 0x01, 0x14, 0xAB, 0xEF, 0xCD, 0xAB, 0x01, 0x0e, 0x01,
+        0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x78, 0x56, 0x34, 0x12, 0x01,
+        0x0e, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x12, 0x00, 0x02,
+        0x00, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74,
+        0x72, 0x69, 0x6e, 0x67, 0x33, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+        0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x34};
+
+    constexpr size_t getFwParamsPayloadLen =
+        sizeof(pldm_get_firmware_parameters_resp) +
+        activeCompImageSetVersion.size() + pendingCompImageSetVersion.size() +
+        compParamTableSize;
+
+    constexpr std::array<uint8_t, hdrSize + getFwParamsPayloadLen>
+        getFwParamsResponse{
+            0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01,
+            0x0e, 0x01, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53,
+            0x74, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x56, 0x65, 0x72, 0x73, 0x69,
+            0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x10, 0x00,
+            0x2c, 0x01, 0x14, 0xAB, 0xEF, 0xCD, 0xAB, 0x01, 0x0e, 0x01, 0x02,
+            0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x78, 0x56, 0x34, 0x12, 0x01,
+            0x0e, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x12, 0x00,
+            0x02, 0x00, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+            0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x33, 0x56, 0x65, 0x72, 0x73,
+            0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x34};
+
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
+    pldm_get_firmware_parameters_resp outResp{};
+    variable_field outActiveCompImageSetVersion{};
+    variable_field outPendingCompImageSetVersion{};
+    variable_field outCompParameterTable{};
+
+    auto rc = decode_get_firmware_parameters_resp(
+        responseMsg, getFwParamsPayloadLen, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.completion_code, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.capabilities_during_update.value, fdCapabilities);
+    EXPECT_EQ(outResp.comp_count, compCount);
+    EXPECT_EQ(outResp.active_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(outResp.active_comp_image_set_ver_str_len,
+              activeCompImageSetVersion.size());
+    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_len,
+              pendingCompImageSetVersion.size());
+    std::string activeCompImageSetVersionStr(
+        reinterpret_cast<const char*>(outActiveCompImageSetVersion.ptr),
+        outActiveCompImageSetVersion.length);
+    EXPECT_EQ(activeCompImageSetVersionStr, activeCompImageSetVersion);
+    std::string pendingCompImageSetVersionStr(
+        reinterpret_cast<const char*>(outPendingCompImageSetVersion.ptr),
+        outPendingCompImageSetVersion.length);
+    EXPECT_EQ(pendingCompImageSetVersionStr, pendingCompImageSetVersion);
+    EXPECT_EQ(outCompParameterTable.length, compParamTableSize);
+    EXPECT_EQ(true, std::equal(outCompParameterTable.ptr,
+                               outCompParameterTable.ptr +
+                                   outCompParameterTable.length,
+                               compParamTable.begin(), compParamTable.end()));
+}
+
+TEST(GetFirmwareParameters, decodeResponseZeroCompCount)
+{
+    // CapabilitiesDuringUpdate of the firmware device
+    // FD Host Functionality during Firmware Update [Bit position 2] &
+    // Component Update Failure Retry Capability [Bit position 1]
+    constexpr std::bitset<32> fdCapabilities{0x06};
+    constexpr uint16_t compCount = 0;
+    constexpr std::string_view activeCompImageSetVersion{"VersionString1"};
+    constexpr std::string_view pendingCompImageSetVersion{"VersionString2"};
+
+    constexpr size_t getFwParamsPayloadLen =
+        sizeof(pldm_get_firmware_parameters_resp) +
+        activeCompImageSetVersion.size() + pendingCompImageSetVersion.size();
+
+    constexpr std::array<uint8_t, hdrSize + getFwParamsPayloadLen>
+        getFwParamsResponse{
+            0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+            0x0e, 0x01, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53,
+            0x74, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x56, 0x65, 0x72, 0x73, 0x69,
+            0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32};
+
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
+    pldm_get_firmware_parameters_resp outResp{};
+    variable_field outActiveCompImageSetVersion{};
+    variable_field outPendingCompImageSetVersion{};
+    variable_field outCompParameterTable{};
+
+    auto rc = decode_get_firmware_parameters_resp(
+        responseMsg, getFwParamsPayloadLen, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.completion_code, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.capabilities_during_update.value, fdCapabilities);
+    EXPECT_EQ(outResp.comp_count, compCount);
+    EXPECT_EQ(outResp.active_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(outResp.active_comp_image_set_ver_str_len,
+              activeCompImageSetVersion.size());
+    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_len,
+              pendingCompImageSetVersion.size());
+    std::string activeCompImageSetVersionStr(
+        reinterpret_cast<const char*>(outActiveCompImageSetVersion.ptr),
+        outActiveCompImageSetVersion.length);
+    EXPECT_EQ(activeCompImageSetVersionStr, activeCompImageSetVersion);
+    std::string pendingCompImageSetVersionStr(
+        reinterpret_cast<const char*>(outPendingCompImageSetVersion.ptr),
+        outPendingCompImageSetVersion.length);
+    EXPECT_EQ(pendingCompImageSetVersionStr, pendingCompImageSetVersion);
+    EXPECT_EQ(outCompParameterTable.ptr, nullptr);
+    EXPECT_EQ(outCompParameterTable.length, 0);
+}
+
+TEST(GetFirmwareParameters,
+     decodeResponseNoPendingCompImageVersionStrZeroCompCount)
+{
+    // CapabilitiesDuringUpdate of the firmware device
+    // FD Host Functionality during Firmware Update [Bit position 2] &
+    // Component Update Failure Retry Capability [Bit position 1]
+    constexpr std::bitset<32> fdCapabilities{0x06};
+    constexpr uint16_t compCount = 0;
+    constexpr std::string_view activeCompImageSetVersion{"VersionString"};
+
+    constexpr size_t getFwParamsPayloadLen =
+        sizeof(pldm_get_firmware_parameters_resp) +
+        activeCompImageSetVersion.size();
+
+    constexpr std::array<uint8_t, hdrSize + getFwParamsPayloadLen>
+        getFwParamsResponse{0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+                            0x00, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00,
+                            0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+                            0x53, 0x74, 0x72, 0x69, 0x6e, 0x67};
+
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
+    pldm_get_firmware_parameters_resp outResp{};
+    variable_field outActiveCompImageSetVersion{};
+    variable_field outPendingCompImageSetVersion{};
+    variable_field outCompParameterTable{};
+
+    auto rc = decode_get_firmware_parameters_resp(
+        responseMsg, getFwParamsPayloadLen, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.completion_code, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.capabilities_during_update.value, fdCapabilities);
+    EXPECT_EQ(outResp.comp_count, compCount);
+    EXPECT_EQ(outResp.active_comp_image_set_ver_str_type, PLDM_STR_TYPE_ASCII);
+    EXPECT_EQ(outResp.active_comp_image_set_ver_str_len,
+              activeCompImageSetVersion.size());
+    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_type,
+              PLDM_STR_TYPE_UNKNOWN);
+    EXPECT_EQ(outResp.pending_comp_image_set_ver_str_len, 0);
+    std::string activeCompImageSetVersionStr(
+        reinterpret_cast<const char*>(outActiveCompImageSetVersion.ptr),
+        outActiveCompImageSetVersion.length);
+    EXPECT_EQ(activeCompImageSetVersionStr, activeCompImageSetVersion);
+    EXPECT_EQ(outPendingCompImageSetVersion.ptr, nullptr);
+    EXPECT_EQ(outPendingCompImageSetVersion.length, 0);
+    EXPECT_EQ(outCompParameterTable.ptr, nullptr);
+    EXPECT_EQ(outCompParameterTable.length, 0);
+}
+
+TEST(GetFirmwareParameters, decodeResponseErrorCompletionCode)
+{
+    constexpr std::array<uint8_t, hdrSize + sizeof(uint8_t)>
+        getFwParamsResponse{0x00, 0x00, 0x00, 0x01};
+
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(getFwParamsResponse.data());
+    pldm_get_firmware_parameters_resp outResp{};
+    variable_field outActiveCompImageSetVersion{};
+    variable_field outPendingCompImageSetVersion{};
+    variable_field outCompParameterTable{};
+
+    auto rc = decode_get_firmware_parameters_resp(
+        responseMsg, getFwParamsResponse.size(), &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outResp.completion_code, PLDM_ERROR);
+}
+
+TEST(GetFirmwareParameters, errorPathdecodeResponse)
+{
+    int rc = 0;
+    // Invalid ActiveComponentImageSetVersionStringType
+    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse1{
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x00};
+
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse1.data());
+    pldm_get_firmware_parameters_resp outResp{};
+    variable_field outActiveCompImageSetVersion{};
+    variable_field outPendingCompImageSetVersion{};
+    variable_field outCompParameterTable{};
+
+    rc = decode_get_firmware_parameters_resp(
+        nullptr, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, nullptr,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
+        nullptr, &outPendingCompImageSetVersion, &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, nullptr, &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, 0, &outResp, &outActiveCompImageSetVersion,
+        &outPendingCompImageSetVersion, &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse1.size() - 1 - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse1.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid ActiveComponentImageSetVersionStringLength
+    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse2{
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
+    responseMsg =
+        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse2.data());
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse2.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid PendingComponentImageSetVersionStringType &
+    // PendingComponentImageSetVersionStringLength
+    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse3{
+        0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x00};
+    responseMsg =
+        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse3.data());
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse3.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Invalid PendingComponentImageSetVersionStringType &
+    // PendingComponentImageSetVersionStringLength
+    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse4{
+        0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x01, 0x0e, 0x06, 0x0e};
+    responseMsg =
+        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse4.data());
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse4.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Total payload length less than expected
+    constexpr std::array<uint8_t, 14> invalidGetFwParamsResponse5{
+        0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x0e};
+    responseMsg =
+        reinterpret_cast<const pldm_msg*>(invalidGetFwParamsResponse5.data());
+    rc = decode_get_firmware_parameters_resp(
+        responseMsg, invalidGetFwParamsResponse5.size() - hdrSize, &outResp,
+        &outActiveCompImageSetVersion, &outPendingCompImageSetVersion,
+        &outCompParameterTable);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(GetFirmwareParameters, goodPathDecodeComponentParameterEntry)
+{
+    // Random value for component classification
+    constexpr uint16_t compClassification = 0x0A0B;
+    // Random value for component classification
+    constexpr uint16_t compIdentifier = 0x0C0D;
+    // Random value for component classification
+    constexpr uint32_t timestamp = 0X12345678;
+    // Random value for component activation methods
+    constexpr uint16_t compActivationMethods = 0xBBDD;
+    // Random value for capabilities during update
+    constexpr uint32_t capabilitiesDuringUpdate = 0xBADBEEFE;
+
+    // ActiveCompImageSetVerStrLen is not fixed here taking it as 8
+    constexpr uint8_t activeCompVerStrLen = 8;
+    // PendingCompImageSetVerStrLen is not fixed here taking it as 8
+    constexpr uint8_t pendingCompVerStrLen = 8;
+    constexpr size_t entryLength =
+        sizeof(struct pldm_component_parameter_entry) + activeCompVerStrLen +
+        pendingCompVerStrLen;
+    std::array<uint8_t, entryLength> entry{};
+
+    auto inEntry =
+        reinterpret_cast<struct pldm_component_parameter_entry*>(entry.data());
+
+    inEntry->comp_classification = htole16(compClassification);
+    inEntry->comp_identifier = htole16(compIdentifier);
+    inEntry->comp_classification_index = 0x0F;
+    inEntry->active_comp_comparison_stamp = htole32(timestamp);
+    inEntry->active_comp_ver_str_type = 1;
+    inEntry->active_comp_ver_str_len = activeCompVerStrLen;
+    std::fill_n(inEntry->active_comp_release_date,
+                sizeof(inEntry->active_comp_release_date), 0xFF);
+    inEntry->pending_comp_comparison_stamp = htole32(timestamp);
+    inEntry->pending_comp_ver_str_type = 1;
+    inEntry->pending_comp_ver_str_len = pendingCompVerStrLen;
+    std::fill_n(inEntry->pending_comp_release_date,
+                sizeof(inEntry->pending_comp_release_date), 0xFF);
+    inEntry->comp_activation_methods.value = htole16(compActivationMethods);
+    inEntry->capabilities_during_update.value =
+        htole32(capabilitiesDuringUpdate);
+    constexpr auto activeCompVerStrPos =
+        sizeof(struct pldm_component_parameter_entry);
+    std::fill_n(entry.data() + activeCompVerStrPos, activeCompVerStrLen, 0xAA);
+    constexpr auto pendingCompVerStrPos =
+        activeCompVerStrPos + activeCompVerStrLen;
+    std::fill_n(entry.data() + pendingCompVerStrPos, pendingCompVerStrLen,
+                0xBB);
+
+    struct pldm_component_parameter_entry outEntry;
+    struct variable_field outActiveCompVerStr;
+    struct variable_field outPendingCompVerStr;
+
+    auto rc = decode_get_firmware_parameters_resp_comp_entry(
+        entry.data(), entryLength, &outEntry, &outActiveCompVerStr,
+        &outPendingCompVerStr);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    EXPECT_EQ(outEntry.comp_classification, compClassification);
+    EXPECT_EQ(outEntry.comp_identifier, compIdentifier);
+    EXPECT_EQ(inEntry->comp_classification_index,
+              outEntry.comp_classification_index);
+    EXPECT_EQ(outEntry.active_comp_comparison_stamp, timestamp);
+    EXPECT_EQ(inEntry->active_comp_ver_str_type,
+              outEntry.active_comp_ver_str_type);
+    EXPECT_EQ(inEntry->active_comp_ver_str_len,
+              outEntry.active_comp_ver_str_len);
+    EXPECT_EQ(0, memcmp(inEntry->active_comp_release_date,
+                        outEntry.active_comp_release_date,
+                        sizeof(inEntry->active_comp_release_date)));
+    EXPECT_EQ(outEntry.pending_comp_comparison_stamp, timestamp);
+    EXPECT_EQ(inEntry->pending_comp_ver_str_type,
+              outEntry.pending_comp_ver_str_type);
+    EXPECT_EQ(inEntry->pending_comp_ver_str_len,
+              outEntry.pending_comp_ver_str_len);
+    EXPECT_EQ(0, memcmp(inEntry->pending_comp_release_date,
+                        outEntry.pending_comp_release_date,
+                        sizeof(inEntry->pending_comp_release_date)));
+    EXPECT_EQ(outEntry.comp_activation_methods.value, compActivationMethods);
+    EXPECT_EQ(outEntry.capabilities_during_update.value,
+              capabilitiesDuringUpdate);
+
+    EXPECT_EQ(0, memcmp(outActiveCompVerStr.ptr,
+                        entry.data() + activeCompVerStrPos,
+                        outActiveCompVerStr.length));
+    EXPECT_EQ(0, memcmp(outPendingCompVerStr.ptr,
+                        entry.data() + pendingCompVerStrPos,
+                        outPendingCompVerStr.length));
+}
+
+TEST(RequestUpdate, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 1;
+    constexpr uint32_t maxTransferSize = 512;
+    constexpr uint16_t numOfComp = 3;
+    constexpr uint8_t maxOutstandingTransferReq = 2;
+    constexpr uint16_t pkgDataLen = 0x1234;
+    constexpr std::string_view compImgSetVerStr = "0penBmcv1.0";
+    constexpr uint8_t compImgSetVerStrLen =
+        static_cast<uint8_t>(compImgSetVerStr.size());
+    variable_field compImgSetVerStrInfo{};
+    compImgSetVerStrInfo.ptr =
+        reinterpret_cast<const uint8_t*>(compImgSetVerStr.data());
+    compImgSetVerStrInfo.length = compImgSetVerStrLen;
+
+    std::array<uint8_t, hdrSize + sizeof(struct pldm_request_update_req) +
+                            compImgSetVerStrLen>
+        request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, requestMsg,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    std::array<uint8_t, hdrSize + sizeof(struct pldm_request_update_req) +
+                            compImgSetVerStrLen>
+        outRequest{0x81, 0x05, 0x10, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00,
+                   0x02, 0x34, 0x12, 0x01, 0x0b, 0x30, 0x70, 0x65, 0x6e,
+                   0x42, 0x6d, 0x63, 0x76, 0x31, 0x2e, 0x30};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(RequestUpdate, errorPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 1;
+    uint32_t maxTransferSize = 512;
+    constexpr uint16_t numOfComp = 3;
+    uint8_t maxOutstandingTransferReq = 2;
+    constexpr uint16_t pkgDataLen = 0x1234;
+    constexpr std::string_view compImgSetVerStr = "0penBmcv1.0";
+    uint8_t compImgSetVerStrLen = static_cast<uint8_t>(compImgSetVerStr.size());
+    variable_field compImgSetVerStrInfo{};
+    compImgSetVerStrInfo.ptr =
+        reinterpret_cast<const uint8_t*>(compImgSetVerStr.data());
+    compImgSetVerStrInfo.length = compImgSetVerStrLen;
+
+    std::array<uint8_t, hdrSize + sizeof(struct pldm_request_update_req) +
+                            compImgSetVerStr.size()>
+        request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen, nullptr,
+        requestMsg,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    compImgSetVerStrInfo.ptr = nullptr;
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, requestMsg,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    compImgSetVerStrInfo.ptr =
+        reinterpret_cast<const uint8_t*>(compImgSetVerStr.data());
+
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, nullptr,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_request_update_req(instanceId, maxTransferSize, numOfComp,
+                                   maxOutstandingTransferReq, pkgDataLen,
+                                   PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+                                   &compImgSetVerStrInfo, requestMsg, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    compImgSetVerStrLen = 0;
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, 0, &compImgSetVerStrInfo, nullptr,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    compImgSetVerStrLen = static_cast<uint8_t>(compImgSetVerStr.size());
+
+    compImgSetVerStrInfo.length = 0xFFFF;
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, nullptr,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    compImgSetVerStrInfo.length = compImgSetVerStrLen;
+
+    maxTransferSize = PLDM_FWUP_BASELINE_TRANSFER_SIZE - 1;
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, nullptr,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    maxTransferSize = PLDM_FWUP_BASELINE_TRANSFER_SIZE;
+
+    maxOutstandingTransferReq = PLDM_FWUP_MIN_OUTSTANDING_REQ - 1;
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_ASCII, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, nullptr,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    maxOutstandingTransferReq = PLDM_FWUP_MIN_OUTSTANDING_REQ;
+
+    rc = encode_request_update_req(
+        instanceId, maxTransferSize, numOfComp, maxOutstandingTransferReq,
+        pkgDataLen, PLDM_STR_TYPE_UNKNOWN, compImgSetVerStrLen,
+        &compImgSetVerStrInfo, nullptr,
+        sizeof(struct pldm_request_update_req) + compImgSetVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(RequestUpdate, goodPathDecodeResponse)
+{
+    constexpr uint16_t fdMetaDataLen = 1024;
+    constexpr uint8_t fdWillSendPkgData = 1;
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_request_update_resp)>
+        requestUpdateResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01};
+
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(requestUpdateResponse1.data());
+    uint8_t outCompletionCode = 0;
+    uint16_t outFdMetaDataLen = 0;
+    uint8_t outFdWillSendPkgData = 0;
+
+    auto rc = decode_request_update_resp(
+        responseMsg1, requestUpdateResponse1.size() - hdrSize,
+        &outCompletionCode, &outFdMetaDataLen, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outCompletionCode, PLDM_SUCCESS);
+    EXPECT_EQ(outFdMetaDataLen, fdMetaDataLen);
+    EXPECT_EQ(outFdWillSendPkgData, fdWillSendPkgData);
+
+    outCompletionCode = 0;
+    outFdMetaDataLen = 0;
+    outFdWillSendPkgData = 0;
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(outCompletionCode)>
+        requestUpdateResponse2{0x00, 0x00, 0x00, 0x81};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(requestUpdateResponse2.data());
+    rc = decode_request_update_resp(
+        responseMsg2, requestUpdateResponse2.size() - hdrSize,
+        &outCompletionCode, &outFdMetaDataLen, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outCompletionCode, PLDM_FWUP_ALREADY_IN_UPDATE_MODE);
+}
+
+TEST(RequestUpdate, errorPathDecodeResponse)
+{
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_request_update_resp) - 1>
+        requestUpdateResponse{0x00, 0x00, 0x00, 0x00, 0x00, 0x04};
+
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(requestUpdateResponse.data());
+    uint8_t outCompletionCode = 0;
+    uint16_t outFdMetaDataLen = 0;
+    uint8_t outFdWillSendPkgData = 0;
+
+    auto rc = decode_request_update_resp(
+        nullptr, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
+        &outFdMetaDataLen, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_update_resp(
+        responseMsg, requestUpdateResponse.size() - hdrSize, nullptr,
+        &outFdMetaDataLen, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_update_resp(
+        responseMsg, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
+        nullptr, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_update_resp(
+        responseMsg, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
+        &outFdMetaDataLen, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_update_resp(responseMsg, 0, &outCompletionCode,
+                                    &outFdMetaDataLen, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_update_resp(
+        responseMsg, requestUpdateResponse.size() - hdrSize, &outCompletionCode,
+        &outFdMetaDataLen, &outFdWillSendPkgData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(PassComponentTable, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 1;
+    constexpr uint16_t compIdentifier = 400;
+    constexpr uint8_t compClassificationIndex = 40;
+    constexpr uint32_t compComparisonStamp = 0x12345678;
+    constexpr std::string_view compVerStr = "0penBmcv1.1";
+    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
+    variable_field compVerStrInfo{};
+    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
+    compVerStrInfo.length = compVerStrLen;
+
+    std::array<uint8_t,
+               hdrSize + sizeof(pldm_pass_component_table_req) + compVerStrLen>
+        request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    std::array<uint8_t,
+               hdrSize + sizeof(pldm_pass_component_table_req) + compVerStrLen>
+        outRequest{0x81, 0x05, 0x13, 0x05, 0x0A, 0x00, 0x90, 0x01, 0x28,
+                   0x78, 0x56, 0x34, 0x12, 0x01, 0x0B, 0x30, 0x70, 0x65,
+                   0x6E, 0x42, 0x6D, 0x63, 0x76, 0x31, 0x2E, 0x31};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(PassComponentTable, errorPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 1;
+    constexpr uint16_t compIdentifier = 400;
+    constexpr uint8_t compClassificationIndex = 40;
+    constexpr uint32_t compComparisonStamp = 0x12345678;
+    constexpr std::string_view compVerStr = "0penBmcv1.1";
+    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
+    variable_field compVerStrInfo{};
+    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
+    compVerStrInfo.length = compVerStrLen;
+
+    std::array<uint8_t,
+               hdrSize + sizeof(pldm_pass_component_table_req) + compVerStrLen>
+        request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, nullptr, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    compVerStrInfo.ptr = nullptr;
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
+
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, &compVerStrInfo, nullptr,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req));
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII, 0,
+        &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen - 1, &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END + 1, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_INVALID_TRANSFER_OPERATION_FLAG);
+
+    rc = encode_pass_component_table_req(
+        instanceId, PLDM_START_AND_END, PLDM_COMP_FIRMWARE, compIdentifier,
+        compClassificationIndex, compComparisonStamp, PLDM_STR_TYPE_UNKNOWN,
+        compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_pass_component_table_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(PassComponentTable, goodPathDecodeResponse)
+{
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp)>
+        passCompTableResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse1.data());
+
+    uint8_t completionCode = 0;
+    uint8_t compResp = 0;
+    uint8_t compRespCode = 0;
+
+    auto rc = decode_pass_component_table_resp(
+        responseMsg1, sizeof(pldm_pass_component_table_resp), &completionCode,
+        &compResp, &compRespCode);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(compResp, PLDM_CR_COMP_CAN_BE_UPDATED);
+    EXPECT_EQ(compRespCode, PLDM_CRC_COMP_COMPARISON_STAMP_IDENTICAL);
+
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp)>
+        passCompTableResponse2{0x00, 0x00, 0x00, 0x00, 0x00, 0xD0};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse2.data());
+    rc = decode_pass_component_table_resp(
+        responseMsg2, sizeof(pldm_pass_component_table_resp), &completionCode,
+        &compResp, &compRespCode);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(compResp, PLDM_CR_COMP_CAN_BE_UPDATED);
+    EXPECT_EQ(compRespCode, PLDM_CRC_VENDOR_COMP_RESP_CODE_RANGE_MIN);
+
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp)>
+        passCompTableResponse3{0x00, 0x00, 0x00, 0x80};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse3.data());
+
+    rc = decode_pass_component_table_resp(
+        responseMsg3, sizeof(pldm_pass_component_table_resp), &completionCode,
+        &compResp, &compRespCode);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_FWUP_NOT_IN_UPDATE_MODE);
+}
+
+TEST(PassComponentTable, errorPathDecodeResponse)
+{
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp) - 1>
+        passCompTableResponse1{0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse1.data());
+
+    uint8_t completionCode = 0;
+    uint8_t compResp = 0;
+    uint8_t compRespCode = 0;
+
+    auto rc = decode_pass_component_table_resp(
+        nullptr, sizeof(pldm_pass_component_table_resp) - 1, &completionCode,
+        &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pass_component_table_resp(
+        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1, nullptr,
+        &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pass_component_table_resp(
+        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1,
+        &completionCode, nullptr, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pass_component_table_resp(
+        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1,
+        &completionCode, &compResp, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pass_component_table_resp(responseMsg1, 0, &completionCode,
+                                          &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_pass_component_table_resp(
+        responseMsg1, sizeof(pldm_pass_component_table_resp) - 1,
+        &completionCode, &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp)>
+        passCompTableResponse2{0x00, 0x00, 0x00, 0x00, 0x02, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse2.data());
+    rc = decode_pass_component_table_resp(
+        responseMsg2, sizeof(pldm_pass_component_table_resp), &completionCode,
+        &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp)>
+        passCompTableResponse3{0x00, 0x00, 0x00, 0x00, 0x00, 0x0C};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse3.data());
+    rc = decode_pass_component_table_resp(
+        responseMsg3, sizeof(pldm_pass_component_table_resp), &completionCode,
+        &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_pass_component_table_resp)>
+        passCompTableResponse4{0x00, 0x00, 0x00, 0x00, 0x00, 0xF0};
+    auto responseMsg4 =
+        reinterpret_cast<const pldm_msg*>(passCompTableResponse4.data());
+    rc = decode_pass_component_table_resp(
+        responseMsg4, sizeof(pldm_pass_component_table_resp), &completionCode,
+        &compResp, &compRespCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(UpdateComponent, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 2;
+    constexpr uint16_t compIdentifier = 500;
+    constexpr uint8_t compClassificationIndex = 50;
+    constexpr uint32_t compComparisonStamp = 0x89ABCDEF;
+    constexpr uint32_t compImageSize = 4096;
+    constexpr bitfield32_t updateOptionFlags{1};
+    constexpr std::string_view compVerStr = "OpenBmcv2.2";
+    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
+    variable_field compVerStrInfo{};
+    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
+    compVerStrInfo.length = compVerStrLen;
+
+    std::array<uint8_t,
+               hdrSize + sizeof(pldm_update_component_req) + compVerStrLen>
+        request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    std::array<uint8_t,
+               hdrSize + sizeof(pldm_update_component_req) + compVerStrLen>
+        outRequest{0x82, 0x05, 0x14, 0x0A, 0x00, 0xF4, 0x01, 0x32, 0xEF,
+                   0xCD, 0xAB, 0x89, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+                   0x00, 0x00, 0x01, 0x0B, 0x4f, 0x70, 0x65, 0x6E, 0x42,
+                   0x6D, 0x63, 0x76, 0x32, 0x2E, 0x32};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(UpdateComponent, errorPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 2;
+    constexpr uint16_t compIdentifier = 500;
+    constexpr uint8_t compClassificationIndex = 50;
+    constexpr uint32_t compComparisonStamp = 0x89ABCDEF;
+    constexpr uint32_t compImageSize = 4096;
+    constexpr bitfield32_t updateOptionFlags{1};
+    constexpr std::string_view compVerStr = "OpenBmcv2.2";
+    constexpr uint8_t compVerStrLen = static_cast<uint8_t>(compVerStr.size());
+    variable_field compVerStrInfo{};
+    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
+    compVerStrInfo.length = compVerStrLen;
+
+    std::array<uint8_t,
+               hdrSize + sizeof(pldm_update_component_req) + compVerStrLen>
+        request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, compVerStrLen, nullptr, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    compVerStrInfo.ptr = nullptr;
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+    compVerStrInfo.ptr = reinterpret_cast<const uint8_t*>(compVerStr.data());
+
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, nullptr,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req));
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, 0, updateOptionFlags, PLDM_STR_TYPE_ASCII,
+        compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, 0, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_ASCII, compVerStrLen - 1, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_update_component_req(
+        instanceId, PLDM_COMP_FIRMWARE, compIdentifier, compClassificationIndex,
+        compComparisonStamp, compImageSize, updateOptionFlags,
+        PLDM_STR_TYPE_UNKNOWN, compVerStrLen, &compVerStrInfo, requestMsg,
+        sizeof(pldm_update_component_req) + compVerStrLen);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(UpdateComponent, goodPathDecodeResponse)
+{
+    constexpr std::bitset<32> forceUpdateComp{1};
+    constexpr uint16_t timeBeforeSendingReqFwData100s = 100;
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
+        updateComponentResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse1.data());
+
+    uint8_t completionCode = 0;
+    uint8_t compCompatibilityResp = 0;
+    uint8_t compCompatibilityRespCode = 0;
+    bitfield32_t updateOptionFlagsEnabled{};
+    uint16_t timeBeforeReqFWData = 0;
+
+    auto rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp), &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(compCompatibilityResp, PLDM_CCR_COMP_CAN_BE_UPDATED);
+    EXPECT_EQ(compCompatibilityRespCode, PLDM_CCRC_NO_RESPONSE_CODE);
+    EXPECT_EQ(updateOptionFlagsEnabled.value, forceUpdateComp);
+    EXPECT_EQ(timeBeforeReqFWData, timeBeforeSendingReqFwData100s);
+
+    constexpr std::bitset<32> noFlags{};
+    constexpr uint16_t timeBeforeSendingReqFwData0s = 0;
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
+        updateComponentResponse2{0x00, 0x00, 0x00, 0x00, 0x01, 0x09,
+                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse2.data());
+    rc = decode_update_component_resp(
+        responseMsg2, sizeof(pldm_update_component_resp), &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(compCompatibilityResp, PLDM_CCR_COMP_CANNOT_BE_UPDATED);
+    EXPECT_EQ(compCompatibilityRespCode, PLDM_CCRC_COMP_INFO_NO_MATCH);
+    EXPECT_EQ(updateOptionFlagsEnabled.value, noFlags);
+    EXPECT_EQ(timeBeforeReqFWData, timeBeforeSendingReqFwData0s);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
+        updateComponentResponse3{0x00, 0x00, 0x00, 0x80};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse3.data());
+
+    rc = decode_update_component_resp(
+        responseMsg3, sizeof(pldm_update_component_resp), &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_FWUP_NOT_IN_UPDATE_MODE);
+}
+
+TEST(UpdateComponent, errorPathDecodeResponse)
+{
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_update_component_resp) - 1>
+        updateComponentResponse1{0x00, 0x00, 0x00, 0x00, 0x01, 0x09,
+                                 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse1.data());
+
+    uint8_t completionCode = 0;
+    uint8_t compCompatibilityResp = 0;
+    uint8_t compCompatibilityRespCode = 0;
+    bitfield32_t updateOptionFlagsEnabled{};
+    uint16_t timeBeforeReqFWData = 0;
+
+    auto rc = decode_update_component_resp(
+        nullptr, sizeof(pldm_update_component_resp) - 1, &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp) - 1, nullptr,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
+        nullptr, &compCompatibilityRespCode, &updateOptionFlagsEnabled,
+        &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
+        &compCompatibilityResp, nullptr, &updateOptionFlagsEnabled,
+        &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode, nullptr,
+        &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, 0, &completionCode, &compCompatibilityResp,
+        &compCompatibilityRespCode, &updateOptionFlagsEnabled,
+        &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_update_component_resp(
+        responseMsg1, sizeof(pldm_update_component_resp) - 1, &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
+        updateComponentResponse2{0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse2.data());
+    rc = decode_update_component_resp(
+        responseMsg2, sizeof(pldm_update_component_resp), &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
+        updateComponentResponse3{0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
+                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse3.data());
+    rc = decode_update_component_resp(
+        responseMsg3, sizeof(pldm_update_component_resp), &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_update_component_resp)>
+        updateComponentResponse4{0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
+                                 0x01, 0x00, 0x00, 0x00, 0x64, 0x00};
+    auto responseMsg4 =
+        reinterpret_cast<const pldm_msg*>(updateComponentResponse4.data());
+    rc = decode_update_component_resp(
+        responseMsg4, sizeof(pldm_update_component_resp), &completionCode,
+        &compCompatibilityResp, &compCompatibilityRespCode,
+        &updateOptionFlagsEnabled, &timeBeforeReqFWData);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(RequestFirmwareData, goodPathDecodeRequest)
+{
+    constexpr uint32_t offset = 300;
+    constexpr uint32_t length = 255;
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_request_firmware_data_req)>
+        reqFWDataReq{0x00, 0x00, 0x00, 0x2C, 0x01, 0x00,
+                     0x00, 0xFF, 0x00, 0x00, 0x00};
+    auto requestMsg = reinterpret_cast<const pldm_msg*>(reqFWDataReq.data());
+
+    uint32_t outOffset = 0;
+    uint32_t outLength = 0;
+    auto rc = decode_request_firmware_data_req(
+        requestMsg, sizeof(pldm_request_firmware_data_req), &outOffset,
+        &outLength);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outOffset, offset);
+    EXPECT_EQ(outLength, length);
+}
+
+TEST(RequestFirmwareData, errorPathDecodeRequest)
+{
+    constexpr std::array<uint8_t,
+                         hdrSize + sizeof(pldm_request_firmware_data_req)>
+        reqFWDataReq{0x00, 0x00, 0x00, 0x2C, 0x01, 0x00,
+                     0x00, 0x1F, 0x00, 0x00, 0x00};
+    auto requestMsg = reinterpret_cast<const pldm_msg*>(reqFWDataReq.data());
+
+    uint32_t outOffset = 0;
+    uint32_t outLength = 0;
+    auto rc = decode_request_firmware_data_req(
+        nullptr, sizeof(pldm_request_firmware_data_req), &outOffset,
+        &outLength);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_firmware_data_req(
+        requestMsg, sizeof(pldm_request_firmware_data_req), nullptr,
+        &outLength);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_firmware_data_req(
+        requestMsg, sizeof(pldm_request_firmware_data_req), &outOffset,
+        nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_request_firmware_data_req(
+        requestMsg, sizeof(pldm_request_firmware_data_req) - 1, &outOffset,
+        &outLength);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = decode_request_firmware_data_req(
+        requestMsg, sizeof(pldm_request_firmware_data_req), &outOffset,
+        &outLength);
+    EXPECT_EQ(rc, PLDM_FWUP_INVALID_TRANSFER_LENGTH);
+}
+
+TEST(RequestFirmwareData, goodPathEncodeResponse)
+{
+    constexpr uint8_t instanceId = 3;
+    constexpr uint8_t completionCode = PLDM_SUCCESS;
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode) +
+                                      PLDM_FWUP_BASELINE_TRANSFER_SIZE>
+        outReqFwDataResponse1{0x03, 0x05, 0x15, 0x00, 0x01, 0x02, 0x03, 0x04,
+                              0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
+                              0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
+                              0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
+                              0x1D, 0x1E, 0x1F, 0x20};
+    std::array<uint8_t, hdrSize + sizeof(completionCode) +
+                            PLDM_FWUP_BASELINE_TRANSFER_SIZE>
+        reqFwDataResponse1{0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
+                           0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
+                           0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14,
+                           0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
+                           0x1D, 0x1E, 0x1F, 0x20};
+    auto responseMsg1 = reinterpret_cast<pldm_msg*>(reqFwDataResponse1.data());
+    auto rc = encode_request_firmware_data_resp(
+        instanceId, completionCode, responseMsg1,
+        sizeof(completionCode) + PLDM_FWUP_BASELINE_TRANSFER_SIZE);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(reqFwDataResponse1, outReqFwDataResponse1);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outReqFwDataResponse2{0x03, 0x05, 0x15, 0x82};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)> reqFwDataResponse2{
+        0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 = reinterpret_cast<pldm_msg*>(reqFwDataResponse2.data());
+    rc = encode_request_firmware_data_resp(
+        instanceId, PLDM_FWUP_DATA_OUT_OF_RANGE, responseMsg2,
+        sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(reqFwDataResponse2, outReqFwDataResponse2);
+}
+
+TEST(RequestFirmwareData, errorPathEncodeResponse)
+{
+    std::array<uint8_t, hdrSize> reqFwDataResponse{0x00, 0x00, 0x00};
+    auto responseMsg = reinterpret_cast<pldm_msg*>(reqFwDataResponse.data());
+    auto rc = encode_request_firmware_data_resp(0, PLDM_SUCCESS, nullptr, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_request_firmware_data_resp(0, PLDM_SUCCESS, responseMsg, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(TransferComplete, goodPathDecodeRequest)
+{
+    constexpr uint8_t transferResult = PLDM_FWUP_TRANSFER_SUCCESS;
+    constexpr std::array<uint8_t, hdrSize + sizeof(transferResult)>
+        transferCompleteReq1{0x00, 0x00, 0x00, 0x00};
+    auto requestMsg1 =
+        reinterpret_cast<const pldm_msg*>(transferCompleteReq1.data());
+    uint8_t outTransferResult = 0;
+
+    auto rc = decode_transfer_complete_req(requestMsg1, sizeof(transferResult),
+                                           &outTransferResult);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outTransferResult, transferResult);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(transferResult)>
+        transferCompleteReq2{0x00, 0x00, 0x00, 0x02};
+    auto requestMsg2 =
+        reinterpret_cast<const pldm_msg*>(transferCompleteReq2.data());
+    rc = decode_transfer_complete_req(requestMsg2, sizeof(transferResult),
+                                      &outTransferResult);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outTransferResult, PLDM_FWUP_TRANSFER_ERROR_IMAGE_CORRUPT);
+}
+
+TEST(TransferComplete, errorPathDecodeRequest)
+{
+    constexpr std::array<uint8_t, hdrSize> transferCompleteReq{0x00, 0x00,
+                                                               0x00};
+    auto requestMsg =
+        reinterpret_cast<const pldm_msg*>(transferCompleteReq.data());
+    uint8_t outTransferResult = 0;
+
+    auto rc = decode_transfer_complete_req(nullptr, 0, &outTransferResult);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_transfer_complete_req(requestMsg, 0, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_transfer_complete_req(requestMsg, 0, &outTransferResult);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(TransferComplete, goodPathEncodeResponse)
+{
+    constexpr uint8_t instanceId = 4;
+    constexpr uint8_t completionCode = PLDM_SUCCESS;
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outTransferCompleteResponse1{0x04, 0x05, 0x16, 0x00};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        transferCompleteResponse1{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<pldm_msg*>(transferCompleteResponse1.data());
+    auto rc = encode_transfer_complete_resp(
+        instanceId, completionCode, responseMsg1, sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(transferCompleteResponse1, outTransferCompleteResponse1);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outTransferCompleteResponse2{0x04, 0x05, 0x16, 0x87};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        transferCompleteResponse2{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<pldm_msg*>(transferCompleteResponse2.data());
+    rc = encode_transfer_complete_resp(instanceId,
+                                       PLDM_FWUP_COMMAND_NOT_EXPECTED,
+                                       responseMsg2, sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(transferCompleteResponse2, outTransferCompleteResponse2);
+}
+
+TEST(TransferComplete, errorPathEncodeResponse)
+{
+    std::array<uint8_t, hdrSize> transferCompleteResponse{0x00, 0x00, 0x00};
+    auto responseMsg =
+        reinterpret_cast<pldm_msg*>(transferCompleteResponse.data());
+    auto rc = encode_transfer_complete_resp(0, PLDM_SUCCESS, nullptr, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_transfer_complete_resp(0, PLDM_SUCCESS, responseMsg, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(VerifyComplete, goodPathDecodeRequest)
+{
+    constexpr uint8_t verifyResult = PLDM_FWUP_VERIFY_SUCCESS;
+    constexpr std::array<uint8_t, hdrSize + sizeof(verifyResult)>
+        verifyCompleteReq1{0x00, 0x00, 0x00, 0x00};
+    auto requestMsg1 =
+        reinterpret_cast<const pldm_msg*>(verifyCompleteReq1.data());
+    uint8_t outVerifyResult = 0;
+
+    auto rc = decode_verify_complete_req(requestMsg1, sizeof(verifyResult),
+                                         &outVerifyResult);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outVerifyResult, verifyResult);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(verifyResult)>
+        verifyCompleteReq2{0x00, 0x00, 0x00, 0x03};
+    auto requestMsg2 =
+        reinterpret_cast<const pldm_msg*>(verifyCompleteReq2.data());
+    rc = decode_verify_complete_req(requestMsg2, sizeof(verifyResult),
+                                    &outVerifyResult);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outVerifyResult, PLDM_FWUP_VERIFY_FAILED_FD_SECURITY_CHECKS);
+}
+
+TEST(VerifyComplete, errorPathDecodeRequest)
+{
+    constexpr std::array<uint8_t, hdrSize> verifyCompleteReq{0x00, 0x00, 0x00};
+    auto requestMsg =
+        reinterpret_cast<const pldm_msg*>(verifyCompleteReq.data());
+    uint8_t outVerifyResult = 0;
+
+    auto rc = decode_verify_complete_req(nullptr, 0, &outVerifyResult);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_verify_complete_req(requestMsg, 0, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_verify_complete_req(requestMsg, 0, &outVerifyResult);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(VerifyComplete, goodPathEncodeResponse)
+{
+    constexpr uint8_t instanceId = 5;
+    constexpr uint8_t completionCode = PLDM_SUCCESS;
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outVerifyCompleteResponse1{0x05, 0x05, 0x17, 0x00};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        verifyCompleteResponse1{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<pldm_msg*>(verifyCompleteResponse1.data());
+    auto rc = encode_verify_complete_resp(instanceId, completionCode,
+                                          responseMsg1, sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(verifyCompleteResponse1, outVerifyCompleteResponse1);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outVerifyCompleteResponse2{0x05, 0x05, 0x17, 0x87};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        verifyCompleteResponse2{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<pldm_msg*>(verifyCompleteResponse2.data());
+    rc = encode_verify_complete_resp(instanceId, PLDM_FWUP_COMMAND_NOT_EXPECTED,
+                                     responseMsg2, sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(verifyCompleteResponse2, outVerifyCompleteResponse2);
+}
+
+TEST(VerifyComplete, errorPathEncodeResponse)
+{
+    std::array<uint8_t, hdrSize> verifyCompleteResponse{0x00, 0x00, 0x00};
+    auto responseMsg =
+        reinterpret_cast<pldm_msg*>(verifyCompleteResponse.data());
+    auto rc = encode_verify_complete_resp(0, PLDM_SUCCESS, nullptr, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_verify_complete_resp(0, PLDM_SUCCESS, responseMsg, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ApplyComplete, goodPathDecodeRequest)
+{
+    constexpr uint8_t applyResult1 =
+        PLDM_FWUP_APPLY_SUCCESS_WITH_ACTIVATION_METHOD;
+    // DC power cycle [Bit position 4] & AC power cycle [Bit position 5]
+    constexpr std::bitset<16> compActivationModification1{0x30};
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_apply_complete_req)>
+        applyCompleteReq1{0x00, 0x00, 0x00, 0x01, 0x30, 0x00};
+    auto requestMsg1 =
+        reinterpret_cast<const pldm_msg*>(applyCompleteReq1.data());
+    uint8_t outApplyResult = 0;
+    bitfield16_t outCompActivationModification{};
+    auto rc = decode_apply_complete_req(
+        requestMsg1, sizeof(pldm_apply_complete_req), &outApplyResult,
+        &outCompActivationModification);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outApplyResult, applyResult1);
+    EXPECT_EQ(outCompActivationModification.value, compActivationModification1);
+
+    constexpr uint8_t applyResult2 = PLDM_FWUP_APPLY_SUCCESS;
+    constexpr std::bitset<16> compActivationModification2{};
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_apply_complete_req)>
+        applyCompleteReq2{0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto requestMsg2 =
+        reinterpret_cast<const pldm_msg*>(applyCompleteReq2.data());
+    rc = decode_apply_complete_req(requestMsg2, sizeof(pldm_apply_complete_req),
+                                   &outApplyResult,
+                                   &outCompActivationModification);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(outApplyResult, applyResult2);
+    EXPECT_EQ(outCompActivationModification.value, compActivationModification2);
+}
+
+TEST(ApplyComplete, errorPathDecodeRequest)
+{
+    constexpr std::array<uint8_t, hdrSize> applyCompleteReq1{0x00, 0x00, 0x00};
+    auto requestMsg1 =
+        reinterpret_cast<const pldm_msg*>(applyCompleteReq1.data());
+    uint8_t outApplyResult = 0;
+    bitfield16_t outCompActivationModification{};
+
+    auto rc = decode_apply_complete_req(
+        nullptr, sizeof(pldm_apply_complete_req), &outApplyResult,
+        &outCompActivationModification);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_apply_complete_req(requestMsg1, sizeof(pldm_apply_complete_req),
+                                   nullptr, &outCompActivationModification);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_apply_complete_req(requestMsg1, sizeof(pldm_apply_complete_req),
+                                   &outApplyResult, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_apply_complete_req(requestMsg1, 0, &outApplyResult,
+                                   &outCompActivationModification);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_apply_complete_req)>
+        applyCompleteReq2{0x00, 0x00, 0x00, 0x00, 0x01, 0x00};
+    auto requestMsg2 =
+        reinterpret_cast<const pldm_msg*>(applyCompleteReq2.data());
+    rc = decode_apply_complete_req(requestMsg2, sizeof(pldm_apply_complete_req),
+                                   &outApplyResult,
+                                   &outCompActivationModification);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(ApplyComplete, goodPathEncodeResponse)
+{
+    constexpr uint8_t instanceId = 6;
+    constexpr uint8_t completionCode = PLDM_SUCCESS;
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outApplyCompleteResponse1{0x06, 0x05, 0x18, 0x00};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        applyCompleteResponse1{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<pldm_msg*>(applyCompleteResponse1.data());
+    auto rc = encode_apply_complete_resp(instanceId, completionCode,
+                                         responseMsg1, sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(applyCompleteResponse1, outApplyCompleteResponse1);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        outApplyCompleteResponse2{0x06, 0x05, 0x18, 0x87};
+    std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        applyCompleteResponse2{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<pldm_msg*>(applyCompleteResponse2.data());
+    rc = encode_apply_complete_resp(instanceId, PLDM_FWUP_COMMAND_NOT_EXPECTED,
+                                    responseMsg2, sizeof(completionCode));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(applyCompleteResponse2, outApplyCompleteResponse2);
+}
+
+TEST(ApplyComplete, errorPathEncodeResponse)
+{
+    std::array<uint8_t, hdrSize> applyCompleteResponse{0x00, 0x00, 0x00};
+    auto responseMsg =
+        reinterpret_cast<pldm_msg*>(applyCompleteResponse.data());
+    auto rc = encode_apply_complete_resp(0, PLDM_SUCCESS, nullptr, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_apply_complete_resp(0, PLDM_SUCCESS, responseMsg, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ActivateFirmware, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 7;
+
+    std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_req)> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_activate_firmware_req(
+        instanceId, PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS, requestMsg,
+        sizeof(pldm_activate_firmware_req));
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_req)>
+        outRequest{0x87, 0x05, 0x1A, 0x01};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(ActivateFirmware, errorPathEncodeRequest)
+{
+    std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_req)> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_activate_firmware_req(
+        0, PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS, nullptr,
+        sizeof(pldm_activate_firmware_req));
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_activate_firmware_req(
+        0, PLDM_ACTIVATE_SELF_CONTAINED_COMPONENTS, requestMsg, 0);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    rc = encode_activate_firmware_req(0, 2, requestMsg,
+                                      sizeof(pldm_activate_firmware_req));
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(ActivateFirmware, goodPathDecodeResponse)
+{
+    constexpr uint16_t estimatedTimeForActivation100s = 100;
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_resp)>
+        activateFirmwareResponse1{0x00, 0x00, 0x00, 0x00, 0x64, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(activateFirmwareResponse1.data());
+
+    uint8_t completionCode = 0;
+    uint16_t estimatedTimeForActivation = 0;
+
+    auto rc = decode_activate_firmware_resp(
+        responseMsg1, sizeof(pldm_activate_firmware_resp), &completionCode,
+        &estimatedTimeForActivation);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(estimatedTimeForActivation, estimatedTimeForActivation100s);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        activateFirmwareResponse2{0x00, 0x00, 0x00, 0x85};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(activateFirmwareResponse2.data());
+
+    rc = decode_activate_firmware_resp(responseMsg2, sizeof(completionCode),
+                                       &completionCode,
+                                       &estimatedTimeForActivation);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_FWUP_INCOMPLETE_UPDATE);
+}
+
+TEST(ActivateFirmware, errorPathDecodeResponse)
+{
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_activate_firmware_resp)>
+        activateFirmwareResponse{0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(activateFirmwareResponse.data());
+
+    uint8_t completionCode = 0;
+    uint16_t estimatedTimeForActivation = 0;
+
+    auto rc = decode_activate_firmware_resp(
+        nullptr, sizeof(pldm_activate_firmware_resp), &completionCode,
+        &estimatedTimeForActivation);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_activate_firmware_resp(responseMsg,
+                                       sizeof(pldm_activate_firmware_resp),
+                                       nullptr, &estimatedTimeForActivation);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_activate_firmware_resp(responseMsg,
+                                       sizeof(pldm_activate_firmware_resp),
+                                       &completionCode, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_activate_firmware_resp(responseMsg, 0, &completionCode,
+                                       &estimatedTimeForActivation);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_activate_firmware_resp(
+        responseMsg, sizeof(pldm_activate_firmware_resp) - 1, &completionCode,
+        &estimatedTimeForActivation);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(GetStatus, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 8;
+    std::array<uint8_t, hdrSize> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_get_status_req(instanceId, requestMsg,
+                                    PLDM_GET_STATUS_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    constexpr std::array<uint8_t, hdrSize> outRequest{0x88, 0x05, 0x1B};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(GetStatus, errorPathEncodeRequest)
+{
+    std::array<uint8_t, hdrSize + sizeof(uint8_t)> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_get_status_req(0, nullptr, PLDM_GET_STATUS_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_get_status_req(0, requestMsg, PLDM_GET_STATUS_REQ_BYTES + 1);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(GetStatus, goodPathDecodeResponse)
+{
+    constexpr std::bitset<32> updateOptionFlagsEnabled1{0};
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03,
+                           0x09, 0x65, 0x05, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse1.data());
+
+    uint8_t completionCode = 0;
+    uint8_t currentState = 0;
+    uint8_t previousState = 0;
+    uint8_t auxState = 0;
+    uint8_t auxStateStatus = 0;
+    uint8_t progressPercent = 0;
+    uint8_t reasonCode = 0;
+    bitfield32_t updateOptionFlagsEnabled{0};
+
+    auto rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(currentState, PLDM_FD_STATE_IDLE);
+    EXPECT_EQ(previousState, PLDM_FD_STATE_DOWNLOAD);
+    EXPECT_EQ(auxState, PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER);
+    EXPECT_EQ(auxStateStatus, PLDM_FD_TIMEOUT);
+    EXPECT_EQ(progressPercent, PLDM_FWUP_MAX_PROGRESS_PERCENT);
+    EXPECT_EQ(reasonCode, PLDM_FD_TIMEOUT_DOWNLOAD);
+    EXPECT_EQ(updateOptionFlagsEnabled.value, updateOptionFlagsEnabled1);
+
+    // Bit position 0 - Force update of component – FD will perform a force
+    // update of the component.
+    constexpr std::bitset<32> updateOptionFlagsEnabled2{1};
+    constexpr uint8_t progressPercent2 = 50;
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse2{0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00,
+                           0x70, 0x32, 0x05, 0x01, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse2.data());
+
+    rc = decode_get_status_resp(
+        responseMsg2, getStatusResponse2.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(currentState, PLDM_FD_STATE_VERIFY);
+    EXPECT_EQ(previousState, PLDM_FD_STATE_DOWNLOAD);
+    EXPECT_EQ(auxState, PLDM_FD_OPERATION_IN_PROGRESS);
+    EXPECT_EQ(auxStateStatus, PLDM_FD_VENDOR_DEFINED_STATUS_CODE_START);
+    EXPECT_EQ(progressPercent, progressPercent2);
+    EXPECT_EQ(reasonCode, PLDM_FD_TIMEOUT_DOWNLOAD);
+    EXPECT_EQ(updateOptionFlagsEnabled.value, updateOptionFlagsEnabled2);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        getStatusResponse3{0x00, 0x00, 0x00, 0x04};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse3.data());
+    rc = decode_get_status_resp(
+        responseMsg3, getStatusResponse3.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_ERROR_NOT_READY);
+}
+
+TEST(GetStatus, errorPathDecodeResponse)
+{
+    uint8_t completionCode = 0;
+    uint8_t currentState = 0;
+    uint8_t previousState = 0;
+    uint8_t auxState = 0;
+    uint8_t auxStateStatus = 0;
+    uint8_t progressPercent = 0;
+    uint8_t reasonCode = 0;
+    bitfield32_t updateOptionFlagsEnabled{0};
+
+    constexpr std::array<uint8_t, hdrSize> getStatusResponse1{0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse1.data());
+
+    auto rc = decode_get_status_resp(
+        nullptr, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, nullptr,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        nullptr, &previousState, &auxState, &auxStateStatus, &progressPercent,
+        &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, nullptr, &auxState, &auxStateStatus, &progressPercent,
+        &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, nullptr, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, nullptr, &progressPercent,
+        &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus, nullptr,
+        &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, nullptr, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_status_resp(
+        responseMsg1, getStatusResponse1.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp) - 1>
+        getStatusResponse2{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse2.data());
+    rc = decode_get_status_resp(
+        responseMsg2, getStatusResponse2.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse3{0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse3.data());
+    rc = decode_get_status_resp(
+        responseMsg3, getStatusResponse3.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse4{0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
+                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg4 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse4.data());
+    rc = decode_get_status_resp(
+        responseMsg4, getStatusResponse4.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse5{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg5 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse5.data());
+    rc = decode_get_status_resp(
+        responseMsg5, getStatusResponse5.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse6{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                           0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg6 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse6.data());
+    rc = decode_get_status_resp(
+        responseMsg6, getStatusResponse6.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse7{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                           0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg7 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse7.data());
+    rc = decode_get_status_resp(
+        responseMsg7, getStatusResponse7.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse8{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                           0x00, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg8 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse8.data());
+    rc = decode_get_status_resp(
+        responseMsg8, getStatusResponse8.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // AuxState is not PLDM_FD_IDLE_LEARN_COMPONENTS_READ_XFER when the state is
+    // IDLE
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_get_status_resp)>
+        getStatusResponse9{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg9 =
+        reinterpret_cast<const pldm_msg*>(getStatusResponse9.data());
+    rc = decode_get_status_resp(
+        responseMsg9, getStatusResponse9.size() - hdrSize, &completionCode,
+        &currentState, &previousState, &auxState, &auxStateStatus,
+        &progressPercent, &reasonCode, &updateOptionFlagsEnabled);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(CancelUpdateComponent, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 9;
+    std::array<uint8_t, hdrSize> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_cancel_update_component_req(
+        instanceId, requestMsg, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    constexpr std::array<uint8_t, hdrSize> outRequest{0x89, 0x05, 0x1C};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(CancelUpdateComponent, errorPathEncodeRequest)
+{
+    std::array<uint8_t, hdrSize + sizeof(uint8_t)> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_cancel_update_component_req(
+        0, nullptr, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_cancel_update_component_req(
+        0, requestMsg, PLDM_CANCEL_UPDATE_COMPONENT_REQ_BYTES + 1);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(CancelUpdateComponent, testGoodDecodeResponse)
+{
+    uint8_t completionCode = 0;
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        cancelUpdateComponentResponse1{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 = reinterpret_cast<const pldm_msg*>(
+        cancelUpdateComponentResponse1.data());
+    auto rc = decode_cancel_update_component_resp(
+        responseMsg1, cancelUpdateComponentResponse1.size() - hdrSize,
+        &completionCode);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        cancelUpdateComponentResponse2{0x00, 0x00, 0x00, 0x86};
+    auto responseMsg2 = reinterpret_cast<const pldm_msg*>(
+        cancelUpdateComponentResponse2.data());
+    rc = decode_cancel_update_component_resp(
+        responseMsg2, cancelUpdateComponentResponse2.size() - hdrSize,
+        &completionCode);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_FWUP_BUSY_IN_BACKGROUND);
+}
+
+TEST(CancelUpdateComponent, testBadDecodeResponse)
+{
+    uint8_t completionCode = 0;
+    constexpr std::array<uint8_t, hdrSize> cancelUpdateComponentResponse{
+        0x00, 0x00, 0x00};
+    auto responseMsg =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateComponentResponse.data());
+
+    auto rc = decode_cancel_update_component_resp(
+        nullptr, cancelUpdateComponentResponse.size() - hdrSize,
+        &completionCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_cancel_update_component_resp(
+        responseMsg, cancelUpdateComponentResponse.size() - hdrSize, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_cancel_update_component_resp(
+        responseMsg, cancelUpdateComponentResponse.size() - hdrSize,
+        &completionCode);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(CancelUpdate, goodPathEncodeRequest)
+{
+    constexpr uint8_t instanceId = 10;
+    std::array<uint8_t, hdrSize> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc = encode_cancel_update_req(instanceId, requestMsg,
+                                       PLDM_CANCEL_UPDATE_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    constexpr std::array<uint8_t, hdrSize> outRequest{0x8A, 0x05, 0x1D};
+    EXPECT_EQ(request, outRequest);
+}
+
+TEST(CancelUpdate, errorPathEncodeRequest)
+{
+    std::array<uint8_t, hdrSize + sizeof(uint8_t)> request{};
+    auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
+
+    auto rc =
+        encode_cancel_update_req(0, nullptr, PLDM_CANCEL_UPDATE_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = encode_cancel_update_req(0, requestMsg,
+                                  PLDM_CANCEL_UPDATE_REQ_BYTES + 1);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(CancelUpdate, goodPathDecodeResponse)
+{
+    constexpr std::bitset<64> nonFunctioningComponentBitmap1{0};
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_cancel_update_resp)>
+        cancelUpdateResponse1{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse1.data());
+    uint8_t completionCode = 0;
+    bool8_t nonFunctioningComponentIndication = 0;
+    bitfield64_t nonFunctioningComponentBitmap{0};
+    auto rc = decode_cancel_update_resp(
+        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(nonFunctioningComponentIndication,
+              PLDM_FWUP_COMPONENTS_FUNCTIONING);
+    EXPECT_EQ(nonFunctioningComponentBitmap.value,
+              nonFunctioningComponentBitmap1);
+
+    constexpr std::bitset<64> nonFunctioningComponentBitmap2{0x0101};
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_cancel_update_resp)>
+        cancelUpdateResponse2{0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse2.data());
+    rc = decode_cancel_update_resp(
+        responseMsg2, cancelUpdateResponse2.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_SUCCESS);
+    EXPECT_EQ(nonFunctioningComponentIndication,
+              PLDM_FWUP_COMPONENTS_NOT_FUNCTIONING);
+    EXPECT_EQ(nonFunctioningComponentBitmap.value,
+              nonFunctioningComponentBitmap2);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        cancelUpdateResponse3{0x00, 0x00, 0x00, 0x86};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse3.data());
+    rc = decode_cancel_update_resp(
+        responseMsg3, cancelUpdateResponse3.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(completionCode, PLDM_FWUP_BUSY_IN_BACKGROUND);
+}
+
+TEST(CancelUpdate, errorPathDecodeResponse)
+{
+    constexpr std::array<uint8_t, hdrSize> cancelUpdateResponse1{0x00, 0x00,
+                                                                 0x00};
+    auto responseMsg1 =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse1.data());
+    uint8_t completionCode = 0;
+    bool8_t nonFunctioningComponentIndication = 0;
+    bitfield64_t nonFunctioningComponentBitmap{0};
+
+    auto rc = decode_cancel_update_resp(
+        nullptr, cancelUpdateResponse1.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_cancel_update_resp(
+        responseMsg1, cancelUpdateResponse1.size() - hdrSize, nullptr,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_cancel_update_resp(
+        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
+        nullptr, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_cancel_update_resp(
+        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, nullptr);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_cancel_update_resp(
+        responseMsg1, cancelUpdateResponse1.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(completionCode)>
+        cancelUpdateResponse2{0x00, 0x00, 0x00, 0x00};
+    auto responseMsg2 =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse2.data());
+    rc = decode_cancel_update_resp(
+        responseMsg2, cancelUpdateResponse2.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    constexpr std::array<uint8_t, hdrSize + sizeof(pldm_cancel_update_resp)>
+        cancelUpdateResponse3{0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    auto responseMsg3 =
+        reinterpret_cast<const pldm_msg*>(cancelUpdateResponse3.data());
+    rc = decode_cancel_update_resp(
+        responseMsg3, cancelUpdateResponse3.size() - hdrSize, &completionCode,
+        &nonFunctioningComponentIndication, &nonFunctioningComponentBitmap);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
