/** @file | |
If CC Guest firmware supports measurement and an event is created, | |
CC Guest firmware is designed to report the event log with the same | |
data structure in TCG-Platform-Firmware-Profile specification with | |
EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 format. | |
The CC Guest firmware supports measurement, the CC Guest Firmware is | |
designed to produce EFI_CC_MEASUREMENT_PROTOCOL with new GUID | |
EFI_CC_MEASUREMENT_PROTOCOL_GUID to report event log and provides hash | |
capability. | |
Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef CC_MEASUREMENT_PROTOCOL_H_ | |
#define CC_MEASUREMENT_PROTOCOL_H_ | |
#include <IndustryStandard/UefiTcgPlatform.h> | |
#define EFI_CC_MEASUREMENT_PROTOCOL_GUID \ | |
{ 0x96751a3d, 0x72f4, 0x41a6, { 0xa7, 0x94, 0xed, 0x5d, 0x0e, 0x67, 0xae, 0x6b }} | |
extern EFI_GUID gEfiCcMeasurementProtocolGuid; | |
typedef struct _EFI_CC_MEASUREMENT_PROTOCOL EFI_CC_MEASUREMENT_PROTOCOL; | |
typedef struct { | |
UINT8 Major; | |
UINT8 Minor; | |
} EFI_CC_VERSION; | |
// | |
// EFI_CC Type/SubType definition | |
// | |
#define EFI_CC_TYPE_NONE 0 | |
#define EFI_CC_TYPE_SEV 1 | |
#define EFI_CC_TYPE_TDX 2 | |
typedef struct { | |
UINT8 Type; | |
UINT8 SubType; | |
} EFI_CC_TYPE; | |
typedef UINT32 EFI_CC_EVENT_LOG_BITMAP; | |
typedef UINT32 EFI_CC_EVENT_LOG_FORMAT; | |
typedef UINT32 EFI_CC_EVENT_ALGORITHM_BITMAP; | |
typedef UINT32 EFI_CC_MR_INDEX; | |
// | |
// Intel TDX measure register index | |
// | |
#define TDX_MR_INDEX_MRTD 0 | |
#define TDX_MR_INDEX_RTMR0 1 | |
#define TDX_MR_INDEX_RTMR1 2 | |
#define TDX_MR_INDEX_RTMR2 3 | |
#define TDX_MR_INDEX_RTMR3 4 | |
#define EFI_CC_EVENT_LOG_FORMAT_TCG_2 0x00000002 | |
#define EFI_CC_BOOT_HASH_ALG_SHA384 0x00000004 | |
// | |
// This bit is shall be set when an event shall be extended but not logged. | |
// | |
#define EFI_CC_FLAG_EXTEND_ONLY 0x0000000000000001 | |
// | |
// This bit shall be set when the intent is to measure a PE/COFF image. | |
// | |
#define EFI_CC_FLAG_PE_COFF_IMAGE 0x0000000000000010 | |
#pragma pack (1) | |
#define EFI_CC_EVENT_HEADER_VERSION 1 | |
typedef struct { | |
// | |
// Size of the event header itself (sizeof(EFI_CC_EVENT_HEADER)). | |
// | |
UINT32 HeaderSize; | |
// | |
// Header version. For this version of this specification, the value shall be 1. | |
// | |
UINT16 HeaderVersion; | |
// | |
// Index of the MR (measurement register) that shall be extended. | |
// | |
EFI_CC_MR_INDEX MrIndex; | |
// | |
// Type of the event that shall be extended (and optionally logged). | |
// | |
UINT32 EventType; | |
} EFI_CC_EVENT_HEADER; | |
typedef struct { | |
// | |
// Total size of the event including the Size component, the header and the Event data. | |
// | |
UINT32 Size; | |
EFI_CC_EVENT_HEADER Header; | |
UINT8 Event[1]; | |
} EFI_CC_EVENT; | |
#pragma pack() | |
typedef struct { | |
// | |
// Allocated size of the structure | |
// | |
UINT8 Size; | |
// | |
// Version of the EFI_CC_BOOT_SERVICE_CAPABILITY structure itself. | |
// For this version of the protocol, the Major version shall be set to 1 | |
// and the Minor version shall be set to 0. | |
// | |
EFI_CC_VERSION StructureVersion; | |
// | |
// Version of the EFI CC Measurement protocol. | |
// For this version of the protocol, the Major version shall be set to 1 | |
// and the Minor version shall be set to 0. | |
// | |
EFI_CC_VERSION ProtocolVersion; | |
// | |
// Supported hash algorithms | |
// | |
EFI_CC_EVENT_ALGORITHM_BITMAP HashAlgorithmBitmap; | |
// | |
// Bitmap of supported event log formats | |
// | |
EFI_CC_EVENT_LOG_BITMAP SupportedEventLogs; | |
// | |
// Indicates the CC type | |
// | |
EFI_CC_TYPE CcType; | |
} EFI_CC_BOOT_SERVICE_CAPABILITY; | |
/** | |
The EFI_CC_MEASUREMENT_PROTOCOL GetCapability function call provides protocol | |
capability information and state information. | |
@param[in] This Indicates the calling context | |
@param[in, out] ProtocolCapability The caller allocates memory for a EFI_CC_BOOT_SERVICE_CAPABILITY | |
structure and sets the size field to the size of the structure allocated. | |
The callee fills in the fields with the EFI CC BOOT Service capability | |
information and the current CC information. | |
@retval EFI_SUCCESS Operation completed successfully. | |
@retval EFI_DEVICE_ERROR The command was unsuccessful. | |
The ProtocolCapability variable will not be populated. | |
@retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. | |
The ProtocolCapability variable will not be populated. | |
@retval EFI_BUFFER_TOO_SMALL The ProtocolCapability variable is too small to hold the full response. | |
It will be partially populated (required Size field will be set). | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_CC_GET_CAPABILITY)( | |
IN EFI_CC_MEASUREMENT_PROTOCOL *This, | |
IN OUT EFI_CC_BOOT_SERVICE_CAPABILITY *ProtocolCapability | |
); | |
/** | |
The EFI_CC_MEASUREMENT_PROTOCOL Get Event Log function call allows a caller to | |
retrieve the address of a given event log and its last entry. | |
@param[in] This Indicates the calling context | |
@param[in] EventLogFormat The type of the event log for which the information is requested. | |
@param[out] EventLogLocation A pointer to the memory address of the event log. | |
@param[out] EventLogLastEntry If the Event Log contains more than one entry, this is a pointer to the | |
address of the start of the last entry in the event log in memory. | |
@param[out] EventLogTruncated If the Event Log is missing at least one entry because an event would | |
have exceeded the area allocated for events, this value is set to TRUE. | |
Otherwise, the value will be FALSE and the Event Log will be complete. | |
@retval EFI_SUCCESS Operation completed successfully. | |
@retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect | |
(e.g. asking for an event log whose format is not supported). | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_CC_GET_EVENT_LOG)( | |
IN EFI_CC_MEASUREMENT_PROTOCOL *This, | |
IN EFI_CC_EVENT_LOG_FORMAT EventLogFormat, | |
OUT EFI_PHYSICAL_ADDRESS *EventLogLocation, | |
OUT EFI_PHYSICAL_ADDRESS *EventLogLastEntry, | |
OUT BOOLEAN *EventLogTruncated | |
); | |
/** | |
The EFI_CC_MEASUREMENT_PROTOCOL HashLogExtendEvent function call provides | |
callers with an opportunity to extend and optionally log events without requiring | |
knowledge of actual CC commands. | |
The extend operation will occur even if this function cannot create an event | |
log entry (e.g. due to the event log being full). | |
@param[in] This Indicates the calling context | |
@param[in] Flags Bitmap providing additional information. | |
@param[in] DataToHash Physical address of the start of the data buffer to be hashed. | |
@param[in] DataToHashLen The length in bytes of the buffer referenced by DataToHash. | |
@param[in] EfiCcEvent Pointer to data buffer containing information about the event. | |
@retval EFI_SUCCESS Operation completed successfully. | |
@retval EFI_DEVICE_ERROR The command was unsuccessful. | |
@retval EFI_VOLUME_FULL The extend operation occurred, but the event could not be written to one or more event logs. | |
@retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect. | |
@retval EFI_UNSUPPORTED The PE/COFF image type is not supported. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_CC_HASH_LOG_EXTEND_EVENT)( | |
IN EFI_CC_MEASUREMENT_PROTOCOL *This, | |
IN UINT64 Flags, | |
IN EFI_PHYSICAL_ADDRESS DataToHash, | |
IN UINT64 DataToHashLen, | |
IN EFI_CC_EVENT *EfiCcEvent | |
); | |
/** | |
The EFI_CC_MEASUREMENT_PROTOCOL MapPcrToMrIndex function call provides callers | |
the info on TPM PCR <-> CC MR mapping information. | |
@param[in] This Indicates the calling context | |
@param[in] PcrIndex TPM PCR index. | |
@param[out] MrIndex CC MR index. | |
@retval EFI_SUCCESS The MrIndex is returned. | |
@retval EFI_INVALID_PARAMETER The MrIndex is NULL. | |
@retval EFI_UNSUPPORTED The PcrIndex is invalid. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_CC_MAP_PCR_TO_MR_INDEX)( | |
IN EFI_CC_MEASUREMENT_PROTOCOL *This, | |
IN TCG_PCRINDEX PcrIndex, | |
OUT EFI_CC_MR_INDEX *MrIndex | |
); | |
struct _EFI_CC_MEASUREMENT_PROTOCOL { | |
EFI_CC_GET_CAPABILITY GetCapability; | |
EFI_CC_GET_EVENT_LOG GetEventLog; | |
EFI_CC_HASH_LOG_EXTEND_EVENT HashLogExtendEvent; | |
EFI_CC_MAP_PCR_TO_MR_INDEX MapPcrToMrIndex; | |
}; | |
// | |
// CC event log | |
// | |
#pragma pack(1) | |
// | |
// Crypto Agile Log Entry Format. | |
// It is similar with TCG_PCR_EVENT2 except the field of MrIndex and PCRIndex. | |
// | |
typedef struct { | |
EFI_CC_MR_INDEX MrIndex; | |
UINT32 EventType; | |
TPML_DIGEST_VALUES Digests; | |
UINT32 EventSize; | |
UINT8 Event[1]; | |
} CC_EVENT; | |
// | |
// EFI CC Event Header | |
// It is similar with TCG_PCR_EVENT2_HDR except the field of MrIndex and PCRIndex | |
// | |
typedef struct { | |
EFI_CC_MR_INDEX MrIndex; | |
UINT32 EventType; | |
TPML_DIGEST_VALUES Digests; | |
UINT32 EventSize; | |
} CC_EVENT_HDR; | |
#pragma pack() | |
// | |
// Log entries after Get Event Log service | |
// | |
#define EFI_CC_FINAL_EVENTS_TABLE_VERSION 1 | |
typedef struct { | |
// | |
// The version of this structure. It shall be set to 1. | |
// | |
UINT64 Version; | |
// | |
// Number of events recorded after invocation of GetEventLog API | |
// | |
UINT64 NumberOfEvents; | |
// | |
// List of events of type CC_EVENT. | |
// | |
// CC_EVENT Event[1]; | |
} EFI_CC_FINAL_EVENTS_TABLE; | |
#define EFI_CC_FINAL_EVENTS_TABLE_GUID \ | |
{0xdd4a4648, 0x2de7, 0x4665, {0x96, 0x4d, 0x21, 0xd9, 0xef, 0x5f, 0xb4, 0x46}} | |
extern EFI_GUID gEfiCcFinalEventsTableGuid; | |
// | |
// Define the CC Measure EventLog ACPI Table | |
// | |
#pragma pack(1) | |
typedef struct { | |
EFI_ACPI_DESCRIPTION_HEADER Header; | |
EFI_CC_TYPE CcType; | |
UINT16 Rsvd; | |
UINT64 Laml; | |
UINT64 Lasa; | |
} EFI_CC_EVENTLOG_ACPI_TABLE; | |
#pragma pack() | |
// | |
// Define the signature and revision of CC Measurement EventLog ACPI Table | |
// | |
#define EFI_CC_EVENTLOG_ACPI_TABLE_SIGNATURE SIGNATURE_32('C', 'C', 'E', 'L') | |
#define EFI_CC_EVENTLOG_ACPI_TABLE_REVISION 1 | |
#endif |