mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
efi/tpm: Add EFI_CC_MEASUREMENT_PROTOCOL support
The EFI_CC_MEASUREMENT_PROTOCOL abstracts the measurement for virtual firmware in confidential computing environment. It is similar to the EFI_TCG2_PROTOCOL. It was proposed by Intel and ARM and approved by UEFI organization. It is defined in Intel GHCI specification: https://cdrdv2.intel.com/v1/dl/getContent/726790 . The EDKII header file is available at https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/CcMeasurement.h . Signed-off-by: Lu Ken <ken.lu@intel.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
1 parent
ef8679b645
commit
4c76565b6c
2 files changed
+199
No files matched your search
@@ -22,6 +22,7 @@
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/efi/api.h>
|
||||
#include <grub/efi/efi.h>
|
||||
#include <grub/efi/cc.h>
|
||||
#include <grub/efi/tpm.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/tpm.h>
|
||||
@@ -31,6 +32,7 @@ typedef TCG_PCR_EVENT grub_tpm_event_t;
|
||||
|
||||
static grub_efi_guid_t tpm_guid = EFI_TPM_GUID;
|
||||
static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
|
||||
static grub_efi_guid_t cc_measurement_guid = GRUB_EFI_CC_MEASUREMENT_PROTOCOL_GUID;
|
||||
|
||||
static grub_efi_handle_t *grub_tpm_handle;
|
||||
static grub_uint8_t grub_tpm_version;
|
||||
@@ -221,6 +223,50 @@ grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf,
|
||||
return grub_efi_log_event_status (status);
|
||||
}
|
||||
|
||||
static void
|
||||
grub_cc_log_event (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
const char *description)
|
||||
{
|
||||
grub_efi_cc_event_t *event;
|
||||
grub_efi_status_t status;
|
||||
grub_efi_cc_protocol_t *cc;
|
||||
grub_efi_cc_mr_index_t mr;
|
||||
|
||||
cc = grub_efi_locate_protocol (&cc_measurement_guid, NULL);
|
||||
if (cc == NULL)
|
||||
return;
|
||||
|
||||
status = efi_call_3 (cc->map_pcr_to_mr_index, cc, pcr, &mr);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
{
|
||||
grub_efi_log_event_status (status);
|
||||
return;
|
||||
}
|
||||
|
||||
event = grub_zalloc (sizeof (grub_efi_cc_event_t) +
|
||||
grub_strlen (description) + 1);
|
||||
if (event == NULL)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate CC event buffer"));
|
||||
return;
|
||||
}
|
||||
|
||||
event->Header.HeaderSize = sizeof (grub_efi_cc_event_header_t);
|
||||
event->Header.HeaderVersion = GRUB_EFI_CC_EVENT_HEADER_VERSION;
|
||||
event->Header.MrIndex = mr;
|
||||
event->Header.EventType = EV_IPL;
|
||||
event->Size = sizeof (*event) + grub_strlen (description) + 1;
|
||||
grub_strcpy ((char *) event->Event, description);
|
||||
|
||||
status = efi_call_5 (cc->hash_log_extend_event, cc, 0,
|
||||
(grub_efi_physical_address_t)(grub_addr_t) buf,
|
||||
(grub_efi_uint64_t) size, event);
|
||||
grub_free (event);
|
||||
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
grub_efi_log_event_status (status);
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
const char *description)
|
||||
@@ -228,6 +274,8 @@ grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||
grub_efi_handle_t tpm_handle;
|
||||
grub_efi_uint8_t protocol_version;
|
||||
|
||||
grub_cc_log_event(buf, size, pcr, description);
|
||||
|
||||
if (!grub_tpm_handle_find (&tpm_handle, &protocol_version))
|
||||
return 0;
|
||||
|
||||
|
||||
Reference in new issue
Block a user