blob: 7f62d8fb369ffd0045a144ac715df55a6ba18bbf [file] [log] [blame]
Andrey Marochkob8e59922017-06-29 17:13:14 -07001/* Microsoft Reference Implementation for TPM 2.0
2 *
3 * The copyright in this software is being made available under the BSD License,
4 * included below. This software may be subject to other third party and
5 * contributor rights, including patent rights, and no such rights are granted
6 * under this license.
7 *
8 * Copyright (c) Microsoft Corporation
9 *
10 * All rights reserved.
11 *
12 * BSD License
13 *
14 * Redistribution and use in source and binary forms, with or without modification,
15 * are permitted provided that the following conditions are met:
16 *
17 * Redistributions of source code must retain the above copyright notice, this list
18 * of conditions and the following disclaimer.
19 *
20 * Redistributions in binary form must reproduce the above copyright notice, this
Andrey Marochko394c6172017-11-27 13:49:27 -080021 * list of conditions and the following disclaimer in the documentation and/or
22 * other materials provided with the distribution.
Andrey Marochkob8e59922017-06-29 17:13:14 -070023 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
28 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
Andrey Marochko394c6172017-11-27 13:49:27 -080035/*(Auto-generated)
Andrey Marochko083cb5b2019-05-21 15:30:21 -070036 * Created by TpmStructures; Version 4.4 Mar 26, 2019
DavidWooten9dba2812020-03-10 15:25:34 -040037 * Date: Mar 6, 2020 Time: 01:50:09PM
Andrey Marochko394c6172017-11-27 13:49:27 -080038 */
Andrey Marochkob8e59922017-06-29 17:13:14 -070039
40#ifndef _TPM_TYPES_H_
41#define _TPM_TYPES_H_
Andrey Marochko083cb5b2019-05-21 15:30:21 -070042
DavidWooten777151f2019-07-26 21:50:36 -040043// Table 1:2 - Definition of TPM_ALG_ID Constants
44typedef UINT16 TPM_ALG_ID;
45#define TYPE_OF_TPM_ALG_ID UINT16
46#define ALG_ERROR_VALUE 0x0000
47#define TPM_ALG_ERROR (TPM_ALG_ID)(ALG_ERROR_VALUE)
48#define ALG_RSA_VALUE 0x0001
49#define TPM_ALG_RSA (TPM_ALG_ID)(ALG_RSA_VALUE)
50#define ALG_TDES_VALUE 0x0003
51#define TPM_ALG_TDES (TPM_ALG_ID)(ALG_TDES_VALUE)
52#define ALG_SHA_VALUE 0x0004
53#define TPM_ALG_SHA (TPM_ALG_ID)(ALG_SHA_VALUE)
54#define ALG_SHA1_VALUE 0x0004
55#define TPM_ALG_SHA1 (TPM_ALG_ID)(ALG_SHA1_VALUE)
56#define ALG_HMAC_VALUE 0x0005
57#define TPM_ALG_HMAC (TPM_ALG_ID)(ALG_HMAC_VALUE)
58#define ALG_AES_VALUE 0x0006
59#define TPM_ALG_AES (TPM_ALG_ID)(ALG_AES_VALUE)
60#define ALG_MGF1_VALUE 0x0007
61#define TPM_ALG_MGF1 (TPM_ALG_ID)(ALG_MGF1_VALUE)
62#define ALG_KEYEDHASH_VALUE 0x0008
63#define TPM_ALG_KEYEDHASH (TPM_ALG_ID)(ALG_KEYEDHASH_VALUE)
64#define ALG_XOR_VALUE 0x000A
65#define TPM_ALG_XOR (TPM_ALG_ID)(ALG_XOR_VALUE)
66#define ALG_SHA256_VALUE 0x000B
67#define TPM_ALG_SHA256 (TPM_ALG_ID)(ALG_SHA256_VALUE)
68#define ALG_SHA384_VALUE 0x000C
69#define TPM_ALG_SHA384 (TPM_ALG_ID)(ALG_SHA384_VALUE)
70#define ALG_SHA512_VALUE 0x000D
71#define TPM_ALG_SHA512 (TPM_ALG_ID)(ALG_SHA512_VALUE)
72#define ALG_NULL_VALUE 0x0010
73#define TPM_ALG_NULL (TPM_ALG_ID)(ALG_NULL_VALUE)
74#define ALG_SM3_256_VALUE 0x0012
75#define TPM_ALG_SM3_256 (TPM_ALG_ID)(ALG_SM3_256_VALUE)
76#define ALG_SM4_VALUE 0x0013
77#define TPM_ALG_SM4 (TPM_ALG_ID)(ALG_SM4_VALUE)
78#define ALG_RSASSA_VALUE 0x0014
79#define TPM_ALG_RSASSA (TPM_ALG_ID)(ALG_RSASSA_VALUE)
80#define ALG_RSAES_VALUE 0x0015
81#define TPM_ALG_RSAES (TPM_ALG_ID)(ALG_RSAES_VALUE)
82#define ALG_RSAPSS_VALUE 0x0016
83#define TPM_ALG_RSAPSS (TPM_ALG_ID)(ALG_RSAPSS_VALUE)
84#define ALG_OAEP_VALUE 0x0017
85#define TPM_ALG_OAEP (TPM_ALG_ID)(ALG_OAEP_VALUE)
86#define ALG_ECDSA_VALUE 0x0018
87#define TPM_ALG_ECDSA (TPM_ALG_ID)(ALG_ECDSA_VALUE)
88#define ALG_ECDH_VALUE 0x0019
89#define TPM_ALG_ECDH (TPM_ALG_ID)(ALG_ECDH_VALUE)
90#define ALG_ECDAA_VALUE 0x001A
91#define TPM_ALG_ECDAA (TPM_ALG_ID)(ALG_ECDAA_VALUE)
92#define ALG_SM2_VALUE 0x001B
93#define TPM_ALG_SM2 (TPM_ALG_ID)(ALG_SM2_VALUE)
94#define ALG_ECSCHNORR_VALUE 0x001C
95#define TPM_ALG_ECSCHNORR (TPM_ALG_ID)(ALG_ECSCHNORR_VALUE)
96#define ALG_ECMQV_VALUE 0x001D
97#define TPM_ALG_ECMQV (TPM_ALG_ID)(ALG_ECMQV_VALUE)
98#define ALG_KDF1_SP800_56A_VALUE 0x0020
99#define TPM_ALG_KDF1_SP800_56A (TPM_ALG_ID)(ALG_KDF1_SP800_56A_VALUE)
100#define ALG_KDF2_VALUE 0x0021
101#define TPM_ALG_KDF2 (TPM_ALG_ID)(ALG_KDF2_VALUE)
102#define ALG_KDF1_SP800_108_VALUE 0x0022
103#define TPM_ALG_KDF1_SP800_108 (TPM_ALG_ID)(ALG_KDF1_SP800_108_VALUE)
104#define ALG_ECC_VALUE 0x0023
105#define TPM_ALG_ECC (TPM_ALG_ID)(ALG_ECC_VALUE)
106#define ALG_SYMCIPHER_VALUE 0x0025
107#define TPM_ALG_SYMCIPHER (TPM_ALG_ID)(ALG_SYMCIPHER_VALUE)
108#define ALG_CAMELLIA_VALUE 0x0026
109#define TPM_ALG_CAMELLIA (TPM_ALG_ID)(ALG_CAMELLIA_VALUE)
110#define ALG_SHA3_256_VALUE 0x0027
111#define TPM_ALG_SHA3_256 (TPM_ALG_ID)(ALG_SHA3_256_VALUE)
112#define ALG_SHA3_384_VALUE 0x0028
113#define TPM_ALG_SHA3_384 (TPM_ALG_ID)(ALG_SHA3_384_VALUE)
114#define ALG_SHA3_512_VALUE 0x0029
115#define TPM_ALG_SHA3_512 (TPM_ALG_ID)(ALG_SHA3_512_VALUE)
116#define ALG_CMAC_VALUE 0x003F
117#define TPM_ALG_CMAC (TPM_ALG_ID)(ALG_CMAC_VALUE)
118#define ALG_CTR_VALUE 0x0040
119#define TPM_ALG_CTR (TPM_ALG_ID)(ALG_CTR_VALUE)
120#define ALG_OFB_VALUE 0x0041
121#define TPM_ALG_OFB (TPM_ALG_ID)(ALG_OFB_VALUE)
122#define ALG_CBC_VALUE 0x0042
123#define TPM_ALG_CBC (TPM_ALG_ID)(ALG_CBC_VALUE)
124#define ALG_CFB_VALUE 0x0043
125#define TPM_ALG_CFB (TPM_ALG_ID)(ALG_CFB_VALUE)
126#define ALG_ECB_VALUE 0x0044
127#define TPM_ALG_ECB (TPM_ALG_ID)(ALG_ECB_VALUE)
128// Values derived from Table 1:2
129#define ALG_FIRST_VALUE 0x0001
130#define TPM_ALG_FIRST (TPM_ALG_ID)(ALG_FIRST_VALUE)
131#define ALG_LAST_VALUE 0x0044
132#define TPM_ALG_LAST (TPM_ALG_ID)(ALG_LAST_VALUE)
133
DavidWooten302ed832019-08-30 20:23:42 -0400134// Table 1:4 - Definition of TPM_ECC_CURVE Constants
DavidWooten777151f2019-07-26 21:50:36 -0400135typedef UINT16 TPM_ECC_CURVE;
136#define TYPE_OF_TPM_ECC_CURVE UINT16
137#define TPM_ECC_NONE (TPM_ECC_CURVE)(0x0000)
138#define TPM_ECC_NIST_P192 (TPM_ECC_CURVE)(0x0001)
139#define TPM_ECC_NIST_P224 (TPM_ECC_CURVE)(0x0002)
140#define TPM_ECC_NIST_P256 (TPM_ECC_CURVE)(0x0003)
141#define TPM_ECC_NIST_P384 (TPM_ECC_CURVE)(0x0004)
142#define TPM_ECC_NIST_P521 (TPM_ECC_CURVE)(0x0005)
143#define TPM_ECC_BN_P256 (TPM_ECC_CURVE)(0x0010)
144#define TPM_ECC_BN_P638 (TPM_ECC_CURVE)(0x0011)
145#define TPM_ECC_SM2_P256 (TPM_ECC_CURVE)(0x0020)
146
147// Table 2:12 - Definition of TPM_CC Constants
148typedef UINT32 TPM_CC;
149#define TYPE_OF_TPM_CC UINT32
150#define TPM_CC_NV_UndefineSpaceSpecial (TPM_CC)(0x0000011F)
151#define TPM_CC_EvictControl (TPM_CC)(0x00000120)
152#define TPM_CC_HierarchyControl (TPM_CC)(0x00000121)
153#define TPM_CC_NV_UndefineSpace (TPM_CC)(0x00000122)
154#define TPM_CC_ChangeEPS (TPM_CC)(0x00000124)
155#define TPM_CC_ChangePPS (TPM_CC)(0x00000125)
156#define TPM_CC_Clear (TPM_CC)(0x00000126)
157#define TPM_CC_ClearControl (TPM_CC)(0x00000127)
158#define TPM_CC_ClockSet (TPM_CC)(0x00000128)
159#define TPM_CC_HierarchyChangeAuth (TPM_CC)(0x00000129)
160#define TPM_CC_NV_DefineSpace (TPM_CC)(0x0000012A)
161#define TPM_CC_PCR_Allocate (TPM_CC)(0x0000012B)
162#define TPM_CC_PCR_SetAuthPolicy (TPM_CC)(0x0000012C)
163#define TPM_CC_PP_Commands (TPM_CC)(0x0000012D)
164#define TPM_CC_SetPrimaryPolicy (TPM_CC)(0x0000012E)
165#define TPM_CC_FieldUpgradeStart (TPM_CC)(0x0000012F)
166#define TPM_CC_ClockRateAdjust (TPM_CC)(0x00000130)
167#define TPM_CC_CreatePrimary (TPM_CC)(0x00000131)
168#define TPM_CC_NV_GlobalWriteLock (TPM_CC)(0x00000132)
169#define TPM_CC_GetCommandAuditDigest (TPM_CC)(0x00000133)
170#define TPM_CC_NV_Increment (TPM_CC)(0x00000134)
171#define TPM_CC_NV_SetBits (TPM_CC)(0x00000135)
172#define TPM_CC_NV_Extend (TPM_CC)(0x00000136)
173#define TPM_CC_NV_Write (TPM_CC)(0x00000137)
174#define TPM_CC_NV_WriteLock (TPM_CC)(0x00000138)
175#define TPM_CC_DictionaryAttackLockReset (TPM_CC)(0x00000139)
176#define TPM_CC_DictionaryAttackParameters (TPM_CC)(0x0000013A)
177#define TPM_CC_NV_ChangeAuth (TPM_CC)(0x0000013B)
178#define TPM_CC_PCR_Event (TPM_CC)(0x0000013C)
179#define TPM_CC_PCR_Reset (TPM_CC)(0x0000013D)
180#define TPM_CC_SequenceComplete (TPM_CC)(0x0000013E)
181#define TPM_CC_SetAlgorithmSet (TPM_CC)(0x0000013F)
182#define TPM_CC_SetCommandCodeAuditStatus (TPM_CC)(0x00000140)
183#define TPM_CC_FieldUpgradeData (TPM_CC)(0x00000141)
184#define TPM_CC_IncrementalSelfTest (TPM_CC)(0x00000142)
185#define TPM_CC_SelfTest (TPM_CC)(0x00000143)
186#define TPM_CC_Startup (TPM_CC)(0x00000144)
187#define TPM_CC_Shutdown (TPM_CC)(0x00000145)
188#define TPM_CC_StirRandom (TPM_CC)(0x00000146)
189#define TPM_CC_ActivateCredential (TPM_CC)(0x00000147)
190#define TPM_CC_Certify (TPM_CC)(0x00000148)
191#define TPM_CC_PolicyNV (TPM_CC)(0x00000149)
192#define TPM_CC_CertifyCreation (TPM_CC)(0x0000014A)
193#define TPM_CC_Duplicate (TPM_CC)(0x0000014B)
194#define TPM_CC_GetTime (TPM_CC)(0x0000014C)
195#define TPM_CC_GetSessionAuditDigest (TPM_CC)(0x0000014D)
196#define TPM_CC_NV_Read (TPM_CC)(0x0000014E)
197#define TPM_CC_NV_ReadLock (TPM_CC)(0x0000014F)
198#define TPM_CC_ObjectChangeAuth (TPM_CC)(0x00000150)
199#define TPM_CC_PolicySecret (TPM_CC)(0x00000151)
200#define TPM_CC_Rewrap (TPM_CC)(0x00000152)
201#define TPM_CC_Create (TPM_CC)(0x00000153)
202#define TPM_CC_ECDH_ZGen (TPM_CC)(0x00000154)
203#define TPM_CC_HMAC (TPM_CC)(0x00000155)
204#define TPM_CC_MAC (TPM_CC)(0x00000155)
205#define TPM_CC_Import (TPM_CC)(0x00000156)
206#define TPM_CC_Load (TPM_CC)(0x00000157)
207#define TPM_CC_Quote (TPM_CC)(0x00000158)
208#define TPM_CC_RSA_Decrypt (TPM_CC)(0x00000159)
209#define TPM_CC_HMAC_Start (TPM_CC)(0x0000015B)
210#define TPM_CC_MAC_Start (TPM_CC)(0x0000015B)
211#define TPM_CC_SequenceUpdate (TPM_CC)(0x0000015C)
212#define TPM_CC_Sign (TPM_CC)(0x0000015D)
213#define TPM_CC_Unseal (TPM_CC)(0x0000015E)
214#define TPM_CC_PolicySigned (TPM_CC)(0x00000160)
215#define TPM_CC_ContextLoad (TPM_CC)(0x00000161)
216#define TPM_CC_ContextSave (TPM_CC)(0x00000162)
217#define TPM_CC_ECDH_KeyGen (TPM_CC)(0x00000163)
218#define TPM_CC_EncryptDecrypt (TPM_CC)(0x00000164)
219#define TPM_CC_FlushContext (TPM_CC)(0x00000165)
220#define TPM_CC_LoadExternal (TPM_CC)(0x00000167)
221#define TPM_CC_MakeCredential (TPM_CC)(0x00000168)
222#define TPM_CC_NV_ReadPublic (TPM_CC)(0x00000169)
223#define TPM_CC_PolicyAuthorize (TPM_CC)(0x0000016A)
224#define TPM_CC_PolicyAuthValue (TPM_CC)(0x0000016B)
225#define TPM_CC_PolicyCommandCode (TPM_CC)(0x0000016C)
226#define TPM_CC_PolicyCounterTimer (TPM_CC)(0x0000016D)
227#define TPM_CC_PolicyCpHash (TPM_CC)(0x0000016E)
228#define TPM_CC_PolicyLocality (TPM_CC)(0x0000016F)
229#define TPM_CC_PolicyNameHash (TPM_CC)(0x00000170)
230#define TPM_CC_PolicyOR (TPM_CC)(0x00000171)
231#define TPM_CC_PolicyTicket (TPM_CC)(0x00000172)
232#define TPM_CC_ReadPublic (TPM_CC)(0x00000173)
233#define TPM_CC_RSA_Encrypt (TPM_CC)(0x00000174)
234#define TPM_CC_StartAuthSession (TPM_CC)(0x00000176)
235#define TPM_CC_VerifySignature (TPM_CC)(0x00000177)
236#define TPM_CC_ECC_Parameters (TPM_CC)(0x00000178)
237#define TPM_CC_FirmwareRead (TPM_CC)(0x00000179)
238#define TPM_CC_GetCapability (TPM_CC)(0x0000017A)
239#define TPM_CC_GetRandom (TPM_CC)(0x0000017B)
240#define TPM_CC_GetTestResult (TPM_CC)(0x0000017C)
241#define TPM_CC_Hash (TPM_CC)(0x0000017D)
242#define TPM_CC_PCR_Read (TPM_CC)(0x0000017E)
243#define TPM_CC_PolicyPCR (TPM_CC)(0x0000017F)
244#define TPM_CC_PolicyRestart (TPM_CC)(0x00000180)
245#define TPM_CC_ReadClock (TPM_CC)(0x00000181)
246#define TPM_CC_PCR_Extend (TPM_CC)(0x00000182)
247#define TPM_CC_PCR_SetAuthValue (TPM_CC)(0x00000183)
248#define TPM_CC_NV_Certify (TPM_CC)(0x00000184)
249#define TPM_CC_EventSequenceComplete (TPM_CC)(0x00000185)
250#define TPM_CC_HashSequenceStart (TPM_CC)(0x00000186)
251#define TPM_CC_PolicyPhysicalPresence (TPM_CC)(0x00000187)
252#define TPM_CC_PolicyDuplicationSelect (TPM_CC)(0x00000188)
253#define TPM_CC_PolicyGetDigest (TPM_CC)(0x00000189)
254#define TPM_CC_TestParms (TPM_CC)(0x0000018A)
255#define TPM_CC_Commit (TPM_CC)(0x0000018B)
256#define TPM_CC_PolicyPassword (TPM_CC)(0x0000018C)
257#define TPM_CC_ZGen_2Phase (TPM_CC)(0x0000018D)
258#define TPM_CC_EC_Ephemeral (TPM_CC)(0x0000018E)
259#define TPM_CC_PolicyNvWritten (TPM_CC)(0x0000018F)
260#define TPM_CC_PolicyTemplate (TPM_CC)(0x00000190)
261#define TPM_CC_CreateLoaded (TPM_CC)(0x00000191)
262#define TPM_CC_PolicyAuthorizeNV (TPM_CC)(0x00000192)
263#define TPM_CC_EncryptDecrypt2 (TPM_CC)(0x00000193)
264#define TPM_CC_AC_GetCapability (TPM_CC)(0x00000194)
265#define TPM_CC_AC_Send (TPM_CC)(0x00000195)
266#define TPM_CC_Policy_AC_SendSelect (TPM_CC)(0x00000196)
267#define TPM_CC_CertifyX509 (TPM_CC)(0x00000197)
DavidWooten8ea65f02019-12-14 12:49:50 -0500268#define TPM_CC_ACT_SetTimeout (TPM_CC)(0x00000198)
DavidWooten9dba2812020-03-10 15:25:34 -0400269#define TPM_CC_ECC_Encrypt (TPM_CC)(0x00000199)
270#define TPM_CC_ECC_Decrypt (TPM_CC)(0x0000019A)
DavidWooten777151f2019-07-26 21:50:36 -0400271#define CC_VEND 0x20000000
272#define TPM_CC_Vendor_TCG_Test (TPM_CC)(0x20000000)
273
Andrey Marochko394c6172017-11-27 13:49:27 -0800274// Table 2:5 - Definition of Types for Documentation Clarity
275typedef UINT32 TPM_ALGORITHM_ID;
Andrey Marochko5847c022019-02-08 13:28:00 -0800276#define TYPE_OF_TPM_ALGORITHM_ID UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800277typedef UINT32 TPM_MODIFIER_INDICATOR;
Andrey Marochko5847c022019-02-08 13:28:00 -0800278#define TYPE_OF_TPM_MODIFIER_INDICATOR UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800279typedef UINT32 TPM_AUTHORIZATION_SIZE;
Andrey Marochko5847c022019-02-08 13:28:00 -0800280#define TYPE_OF_TPM_AUTHORIZATION_SIZE UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800281typedef UINT32 TPM_PARAMETER_SIZE;
Andrey Marochko5847c022019-02-08 13:28:00 -0800282#define TYPE_OF_TPM_PARAMETER_SIZE UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800283typedef UINT16 TPM_KEY_SIZE;
Andrey Marochko5847c022019-02-08 13:28:00 -0800284#define TYPE_OF_TPM_KEY_SIZE UINT16
Andrey Marochko394c6172017-11-27 13:49:27 -0800285typedef UINT16 TPM_KEY_BITS;
Andrey Marochko5847c022019-02-08 13:28:00 -0800286#define TYPE_OF_TPM_KEY_BITS UINT16
Andrey Marochkob8e59922017-06-29 17:13:14 -0700287
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700288// Table 2:6 - Definition of TPM_SPEC Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800289typedef UINT32 TPM_SPEC;
Andrey Marochko5847c022019-02-08 13:28:00 -0800290#define TYPE_OF_TPM_SPEC UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800291#define SPEC_FAMILY 0x322E3000
292#define TPM_SPEC_FAMILY (TPM_SPEC)(SPEC_FAMILY)
293#define SPEC_LEVEL 00
294#define TPM_SPEC_LEVEL (TPM_SPEC)(SPEC_LEVEL)
DavidWooten9dba2812020-03-10 15:25:34 -0400295#define SPEC_VERSION 162
Andrey Marochko394c6172017-11-27 13:49:27 -0800296#define TPM_SPEC_VERSION (TPM_SPEC)(SPEC_VERSION)
DavidWooten9dba2812020-03-10 15:25:34 -0400297#define SPEC_YEAR 2020
Andrey Marochko394c6172017-11-27 13:49:27 -0800298#define TPM_SPEC_YEAR (TPM_SPEC)(SPEC_YEAR)
DavidWooten9dba2812020-03-10 15:25:34 -0400299#define SPEC_DAY_OF_YEAR 53
Andrey Marochko394c6172017-11-27 13:49:27 -0800300#define TPM_SPEC_DAY_OF_YEAR (TPM_SPEC)(SPEC_DAY_OF_YEAR)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700301
DavidWooten9dba2812020-03-10 15:25:34 -0400302// Table 2:7 - Definition of TPM_CONSTANTS32 Constants
303typedef UINT32 TPM_CONSTANTS32;
304#define TYPE_OF_TPM_CONSTANTS32 UINT32
305#define TPM_GENERATED_VALUE (TPM_CONSTANTS32)(0xFF544347)
306#define TPM_MAX_DERIVATION_BITS (TPM_CONSTANTS32)(8192)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700307
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700308// Table 2:16 - Definition of TPM_RC Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800309typedef UINT32 TPM_RC;
Andrey Marochko5847c022019-02-08 13:28:00 -0800310#define TYPE_OF_TPM_RC UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800311#define TPM_RC_SUCCESS (TPM_RC)(0x000)
312#define TPM_RC_BAD_TAG (TPM_RC)(0x01E)
313#define RC_VER1 (TPM_RC)(0x100)
314#define TPM_RC_INITIALIZE (TPM_RC)(RC_VER1+0x000)
315#define TPM_RC_FAILURE (TPM_RC)(RC_VER1+0x001)
316#define TPM_RC_SEQUENCE (TPM_RC)(RC_VER1+0x003)
317#define TPM_RC_PRIVATE (TPM_RC)(RC_VER1+0x00B)
318#define TPM_RC_HMAC (TPM_RC)(RC_VER1+0x019)
319#define TPM_RC_DISABLED (TPM_RC)(RC_VER1+0x020)
320#define TPM_RC_EXCLUSIVE (TPM_RC)(RC_VER1+0x021)
321#define TPM_RC_AUTH_TYPE (TPM_RC)(RC_VER1+0x024)
322#define TPM_RC_AUTH_MISSING (TPM_RC)(RC_VER1+0x025)
323#define TPM_RC_POLICY (TPM_RC)(RC_VER1+0x026)
324#define TPM_RC_PCR (TPM_RC)(RC_VER1+0x027)
325#define TPM_RC_PCR_CHANGED (TPM_RC)(RC_VER1+0x028)
326#define TPM_RC_UPGRADE (TPM_RC)(RC_VER1+0x02D)
327#define TPM_RC_TOO_MANY_CONTEXTS (TPM_RC)(RC_VER1+0x02E)
328#define TPM_RC_AUTH_UNAVAILABLE (TPM_RC)(RC_VER1+0x02F)
329#define TPM_RC_REBOOT (TPM_RC)(RC_VER1+0x030)
330#define TPM_RC_UNBALANCED (TPM_RC)(RC_VER1+0x031)
331#define TPM_RC_COMMAND_SIZE (TPM_RC)(RC_VER1+0x042)
332#define TPM_RC_COMMAND_CODE (TPM_RC)(RC_VER1+0x043)
333#define TPM_RC_AUTHSIZE (TPM_RC)(RC_VER1+0x044)
334#define TPM_RC_AUTH_CONTEXT (TPM_RC)(RC_VER1+0x045)
335#define TPM_RC_NV_RANGE (TPM_RC)(RC_VER1+0x046)
336#define TPM_RC_NV_SIZE (TPM_RC)(RC_VER1+0x047)
337#define TPM_RC_NV_LOCKED (TPM_RC)(RC_VER1+0x048)
338#define TPM_RC_NV_AUTHORIZATION (TPM_RC)(RC_VER1+0x049)
339#define TPM_RC_NV_UNINITIALIZED (TPM_RC)(RC_VER1+0x04A)
340#define TPM_RC_NV_SPACE (TPM_RC)(RC_VER1+0x04B)
341#define TPM_RC_NV_DEFINED (TPM_RC)(RC_VER1+0x04C)
342#define TPM_RC_BAD_CONTEXT (TPM_RC)(RC_VER1+0x050)
343#define TPM_RC_CPHASH (TPM_RC)(RC_VER1+0x051)
344#define TPM_RC_PARENT (TPM_RC)(RC_VER1+0x052)
345#define TPM_RC_NEEDS_TEST (TPM_RC)(RC_VER1+0x053)
346#define TPM_RC_NO_RESULT (TPM_RC)(RC_VER1+0x054)
347#define TPM_RC_SENSITIVE (TPM_RC)(RC_VER1+0x055)
348#define RC_MAX_FM0 (TPM_RC)(RC_VER1+0x07F)
349#define RC_FMT1 (TPM_RC)(0x080)
350#define TPM_RC_ASYMMETRIC (TPM_RC)(RC_FMT1+0x001)
351#define TPM_RCS_ASYMMETRIC (TPM_RC)(RC_FMT1+0x001)
352#define TPM_RC_ATTRIBUTES (TPM_RC)(RC_FMT1+0x002)
353#define TPM_RCS_ATTRIBUTES (TPM_RC)(RC_FMT1+0x002)
354#define TPM_RC_HASH (TPM_RC)(RC_FMT1+0x003)
355#define TPM_RCS_HASH (TPM_RC)(RC_FMT1+0x003)
356#define TPM_RC_VALUE (TPM_RC)(RC_FMT1+0x004)
357#define TPM_RCS_VALUE (TPM_RC)(RC_FMT1+0x004)
358#define TPM_RC_HIERARCHY (TPM_RC)(RC_FMT1+0x005)
359#define TPM_RCS_HIERARCHY (TPM_RC)(RC_FMT1+0x005)
360#define TPM_RC_KEY_SIZE (TPM_RC)(RC_FMT1+0x007)
361#define TPM_RCS_KEY_SIZE (TPM_RC)(RC_FMT1+0x007)
362#define TPM_RC_MGF (TPM_RC)(RC_FMT1+0x008)
363#define TPM_RCS_MGF (TPM_RC)(RC_FMT1+0x008)
364#define TPM_RC_MODE (TPM_RC)(RC_FMT1+0x009)
365#define TPM_RCS_MODE (TPM_RC)(RC_FMT1+0x009)
366#define TPM_RC_TYPE (TPM_RC)(RC_FMT1+0x00A)
367#define TPM_RCS_TYPE (TPM_RC)(RC_FMT1+0x00A)
368#define TPM_RC_HANDLE (TPM_RC)(RC_FMT1+0x00B)
369#define TPM_RCS_HANDLE (TPM_RC)(RC_FMT1+0x00B)
370#define TPM_RC_KDF (TPM_RC)(RC_FMT1+0x00C)
371#define TPM_RCS_KDF (TPM_RC)(RC_FMT1+0x00C)
372#define TPM_RC_RANGE (TPM_RC)(RC_FMT1+0x00D)
373#define TPM_RCS_RANGE (TPM_RC)(RC_FMT1+0x00D)
374#define TPM_RC_AUTH_FAIL (TPM_RC)(RC_FMT1+0x00E)
375#define TPM_RCS_AUTH_FAIL (TPM_RC)(RC_FMT1+0x00E)
376#define TPM_RC_NONCE (TPM_RC)(RC_FMT1+0x00F)
377#define TPM_RCS_NONCE (TPM_RC)(RC_FMT1+0x00F)
378#define TPM_RC_PP (TPM_RC)(RC_FMT1+0x010)
379#define TPM_RCS_PP (TPM_RC)(RC_FMT1+0x010)
380#define TPM_RC_SCHEME (TPM_RC)(RC_FMT1+0x012)
381#define TPM_RCS_SCHEME (TPM_RC)(RC_FMT1+0x012)
382#define TPM_RC_SIZE (TPM_RC)(RC_FMT1+0x015)
383#define TPM_RCS_SIZE (TPM_RC)(RC_FMT1+0x015)
384#define TPM_RC_SYMMETRIC (TPM_RC)(RC_FMT1+0x016)
385#define TPM_RCS_SYMMETRIC (TPM_RC)(RC_FMT1+0x016)
386#define TPM_RC_TAG (TPM_RC)(RC_FMT1+0x017)
387#define TPM_RCS_TAG (TPM_RC)(RC_FMT1+0x017)
388#define TPM_RC_SELECTOR (TPM_RC)(RC_FMT1+0x018)
389#define TPM_RCS_SELECTOR (TPM_RC)(RC_FMT1+0x018)
390#define TPM_RC_INSUFFICIENT (TPM_RC)(RC_FMT1+0x01A)
391#define TPM_RCS_INSUFFICIENT (TPM_RC)(RC_FMT1+0x01A)
392#define TPM_RC_SIGNATURE (TPM_RC)(RC_FMT1+0x01B)
393#define TPM_RCS_SIGNATURE (TPM_RC)(RC_FMT1+0x01B)
394#define TPM_RC_KEY (TPM_RC)(RC_FMT1+0x01C)
395#define TPM_RCS_KEY (TPM_RC)(RC_FMT1+0x01C)
396#define TPM_RC_POLICY_FAIL (TPM_RC)(RC_FMT1+0x01D)
397#define TPM_RCS_POLICY_FAIL (TPM_RC)(RC_FMT1+0x01D)
398#define TPM_RC_INTEGRITY (TPM_RC)(RC_FMT1+0x01F)
399#define TPM_RCS_INTEGRITY (TPM_RC)(RC_FMT1+0x01F)
400#define TPM_RC_TICKET (TPM_RC)(RC_FMT1+0x020)
401#define TPM_RCS_TICKET (TPM_RC)(RC_FMT1+0x020)
402#define TPM_RC_RESERVED_BITS (TPM_RC)(RC_FMT1+0x021)
403#define TPM_RCS_RESERVED_BITS (TPM_RC)(RC_FMT1+0x021)
404#define TPM_RC_BAD_AUTH (TPM_RC)(RC_FMT1+0x022)
405#define TPM_RCS_BAD_AUTH (TPM_RC)(RC_FMT1+0x022)
406#define TPM_RC_EXPIRED (TPM_RC)(RC_FMT1+0x023)
407#define TPM_RCS_EXPIRED (TPM_RC)(RC_FMT1+0x023)
408#define TPM_RC_POLICY_CC (TPM_RC)(RC_FMT1+0x024)
409#define TPM_RCS_POLICY_CC (TPM_RC)(RC_FMT1+0x024)
410#define TPM_RC_BINDING (TPM_RC)(RC_FMT1+0x025)
411#define TPM_RCS_BINDING (TPM_RC)(RC_FMT1+0x025)
412#define TPM_RC_CURVE (TPM_RC)(RC_FMT1+0x026)
413#define TPM_RCS_CURVE (TPM_RC)(RC_FMT1+0x026)
414#define TPM_RC_ECC_POINT (TPM_RC)(RC_FMT1+0x027)
415#define TPM_RCS_ECC_POINT (TPM_RC)(RC_FMT1+0x027)
416#define RC_WARN (TPM_RC)(0x900)
417#define TPM_RC_CONTEXT_GAP (TPM_RC)(RC_WARN+0x001)
418#define TPM_RC_OBJECT_MEMORY (TPM_RC)(RC_WARN+0x002)
419#define TPM_RC_SESSION_MEMORY (TPM_RC)(RC_WARN+0x003)
420#define TPM_RC_MEMORY (TPM_RC)(RC_WARN+0x004)
421#define TPM_RC_SESSION_HANDLES (TPM_RC)(RC_WARN+0x005)
422#define TPM_RC_OBJECT_HANDLES (TPM_RC)(RC_WARN+0x006)
423#define TPM_RC_LOCALITY (TPM_RC)(RC_WARN+0x007)
424#define TPM_RC_YIELDED (TPM_RC)(RC_WARN+0x008)
425#define TPM_RC_CANCELED (TPM_RC)(RC_WARN+0x009)
426#define TPM_RC_TESTING (TPM_RC)(RC_WARN+0x00A)
427#define TPM_RC_REFERENCE_H0 (TPM_RC)(RC_WARN+0x010)
428#define TPM_RC_REFERENCE_H1 (TPM_RC)(RC_WARN+0x011)
429#define TPM_RC_REFERENCE_H2 (TPM_RC)(RC_WARN+0x012)
430#define TPM_RC_REFERENCE_H3 (TPM_RC)(RC_WARN+0x013)
431#define TPM_RC_REFERENCE_H4 (TPM_RC)(RC_WARN+0x014)
432#define TPM_RC_REFERENCE_H5 (TPM_RC)(RC_WARN+0x015)
433#define TPM_RC_REFERENCE_H6 (TPM_RC)(RC_WARN+0x016)
434#define TPM_RC_REFERENCE_S0 (TPM_RC)(RC_WARN+0x018)
435#define TPM_RC_REFERENCE_S1 (TPM_RC)(RC_WARN+0x019)
436#define TPM_RC_REFERENCE_S2 (TPM_RC)(RC_WARN+0x01A)
437#define TPM_RC_REFERENCE_S3 (TPM_RC)(RC_WARN+0x01B)
438#define TPM_RC_REFERENCE_S4 (TPM_RC)(RC_WARN+0x01C)
439#define TPM_RC_REFERENCE_S5 (TPM_RC)(RC_WARN+0x01D)
440#define TPM_RC_REFERENCE_S6 (TPM_RC)(RC_WARN+0x01E)
441#define TPM_RC_NV_RATE (TPM_RC)(RC_WARN+0x020)
442#define TPM_RC_LOCKOUT (TPM_RC)(RC_WARN+0x021)
443#define TPM_RC_RETRY (TPM_RC)(RC_WARN+0x022)
444#define TPM_RC_NV_UNAVAILABLE (TPM_RC)(RC_WARN+0x023)
445#define TPM_RC_NOT_USED (TPM_RC)(RC_WARN+0x7F)
446#define TPM_RC_H (TPM_RC)(0x000)
447#define TPM_RC_P (TPM_RC)(0x040)
448#define TPM_RC_S (TPM_RC)(0x800)
449#define TPM_RC_1 (TPM_RC)(0x100)
450#define TPM_RC_2 (TPM_RC)(0x200)
451#define TPM_RC_3 (TPM_RC)(0x300)
452#define TPM_RC_4 (TPM_RC)(0x400)
453#define TPM_RC_5 (TPM_RC)(0x500)
454#define TPM_RC_6 (TPM_RC)(0x600)
455#define TPM_RC_7 (TPM_RC)(0x700)
456#define TPM_RC_8 (TPM_RC)(0x800)
457#define TPM_RC_9 (TPM_RC)(0x900)
458#define TPM_RC_A (TPM_RC)(0xA00)
459#define TPM_RC_B (TPM_RC)(0xB00)
460#define TPM_RC_C (TPM_RC)(0xC00)
461#define TPM_RC_D (TPM_RC)(0xD00)
462#define TPM_RC_E (TPM_RC)(0xE00)
463#define TPM_RC_F (TPM_RC)(0xF00)
464#define TPM_RC_N_MASK (TPM_RC)(0xF00)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700465
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700466// Table 2:17 - Definition of TPM_CLOCK_ADJUST Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800467typedef INT8 TPM_CLOCK_ADJUST;
Andrey Marochko5847c022019-02-08 13:28:00 -0800468#define TYPE_OF_TPM_CLOCK_ADJUST UINT8
Andrey Marochko394c6172017-11-27 13:49:27 -0800469#define TPM_CLOCK_COARSE_SLOWER (TPM_CLOCK_ADJUST)(-3)
470#define TPM_CLOCK_MEDIUM_SLOWER (TPM_CLOCK_ADJUST)(-2)
471#define TPM_CLOCK_FINE_SLOWER (TPM_CLOCK_ADJUST)(-1)
472#define TPM_CLOCK_NO_CHANGE (TPM_CLOCK_ADJUST)(0)
473#define TPM_CLOCK_FINE_FASTER (TPM_CLOCK_ADJUST)(1)
474#define TPM_CLOCK_MEDIUM_FASTER (TPM_CLOCK_ADJUST)(2)
475#define TPM_CLOCK_COARSE_FASTER (TPM_CLOCK_ADJUST)(3)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700476
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700477// Table 2:18 - Definition of TPM_EO Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800478typedef UINT16 TPM_EO;
Andrey Marochko5847c022019-02-08 13:28:00 -0800479#define TYPE_OF_TPM_EO UINT16
Andrey Marochko394c6172017-11-27 13:49:27 -0800480#define TPM_EO_EQ (TPM_EO)(0x0000)
481#define TPM_EO_NEQ (TPM_EO)(0x0001)
482#define TPM_EO_SIGNED_GT (TPM_EO)(0x0002)
483#define TPM_EO_UNSIGNED_GT (TPM_EO)(0x0003)
484#define TPM_EO_SIGNED_LT (TPM_EO)(0x0004)
485#define TPM_EO_UNSIGNED_LT (TPM_EO)(0x0005)
486#define TPM_EO_SIGNED_GE (TPM_EO)(0x0006)
487#define TPM_EO_UNSIGNED_GE (TPM_EO)(0x0007)
488#define TPM_EO_SIGNED_LE (TPM_EO)(0x0008)
489#define TPM_EO_UNSIGNED_LE (TPM_EO)(0x0009)
490#define TPM_EO_BITSET (TPM_EO)(0x000A)
491#define TPM_EO_BITCLEAR (TPM_EO)(0x000B)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700492
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700493// Table 2:19 - Definition of TPM_ST Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800494typedef UINT16 TPM_ST;
Andrey Marochko5847c022019-02-08 13:28:00 -0800495#define TYPE_OF_TPM_ST UINT16
Andrey Marochko394c6172017-11-27 13:49:27 -0800496#define TPM_ST_RSP_COMMAND (TPM_ST)(0x00C4)
497#define TPM_ST_NULL (TPM_ST)(0x8000)
498#define TPM_ST_NO_SESSIONS (TPM_ST)(0x8001)
499#define TPM_ST_SESSIONS (TPM_ST)(0x8002)
500#define TPM_ST_ATTEST_NV (TPM_ST)(0x8014)
501#define TPM_ST_ATTEST_COMMAND_AUDIT (TPM_ST)(0x8015)
502#define TPM_ST_ATTEST_SESSION_AUDIT (TPM_ST)(0x8016)
503#define TPM_ST_ATTEST_CERTIFY (TPM_ST)(0x8017)
504#define TPM_ST_ATTEST_QUOTE (TPM_ST)(0x8018)
505#define TPM_ST_ATTEST_TIME (TPM_ST)(0x8019)
506#define TPM_ST_ATTEST_CREATION (TPM_ST)(0x801A)
Andrey Marochko5847c022019-02-08 13:28:00 -0800507#define TPM_ST_ATTEST_NV_DIGEST (TPM_ST)(0x801C)
Andrey Marochko394c6172017-11-27 13:49:27 -0800508#define TPM_ST_CREATION (TPM_ST)(0x8021)
509#define TPM_ST_VERIFIED (TPM_ST)(0x8022)
510#define TPM_ST_AUTH_SECRET (TPM_ST)(0x8023)
511#define TPM_ST_HASHCHECK (TPM_ST)(0x8024)
512#define TPM_ST_AUTH_SIGNED (TPM_ST)(0x8025)
513#define TPM_ST_FU_MANIFEST (TPM_ST)(0x8029)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700514
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700515// Table 2:20 - Definition of TPM_SU Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800516typedef UINT16 TPM_SU;
Andrey Marochko5847c022019-02-08 13:28:00 -0800517#define TYPE_OF_TPM_SU UINT16
Andrey Marochko394c6172017-11-27 13:49:27 -0800518#define TPM_SU_CLEAR (TPM_SU)(0x0000)
519#define TPM_SU_STATE (TPM_SU)(0x0001)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700520
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700521// Table 2:21 - Definition of TPM_SE Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800522typedef UINT8 TPM_SE;
Andrey Marochko5847c022019-02-08 13:28:00 -0800523#define TYPE_OF_TPM_SE UINT8
Andrey Marochko394c6172017-11-27 13:49:27 -0800524#define TPM_SE_HMAC (TPM_SE)(0x00)
525#define TPM_SE_POLICY (TPM_SE)(0x01)
526#define TPM_SE_TRIAL (TPM_SE)(0x03)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700527
Andrey Marochko394c6172017-11-27 13:49:27 -0800528// Table 2:22 - Definition of TPM_CAP Constants
529typedef UINT32 TPM_CAP;
Andrey Marochko5847c022019-02-08 13:28:00 -0800530#define TYPE_OF_TPM_CAP UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800531#define TPM_CAP_FIRST (TPM_CAP)(0x00000000)
532#define TPM_CAP_ALGS (TPM_CAP)(0x00000000)
533#define TPM_CAP_HANDLES (TPM_CAP)(0x00000001)
534#define TPM_CAP_COMMANDS (TPM_CAP)(0x00000002)
535#define TPM_CAP_PP_COMMANDS (TPM_CAP)(0x00000003)
536#define TPM_CAP_AUDIT_COMMANDS (TPM_CAP)(0x00000004)
537#define TPM_CAP_PCRS (TPM_CAP)(0x00000005)
538#define TPM_CAP_TPM_PROPERTIES (TPM_CAP)(0x00000006)
539#define TPM_CAP_PCR_PROPERTIES (TPM_CAP)(0x00000007)
540#define TPM_CAP_ECC_CURVES (TPM_CAP)(0x00000008)
541#define TPM_CAP_AUTH_POLICIES (TPM_CAP)(0x00000009)
DavidWooten8ea65f02019-12-14 12:49:50 -0500542#define TPM_CAP_ACT (TPM_CAP)(0x0000000A)
543#define TPM_CAP_LAST (TPM_CAP)(0x0000000A)
Andrey Marochko394c6172017-11-27 13:49:27 -0800544#define TPM_CAP_VENDOR_PROPERTY (TPM_CAP)(0x00000100)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700545
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700546// Table 2:23 - Definition of TPM_PT Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800547typedef UINT32 TPM_PT;
Andrey Marochko5847c022019-02-08 13:28:00 -0800548#define TYPE_OF_TPM_PT UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800549#define TPM_PT_NONE (TPM_PT)(0x00000000)
550#define PT_GROUP (TPM_PT)(0x00000100)
551#define PT_FIXED (TPM_PT)(PT_GROUP*1)
552#define TPM_PT_FAMILY_INDICATOR (TPM_PT)(PT_FIXED+0)
553#define TPM_PT_LEVEL (TPM_PT)(PT_FIXED+1)
554#define TPM_PT_REVISION (TPM_PT)(PT_FIXED+2)
555#define TPM_PT_DAY_OF_YEAR (TPM_PT)(PT_FIXED+3)
556#define TPM_PT_YEAR (TPM_PT)(PT_FIXED+4)
557#define TPM_PT_MANUFACTURER (TPM_PT)(PT_FIXED+5)
558#define TPM_PT_VENDOR_STRING_1 (TPM_PT)(PT_FIXED+6)
559#define TPM_PT_VENDOR_STRING_2 (TPM_PT)(PT_FIXED+7)
560#define TPM_PT_VENDOR_STRING_3 (TPM_PT)(PT_FIXED+8)
561#define TPM_PT_VENDOR_STRING_4 (TPM_PT)(PT_FIXED+9)
562#define TPM_PT_VENDOR_TPM_TYPE (TPM_PT)(PT_FIXED+10)
563#define TPM_PT_FIRMWARE_VERSION_1 (TPM_PT)(PT_FIXED+11)
564#define TPM_PT_FIRMWARE_VERSION_2 (TPM_PT)(PT_FIXED+12)
565#define TPM_PT_INPUT_BUFFER (TPM_PT)(PT_FIXED+13)
566#define TPM_PT_HR_TRANSIENT_MIN (TPM_PT)(PT_FIXED+14)
567#define TPM_PT_HR_PERSISTENT_MIN (TPM_PT)(PT_FIXED+15)
568#define TPM_PT_HR_LOADED_MIN (TPM_PT)(PT_FIXED+16)
569#define TPM_PT_ACTIVE_SESSIONS_MAX (TPM_PT)(PT_FIXED+17)
570#define TPM_PT_PCR_COUNT (TPM_PT)(PT_FIXED+18)
571#define TPM_PT_PCR_SELECT_MIN (TPM_PT)(PT_FIXED+19)
572#define TPM_PT_CONTEXT_GAP_MAX (TPM_PT)(PT_FIXED+20)
573#define TPM_PT_NV_COUNTERS_MAX (TPM_PT)(PT_FIXED+22)
574#define TPM_PT_NV_INDEX_MAX (TPM_PT)(PT_FIXED+23)
575#define TPM_PT_MEMORY (TPM_PT)(PT_FIXED+24)
576#define TPM_PT_CLOCK_UPDATE (TPM_PT)(PT_FIXED+25)
577#define TPM_PT_CONTEXT_HASH (TPM_PT)(PT_FIXED+26)
578#define TPM_PT_CONTEXT_SYM (TPM_PT)(PT_FIXED+27)
579#define TPM_PT_CONTEXT_SYM_SIZE (TPM_PT)(PT_FIXED+28)
580#define TPM_PT_ORDERLY_COUNT (TPM_PT)(PT_FIXED+29)
581#define TPM_PT_MAX_COMMAND_SIZE (TPM_PT)(PT_FIXED+30)
582#define TPM_PT_MAX_RESPONSE_SIZE (TPM_PT)(PT_FIXED+31)
583#define TPM_PT_MAX_DIGEST (TPM_PT)(PT_FIXED+32)
584#define TPM_PT_MAX_OBJECT_CONTEXT (TPM_PT)(PT_FIXED+33)
585#define TPM_PT_MAX_SESSION_CONTEXT (TPM_PT)(PT_FIXED+34)
586#define TPM_PT_PS_FAMILY_INDICATOR (TPM_PT)(PT_FIXED+35)
587#define TPM_PT_PS_LEVEL (TPM_PT)(PT_FIXED+36)
588#define TPM_PT_PS_REVISION (TPM_PT)(PT_FIXED+37)
589#define TPM_PT_PS_DAY_OF_YEAR (TPM_PT)(PT_FIXED+38)
590#define TPM_PT_PS_YEAR (TPM_PT)(PT_FIXED+39)
591#define TPM_PT_SPLIT_MAX (TPM_PT)(PT_FIXED+40)
592#define TPM_PT_TOTAL_COMMANDS (TPM_PT)(PT_FIXED+41)
593#define TPM_PT_LIBRARY_COMMANDS (TPM_PT)(PT_FIXED+42)
594#define TPM_PT_VENDOR_COMMANDS (TPM_PT)(PT_FIXED+43)
595#define TPM_PT_NV_BUFFER_MAX (TPM_PT)(PT_FIXED+44)
596#define TPM_PT_MODES (TPM_PT)(PT_FIXED+45)
597#define TPM_PT_MAX_CAP_BUFFER (TPM_PT)(PT_FIXED+46)
598#define PT_VAR (TPM_PT)(PT_GROUP*2)
599#define TPM_PT_PERMANENT (TPM_PT)(PT_VAR+0)
600#define TPM_PT_STARTUP_CLEAR (TPM_PT)(PT_VAR+1)
601#define TPM_PT_HR_NV_INDEX (TPM_PT)(PT_VAR+2)
602#define TPM_PT_HR_LOADED (TPM_PT)(PT_VAR+3)
603#define TPM_PT_HR_LOADED_AVAIL (TPM_PT)(PT_VAR+4)
604#define TPM_PT_HR_ACTIVE (TPM_PT)(PT_VAR+5)
605#define TPM_PT_HR_ACTIVE_AVAIL (TPM_PT)(PT_VAR+6)
606#define TPM_PT_HR_TRANSIENT_AVAIL (TPM_PT)(PT_VAR+7)
607#define TPM_PT_HR_PERSISTENT (TPM_PT)(PT_VAR+8)
608#define TPM_PT_HR_PERSISTENT_AVAIL (TPM_PT)(PT_VAR+9)
609#define TPM_PT_NV_COUNTERS (TPM_PT)(PT_VAR+10)
610#define TPM_PT_NV_COUNTERS_AVAIL (TPM_PT)(PT_VAR+11)
611#define TPM_PT_ALGORITHM_SET (TPM_PT)(PT_VAR+12)
612#define TPM_PT_LOADED_CURVES (TPM_PT)(PT_VAR+13)
613#define TPM_PT_LOCKOUT_COUNTER (TPM_PT)(PT_VAR+14)
614#define TPM_PT_MAX_AUTH_FAIL (TPM_PT)(PT_VAR+15)
615#define TPM_PT_LOCKOUT_INTERVAL (TPM_PT)(PT_VAR+16)
616#define TPM_PT_LOCKOUT_RECOVERY (TPM_PT)(PT_VAR+17)
617#define TPM_PT_NV_WRITE_RECOVERY (TPM_PT)(PT_VAR+18)
618#define TPM_PT_AUDIT_COUNTER_0 (TPM_PT)(PT_VAR+19)
619#define TPM_PT_AUDIT_COUNTER_1 (TPM_PT)(PT_VAR+20)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700620
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700621// Table 2:24 - Definition of TPM_PT_PCR Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800622typedef UINT32 TPM_PT_PCR;
Andrey Marochko5847c022019-02-08 13:28:00 -0800623#define TYPE_OF_TPM_PT_PCR UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800624#define TPM_PT_PCR_FIRST (TPM_PT_PCR)(0x00000000)
625#define TPM_PT_PCR_SAVE (TPM_PT_PCR)(0x00000000)
626#define TPM_PT_PCR_EXTEND_L0 (TPM_PT_PCR)(0x00000001)
627#define TPM_PT_PCR_RESET_L0 (TPM_PT_PCR)(0x00000002)
628#define TPM_PT_PCR_EXTEND_L1 (TPM_PT_PCR)(0x00000003)
629#define TPM_PT_PCR_RESET_L1 (TPM_PT_PCR)(0x00000004)
630#define TPM_PT_PCR_EXTEND_L2 (TPM_PT_PCR)(0x00000005)
631#define TPM_PT_PCR_RESET_L2 (TPM_PT_PCR)(0x00000006)
632#define TPM_PT_PCR_EXTEND_L3 (TPM_PT_PCR)(0x00000007)
633#define TPM_PT_PCR_RESET_L3 (TPM_PT_PCR)(0x00000008)
634#define TPM_PT_PCR_EXTEND_L4 (TPM_PT_PCR)(0x00000009)
635#define TPM_PT_PCR_RESET_L4 (TPM_PT_PCR)(0x0000000A)
636#define TPM_PT_PCR_NO_INCREMENT (TPM_PT_PCR)(0x00000011)
637#define TPM_PT_PCR_DRTM_RESET (TPM_PT_PCR)(0x00000012)
638#define TPM_PT_PCR_POLICY (TPM_PT_PCR)(0x00000013)
639#define TPM_PT_PCR_AUTH (TPM_PT_PCR)(0x00000014)
640#define TPM_PT_PCR_LAST (TPM_PT_PCR)(0x00000014)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700641
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700642// Table 2:25 - Definition of TPM_PS Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800643typedef UINT32 TPM_PS;
Andrey Marochko5847c022019-02-08 13:28:00 -0800644#define TYPE_OF_TPM_PS UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800645#define TPM_PS_MAIN (TPM_PS)(0x00000000)
646#define TPM_PS_PC (TPM_PS)(0x00000001)
647#define TPM_PS_PDA (TPM_PS)(0x00000002)
648#define TPM_PS_CELL_PHONE (TPM_PS)(0x00000003)
649#define TPM_PS_SERVER (TPM_PS)(0x00000004)
650#define TPM_PS_PERIPHERAL (TPM_PS)(0x00000005)
651#define TPM_PS_TSS (TPM_PS)(0x00000006)
652#define TPM_PS_STORAGE (TPM_PS)(0x00000007)
653#define TPM_PS_AUTHENTICATION (TPM_PS)(0x00000008)
654#define TPM_PS_EMBEDDED (TPM_PS)(0x00000009)
655#define TPM_PS_HARDCOPY (TPM_PS)(0x0000000A)
656#define TPM_PS_INFRASTRUCTURE (TPM_PS)(0x0000000B)
657#define TPM_PS_VIRTUALIZATION (TPM_PS)(0x0000000C)
658#define TPM_PS_TNC (TPM_PS)(0x0000000D)
659#define TPM_PS_MULTI_TENANT (TPM_PS)(0x0000000E)
660#define TPM_PS_TC (TPM_PS)(0x0000000F)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700661
Andrey Marochko394c6172017-11-27 13:49:27 -0800662// Table 2:26 - Definition of Types for Handles
663typedef UINT32 TPM_HANDLE;
Andrey Marochko5847c022019-02-08 13:28:00 -0800664#define TYPE_OF_TPM_HANDLE UINT32
Andrey Marochkob8e59922017-06-29 17:13:14 -0700665
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700666// Table 2:27 - Definition of TPM_HT Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800667typedef UINT8 TPM_HT;
Andrey Marochko5847c022019-02-08 13:28:00 -0800668#define TYPE_OF_TPM_HT UINT8
Andrey Marochko394c6172017-11-27 13:49:27 -0800669#define TPM_HT_PCR (TPM_HT)(0x00)
670#define TPM_HT_NV_INDEX (TPM_HT)(0x01)
671#define TPM_HT_HMAC_SESSION (TPM_HT)(0x02)
672#define TPM_HT_LOADED_SESSION (TPM_HT)(0x02)
673#define TPM_HT_POLICY_SESSION (TPM_HT)(0x03)
674#define TPM_HT_SAVED_SESSION (TPM_HT)(0x03)
675#define TPM_HT_PERMANENT (TPM_HT)(0x40)
676#define TPM_HT_TRANSIENT (TPM_HT)(0x80)
677#define TPM_HT_PERSISTENT (TPM_HT)(0x81)
678#define TPM_HT_AC (TPM_HT)(0x90)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700679
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700680// Table 2:28 - Definition of TPM_RH Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800681typedef TPM_HANDLE TPM_RH;
682#define TPM_RH_FIRST (TPM_RH)(0x40000000)
683#define TPM_RH_SRK (TPM_RH)(0x40000000)
684#define TPM_RH_OWNER (TPM_RH)(0x40000001)
685#define TPM_RH_REVOKE (TPM_RH)(0x40000002)
686#define TPM_RH_TRANSPORT (TPM_RH)(0x40000003)
687#define TPM_RH_OPERATOR (TPM_RH)(0x40000004)
688#define TPM_RH_ADMIN (TPM_RH)(0x40000005)
689#define TPM_RH_EK (TPM_RH)(0x40000006)
690#define TPM_RH_NULL (TPM_RH)(0x40000007)
691#define TPM_RH_UNASSIGNED (TPM_RH)(0x40000008)
692#define TPM_RS_PW (TPM_RH)(0x40000009)
693#define TPM_RH_LOCKOUT (TPM_RH)(0x4000000A)
694#define TPM_RH_ENDORSEMENT (TPM_RH)(0x4000000B)
695#define TPM_RH_PLATFORM (TPM_RH)(0x4000000C)
696#define TPM_RH_PLATFORM_NV (TPM_RH)(0x4000000D)
697#define TPM_RH_AUTH_00 (TPM_RH)(0x40000010)
698#define TPM_RH_AUTH_FF (TPM_RH)(0x4000010F)
DavidWooten8ea65f02019-12-14 12:49:50 -0500699#define TPM_RH_ACT_0 (TPM_RH)(0x40000110)
700#define TPM_RH_ACT_F (TPM_RH)(0x4000011F)
701#define TPM_RH_LAST (TPM_RH)(0x4000011F)
Andrey Marochkob8e59922017-06-29 17:13:14 -0700702
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700703// Table 2:29 - Definition of TPM_HC Constants
Andrey Marochko394c6172017-11-27 13:49:27 -0800704typedef TPM_HANDLE TPM_HC;
705#define HR_HANDLE_MASK (TPM_HC)(0x00FFFFFF)
706#define HR_RANGE_MASK (TPM_HC)(0xFF000000)
707#define HR_SHIFT (TPM_HC)(24)
708#define HR_PCR (TPM_HC)((TPM_HT_PCR<<HR_SHIFT))
709#define HR_HMAC_SESSION (TPM_HC)((TPM_HT_HMAC_SESSION<<HR_SHIFT))
710#define HR_POLICY_SESSION (TPM_HC)((TPM_HT_POLICY_SESSION<<HR_SHIFT))
711#define HR_TRANSIENT (TPM_HC)((TPM_HT_TRANSIENT<<HR_SHIFT))
712#define HR_PERSISTENT (TPM_HC)((TPM_HT_PERSISTENT<<HR_SHIFT))
713#define HR_NV_INDEX (TPM_HC)((TPM_HT_NV_INDEX<<HR_SHIFT))
714#define HR_PERMANENT (TPM_HC)((TPM_HT_PERMANENT<<HR_SHIFT))
715#define PCR_FIRST (TPM_HC)((HR_PCR+0))
716#define PCR_LAST (TPM_HC)((PCR_FIRST+IMPLEMENTATION_PCR-1))
717#define HMAC_SESSION_FIRST (TPM_HC)((HR_HMAC_SESSION+0))
718#define HMAC_SESSION_LAST (TPM_HC)((HMAC_SESSION_FIRST+MAX_ACTIVE_SESSIONS-1))
719#define LOADED_SESSION_FIRST (TPM_HC)(HMAC_SESSION_FIRST)
720#define LOADED_SESSION_LAST (TPM_HC)(HMAC_SESSION_LAST)
721#define POLICY_SESSION_FIRST (TPM_HC)((HR_POLICY_SESSION+0))
722#define POLICY_SESSION_LAST \
723 (TPM_HC)((POLICY_SESSION_FIRST+MAX_ACTIVE_SESSIONS-1))
724#define TRANSIENT_FIRST (TPM_HC)((HR_TRANSIENT+0))
725#define ACTIVE_SESSION_FIRST (TPM_HC)(POLICY_SESSION_FIRST)
726#define ACTIVE_SESSION_LAST (TPM_HC)(POLICY_SESSION_LAST)
727#define TRANSIENT_LAST (TPM_HC)((TRANSIENT_FIRST+MAX_LOADED_OBJECTS-1))
728#define PERSISTENT_FIRST (TPM_HC)((HR_PERSISTENT+0))
729#define PERSISTENT_LAST (TPM_HC)((PERSISTENT_FIRST+0x00FFFFFF))
730#define PLATFORM_PERSISTENT (TPM_HC)((PERSISTENT_FIRST+0x00800000))
731#define NV_INDEX_FIRST (TPM_HC)((HR_NV_INDEX+0))
732#define NV_INDEX_LAST (TPM_HC)((NV_INDEX_FIRST+0x00FFFFFF))
733#define PERMANENT_FIRST (TPM_HC)(TPM_RH_FIRST)
734#define PERMANENT_LAST (TPM_HC)(TPM_RH_LAST)
735#define HR_NV_AC (TPM_HC)(((TPM_HT_NV_INDEX<<HR_SHIFT)+0xD00000))
736#define NV_AC_FIRST (TPM_HC)((HR_NV_AC+0))
737#define NV_AC_LAST (TPM_HC)((HR_NV_AC+0x0000FFFF))
738#define HR_AC (TPM_HC)((TPM_HT_AC<<HR_SHIFT))
739#define AC_FIRST (TPM_HC)((HR_AC+0))
740#define AC_LAST (TPM_HC)((HR_AC+0x0000FFFF))
Andrey Marochkob8e59922017-06-29 17:13:14 -0700741
Andrey Marochko5847c022019-02-08 13:28:00 -0800742#define TYPE_OF_TPMA_ALGORITHM UINT32
743#define TPMA_ALGORITHM_TO_UINT32(a) (*((UINT32 *)&(a)))
744#define UINT32_TO_TPMA_ALGORITHM(a) (*((TPMA_ALGORITHM *)&(a)))
745#define TPMA_ALGORITHM_TO_BYTE_ARRAY(i, a) \
746 UINT32_TO_BYTE_ARRAY((TPMA_ALGORITHM_TO_UINT32(i)), (a))
747#define BYTE_ARRAY_TO_TPMA_ALGORITHM(i, a) \
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700748 {UINT32 x = BYTE_ARRAY_TO_UINT32(a); \
749 i = UINT32_TO_TPMA_ALGORITHM(x); \
750 }
Andrey Marochko394c6172017-11-27 13:49:27 -0800751#if USE_BIT_FIELD_STRUCTURES
752typedef struct TPMA_ALGORITHM { // Table 2:30
753 unsigned asymmetric : 1;
754 unsigned symmetric : 1;
755 unsigned hash : 1;
756 unsigned object : 1;
757 unsigned Reserved_bits_at_4 : 4;
758 unsigned signing : 1;
759 unsigned encrypting : 1;
760 unsigned method : 1;
761 unsigned Reserved_bits_at_11 : 21;
762} TPMA_ALGORITHM; /* Bits */
763// This is the initializer for a TPMA_ALGORITHM structure
764#define TPMA_ALGORITHM_INITIALIZER( \
765 asymmetric, symmetric, hash, object, bits_at_4, \
766 signing, encrypting, method, bits_at_11) \
767 {asymmetric, symmetric, hash, object, bits_at_4, \
768 signing, encrypting, method, bits_at_11}
769#else // USE_BIT_FIELD_STRUCTURES
770// This implements Table 2:30 TPMA_ALGORITHM using bit masking
771typedef UINT32 TPMA_ALGORITHM;
Andrey Marochko5847c022019-02-08 13:28:00 -0800772#define TYPE_OF_TPMA_ALGORITHM UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800773#define TPMA_ALGORITHM_asymmetric ((TPMA_ALGORITHM)1 << 0)
774#define TPMA_ALGORITHM_symmetric ((TPMA_ALGORITHM)1 << 1)
775#define TPMA_ALGORITHM_hash ((TPMA_ALGORITHM)1 << 2)
776#define TPMA_ALGORITHM_object ((TPMA_ALGORITHM)1 << 3)
777#define TPMA_ALGORITHM_signing ((TPMA_ALGORITHM)1 << 8)
778#define TPMA_ALGORITHM_encrypting ((TPMA_ALGORITHM)1 << 9)
779#define TPMA_ALGORITHM_method ((TPMA_ALGORITHM)1 << 10)
780// This is the initializer for a TPMA_ALGORITHM bit array.
781#define TPMA_ALGORITHM_INITIALIZER( \
782 asymmetric, symmetric, hash, object, bits_at_4, \
783 signing, encrypting, method, bits_at_11) \
DavidWooten8ea65f02019-12-14 12:49:50 -0500784 (TPMA_ALGORITHM)( \
785 (asymmetric << 0) + (symmetric << 1) + (hash << 2) + \
Andrey Marochko394c6172017-11-27 13:49:27 -0800786 (object << 3) + (signing << 8) + (encrypting << 9) + \
DavidWooten8ea65f02019-12-14 12:49:50 -0500787 (method << 10))
Andrey Marochko394c6172017-11-27 13:49:27 -0800788#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -0700789
Andrey Marochko5847c022019-02-08 13:28:00 -0800790#define TYPE_OF_TPMA_OBJECT UINT32
791#define TPMA_OBJECT_TO_UINT32(a) (*((UINT32 *)&(a)))
792#define UINT32_TO_TPMA_OBJECT(a) (*((TPMA_OBJECT *)&(a)))
793#define TPMA_OBJECT_TO_BYTE_ARRAY(i, a) \
794 UINT32_TO_BYTE_ARRAY((TPMA_OBJECT_TO_UINT32(i)), (a))
795#define BYTE_ARRAY_TO_TPMA_OBJECT(i, a) \
796 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPMA_OBJECT(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -0800797#if USE_BIT_FIELD_STRUCTURES
798typedef struct TPMA_OBJECT { // Table 2:31
799 unsigned Reserved_bit_at_0 : 1;
800 unsigned fixedTPM : 1;
801 unsigned stClear : 1;
802 unsigned Reserved_bit_at_3 : 1;
803 unsigned fixedParent : 1;
804 unsigned sensitiveDataOrigin : 1;
805 unsigned userWithAuth : 1;
806 unsigned adminWithPolicy : 1;
807 unsigned Reserved_bits_at_8 : 2;
808 unsigned noDA : 1;
809 unsigned encryptedDuplication : 1;
810 unsigned Reserved_bits_at_12 : 4;
811 unsigned restricted : 1;
812 unsigned decrypt : 1;
813 unsigned sign : 1;
Andrey Marochko5847c022019-02-08 13:28:00 -0800814 unsigned x509sign : 1;
815 unsigned Reserved_bits_at_20 : 12;
Andrey Marochko394c6172017-11-27 13:49:27 -0800816} TPMA_OBJECT; /* Bits */
817// This is the initializer for a TPMA_OBJECT structure
818#define TPMA_OBJECT_INITIALIZER( \
819 bit_at_0, fixedtpm, stclear, \
820 bit_at_3, fixedparent, sensitivedataorigin, \
821 userwithauth, adminwithpolicy, bits_at_8, \
822 noda, encryptedduplication, bits_at_12, \
823 restricted, decrypt, sign, \
Andrey Marochko5847c022019-02-08 13:28:00 -0800824 x509sign, bits_at_20) \
Andrey Marochko394c6172017-11-27 13:49:27 -0800825 {bit_at_0, fixedtpm, stclear, \
826 bit_at_3, fixedparent, sensitivedataorigin, \
827 userwithauth, adminwithpolicy, bits_at_8, \
828 noda, encryptedduplication, bits_at_12, \
829 restricted, decrypt, sign, \
Andrey Marochko5847c022019-02-08 13:28:00 -0800830 x509sign, bits_at_20}
Andrey Marochko394c6172017-11-27 13:49:27 -0800831#else // USE_BIT_FIELD_STRUCTURES
832// This implements Table 2:31 TPMA_OBJECT using bit masking
833typedef UINT32 TPMA_OBJECT;
Andrey Marochko5847c022019-02-08 13:28:00 -0800834#define TYPE_OF_TPMA_OBJECT UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800835#define TPMA_OBJECT_fixedTPM ((TPMA_OBJECT)1 << 1)
836#define TPMA_OBJECT_stClear ((TPMA_OBJECT)1 << 2)
837#define TPMA_OBJECT_fixedParent ((TPMA_OBJECT)1 << 4)
838#define TPMA_OBJECT_sensitiveDataOrigin ((TPMA_OBJECT)1 << 5)
839#define TPMA_OBJECT_userWithAuth ((TPMA_OBJECT)1 << 6)
840#define TPMA_OBJECT_adminWithPolicy ((TPMA_OBJECT)1 << 7)
841#define TPMA_OBJECT_noDA ((TPMA_OBJECT)1 << 10)
842#define TPMA_OBJECT_encryptedDuplication ((TPMA_OBJECT)1 << 11)
843#define TPMA_OBJECT_restricted ((TPMA_OBJECT)1 << 16)
844#define TPMA_OBJECT_decrypt ((TPMA_OBJECT)1 << 17)
845#define TPMA_OBJECT_sign ((TPMA_OBJECT)1 << 18)
Andrey Marochko5847c022019-02-08 13:28:00 -0800846#define TPMA_OBJECT_x509sign ((TPMA_OBJECT)1 << 19)
Andrey Marochko394c6172017-11-27 13:49:27 -0800847// This is the initializer for a TPMA_OBJECT bit array.
848#define TPMA_OBJECT_INITIALIZER( \
849 bit_at_0, fixedtpm, stclear, \
850 bit_at_3, fixedparent, sensitivedataorigin, \
851 userwithauth, adminwithpolicy, bits_at_8, \
852 noda, encryptedduplication, bits_at_12, \
853 restricted, decrypt, sign, \
Andrey Marochko5847c022019-02-08 13:28:00 -0800854 x509sign, bits_at_20) \
DavidWooten8ea65f02019-12-14 12:49:50 -0500855 (TPMA_OBJECT)( \
856 (fixedtpm << 1) + (stclear << 2) + \
Andrey Marochko394c6172017-11-27 13:49:27 -0800857 (fixedparent << 4) + (sensitivedataorigin << 5) + \
858 (userwithauth << 6) + (adminwithpolicy << 7) + \
859 (noda << 10) + (encryptedduplication << 11) + \
860 (restricted << 16) + (decrypt << 17) + \
DavidWooten8ea65f02019-12-14 12:49:50 -0500861 (sign << 18) + (x509sign << 19))
Andrey Marochko394c6172017-11-27 13:49:27 -0800862#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -0700863
Andrey Marochko5847c022019-02-08 13:28:00 -0800864#define TYPE_OF_TPMA_SESSION UINT8
865#define TPMA_SESSION_TO_UINT8(a) (*((UINT8 *)&(a)))
866#define UINT8_TO_TPMA_SESSION(a) (*((TPMA_SESSION *)&(a)))
867#define TPMA_SESSION_TO_BYTE_ARRAY(i, a) \
868 UINT8_TO_BYTE_ARRAY((TPMA_SESSION_TO_UINT8(i)), (a))
869#define BYTE_ARRAY_TO_TPMA_SESSION(i, a) \
870 { UINT8 x = BYTE_ARRAY_TO_UINT8(a); i = UINT8_TO_TPMA_SESSION(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -0800871#if USE_BIT_FIELD_STRUCTURES
872typedef struct TPMA_SESSION { // Table 2:32
873 unsigned continueSession : 1;
874 unsigned auditExclusive : 1;
875 unsigned auditReset : 1;
876 unsigned Reserved_bits_at_3 : 2;
877 unsigned decrypt : 1;
878 unsigned encrypt : 1;
879 unsigned audit : 1;
880} TPMA_SESSION; /* Bits */
881// This is the initializer for a TPMA_SESSION structure
882#define TPMA_SESSION_INITIALIZER( \
883 continuesession, auditexclusive, auditreset, bits_at_3, \
884 decrypt, encrypt, audit) \
885 {continuesession, auditexclusive, auditreset, bits_at_3, \
886 decrypt, encrypt, audit}
887#else // USE_BIT_FIELD_STRUCTURES
888// This implements Table 2:32 TPMA_SESSION using bit masking
889typedef UINT8 TPMA_SESSION;
Andrey Marochko5847c022019-02-08 13:28:00 -0800890#define TYPE_OF_TPMA_SESSION UINT8
Andrey Marochko394c6172017-11-27 13:49:27 -0800891#define TPMA_SESSION_continueSession ((TPMA_SESSION)1 << 0)
892#define TPMA_SESSION_auditExclusive ((TPMA_SESSION)1 << 1)
893#define TPMA_SESSION_auditReset ((TPMA_SESSION)1 << 2)
894#define TPMA_SESSION_decrypt ((TPMA_SESSION)1 << 5)
895#define TPMA_SESSION_encrypt ((TPMA_SESSION)1 << 6)
896#define TPMA_SESSION_audit ((TPMA_SESSION)1 << 7)
897// This is the initializer for a TPMA_SESSION bit array.
898#define TPMA_SESSION_INITIALIZER( \
899 continuesession, auditexclusive, auditreset, bits_at_3, \
900 decrypt, encrypt, audit) \
DavidWooten8ea65f02019-12-14 12:49:50 -0500901 (TPMA_SESSION)( \
902 (continuesession << 0) + (auditexclusive << 1) + \
Andrey Marochko394c6172017-11-27 13:49:27 -0800903 (auditreset << 2) + (decrypt << 5) + \
DavidWooten8ea65f02019-12-14 12:49:50 -0500904 (encrypt << 6) + (audit << 7))
Andrey Marochko394c6172017-11-27 13:49:27 -0800905#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -0700906
Andrey Marochko5847c022019-02-08 13:28:00 -0800907#define TYPE_OF_TPMA_LOCALITY UINT8
908#define TPMA_LOCALITY_TO_UINT8(a) (*((UINT8 *)&(a)))
909#define UINT8_TO_TPMA_LOCALITY(a) (*((TPMA_LOCALITY *)&(a)))
910#define TPMA_LOCALITY_TO_BYTE_ARRAY(i, a) \
911 UINT8_TO_BYTE_ARRAY((TPMA_LOCALITY_TO_UINT8(i)), (a))
912#define BYTE_ARRAY_TO_TPMA_LOCALITY(i, a) \
913 { UINT8 x = BYTE_ARRAY_TO_UINT8(a); i = UINT8_TO_TPMA_LOCALITY(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -0800914#if USE_BIT_FIELD_STRUCTURES
915typedef struct TPMA_LOCALITY { // Table 2:33
916 unsigned TPM_LOC_ZERO : 1;
917 unsigned TPM_LOC_ONE : 1;
918 unsigned TPM_LOC_TWO : 1;
919 unsigned TPM_LOC_THREE : 1;
920 unsigned TPM_LOC_FOUR : 1;
921 unsigned Extended : 3;
922} TPMA_LOCALITY; /* Bits */
923// This is the initializer for a TPMA_LOCALITY structure
924#define TPMA_LOCALITY_INITIALIZER( \
925 tpm_loc_zero, tpm_loc_one, tpm_loc_two, tpm_loc_three, \
926 tpm_loc_four, extended) \
927 {tpm_loc_zero, tpm_loc_one, tpm_loc_two, tpm_loc_three, \
928 tpm_loc_four, extended}
929#else // USE_BIT_FIELD_STRUCTURES
930// This implements Table 2:33 TPMA_LOCALITY using bit masking
931typedef UINT8 TPMA_LOCALITY;
Andrey Marochko5847c022019-02-08 13:28:00 -0800932#define TYPE_OF_TPMA_LOCALITY UINT8
Andrey Marochko394c6172017-11-27 13:49:27 -0800933#define TPMA_LOCALITY_TPM_LOC_ZERO ((TPMA_LOCALITY)1 << 0)
934#define TPMA_LOCALITY_TPM_LOC_ONE ((TPMA_LOCALITY)1 << 1)
935#define TPMA_LOCALITY_TPM_LOC_TWO ((TPMA_LOCALITY)1 << 2)
936#define TPMA_LOCALITY_TPM_LOC_THREE ((TPMA_LOCALITY)1 << 3)
937#define TPMA_LOCALITY_TPM_LOC_FOUR ((TPMA_LOCALITY)1 << 4)
938#define TPMA_LOCALITY_Extended_SHIFT 5
939#define TPMA_LOCALITY_Extended ((TPMA_LOCALITY)0x7 << 5)
940// This is the initializer for a TPMA_LOCALITY bit array.
941#define TPMA_LOCALITY_INITIALIZER( \
942 tpm_loc_zero, tpm_loc_one, tpm_loc_two, tpm_loc_three, \
943 tpm_loc_four, extended) \
DavidWooten8ea65f02019-12-14 12:49:50 -0500944 (TPMA_LOCALITY)( \
945 (tpm_loc_zero << 0) + (tpm_loc_one << 1) + (tpm_loc_two << 2) + \
946 (tpm_loc_three << 3) + (tpm_loc_four << 4) + (extended << 5))
Andrey Marochko394c6172017-11-27 13:49:27 -0800947#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -0700948
Andrey Marochko5847c022019-02-08 13:28:00 -0800949#define TYPE_OF_TPMA_PERMANENT UINT32
950#define TPMA_PERMANENT_TO_UINT32(a) (*((UINT32 *)&(a)))
951#define UINT32_TO_TPMA_PERMANENT(a) (*((TPMA_PERMANENT *)&(a)))
952#define TPMA_PERMANENT_TO_BYTE_ARRAY(i, a) \
953 UINT32_TO_BYTE_ARRAY((TPMA_PERMANENT_TO_UINT32(i)), (a))
954#define BYTE_ARRAY_TO_TPMA_PERMANENT(i, a) \
Andrey Marochko083cb5b2019-05-21 15:30:21 -0700955 {UINT32 x = BYTE_ARRAY_TO_UINT32(a); \
956 i = UINT32_TO_TPMA_PERMANENT(x); \
957 }
Andrey Marochko394c6172017-11-27 13:49:27 -0800958#if USE_BIT_FIELD_STRUCTURES
959typedef struct TPMA_PERMANENT { // Table 2:34
960 unsigned ownerAuthSet : 1;
961 unsigned endorsementAuthSet : 1;
962 unsigned lockoutAuthSet : 1;
963 unsigned Reserved_bits_at_3 : 5;
964 unsigned disableClear : 1;
965 unsigned inLockout : 1;
966 unsigned tpmGeneratedEPS : 1;
967 unsigned Reserved_bits_at_11 : 21;
968} TPMA_PERMANENT; /* Bits */
969// This is the initializer for a TPMA_PERMANENT structure
970#define TPMA_PERMANENT_INITIALIZER( \
971 ownerauthset, endorsementauthset, lockoutauthset, \
972 bits_at_3, disableclear, inlockout, \
973 tpmgeneratedeps, bits_at_11) \
974 {ownerauthset, endorsementauthset, lockoutauthset, \
975 bits_at_3, disableclear, inlockout, \
976 tpmgeneratedeps, bits_at_11}
977#else // USE_BIT_FIELD_STRUCTURES
978// This implements Table 2:34 TPMA_PERMANENT using bit masking
979typedef UINT32 TPMA_PERMANENT;
Andrey Marochko5847c022019-02-08 13:28:00 -0800980#define TYPE_OF_TPMA_PERMANENT UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -0800981#define TPMA_PERMANENT_ownerAuthSet ((TPMA_PERMANENT)1 << 0)
982#define TPMA_PERMANENT_endorsementAuthSet ((TPMA_PERMANENT)1 << 1)
983#define TPMA_PERMANENT_lockoutAuthSet ((TPMA_PERMANENT)1 << 2)
984#define TPMA_PERMANENT_disableClear ((TPMA_PERMANENT)1 << 8)
985#define TPMA_PERMANENT_inLockout ((TPMA_PERMANENT)1 << 9)
986#define TPMA_PERMANENT_tpmGeneratedEPS ((TPMA_PERMANENT)1 << 10)
987// This is the initializer for a TPMA_PERMANENT bit array.
988#define TPMA_PERMANENT_INITIALIZER( \
989 ownerauthset, endorsementauthset, lockoutauthset, \
990 bits_at_3, disableclear, inlockout, \
991 tpmgeneratedeps, bits_at_11) \
DavidWooten8ea65f02019-12-14 12:49:50 -0500992 (TPMA_PERMANENT)( \
993 (ownerauthset << 0) + (endorsementauthset << 1) + \
Andrey Marochko394c6172017-11-27 13:49:27 -0800994 (lockoutauthset << 2) + (disableclear << 8) + \
DavidWooten8ea65f02019-12-14 12:49:50 -0500995 (inlockout << 9) + (tpmgeneratedeps << 10))
Andrey Marochko394c6172017-11-27 13:49:27 -0800996#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -0700997
Andrey Marochko5847c022019-02-08 13:28:00 -0800998#define TYPE_OF_TPMA_STARTUP_CLEAR UINT32
999#define TPMA_STARTUP_CLEAR_TO_UINT32(a) (*((UINT32 *)&(a)))
1000#define UINT32_TO_TPMA_STARTUP_CLEAR(a) (*((TPMA_STARTUP_CLEAR *)&(a)))
1001#define TPMA_STARTUP_CLEAR_TO_BYTE_ARRAY(i, a) \
1002 UINT32_TO_BYTE_ARRAY((TPMA_STARTUP_CLEAR_TO_UINT32(i)), (a))
1003#define BYTE_ARRAY_TO_TPMA_STARTUP_CLEAR(i, a) \
Andrey Marochko083cb5b2019-05-21 15:30:21 -07001004 {UINT32 x = BYTE_ARRAY_TO_UINT32(a); \
1005 i = UINT32_TO_TPMA_STARTUP_CLEAR(x); \
1006 }
Andrey Marochko394c6172017-11-27 13:49:27 -08001007#if USE_BIT_FIELD_STRUCTURES
1008typedef struct TPMA_STARTUP_CLEAR { // Table 2:35
1009 unsigned phEnable : 1;
1010 unsigned shEnable : 1;
1011 unsigned ehEnable : 1;
1012 unsigned phEnableNV : 1;
1013 unsigned Reserved_bits_at_4 : 27;
1014 unsigned orderly : 1;
1015} TPMA_STARTUP_CLEAR; /* Bits */
1016// This is the initializer for a TPMA_STARTUP_CLEAR structure
1017#define TPMA_STARTUP_CLEAR_INITIALIZER( \
1018 phenable, shenable, ehenable, phenablenv, bits_at_4, orderly) \
1019 {phenable, shenable, ehenable, phenablenv, bits_at_4, orderly}
1020#else // USE_BIT_FIELD_STRUCTURES
1021// This implements Table 2:35 TPMA_STARTUP_CLEAR using bit masking
1022typedef UINT32 TPMA_STARTUP_CLEAR;
Andrey Marochko5847c022019-02-08 13:28:00 -08001023#define TYPE_OF_TPMA_STARTUP_CLEAR UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08001024#define TPMA_STARTUP_CLEAR_phEnable ((TPMA_STARTUP_CLEAR)1 << 0)
1025#define TPMA_STARTUP_CLEAR_shEnable ((TPMA_STARTUP_CLEAR)1 << 1)
1026#define TPMA_STARTUP_CLEAR_ehEnable ((TPMA_STARTUP_CLEAR)1 << 2)
1027#define TPMA_STARTUP_CLEAR_phEnableNV ((TPMA_STARTUP_CLEAR)1 << 3)
1028#define TPMA_STARTUP_CLEAR_orderly ((TPMA_STARTUP_CLEAR)1 << 31)
1029// This is the initializer for a TPMA_STARTUP_CLEAR bit array.
1030#define TPMA_STARTUP_CLEAR_INITIALIZER( \
1031 phenable, shenable, ehenable, phenablenv, bits_at_4, orderly) \
DavidWooten8ea65f02019-12-14 12:49:50 -05001032 (TPMA_STARTUP_CLEAR)( \
1033 (phenable << 0) + (shenable << 1) + (ehenable << 2) + \
1034 (phenablenv << 3) + (orderly << 31))
Andrey Marochko394c6172017-11-27 13:49:27 -08001035#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001036
Andrey Marochko5847c022019-02-08 13:28:00 -08001037#define TYPE_OF_TPMA_MEMORY UINT32
1038#define TPMA_MEMORY_TO_UINT32(a) (*((UINT32 *)&(a)))
1039#define UINT32_TO_TPMA_MEMORY(a) (*((TPMA_MEMORY *)&(a)))
1040#define TPMA_MEMORY_TO_BYTE_ARRAY(i, a) \
1041 UINT32_TO_BYTE_ARRAY((TPMA_MEMORY_TO_UINT32(i)), (a))
1042#define BYTE_ARRAY_TO_TPMA_MEMORY(i, a) \
1043 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPMA_MEMORY(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -08001044#if USE_BIT_FIELD_STRUCTURES
1045typedef struct TPMA_MEMORY { // Table 2:36
1046 unsigned sharedRAM : 1;
1047 unsigned sharedNV : 1;
1048 unsigned objectCopiedToRam : 1;
1049 unsigned Reserved_bits_at_3 : 29;
1050} TPMA_MEMORY; /* Bits */
1051// This is the initializer for a TPMA_MEMORY structure
1052#define TPMA_MEMORY_INITIALIZER( \
1053 sharedram, sharednv, objectcopiedtoram, bits_at_3) \
1054 {sharedram, sharednv, objectcopiedtoram, bits_at_3}
1055#else // USE_BIT_FIELD_STRUCTURES
1056// This implements Table 2:36 TPMA_MEMORY using bit masking
1057typedef UINT32 TPMA_MEMORY;
Andrey Marochko5847c022019-02-08 13:28:00 -08001058#define TYPE_OF_TPMA_MEMORY UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08001059#define TPMA_MEMORY_sharedRAM ((TPMA_MEMORY)1 << 0)
1060#define TPMA_MEMORY_sharedNV ((TPMA_MEMORY)1 << 1)
1061#define TPMA_MEMORY_objectCopiedToRam ((TPMA_MEMORY)1 << 2)
1062// This is the initializer for a TPMA_MEMORY bit array.
1063#define TPMA_MEMORY_INITIALIZER( \
1064 sharedram, sharednv, objectcopiedtoram, bits_at_3) \
DavidWooten8ea65f02019-12-14 12:49:50 -05001065 (TPMA_MEMORY)( \
1066 (sharedram << 0) + (sharednv << 1) + (objectcopiedtoram << 2))
Andrey Marochko394c6172017-11-27 13:49:27 -08001067#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001068
Andrey Marochko5847c022019-02-08 13:28:00 -08001069#define TYPE_OF_TPMA_CC UINT32
1070#define TPMA_CC_TO_UINT32(a) (*((UINT32 *)&(a)))
1071#define UINT32_TO_TPMA_CC(a) (*((TPMA_CC *)&(a)))
1072#define TPMA_CC_TO_BYTE_ARRAY(i, a) \
1073 UINT32_TO_BYTE_ARRAY((TPMA_CC_TO_UINT32(i)), (a))
1074#define BYTE_ARRAY_TO_TPMA_CC(i, a) \
1075 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPMA_CC(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -08001076#if USE_BIT_FIELD_STRUCTURES
1077typedef struct TPMA_CC { // Table 2:37
1078 unsigned commandIndex : 16;
1079 unsigned Reserved_bits_at_16 : 6;
1080 unsigned nv : 1;
1081 unsigned extensive : 1;
1082 unsigned flushed : 1;
1083 unsigned cHandles : 3;
1084 unsigned rHandle : 1;
1085 unsigned V : 1;
1086 unsigned Reserved_bits_at_30 : 2;
1087} TPMA_CC; /* Bits */
1088// This is the initializer for a TPMA_CC structure
1089#define TPMA_CC_INITIALIZER( \
1090 commandindex, bits_at_16, nv, extensive, flushed, \
1091 chandles, rhandle, v, bits_at_30) \
1092 {commandindex, bits_at_16, nv, extensive, flushed, \
1093 chandles, rhandle, v, bits_at_30}
1094#else // USE_BIT_FIELD_STRUCTURES
1095// This implements Table 2:37 TPMA_CC using bit masking
1096typedef UINT32 TPMA_CC;
Andrey Marochko5847c022019-02-08 13:28:00 -08001097#define TYPE_OF_TPMA_CC UINT32
Andrey Marochko3074f142017-06-30 15:43:04 -07001098#define TPMA_CC_commandIndex_SHIFT 0
1099#define TPMA_CC_commandIndex ((TPMA_CC)0xffff << 0)
1100#define TPMA_CC_nv ((TPMA_CC)1 << 22)
1101#define TPMA_CC_extensive ((TPMA_CC)1 << 23)
1102#define TPMA_CC_flushed ((TPMA_CC)1 << 24)
1103#define TPMA_CC_cHandles_SHIFT 25
1104#define TPMA_CC_cHandles ((TPMA_CC)0x7 << 25)
1105#define TPMA_CC_rHandle ((TPMA_CC)1 << 28)
1106#define TPMA_CC_V ((TPMA_CC)1 << 29)
Andrey Marochko394c6172017-11-27 13:49:27 -08001107// This is the initializer for a TPMA_CC bit array.
1108#define TPMA_CC_INITIALIZER( \
1109 commandindex, bits_at_16, nv, extensive, flushed, \
1110 chandles, rhandle, v, bits_at_30) \
DavidWooten8ea65f02019-12-14 12:49:50 -05001111 (TPMA_CC)( \
1112 (commandindex << 0) + (nv << 22) + (extensive << 23) + \
Andrey Marochko394c6172017-11-27 13:49:27 -08001113 (flushed << 24) + (chandles << 25) + (rhandle << 28) + \
DavidWooten8ea65f02019-12-14 12:49:50 -05001114 (v << 29))
Andrey Marochko394c6172017-11-27 13:49:27 -08001115#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001116
Andrey Marochko5847c022019-02-08 13:28:00 -08001117#define TYPE_OF_TPMA_MODES UINT32
1118#define TPMA_MODES_TO_UINT32(a) (*((UINT32 *)&(a)))
1119#define UINT32_TO_TPMA_MODES(a) (*((TPMA_MODES *)&(a)))
1120#define TPMA_MODES_TO_BYTE_ARRAY(i, a) \
1121 UINT32_TO_BYTE_ARRAY((TPMA_MODES_TO_UINT32(i)), (a))
1122#define BYTE_ARRAY_TO_TPMA_MODES(i, a) \
1123 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPMA_MODES(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -08001124#if USE_BIT_FIELD_STRUCTURES
1125typedef struct TPMA_MODES { // Table 2:38
1126 unsigned FIPS_140_2 : 1;
1127 unsigned Reserved_bits_at_1 : 31;
1128} TPMA_MODES; /* Bits */
1129// This is the initializer for a TPMA_MODES structure
1130#define TPMA_MODES_INITIALIZER(fips_140_2, bits_at_1) {fips_140_2, bits_at_1}
1131#else // USE_BIT_FIELD_STRUCTURES
1132// This implements Table 2:38 TPMA_MODES using bit masking
1133typedef UINT32 TPMA_MODES;
Andrey Marochko5847c022019-02-08 13:28:00 -08001134#define TYPE_OF_TPMA_MODES UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08001135#define TPMA_MODES_FIPS_140_2 ((TPMA_MODES)1 << 0)
1136// This is the initializer for a TPMA_MODES bit array.
DavidWooten8ea65f02019-12-14 12:49:50 -05001137#define TPMA_MODES_INITIALIZER(fips_140_2, bits_at_1) \
1138 (TPMA_MODES)( \
1139 (fips_140_2 << 0))
Andrey Marochko394c6172017-11-27 13:49:27 -08001140#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001141
Andrey Marochko5847c022019-02-08 13:28:00 -08001142#define TYPE_OF_TPMA_X509_KEY_USAGE UINT32
1143#define TPMA_X509_KEY_USAGE_TO_UINT32(a) (*((UINT32 *)&(a)))
1144#define UINT32_TO_TPMA_X509_KEY_USAGE(a) (*((TPMA_X509_KEY_USAGE *)&(a)))
1145#define TPMA_X509_KEY_USAGE_TO_BYTE_ARRAY(i, a) \
1146 UINT32_TO_BYTE_ARRAY((TPMA_X509_KEY_USAGE_TO_UINT32(i)), (a))
1147#define BYTE_ARRAY_TO_TPMA_X509_KEY_USAGE(i, a) \
Andrey Marochko083cb5b2019-05-21 15:30:21 -07001148 {UINT32 x = BYTE_ARRAY_TO_UINT32(a); \
1149 i = UINT32_TO_TPMA_X509_KEY_USAGE(x); \
1150 }
Andrey Marochko5847c022019-02-08 13:28:00 -08001151#if USE_BIT_FIELD_STRUCTURES
1152typedef struct TPMA_X509_KEY_USAGE { // Table 2:39
DavidWooten302ed832019-08-30 20:23:42 -04001153 unsigned Reserved_bits_at_0 : 23;
Andrey Marochko5847c022019-02-08 13:28:00 -08001154 unsigned decipherOnly : 1;
DavidWooten302ed832019-08-30 20:23:42 -04001155 unsigned encipherOnly : 1;
DavidWooten8ea65f02019-12-14 12:49:50 -05001156 unsigned cRLSign : 1;
DavidWooten302ed832019-08-30 20:23:42 -04001157 unsigned keyCertSign : 1;
1158 unsigned keyAgreement : 1;
1159 unsigned dataEncipherment : 1;
1160 unsigned keyEncipherment : 1;
1161 unsigned nonrepudiation : 1;
1162 unsigned digitalSignature : 1;
Andrey Marochko5847c022019-02-08 13:28:00 -08001163} TPMA_X509_KEY_USAGE; /* Bits */
1164// This is the initializer for a TPMA_X509_KEY_USAGE structure
1165#define TPMA_X509_KEY_USAGE_INITIALIZER( \
DavidWooten302ed832019-08-30 20:23:42 -04001166 bits_at_0, decipheronly, encipheronly, \
1167 crlsign, keycertsign, keyagreement, \
1168 dataencipherment, keyencipherment, nonrepudiation, \
1169 digitalsignature) \
1170 {bits_at_0, decipheronly, encipheronly, \
1171 crlsign, keycertsign, keyagreement, \
1172 dataencipherment, keyencipherment, nonrepudiation, \
1173 digitalsignature}
Andrey Marochko5847c022019-02-08 13:28:00 -08001174#else // USE_BIT_FIELD_STRUCTURES
1175// This implements Table 2:39 TPMA_X509_KEY_USAGE using bit masking
1176typedef UINT32 TPMA_X509_KEY_USAGE;
1177#define TYPE_OF_TPMA_X509_KEY_USAGE UINT32
DavidWooten302ed832019-08-30 20:23:42 -04001178#define TPMA_X509_KEY_USAGE_decipherOnly ((TPMA_X509_KEY_USAGE)1 << 23)
1179#define TPMA_X509_KEY_USAGE_encipherOnly ((TPMA_X509_KEY_USAGE)1 << 24)
DavidWooten8ea65f02019-12-14 12:49:50 -05001180#define TPMA_X509_KEY_USAGE_cRLSign ((TPMA_X509_KEY_USAGE)1 << 25)
DavidWooten302ed832019-08-30 20:23:42 -04001181#define TPMA_X509_KEY_USAGE_keyCertSign ((TPMA_X509_KEY_USAGE)1 << 26)
1182#define TPMA_X509_KEY_USAGE_keyAgreement ((TPMA_X509_KEY_USAGE)1 << 27)
1183#define TPMA_X509_KEY_USAGE_dataEncipherment ((TPMA_X509_KEY_USAGE)1 << 28)
1184#define TPMA_X509_KEY_USAGE_keyEncipherment ((TPMA_X509_KEY_USAGE)1 << 29)
1185#define TPMA_X509_KEY_USAGE_nonrepudiation ((TPMA_X509_KEY_USAGE)1 << 30)
1186#define TPMA_X509_KEY_USAGE_digitalSignature ((TPMA_X509_KEY_USAGE)1 << 31)
Andrey Marochko5847c022019-02-08 13:28:00 -08001187// This is the initializer for a TPMA_X509_KEY_USAGE bit array.
1188#define TPMA_X509_KEY_USAGE_INITIALIZER( \
DavidWooten302ed832019-08-30 20:23:42 -04001189 bits_at_0, decipheronly, encipheronly, \
1190 crlsign, keycertsign, keyagreement, \
1191 dataencipherment, keyencipherment, nonrepudiation, \
1192 digitalsignature) \
DavidWooten8ea65f02019-12-14 12:49:50 -05001193 (TPMA_X509_KEY_USAGE)( \
Andrey Marochko2f80c1f2019-10-09 16:53:26 -07001194 (decipheronly << 23) + (encipheronly << 24) + \
DavidWooten302ed832019-08-30 20:23:42 -04001195 (crlsign << 25) + (keycertsign << 26) + \
1196 (keyagreement << 27) + (dataencipherment << 28) + \
1197 (keyencipherment << 29) + (nonrepudiation << 30) + \
DavidWooten8ea65f02019-12-14 12:49:50 -05001198 (digitalsignature << 31))
Andrey Marochko5847c022019-02-08 13:28:00 -08001199#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001200
DavidWooten8ea65f02019-12-14 12:49:50 -05001201#define TYPE_OF_TPMA_ACT UINT32
1202#define TPMA_ACT_TO_UINT32(a) (*((UINT32 *)&(a)))
1203#define UINT32_TO_TPMA_ACT(a) (*((TPMA_ACT *)&(a)))
1204#define TPMA_ACT_TO_BYTE_ARRAY(i, a) \
1205 UINT32_TO_BYTE_ARRAY((TPMA_ACT_TO_UINT32(i)), (a))
1206#define BYTE_ARRAY_TO_TPMA_ACT(i, a) \
1207 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPMA_ACT(x); }
1208#if USE_BIT_FIELD_STRUCTURES
1209typedef struct TPMA_ACT { // Table 2:40
1210 unsigned signaled : 1;
1211 unsigned preserveSignaled : 1;
1212 unsigned Reserved_bits_at_2 : 30;
1213} TPMA_ACT; /* Bits */
1214// This is the initializer for a TPMA_ACT structure
1215#define TPMA_ACT_INITIALIZER(signaled, preservesignaled, bits_at_2) \
1216 {signaled, preservesignaled, bits_at_2}
1217#else // USE_BIT_FIELD_STRUCTURES
1218// This implements Table 2:40 TPMA_ACT using bit masking
1219typedef UINT32 TPMA_ACT;
1220#define TYPE_OF_TPMA_ACT UINT32
1221#define TPMA_ACT_signaled ((TPMA_ACT)1 << 0)
1222#define TPMA_ACT_preserveSignaled ((TPMA_ACT)1 << 1)
1223// This is the initializer for a TPMA_ACT bit array.
1224#define TPMA_ACT_INITIALIZER(signaled, preservesignaled, bits_at_2) \
1225 (TPMA_ACT)( \
1226 (signaled << 0) + (preservesignaled << 1))
1227#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001228
DavidWooten8ea65f02019-12-14 12:49:50 -05001229typedef BYTE TPMI_YES_NO; // Table 2:41 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001230
DavidWooten8ea65f02019-12-14 12:49:50 -05001231typedef TPM_HANDLE TPMI_DH_OBJECT; // Table 2:42 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001232
DavidWooten8ea65f02019-12-14 12:49:50 -05001233typedef TPM_HANDLE TPMI_DH_PARENT; // Table 2:43 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001234
DavidWooten8ea65f02019-12-14 12:49:50 -05001235typedef TPM_HANDLE TPMI_DH_PERSISTENT; // Table 2:44 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001236
DavidWooten8ea65f02019-12-14 12:49:50 -05001237typedef TPM_HANDLE TPMI_DH_ENTITY; // Table 2:45 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001238
DavidWooten8ea65f02019-12-14 12:49:50 -05001239typedef TPM_HANDLE TPMI_DH_PCR; // Table 2:46 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001240
DavidWooten8ea65f02019-12-14 12:49:50 -05001241typedef TPM_HANDLE TPMI_SH_AUTH_SESSION; // Table 2:47 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001242
DavidWooten8ea65f02019-12-14 12:49:50 -05001243typedef TPM_HANDLE TPMI_SH_HMAC; // Table 2:48 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001244
DavidWooten8ea65f02019-12-14 12:49:50 -05001245typedef TPM_HANDLE TPMI_SH_POLICY; // Table 2:49 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001246
DavidWooten8ea65f02019-12-14 12:49:50 -05001247typedef TPM_HANDLE TPMI_DH_CONTEXT; // Table 2:50 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001248
DavidWooten8ea65f02019-12-14 12:49:50 -05001249typedef TPM_HANDLE TPMI_DH_SAVED; // Table 2:51 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001250
DavidWooten8ea65f02019-12-14 12:49:50 -05001251typedef TPM_HANDLE TPMI_RH_HIERARCHY; // Table 2:52 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001252
DavidWooten8ea65f02019-12-14 12:49:50 -05001253typedef TPM_HANDLE TPMI_RH_ENABLES; // Table 2:53 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001254
DavidWooten8ea65f02019-12-14 12:49:50 -05001255typedef TPM_HANDLE TPMI_RH_HIERARCHY_AUTH; // Table 2:54 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001256
DavidWooten8ea65f02019-12-14 12:49:50 -05001257typedef TPM_HANDLE TPMI_RH_HIERARCHY_POLICY;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001258
DavidWooten8ea65f02019-12-14 12:49:50 -05001259typedef TPM_HANDLE TPMI_RH_PLATFORM; // Table 2:56 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001260
DavidWooten8ea65f02019-12-14 12:49:50 -05001261typedef TPM_HANDLE TPMI_RH_OWNER; // Table 2:57 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001262
DavidWooten8ea65f02019-12-14 12:49:50 -05001263typedef TPM_HANDLE TPMI_RH_ENDORSEMENT; // Table 2:58 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001264
DavidWooten8ea65f02019-12-14 12:49:50 -05001265typedef TPM_HANDLE TPMI_RH_PROVISION; // Table 2:59 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001266
DavidWooten8ea65f02019-12-14 12:49:50 -05001267typedef TPM_HANDLE TPMI_RH_CLEAR; // Table 2:60 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001268
DavidWooten8ea65f02019-12-14 12:49:50 -05001269typedef TPM_HANDLE TPMI_RH_NV_AUTH; // Table 2:61 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001270
DavidWooten8ea65f02019-12-14 12:49:50 -05001271typedef TPM_HANDLE TPMI_RH_LOCKOUT; // Table 2:62 /* Interface */
Andrey Marochkof666dda2017-06-30 15:30:12 -07001272
DavidWooten8ea65f02019-12-14 12:49:50 -05001273typedef TPM_HANDLE TPMI_RH_NV_INDEX; // Table 2:63 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001274
DavidWooten8ea65f02019-12-14 12:49:50 -05001275typedef TPM_HANDLE TPMI_RH_AC; // Table 2:64 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001276
DavidWooten8ea65f02019-12-14 12:49:50 -05001277typedef TPM_HANDLE TPMI_RH_ACT; // Table 2:65 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001278
DavidWooten8ea65f02019-12-14 12:49:50 -05001279typedef TPM_ALG_ID TPMI_ALG_HASH; // Table 2:66 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001280
DavidWooten8ea65f02019-12-14 12:49:50 -05001281typedef TPM_ALG_ID TPMI_ALG_ASYM; // Table 2:67 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001282
DavidWooten8ea65f02019-12-14 12:49:50 -05001283typedef TPM_ALG_ID TPMI_ALG_SYM; // Table 2:68 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001284
DavidWooten8ea65f02019-12-14 12:49:50 -05001285typedef TPM_ALG_ID TPMI_ALG_SYM_OBJECT; // Table 2:69 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001286
DavidWooten8ea65f02019-12-14 12:49:50 -05001287typedef TPM_ALG_ID TPMI_ALG_SYM_MODE; // Table 2:70 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001288
DavidWooten8ea65f02019-12-14 12:49:50 -05001289typedef TPM_ALG_ID TPMI_ALG_KDF; // Table 2:71 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001290
DavidWooten8ea65f02019-12-14 12:49:50 -05001291typedef TPM_ALG_ID TPMI_ALG_SIG_SCHEME; // Table 2:72 /* Interface */
Andrey Marochkof666dda2017-06-30 15:30:12 -07001292
DavidWooten8ea65f02019-12-14 12:49:50 -05001293typedef TPM_ALG_ID TPMI_ECC_KEY_EXCHANGE; // Table 2:73 /* Interface */
Andrey Marochkod7cc01b2018-08-14 00:44:07 -07001294
DavidWooten8ea65f02019-12-14 12:49:50 -05001295typedef TPM_ST TPMI_ST_COMMAND_TAG; // Table 2:74 /* Interface */
Andrey Marochko5847c022019-02-08 13:28:00 -08001296
DavidWooten8ea65f02019-12-14 12:49:50 -05001297typedef TPM_ALG_ID TPMI_ALG_MAC_SCHEME; // Table 2:75 /* Interface */
1298
1299typedef TPM_ALG_ID TPMI_ALG_CIPHER_MODE; // Table 2:76 /* Interface */
1300
1301typedef BYTE TPMS_EMPTY; // Table 2:77
1302
1303typedef struct { // Table 2:78
Andrey Marochkob8e59922017-06-29 17:13:14 -07001304 TPM_ALG_ID alg;
1305 TPMA_ALGORITHM attributes;
Andrey Marochko394c6172017-11-27 13:49:27 -08001306} TPMS_ALGORITHM_DESCRIPTION; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001307
DavidWooten8ea65f02019-12-14 12:49:50 -05001308typedef union { // Table 2:79
Andrey Marochko5847c022019-02-08 13:28:00 -08001309#if ALG_SHA1
Andrey Marochkob8e59922017-06-29 17:13:14 -07001310 BYTE sha1[SHA1_DIGEST_SIZE];
Andrey Marochko394c6172017-11-27 13:49:27 -08001311#endif // ALG_SHA1
Andrey Marochko5847c022019-02-08 13:28:00 -08001312#if ALG_SHA256
Andrey Marochkob8e59922017-06-29 17:13:14 -07001313 BYTE sha256[SHA256_DIGEST_SIZE];
Andrey Marochko394c6172017-11-27 13:49:27 -08001314#endif // ALG_SHA256
Andrey Marochko5847c022019-02-08 13:28:00 -08001315#if ALG_SHA384
Andrey Marochkob8e59922017-06-29 17:13:14 -07001316 BYTE sha384[SHA384_DIGEST_SIZE];
Andrey Marochko394c6172017-11-27 13:49:27 -08001317#endif // ALG_SHA384
Andrey Marochko5847c022019-02-08 13:28:00 -08001318#if ALG_SHA512
Andrey Marochkob8e59922017-06-29 17:13:14 -07001319 BYTE sha512[SHA512_DIGEST_SIZE];
Andrey Marochko394c6172017-11-27 13:49:27 -08001320#endif // ALG_SHA512
Andrey Marochko5847c022019-02-08 13:28:00 -08001321#if ALG_SM3_256
Andrey Marochkob8e59922017-06-29 17:13:14 -07001322 BYTE sm3_256[SM3_256_DIGEST_SIZE];
Andrey Marochko394c6172017-11-27 13:49:27 -08001323#endif // ALG_SM3_256
Andrey Marochko083cb5b2019-05-21 15:30:21 -07001324#if ALG_SHA3_256
1325 BYTE sha3_256[SHA3_256_DIGEST_SIZE];
1326#endif // ALG_SHA3_256
1327#if ALG_SHA3_384
1328 BYTE sha3_384[SHA3_384_DIGEST_SIZE];
1329#endif // ALG_SHA3_384
1330#if ALG_SHA3_512
1331 BYTE sha3_512[SHA3_512_DIGEST_SIZE];
1332#endif // ALG_SHA3_512
Andrey Marochko394c6172017-11-27 13:49:27 -08001333} TPMU_HA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001334
DavidWooten8ea65f02019-12-14 12:49:50 -05001335typedef struct { // Table 2:80
Andrey Marochkob8e59922017-06-29 17:13:14 -07001336 TPMI_ALG_HASH hashAlg;
1337 TPMU_HA digest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001338} TPMT_HA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001339
DavidWooten8ea65f02019-12-14 12:49:50 -05001340typedef union { // Table 2:81
Andrey Marochkob8e59922017-06-29 17:13:14 -07001341 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001342 UINT16 size;
1343 BYTE buffer[sizeof(TPMU_HA)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001344 } t;
1345 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001346} TPM2B_DIGEST; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001347
DavidWooten8ea65f02019-12-14 12:49:50 -05001348typedef union { // Table 2:82
Andrey Marochkob8e59922017-06-29 17:13:14 -07001349 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001350 UINT16 size;
1351 BYTE buffer[sizeof(TPMT_HA)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001352 } t;
1353 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001354} TPM2B_DATA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001355
DavidWooten8ea65f02019-12-14 12:49:50 -05001356// Table 2:83 - Definition of Types for TPM2B_NONCE
Andrey Marochko394c6172017-11-27 13:49:27 -08001357typedef TPM2B_DIGEST TPM2B_NONCE;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001358
DavidWooten8ea65f02019-12-14 12:49:50 -05001359// Table 2:84 - Definition of Types for TPM2B_AUTH
Andrey Marochko394c6172017-11-27 13:49:27 -08001360typedef TPM2B_DIGEST TPM2B_AUTH;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001361
DavidWooten8ea65f02019-12-14 12:49:50 -05001362// Table 2:85 - Definition of Types for TPM2B_OPERAND
Andrey Marochko394c6172017-11-27 13:49:27 -08001363typedef TPM2B_DIGEST TPM2B_OPERAND;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001364
DavidWooten8ea65f02019-12-14 12:49:50 -05001365typedef union { // Table 2:86
Andrey Marochkob8e59922017-06-29 17:13:14 -07001366 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001367 UINT16 size;
1368 BYTE buffer[1024];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001369 } t;
1370 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001371} TPM2B_EVENT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001372
DavidWooten8ea65f02019-12-14 12:49:50 -05001373typedef union { // Table 2:87
Andrey Marochkob8e59922017-06-29 17:13:14 -07001374 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001375 UINT16 size;
1376 BYTE buffer[MAX_DIGEST_BUFFER];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001377 } t;
1378 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001379} TPM2B_MAX_BUFFER; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001380
DavidWooten8ea65f02019-12-14 12:49:50 -05001381typedef union { // Table 2:88
Andrey Marochkob8e59922017-06-29 17:13:14 -07001382 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001383 UINT16 size;
1384 BYTE buffer[MAX_NV_BUFFER_SIZE];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001385 } t;
1386 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001387} TPM2B_MAX_NV_BUFFER; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001388
DavidWooten8ea65f02019-12-14 12:49:50 -05001389typedef union { // Table 2:89
Andrey Marochkof666dda2017-06-30 15:30:12 -07001390 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001391 UINT16 size;
1392 BYTE buffer[sizeof(UINT64)];
Andrey Marochkof666dda2017-06-30 15:30:12 -07001393 } t;
1394 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001395} TPM2B_TIMEOUT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001396
DavidWooten8ea65f02019-12-14 12:49:50 -05001397typedef union { // Table 2:90
Andrey Marochkob8e59922017-06-29 17:13:14 -07001398 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001399 UINT16 size;
1400 BYTE buffer[MAX_SYM_BLOCK_SIZE];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001401 } t;
1402 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001403} TPM2B_IV; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001404
DavidWooten8ea65f02019-12-14 12:49:50 -05001405typedef union { // Table 2:91
Andrey Marochkob8e59922017-06-29 17:13:14 -07001406 TPMT_HA digest;
1407 TPM_HANDLE handle;
Andrey Marochko394c6172017-11-27 13:49:27 -08001408} TPMU_NAME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001409
DavidWooten8ea65f02019-12-14 12:49:50 -05001410typedef union { // Table 2:92
Andrey Marochkob8e59922017-06-29 17:13:14 -07001411 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001412 UINT16 size;
1413 BYTE name[sizeof(TPMU_NAME)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001414 } t;
1415 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001416} TPM2B_NAME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001417
DavidWooten8ea65f02019-12-14 12:49:50 -05001418typedef struct { // Table 2:93
Andrey Marochkob8e59922017-06-29 17:13:14 -07001419 UINT8 sizeofSelect;
1420 BYTE pcrSelect[PCR_SELECT_MAX];
Andrey Marochko394c6172017-11-27 13:49:27 -08001421} TPMS_PCR_SELECT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001422
DavidWooten8ea65f02019-12-14 12:49:50 -05001423typedef struct { // Table 2:94
Andrey Marochkob8e59922017-06-29 17:13:14 -07001424 TPMI_ALG_HASH hash;
1425 UINT8 sizeofSelect;
1426 BYTE pcrSelect[PCR_SELECT_MAX];
Andrey Marochko394c6172017-11-27 13:49:27 -08001427} TPMS_PCR_SELECTION; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001428
DavidWooten8ea65f02019-12-14 12:49:50 -05001429typedef struct { // Table 2:97
Andrey Marochkob8e59922017-06-29 17:13:14 -07001430 TPM_ST tag;
1431 TPMI_RH_HIERARCHY hierarchy;
1432 TPM2B_DIGEST digest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001433} TPMT_TK_CREATION; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001434
DavidWooten8ea65f02019-12-14 12:49:50 -05001435typedef struct { // Table 2:98
Andrey Marochkob8e59922017-06-29 17:13:14 -07001436 TPM_ST tag;
1437 TPMI_RH_HIERARCHY hierarchy;
1438 TPM2B_DIGEST digest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001439} TPMT_TK_VERIFIED; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001440
DavidWooten8ea65f02019-12-14 12:49:50 -05001441typedef struct { // Table 2:99
Andrey Marochkob8e59922017-06-29 17:13:14 -07001442 TPM_ST tag;
1443 TPMI_RH_HIERARCHY hierarchy;
1444 TPM2B_DIGEST digest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001445} TPMT_TK_AUTH; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001446
DavidWooten8ea65f02019-12-14 12:49:50 -05001447typedef struct { // Table 2:100
Andrey Marochkob8e59922017-06-29 17:13:14 -07001448 TPM_ST tag;
1449 TPMI_RH_HIERARCHY hierarchy;
1450 TPM2B_DIGEST digest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001451} TPMT_TK_HASHCHECK; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001452
DavidWooten8ea65f02019-12-14 12:49:50 -05001453typedef struct { // Table 2:101
Andrey Marochkob8e59922017-06-29 17:13:14 -07001454 TPM_ALG_ID alg;
1455 TPMA_ALGORITHM algProperties;
Andrey Marochko394c6172017-11-27 13:49:27 -08001456} TPMS_ALG_PROPERTY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001457
DavidWooten8ea65f02019-12-14 12:49:50 -05001458typedef struct { // Table 2:102
Andrey Marochkob8e59922017-06-29 17:13:14 -07001459 TPM_PT property;
1460 UINT32 value;
Andrey Marochko394c6172017-11-27 13:49:27 -08001461} TPMS_TAGGED_PROPERTY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001462
DavidWooten8ea65f02019-12-14 12:49:50 -05001463typedef struct { // Table 2:103
Andrey Marochkob8e59922017-06-29 17:13:14 -07001464 TPM_PT_PCR tag;
1465 UINT8 sizeofSelect;
1466 BYTE pcrSelect[PCR_SELECT_MAX];
Andrey Marochko394c6172017-11-27 13:49:27 -08001467} TPMS_TAGGED_PCR_SELECT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001468
DavidWooten8ea65f02019-12-14 12:49:50 -05001469typedef struct { // Table 2:104
Andrey Marochkob8e59922017-06-29 17:13:14 -07001470 TPM_HANDLE handle;
1471 TPMT_HA policyHash;
Andrey Marochko394c6172017-11-27 13:49:27 -08001472} TPMS_TAGGED_POLICY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001473
DavidWooten8ea65f02019-12-14 12:49:50 -05001474typedef struct { // Table 2:105
1475 TPM_HANDLE handle;
1476 UINT32 timeout;
1477 TPMA_ACT attributes;
1478} TPMS_ACT_DATA; /* Structure */
1479
1480typedef struct { // Table 2:106
Andrey Marochkob8e59922017-06-29 17:13:14 -07001481 UINT32 count;
1482 TPM_CC commandCodes[MAX_CAP_CC];
Andrey Marochko394c6172017-11-27 13:49:27 -08001483} TPML_CC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001484
DavidWooten8ea65f02019-12-14 12:49:50 -05001485typedef struct { // Table 2:107
Andrey Marochkob8e59922017-06-29 17:13:14 -07001486 UINT32 count;
1487 TPMA_CC commandAttributes[MAX_CAP_CC];
Andrey Marochko394c6172017-11-27 13:49:27 -08001488} TPML_CCA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001489
DavidWooten8ea65f02019-12-14 12:49:50 -05001490typedef struct { // Table 2:108
Andrey Marochkob8e59922017-06-29 17:13:14 -07001491 UINT32 count;
1492 TPM_ALG_ID algorithms[MAX_ALG_LIST_SIZE];
Andrey Marochko394c6172017-11-27 13:49:27 -08001493} TPML_ALG; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001494
DavidWooten8ea65f02019-12-14 12:49:50 -05001495typedef struct { // Table 2:109
Andrey Marochkob8e59922017-06-29 17:13:14 -07001496 UINT32 count;
1497 TPM_HANDLE handle[MAX_CAP_HANDLES];
Andrey Marochko394c6172017-11-27 13:49:27 -08001498} TPML_HANDLE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001499
DavidWooten8ea65f02019-12-14 12:49:50 -05001500typedef struct { // Table 2:110
Andrey Marochkob8e59922017-06-29 17:13:14 -07001501 UINT32 count;
1502 TPM2B_DIGEST digests[8];
Andrey Marochko394c6172017-11-27 13:49:27 -08001503} TPML_DIGEST; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001504
DavidWooten8ea65f02019-12-14 12:49:50 -05001505typedef struct { // Table 2:111
Andrey Marochkob8e59922017-06-29 17:13:14 -07001506 UINT32 count;
1507 TPMT_HA digests[HASH_COUNT];
Andrey Marochko394c6172017-11-27 13:49:27 -08001508} TPML_DIGEST_VALUES; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001509
DavidWooten8ea65f02019-12-14 12:49:50 -05001510typedef struct { // Table 2:112
Andrey Marochkob8e59922017-06-29 17:13:14 -07001511 UINT32 count;
1512 TPMS_PCR_SELECTION pcrSelections[HASH_COUNT];
Andrey Marochko394c6172017-11-27 13:49:27 -08001513} TPML_PCR_SELECTION; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001514
DavidWooten8ea65f02019-12-14 12:49:50 -05001515typedef struct { // Table 2:113
Andrey Marochkob8e59922017-06-29 17:13:14 -07001516 UINT32 count;
1517 TPMS_ALG_PROPERTY algProperties[MAX_CAP_ALGS];
Andrey Marochko394c6172017-11-27 13:49:27 -08001518} TPML_ALG_PROPERTY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001519
DavidWooten8ea65f02019-12-14 12:49:50 -05001520typedef struct { // Table 2:114
Andrey Marochko394c6172017-11-27 13:49:27 -08001521 UINT32 count;
1522 TPMS_TAGGED_PROPERTY tpmProperty[MAX_TPM_PROPERTIES];
1523} TPML_TAGGED_TPM_PROPERTY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001524
DavidWooten8ea65f02019-12-14 12:49:50 -05001525typedef struct { // Table 2:115
Andrey Marochko394c6172017-11-27 13:49:27 -08001526 UINT32 count;
1527 TPMS_TAGGED_PCR_SELECT pcrProperty[MAX_PCR_PROPERTIES];
1528} TPML_TAGGED_PCR_PROPERTY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001529
DavidWooten8ea65f02019-12-14 12:49:50 -05001530typedef struct { // Table 2:116
Andrey Marochkob8e59922017-06-29 17:13:14 -07001531 UINT32 count;
1532 TPM_ECC_CURVE eccCurves[MAX_ECC_CURVES];
Andrey Marochko394c6172017-11-27 13:49:27 -08001533} TPML_ECC_CURVE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001534
DavidWooten8ea65f02019-12-14 12:49:50 -05001535typedef struct { // Table 2:117
Andrey Marochkob8e59922017-06-29 17:13:14 -07001536 UINT32 count;
1537 TPMS_TAGGED_POLICY policies[MAX_TAGGED_POLICIES];
Andrey Marochko394c6172017-11-27 13:49:27 -08001538} TPML_TAGGED_POLICY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001539
DavidWooten8ea65f02019-12-14 12:49:50 -05001540typedef struct { // Table 2:118
1541 UINT32 count;
1542 TPMS_ACT_DATA actData[MAX_ACT_DATA];
1543} TPML_ACT_DATA; /* Structure */
1544
1545typedef union { // Table 2:119
Andrey Marochko394c6172017-11-27 13:49:27 -08001546 TPML_ALG_PROPERTY algorithms;
1547 TPML_HANDLE handles;
1548 TPML_CCA command;
1549 TPML_CC ppCommands;
1550 TPML_CC auditCommands;
1551 TPML_PCR_SELECTION assignedPCR;
1552 TPML_TAGGED_TPM_PROPERTY tpmProperties;
1553 TPML_TAGGED_PCR_PROPERTY pcrProperties;
Andrey Marochko5847c022019-02-08 13:28:00 -08001554#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08001555 TPML_ECC_CURVE eccCurves;
1556#endif // ALG_ECC
1557 TPML_TAGGED_POLICY authPolicies;
DavidWooten8ea65f02019-12-14 12:49:50 -05001558 TPML_ACT_DATA actData;
Andrey Marochko394c6172017-11-27 13:49:27 -08001559} TPMU_CAPABILITIES; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001560
DavidWooten8ea65f02019-12-14 12:49:50 -05001561typedef struct { // Table 2:120
Andrey Marochkob8e59922017-06-29 17:13:14 -07001562 TPM_CAP capability;
1563 TPMU_CAPABILITIES data;
Andrey Marochko394c6172017-11-27 13:49:27 -08001564} TPMS_CAPABILITY_DATA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001565
DavidWooten8ea65f02019-12-14 12:49:50 -05001566typedef struct { // Table 2:121
Andrey Marochkob8e59922017-06-29 17:13:14 -07001567 UINT64 clock;
1568 UINT32 resetCount;
1569 UINT32 restartCount;
1570 TPMI_YES_NO safe;
Andrey Marochko394c6172017-11-27 13:49:27 -08001571} TPMS_CLOCK_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001572
DavidWooten8ea65f02019-12-14 12:49:50 -05001573typedef struct { // Table 2:122
Andrey Marochkob8e59922017-06-29 17:13:14 -07001574 UINT64 time;
1575 TPMS_CLOCK_INFO clockInfo;
Andrey Marochko394c6172017-11-27 13:49:27 -08001576} TPMS_TIME_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001577
DavidWooten8ea65f02019-12-14 12:49:50 -05001578typedef struct { // Table 2:123
Andrey Marochkob8e59922017-06-29 17:13:14 -07001579 TPMS_TIME_INFO time;
1580 UINT64 firmwareVersion;
Andrey Marochko394c6172017-11-27 13:49:27 -08001581} TPMS_TIME_ATTEST_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001582
DavidWooten8ea65f02019-12-14 12:49:50 -05001583typedef struct { // Table 2:124
Andrey Marochkob8e59922017-06-29 17:13:14 -07001584 TPM2B_NAME name;
1585 TPM2B_NAME qualifiedName;
Andrey Marochko394c6172017-11-27 13:49:27 -08001586} TPMS_CERTIFY_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001587
DavidWooten8ea65f02019-12-14 12:49:50 -05001588typedef struct { // Table 2:125
Andrey Marochkob8e59922017-06-29 17:13:14 -07001589 TPML_PCR_SELECTION pcrSelect;
1590 TPM2B_DIGEST pcrDigest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001591} TPMS_QUOTE_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001592
DavidWooten8ea65f02019-12-14 12:49:50 -05001593typedef struct { // Table 2:126
Andrey Marochkob8e59922017-06-29 17:13:14 -07001594 UINT64 auditCounter;
1595 TPM_ALG_ID digestAlg;
1596 TPM2B_DIGEST auditDigest;
1597 TPM2B_DIGEST commandDigest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001598} TPMS_COMMAND_AUDIT_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001599
DavidWooten8ea65f02019-12-14 12:49:50 -05001600typedef struct { // Table 2:127
Andrey Marochkob8e59922017-06-29 17:13:14 -07001601 TPMI_YES_NO exclusiveSession;
1602 TPM2B_DIGEST sessionDigest;
Andrey Marochko394c6172017-11-27 13:49:27 -08001603} TPMS_SESSION_AUDIT_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001604
DavidWooten8ea65f02019-12-14 12:49:50 -05001605typedef struct { // Table 2:128
Andrey Marochkob8e59922017-06-29 17:13:14 -07001606 TPM2B_NAME objectName;
1607 TPM2B_DIGEST creationHash;
Andrey Marochko394c6172017-11-27 13:49:27 -08001608} TPMS_CREATION_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001609
DavidWooten8ea65f02019-12-14 12:49:50 -05001610typedef struct { // Table 2:129
Andrey Marochko394c6172017-11-27 13:49:27 -08001611 TPM2B_NAME indexName;
1612 UINT16 offset;
1613 TPM2B_MAX_NV_BUFFER nvContents;
1614} TPMS_NV_CERTIFY_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001615
DavidWooten8ea65f02019-12-14 12:49:50 -05001616typedef struct { // Table 2:130
Andrey Marochko5847c022019-02-08 13:28:00 -08001617 TPM2B_NAME indexName;
1618 TPM2B_DIGEST nvDigest;
1619} TPMS_NV_DIGEST_CERTIFY_INFO; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001620
DavidWooten8ea65f02019-12-14 12:49:50 -05001621typedef TPM_ST TPMI_ST_ATTEST; // Table 2:131 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001622
DavidWooten8ea65f02019-12-14 12:49:50 -05001623typedef union { // Table 2:132
Andrey Marochko5847c022019-02-08 13:28:00 -08001624 TPMS_CERTIFY_INFO certify;
1625 TPMS_CREATION_INFO creation;
1626 TPMS_QUOTE_INFO quote;
1627 TPMS_COMMAND_AUDIT_INFO commandAudit;
1628 TPMS_SESSION_AUDIT_INFO sessionAudit;
1629 TPMS_TIME_ATTEST_INFO time;
1630 TPMS_NV_CERTIFY_INFO nv;
1631 TPMS_NV_DIGEST_CERTIFY_INFO nvDigest;
1632} TPMU_ATTEST; /* Structure */
1633
DavidWooten8ea65f02019-12-14 12:49:50 -05001634typedef struct { // Table 2:133
DavidWooten9dba2812020-03-10 15:25:34 -04001635 TPM_CONSTANTS32 magic;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001636 TPMI_ST_ATTEST type;
1637 TPM2B_NAME qualifiedSigner;
1638 TPM2B_DATA extraData;
1639 TPMS_CLOCK_INFO clockInfo;
1640 UINT64 firmwareVersion;
1641 TPMU_ATTEST attested;
Andrey Marochko394c6172017-11-27 13:49:27 -08001642} TPMS_ATTEST; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001643
DavidWooten8ea65f02019-12-14 12:49:50 -05001644typedef union { // Table 2:134
Andrey Marochkob8e59922017-06-29 17:13:14 -07001645 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001646 UINT16 size;
1647 BYTE attestationData[sizeof(TPMS_ATTEST)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001648 } t;
1649 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001650} TPM2B_ATTEST; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001651
DavidWooten8ea65f02019-12-14 12:49:50 -05001652typedef struct { // Table 2:135
Andrey Marochko394c6172017-11-27 13:49:27 -08001653 TPMI_SH_AUTH_SESSION sessionHandle;
1654 TPM2B_NONCE nonce;
1655 TPMA_SESSION sessionAttributes;
1656 TPM2B_AUTH hmac;
1657} TPMS_AUTH_COMMAND; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001658
DavidWooten8ea65f02019-12-14 12:49:50 -05001659typedef struct { // Table 2:136
Andrey Marochkob8e59922017-06-29 17:13:14 -07001660 TPM2B_NONCE nonce;
1661 TPMA_SESSION sessionAttributes;
1662 TPM2B_AUTH hmac;
Andrey Marochko394c6172017-11-27 13:49:27 -08001663} TPMS_AUTH_RESPONSE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001664
DavidWooten8ea65f02019-12-14 12:49:50 -05001665typedef TPM_KEY_BITS TPMI_TDES_KEY_BITS; // Table 2:137 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001666
DavidWooten8ea65f02019-12-14 12:49:50 -05001667typedef TPM_KEY_BITS TPMI_AES_KEY_BITS; // Table 2:137 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001668
DavidWooten8ea65f02019-12-14 12:49:50 -05001669typedef TPM_KEY_BITS TPMI_SM4_KEY_BITS; // Table 2:137 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001670
DavidWooten8ea65f02019-12-14 12:49:50 -05001671typedef TPM_KEY_BITS TPMI_CAMELLIA_KEY_BITS; // Table 2:137 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001672
DavidWooten8ea65f02019-12-14 12:49:50 -05001673typedef union { // Table 2:138
Andrey Marochko5847c022019-02-08 13:28:00 -08001674#if ALG_TDES
Andrey Marochko394c6172017-11-27 13:49:27 -08001675 TPMI_TDES_KEY_BITS tdes;
1676#endif // ALG_TDES
Andrey Marochko5847c022019-02-08 13:28:00 -08001677#if ALG_AES
Andrey Marochko394c6172017-11-27 13:49:27 -08001678 TPMI_AES_KEY_BITS aes;
1679#endif // ALG_AES
Andrey Marochko5847c022019-02-08 13:28:00 -08001680#if ALG_SM4
Andrey Marochko394c6172017-11-27 13:49:27 -08001681 TPMI_SM4_KEY_BITS sm4;
1682#endif // ALG_SM4
Andrey Marochko5847c022019-02-08 13:28:00 -08001683#if ALG_CAMELLIA
Andrey Marochko394c6172017-11-27 13:49:27 -08001684 TPMI_CAMELLIA_KEY_BITS camellia;
1685#endif // ALG_CAMELLIA
1686 TPM_KEY_BITS sym;
Andrey Marochko5847c022019-02-08 13:28:00 -08001687#if ALG_XOR
Andrey Marochko394c6172017-11-27 13:49:27 -08001688 TPMI_ALG_HASH xor;
1689#endif // ALG_XOR
1690} TPMU_SYM_KEY_BITS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001691
DavidWooten8ea65f02019-12-14 12:49:50 -05001692typedef union { // Table 2:139
Andrey Marochko5847c022019-02-08 13:28:00 -08001693#if ALG_TDES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001694 TPMI_ALG_SYM_MODE tdes;
Andrey Marochko394c6172017-11-27 13:49:27 -08001695#endif // ALG_TDES
Andrey Marochko5847c022019-02-08 13:28:00 -08001696#if ALG_AES
Andrey Marochkob8e59922017-06-29 17:13:14 -07001697 TPMI_ALG_SYM_MODE aes;
Andrey Marochko394c6172017-11-27 13:49:27 -08001698#endif // ALG_AES
Andrey Marochko5847c022019-02-08 13:28:00 -08001699#if ALG_SM4
Andrey Marochkob8e59922017-06-29 17:13:14 -07001700 TPMI_ALG_SYM_MODE sm4;
Andrey Marochko394c6172017-11-27 13:49:27 -08001701#endif // ALG_SM4
Andrey Marochko5847c022019-02-08 13:28:00 -08001702#if ALG_CAMELLIA
Andrey Marochkob8e59922017-06-29 17:13:14 -07001703 TPMI_ALG_SYM_MODE camellia;
Andrey Marochko394c6172017-11-27 13:49:27 -08001704#endif // ALG_CAMELLIA
Andrey Marochkob8e59922017-06-29 17:13:14 -07001705 TPMI_ALG_SYM_MODE sym;
Andrey Marochko394c6172017-11-27 13:49:27 -08001706} TPMU_SYM_MODE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001707
DavidWooten8ea65f02019-12-14 12:49:50 -05001708typedef struct { // Table 2:141
Andrey Marochkob8e59922017-06-29 17:13:14 -07001709 TPMI_ALG_SYM algorithm;
1710 TPMU_SYM_KEY_BITS keyBits;
1711 TPMU_SYM_MODE mode;
Andrey Marochko394c6172017-11-27 13:49:27 -08001712} TPMT_SYM_DEF; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001713
DavidWooten8ea65f02019-12-14 12:49:50 -05001714typedef struct { // Table 2:142
Andrey Marochko394c6172017-11-27 13:49:27 -08001715 TPMI_ALG_SYM_OBJECT algorithm;
1716 TPMU_SYM_KEY_BITS keyBits;
1717 TPMU_SYM_MODE mode;
1718} TPMT_SYM_DEF_OBJECT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001719
DavidWooten8ea65f02019-12-14 12:49:50 -05001720typedef union { // Table 2:143
Andrey Marochkob8e59922017-06-29 17:13:14 -07001721 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001722 UINT16 size;
1723 BYTE buffer[MAX_SYM_KEY_BYTES];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001724 } t;
1725 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001726} TPM2B_SYM_KEY; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001727
DavidWooten8ea65f02019-12-14 12:49:50 -05001728typedef struct { // Table 2:144
Andrey Marochko394c6172017-11-27 13:49:27 -08001729 TPMT_SYM_DEF_OBJECT sym;
1730} TPMS_SYMCIPHER_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001731
DavidWooten8ea65f02019-12-14 12:49:50 -05001732typedef union { // Table 2:145
Andrey Marochkob8e59922017-06-29 17:13:14 -07001733 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001734 UINT16 size;
1735 BYTE buffer[LABEL_MAX_BUFFER];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001736 } t;
1737 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001738} TPM2B_LABEL; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001739
DavidWooten8ea65f02019-12-14 12:49:50 -05001740typedef struct { // Table 2:146
Andrey Marochkob8e59922017-06-29 17:13:14 -07001741 TPM2B_LABEL label;
1742 TPM2B_LABEL context;
Andrey Marochko394c6172017-11-27 13:49:27 -08001743} TPMS_DERIVE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001744
DavidWooten8ea65f02019-12-14 12:49:50 -05001745typedef union { // Table 2:147
Andrey Marochkob8e59922017-06-29 17:13:14 -07001746 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001747 UINT16 size;
1748 BYTE buffer[sizeof(TPMS_DERIVE)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001749 } t;
1750 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001751} TPM2B_DERIVE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001752
DavidWooten8ea65f02019-12-14 12:49:50 -05001753typedef union { // Table 2:148
Andrey Marochkob8e59922017-06-29 17:13:14 -07001754 BYTE create[MAX_SYM_DATA];
1755 TPMS_DERIVE derive;
Andrey Marochko394c6172017-11-27 13:49:27 -08001756} TPMU_SENSITIVE_CREATE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001757
DavidWooten8ea65f02019-12-14 12:49:50 -05001758typedef union { // Table 2:149
Andrey Marochkob8e59922017-06-29 17:13:14 -07001759 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001760 UINT16 size;
1761 BYTE buffer[sizeof(TPMU_SENSITIVE_CREATE)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001762 } t;
1763 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001764} TPM2B_SENSITIVE_DATA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001765
DavidWooten8ea65f02019-12-14 12:49:50 -05001766typedef struct { // Table 2:150
Andrey Marochko394c6172017-11-27 13:49:27 -08001767 TPM2B_AUTH userAuth;
1768 TPM2B_SENSITIVE_DATA data;
1769} TPMS_SENSITIVE_CREATE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001770
DavidWooten8ea65f02019-12-14 12:49:50 -05001771typedef struct { // Table 2:151
Andrey Marochko394c6172017-11-27 13:49:27 -08001772 UINT16 size;
1773 TPMS_SENSITIVE_CREATE sensitive;
1774} TPM2B_SENSITIVE_CREATE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001775
DavidWooten8ea65f02019-12-14 12:49:50 -05001776typedef struct { // Table 2:152
Andrey Marochkob8e59922017-06-29 17:13:14 -07001777 TPMI_ALG_HASH hashAlg;
Andrey Marochko394c6172017-11-27 13:49:27 -08001778} TPMS_SCHEME_HASH; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001779
DavidWooten8ea65f02019-12-14 12:49:50 -05001780typedef struct { // Table 2:153
Andrey Marochkob8e59922017-06-29 17:13:14 -07001781 TPMI_ALG_HASH hashAlg;
1782 UINT16 count;
Andrey Marochko394c6172017-11-27 13:49:27 -08001783} TPMS_SCHEME_ECDAA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001784
Andrey Marochko394c6172017-11-27 13:49:27 -08001785typedef TPM_ALG_ID TPMI_ALG_KEYEDHASH_SCHEME;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001786
DavidWooten8ea65f02019-12-14 12:49:50 -05001787// Table 2:155 - Definition of Types for HMAC_SIG_SCHEME
Andrey Marochko394c6172017-11-27 13:49:27 -08001788typedef TPMS_SCHEME_HASH TPMS_SCHEME_HMAC;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001789
DavidWooten8ea65f02019-12-14 12:49:50 -05001790typedef struct { // Table 2:156
Andrey Marochkob8e59922017-06-29 17:13:14 -07001791 TPMI_ALG_HASH hashAlg;
1792 TPMI_ALG_KDF kdf;
Andrey Marochko394c6172017-11-27 13:49:27 -08001793} TPMS_SCHEME_XOR; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001794
DavidWooten8ea65f02019-12-14 12:49:50 -05001795typedef union { // Table 2:157
Andrey Marochko5847c022019-02-08 13:28:00 -08001796#if ALG_HMAC
Andrey Marochkob8e59922017-06-29 17:13:14 -07001797 TPMS_SCHEME_HMAC hmac;
Andrey Marochko394c6172017-11-27 13:49:27 -08001798#endif // ALG_HMAC
Andrey Marochko5847c022019-02-08 13:28:00 -08001799#if ALG_XOR
Andrey Marochkob8e59922017-06-29 17:13:14 -07001800 TPMS_SCHEME_XOR xor;
Andrey Marochko394c6172017-11-27 13:49:27 -08001801#endif // ALG_XOR
1802} TPMU_SCHEME_KEYEDHASH; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001803
DavidWooten8ea65f02019-12-14 12:49:50 -05001804typedef struct { // Table 2:158
Andrey Marochko394c6172017-11-27 13:49:27 -08001805 TPMI_ALG_KEYEDHASH_SCHEME scheme;
1806 TPMU_SCHEME_KEYEDHASH details;
1807} TPMT_KEYEDHASH_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001808
DavidWooten8ea65f02019-12-14 12:49:50 -05001809// Table 2:159 - Definition of Types for RSA Signature Schemes
Andrey Marochko394c6172017-11-27 13:49:27 -08001810typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSASSA;
1811typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSAPSS;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001812
DavidWooten8ea65f02019-12-14 12:49:50 -05001813// Table 2:160 - Definition of Types for ECC Signature Schemes
Andrey Marochko394c6172017-11-27 13:49:27 -08001814typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECDSA;
1815typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_SM2;
1816typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECSCHNORR;
1817typedef TPMS_SCHEME_ECDAA TPMS_SIG_SCHEME_ECDAA;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001818
DavidWooten8ea65f02019-12-14 12:49:50 -05001819typedef union { // Table 2:161
Andrey Marochko5847c022019-02-08 13:28:00 -08001820#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08001821 TPMS_SIG_SCHEME_ECDAA ecdaa;
1822#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08001823#if ALG_RSASSA
Andrey Marochko394c6172017-11-27 13:49:27 -08001824 TPMS_SIG_SCHEME_RSASSA rsassa;
1825#endif // ALG_RSASSA
Andrey Marochko5847c022019-02-08 13:28:00 -08001826#if ALG_RSAPSS
Andrey Marochko394c6172017-11-27 13:49:27 -08001827 TPMS_SIG_SCHEME_RSAPSS rsapss;
1828#endif // ALG_RSAPSS
Andrey Marochko5847c022019-02-08 13:28:00 -08001829#if ALG_ECDSA
Andrey Marochko394c6172017-11-27 13:49:27 -08001830 TPMS_SIG_SCHEME_ECDSA ecdsa;
1831#endif // ALG_ECDSA
Andrey Marochko5847c022019-02-08 13:28:00 -08001832#if ALG_SM2
Andrey Marochko394c6172017-11-27 13:49:27 -08001833 TPMS_SIG_SCHEME_SM2 sm2;
1834#endif // ALG_SM2
Andrey Marochko5847c022019-02-08 13:28:00 -08001835#if ALG_ECSCHNORR
Andrey Marochko394c6172017-11-27 13:49:27 -08001836 TPMS_SIG_SCHEME_ECSCHNORR ecschnorr;
1837#endif // ALG_ECSCHNORR
Andrey Marochko5847c022019-02-08 13:28:00 -08001838#if ALG_HMAC
Andrey Marochko394c6172017-11-27 13:49:27 -08001839 TPMS_SCHEME_HMAC hmac;
1840#endif // ALG_HMAC
1841 TPMS_SCHEME_HASH any;
1842} TPMU_SIG_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001843
DavidWooten8ea65f02019-12-14 12:49:50 -05001844typedef struct { // Table 2:162
Andrey Marochko394c6172017-11-27 13:49:27 -08001845 TPMI_ALG_SIG_SCHEME scheme;
1846 TPMU_SIG_SCHEME details;
1847} TPMT_SIG_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001848
DavidWooten8ea65f02019-12-14 12:49:50 -05001849// Table 2:163 - Definition of Types for Encryption Schemes
Andrey Marochko394c6172017-11-27 13:49:27 -08001850typedef TPMS_SCHEME_HASH TPMS_ENC_SCHEME_OAEP;
1851typedef TPMS_EMPTY TPMS_ENC_SCHEME_RSAES;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001852
DavidWooten8ea65f02019-12-14 12:49:50 -05001853// Table 2:164 - Definition of Types for ECC Key Exchange
Andrey Marochko394c6172017-11-27 13:49:27 -08001854typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECDH;
1855typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECMQV;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001856
DavidWooten8ea65f02019-12-14 12:49:50 -05001857// Table 2:165 - Definition of Types for KDF Schemes
DavidWooten9dba2812020-03-10 15:25:34 -04001858typedef TPMS_SCHEME_HASH TPMS_KDF_SCHEME_MGF1;
1859typedef TPMS_SCHEME_HASH TPMS_KDF_SCHEME_KDF1_SP800_56A;
1860typedef TPMS_SCHEME_HASH TPMS_KDF_SCHEME_KDF2;
1861typedef TPMS_SCHEME_HASH TPMS_KDF_SCHEME_KDF1_SP800_108;
Andrey Marochkob8e59922017-06-29 17:13:14 -07001862
DavidWooten9dba2812020-03-10 15:25:34 -04001863typedef union { // Table 2:166
Andrey Marochko5847c022019-02-08 13:28:00 -08001864#if ALG_MGF1
DavidWooten9dba2812020-03-10 15:25:34 -04001865 TPMS_KDF_SCHEME_MGF1 mgf1;
Andrey Marochko394c6172017-11-27 13:49:27 -08001866#endif // ALG_MGF1
Andrey Marochko5847c022019-02-08 13:28:00 -08001867#if ALG_KDF1_SP800_56A
DavidWooten9dba2812020-03-10 15:25:34 -04001868 TPMS_KDF_SCHEME_KDF1_SP800_56A kdf1_sp800_56a;
Andrey Marochko394c6172017-11-27 13:49:27 -08001869#endif // ALG_KDF1_SP800_56A
Andrey Marochko5847c022019-02-08 13:28:00 -08001870#if ALG_KDF2
DavidWooten9dba2812020-03-10 15:25:34 -04001871 TPMS_KDF_SCHEME_KDF2 kdf2;
Andrey Marochko394c6172017-11-27 13:49:27 -08001872#endif // ALG_KDF2
Andrey Marochko5847c022019-02-08 13:28:00 -08001873#if ALG_KDF1_SP800_108
DavidWooten9dba2812020-03-10 15:25:34 -04001874 TPMS_KDF_SCHEME_KDF1_SP800_108 kdf1_sp800_108;
Andrey Marochko394c6172017-11-27 13:49:27 -08001875#endif // ALG_KDF1_SP800_108
DavidWooten9dba2812020-03-10 15:25:34 -04001876 TPMS_SCHEME_HASH anyKdf;
1877} TPMU_KDF_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001878
DavidWooten8ea65f02019-12-14 12:49:50 -05001879typedef struct { // Table 2:167
Andrey Marochkob8e59922017-06-29 17:13:14 -07001880 TPMI_ALG_KDF scheme;
1881 TPMU_KDF_SCHEME details;
Andrey Marochko394c6172017-11-27 13:49:27 -08001882} TPMT_KDF_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001883
DavidWooten8ea65f02019-12-14 12:49:50 -05001884typedef TPM_ALG_ID TPMI_ALG_ASYM_SCHEME; // Table 2:168 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001885
DavidWooten8ea65f02019-12-14 12:49:50 -05001886typedef union { // Table 2:169
Andrey Marochko5847c022019-02-08 13:28:00 -08001887#if ALG_ECDH
Andrey Marochko394c6172017-11-27 13:49:27 -08001888 TPMS_KEY_SCHEME_ECDH ecdh;
1889#endif // ALG_ECDH
Andrey Marochko5847c022019-02-08 13:28:00 -08001890#if ALG_ECMQV
Andrey Marochko394c6172017-11-27 13:49:27 -08001891 TPMS_KEY_SCHEME_ECMQV ecmqv;
1892#endif // ALG_ECMQV
Andrey Marochko5847c022019-02-08 13:28:00 -08001893#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08001894 TPMS_SIG_SCHEME_ECDAA ecdaa;
1895#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08001896#if ALG_RSASSA
Andrey Marochko394c6172017-11-27 13:49:27 -08001897 TPMS_SIG_SCHEME_RSASSA rsassa;
1898#endif // ALG_RSASSA
Andrey Marochko5847c022019-02-08 13:28:00 -08001899#if ALG_RSAPSS
Andrey Marochko394c6172017-11-27 13:49:27 -08001900 TPMS_SIG_SCHEME_RSAPSS rsapss;
1901#endif // ALG_RSAPSS
Andrey Marochko5847c022019-02-08 13:28:00 -08001902#if ALG_ECDSA
Andrey Marochko394c6172017-11-27 13:49:27 -08001903 TPMS_SIG_SCHEME_ECDSA ecdsa;
1904#endif // ALG_ECDSA
Andrey Marochko5847c022019-02-08 13:28:00 -08001905#if ALG_SM2
Andrey Marochko394c6172017-11-27 13:49:27 -08001906 TPMS_SIG_SCHEME_SM2 sm2;
1907#endif // ALG_SM2
Andrey Marochko5847c022019-02-08 13:28:00 -08001908#if ALG_ECSCHNORR
Andrey Marochko394c6172017-11-27 13:49:27 -08001909 TPMS_SIG_SCHEME_ECSCHNORR ecschnorr;
1910#endif // ALG_ECSCHNORR
Andrey Marochko5847c022019-02-08 13:28:00 -08001911#if ALG_RSAES
Andrey Marochko394c6172017-11-27 13:49:27 -08001912 TPMS_ENC_SCHEME_RSAES rsaes;
1913#endif // ALG_RSAES
Andrey Marochko5847c022019-02-08 13:28:00 -08001914#if ALG_OAEP
Andrey Marochko394c6172017-11-27 13:49:27 -08001915 TPMS_ENC_SCHEME_OAEP oaep;
1916#endif // ALG_OAEP
1917 TPMS_SCHEME_HASH anySig;
1918} TPMU_ASYM_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001919
DavidWooten8ea65f02019-12-14 12:49:50 -05001920typedef struct { // Table 2:170
Andrey Marochko394c6172017-11-27 13:49:27 -08001921 TPMI_ALG_ASYM_SCHEME scheme;
1922 TPMU_ASYM_SCHEME details;
1923} TPMT_ASYM_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001924
DavidWooten8ea65f02019-12-14 12:49:50 -05001925typedef TPM_ALG_ID TPMI_ALG_RSA_SCHEME; // Table 2:171 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001926
DavidWooten8ea65f02019-12-14 12:49:50 -05001927typedef struct { // Table 2:172
Andrey Marochko394c6172017-11-27 13:49:27 -08001928 TPMI_ALG_RSA_SCHEME scheme;
1929 TPMU_ASYM_SCHEME details;
1930} TPMT_RSA_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001931
DavidWooten8ea65f02019-12-14 12:49:50 -05001932typedef TPM_ALG_ID TPMI_ALG_RSA_DECRYPT; // Table 2:173 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001933
DavidWooten8ea65f02019-12-14 12:49:50 -05001934typedef struct { // Table 2:174
Andrey Marochko394c6172017-11-27 13:49:27 -08001935 TPMI_ALG_RSA_DECRYPT scheme;
1936 TPMU_ASYM_SCHEME details;
1937} TPMT_RSA_DECRYPT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001938
DavidWooten8ea65f02019-12-14 12:49:50 -05001939typedef union { // Table 2:175
Andrey Marochkob8e59922017-06-29 17:13:14 -07001940 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001941 UINT16 size;
1942 BYTE buffer[MAX_RSA_KEY_BYTES];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001943 } t;
1944 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001945} TPM2B_PUBLIC_KEY_RSA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001946
DavidWooten8ea65f02019-12-14 12:49:50 -05001947typedef TPM_KEY_BITS TPMI_RSA_KEY_BITS; // Table 2:176 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001948
DavidWooten8ea65f02019-12-14 12:49:50 -05001949typedef union { // Table 2:177
Andrey Marochkob8e59922017-06-29 17:13:14 -07001950 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001951 UINT16 size;
Andrey Marochko5847c022019-02-08 13:28:00 -08001952 BYTE buffer[RSA_PRIVATE_SIZE];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001953 } t;
1954 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001955} TPM2B_PRIVATE_KEY_RSA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001956
DavidWooten8ea65f02019-12-14 12:49:50 -05001957typedef union { // Table 2:178
Andrey Marochkob8e59922017-06-29 17:13:14 -07001958 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08001959 UINT16 size;
1960 BYTE buffer[MAX_ECC_KEY_BYTES];
Andrey Marochkob8e59922017-06-29 17:13:14 -07001961 } t;
1962 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08001963} TPM2B_ECC_PARAMETER; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001964
DavidWooten8ea65f02019-12-14 12:49:50 -05001965typedef struct { // Table 2:179
Andrey Marochko394c6172017-11-27 13:49:27 -08001966 TPM2B_ECC_PARAMETER x;
1967 TPM2B_ECC_PARAMETER y;
1968} TPMS_ECC_POINT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001969
DavidWooten8ea65f02019-12-14 12:49:50 -05001970typedef struct { // Table 2:180
Andrey Marochkob8e59922017-06-29 17:13:14 -07001971 UINT16 size;
1972 TPMS_ECC_POINT point;
Andrey Marochko394c6172017-11-27 13:49:27 -08001973} TPM2B_ECC_POINT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001974
DavidWooten8ea65f02019-12-14 12:49:50 -05001975typedef TPM_ALG_ID TPMI_ALG_ECC_SCHEME; // Table 2:181 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001976
DavidWooten8ea65f02019-12-14 12:49:50 -05001977typedef TPM_ECC_CURVE TPMI_ECC_CURVE; // Table 2:182 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001978
DavidWooten8ea65f02019-12-14 12:49:50 -05001979typedef struct { // Table 2:183
Andrey Marochko394c6172017-11-27 13:49:27 -08001980 TPMI_ALG_ECC_SCHEME scheme;
1981 TPMU_ASYM_SCHEME details;
1982} TPMT_ECC_SCHEME; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001983
DavidWooten8ea65f02019-12-14 12:49:50 -05001984typedef struct { // Table 2:184
Andrey Marochko394c6172017-11-27 13:49:27 -08001985 TPM_ECC_CURVE curveID;
1986 UINT16 keySize;
1987 TPMT_KDF_SCHEME kdf;
1988 TPMT_ECC_SCHEME sign;
1989 TPM2B_ECC_PARAMETER p;
1990 TPM2B_ECC_PARAMETER a;
1991 TPM2B_ECC_PARAMETER b;
1992 TPM2B_ECC_PARAMETER gX;
1993 TPM2B_ECC_PARAMETER gY;
1994 TPM2B_ECC_PARAMETER n;
1995 TPM2B_ECC_PARAMETER h;
1996} TPMS_ALGORITHM_DETAIL_ECC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07001997
DavidWooten8ea65f02019-12-14 12:49:50 -05001998typedef struct { // Table 2:185
Andrey Marochko394c6172017-11-27 13:49:27 -08001999 TPMI_ALG_HASH hash;
2000 TPM2B_PUBLIC_KEY_RSA sig;
2001} TPMS_SIGNATURE_RSA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002002
DavidWooten8ea65f02019-12-14 12:49:50 -05002003// Table 2:186 - Definition of Types for Signature
Andrey Marochko394c6172017-11-27 13:49:27 -08002004typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSASSA;
2005typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSAPSS;
Andrey Marochkob8e59922017-06-29 17:13:14 -07002006
DavidWooten8ea65f02019-12-14 12:49:50 -05002007typedef struct { // Table 2:187
Andrey Marochko394c6172017-11-27 13:49:27 -08002008 TPMI_ALG_HASH hash;
2009 TPM2B_ECC_PARAMETER signatureR;
2010 TPM2B_ECC_PARAMETER signatureS;
2011} TPMS_SIGNATURE_ECC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002012
DavidWooten8ea65f02019-12-14 12:49:50 -05002013// Table 2:188 - Definition of Types for TPMS_SIGNATURE_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002014typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDAA;
2015typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDSA;
2016typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_SM2;
2017typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECSCHNORR;
Andrey Marochkob8e59922017-06-29 17:13:14 -07002018
DavidWooten8ea65f02019-12-14 12:49:50 -05002019typedef union { // Table 2:189
Andrey Marochko5847c022019-02-08 13:28:00 -08002020#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002021 TPMS_SIGNATURE_ECDAA ecdaa;
2022#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08002023#if ALG_RSA
Andrey Marochko394c6172017-11-27 13:49:27 -08002024 TPMS_SIGNATURE_RSASSA rsassa;
2025#endif // ALG_RSA
Andrey Marochko5847c022019-02-08 13:28:00 -08002026#if ALG_RSA
Andrey Marochko394c6172017-11-27 13:49:27 -08002027 TPMS_SIGNATURE_RSAPSS rsapss;
2028#endif // ALG_RSA
Andrey Marochko5847c022019-02-08 13:28:00 -08002029#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002030 TPMS_SIGNATURE_ECDSA ecdsa;
2031#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08002032#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002033 TPMS_SIGNATURE_SM2 sm2;
2034#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08002035#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002036 TPMS_SIGNATURE_ECSCHNORR ecschnorr;
2037#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08002038#if ALG_HMAC
Andrey Marochko394c6172017-11-27 13:49:27 -08002039 TPMT_HA hmac;
2040#endif // ALG_HMAC
2041 TPMS_SCHEME_HASH any;
2042} TPMU_SIGNATURE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002043
DavidWooten8ea65f02019-12-14 12:49:50 -05002044typedef struct { // Table 2:190
Andrey Marochko394c6172017-11-27 13:49:27 -08002045 TPMI_ALG_SIG_SCHEME sigAlg;
2046 TPMU_SIGNATURE signature;
2047} TPMT_SIGNATURE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002048
DavidWooten8ea65f02019-12-14 12:49:50 -05002049typedef union { // Table 2:191
Andrey Marochko5847c022019-02-08 13:28:00 -08002050#if ALG_ECC
Andrey Marochkob8e59922017-06-29 17:13:14 -07002051 BYTE ecc[sizeof(TPMS_ECC_POINT)];
Andrey Marochko394c6172017-11-27 13:49:27 -08002052#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08002053#if ALG_RSA
Andrey Marochkob8e59922017-06-29 17:13:14 -07002054 BYTE rsa[MAX_RSA_KEY_BYTES];
Andrey Marochko394c6172017-11-27 13:49:27 -08002055#endif // ALG_RSA
Andrey Marochko5847c022019-02-08 13:28:00 -08002056#if ALG_SYMCIPHER
Andrey Marochkob8e59922017-06-29 17:13:14 -07002057 BYTE symmetric[sizeof(TPM2B_DIGEST)];
Andrey Marochko394c6172017-11-27 13:49:27 -08002058#endif // ALG_SYMCIPHER
Andrey Marochko5847c022019-02-08 13:28:00 -08002059#if ALG_KEYEDHASH
Andrey Marochkob8e59922017-06-29 17:13:14 -07002060 BYTE keyedHash[sizeof(TPM2B_DIGEST)];
Andrey Marochko394c6172017-11-27 13:49:27 -08002061#endif // ALG_KEYEDHASH
2062} TPMU_ENCRYPTED_SECRET; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002063
DavidWooten8ea65f02019-12-14 12:49:50 -05002064typedef union { // Table 2:192
Andrey Marochkob8e59922017-06-29 17:13:14 -07002065 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002066 UINT16 size;
2067 BYTE secret[sizeof(TPMU_ENCRYPTED_SECRET)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002068 } t;
2069 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002070} TPM2B_ENCRYPTED_SECRET; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002071
DavidWooten8ea65f02019-12-14 12:49:50 -05002072typedef TPM_ALG_ID TPMI_ALG_PUBLIC; // Table 2:193 /* Interface */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002073
DavidWooten8ea65f02019-12-14 12:49:50 -05002074typedef union { // Table 2:194
Andrey Marochko5847c022019-02-08 13:28:00 -08002075#if ALG_KEYEDHASH
Andrey Marochko394c6172017-11-27 13:49:27 -08002076 TPM2B_DIGEST keyedHash;
2077#endif // ALG_KEYEDHASH
Andrey Marochko5847c022019-02-08 13:28:00 -08002078#if ALG_SYMCIPHER
Andrey Marochko394c6172017-11-27 13:49:27 -08002079 TPM2B_DIGEST sym;
2080#endif // ALG_SYMCIPHER
Andrey Marochko5847c022019-02-08 13:28:00 -08002081#if ALG_RSA
Andrey Marochko394c6172017-11-27 13:49:27 -08002082 TPM2B_PUBLIC_KEY_RSA rsa;
2083#endif // ALG_RSA
Andrey Marochko5847c022019-02-08 13:28:00 -08002084#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002085 TPMS_ECC_POINT ecc;
2086#endif // ALG_ECC
2087 TPMS_DERIVE derive;
2088} TPMU_PUBLIC_ID; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002089
DavidWooten8ea65f02019-12-14 12:49:50 -05002090typedef struct { // Table 2:195
Andrey Marochko394c6172017-11-27 13:49:27 -08002091 TPMT_KEYEDHASH_SCHEME scheme;
2092} TPMS_KEYEDHASH_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002093
DavidWooten8ea65f02019-12-14 12:49:50 -05002094typedef struct { // Table 2:196
Andrey Marochko394c6172017-11-27 13:49:27 -08002095 TPMT_SYM_DEF_OBJECT symmetric;
2096 TPMT_ASYM_SCHEME scheme;
2097} TPMS_ASYM_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002098
DavidWooten8ea65f02019-12-14 12:49:50 -05002099typedef struct { // Table 2:197
Andrey Marochko394c6172017-11-27 13:49:27 -08002100 TPMT_SYM_DEF_OBJECT symmetric;
2101 TPMT_RSA_SCHEME scheme;
2102 TPMI_RSA_KEY_BITS keyBits;
2103 UINT32 exponent;
2104} TPMS_RSA_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002105
DavidWooten8ea65f02019-12-14 12:49:50 -05002106typedef struct { // Table 2:198
Andrey Marochko394c6172017-11-27 13:49:27 -08002107 TPMT_SYM_DEF_OBJECT symmetric;
2108 TPMT_ECC_SCHEME scheme;
2109 TPMI_ECC_CURVE curveID;
2110 TPMT_KDF_SCHEME kdf;
2111} TPMS_ECC_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002112
DavidWooten8ea65f02019-12-14 12:49:50 -05002113typedef union { // Table 2:199
Andrey Marochko5847c022019-02-08 13:28:00 -08002114#if ALG_KEYEDHASH
Andrey Marochko394c6172017-11-27 13:49:27 -08002115 TPMS_KEYEDHASH_PARMS keyedHashDetail;
2116#endif // ALG_KEYEDHASH
Andrey Marochko5847c022019-02-08 13:28:00 -08002117#if ALG_SYMCIPHER
Andrey Marochko394c6172017-11-27 13:49:27 -08002118 TPMS_SYMCIPHER_PARMS symDetail;
2119#endif // ALG_SYMCIPHER
Andrey Marochko5847c022019-02-08 13:28:00 -08002120#if ALG_RSA
Andrey Marochko394c6172017-11-27 13:49:27 -08002121 TPMS_RSA_PARMS rsaDetail;
2122#endif // ALG_RSA
Andrey Marochko5847c022019-02-08 13:28:00 -08002123#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002124 TPMS_ECC_PARMS eccDetail;
2125#endif // ALG_ECC
2126 TPMS_ASYM_PARMS asymDetail;
2127} TPMU_PUBLIC_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002128
DavidWooten8ea65f02019-12-14 12:49:50 -05002129typedef struct { // Table 2:200
Andrey Marochkob8e59922017-06-29 17:13:14 -07002130 TPMI_ALG_PUBLIC type;
2131 TPMU_PUBLIC_PARMS parameters;
Andrey Marochko394c6172017-11-27 13:49:27 -08002132} TPMT_PUBLIC_PARMS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002133
DavidWooten8ea65f02019-12-14 12:49:50 -05002134typedef struct { // Table 2:201
Andrey Marochkob8e59922017-06-29 17:13:14 -07002135 TPMI_ALG_PUBLIC type;
2136 TPMI_ALG_HASH nameAlg;
2137 TPMA_OBJECT objectAttributes;
2138 TPM2B_DIGEST authPolicy;
2139 TPMU_PUBLIC_PARMS parameters;
2140 TPMU_PUBLIC_ID unique;
Andrey Marochko394c6172017-11-27 13:49:27 -08002141} TPMT_PUBLIC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002142
DavidWooten8ea65f02019-12-14 12:49:50 -05002143typedef struct { // Table 2:202
Andrey Marochkob8e59922017-06-29 17:13:14 -07002144 UINT16 size;
2145 TPMT_PUBLIC publicArea;
Andrey Marochko394c6172017-11-27 13:49:27 -08002146} TPM2B_PUBLIC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002147
DavidWooten8ea65f02019-12-14 12:49:50 -05002148typedef union { // Table 2:203
Andrey Marochkob8e59922017-06-29 17:13:14 -07002149 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002150 UINT16 size;
2151 BYTE buffer[sizeof(TPMT_PUBLIC)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002152 } t;
2153 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002154} TPM2B_TEMPLATE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002155
DavidWooten8ea65f02019-12-14 12:49:50 -05002156typedef union { // Table 2:204
Andrey Marochkob8e59922017-06-29 17:13:14 -07002157 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002158 UINT16 size;
2159 BYTE buffer[PRIVATE_VENDOR_SPECIFIC_BYTES];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002160 } t;
2161 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002162} TPM2B_PRIVATE_VENDOR_SPECIFIC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002163
DavidWooten8ea65f02019-12-14 12:49:50 -05002164typedef union { // Table 2:205
Andrey Marochko5847c022019-02-08 13:28:00 -08002165#if ALG_RSA
Andrey Marochko394c6172017-11-27 13:49:27 -08002166 TPM2B_PRIVATE_KEY_RSA rsa;
2167#endif // ALG_RSA
Andrey Marochko5847c022019-02-08 13:28:00 -08002168#if ALG_ECC
Andrey Marochko394c6172017-11-27 13:49:27 -08002169 TPM2B_ECC_PARAMETER ecc;
2170#endif // ALG_ECC
Andrey Marochko5847c022019-02-08 13:28:00 -08002171#if ALG_KEYEDHASH
Andrey Marochko394c6172017-11-27 13:49:27 -08002172 TPM2B_SENSITIVE_DATA bits;
2173#endif // ALG_KEYEDHASH
Andrey Marochko5847c022019-02-08 13:28:00 -08002174#if ALG_SYMCIPHER
Andrey Marochko394c6172017-11-27 13:49:27 -08002175 TPM2B_SYM_KEY sym;
2176#endif // ALG_SYMCIPHER
2177 TPM2B_PRIVATE_VENDOR_SPECIFIC any;
2178} TPMU_SENSITIVE_COMPOSITE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002179
DavidWooten8ea65f02019-12-14 12:49:50 -05002180typedef struct { // Table 2:206
Andrey Marochko394c6172017-11-27 13:49:27 -08002181 TPMI_ALG_PUBLIC sensitiveType;
2182 TPM2B_AUTH authValue;
2183 TPM2B_DIGEST seedValue;
2184 TPMU_SENSITIVE_COMPOSITE sensitive;
2185} TPMT_SENSITIVE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002186
DavidWooten8ea65f02019-12-14 12:49:50 -05002187typedef struct { // Table 2:207
Andrey Marochkob8e59922017-06-29 17:13:14 -07002188 UINT16 size;
2189 TPMT_SENSITIVE sensitiveArea;
Andrey Marochko394c6172017-11-27 13:49:27 -08002190} TPM2B_SENSITIVE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002191
DavidWooten8ea65f02019-12-14 12:49:50 -05002192typedef struct { // Table 2:208
Andrey Marochkob8e59922017-06-29 17:13:14 -07002193 TPM2B_DIGEST integrityOuter;
2194 TPM2B_DIGEST integrityInner;
2195 TPM2B_SENSITIVE sensitive;
Andrey Marochko394c6172017-11-27 13:49:27 -08002196} _PRIVATE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002197
DavidWooten8ea65f02019-12-14 12:49:50 -05002198typedef union { // Table 2:209
Andrey Marochkob8e59922017-06-29 17:13:14 -07002199 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002200 UINT16 size;
2201 BYTE buffer[sizeof(_PRIVATE)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002202 } t;
2203 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002204} TPM2B_PRIVATE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002205
DavidWooten8ea65f02019-12-14 12:49:50 -05002206typedef struct { // Table 2:210
Andrey Marochkob8e59922017-06-29 17:13:14 -07002207 TPM2B_DIGEST integrityHMAC;
2208 TPM2B_DIGEST encIdentity;
Andrey Marochko394c6172017-11-27 13:49:27 -08002209} TPMS_ID_OBJECT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002210
DavidWooten8ea65f02019-12-14 12:49:50 -05002211typedef union { // Table 2:211
Andrey Marochkob8e59922017-06-29 17:13:14 -07002212 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002213 UINT16 size;
2214 BYTE credential[sizeof(TPMS_ID_OBJECT)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002215 } t;
2216 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002217} TPM2B_ID_OBJECT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002218
Andrey Marochko5847c022019-02-08 13:28:00 -08002219#define TYPE_OF_TPM_NV_INDEX UINT32
2220#define TPM_NV_INDEX_TO_UINT32(a) (*((UINT32 *)&(a)))
2221#define UINT32_TO_TPM_NV_INDEX(a) (*((TPM_NV_INDEX *)&(a)))
2222#define TPM_NV_INDEX_TO_BYTE_ARRAY(i, a) \
2223 UINT32_TO_BYTE_ARRAY((TPM_NV_INDEX_TO_UINT32(i)), (a))
2224#define BYTE_ARRAY_TO_TPM_NV_INDEX(i, a) \
2225 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPM_NV_INDEX(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -08002226#if USE_BIT_FIELD_STRUCTURES
DavidWooten8ea65f02019-12-14 12:49:50 -05002227typedef struct TPM_NV_INDEX { // Table 2:212
Andrey Marochko394c6172017-11-27 13:49:27 -08002228 unsigned index : 24;
2229 unsigned RH_NV : 8;
2230} TPM_NV_INDEX; /* Bits */
2231// This is the initializer for a TPM_NV_INDEX structure
2232#define TPM_NV_INDEX_INITIALIZER(index, rh_nv) {index, rh_nv}
2233#else // USE_BIT_FIELD_STRUCTURES
DavidWooten8ea65f02019-12-14 12:49:50 -05002234// This implements Table 2:212 TPM_NV_INDEX using bit masking
Andrey Marochko394c6172017-11-27 13:49:27 -08002235typedef UINT32 TPM_NV_INDEX;
Andrey Marochko5847c022019-02-08 13:28:00 -08002236#define TYPE_OF_TPM_NV_INDEX UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08002237#define TPM_NV_INDEX_index_SHIFT 0
2238#define TPM_NV_INDEX_index ((TPM_NV_INDEX)0xffffff << 0)
2239#define TPM_NV_INDEX_RH_NV_SHIFT 24
2240#define TPM_NV_INDEX_RH_NV ((TPM_NV_INDEX)0xff << 24)
2241// This is the initializer for a TPM_NV_INDEX bit array.
DavidWooten8ea65f02019-12-14 12:49:50 -05002242#define TPM_NV_INDEX_INITIALIZER(index, rh_nv) \
2243 (TPM_NV_INDEX)( \
2244 (index << 0) + (rh_nv << 24))
Andrey Marochko394c6172017-11-27 13:49:27 -08002245#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07002246
DavidWooten8ea65f02019-12-14 12:49:50 -05002247// Table 2:213 - Definition of TPM_NT Constants
Andrey Marochko394c6172017-11-27 13:49:27 -08002248typedef UINT32 TPM_NT;
Andrey Marochko5847c022019-02-08 13:28:00 -08002249#define TYPE_OF_TPM_NT UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08002250#define TPM_NT_ORDINARY (TPM_NT)(0x0)
2251#define TPM_NT_COUNTER (TPM_NT)(0x1)
2252#define TPM_NT_BITS (TPM_NT)(0x2)
2253#define TPM_NT_EXTEND (TPM_NT)(0x4)
2254#define TPM_NT_PIN_FAIL (TPM_NT)(0x8)
2255#define TPM_NT_PIN_PASS (TPM_NT)(0x9)
Andrey Marochkob8e59922017-06-29 17:13:14 -07002256
DavidWooten8ea65f02019-12-14 12:49:50 -05002257typedef struct { // Table 2:214
Andrey Marochkob8e59922017-06-29 17:13:14 -07002258 UINT32 pinCount;
2259 UINT32 pinLimit;
Andrey Marochko394c6172017-11-27 13:49:27 -08002260} TPMS_NV_PIN_COUNTER_PARAMETERS; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002261
Andrey Marochko5847c022019-02-08 13:28:00 -08002262#define TYPE_OF_TPMA_NV UINT32
2263#define TPMA_NV_TO_UINT32(a) (*((UINT32 *)&(a)))
2264#define UINT32_TO_TPMA_NV(a) (*((TPMA_NV *)&(a)))
2265#define TPMA_NV_TO_BYTE_ARRAY(i, a) \
2266 UINT32_TO_BYTE_ARRAY((TPMA_NV_TO_UINT32(i)), (a))
2267#define BYTE_ARRAY_TO_TPMA_NV(i, a) \
2268 { UINT32 x = BYTE_ARRAY_TO_UINT32(a); i = UINT32_TO_TPMA_NV(x); }
Andrey Marochko394c6172017-11-27 13:49:27 -08002269#if USE_BIT_FIELD_STRUCTURES
DavidWooten8ea65f02019-12-14 12:49:50 -05002270typedef struct TPMA_NV { // Table 2:215
Andrey Marochko394c6172017-11-27 13:49:27 -08002271 unsigned PPWRITE : 1;
2272 unsigned OWNERWRITE : 1;
2273 unsigned AUTHWRITE : 1;
2274 unsigned POLICYWRITE : 1;
2275 unsigned TPM_NT : 4;
2276 unsigned Reserved_bits_at_8 : 2;
2277 unsigned POLICY_DELETE : 1;
2278 unsigned WRITELOCKED : 1;
2279 unsigned WRITEALL : 1;
2280 unsigned WRITEDEFINE : 1;
2281 unsigned WRITE_STCLEAR : 1;
2282 unsigned GLOBALLOCK : 1;
2283 unsigned PPREAD : 1;
2284 unsigned OWNERREAD : 1;
2285 unsigned AUTHREAD : 1;
2286 unsigned POLICYREAD : 1;
2287 unsigned Reserved_bits_at_20 : 5;
2288 unsigned NO_DA : 1;
2289 unsigned ORDERLY : 1;
2290 unsigned CLEAR_STCLEAR : 1;
2291 unsigned READLOCKED : 1;
2292 unsigned WRITTEN : 1;
2293 unsigned PLATFORMCREATE : 1;
2294 unsigned READ_STCLEAR : 1;
2295} TPMA_NV; /* Bits */
2296// This is the initializer for a TPMA_NV structure
2297#define TPMA_NV_INITIALIZER( \
2298 ppwrite, ownerwrite, authwrite, policywrite, \
2299 tpm_nt, bits_at_8, policy_delete, writelocked, \
2300 writeall, writedefine, write_stclear, globallock, \
2301 ppread, ownerread, authread, policyread, \
2302 bits_at_20, no_da, orderly, clear_stclear, \
2303 readlocked, written, platformcreate, read_stclear) \
2304 {ppwrite, ownerwrite, authwrite, policywrite, \
2305 tpm_nt, bits_at_8, policy_delete, writelocked, \
2306 writeall, writedefine, write_stclear, globallock, \
2307 ppread, ownerread, authread, policyread, \
2308 bits_at_20, no_da, orderly, clear_stclear, \
2309 readlocked, written, platformcreate, read_stclear}
2310#else // USE_BIT_FIELD_STRUCTURES
DavidWooten8ea65f02019-12-14 12:49:50 -05002311// This implements Table 2:215 TPMA_NV using bit masking
Andrey Marochko394c6172017-11-27 13:49:27 -08002312typedef UINT32 TPMA_NV;
Andrey Marochko5847c022019-02-08 13:28:00 -08002313#define TYPE_OF_TPMA_NV UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08002314#define TPMA_NV_PPWRITE ((TPMA_NV)1 << 0)
2315#define TPMA_NV_OWNERWRITE ((TPMA_NV)1 << 1)
2316#define TPMA_NV_AUTHWRITE ((TPMA_NV)1 << 2)
2317#define TPMA_NV_POLICYWRITE ((TPMA_NV)1 << 3)
2318#define TPMA_NV_TPM_NT_SHIFT 4
2319#define TPMA_NV_TPM_NT ((TPMA_NV)0xf << 4)
2320#define TPMA_NV_POLICY_DELETE ((TPMA_NV)1 << 10)
2321#define TPMA_NV_WRITELOCKED ((TPMA_NV)1 << 11)
2322#define TPMA_NV_WRITEALL ((TPMA_NV)1 << 12)
2323#define TPMA_NV_WRITEDEFINE ((TPMA_NV)1 << 13)
2324#define TPMA_NV_WRITE_STCLEAR ((TPMA_NV)1 << 14)
2325#define TPMA_NV_GLOBALLOCK ((TPMA_NV)1 << 15)
2326#define TPMA_NV_PPREAD ((TPMA_NV)1 << 16)
2327#define TPMA_NV_OWNERREAD ((TPMA_NV)1 << 17)
2328#define TPMA_NV_AUTHREAD ((TPMA_NV)1 << 18)
2329#define TPMA_NV_POLICYREAD ((TPMA_NV)1 << 19)
2330#define TPMA_NV_NO_DA ((TPMA_NV)1 << 25)
2331#define TPMA_NV_ORDERLY ((TPMA_NV)1 << 26)
2332#define TPMA_NV_CLEAR_STCLEAR ((TPMA_NV)1 << 27)
2333#define TPMA_NV_READLOCKED ((TPMA_NV)1 << 28)
2334#define TPMA_NV_WRITTEN ((TPMA_NV)1 << 29)
2335#define TPMA_NV_PLATFORMCREATE ((TPMA_NV)1 << 30)
2336#define TPMA_NV_READ_STCLEAR ((TPMA_NV)1 << 31)
2337// This is the initializer for a TPMA_NV bit array.
2338#define TPMA_NV_INITIALIZER( \
2339 ppwrite, ownerwrite, authwrite, policywrite, \
2340 tpm_nt, bits_at_8, policy_delete, writelocked, \
2341 writeall, writedefine, write_stclear, globallock, \
2342 ppread, ownerread, authread, policyread, \
2343 bits_at_20, no_da, orderly, clear_stclear, \
2344 readlocked, written, platformcreate, read_stclear) \
DavidWooten8ea65f02019-12-14 12:49:50 -05002345 (TPMA_NV)( \
2346 (ppwrite << 0) + (ownerwrite << 1) + \
Andrey Marochko394c6172017-11-27 13:49:27 -08002347 (authwrite << 2) + (policywrite << 3) + \
2348 (tpm_nt << 4) + (policy_delete << 10) + \
2349 (writelocked << 11) + (writeall << 12) + \
2350 (writedefine << 13) + (write_stclear << 14) + \
2351 (globallock << 15) + (ppread << 16) + \
2352 (ownerread << 17) + (authread << 18) + \
2353 (policyread << 19) + (no_da << 25) + \
2354 (orderly << 26) + (clear_stclear << 27) + \
2355 (readlocked << 28) + (written << 29) + \
DavidWooten8ea65f02019-12-14 12:49:50 -05002356 (platformcreate << 30) + (read_stclear << 31))
Andrey Marochko394c6172017-11-27 13:49:27 -08002357#endif // USE_BIT_FIELD_STRUCTURES
Andrey Marochkob8e59922017-06-29 17:13:14 -07002358
DavidWooten8ea65f02019-12-14 12:49:50 -05002359typedef struct { // Table 2:216
Andrey Marochkob8e59922017-06-29 17:13:14 -07002360 TPMI_RH_NV_INDEX nvIndex;
2361 TPMI_ALG_HASH nameAlg;
2362 TPMA_NV attributes;
2363 TPM2B_DIGEST authPolicy;
2364 UINT16 dataSize;
Andrey Marochko394c6172017-11-27 13:49:27 -08002365} TPMS_NV_PUBLIC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002366
DavidWooten8ea65f02019-12-14 12:49:50 -05002367typedef struct { // Table 2:217
Andrey Marochkob8e59922017-06-29 17:13:14 -07002368 UINT16 size;
2369 TPMS_NV_PUBLIC nvPublic;
Andrey Marochko394c6172017-11-27 13:49:27 -08002370} TPM2B_NV_PUBLIC; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002371
DavidWooten8ea65f02019-12-14 12:49:50 -05002372typedef union { // Table 2:218
Andrey Marochkob8e59922017-06-29 17:13:14 -07002373 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002374 UINT16 size;
2375 BYTE buffer[MAX_CONTEXT_SIZE];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002376 } t;
2377 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002378} TPM2B_CONTEXT_SENSITIVE; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002379
DavidWooten8ea65f02019-12-14 12:49:50 -05002380typedef struct { // Table 2:219
Andrey Marochko394c6172017-11-27 13:49:27 -08002381 TPM2B_DIGEST integrity;
2382 TPM2B_CONTEXT_SENSITIVE encrypted;
2383} TPMS_CONTEXT_DATA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002384
DavidWooten8ea65f02019-12-14 12:49:50 -05002385typedef union { // Table 2:220
Andrey Marochkob8e59922017-06-29 17:13:14 -07002386 struct {
Andrey Marochko394c6172017-11-27 13:49:27 -08002387 UINT16 size;
2388 BYTE buffer[sizeof(TPMS_CONTEXT_DATA)];
Andrey Marochkob8e59922017-06-29 17:13:14 -07002389 } t;
2390 TPM2B b;
Andrey Marochko394c6172017-11-27 13:49:27 -08002391} TPM2B_CONTEXT_DATA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002392
DavidWooten8ea65f02019-12-14 12:49:50 -05002393typedef struct { // Table 2:221
Andrey Marochkob8e59922017-06-29 17:13:14 -07002394 UINT64 sequence;
Andrey Marochkod7cc01b2018-08-14 00:44:07 -07002395 TPMI_DH_SAVED savedHandle;
Andrey Marochkob8e59922017-06-29 17:13:14 -07002396 TPMI_RH_HIERARCHY hierarchy;
2397 TPM2B_CONTEXT_DATA contextBlob;
Andrey Marochko394c6172017-11-27 13:49:27 -08002398} TPMS_CONTEXT; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002399
DavidWooten8ea65f02019-12-14 12:49:50 -05002400typedef struct { // Table 2:223
Andrey Marochkob8e59922017-06-29 17:13:14 -07002401 TPML_PCR_SELECTION pcrSelect;
2402 TPM2B_DIGEST pcrDigest;
2403 TPMA_LOCALITY locality;
2404 TPM_ALG_ID parentNameAlg;
2405 TPM2B_NAME parentName;
2406 TPM2B_NAME parentQualifiedName;
2407 TPM2B_DATA outsideInfo;
Andrey Marochko394c6172017-11-27 13:49:27 -08002408} TPMS_CREATION_DATA; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002409
DavidWooten8ea65f02019-12-14 12:49:50 -05002410typedef struct { // Table 2:224
Andrey Marochkob8e59922017-06-29 17:13:14 -07002411 UINT16 size;
2412 TPMS_CREATION_DATA creationData;
Andrey Marochko394c6172017-11-27 13:49:27 -08002413} TPM2B_CREATION_DATA; /* Structure */
Andrey Marochkof666dda2017-06-30 15:30:12 -07002414
DavidWooten8ea65f02019-12-14 12:49:50 -05002415// Table 2:225 - Definition of TPM_AT Constants
Andrey Marochko394c6172017-11-27 13:49:27 -08002416typedef UINT32 TPM_AT;
Andrey Marochko5847c022019-02-08 13:28:00 -08002417#define TYPE_OF_TPM_AT UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08002418#define TPM_AT_ANY (TPM_AT)(0x00000000)
2419#define TPM_AT_ERROR (TPM_AT)(0x00000001)
2420#define TPM_AT_PV1 (TPM_AT)(0x00000002)
2421#define TPM_AT_VEND (TPM_AT)(0x80000000)
Andrey Marochkof666dda2017-06-30 15:30:12 -07002422
DavidWooten8ea65f02019-12-14 12:49:50 -05002423// Table 2:226 - Definition of TPM_AE Constants
Andrey Marochko394c6172017-11-27 13:49:27 -08002424typedef UINT32 TPM_AE;
Andrey Marochko5847c022019-02-08 13:28:00 -08002425#define TYPE_OF_TPM_AE UINT32
Andrey Marochko394c6172017-11-27 13:49:27 -08002426#define TPM_AE_NONE (TPM_AE)(0x00000000)
Andrey Marochkof666dda2017-06-30 15:30:12 -07002427
DavidWooten8ea65f02019-12-14 12:49:50 -05002428typedef struct { // Table 2:227
Andrey Marochkof666dda2017-06-30 15:30:12 -07002429 TPM_AT tag;
2430 UINT32 data;
Andrey Marochko394c6172017-11-27 13:49:27 -08002431} TPMS_AC_OUTPUT; /* Structure */
Andrey Marochkof666dda2017-06-30 15:30:12 -07002432
DavidWooten8ea65f02019-12-14 12:49:50 -05002433typedef struct { // Table 2:228
Andrey Marochkof666dda2017-06-30 15:30:12 -07002434 UINT32 count;
2435 TPMS_AC_OUTPUT acCapabilities[MAX_AC_CAPABILITIES];
Andrey Marochko394c6172017-11-27 13:49:27 -08002436} TPML_AC_CAPABILITIES; /* Structure */
Andrey Marochkob8e59922017-06-29 17:13:14 -07002437
2438
Andrey Marochko083cb5b2019-05-21 15:30:21 -07002439
2440#endif // _TPM_TYPES_H_