1 /** @file
2   This library is used by other modules to send TPM2 command.
3 
4 Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved. <BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _TPM2_COMMAND_LIB_H_
16 #define _TPM2_COMMAND_LIB_H_
17 
18 #include <IndustryStandard/Tpm20.h>
19 
20 /**
21   This command starts a hash or an Event sequence.
22   If hashAlg is an implemented hash, then a hash sequence is started.
23   If hashAlg is TPM_ALG_NULL, then an Event sequence is started.
24 
25   @param[in]  HashAlg           The hash algorithm to use for the hash sequence
26                                 An Event sequence starts if this is TPM_ALG_NULL.
27   @param[out] SequenceHandle    A handle to reference the sequence
28 
29   @retval EFI_SUCCESS      Operation completed successfully.
30   @retval EFI_DEVICE_ERROR Unexpected device behavior.
31 **/
32 EFI_STATUS
33 EFIAPI
34 Tpm2HashSequenceStart (
35   IN TPMI_ALG_HASH   HashAlg,
36   OUT TPMI_DH_OBJECT *SequenceHandle
37   );
38 
39 /**
40   This command is used to add data to a hash or HMAC sequence.
41   The amount of data in buffer may be any size up to the limits of the TPM.
42   NOTE: In all TPM, a buffer size of 1,024 octets is allowed.
43 
44   @param[in] SequenceHandle    Handle for the sequence object
45   @param[in] Buffer            Data to be added to hash
46 
47   @retval EFI_SUCCESS      Operation completed successfully.
48   @retval EFI_DEVICE_ERROR Unexpected device behavior.
49 **/
50 EFI_STATUS
51 EFIAPI
52 Tpm2SequenceUpdate (
53   IN TPMI_DH_OBJECT   SequenceHandle,
54   IN TPM2B_MAX_BUFFER *Buffer
55   );
56 
57 /**
58   This command adds the last part of data, if any, to an Event sequence and returns the result in a digest list.
59   If pcrHandle references a PCR and not TPM_RH_NULL, then the returned digest list is processed in
60   the same manner as the digest list input parameter to TPM2_PCR_Extend() with the pcrHandle in each
61   bank extended with the associated digest value.
62 
63   @param[in]  PcrHandle         PCR to be extended with the Event data
64   @param[in]  SequenceHandle    Authorization for the sequence
65   @param[in]  Buffer            Data to be added to the Event
66   @param[out] Results           List of digests computed for the PCR
67 
68   @retval EFI_SUCCESS      Operation completed successfully.
69   @retval EFI_DEVICE_ERROR Unexpected device behavior.
70 **/
71 EFI_STATUS
72 EFIAPI
73 Tpm2EventSequenceComplete (
74   IN TPMI_DH_PCR         PcrHandle,
75   IN TPMI_DH_OBJECT      SequenceHandle,
76   IN TPM2B_MAX_BUFFER    *Buffer,
77   OUT TPML_DIGEST_VALUES *Results
78   );
79 
80 /**
81   This command adds the last part of data, if any, to a hash/HMAC sequence and returns the result.
82 
83   @param[in]  SequenceHandle    Authorization for the sequence
84   @param[in]  Buffer            Data to be added to the hash/HMAC
85   @param[out] Result            The returned HMAC or digest in a sized buffer
86 
87   @retval EFI_SUCCESS      Operation completed successfully.
88   @retval EFI_DEVICE_ERROR Unexpected device behavior.
89 **/
90 EFI_STATUS
91 EFIAPI
92 Tpm2SequenceComplete (
93   IN TPMI_DH_OBJECT      SequenceHandle,
94   IN TPM2B_MAX_BUFFER    *Buffer,
95   OUT TPM2B_DIGEST       *Result
96   );
97 
98 /**
99   Send Startup command to TPM2.
100 
101   @param[in] StartupType           TPM_SU_CLEAR or TPM_SU_STATE
102 
103   @retval EFI_SUCCESS      Operation completed successfully.
104   @retval EFI_DEVICE_ERROR Unexpected device behavior.
105 **/
106 EFI_STATUS
107 EFIAPI
108 Tpm2Startup (
109   IN      TPM_SU             StartupType
110   );
111 
112 /**
113   Send Shutdown command to TPM2.
114 
115   @param[in] ShutdownType           TPM_SU_CLEAR or TPM_SU_STATE.
116 
117   @retval EFI_SUCCESS      Operation completed successfully.
118   @retval EFI_DEVICE_ERROR Unexpected device behavior.
119 **/
120 EFI_STATUS
121 EFIAPI
122 Tpm2Shutdown (
123   IN      TPM_SU             ShutdownType
124   );
125 
126 /**
127   This command causes the TPM to perform a test of its capabilities.
128   If the fullTest is YES, the TPM will test all functions.
129   If fullTest = NO, the TPM will only test those functions that have not previously been tested.
130 
131   @param[in] FullTest    YES if full test to be performed
132                          NO if only test of untested functions required
133 
134   @retval EFI_SUCCESS      Operation completed successfully.
135   @retval EFI_DEVICE_ERROR Unexpected device behavior.
136 **/
137 EFI_STATUS
138 EFIAPI
139 Tpm2SelfTest (
140   IN TPMI_YES_NO          FullTest
141   );
142 
143 /**
144   This command allows setting of the authorization policy for the platform hierarchy (platformPolicy), the
145   storage hierarchy (ownerPolicy), and and the endorsement hierarchy (endorsementPolicy).
146 
147   @param[in]  AuthHandle            TPM_RH_ENDORSEMENT, TPM_RH_OWNER or TPM_RH_PLATFORM+{PP} parameters to be validated
148   @param[in]  AuthSession           Auth Session context
149   @param[in]  AuthPolicy            An authorization policy hash
150   @param[in]  HashAlg               The hash algorithm to use for the policy
151 
152   @retval EFI_SUCCESS      Operation completed successfully.
153   @retval EFI_DEVICE_ERROR Unexpected device behavior.
154 **/
155 EFI_STATUS
156 EFIAPI
157 Tpm2SetPrimaryPolicy (
158   IN  TPMI_RH_HIERARCHY_AUTH    AuthHandle,
159   IN  TPMS_AUTH_COMMAND         *AuthSession,
160   IN  TPM2B_DIGEST              *AuthPolicy,
161   IN  TPMI_ALG_HASH             HashAlg
162   );
163 
164 /**
165   This command removes all TPM context associated with a specific Owner.
166 
167   @param[in] AuthHandle        TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
168   @param[in] AuthSession       Auth Session context
169 
170   @retval EFI_SUCCESS      Operation completed successfully.
171   @retval EFI_DEVICE_ERROR Unexpected device behavior.
172 **/
173 EFI_STATUS
174 EFIAPI
175 Tpm2Clear (
176   IN TPMI_RH_CLEAR             AuthHandle,
177   IN TPMS_AUTH_COMMAND         *AuthSession OPTIONAL
178   );
179 
180 /**
181   Disables and enables the execution of TPM2_Clear().
182 
183   @param[in] AuthHandle        TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
184   @param[in] AuthSession       Auth Session context
185   @param[in] Disable           YES if the disableOwnerClear flag is to be SET,
186                                NO if the flag is to be CLEAR.
187 
188   @retval EFI_SUCCESS      Operation completed successfully.
189   @retval EFI_DEVICE_ERROR Unexpected device behavior.
190 **/
191 EFI_STATUS
192 EFIAPI
193 Tpm2ClearControl (
194   IN TPMI_RH_CLEAR             AuthHandle,
195   IN TPMS_AUTH_COMMAND         *AuthSession, OPTIONAL
196   IN TPMI_YES_NO               Disable
197   );
198 
199 /**
200   This command allows the authorization secret for a hierarchy or lockout to be changed using the current
201   authorization value as the command authorization.
202 
203   @param[in] AuthHandle        TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT, TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
204   @param[in] AuthSession       Auth Session context
205   @param[in] NewAuth           New authorization secret
206 
207   @retval EFI_SUCCESS      Operation completed successfully.
208   @retval EFI_DEVICE_ERROR Unexpected device behavior.
209 **/
210 EFI_STATUS
211 EFIAPI
212 Tpm2HierarchyChangeAuth (
213   IN TPMI_RH_HIERARCHY_AUTH    AuthHandle,
214   IN TPMS_AUTH_COMMAND         *AuthSession,
215   IN TPM2B_AUTH                *NewAuth
216   );
217 
218 /**
219   This replaces the current EPS with a value from the RNG and sets the Endorsement hierarchy controls to
220   their default initialization values.
221 
222   @param[in] AuthHandle        TPM_RH_PLATFORM+{PP}
223   @param[in] AuthSession       Auth Session context
224 
225   @retval EFI_SUCCESS      Operation completed successfully.
226   @retval EFI_DEVICE_ERROR Unexpected device behavior.
227 **/
228 EFI_STATUS
229 EFIAPI
230 Tpm2ChangeEPS (
231   IN TPMI_RH_PLATFORM          AuthHandle,
232   IN TPMS_AUTH_COMMAND         *AuthSession
233   );
234 
235 /**
236   This replaces the current PPS with a value from the RNG and sets platformPolicy to the default
237   initialization value (the Empty Buffer).
238 
239   @param[in] AuthHandle        TPM_RH_PLATFORM+{PP}
240   @param[in] AuthSession       Auth Session context
241 
242   @retval EFI_SUCCESS      Operation completed successfully.
243   @retval EFI_DEVICE_ERROR Unexpected device behavior.
244 **/
245 EFI_STATUS
246 EFIAPI
247 Tpm2ChangePPS (
248   IN TPMI_RH_PLATFORM          AuthHandle,
249   IN TPMS_AUTH_COMMAND         *AuthSession
250   );
251 
252 /**
253   This command enables and disables use of a hierarchy.
254 
255   @param[in] AuthHandle        TPM_RH_ENDORSEMENT, TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
256   @param[in] AuthSession       Auth Session context
257   @param[in] Hierarchy         Hierarchy of the enable being modified
258   @param[in] State             YES if the enable should be SET,
259                                NO if the enable should be CLEAR
260 
261   @retval EFI_SUCCESS      Operation completed successfully.
262   @retval EFI_DEVICE_ERROR Unexpected device behavior.
263 **/
264 EFI_STATUS
265 EFIAPI
266 Tpm2HierarchyControl (
267   IN TPMI_RH_HIERARCHY         AuthHandle,
268   IN TPMS_AUTH_COMMAND         *AuthSession,
269   IN TPMI_RH_HIERARCHY         Hierarchy,
270   IN TPMI_YES_NO               State
271   );
272 
273 /**
274   This command cancels the effect of a TPM lockout due to a number of successive authorization failures.
275   If this command is properly authorized, the lockout counter is set to zero.
276 
277   @param[in]  LockHandle            LockHandle
278   @param[in]  AuthSession           Auth Session context
279 
280   @retval EFI_SUCCESS      Operation completed successfully.
281   @retval EFI_DEVICE_ERROR Unexpected device behavior.
282 **/
283 EFI_STATUS
284 EFIAPI
285 Tpm2DictionaryAttackLockReset (
286   IN  TPMI_RH_LOCKOUT           LockHandle,
287   IN  TPMS_AUTH_COMMAND         *AuthSession
288   );
289 
290 /**
291   This command cancels the effect of a TPM lockout due to a number of successive authorization failures.
292   If this command is properly authorized, the lockout counter is set to zero.
293 
294   @param[in]  LockHandle            LockHandle
295   @param[in]  AuthSession           Auth Session context
296   @param[in]  NewMaxTries           Count of authorization failures before the lockout is imposed
297   @param[in]  NewRecoveryTime       Time in seconds before the authorization failure count is automatically decremented
298   @param[in]  LockoutRecovery       Time in seconds after a lockoutAuth failure before use of lockoutAuth is allowed
299 
300   @retval EFI_SUCCESS      Operation completed successfully.
301   @retval EFI_DEVICE_ERROR Unexpected device behavior.
302 **/
303 EFI_STATUS
304 EFIAPI
305 Tpm2DictionaryAttackParameters (
306   IN  TPMI_RH_LOCKOUT           LockHandle,
307   IN  TPMS_AUTH_COMMAND         *AuthSession,
308   IN  UINT32                    NewMaxTries,
309   IN  UINT32                    NewRecoveryTime,
310   IN  UINT32                    LockoutRecovery
311   );
312 
313 /**
314   This command is used to read the public area and Name of an NV Index.
315 
316   @param[in]  NvIndex            The NV Index.
317   @param[out] NvPublic           The public area of the index.
318   @param[out] NvName             The Name of the nvIndex.
319 
320   @retval EFI_SUCCESS            Operation completed successfully.
321   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
322 **/
323 EFI_STATUS
324 EFIAPI
325 Tpm2NvReadPublic (
326   IN      TPMI_RH_NV_INDEX          NvIndex,
327   OUT     TPM2B_NV_PUBLIC           *NvPublic,
328   OUT     TPM2B_NAME                *NvName
329   );
330 
331 /**
332   This command defines the attributes of an NV Index and causes the TPM to
333   reserve space to hold the data associated with the index.
334   If a definition already exists at the index, the TPM will return TPM_RC_NV_DEFINED.
335 
336   @param[in]  AuthHandle         TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}.
337   @param[in]  AuthSession        Auth Session context
338   @param[in]  Auth               The authorization data.
339   @param[in]  NvPublic           The public area of the index.
340 
341   @retval EFI_SUCCESS            Operation completed successfully.
342   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
343   @retval EFI_ALREADY_STARTED    The command was returned successfully, but NvIndex is already defined.
344 **/
345 EFI_STATUS
346 EFIAPI
347 Tpm2NvDefineSpace (
348   IN      TPMI_RH_PROVISION         AuthHandle,
349   IN      TPMS_AUTH_COMMAND         *AuthSession, OPTIONAL
350   IN      TPM2B_AUTH                *Auth,
351   IN      TPM2B_NV_PUBLIC           *NvPublic
352   );
353 
354 /**
355   This command removes an index from the TPM.
356 
357   @param[in]  AuthHandle         TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}.
358   @param[in]  NvIndex            The NV Index.
359   @param[in]  AuthSession        Auth Session context
360 
361   @retval EFI_SUCCESS            Operation completed successfully.
362   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
363   @retval EFI_NOT_FOUND          The command was returned successfully, but NvIndex is not found.
364 **/
365 EFI_STATUS
366 EFIAPI
367 Tpm2NvUndefineSpace (
368   IN      TPMI_RH_PROVISION         AuthHandle,
369   IN      TPMI_RH_NV_INDEX          NvIndex,
370   IN      TPMS_AUTH_COMMAND         *AuthSession OPTIONAL
371   );
372 
373 /**
374   This command reads a value from an area in NV memory previously defined by TPM2_NV_DefineSpace().
375 
376   @param[in]     AuthHandle         the handle indicating the source of the authorization value.
377   @param[in]     NvIndex            The index to be read.
378   @param[in]     AuthSession        Auth Session context
379   @param[in]     Size               Number of bytes to read.
380   @param[in]     Offset             Byte offset into the area.
381   @param[in,out] OutData            The data read.
382 
383   @retval EFI_SUCCESS            Operation completed successfully.
384   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
385   @retval EFI_NOT_FOUND          The command was returned successfully, but NvIndex is not found.
386 **/
387 EFI_STATUS
388 EFIAPI
389 Tpm2NvRead (
390   IN      TPMI_RH_NV_AUTH           AuthHandle,
391   IN      TPMI_RH_NV_INDEX          NvIndex,
392   IN      TPMS_AUTH_COMMAND         *AuthSession, OPTIONAL
393   IN      UINT16                    Size,
394   IN      UINT16                    Offset,
395   IN OUT  TPM2B_MAX_BUFFER          *OutData
396   );
397 
398 /**
399   This command writes a value to an area in NV memory that was previously defined by TPM2_NV_DefineSpace().
400 
401   @param[in]  AuthHandle         the handle indicating the source of the authorization value.
402   @param[in]  NvIndex            The NV Index of the area to write.
403   @param[in]  AuthSession        Auth Session context
404   @param[in]  InData             The data to write.
405   @param[in]  Offset             The offset into the NV Area.
406 
407   @retval EFI_SUCCESS            Operation completed successfully.
408   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
409   @retval EFI_NOT_FOUND          The command was returned successfully, but NvIndex is not found.
410 **/
411 EFI_STATUS
412 EFIAPI
413 Tpm2NvWrite (
414   IN      TPMI_RH_NV_AUTH           AuthHandle,
415   IN      TPMI_RH_NV_INDEX          NvIndex,
416   IN      TPMS_AUTH_COMMAND         *AuthSession, OPTIONAL
417   IN      TPM2B_MAX_BUFFER          *InData,
418   IN      UINT16                    Offset
419   );
420 
421 /**
422   This command may be used to prevent further reads of the Index until the next TPM2_Startup (TPM_SU_CLEAR).
423 
424   @param[in]  AuthHandle         the handle indicating the source of the authorization value.
425   @param[in]  NvIndex            The NV Index of the area to lock.
426   @param[in]  AuthSession        Auth Session context
427 
428   @retval EFI_SUCCESS            Operation completed successfully.
429   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
430   @retval EFI_NOT_FOUND          The command was returned successfully, but NvIndex is not found.
431 **/
432 EFI_STATUS
433 EFIAPI
434 Tpm2NvReadLock (
435   IN      TPMI_RH_NV_AUTH           AuthHandle,
436   IN      TPMI_RH_NV_INDEX          NvIndex,
437   IN      TPMS_AUTH_COMMAND         *AuthSession OPTIONAL
438   );
439 
440 /**
441   This command may be used to inhibit further writes of the Index.
442 
443   @param[in]  AuthHandle         the handle indicating the source of the authorization value.
444   @param[in]  NvIndex            The NV Index of the area to lock.
445   @param[in]  AuthSession        Auth Session context
446 
447   @retval EFI_SUCCESS            Operation completed successfully.
448   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
449   @retval EFI_NOT_FOUND          The command was returned successfully, but NvIndex is not found.
450 **/
451 EFI_STATUS
452 EFIAPI
453 Tpm2NvWriteLock (
454   IN      TPMI_RH_NV_AUTH           AuthHandle,
455   IN      TPMI_RH_NV_INDEX          NvIndex,
456   IN      TPMS_AUTH_COMMAND         *AuthSession OPTIONAL
457   );
458 
459 /**
460   The command will SET TPMA_NV_WRITELOCKED for all indexes that have their TPMA_NV_GLOBALLOCK attribute SET.
461 
462   @param[in]  AuthHandle         TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}.
463   @param[in]  AuthSession        Auth Session context
464 
465   @retval EFI_SUCCESS            Operation completed successfully.
466   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
467   @retval EFI_NOT_FOUND          The command was returned successfully, but NvIndex is not found.
468 **/
469 EFI_STATUS
470 EFIAPI
471 Tpm2NvGlobalWriteLock (
472   IN      TPMI_RH_PROVISION         AuthHandle,
473   IN      TPMS_AUTH_COMMAND         *AuthSession OPTIONAL
474   );
475 
476 /**
477   This command is used to cause an update to the indicated PCR.
478   The digests parameter contains one or more tagged digest value identified by an algorithm ID.
479   For each digest, the PCR associated with pcrHandle is Extended into the bank identified by the tag (hashAlg).
480 
481   @param[in] PcrHandle   Handle of the PCR
482   @param[in] Digests     List of tagged digest values to be extended
483 
484   @retval EFI_SUCCESS      Operation completed successfully.
485   @retval EFI_DEVICE_ERROR Unexpected device behavior.
486 **/
487 EFI_STATUS
488 EFIAPI
489 Tpm2PcrExtend (
490   IN      TPMI_DH_PCR               PcrHandle,
491   IN      TPML_DIGEST_VALUES        *Digests
492   );
493 
494 /**
495   This command is used to cause an update to the indicated PCR.
496   The data in eventData is hashed using the hash algorithm associated with each bank in which the
497   indicated PCR has been allocated. After the data is hashed, the digests list is returned. If the pcrHandle
498   references an implemented PCR and not TPM_ALG_NULL, digests list is processed as in
499   TPM2_PCR_Extend().
500   A TPM shall support an Event.size of zero through 1,024 inclusive.
501 
502   @param[in]  PcrHandle   Handle of the PCR
503   @param[in]  EventData   Event data in sized buffer
504   @param[out] Digests     List of digest
505 
506   @retval EFI_SUCCESS      Operation completed successfully.
507   @retval EFI_DEVICE_ERROR Unexpected device behavior.
508 **/
509 EFI_STATUS
510 EFIAPI
511 Tpm2PcrEvent (
512   IN      TPMI_DH_PCR               PcrHandle,
513   IN      TPM2B_EVENT               *EventData,
514      OUT  TPML_DIGEST_VALUES        *Digests
515   );
516 
517 /**
518   This command returns the values of all PCR specified in pcrSelect.
519 
520   @param[in]  PcrSelectionIn     The selection of PCR to read.
521   @param[out] PcrUpdateCounter   The current value of the PCR update counter.
522   @param[out] PcrSelectionOut    The PCR in the returned list.
523   @param[out] PcrValues          The contents of the PCR indicated in pcrSelect.
524 
525   @retval EFI_SUCCESS            Operation completed successfully.
526   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
527 **/
528 EFI_STATUS
529 EFIAPI
530 Tpm2PcrRead (
531   IN      TPML_PCR_SELECTION        *PcrSelectionIn,
532      OUT  UINT32                    *PcrUpdateCounter,
533      OUT  TPML_PCR_SELECTION        *PcrSelectionOut,
534      OUT  TPML_DIGEST               *PcrValues
535   );
536 
537 /**
538   This command is used to set the desired PCR allocation of PCR and algorithms.
539 
540   @param[in]  AuthHandle         TPM_RH_PLATFORM+{PP}
541   @param[in]  AuthSession        Auth Session context
542   @param[in]  PcrAllocation      The requested allocation
543   @param[out] AllocationSuccess  YES if the allocation succeeded
544   @param[out] MaxPCR             maximum number of PCR that may be in a bank
545   @param[out] SizeNeeded         number of octets required to satisfy the request
546   @param[out] SizeAvailable      Number of octets available. Computed before the allocation
547 
548   @retval EFI_SUCCESS            Operation completed successfully.
549   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
550 **/
551 EFI_STATUS
552 EFIAPI
553 Tpm2PcrAllocate (
554   IN  TPMI_RH_PLATFORM          AuthHandle,
555   IN  TPMS_AUTH_COMMAND         *AuthSession,
556   IN  TPML_PCR_SELECTION        *PcrAllocation,
557   OUT TPMI_YES_NO               *AllocationSuccess,
558   OUT UINT32                    *MaxPCR,
559   OUT UINT32                    *SizeNeeded,
560   OUT UINT32                    *SizeAvailable
561   );
562 
563 /**
564   This command returns various information regarding the TPM and its current state.
565 
566   The capability parameter determines the category of data returned. The property parameter
567   selects the first value of the selected category to be returned. If there is no property
568   that corresponds to the value of property, the next higher value is returned, if it exists.
569   The moreData parameter will have a value of YES if there are more values of the requested
570   type that were not returned.
571   If no next capability exists, the TPM will return a zero-length list and moreData will have
572   a value of NO.
573 
574   NOTE:
575   To simplify this function, leave returned CapabilityData for caller to unpack since there are
576   many capability categories and only few categories will be used in firmware. It means the caller
577   need swap the byte order for the feilds in CapabilityData.
578 
579   @param[in]  Capability         Group selection; determines the format of the response.
580   @param[in]  Property           Further definition of information.
581   @param[in]  PropertyCount      Number of properties of the indicated type to return.
582   @param[out] MoreData           Flag to indicate if there are more values of this type.
583   @param[out] CapabilityData     The capability data.
584 
585   @retval EFI_SUCCESS            Operation completed successfully.
586   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
587 **/
588 EFI_STATUS
589 EFIAPI
590 Tpm2GetCapability (
591   IN      TPM_CAP                   Capability,
592   IN      UINT32                    Property,
593   IN      UINT32                    PropertyCount,
594   OUT     TPMI_YES_NO               *MoreData,
595   OUT     TPMS_CAPABILITY_DATA      *CapabilityData
596   );
597 
598 /**
599   This command returns the information of TPM Family.
600 
601   This function parse the value got from TPM2_GetCapability and return the Family.
602 
603   @param[out] Family             The Family of TPM. (a 4-octet character string)
604 
605   @retval EFI_SUCCESS            Operation completed successfully.
606   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
607 **/
608 EFI_STATUS
609 EFIAPI
610 Tpm2GetCapabilityFamily (
611   OUT     CHAR8                     *Family
612   );
613 
614 /**
615   This command returns the information of TPM manufacture ID.
616 
617   This function parse the value got from TPM2_GetCapability and return the TPM manufacture ID.
618 
619   @param[out] ManufactureId      The manufacture ID of TPM.
620 
621   @retval EFI_SUCCESS            Operation completed successfully.
622   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
623 **/
624 EFI_STATUS
625 EFIAPI
626 Tpm2GetCapabilityManufactureID (
627   OUT     UINT32                    *ManufactureId
628   );
629 
630 /**
631   This command returns the information of TPM FirmwareVersion.
632 
633   This function parse the value got from TPM2_GetCapability and return the TPM FirmwareVersion.
634 
635   @param[out] FirmwareVersion1   The FirmwareVersion1.
636   @param[out] FirmwareVersion2   The FirmwareVersion2.
637 
638   @retval EFI_SUCCESS            Operation completed successfully.
639   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
640 **/
641 EFI_STATUS
642 EFIAPI
643 Tpm2GetCapabilityFirmwareVersion (
644   OUT     UINT32                    *FirmwareVersion1,
645   OUT     UINT32                    *FirmwareVersion2
646   );
647 
648 /**
649   This command returns the information of the maximum value for commandSize and responseSize in a command.
650 
651   This function parse the value got from TPM2_GetCapability and return the max command size and response size
652 
653   @param[out] MaxCommandSize     The maximum value for commandSize in a command.
654   @param[out] MaxResponseSize    The maximum value for responseSize in a command.
655 
656   @retval EFI_SUCCESS            Operation completed successfully.
657   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
658 **/
659 EFI_STATUS
660 EFIAPI
661 Tpm2GetCapabilityMaxCommandResponseSize (
662   OUT UINT32                    *MaxCommandSize,
663   OUT UINT32                    *MaxResponseSize
664   );
665 
666 /**
667   This command returns Returns a list of TPMS_ALG_PROPERTIES. Each entry is an
668   algorithm ID and a set of properties of the algorithm.
669 
670   This function parse the value got from TPM2_GetCapability and return the list.
671 
672   @param[out] AlgList      List of algorithm.
673 
674   @retval EFI_SUCCESS            Operation completed successfully.
675   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
676 **/
677 EFI_STATUS
678 EFIAPI
679 Tpm2GetCapabilitySupportedAlg (
680   OUT TPML_ALG_PROPERTY      *AlgList
681   );
682 
683 /**
684   This command returns the information of TPM LockoutCounter.
685 
686   This function parse the value got from TPM2_GetCapability and return the LockoutCounter.
687 
688   @param[out] LockoutCounter     The LockoutCounter of TPM.
689 
690   @retval EFI_SUCCESS            Operation completed successfully.
691   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
692 **/
693 EFI_STATUS
694 EFIAPI
695 Tpm2GetCapabilityLockoutCounter (
696   OUT     UINT32                    *LockoutCounter
697   );
698 
699 /**
700   This command returns the information of TPM LockoutInterval.
701 
702   This function parse the value got from TPM2_GetCapability and return the LockoutInterval.
703 
704   @param[out] LockoutInterval    The LockoutInterval of TPM.
705 
706   @retval EFI_SUCCESS            Operation completed successfully.
707   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
708 **/
709 EFI_STATUS
710 EFIAPI
711 Tpm2GetCapabilityLockoutInterval (
712   OUT     UINT32                    *LockoutInterval
713   );
714 
715 /**
716   This command returns the information of TPM InputBufferSize.
717 
718   This function parse the value got from TPM2_GetCapability and return the InputBufferSize.
719 
720   @param[out] InputBufferSize    The InputBufferSize of TPM.
721                                  the maximum size of a parameter (typically, a TPM2B_MAX_BUFFER)
722 
723   @retval EFI_SUCCESS            Operation completed successfully.
724   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
725 **/
726 EFI_STATUS
727 EFIAPI
728 Tpm2GetCapabilityInputBufferSize (
729   OUT     UINT32                    *InputBufferSize
730   );
731 
732 /**
733   This command returns the information of TPM PCRs.
734 
735   This function parse the value got from TPM2_GetCapability and return the PcrSelection.
736 
737   @param[out] Pcrs    The Pcr Selection
738 
739   @retval EFI_SUCCESS            Operation completed successfully.
740   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
741 **/
742 EFI_STATUS
743 EFIAPI
744 Tpm2GetCapabilityPcrs (
745   OUT TPML_PCR_SELECTION      *Pcrs
746   );
747 
748 /**
749   This command returns the information of TPM AlgorithmSet.
750 
751   This function parse the value got from TPM2_GetCapability and return the AlgorithmSet.
752 
753   @param[out] AlgorithmSet    The AlgorithmSet of TPM.
754 
755   @retval EFI_SUCCESS            Operation completed successfully.
756   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
757 **/
758 EFI_STATUS
759 EFIAPI
760 Tpm2GetCapabilityAlgorithmSet (
761   OUT     UINT32      *AlgorithmSet
762   );
763 
764 /**
765   This command is used to check to see if specific combinations of algorithm parameters are supported.
766 
767   @param[in]  Parameters              Algorithm parameters to be validated
768 
769   @retval EFI_SUCCESS      Operation completed successfully.
770   @retval EFI_DEVICE_ERROR Unexpected device behavior.
771 **/
772 EFI_STATUS
773 EFIAPI
774 Tpm2TestParms (
775   IN  TPMT_PUBLIC_PARMS           *Parameters
776   );
777 
778 /**
779   This command allows the platform to change the set of algorithms that are used by the TPM.
780   The algorithmSet setting is a vendor-dependent value.
781 
782   @param[in]  AuthHandle              TPM_RH_PLATFORM
783   @param[in]  AuthSession             Auth Session context
784   @param[in]  AlgorithmSet            A TPM vendor-dependent value indicating the
785                                       algorithm set selection
786 
787   @retval EFI_SUCCESS      Operation completed successfully.
788   @retval EFI_DEVICE_ERROR Unexpected device behavior.
789 **/
790 EFI_STATUS
791 EFIAPI
792 Tpm2SetAlgorithmSet (
793   IN  TPMI_RH_PLATFORM          AuthHandle,
794   IN  TPMS_AUTH_COMMAND         *AuthSession,
795   IN  UINT32                    AlgorithmSet
796   );
797 
798 /**
799   This command is used to start an authorization session using alternative methods of
800   establishing the session key (sessionKey) that is used for authorization and encrypting value.
801 
802   @param[in]  TpmKey             Handle of a loaded decrypt key used to encrypt salt.
803   @param[in]  Bind               Entity providing the authValue.
804   @param[in]  NonceCaller        Initial nonceCaller, sets nonce size for the session.
805   @param[in]  Salt               Value encrypted according to the type of tpmKey.
806   @param[in]  SessionType        Indicates the type of the session.
807   @param[in]  Symmetric          The algorithm and key size for parameter encryption.
808   @param[in]  AuthHash           Hash algorithm to use for the session.
809   @param[out] SessionHandle      Handle for the newly created session.
810   @param[out] NonceTPM           The initial nonce from the TPM, used in the computation of the sessionKey.
811 
812   @retval EFI_SUCCESS            Operation completed successfully.
813   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
814 **/
815 EFI_STATUS
816 EFIAPI
817 Tpm2StartAuthSession (
818   IN      TPMI_DH_OBJECT            TpmKey,
819   IN      TPMI_DH_ENTITY            Bind,
820   IN      TPM2B_NONCE               *NonceCaller,
821   IN      TPM2B_ENCRYPTED_SECRET    *Salt,
822   IN      TPM_SE                    SessionType,
823   IN      TPMT_SYM_DEF              *Symmetric,
824   IN      TPMI_ALG_HASH             AuthHash,
825      OUT  TPMI_SH_AUTH_SESSION      *SessionHandle,
826      OUT  TPM2B_NONCE               *NonceTPM
827   );
828 
829 /**
830   This command causes all context associated with a loaded object or session to be removed from TPM memory.
831 
832   @param[in]  FlushHandle        The handle of the item to flush.
833 
834   @retval EFI_SUCCESS            Operation completed successfully.
835   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
836 **/
837 EFI_STATUS
838 EFIAPI
839 Tpm2FlushContext (
840   IN      TPMI_DH_CONTEXT           FlushHandle
841   );
842 
843 /**
844   This command includes a secret-based authorization to a policy.
845   The caller proves knowledge of the secret value using an authorization
846   session using the authValue associated with authHandle.
847 
848   @param[in]  AuthHandle         Handle for an entity providing the authorization
849   @param[in]  PolicySession      Handle for the policy session being extended.
850   @param[in]  AuthSession        Auth Session context
851   @param[in]  NonceTPM           The policy nonce for the session.
852   @param[in]  CpHashA            Digest of the command parameters to which this authorization is limited.
853   @param[in]  PolicyRef          A reference to a policy relating to the authorization.
854   @param[in]  Expiration         Time when authorization will expire, measured in seconds from the time that nonceTPM was generated.
855   @param[out] Timeout            Time value used to indicate to the TPM when the ticket expires.
856   @param[out] PolicyTicket       A ticket that includes a value indicating when the authorization expires.
857 
858   @retval EFI_SUCCESS            Operation completed successfully.
859   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
860 **/
861 EFI_STATUS
862 EFIAPI
863 Tpm2PolicySecret (
864   IN      TPMI_DH_ENTITY            AuthHandle,
865   IN      TPMI_SH_POLICY            PolicySession,
866   IN      TPMS_AUTH_COMMAND         *AuthSession, OPTIONAL
867   IN      TPM2B_NONCE               *NonceTPM,
868   IN      TPM2B_DIGEST              *CpHashA,
869   IN      TPM2B_NONCE               *PolicyRef,
870   IN      INT32                     Expiration,
871   OUT     TPM2B_TIMEOUT             *Timeout,
872   OUT     TPMT_TK_AUTH              *PolicyTicket
873   );
874 
875 /**
876   This command allows options in authorizations without requiring that the TPM evaluate all of the options.
877   If a policy may be satisfied by different sets of conditions, the TPM need only evaluate one set that
878   satisfies the policy. This command will indicate that one of the required sets of conditions has been
879   satisfied.
880 
881   @param[in] PolicySession      Handle for the policy session being extended.
882   @param[in] HashList           the list of hashes to check for a match.
883 
884   @retval EFI_SUCCESS            Operation completed successfully.
885   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
886 **/
887 EFI_STATUS
888 EFIAPI
889 Tpm2PolicyOR (
890   IN TPMI_SH_POLICY           PolicySession,
891   IN TPML_DIGEST              *HashList
892   );
893 
894 /**
895   This command indicates that the authorization will be limited to a specific command code.
896 
897   @param[in]  PolicySession      Handle for the policy session being extended.
898   @param[in]  Code               The allowed commandCode.
899 
900   @retval EFI_SUCCESS            Operation completed successfully.
901   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
902 **/
903 EFI_STATUS
904 EFIAPI
905 Tpm2PolicyCommandCode (
906   IN      TPMI_SH_POLICY            PolicySession,
907   IN      TPM_CC                    Code
908   );
909 
910 /**
911   This command returns the current policyDigest of the session. This command allows the TPM
912   to be used to perform the actions required to precompute the authPolicy for an object.
913 
914   @param[in]  PolicySession      Handle for the policy session.
915   @param[out] PolicyHash         the current value of the policyHash of policySession.
916 
917   @retval EFI_SUCCESS            Operation completed successfully.
918   @retval EFI_DEVICE_ERROR       The command was unsuccessful.
919 **/
920 EFI_STATUS
921 EFIAPI
922 Tpm2PolicyGetDigest (
923   IN      TPMI_SH_POLICY            PolicySession,
924      OUT  TPM2B_DIGEST              *PolicyHash
925   );
926 
927 //
928 // Help function
929 //
930 
931 /**
932   Copy AuthSessionIn to TPM2 command buffer.
933 
934   @param [in]  AuthSessionIn   Input AuthSession data
935   @param [out] AuthSessionOut  Output AuthSession data in TPM2 command buffer
936 
937   @return AuthSession size
938 **/
939 UINT32
940 EFIAPI
941 CopyAuthSessionCommand (
942   IN      TPMS_AUTH_COMMAND         *AuthSessionIn, OPTIONAL
943   OUT     UINT8                     *AuthSessionOut
944   );
945 
946 /**
947   Copy AuthSessionIn from TPM2 response buffer.
948 
949   @param [in]  AuthSessionIn   Input AuthSession data in TPM2 response buffer
950   @param [out] AuthSessionOut  Output AuthSession data
951 
952   @return AuthSession size
953 **/
954 UINT32
955 EFIAPI
956 CopyAuthSessionResponse (
957   IN      UINT8                      *AuthSessionIn,
958   OUT     TPMS_AUTH_RESPONSE         *AuthSessionOut OPTIONAL
959   );
960 
961 /**
962   Return size of digest.
963 
964   @param[in] HashAlgo  Hash algorithm
965 
966   @return size of digest
967 **/
968 UINT16
969 EFIAPI
970 GetHashSizeFromAlgo (
971   IN TPMI_ALG_HASH    HashAlgo
972   );
973 
974 #endif
975