summaryrefslogtreecommitdiffstats
path: root/src/shared/tpm2-event-log.h
blob: a33448fb85871f6871c06afe6241f2d6a7b831a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once

#include <uchar.h>

#include "tpm2-util.h"

/* Definitions as per "TCG PC Client Specific Platform Firmware Profile Specification"
 * (https://trustedcomputinggroup.org/resource/pc-client-specific-platform-firmware-profile-specification/),
 * section 10.4.1 "Event Types" (at least in version 1.05 Revision 23 of the spec) */
#ifndef EV_PREBOOT_CERT
#define EV_PREBOOT_CERT                  UINT32_C(0x00000000)
#define EV_POST_CODE                     UINT32_C(0x00000001)
#define EV_NO_ACTION                     UINT32_C(0x00000003)
#define EV_SEPARATOR                     UINT32_C(0x00000004)
#define EV_ACTION                        UINT32_C(0x00000005)
#define EV_EVENT_TAG                     UINT32_C(0x00000006)
#define EV_S_CRTM_CONTENTS               UINT32_C(0x00000007)
#define EV_S_CRTM_VERSION                UINT32_C(0x00000008)
#define EV_CPU_MICROCODE                 UINT32_C(0x00000009)
#define EV_PLATFORM_CONFIG_FLAGS         UINT32_C(0x0000000a)
#define EV_TABLE_OF_DEVICES              UINT32_C(0x0000000b)
#define EV_COMPACT_HASH                  UINT32_C(0x0000000c)
#define EV_IPL                           UINT32_C(0x0000000d)
#define EV_IPL_PARTITION_DATA            UINT32_C(0x0000000e)
#define EV_NONHOST_CODE                  UINT32_C(0x0000000f)
#define EV_NONHOST_CONFIG                UINT32_C(0x00000010)
#define EV_NONHOST_INFO                  UINT32_C(0x00000011)
#define EV_OMIT_BOOT_DEVICE_EVENTS       UINT32_C(0x00000012)
#define EV_EFI_EVENT_BASE                UINT32_C(0x80000000)
#define EV_EFI_VARIABLE_DRIVER_CONFIG    UINT32_C(0x80000001)
#define EV_EFI_VARIABLE_BOOT             UINT32_C(0x80000002)
#define EV_EFI_BOOT_SERVICES_APPLICATION UINT32_C(0x80000003)
#define EV_EFI_BOOT_SERVICES_DRIVER      UINT32_C(0x80000004)
#define EV_EFI_RUNTIME_SERVICES_DRIVER   UINT32_C(0x80000005)
#define EV_EFI_GPT_EVENT                 UINT32_C(0x80000006)
#define EV_EFI_ACTION                    UINT32_C(0x80000007)
#define EV_EFI_PLATFORM_FIRMWARE_BLOB    UINT32_C(0x80000008)
#define EV_EFI_HANDOFF_TABLES            UINT32_C(0x80000009)
#define EV_EFI_PLATFORM_FIRMWARE_BLOB2   UINT32_C(0x8000000A)
#define EV_EFI_HANDOFF_TABLES2           UINT32_C(0x8000000B)
#define EV_EFI_VARIABLE_BOOT2            UINT32_C(0x8000000C)
#define EV_EFI_HCRTM_EVENT               UINT32_C(0x80000010)
#define EV_EFI_VARIABLE_AUTHORITY        UINT32_C(0x800000E0)
#define EV_EFI_SPDM_FIRMWARE_BLOB        UINT32_C(0x800000E1)
#define EV_EFI_SPDM_FIRMWARE_CONFIG      UINT32_C(0x800000E2)
#endif

/* Defined in drivers/firmware/efi/libstub/efistub.h in the Linux kernel sources */
#ifndef INITRD_EVENT_TAG_ID
#define INITRD_EVENT_TAG_ID UINT32_C(0x8F3B22EC)
#endif

#ifndef LOAD_OPTIONS_EVENT_TAG_ID
#define LOAD_OPTIONS_EVENT_TAG_ID UINT32_C(0x8F3B22ED)
#endif

const char* tpm2_log_event_type_to_string(uint32_t type) _const_;

#if HAVE_TPM2

/* UEFI event log data structures */
typedef struct _packed_ TCG_PCClientPCREvent {
        uint32_t pcrIndex;
        uint32_t eventType;
        uint8_t digest[20];
        uint32_t eventDataSize;
        uint32_t event[];
} TCG_PCClientPCREvent;

typedef struct _packed_ packed_TPMT_HA {
        uint16_t hashAlg;
        TPMU_HA digest;
} packed_TPMT_HA;

typedef struct _packed_ packed_TPML_DIGEST_VALUES {
        uint32_t count;
        packed_TPMT_HA digests[];
} packed_TPML_DIGEST_VALUES;

typedef struct _packed_ TCG_PCR_EVENT2 {
        uint32_t pcrIndex;
        uint32_t eventType;
        packed_TPML_DIGEST_VALUES digests;
        /* … */
} TCG_PCR_EVENT2;

typedef struct _packed_ TCG_EfiSpecIdEventAlgorithmSize {
        uint16_t algorithmId;
        uint16_t digestSize;
} TCG_EfiSpecIdEventAlgorithmSize;

typedef struct _packed_ tdTCG_EfiSpecIdEvent {
        uint8_t signature[16];
        uint32_t platformClass;
        uint8_t specVersionMinor;
        uint8_t specVersionMajor;
        uint8_t specErrata;
        uint8_t uintnSize;
        uint32_t numberOfAlgorithms;
        TCG_EfiSpecIdEventAlgorithmSize digestSizes[];
        /* … */
} TCG_EfiSpecIDEvent;

typedef struct _packed_ UEFI_VARIABLE_DATA {
        uint8_t variableName[16];
        uint64_t unicodeNameLength;
        uint64_t variableDataLength;
        char16_t unicodeName[];
        /* … */
} UEFI_VARIABLE_DATA;

typedef struct _packed_ TCG_PCClientTaggedEvent{
        uint32_t taggedEventID;
        uint32_t taggedEventDataSize;
        uint8_t taggedEventData[];
} TCG_PCClientTaggedEvent;

typedef struct _packed_ packed_EFI_DEVICE_PATH {
        uint8_t type;
        uint8_t subType;
        uint16_t length;
        uint8_t path[];
} packed_EFI_DEVICE_PATH;

typedef struct _packed_ UEFI_IMAGE_LOAD_EVENT {
        uint64_t imageLocationInMemory;
        uint64_t imageLengthInMemory;
        uint64_t imageLinkTimeAddress;
        uint64_t lengthOfDevicePath;
        packed_EFI_DEVICE_PATH devicePath[];
} UEFI_IMAGE_LOAD_EVENT;

typedef struct _packed_ UEFI_PLATFORM_FIRMWARE_BLOB {
        uint64_t blobBase;
        uint64_t blobLength;
} UEFI_PLATFORM_FIRMWARE_BLOB;

#endif