Skip to content

Commit 3e0b0f8

Browse files
committed
efi/libstub: Use TPM event typedefs from the TCG PC Client spec
Our efi_tcg2_tagged_event is not defined in the EFI spec, but it is not a local invention either: it was taken from the TCG PC Client spec, where it is called TCG_PCClientTaggedEvent. Note that this spec also contains some guidance on how to populate it, which is not being followed closely at the moment; it claims that the event size should cover the TCG_PCClientTaggedEvent and its payload only, but it currently covers the preceding efi_tcg2_event too. However, this directly contradicts the TCG EFI protocol specification, which states very clearly that the event size should cover the entire data structure, including the leading efi_tcg2_event_t struct. So rename the struct and document its provenance, but retain the existing logic to populate the size field. Link: https://lore.kernel.org/all/20240308085754.476197-8-ardb+git@google.com Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
1 parent 841c351 commit 3e0b0f8

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

drivers/firmware/efi/libstub/efi-stub-helper.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <linux/efi.h>
1313
#include <linux/kernel.h>
14+
#include <linux/overflow.h>
1415
#include <asm/efi.h>
1516
#include <asm/setup.h>
1617

@@ -219,23 +220,24 @@ static const struct {
219220
},
220221
};
221222

223+
struct efistub_measured_event {
224+
efi_tcg2_event_t event_data;
225+
TCG_PCClientTaggedEvent tagged_event __packed;
226+
};
227+
222228
static efi_status_t efi_measure_tagged_event(unsigned long load_addr,
223229
unsigned long load_size,
224230
enum efistub_event event)
225231
{
232+
struct efistub_measured_event *evt;
233+
int size = struct_size(evt, tagged_event.tagged_event_data,
234+
events[event].event_data_len);
226235
efi_guid_t tcg2_guid = EFI_TCG2_PROTOCOL_GUID;
227236
efi_tcg2_protocol_t *tcg2 = NULL;
228237
efi_status_t status;
229238

230239
efi_bs_call(locate_protocol, &tcg2_guid, NULL, (void **)&tcg2);
231240
if (tcg2) {
232-
struct efi_measured_event {
233-
efi_tcg2_event_t event_data;
234-
efi_tcg2_tagged_event_t tagged_event;
235-
u8 tagged_event_data[];
236-
} *evt;
237-
int size = sizeof(*evt) + events[event].event_data_len;
238-
239241
status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, size,
240242
(void **)&evt);
241243
if (status != EFI_SUCCESS)
@@ -249,12 +251,12 @@ static efi_status_t efi_measure_tagged_event(unsigned long load_addr,
249251
.event_header.event_type = EV_EVENT_TAG,
250252
};
251253

252-
evt->tagged_event = (struct efi_tcg2_tagged_event){
254+
evt->tagged_event = (TCG_PCClientTaggedEvent){
253255
.tagged_event_id = events[event].event_id,
254256
.tagged_event_data_size = events[event].event_data_len,
255257
};
256258

257-
memcpy(evt->tagged_event_data, events[event].event_data,
259+
memcpy(evt->tagged_event.tagged_event_data, events[event].event_data,
258260
events[event].event_data_len);
259261

260262
status = efi_call_proto(tcg2, hash_log_extend_event, 0,

drivers/firmware/efi/libstub/efistub.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -843,14 +843,14 @@ struct efi_tcg2_event {
843843
/* u8[] event follows here */
844844
} __packed;
845845

846-
struct efi_tcg2_tagged_event {
847-
u32 tagged_event_id;
848-
u32 tagged_event_data_size;
849-
/* u8 tagged event data follows here */
850-
} __packed;
846+
/* from TCG PC Client Platform Firmware Profile Specification */
847+
typedef struct tdTCG_PCClientTaggedEvent {
848+
u32 tagged_event_id;
849+
u32 tagged_event_data_size;
850+
u8 tagged_event_data[];
851+
} TCG_PCClientTaggedEvent;
851852

852853
typedef struct efi_tcg2_event efi_tcg2_event_t;
853-
typedef struct efi_tcg2_tagged_event efi_tcg2_tagged_event_t;
854854
typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
855855

856856
union efi_tcg2_protocol {

0 commit comments

Comments
 (0)