1 /** @file
2   TPM2 Protocol as defined in TCG PC Client Platform EFI Protocol Specification Family "2.0".
3   See http://trustedcomputinggroup.org for the latest specification
4 
5 Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #ifndef __TCG2_PROTOCOL_H__
11 #define __TCG2_PROTOCOL_H__
12 
13 #include <IndustryStandard/UefiTcgPlatform.h>
14 #include <IndustryStandard/Tpm20.h>
15 
16 #define EFI_TCG2_PROTOCOL_GUID \
17   {0x607f766c, 0x7455, 0x42be, { 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f }}
18 
19 typedef struct tdEFI_TCG2_PROTOCOL EFI_TCG2_PROTOCOL;
20 
21 typedef struct tdEFI_TCG2_VERSION {
22   UINT8    Major;
23   UINT8    Minor;
24 } EFI_TCG2_VERSION;
25 
26 typedef UINT32 EFI_TCG2_EVENT_LOG_BITMAP;
27 typedef UINT32 EFI_TCG2_EVENT_LOG_FORMAT;
28 typedef UINT32 EFI_TCG2_EVENT_ALGORITHM_BITMAP;
29 
30 #define EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2  0x00000001
31 #define EFI_TCG2_EVENT_LOG_FORMAT_TCG_2    0x00000002
32 
33 typedef struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY {
34   //
35   // Allocated size of the structure
36   //
37   UINT8                              Size;
38   //
39   // Version of the EFI_TCG2_BOOT_SERVICE_CAPABILITY structure itself.
40   // For this version of the protocol, the Major version shall be set to 1
41   // and the Minor version shall be set to 1.
42   //
43   EFI_TCG2_VERSION                   StructureVersion;
44   //
45   // Version of the EFI TCG2 protocol.
46   // For this version of the protocol, the Major version shall be set to 1
47   // and the Minor version shall be set to 1.
48   //
49   EFI_TCG2_VERSION                   ProtocolVersion;
50   //
51   // Supported hash algorithms (this bitmap is determined by the supported PCR
52   // banks in the TPM and the hashing algorithms supported by the firmware)
53   //
54   EFI_TCG2_EVENT_ALGORITHM_BITMAP    HashAlgorithmBitmap;
55   //
56   // Bitmap of supported event log formats
57   //
58   EFI_TCG2_EVENT_LOG_BITMAP          SupportedEventLogs;
59   //
60   // False = TPM not present
61   //
62   BOOLEAN                            TPMPresentFlag;
63   //
64   // Max size (in bytes) of a command that can be sent to the TPM
65   //
66   UINT16                             MaxCommandSize;
67   //
68   // Max size (in bytes) of a response that can be provided by the TPM
69   //
70   UINT16                             MaxResponseSize;
71   //
72   // 4-byte Vendor ID
73   // (see TCG Vendor ID registry, Section "TPM Capabilities Vendor ID")
74   //
75   UINT32                             ManufacturerID;
76   //
77   // Maximum number of PCR banks (hashing algorithms) supported.
78   // No granularity is provided to support a specific set of algorithms.
79   // Minimum value is 1.
80   //
81   UINT32                             NumberOfPCRBanks;
82   //
83   // A bitmap of currently active PCR banks (hashing algorithms).
84   // This is a subset of the supported hashing algorithms reported in HashAlgorithmBitMap.
85   // NumberOfPcrBanks defines the number of bits that are set.
86   //
87   EFI_TCG2_EVENT_ALGORITHM_BITMAP    ActivePcrBanks;
88 } EFI_TCG2_BOOT_SERVICE_CAPABILITY;
89 
90 #define EFI_TCG2_BOOT_HASH_ALG_SHA1     0x00000001
91 #define EFI_TCG2_BOOT_HASH_ALG_SHA256   0x00000002
92 #define EFI_TCG2_BOOT_HASH_ALG_SHA384   0x00000004
93 #define EFI_TCG2_BOOT_HASH_ALG_SHA512   0x00000008
94 #define EFI_TCG2_BOOT_HASH_ALG_SM3_256  0x00000010
95 
96 //
97 // This bit is shall be set when an event shall be extended but not logged.
98 //
99 #define EFI_TCG2_EXTEND_ONLY  0x0000000000000001
100 //
101 // This bit shall be set when the intent is to measure a PE/COFF image.
102 //
103 #define PE_COFF_IMAGE  0x0000000000000010
104 
105 #define MAX_PCR_INDEX  23
106 
107 #pragma pack(1)
108 
109 #define EFI_TCG2_EVENT_HEADER_VERSION  1
110 
111 typedef struct {
112   //
113   // Size of the event header itself (sizeof(EFI_TCG2_EVENT_HEADER)).
114   //
115   UINT32           HeaderSize;
116   //
117   // Header version. For this version of this specification, the value shall be 1.
118   //
119   UINT16           HeaderVersion;
120   //
121   // Index of the PCR that shall be extended (0 - 23).
122   //
123   TCG_PCRINDEX     PCRIndex;
124   //
125   // Type of the event that shall be extended (and optionally logged).
126   //
127   TCG_EVENTTYPE    EventType;
128 } EFI_TCG2_EVENT_HEADER;
129 
130 typedef struct tdEFI_TCG2_EVENT {
131   //
132   // Total size of the event including the Size component, the header and the Event data.
133   //
134   UINT32                   Size;
135   EFI_TCG2_EVENT_HEADER    Header;
136   UINT8                    Event[1];
137 } EFI_TCG2_EVENT;
138 
139 #pragma pack()
140 
141 /**
142   The EFI_TCG2_PROTOCOL GetCapability function call provides protocol
143   capability information and state information.
144 
145   @param[in]      This               Indicates the calling context
146   @param[in, out] ProtocolCapability The caller allocates memory for a EFI_TCG2_BOOT_SERVICE_CAPABILITY
147                                      structure and sets the size field to the size of the structure allocated.
148                                      The callee fills in the fields with the EFI protocol capability information
149                                      and the current EFI TCG2 state information up to the number of fields which
150                                      fit within the size of the structure passed in.
151 
152   @retval EFI_SUCCESS            Operation completed successfully.
153   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
154                                  The ProtocolCapability variable will not be populated.
155   @retval EFI_INVALID_PARAMETER  One or more of the parameters are incorrect.
156                                  The ProtocolCapability variable will not be populated.
157   @retval EFI_BUFFER_TOO_SMALL   The ProtocolCapability variable is too small to hold the full response.
158                                  It will be partially populated (required Size field will be set).
159 **/
160 typedef
161 EFI_STATUS
162 (EFIAPI *EFI_TCG2_GET_CAPABILITY)(
163   IN EFI_TCG2_PROTOCOL                    *This,
164   IN OUT EFI_TCG2_BOOT_SERVICE_CAPABILITY *ProtocolCapability
165   );
166 
167 /**
168   The EFI_TCG2_PROTOCOL Get Event Log function call allows a caller to
169   retrieve the address of a given event log and its last entry.
170 
171   @param[in]  This               Indicates the calling context
172   @param[in]  EventLogFormat     The type of the event log for which the information is requested.
173   @param[out] EventLogLocation   A pointer to the memory address of the event log.
174   @param[out] EventLogLastEntry  If the Event Log contains more than one entry, this is a pointer to the
175                                  address of the start of the last entry in the event log in memory.
176   @param[out] EventLogTruncated  If the Event Log is missing at least one entry because an event would
177                                  have exceeded the area allocated for events, this value is set to TRUE.
178                                  Otherwise, the value will be FALSE and the Event Log will be complete.
179 
180   @retval EFI_SUCCESS            Operation completed successfully.
181   @retval EFI_INVALID_PARAMETER  One or more of the parameters are incorrect
182                                  (e.g. asking for an event log whose format is not supported).
183 **/
184 typedef
185 EFI_STATUS
186 (EFIAPI *EFI_TCG2_GET_EVENT_LOG)(
187   IN EFI_TCG2_PROTOCOL         *This,
188   IN EFI_TCG2_EVENT_LOG_FORMAT EventLogFormat,
189   OUT EFI_PHYSICAL_ADDRESS     *EventLogLocation,
190   OUT EFI_PHYSICAL_ADDRESS     *EventLogLastEntry,
191   OUT BOOLEAN                  *EventLogTruncated
192   );
193 
194 /**
195   The EFI_TCG2_PROTOCOL HashLogExtendEvent function call provides callers with
196   an opportunity to extend and optionally log events without requiring
197   knowledge of actual TPM commands.
198   The extend operation will occur even if this function cannot create an event
199   log entry (e.g. due to the event log being full).
200 
201   @param[in]  This               Indicates the calling context
202   @param[in]  Flags              Bitmap providing additional information.
203   @param[in]  DataToHash         Physical address of the start of the data buffer to be hashed.
204   @param[in]  DataToHashLen      The length in bytes of the buffer referenced by DataToHash.
205   @param[in]  EfiTcgEvent        Pointer to data buffer containing information about the event.
206 
207   @retval EFI_SUCCESS            Operation completed successfully.
208   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
209   @retval EFI_VOLUME_FULL        The extend operation occurred, but the event could not be written to one or more event logs.
210   @retval EFI_INVALID_PARAMETER  One or more of the parameters are incorrect.
211   @retval EFI_UNSUPPORTED        The PE/COFF image type is not supported.
212 **/
213 typedef
214 EFI_STATUS
215 (EFIAPI *EFI_TCG2_HASH_LOG_EXTEND_EVENT)(
216   IN EFI_TCG2_PROTOCOL    *This,
217   IN UINT64               Flags,
218   IN EFI_PHYSICAL_ADDRESS DataToHash,
219   IN UINT64               DataToHashLen,
220   IN EFI_TCG2_EVENT       *EfiTcgEvent
221   );
222 
223 /**
224   This service enables the sending of commands to the TPM.
225 
226   @param[in]  This                     Indicates the calling context
227   @param[in]  InputParameterBlockSize  Size of the TPM input parameter block.
228   @param[in]  InputParameterBlock      Pointer to the TPM input parameter block.
229   @param[in]  OutputParameterBlockSize Size of the TPM output parameter block.
230   @param[in]  OutputParameterBlock     Pointer to the TPM output parameter block.
231 
232   @retval EFI_SUCCESS            The command byte stream was successfully sent to the device and a response was successfully received.
233   @retval EFI_DEVICE_ERROR       The command was not successfully sent to the device or a response was not successfully received from the device.
234   @retval EFI_INVALID_PARAMETER  One or more of the parameters are incorrect.
235   @retval EFI_BUFFER_TOO_SMALL   The output parameter block is too small.
236 **/
237 typedef
238 EFI_STATUS
239 (EFIAPI *EFI_TCG2_SUBMIT_COMMAND)(
240   IN EFI_TCG2_PROTOCOL *This,
241   IN UINT32            InputParameterBlockSize,
242   IN UINT8             *InputParameterBlock,
243   IN UINT32            OutputParameterBlockSize,
244   IN UINT8             *OutputParameterBlock
245   );
246 
247 /**
248   This service returns the currently active PCR banks.
249 
250   @param[in]  This            Indicates the calling context
251   @param[out] ActivePcrBanks  Pointer to the variable receiving the bitmap of currently active PCR banks.
252 
253   @retval EFI_SUCCESS           The bitmap of active PCR banks was stored in the ActivePcrBanks parameter.
254   @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect.
255 **/
256 typedef
257 EFI_STATUS
258 (EFIAPI *EFI_TCG2_GET_ACTIVE_PCR_BANKS)(
259   IN  EFI_TCG2_PROTOCOL *This,
260   OUT UINT32            *ActivePcrBanks
261   );
262 
263 /**
264   This service sets the currently active PCR banks.
265 
266   @param[in]  This            Indicates the calling context
267   @param[in]  ActivePcrBanks  Bitmap of the requested active PCR banks. At least one bit SHALL be set.
268 
269   @retval EFI_SUCCESS           The bitmap in ActivePcrBank parameter is already active.
270   @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect.
271 **/
272 typedef
273 EFI_STATUS
274 (EFIAPI *EFI_TCG2_SET_ACTIVE_PCR_BANKS)(
275   IN EFI_TCG2_PROTOCOL *This,
276   IN UINT32            ActivePcrBanks
277   );
278 
279 /**
280   This service retrieves the result of a previous invocation of SetActivePcrBanks.
281 
282   @param[in]  This              Indicates the calling context
283   @param[out] OperationPresent  Non-zero value to indicate a SetActivePcrBank operation was invoked during the last boot.
284   @param[out] Response          The response from the SetActivePcrBank request.
285 
286   @retval EFI_SUCCESS           The result value could be returned.
287   @retval EFI_INVALID_PARAMETER One or more of the parameters are incorrect.
288 **/
289 typedef
290 EFI_STATUS
291 (EFIAPI *EFI_TCG2_GET_RESULT_OF_SET_ACTIVE_PCR_BANKS)(
292   IN  EFI_TCG2_PROTOCOL  *This,
293   OUT UINT32             *OperationPresent,
294   OUT UINT32             *Response
295   );
296 
297 struct tdEFI_TCG2_PROTOCOL {
298   EFI_TCG2_GET_CAPABILITY                        GetCapability;
299   EFI_TCG2_GET_EVENT_LOG                         GetEventLog;
300   EFI_TCG2_HASH_LOG_EXTEND_EVENT                 HashLogExtendEvent;
301   EFI_TCG2_SUBMIT_COMMAND                        SubmitCommand;
302   EFI_TCG2_GET_ACTIVE_PCR_BANKS                  GetActivePcrBanks;
303   EFI_TCG2_SET_ACTIVE_PCR_BANKS                  SetActivePcrBanks;
304   EFI_TCG2_GET_RESULT_OF_SET_ACTIVE_PCR_BANKS    GetResultOfSetActivePcrBanks;
305 };
306 
307 extern EFI_GUID  gEfiTcg2ProtocolGuid;
308 
309 //
310 // Log entries after Get Event Log service
311 //
312 
313 #define EFI_TCG2_FINAL_EVENTS_TABLE_GUID \
314   {0x1e2ed096, 0x30e2, 0x4254, { 0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25 }}
315 
316 extern EFI_GUID  gEfiTcg2FinalEventsTableGuid;
317 
318 typedef struct tdEFI_TCG2_FINAL_EVENTS_TABLE {
319   //
320   // The version of this structure.
321   //
322   UINT64    Version;
323   //
324   // Number of events recorded after invocation of GetEventLog API
325   //
326   UINT64    NumberOfEvents;
327   //
328   // List of events of type TCG_PCR_EVENT2.
329   //
330   // TCG_PCR_EVENT2          Event[1];
331 } EFI_TCG2_FINAL_EVENTS_TABLE;
332 
333 #define EFI_TCG2_FINAL_EVENTS_TABLE_VERSION  1
334 
335 #endif
336