From 2558005814e4a64f8941216b9dc3d3c3a9b35c51 Mon Sep 17 00:00:00 2001 From: George Almasi Date: Fri, 8 Apr 2022 15:27:05 +0000 Subject: [PATCH 2/9] Patch set for handling of new event types in tpm2_eventlog: EV_EFI_PLATFORM_FIRMWARE_BLOB2, EV_EFI_HANDOFF_TABLES2, EV_EFI_VARIABLE_BOOT2 Signed-off-by: George Almasi --- lib/efi_event.h | 11 ++++++++ lib/tpm2_eventlog_yaml.c | 42 ++++++++++++++++++++++++++++- test/unit/test_tpm2_eventlog_yaml.c | 6 +++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/lib/efi_event.h b/lib/efi_event.h index 0136e32b..cc2ffc98 100644 --- a/lib/efi_event.h +++ b/lib/efi_event.h @@ -41,6 +41,10 @@ #define EV_EFI_ACTION EV_EFI_EVENT_BASE + 0x7 #define EV_EFI_PLATFORM_FIRMWARE_BLOB EV_EFI_EVENT_BASE + 0x8 #define EV_EFI_HANDOFF_TABLES EV_EFI_EVENT_BASE + 0x9 +#define EV_EFI_PLATFORM_FIRMWARE_BLOB2 EV_EFI_EVENT_BASE + 0xa +#define EV_EFI_HANDOFF_TABLES2 EV_EFI_EVENT_BASE + 0xb +#define EV_EFI_VARIABLE_BOOT2 EV_EFI_EVENT_BASE + 0xc + #define EV_EFI_VARIABLE_AUTHORITY EV_EFI_EVENT_BASE + 0xe0 #ifndef PACKED @@ -96,6 +100,13 @@ typedef struct { UINT64 BlobLength; } PACKED UEFI_PLATFORM_FIRMWARE_BLOB; + +typedef struct { + UINT8 BlobDescriptionSize; + BYTE BlobDescription[]; + /* UEFI_PLATFORM_FIRMWARE_BLOB comes next */ +} PACKED UEFI_PLATFORM_FIRMWARE_BLOB2; + typedef struct { UINT32 pcrIndex; UINT32 eventType; diff --git a/lib/tpm2_eventlog_yaml.c b/lib/tpm2_eventlog_yaml.c index 9b048db1..d2d4aefe 100644 --- a/lib/tpm2_eventlog_yaml.c +++ b/lib/tpm2_eventlog_yaml.c @@ -90,6 +90,12 @@ char const *eventtype_to_string (UINT32 event_type) { return "EV_EFI_PLATFORM_FIRMWARE_BLOB"; case EV_EFI_HANDOFF_TABLES: return "EV_EFI_HANDOFF_TABLES"; + case EV_EFI_PLATFORM_FIRMWARE_BLOB2: + return "EV_EFI_PLATFORM_FIRMWARE_BLOB2"; + case EV_EFI_HANDOFF_TABLES2: + return "EV_EFI_HANDOFF_TABLES2"; + case EV_EFI_VARIABLE_BOOT2: + return "EV_EFI_VARIABLE_BOOT2"; case EV_EFI_VARIABLE_AUTHORITY: return "EV_EFI_VARIABLE_AUTHORITY"; default: @@ -433,7 +439,7 @@ static bool yaml_uefi_var(UEFI_VARIABLE_DATA *data, size_t size, UINT32 type, uuidstr, sdata); free(sdata); return true; - } else if (type == EV_EFI_VARIABLE_BOOT) { + } else if (type == EV_EFI_VARIABLE_BOOT || type == EV_EFI_VARIABLE_BOOT2) { if ((strlen(ret) == 9 && strncmp(ret, "BootOrder", 9) == 0)) { free(ret); tpm2_tool_output(" VariableData:\n"); @@ -526,6 +532,37 @@ bool yaml_uefi_platfwblob(UEFI_PLATFORM_FIRMWARE_BLOB *data) { data->BlobLength); return true; } + +/* TCG PC Client PFP (02 dec 2020) section 10.2.5 */ +bool yaml_uefi_platfwblob2(UEFI_PLATFORM_FIRMWARE_BLOB2 *data) { + UINT8 blobdescsize = data->BlobDescriptionSize; + UEFI_PLATFORM_FIRMWARE_BLOB * data2 = (UEFI_PLATFORM_FIRMWARE_BLOB *)((UINT8 *)data + sizeof(UINT8) + blobdescsize); + + char * eventdesc = (char *)calloc (1, 2*blobdescsize+1); + if (!eventdesc) { + LOG_ERR("failed to allocate memory: %s\n", strerror(errno)); + return false; + } + + bytes_to_str (data->BlobDescription, blobdescsize, eventdesc, 2*blobdescsize); + + tpm2_tool_output(" Event:\n" + " BlobDescriptionSize: %d\n" + " BlobDescription: \"%.*s\"\n" + " BlobBase: 0x%" PRIx64 "\n" + " BlobLength: 0x%" PRIx64 "\n", + blobdescsize, + 2*blobdescsize, + eventdesc, + data2->BlobBase, + data2->BlobLength); + + free(eventdesc); + return true; +} + + + /* TCG PC Client PFP section 9.4.4 */ bool yaml_uefi_action(UINT8 const *action, size_t size) { @@ -713,6 +750,7 @@ bool yaml_event2data(TCG_EVENT2 const *event, UINT32 type, uint32_t eventlog_ver switch (type) { case EV_EFI_VARIABLE_DRIVER_CONFIG: case EV_EFI_VARIABLE_BOOT: + case EV_EFI_VARIABLE_BOOT2: case EV_EFI_VARIABLE_AUTHORITY: return yaml_uefi_var((UEFI_VARIABLE_DATA*)event->Event, event->EventSize, type, eventlog_version); @@ -721,6 +759,8 @@ bool yaml_event2data(TCG_EVENT2 const *event, UINT32 type, uint32_t eventlog_ver case EV_S_CRTM_CONTENTS: case EV_EFI_PLATFORM_FIRMWARE_BLOB: return yaml_uefi_platfwblob((UEFI_PLATFORM_FIRMWARE_BLOB*)event->Event); + case EV_EFI_PLATFORM_FIRMWARE_BLOB2: + return yaml_uefi_platfwblob2((UEFI_PLATFORM_FIRMWARE_BLOB2*)event->Event); case EV_EFI_ACTION: return yaml_uefi_action(event->Event, event->EventSize); case EV_IPL: diff --git a/test/unit/test_tpm2_eventlog_yaml.c b/test/unit/test_tpm2_eventlog_yaml.c index d4e30b0e..6881703b 100644 --- a/test/unit/test_tpm2_eventlog_yaml.c +++ b/test/unit/test_tpm2_eventlog_yaml.c @@ -47,6 +47,9 @@ def_eventtype_to_string(EV_EFI_GPT_EVENT) def_eventtype_to_string(EV_EFI_ACTION) def_eventtype_to_string(EV_EFI_PLATFORM_FIRMWARE_BLOB) def_eventtype_to_string(EV_EFI_HANDOFF_TABLES) +def_eventtype_to_string(EV_EFI_PLATFORM_FIRMWARE_BLOB2) +def_eventtype_to_string(EV_EFI_HANDOFF_TABLES2) +def_eventtype_to_string(EV_EFI_VARIABLE_BOOT2) def_eventtype_to_string(EV_EFI_VARIABLE_AUTHORITY) static void eventtype_to_string_default(void **state) { @@ -141,6 +144,9 @@ int main(void) { cmocka_unit_test(eventtype_to_string_EV_EFI_ACTION), cmocka_unit_test(eventtype_to_string_EV_EFI_PLATFORM_FIRMWARE_BLOB), cmocka_unit_test(eventtype_to_string_EV_EFI_HANDOFF_TABLES), + cmocka_unit_test(eventtype_to_string_EV_EFI_PLATFORM_FIRMWARE_BLOB2), + cmocka_unit_test(eventtype_to_string_EV_EFI_HANDOFF_TABLES2), + cmocka_unit_test(eventtype_to_string_EV_EFI_VARIABLE_BOOT2), cmocka_unit_test(eventtype_to_string_EV_EFI_VARIABLE_AUTHORITY), cmocka_unit_test(eventtype_to_string_default), cmocka_unit_test(test_yaml_event2hdr_callback), -- 2.37.3