1 // Copyright 2015 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // THIS CODE IS GENERATED - DO NOT MODIFY!
6 
7 #ifndef TPM2_TPM_TYPES_H_
8 #define TPM2_TPM_TYPES_H_
9 // Unprocessed: Table 1  Name Prefix Convention
10 // Skipped: Table 2  Unmarshaling Errors
11 // Table 3  Definition of Base Types
12 typedef uint8_t UINT8;
13 typedef uint8_t BYTE;
14 typedef int8_t INT8;
15 typedef int BOOL;
16 typedef uint16_t UINT16;
17 typedef int16_t INT16;
18 typedef uint32_t UINT32;
19 typedef int32_t INT32;
20 typedef uint64_t UINT64;
21 typedef int64_t INT64;
22 
23 // Table 4  Defines for Logic Values
24 #define TRUE   1
25 #define FALSE  0
26 #define YES    1
27 #define NO     0
28 #define SET    1
29 #define CLEAR  0
30 
31 // Table 5  Definition of Types for Documentation Clarity
32 typedef UINT32 TPM_ALGORITHM_ID;
33 typedef UINT32 TPM_MODIFIER_INDICATOR;
34 typedef UINT32 TPM_AUTHORIZATION_SIZE;
35 typedef UINT32 TPM_PARAMETER_SIZE;
36 typedef UINT16 TPM_KEY_SIZE;
37 typedef UINT16 TPM_KEY_BITS;
38 
39 // Skipped: Table 6  Definition of TPM_SPEC Constants <>
40 // Table 7  Definition of TPM_GENERATED Constants <  O>
41 typedef UINT32 TPM_GENERATED;
42 #define TPM_GENERATED_VALUE  0xff544347
43 
44 // Unprocessed: Table 8  Legend for TPM_ALG_ID Table
45 // Skipped: Table 9  Definition of TPM_ALG_ID Constants <  IN/OUT, S>
46 // Skipped: Table 10  Definition of TPM_ECC_CURVE Constants <  IN/OUT, S>
47 // Unprocessed: Table 11  TPM Command Format Fields Description
48 // Unprocessed: Table 12  Legend for Command Code Tables
49 // Skipped: Table 13  Definition of TPM_CC Constants <  IN/OUT, S>
50 // Unprocessed: Table 14  Format-Zero Response Codes
51 // Unprocessed: Table 15  Format-One Response Codes
52 // Unprocessed: Table 16  Response Code Groupings
53 // Table 17  Definition of TPM_RC Constants <  OUT>
54 typedef UINT32 TPM_RC;
55 #define TPM_RC_SUCCESS                                  0x000
56 #define TPM_RC_BAD_TAG                                  0x01E
57 #define RC_VER1                                         0x100
58 #define TPM_RC_INITIALIZE         ((TPM_RC)(RC_VER1 + 0x000))
59 #define TPM_RC_FAILURE            ((TPM_RC)(RC_VER1 + 0x001))
60 #define TPM_RC_SEQUENCE           ((TPM_RC)(RC_VER1 + 0x003))
61 #define TPM_RC_PRIVATE            ((TPM_RC)(RC_VER1 + 0x00B))
62 #define TPM_RC_HMAC               ((TPM_RC)(RC_VER1 + 0x019))
63 #define TPM_RC_DISABLED           ((TPM_RC)(RC_VER1 + 0x020))
64 #define TPM_RC_EXCLUSIVE          ((TPM_RC)(RC_VER1 + 0x021))
65 #define TPM_RC_AUTH_TYPE          ((TPM_RC)(RC_VER1 + 0x024))
66 #define TPM_RC_AUTH_MISSING       ((TPM_RC)(RC_VER1 + 0x025))
67 #define TPM_RC_POLICY             ((TPM_RC)(RC_VER1 + 0x026))
68 #define TPM_RC_PCR                ((TPM_RC)(RC_VER1 + 0x027))
69 #define TPM_RC_PCR_CHANGED        ((TPM_RC)(RC_VER1 + 0x028))
70 #define TPM_RC_UPGRADE            ((TPM_RC)(RC_VER1 + 0x02D))
71 #define TPM_RC_TOO_MANY_CONTEXTS  ((TPM_RC)(RC_VER1 + 0x02E))
72 #define TPM_RC_AUTH_UNAVAILABLE   ((TPM_RC)(RC_VER1 + 0x02F))
73 #define TPM_RC_REBOOT             ((TPM_RC)(RC_VER1 + 0x030))
74 #define TPM_RC_UNBALANCED         ((TPM_RC)(RC_VER1 + 0x031))
75 #define TPM_RC_COMMAND_SIZE       ((TPM_RC)(RC_VER1 + 0x042))
76 #define TPM_RC_COMMAND_CODE       ((TPM_RC)(RC_VER1 + 0x043))
77 #define TPM_RC_AUTHSIZE           ((TPM_RC)(RC_VER1 + 0x044))
78 #define TPM_RC_AUTH_CONTEXT       ((TPM_RC)(RC_VER1 + 0x045))
79 #define TPM_RC_NV_RANGE           ((TPM_RC)(RC_VER1 + 0x046))
80 #define TPM_RC_NV_SIZE            ((TPM_RC)(RC_VER1 + 0x047))
81 #define TPM_RC_NV_LOCKED          ((TPM_RC)(RC_VER1 + 0x048))
82 #define TPM_RC_NV_AUTHORIZATION   ((TPM_RC)(RC_VER1 + 0x049))
83 #define TPM_RC_NV_UNINITIALIZED   ((TPM_RC)(RC_VER1 + 0x04A))
84 #define TPM_RC_NV_SPACE           ((TPM_RC)(RC_VER1 + 0x04B))
85 #define TPM_RC_NV_DEFINED         ((TPM_RC)(RC_VER1 + 0x04C))
86 #define TPM_RC_BAD_CONTEXT        ((TPM_RC)(RC_VER1 + 0x050))
87 #define TPM_RC_CPHASH             ((TPM_RC)(RC_VER1 + 0x051))
88 #define TPM_RC_PARENT             ((TPM_RC)(RC_VER1 + 0x052))
89 #define TPM_RC_NEEDS_TEST         ((TPM_RC)(RC_VER1 + 0x053))
90 #define TPM_RC_NO_RESULT          ((TPM_RC)(RC_VER1 + 0x054))
91 #define TPM_RC_SENSITIVE          ((TPM_RC)(RC_VER1 + 0x055))
92 #define RC_MAX_FM0                ((TPM_RC)(RC_VER1 + 0x07F))
93 #define RC_FMT1                                         0x080
94 #define TPM_RC_ASYMMETRIC         ((TPM_RC)(RC_FMT1 + 0x001))
95 #define TPM_RC_ATTRIBUTES         ((TPM_RC)(RC_FMT1 + 0x002))
96 #define TPM_RC_HASH               ((TPM_RC)(RC_FMT1 + 0x003))
97 #define TPM_RC_VALUE              ((TPM_RC)(RC_FMT1 + 0x004))
98 #define TPM_RC_HIERARCHY          ((TPM_RC)(RC_FMT1 + 0x005))
99 #define TPM_RC_KEY_SIZE           ((TPM_RC)(RC_FMT1 + 0x007))
100 #define TPM_RC_MGF                ((TPM_RC)(RC_FMT1 + 0x008))
101 #define TPM_RC_MODE               ((TPM_RC)(RC_FMT1 + 0x009))
102 #define TPM_RC_TYPE               ((TPM_RC)(RC_FMT1 + 0x00A))
103 #define TPM_RC_HANDLE             ((TPM_RC)(RC_FMT1 + 0x00B))
104 #define TPM_RC_KDF                ((TPM_RC)(RC_FMT1 + 0x00C))
105 #define TPM_RC_RANGE              ((TPM_RC)(RC_FMT1 + 0x00D))
106 #define TPM_RC_AUTH_FAIL          ((TPM_RC)(RC_FMT1 + 0x00E))
107 #define TPM_RC_NONCE              ((TPM_RC)(RC_FMT1 + 0x00F))
108 #define TPM_RC_PP                 ((TPM_RC)(RC_FMT1 + 0x010))
109 #define TPM_RC_SCHEME             ((TPM_RC)(RC_FMT1 + 0x012))
110 #define TPM_RC_SIZE               ((TPM_RC)(RC_FMT1 + 0x015))
111 #define TPM_RC_SYMMETRIC          ((TPM_RC)(RC_FMT1 + 0x016))
112 #define TPM_RC_TAG                ((TPM_RC)(RC_FMT1 + 0x017))
113 #define TPM_RC_SELECTOR           ((TPM_RC)(RC_FMT1 + 0x018))
114 #define TPM_RC_INSUFFICIENT       ((TPM_RC)(RC_FMT1 + 0x01A))
115 #define TPM_RC_SIGNATURE          ((TPM_RC)(RC_FMT1 + 0x01B))
116 #define TPM_RC_KEY                ((TPM_RC)(RC_FMT1 + 0x01C))
117 #define TPM_RC_POLICY_FAIL        ((TPM_RC)(RC_FMT1 + 0x01D))
118 #define TPM_RC_INTEGRITY          ((TPM_RC)(RC_FMT1 + 0x01F))
119 #define TPM_RC_TICKET             ((TPM_RC)(RC_FMT1 + 0x020))
120 #define TPM_RC_RESERVED_BITS      ((TPM_RC)(RC_FMT1 + 0x021))
121 #define TPM_RC_BAD_AUTH           ((TPM_RC)(RC_FMT1 + 0x022))
122 #define TPM_RC_EXPIRED            ((TPM_RC)(RC_FMT1 + 0x023))
123 #define TPM_RC_POLICY_CC          ((TPM_RC)(RC_FMT1 + 0x024))
124 #define TPM_RC_BINDING            ((TPM_RC)(RC_FMT1 + 0x025))
125 #define TPM_RC_CURVE              ((TPM_RC)(RC_FMT1 + 0x026))
126 #define TPM_RC_ECC_POINT          ((TPM_RC)(RC_FMT1 + 0x027))
127 #define RC_WARN                                         0x900
128 #define TPM_RC_CONTEXT_GAP        ((TPM_RC)(RC_WARN + 0x001))
129 #define TPM_RC_OBJECT_MEMORY      ((TPM_RC)(RC_WARN + 0x002))
130 #define TPM_RC_SESSION_MEMORY     ((TPM_RC)(RC_WARN + 0x003))
131 #define TPM_RC_MEMORY             ((TPM_RC)(RC_WARN + 0x004))
132 #define TPM_RC_SESSION_HANDLES    ((TPM_RC)(RC_WARN + 0x005))
133 #define TPM_RC_OBJECT_HANDLES     ((TPM_RC)(RC_WARN + 0x006))
134 #define TPM_RC_LOCALITY           ((TPM_RC)(RC_WARN + 0x007))
135 #define TPM_RC_YIELDED            ((TPM_RC)(RC_WARN + 0x008))
136 #define TPM_RC_CANCELED           ((TPM_RC)(RC_WARN + 0x009))
137 #define TPM_RC_TESTING            ((TPM_RC)(RC_WARN + 0x00A))
138 #define TPM_RC_REFERENCE_H0       ((TPM_RC)(RC_WARN + 0x010))
139 #define TPM_RC_REFERENCE_H1       ((TPM_RC)(RC_WARN + 0x011))
140 #define TPM_RC_REFERENCE_H2       ((TPM_RC)(RC_WARN + 0x012))
141 #define TPM_RC_REFERENCE_H3       ((TPM_RC)(RC_WARN + 0x013))
142 #define TPM_RC_REFERENCE_H4       ((TPM_RC)(RC_WARN + 0x014))
143 #define TPM_RC_REFERENCE_H5       ((TPM_RC)(RC_WARN + 0x015))
144 #define TPM_RC_REFERENCE_H6       ((TPM_RC)(RC_WARN + 0x016))
145 #define TPM_RC_REFERENCE_S0       ((TPM_RC)(RC_WARN + 0x018))
146 #define TPM_RC_REFERENCE_S1       ((TPM_RC)(RC_WARN + 0x019))
147 #define TPM_RC_REFERENCE_S2       ((TPM_RC)(RC_WARN + 0x01A))
148 #define TPM_RC_REFERENCE_S3       ((TPM_RC)(RC_WARN + 0x01B))
149 #define TPM_RC_REFERENCE_S4       ((TPM_RC)(RC_WARN + 0x01C))
150 #define TPM_RC_REFERENCE_S5       ((TPM_RC)(RC_WARN + 0x01D))
151 #define TPM_RC_REFERENCE_S6       ((TPM_RC)(RC_WARN + 0x01E))
152 #define TPM_RC_NV_RATE            ((TPM_RC)(RC_WARN + 0x020))
153 #define TPM_RC_LOCKOUT            ((TPM_RC)(RC_WARN + 0x021))
154 #define TPM_RC_RETRY              ((TPM_RC)(RC_WARN + 0x022))
155 #define TPM_RC_NV_UNAVAILABLE     ((TPM_RC)(RC_WARN + 0x023))
156 #define TPM_RC_NOT_USED            ((TPM_RC)(RC_WARN + 0x7F))
157 #define TPM_RC_H                                        0x000
158 #define TPM_RC_P                                        0x040
159 #define TPM_RC_S                                        0x800
160 #define TPM_RC_1                                        0x100
161 #define TPM_RC_2                                        0x200
162 #define TPM_RC_3                                        0x300
163 #define TPM_RC_4                                        0x400
164 #define TPM_RC_5                                        0x500
165 #define TPM_RC_6                                        0x600
166 #define TPM_RC_7                                        0x700
167 #define TPM_RC_8                                        0x800
168 #define TPM_RC_9                                        0x900
169 #define TPM_RC_A                                        0xA00
170 #define TPM_RC_B                                        0xB00
171 #define TPM_RC_C                                        0xC00
172 #define TPM_RC_D                                        0xD00
173 #define TPM_RC_E                                        0xE00
174 #define TPM_RC_F                                        0xF00
175 #define TPM_RC_N_MASK                                   0xF00
176 
177 // Table 18  Definition of TPM_CLOCK_ADJUST Constants <  IN>
178 typedef INT8 TPM_CLOCK_ADJUST;
179 #define TPM_CLOCK_COARSE_SLOWER  -3
180 #define TPM_CLOCK_MEDIUM_SLOWER  -2
181 #define TPM_CLOCK_FINE_SLOWER    -1
182 #define TPM_CLOCK_NO_CHANGE       0
183 #define TPM_CLOCK_FINE_FASTER     1
184 #define TPM_CLOCK_MEDIUM_FASTER   2
185 #define TPM_CLOCK_COARSE_FASTER   3
186 
187 // Table 19  Definition of TPM_EO Constants <  IN/OUT>
188 typedef UINT16 TPM_EO;
189 #define TPM_EO_EQ           0x0000
190 #define TPM_EO_NEQ          0x0001
191 #define TPM_EO_SIGNED_GT    0x0002
192 #define TPM_EO_UNSIGNED_GT  0x0003
193 #define TPM_EO_SIGNED_LT    0x0004
194 #define TPM_EO_UNSIGNED_LT  0x0005
195 #define TPM_EO_SIGNED_GE    0x0006
196 #define TPM_EO_UNSIGNED_GE  0x0007
197 #define TPM_EO_SIGNED_LE    0x0008
198 #define TPM_EO_UNSIGNED_LE  0x0009
199 #define TPM_EO_BITSET       0x000A
200 #define TPM_EO_BITCLEAR     0x000B
201 
202 // Table 20  Definition of TPM_ST Constants <  IN/OUT, S>
203 typedef UINT16 TPM_ST;
204 #define TPM_ST_RSP_COMMAND           0x00C4
205 #define TPM_ST_NULL                  0X8000
206 #define TPM_ST_NO_SESSIONS           0x8001
207 #define TPM_ST_SESSIONS              0x8002
208 #define TPM_ST_ATTEST_NV             0x8014
209 #define TPM_ST_ATTEST_COMMAND_AUDIT  0x8015
210 #define TPM_ST_ATTEST_SESSION_AUDIT  0x8016
211 #define TPM_ST_ATTEST_CERTIFY        0x8017
212 #define TPM_ST_ATTEST_QUOTE          0x8018
213 #define TPM_ST_ATTEST_TIME           0x8019
214 #define TPM_ST_ATTEST_CREATION       0x801A
215 #define TPM_ST_CREATION              0x8021
216 #define TPM_ST_VERIFIED              0x8022
217 #define TPM_ST_AUTH_SECRET           0x8023
218 #define TPM_ST_HASHCHECK             0x8024
219 #define TPM_ST_AUTH_SIGNED           0x8025
220 #define TPM_ST_FU_MANIFEST           0x8029
221 
222 // Table 21  Definition of TPM_SU Constants <  IN>
223 typedef UINT16 TPM_SU;
224 #define TPM_SU_CLEAR  0x0000
225 #define TPM_SU_STATE  0x0001
226 
227 // Table 22  Definition of TPM_SE Constants <  IN>
228 typedef UINT8 TPM_SE;
229 #define TPM_SE_HMAC    0x00
230 #define TPM_SE_POLICY  0x01
231 #define TPM_SE_TRIAL   0x03
232 
233 // Table 23  Definition of TPM_CAP Constants
234 typedef UINT32 TPM_CAP;
235 #define TPM_CAP_FIRST            0x00000000
236 #define TPM_CAP_ALGS             0x00000000
237 #define TPM_CAP_HANDLES          0x00000001
238 #define TPM_CAP_COMMANDS         0x00000002
239 #define TPM_CAP_PP_COMMANDS      0x00000003
240 #define TPM_CAP_AUDIT_COMMANDS   0x00000004
241 #define TPM_CAP_PCRS             0x00000005
242 #define TPM_CAP_TPM_PROPERTIES   0x00000006
243 #define TPM_CAP_PCR_PROPERTIES   0x00000007
244 #define TPM_CAP_ECC_CURVES       0x00000008
245 #define TPM_CAP_LAST             0x00000008
246 #define TPM_CAP_VENDOR_PROPERTY  0x00000100
247 
248 // Table 24  Definition of TPM_PT Constants <  IN/OUT, S>
249 typedef UINT32 TPM_PT;
250 #define TPM_PT_NONE                                0x00000000
251 #define PT_GROUP                                   0x00000100
252 #define PT_FIXED                               (PT_GROUP * 1)
253 #define TPM_PT_FAMILY_INDICATOR      ((TPM_PT)(PT_FIXED + 0))
254 #define TPM_PT_LEVEL                 ((TPM_PT)(PT_FIXED + 1))
255 #define TPM_PT_REVISION              ((TPM_PT)(PT_FIXED + 2))
256 #define TPM_PT_DAY_OF_YEAR           ((TPM_PT)(PT_FIXED + 3))
257 #define TPM_PT_YEAR                  ((TPM_PT)(PT_FIXED + 4))
258 #define TPM_PT_MANUFACTURER          ((TPM_PT)(PT_FIXED + 5))
259 #define TPM_PT_VENDOR_STRING_1       ((TPM_PT)(PT_FIXED + 6))
260 #define TPM_PT_VENDOR_STRING_2       ((TPM_PT)(PT_FIXED + 7))
261 #define TPM_PT_VENDOR_STRING_3       ((TPM_PT)(PT_FIXED + 8))
262 #define TPM_PT_VENDOR_STRING_4       ((TPM_PT)(PT_FIXED + 9))
263 #define TPM_PT_VENDOR_TPM_TYPE      ((TPM_PT)(PT_FIXED + 10))
264 #define TPM_PT_FIRMWARE_VERSION_1   ((TPM_PT)(PT_FIXED + 11))
265 #define TPM_PT_FIRMWARE_VERSION_2   ((TPM_PT)(PT_FIXED + 12))
266 #define TPM_PT_INPUT_BUFFER         ((TPM_PT)(PT_FIXED + 13))
267 #define TPM_PT_HR_TRANSIENT_MIN     ((TPM_PT)(PT_FIXED + 14))
268 #define TPM_PT_HR_PERSISTENT_MIN    ((TPM_PT)(PT_FIXED + 15))
269 #define TPM_PT_HR_LOADED_MIN        ((TPM_PT)(PT_FIXED + 16))
270 #define TPM_PT_ACTIVE_SESSIONS_MAX  ((TPM_PT)(PT_FIXED + 17))
271 #define TPM_PT_PCR_COUNT            ((TPM_PT)(PT_FIXED + 18))
272 #define TPM_PT_PCR_SELECT_MIN       ((TPM_PT)(PT_FIXED + 19))
273 #define TPM_PT_CONTEXT_GAP_MAX      ((TPM_PT)(PT_FIXED + 20))
274 #define TPM_PT_NV_COUNTERS_MAX      ((TPM_PT)(PT_FIXED + 22))
275 #define TPM_PT_NV_INDEX_MAX         ((TPM_PT)(PT_FIXED + 23))
276 #define TPM_PT_MEMORY               ((TPM_PT)(PT_FIXED + 24))
277 #define TPM_PT_CLOCK_UPDATE         ((TPM_PT)(PT_FIXED + 25))
278 #define TPM_PT_CONTEXT_HASH         ((TPM_PT)(PT_FIXED + 26))
279 #define TPM_PT_CONTEXT_SYM          ((TPM_PT)(PT_FIXED + 27))
280 #define TPM_PT_CONTEXT_SYM_SIZE     ((TPM_PT)(PT_FIXED + 28))
281 #define TPM_PT_ORDERLY_COUNT        ((TPM_PT)(PT_FIXED + 29))
282 #define TPM_PT_MAX_COMMAND_SIZE     ((TPM_PT)(PT_FIXED + 30))
283 #define TPM_PT_MAX_RESPONSE_SIZE    ((TPM_PT)(PT_FIXED + 31))
284 #define TPM_PT_MAX_DIGEST           ((TPM_PT)(PT_FIXED + 32))
285 #define TPM_PT_MAX_OBJECT_CONTEXT   ((TPM_PT)(PT_FIXED + 33))
286 #define TPM_PT_MAX_SESSION_CONTEXT  ((TPM_PT)(PT_FIXED + 34))
287 #define TPM_PT_PS_FAMILY_INDICATOR  ((TPM_PT)(PT_FIXED + 35))
288 #define TPM_PT_PS_LEVEL             ((TPM_PT)(PT_FIXED + 36))
289 #define TPM_PT_PS_REVISION          ((TPM_PT)(PT_FIXED + 37))
290 #define TPM_PT_PS_DAY_OF_YEAR       ((TPM_PT)(PT_FIXED + 38))
291 #define TPM_PT_PS_YEAR              ((TPM_PT)(PT_FIXED + 39))
292 #define TPM_PT_SPLIT_MAX            ((TPM_PT)(PT_FIXED + 40))
293 #define TPM_PT_TOTAL_COMMANDS       ((TPM_PT)(PT_FIXED + 41))
294 #define TPM_PT_LIBRARY_COMMANDS     ((TPM_PT)(PT_FIXED + 42))
295 #define TPM_PT_VENDOR_COMMANDS      ((TPM_PT)(PT_FIXED + 43))
296 #define TPM_PT_NV_BUFFER_MAX        ((TPM_PT)(PT_FIXED + 44))
297 #define PT_VAR                                 (PT_GROUP * 2)
298 #define TPM_PT_PERMANENT               ((TPM_PT)(PT_VAR + 0))
299 #define TPM_PT_STARTUP_CLEAR           ((TPM_PT)(PT_VAR + 1))
300 #define TPM_PT_HR_NV_INDEX             ((TPM_PT)(PT_VAR + 2))
301 #define TPM_PT_HR_LOADED               ((TPM_PT)(PT_VAR + 3))
302 #define TPM_PT_HR_LOADED_AVAIL         ((TPM_PT)(PT_VAR + 4))
303 #define TPM_PT_HR_ACTIVE               ((TPM_PT)(PT_VAR + 5))
304 #define TPM_PT_HR_ACTIVE_AVAIL         ((TPM_PT)(PT_VAR + 6))
305 #define TPM_PT_HR_TRANSIENT_AVAIL      ((TPM_PT)(PT_VAR + 7))
306 #define TPM_PT_HR_PERSISTENT           ((TPM_PT)(PT_VAR + 8))
307 #define TPM_PT_HR_PERSISTENT_AVAIL     ((TPM_PT)(PT_VAR + 9))
308 #define TPM_PT_NV_COUNTERS            ((TPM_PT)(PT_VAR + 10))
309 #define TPM_PT_NV_COUNTERS_AVAIL      ((TPM_PT)(PT_VAR + 11))
310 #define TPM_PT_ALGORITHM_SET          ((TPM_PT)(PT_VAR + 12))
311 #define TPM_PT_LOADED_CURVES          ((TPM_PT)(PT_VAR + 13))
312 #define TPM_PT_LOCKOUT_COUNTER        ((TPM_PT)(PT_VAR + 14))
313 #define TPM_PT_MAX_AUTH_FAIL          ((TPM_PT)(PT_VAR + 15))
314 #define TPM_PT_LOCKOUT_INTERVAL       ((TPM_PT)(PT_VAR + 16))
315 #define TPM_PT_LOCKOUT_RECOVERY       ((TPM_PT)(PT_VAR + 17))
316 #define TPM_PT_NV_WRITE_RECOVERY      ((TPM_PT)(PT_VAR + 18))
317 #define TPM_PT_AUDIT_COUNTER_0        ((TPM_PT)(PT_VAR + 19))
318 #define TPM_PT_AUDIT_COUNTER_1        ((TPM_PT)(PT_VAR + 20))
319 
320 // Table 25  Definition of TPM_PT_PCR Constants <  IN/OUT, S>
321 typedef UINT32 TPM_PT_PCR;
322 #define TPM_PT_PCR_FIRST         0x00000000
323 #define TPM_PT_PCR_SAVE          0x00000000
324 #define TPM_PT_PCR_EXTEND_L0     0x00000001
325 #define TPM_PT_PCR_RESET_L0      0x00000002
326 #define TPM_PT_PCR_EXTEND_L1     0x00000003
327 #define TPM_PT_PCR_RESET_L1      0x00000004
328 #define TPM_PT_PCR_EXTEND_L2     0x00000005
329 #define TPM_PT_PCR_RESET_L2      0x00000006
330 #define TPM_PT_PCR_EXTEND_L3     0x00000007
331 #define TPM_PT_PCR_RESET_L3      0x00000008
332 #define TPM_PT_PCR_EXTEND_L4     0x00000009
333 #define TPM_PT_PCR_RESET_L4      0x0000000A
334 #define TPM_PT_PCR_NO_INCREMENT  0x00000011
335 #define TPM_PT_PCR_DRTM_RESET    0x00000012
336 #define TPM_PT_PCR_POLICY        0x00000013
337 #define TPM_PT_PCR_AUTH          0x00000014
338 #define TPM_PT_PCR_LAST          0x00000014
339 
340 // Table 26  Definition of TPM_PS Constants <  OUT>
341 typedef UINT32 TPM_PS;
342 #define TPM_PS_MAIN            0x00000000
343 #define TPM_PS_PC              0x00000001
344 #define TPM_PS_PDA             0x00000002
345 #define TPM_PS_CELL_PHONE      0x00000003
346 #define TPM_PS_SERVER          0x00000004
347 #define TPM_PS_PERIPHERAL      0x00000005
348 #define TPM_PS_TSS             0x00000006
349 #define TPM_PS_STORAGE         0x00000007
350 #define TPM_PS_AUTHENTICATION  0x00000008
351 #define TPM_PS_EMBEDDED        0x00000009
352 #define TPM_PS_HARDCOPY        0x0000000A
353 #define TPM_PS_INFRASTRUCTURE  0x0000000B
354 #define TPM_PS_VIRTUALIZATION  0x0000000C
355 #define TPM_PS_TNC             0x0000000D
356 #define TPM_PS_MULTI_TENANT    0x0000000E
357 #define TPM_PS_TC              0x0000000F
358 
359 // Table 27  Definition of Types for Handles
360 typedef UINT32 TPM_HANDLE;
361 
362 // Table 28  Definition of TPM_HT Constants <  S>
363 typedef UINT8 TPM_HT;
364 #define TPM_HT_PCR             0x00
365 #define TPM_HT_NV_INDEX        0x01
366 #define TPM_HT_HMAC_SESSION    0x02
367 #define TPM_HT_LOADED_SESSION  0x02
368 #define TPM_HT_POLICY_SESSION  0x03
369 #define TPM_HT_ACTIVE_SESSION  0x03
370 #define TPM_HT_PERMANENT       0x40
371 #define TPM_HT_TRANSIENT       0x80
372 #define TPM_HT_PERSISTENT      0x81
373 
374 // Table 29  Definition of TPM_RH Constants <  S>
375 typedef TPM_HANDLE TPM_RH;
376 #define TPM_RH_FIRST        0x40000000
377 #define TPM_RH_SRK          0x40000000
378 #define TPM_RH_OWNER        0x40000001
379 #define TPM_RH_REVOKE       0x40000002
380 #define TPM_RH_TRANSPORT    0x40000003
381 #define TPM_RH_OPERATOR     0x40000004
382 #define TPM_RH_ADMIN        0x40000005
383 #define TPM_RH_EK           0x40000006
384 #define TPM_RH_NULL         0x40000007
385 #define TPM_RH_UNASSIGNED   0x40000008
386 #define TPM_RS_PW           0x40000009
387 #define TPM_RH_LOCKOUT      0x4000000A
388 #define TPM_RH_ENDORSEMENT  0x4000000B
389 #define TPM_RH_PLATFORM     0x4000000C
390 #define TPM_RH_PLATFORM_NV  0x4000000D
391 #define TPM_RH_AUTH_00      0x40000010
392 #define TPM_RH_AUTH_FF      0x4000010F
393 #define TPM_RH_LAST         0x4000010F
394 
395 // Table 30  Definition of TPM_HC Constants <  S>
396 typedef TPM_HANDLE TPM_HC;
397 #define HR_HANDLE_MASK                                            0x00FFFFFF
398 #define HR_RANGE_MASK                                             0xFF000000
399 #define HR_SHIFT                                                          24
400 #define HR_PCR                                     (TPM_HT_PCR <<  HR_SHIFT)
401 #define HR_HMAC_SESSION                   (TPM_HT_HMAC_SESSION <<  HR_SHIFT)
402 #define HR_POLICY_SESSION               (TPM_HT_POLICY_SESSION <<  HR_SHIFT)
403 #define HR_TRANSIENT                         (TPM_HT_TRANSIENT <<  HR_SHIFT)
404 #define HR_PERSISTENT                       (TPM_HT_PERSISTENT <<  HR_SHIFT)
405 #define HR_NV_INDEX                           (TPM_HT_NV_INDEX <<  HR_SHIFT)
406 #define HR_PERMANENT                         (TPM_HT_PERMANENT <<  HR_SHIFT)
407 #define PCR_FIRST                                               (HR_PCR + 0)
408 #define PCR_LAST                          (PCR_FIRST + IMPLEMENTATION_PCR-1)
409 #define HMAC_SESSION_FIRST                             (HR_HMAC_SESSION + 0)
410 #define HMAC_SESSION_LAST         (HMAC_SESSION_FIRST+MAX_ACTIVE_SESSIONS-1)
411 #define LOADED_SESSION_FIRST                              HMAC_SESSION_FIRST
412 #define LOADED_SESSION_LAST                                HMAC_SESSION_LAST
413 #define POLICY_SESSION_FIRST                         (HR_POLICY_SESSION + 0)
414 #define POLICY_SESSION_LAST   (POLICY_SESSION_FIRST + MAX_ACTIVE_SESSIONS-1)
415 #define TRANSIENT_FIRST                                   (HR_TRANSIENT + 0)
416 #define ACTIVE_SESSION_FIRST                            POLICY_SESSION_FIRST
417 #define ACTIVE_SESSION_LAST                              POLICY_SESSION_LAST
418 #define TRANSIENT_LAST                (TRANSIENT_FIRST+MAX_LOADED_OBJECTS-1)
419 #define PERSISTENT_FIRST                                 (HR_PERSISTENT + 0)
420 #define PERSISTENT_LAST                      (PERSISTENT_FIRST + 0x00FFFFFF)
421 #define PLATFORM_PERSISTENT                  (PERSISTENT_FIRST + 0x00800000)
422 #define NV_INDEX_FIRST                                     (HR_NV_INDEX + 0)
423 #define NV_INDEX_LAST                          (NV_INDEX_FIRST + 0x00FFFFFF)
424 #define PERMANENT_FIRST                                         TPM_RH_FIRST
425 #define PERMANENT_LAST                                           TPM_RH_LAST
426 
427 // Table 31  Definition of TPMA_ALGORITHM Bits
428 typedef struct {
429   UINT32 asymmetric    : 1;
430   UINT32 symmetric     : 1;
431   UINT32 hash          : 1;
432   UINT32 object        : 1;
433   UINT32 reserved4_7   : 4;
434   UINT32 signing       : 1;
435   UINT32 encrypting    : 1;
436   UINT32 method        : 1;
437   UINT32 reserved11_31 : 21;
438 } TPMA_ALGORITHM;
439 
440 // Table 32  Definition of TPMA_OBJECT Bits
441 typedef struct {
442   UINT32 reserved0            : 1;
443   UINT32 fixedTPM             : 1;
444   UINT32 stClear              : 1;
445   UINT32 reserved3            : 1;
446   UINT32 fixedParent          : 1;
447   UINT32 sensitiveDataOrigin  : 1;
448   UINT32 userWithAuth         : 1;
449   UINT32 adminWithPolicy      : 1;
450   UINT32 reserved8_9          : 2;
451   UINT32 noDA                 : 1;
452   UINT32 encryptedDuplication : 1;
453   UINT32 reserved12_15        : 4;
454   UINT32 restricted           : 1;
455   UINT32 decrypt              : 1;
456   UINT32 sign                 : 1;
457   UINT32 reserved19_31        : 13;
458 } TPMA_OBJECT;
459 
460 // Table 33  Definition of TPMA_SESSION Bits <  IN/OUT>
461 typedef struct {
462   UINT8 continueSession : 1;
463   UINT8 auditExclusive  : 1;
464   UINT8 auditReset      : 1;
465   UINT8 reserved3_4     : 2;
466   UINT8 decrypt         : 1;
467   UINT8 encrypt         : 1;
468   UINT8 audit           : 1;
469 } TPMA_SESSION;
470 
471 // Table 34  Definition of TPMA_LOCALITY Bits <  IN/OUT>
472 typedef struct {
473   UINT8 locZero  : 1;
474   UINT8 locOne   : 1;
475   UINT8 locTwo   : 1;
476   UINT8 locThree : 1;
477   UINT8 locFour  : 1;
478   UINT8 Extended : 3;
479 } TPMA_LOCALITY;
480 
481 // Table 35  Definition of TPMA_PERMANENT Bits <  OUT>
482 typedef struct {
483   UINT32 ownerAuthSet       : 1;
484   UINT32 endorsementAuthSet : 1;
485   UINT32 lockoutAuthSet     : 1;
486   UINT32 reserved3_7        : 5;
487   UINT32 disableClear       : 1;
488   UINT32 inLockout          : 1;
489   UINT32 tpmGeneratedEPS    : 1;
490   UINT32 reserved11_31      : 21;
491 } TPMA_PERMANENT;
492 
493 // Table 36  Definition of TPMA_STARTUP_CLEAR Bits <  OUT>
494 typedef struct {
495   UINT32 phEnable     : 1;
496   UINT32 shEnable     : 1;
497   UINT32 ehEnable     : 1;
498   UINT32 phEnableNV   : 1;
499   UINT32 reserved4_30 : 27;
500   UINT32 orderly      : 1;
501 } TPMA_STARTUP_CLEAR;
502 
503 // Table 37  Definition of TPMA_MEMORY Bits <  Out>
504 typedef struct {
505   UINT32 sharedRAM         : 1;
506   UINT32 sharedNV          : 1;
507   UINT32 objectCopiedToRam : 1;
508   UINT32 reserved3_31      : 29;
509 } TPMA_MEMORY;
510 
511 // Table 38  Definition of TPMA_CC Bits <  OUT>
512 typedef struct {
513   TPM_CC commandIndex  : 16;
514   TPM_CC reserved16_21 : 6;
515   TPM_CC nv            : 1;
516   TPM_CC extensive     : 1;
517   TPM_CC flushed       : 1;
518   TPM_CC cHandles      : 3;
519   TPM_CC rHandle       : 1;
520   TPM_CC V             : 1;
521   TPM_CC Res           : 2;
522 } TPMA_CC;
523 
524 // Table 39  Definition of TPMI_YES_NO Type
525 typedef BYTE TPMI_YES_NO;
526 // Table 40  Definition of TPMI_DH_OBJECT Type
527 typedef TPM_HANDLE TPMI_DH_OBJECT;
528 // Table 41  Definition of TPMI_DH_PERSISTENT Type
529 typedef TPM_HANDLE TPMI_DH_PERSISTENT;
530 // Table 42  Definition of TPMI_DH_ENTITY Type <  IN>
531 typedef TPM_HANDLE TPMI_DH_ENTITY;
532 // Table 43  Definition of TPMI_DH_PCR Type <  IN>
533 typedef TPM_HANDLE TPMI_DH_PCR;
534 // Table 44  Definition of TPMI_SH_AUTH_SESSION Type <  IN/OUT>
535 typedef TPM_HANDLE TPMI_SH_AUTH_SESSION;
536 // Table 45  Definition of TPMI_SH_HMAC Type <  IN/OUT>
537 typedef TPM_HANDLE TPMI_SH_HMAC;
538 // Table 46  Definition of TPMI_SH_POLICY Type <  IN/OUT>
539 typedef TPM_HANDLE TPMI_SH_POLICY;
540 // Table 47  Definition of TPMI_DH_CONTEXT Type
541 typedef TPM_HANDLE TPMI_DH_CONTEXT;
542 // Table 48  Definition of TPMI_RH_HIERARCHY Type
543 typedef TPM_HANDLE TPMI_RH_HIERARCHY;
544 // Table 49  Definition of TPMI_RH_ENABLES Type
545 typedef TPM_HANDLE TPMI_RH_ENABLES;
546 // Table 50  Definition of TPMI_RH_HIERARCHY_AUTH Type <  IN>
547 typedef TPM_HANDLE TPMI_RH_HIERARCHY_AUTH;
548 // Table 51  Definition of TPMI_RH_PLATFORM Type <  IN>
549 typedef TPM_HANDLE TPMI_RH_PLATFORM;
550 // Table 52  Definition of TPMI_RH_OWNER Type <  IN>
551 typedef TPM_HANDLE TPMI_RH_OWNER;
552 // Table 53  Definition of TPMI_RH_ENDORSEMENT Type <  IN>
553 typedef TPM_HANDLE TPMI_RH_ENDORSEMENT;
554 // Table 54  Definition of TPMI_RH_PROVISION Type <  IN>
555 typedef TPM_HANDLE TPMI_RH_PROVISION;
556 // Table 55  Definition of TPMI_RH_CLEAR Type <  IN>
557 typedef TPM_HANDLE TPMI_RH_CLEAR;
558 // Table 56  Definition of TPMI_RH_NV_AUTH Type <  IN>
559 typedef TPM_HANDLE TPMI_RH_NV_AUTH;
560 // Table 57  Definition of TPMI_RH_LOCKOUT Type <  IN>
561 typedef TPM_HANDLE TPMI_RH_LOCKOUT;
562 // Table 58  Definition of TPMI_RH_NV_INDEX Type <  IN/OUT>
563 typedef TPM_HANDLE TPMI_RH_NV_INDEX;
564 // Table 59  Definition of TPMI_ALG_HASH Type
565 typedef TPM_ALG_ID TPMI_ALG_HASH;
566 // Table 60  Definition of TPMI_ALG_ASYM Type
567 typedef TPM_ALG_ID TPMI_ALG_ASYM;
568 // Table 61  Definition of TPMI_ALG_SYM Type
569 typedef TPM_ALG_ID TPMI_ALG_SYM;
570 // Table 62  Definition of TPMI_ALG_SYM_OBJECT Type
571 typedef TPM_ALG_ID TPMI_ALG_SYM_OBJECT;
572 // Table 63  Definition of TPMI_ALG_SYM_MODE Type
573 typedef TPM_ALG_ID TPMI_ALG_SYM_MODE;
574 // Table 64  Definition of TPMI_ALG_KDF Type
575 typedef TPM_ALG_ID TPMI_ALG_KDF;
576 // Table 65  Definition of TPMI_ALG_SIG_SCHEME Type
577 typedef TPM_ALG_ID TPMI_ALG_SIG_SCHEME;
578 // Table 66  Definition of TPMI_ECC_KEY_EXCHANGE Type
579 typedef TPM_ALG_ID TPMI_ECC_KEY_EXCHANGE;
580 // Table 67  Definition of TPMI_ST_COMMAND_TAG Type
581 typedef TPM_ST TPMI_ST_COMMAND_TAG;
582 // Table 68  Definition of TPMS_EMPTY Structure <  IN/OUT>
583 typedef struct {
584 } TPMS_EMPTY;
585 
586 // Table 69  Definition of TPMS_ALGORITHM_DESCRIPTION Structure <  OUT>
587 typedef struct {
588   TPM_ALG_ID      alg;
589   TPMA_ALGORITHM  attributes;
590 } TPMS_ALGORITHM_DESCRIPTION;
591 
592 // Table 70  Definition of TPMU_HA Union <  IN/OUT, S>
593 typedef union {
594 #ifdef TPM_ALG_SHA
595   BYTE  sha[SHA_DIGEST_SIZE];
596 #endif
597 #ifdef TPM_ALG_SHA1
598   BYTE  sha1[SHA1_DIGEST_SIZE];
599 #endif
600 #ifdef TPM_ALG_SHA256
601   BYTE  sha256[SHA256_DIGEST_SIZE];
602 #endif
603 #ifdef TPM_ALG_SHA384
604   BYTE  sha384[SHA384_DIGEST_SIZE];
605 #endif
606 #ifdef TPM_ALG_SHA512
607   BYTE  sha512[SHA512_DIGEST_SIZE];
608 #endif
609 #ifdef TPM_ALG_SM3_256
610   BYTE  sm3_256[SM3_256_DIGEST_SIZE];
611 #endif
612 } TPMU_HA;
613 
614 // Table 71  Definition of TPMT_HA Structure <  IN/OUT>
615 typedef struct {
616   TPMI_ALG_HASH  hashAlg;
617   TPMU_HA        digest;
618 } TPMT_HA;
619 
620 // Table 72  Definition of TPM2B_DIGEST Structure
621 typedef union {
622   struct {
623     UINT16  size;
624     BYTE    buffer[sizeof(TPMU_HA)];
625   } t;
626   TPM2B b;
627 } TPM2B_DIGEST;
628 
629 // Table 73  Definition of TPM2B_DATA Structure
630 typedef union {
631   struct {
632     UINT16  size;
633     BYTE    buffer[sizeof(TPMT_HA)];
634   } t;
635   TPM2B b;
636 } TPM2B_DATA;
637 
638 // Table 74  Definition of Types for TPM2B_NONCE
639 typedef TPM2B_DIGEST TPM2B_NONCE;
640 
641 // Table 75  Definition of Types for TPM2B_AUTH
642 typedef TPM2B_DIGEST TPM2B_AUTH;
643 
644 // Table 76  Definition of Types for TPM2B_OPERAND
645 typedef TPM2B_DIGEST TPM2B_OPERAND;
646 
647 // Table 77  Definition of TPM2B_EVENT Structure
648 typedef union {
649   struct {
650     UINT16  size;
651     BYTE    buffer[1024];
652   } t;
653   TPM2B b;
654 } TPM2B_EVENT;
655 
656 // Table 78  Definition of TPM2B_MAX_BUFFER Structure
657 typedef union {
658   struct {
659     UINT16  size;
660     BYTE    buffer[MAX_DIGEST_BUFFER];
661   } t;
662   TPM2B b;
663 } TPM2B_MAX_BUFFER;
664 
665 // Table 79  Definition of TPM2B_MAX_NV_BUFFER Structure
666 typedef union {
667   struct {
668     UINT16  size;
669     BYTE    buffer[MAX_NV_BUFFER_SIZE];
670   } t;
671   TPM2B b;
672 } TPM2B_MAX_NV_BUFFER;
673 
674 // Table 80  Definition of TPM2B_TIMEOUT Structure <  IN/OUT>
675 typedef union {
676   struct {
677     UINT16  size;
678     BYTE    buffer[sizeof(UINT64)];
679   } t;
680   TPM2B b;
681 } TPM2B_TIMEOUT;
682 
683 // Table 81  Definition of TPM2B_IV Structure <  IN/OUT>
684 typedef union {
685   struct {
686     UINT16  size;
687     BYTE    buffer[MAX_SYM_BLOCK_SIZE];
688   } t;
689   TPM2B b;
690 } TPM2B_IV;
691 
692 // Table 82  Definition of TPMU_NAME Union <>
693 typedef union {
694   TPMT_HA     digest;
695   TPM_HANDLE  handle;
696 } TPMU_NAME;
697 
698 // Table 83  Definition of TPM2B_NAME Structure
699 typedef union {
700   struct {
701     UINT16  size;
702     BYTE    name[sizeof(TPMU_NAME)];
703   } t;
704   TPM2B b;
705 } TPM2B_NAME;
706 
707 // Table 84  Definition of TPMS_PCR_SELECT Structure
708 typedef struct {
709   UINT8  sizeofSelect;
710   BYTE   pcrSelect[PCR_SELECT_MAX];
711 } TPMS_PCR_SELECT;
712 
713 // Table 85  Definition of TPMS_PCR_SELECTION Structure
714 typedef struct {
715   TPMI_ALG_HASH  hash;
716   UINT8          sizeofSelect;
717   BYTE           pcrSelect[PCR_SELECT_MAX];
718 } TPMS_PCR_SELECTION;
719 
720 // Unprocessed: Table 86  Values for   proof   Used in Tickets
721 // Unprocessed: Table 87  General Format of a Ticket
722 // Table 88  Definition of TPMT_TK_CREATION Structure
723 typedef struct {
724   TPM_ST             tag;
725   TPMI_RH_HIERARCHY  hierarchy;
726   TPM2B_DIGEST       digest;
727 } TPMT_TK_CREATION;
728 
729 // Table 89  Definition of TPMT_TK_VERIFIED Structure
730 typedef struct {
731   TPM_ST             tag;
732   TPMI_RH_HIERARCHY  hierarchy;
733   TPM2B_DIGEST       digest;
734 } TPMT_TK_VERIFIED;
735 
736 // Table 90  Definition of TPMT_TK_AUTH Structure
737 typedef struct {
738   TPM_ST             tag;
739   TPMI_RH_HIERARCHY  hierarchy;
740   TPM2B_DIGEST       digest;
741 } TPMT_TK_AUTH;
742 
743 // Table 91  Definition of TPMT_TK_HASHCHECK Structure
744 typedef struct {
745   TPM_ST             tag;
746   TPMI_RH_HIERARCHY  hierarchy;
747   TPM2B_DIGEST       digest;
748 } TPMT_TK_HASHCHECK;
749 
750 // Table 92  Definition of TPMS_ALG_PROPERTY Structure <  OUT>
751 typedef struct {
752   TPM_ALG_ID      alg;
753   TPMA_ALGORITHM  algProperties;
754 } TPMS_ALG_PROPERTY;
755 
756 // Table 93  Definition of TPMS_TAGGED_PROPERTY Structure <  OUT>
757 typedef struct {
758   TPM_PT  property;
759   UINT32  value;
760 } TPMS_TAGGED_PROPERTY;
761 
762 // Table 94  Definition of TPMS_TAGGED_PCR_SELECT Structure <  OUT>
763 typedef struct {
764   TPM_PT  tag;
765   UINT8   sizeofSelect;
766   BYTE    pcrSelect[PCR_SELECT_MAX];
767 } TPMS_TAGGED_PCR_SELECT;
768 
769 // Table 95  Definition of TPML_CC Structure
770 typedef struct {
771   UINT32  count;
772   TPM_CC  commandCodes[MAX_CAP_CC];
773 } TPML_CC;
774 
775 // Table 96  Definition of TPML_CCA Structure <  OUT>
776 typedef struct {
777   UINT32   count;
778   TPMA_CC  commandAttributes[MAX_CAP_CC];
779 } TPML_CCA;
780 
781 // Table 97  Definition of TPML_ALG Structure
782 typedef struct {
783   UINT32      count;
784   TPM_ALG_ID  algorithms[MAX_ALG_LIST_SIZE];
785 } TPML_ALG;
786 
787 // Table 98  Definition of TPML_HANDLE Structure <  OUT>
788 typedef struct {
789   UINT32      count;
790   TPM_HANDLE  handle[MAX_CAP_HANDLES];
791 } TPML_HANDLE;
792 
793 // Table 99  Definition of TPML_DIGEST Structure
794 typedef struct {
795   UINT32        count;
796   TPM2B_DIGEST  digests[8];
797 } TPML_DIGEST;
798 
799 // Table 100  Definition of TPML_DIGEST_VALUES Structure
800 typedef struct {
801   UINT32   count;
802   TPMT_HA  digests[HASH_COUNT];
803 } TPML_DIGEST_VALUES;
804 
805 // Table 101  Definition of TPM2B_DIGEST_VALUES Structure
806 typedef union {
807   struct {
808     UINT16  size;
809     BYTE    buffer[sizeof(TPML_DIGEST_VALUES)];
810   } t;
811   TPM2B b;
812 } TPM2B_DIGEST_VALUES;
813 
814 // Table 102  Definition of TPML_PCR_SELECTION Structure
815 typedef struct {
816   UINT32              count;
817   TPMS_PCR_SELECTION  pcrSelections[HASH_COUNT];
818 } TPML_PCR_SELECTION;
819 
820 // Table 103  Definition of TPML_ALG_PROPERTY Structure <  OUT>
821 typedef struct {
822   UINT32             count;
823   TPMS_ALG_PROPERTY  algProperties[MAX_CAP_ALGS];
824 } TPML_ALG_PROPERTY;
825 
826 // Table 104  Definition of TPML_TAGGED_TPM_PROPERTY Structure <  OUT>
827 typedef struct {
828   UINT32                count;
829   TPMS_TAGGED_PROPERTY  tpmProperty[MAX_TPM_PROPERTIES];
830 } TPML_TAGGED_TPM_PROPERTY;
831 
832 // Table 105  Definition of TPML_TAGGED_PCR_PROPERTY Structure <  OUT>
833 typedef struct {
834   UINT32                  count;
835   TPMS_TAGGED_PCR_SELECT  pcrProperty[MAX_PCR_PROPERTIES];
836 } TPML_TAGGED_PCR_PROPERTY;
837 
838 // Table 106  Definition of TPML_ECC_CURVE Structure <  OUT>
839 typedef struct {
840   UINT32         count;
841   TPM_ECC_CURVE  eccCurves[MAX_ECC_CURVES];
842 } TPML_ECC_CURVE;
843 
844 // Table 107  Definition of TPMU_CAPABILITIES Union <  OUT>
845 typedef union {
846   TPML_ALG_PROPERTY         algorithms;
847   TPML_HANDLE               handles;
848   TPML_CCA                  command;
849   TPML_CC                   ppCommands;
850   TPML_CC                   auditCommands;
851   TPML_PCR_SELECTION        assignedPCR;
852   TPML_TAGGED_TPM_PROPERTY  tpmProperties;
853   TPML_TAGGED_PCR_PROPERTY  pcrProperties;
854   TPML_ECC_CURVE            eccCurves;
855 } TPMU_CAPABILITIES;
856 
857 // Table 108  Definition of TPMS_CAPABILITY_DATA Structure <  OUT>
858 typedef struct {
859   TPM_CAP            capability;
860   TPMU_CAPABILITIES  data;
861 } TPMS_CAPABILITY_DATA;
862 
863 // Table 109  Definition of TPMS_CLOCK_INFO Structure
864 typedef struct {
865   UINT64       clock;
866   UINT32       resetCount;
867   UINT32       restartCount;
868   TPMI_YES_NO  safe;
869 } TPMS_CLOCK_INFO;
870 
871 // Table 110  Definition of TPMS_TIME_INFO Structure
872 typedef struct {
873   UINT64           time;
874   TPMS_CLOCK_INFO  clockInfo;
875 } TPMS_TIME_INFO;
876 
877 // Table 111  Definition of TPMS_TIME_ATTEST_INFO Structure <  OUT>
878 typedef struct {
879   TPMS_TIME_INFO  time;
880   UINT64          firmwareVersion;
881 } TPMS_TIME_ATTEST_INFO;
882 
883 // Table 112  Definition of TPMS_CERTIFY_INFO Structure <  OUT>
884 typedef struct {
885   TPM2B_NAME  name;
886   TPM2B_NAME  qualifiedName;
887 } TPMS_CERTIFY_INFO;
888 
889 // Table 113  Definition of TPMS_QUOTE_INFO Structure <  OUT>
890 typedef struct {
891   TPML_PCR_SELECTION  pcrSelect;
892   TPM2B_DIGEST        pcrDigest;
893 } TPMS_QUOTE_INFO;
894 
895 // Table 114  Definition of TPMS_COMMAND_AUDIT_INFO Structure <  OUT>
896 typedef struct {
897   UINT64        auditCounter;
898   TPM_ALG_ID    digestAlg;
899   TPM2B_DIGEST  auditDigest;
900   TPM2B_DIGEST  commandDigest;
901 } TPMS_COMMAND_AUDIT_INFO;
902 
903 // Table 115  Definition of TPMS_SESSION_AUDIT_INFO Structure <  OUT>
904 typedef struct {
905   TPMI_YES_NO   exclusiveSession;
906   TPM2B_DIGEST  sessionDigest;
907 } TPMS_SESSION_AUDIT_INFO;
908 
909 // Table 116  Definition of TPMS_CREATION_INFO Structure <  OUT>
910 typedef struct {
911   TPM2B_NAME    objectName;
912   TPM2B_DIGEST  creationHash;
913 } TPMS_CREATION_INFO;
914 
915 // Table 117  Definition of TPMS_NV_CERTIFY_INFO Structure <  OUT>
916 typedef struct {
917   TPM2B_NAME           indexName;
918   UINT16               offset;
919   TPM2B_MAX_NV_BUFFER  nvContents;
920 } TPMS_NV_CERTIFY_INFO;
921 
922 // Table 118  Definition of TPMI_ST_ATTEST Type <  OUT>
923 typedef TPM_ST TPMI_ST_ATTEST;
924 // Table 119  Definition of TPMU_ATTEST Union <  OUT>
925 typedef union {
926   TPMS_CERTIFY_INFO        certify;
927   TPMS_CREATION_INFO       creation;
928   TPMS_QUOTE_INFO          quote;
929   TPMS_COMMAND_AUDIT_INFO  commandAudit;
930   TPMS_SESSION_AUDIT_INFO  sessionAudit;
931   TPMS_TIME_ATTEST_INFO    time;
932   TPMS_NV_CERTIFY_INFO     nv;
933 } TPMU_ATTEST;
934 
935 // Table 120  Definition of TPMS_ATTEST Structure <  OUT>
936 typedef struct {
937   TPM_GENERATED    magic;
938   TPMI_ST_ATTEST   type;
939   TPM2B_NAME       qualifiedSigner;
940   TPM2B_DATA       extraData;
941   TPMS_CLOCK_INFO  clockInfo;
942   UINT64           firmwareVersion;
943   TPMU_ATTEST      attested;
944 } TPMS_ATTEST;
945 
946 // Table 121  Definition of TPM2B_ATTEST Structure <  OUT>
947 typedef union {
948   struct {
949     UINT16  size;
950     BYTE    attestationData[sizeof(TPMS_ATTEST)];
951   } t;
952   TPM2B b;
953 } TPM2B_ATTEST;
954 
955 // Table 122  Definition of TPMS_AUTH_COMMAND Structure <  IN>
956 typedef struct {
957   TPMI_SH_AUTH_SESSION  sessionHandle;
958   TPM2B_NONCE           nonce;
959   TPMA_SESSION          sessionAttributes;
960   TPM2B_AUTH            hmac;
961 } TPMS_AUTH_COMMAND;
962 
963 // Table 123  Definition of TPMS_AUTH_RESPONSE Structure <  OUT>
964 typedef struct {
965   TPM2B_NONCE   nonce;
966   TPMA_SESSION  sessionAttributes;
967   TPM2B_AUTH    hmac;
968 } TPMS_AUTH_RESPONSE;
969 
970 // Table 124  Definition of   TPMI_!ALG.S_KEY_BITS Type
971 typedef TPM_KEY_BITS TPMI_AES_KEY_BITS;
972 typedef TPM_KEY_BITS TPMI_SM4_KEY_BITS;
973 typedef TPM_KEY_BITS TPMI_CAMELLIA_KEY_BITS;
974 
975 
976 // Table 125  Definition of TPMU_SYM_KEY_BITS Union
977 typedef union {
978 #ifdef TPM_ALG_AES
979   TPMI_AES_KEY_BITS       aes;
980 #endif
981 #ifdef TPM_ALG_SM4
982   TPMI_SM4_KEY_BITS       sm4;
983 #endif
984 #ifdef TPM_ALG_CAMELLIA
985   TPMI_CAMELLIA_KEY_BITS  camellia;
986 #endif
987   TPM_KEY_BITS            sym;
988 #ifdef TPM_ALG_XOR
989   TPMI_ALG_HASH           xor_;
990 #endif
991 } TPMU_SYM_KEY_BITS;
992 
993 // Table 126  Definition of TPMU_SYM_MODE Union
994 typedef union {
995 #ifdef TPM_ALG_AES
996   TPMI_ALG_SYM_MODE  aes;
997 #endif
998 #ifdef TPM_ALG_SM4
999   TPMI_ALG_SYM_MODE  sm4;
1000 #endif
1001 #ifdef TPM_ALG_CAMELLIA
1002   TPMI_ALG_SYM_MODE  camellia;
1003 #endif
1004   TPMI_ALG_SYM_MODE  sym;
1005 } TPMU_SYM_MODE;
1006 
1007 // Table 127 xDefinition of TPMU_SYM_DETAILS Union
1008 typedef union {
1009 } TPMU_SYM_DETAILS;
1010 
1011 // Table 128  Definition of TPMT_SYM_DEF Structure
1012 typedef struct {
1013   TPMI_ALG_SYM       algorithm;
1014   TPMU_SYM_KEY_BITS  keyBits;
1015   TPMU_SYM_MODE      mode;
1016 } TPMT_SYM_DEF;
1017 
1018 // Table 129  Definition of TPMT_SYM_DEF_OBJECT Structure
1019 typedef struct {
1020   TPMI_ALG_SYM_OBJECT  algorithm;
1021   TPMU_SYM_KEY_BITS    keyBits;
1022   TPMU_SYM_MODE        mode;
1023 } TPMT_SYM_DEF_OBJECT;
1024 
1025 // Table 130  Definition of TPM2B_SYM_KEY Structure
1026 typedef union {
1027   struct {
1028     UINT16  size;
1029     BYTE    buffer[MAX_SYM_KEY_BYTES];
1030   } t;
1031   TPM2B b;
1032 } TPM2B_SYM_KEY;
1033 
1034 // Table 131  Definition of TPMS_SYMCIPHER_PARMS Structure
1035 typedef struct {
1036   TPMT_SYM_DEF_OBJECT  sym;
1037 } TPMS_SYMCIPHER_PARMS;
1038 
1039 // Table 132  Definition of TPM2B_SENSITIVE_DATA Structure
1040 typedef union {
1041   struct {
1042     UINT16  size;
1043     BYTE    buffer[MAX_SYM_DATA];
1044   } t;
1045   TPM2B b;
1046 } TPM2B_SENSITIVE_DATA;
1047 
1048 // Table 133  Definition of TPMS_SENSITIVE_CREATE Structure <  IN>
1049 typedef struct {
1050   TPM2B_AUTH            userAuth;
1051   TPM2B_SENSITIVE_DATA  data;
1052 } TPMS_SENSITIVE_CREATE;
1053 
1054 // Table 134  Definition of TPM2B_SENSITIVE_CREATE Structure <  IN, S>
1055 typedef union {
1056   struct {
1057     UINT16                 size;
1058     TPMS_SENSITIVE_CREATE  sensitive;
1059   } t;
1060   TPM2B b;
1061 } TPM2B_SENSITIVE_CREATE;
1062 
1063 // Table 135  Definition of TPMS_SCHEME_HASH Structure
1064 typedef struct {
1065   TPMI_ALG_HASH  hashAlg;
1066 } TPMS_SCHEME_HASH;
1067 
1068 // Table 136  Definition of TPMS_SCHEME_ECDAA Structure
1069 typedef struct {
1070   TPMI_ALG_HASH  hashAlg;
1071   UINT16         count;
1072 } TPMS_SCHEME_ECDAA;
1073 
1074 // Table 137  Definition of TPMI_ALG_KEYEDHASH_SCHEME Type
1075 typedef TPM_ALG_ID TPMI_ALG_KEYEDHASH_SCHEME;
1076 // Table 138  Definition of Types for HMAC_SIG_SCHEME
1077 typedef TPMS_SCHEME_HASH TPMS_SCHEME_HMAC;
1078 
1079 // Table 139  Definition of TPMS_SCHEME_XOR Structure
1080 typedef struct {
1081   TPMI_ALG_HASH  hashAlg;
1082   TPMI_ALG_KDF   kdf;
1083 } TPMS_SCHEME_XOR;
1084 
1085 // Table 140  Definition of TPMU_SCHEME_KEYEDHASH Union <  IN/OUT, S>
1086 typedef union {
1087 #ifdef TPM_ALG_HMAC
1088   TPMS_SCHEME_HMAC  hmac;
1089 #endif
1090 #ifdef TPM_ALG_XOR
1091   TPMS_SCHEME_XOR   xor_;
1092 #endif
1093 } TPMU_SCHEME_KEYEDHASH;
1094 
1095 // Table 141  Definition of TPMT_KEYEDHASH_SCHEME Structure
1096 typedef struct {
1097   TPMI_ALG_KEYEDHASH_SCHEME  scheme;
1098   TPMU_SCHEME_KEYEDHASH      details;
1099 } TPMT_KEYEDHASH_SCHEME;
1100 
1101 // Table 142  Definition of Types for RSA Signature Schemes
1102 typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSASSA;
1103 typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_RSAPSS;
1104 
1105 // Table 143  Definition of Types for ECC Signature Schemes
1106 typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECDSA;
1107 typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_SM2;
1108 typedef TPMS_SCHEME_HASH TPMS_SIG_SCHEME_ECSCHNORR;
1109 typedef TPMS_SCHEME_ECDAA TPMS_SIG_SCHEME_ECDAA;
1110 
1111 // Table 144  Definition of TPMU_SIG_SCHEME Union <  IN/OUT, S>
1112 typedef union {
1113 #ifdef TPM_ALG_RSASSA
1114   TPMS_SIG_SCHEME_RSASSA     rsassa;
1115 #endif
1116 #ifdef TPM_ALG_RSAPSS
1117   TPMS_SIG_SCHEME_RSAPSS     rsapss;
1118 #endif
1119 #ifdef TPM_ALG_ECDSA
1120   TPMS_SIG_SCHEME_ECDSA      ecdsa;
1121 #endif
1122 #ifdef TPM_ALG_ECDAA
1123   TPMS_SIG_SCHEME_ECDAA      ecdaa;
1124 #endif
1125 #ifdef TPM_ALG_SM2
1126   TPMS_SIG_SCHEME_SM2        sm2;
1127 #endif
1128 #ifdef TPM_ALG_ECSCHNORR
1129   TPMS_SIG_SCHEME_ECSCHNORR  ecschnorr;
1130 #endif
1131 #ifdef TPM_ALG_HMAC
1132   TPMS_SCHEME_HMAC           hmac;
1133 #endif
1134   TPMS_SCHEME_HASH           any;
1135 } TPMU_SIG_SCHEME;
1136 
1137 // Table 145  Definition of TPMT_SIG_SCHEME Structure
1138 typedef struct {
1139   TPMI_ALG_SIG_SCHEME  scheme;
1140   TPMU_SIG_SCHEME      details;
1141 } TPMT_SIG_SCHEME;
1142 
1143 // Table 146  Definition of Types for Encryption Schemes
1144 typedef TPMS_SCHEME_HASH TPMS_ENC_SCHEME_OAEP;
1145 typedef TPMS_EMPTY TPMS_ENC_SCHEME_RSAES;
1146 
1147 // Table 147  Definition of Types for ECC Key Exchange
1148 typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECDH;
1149 typedef TPMS_SCHEME_HASH TPMS_KEY_SCHEME_ECMQV;
1150 
1151 // Table 148  Definition of Types for KDF Schemes
1152 typedef TPMS_SCHEME_HASH TPMS_SCHEME_MGF1;
1153 typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF1_SP800_56A;
1154 typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF2;
1155 typedef TPMS_SCHEME_HASH TPMS_SCHEME_KDF1_SP800_108;
1156 
1157 // Table 149  Definition of TPMU_KDF_SCHEME Union <  IN/OUT, S>
1158 typedef union {
1159 #ifdef TPM_ALG_MGF1
1160   TPMS_SCHEME_MGF1            mgf1;
1161 #endif
1162 #ifdef TPM_ALG_KDF1_SP800_56A
1163   TPMS_SCHEME_KDF1_SP800_56A  kdf1_sp800_56a;
1164 #endif
1165 #ifdef TPM_ALG_KDF2
1166   TPMS_SCHEME_KDF2            kdf2;
1167 #endif
1168 #ifdef TPM_ALG_KDF1_SP800_108
1169   TPMS_SCHEME_KDF1_SP800_108  kdf1_sp800_108;
1170 #endif
1171 } TPMU_KDF_SCHEME;
1172 
1173 // Table 150  Definition of TPMT_KDF_SCHEME Structure
1174 typedef struct {
1175   TPMI_ALG_KDF     scheme;
1176   TPMU_KDF_SCHEME  details;
1177 } TPMT_KDF_SCHEME;
1178 
1179 // Table 151  Definition of TPMI_ALG_ASYM_SCHEME Type <>
1180 typedef TPM_ALG_ID TPMI_ALG_ASYM_SCHEME;
1181 // Table 152  Definition of TPMU_ASYM_SCHEME Union
1182 typedef union {
1183 #ifdef TPM_ALG_ECDH
1184   TPMS_KEY_SCHEME_ECDH       ecdh;
1185 #endif
1186 #ifdef TPM_ALG_ECMQV
1187   TPMS_KEY_SCHEME_ECMQV      ecmqv;
1188 #endif
1189 #ifdef TPM_ALG_RSASSA
1190   TPMS_SIG_SCHEME_RSASSA     rsassa;
1191 #endif
1192 #ifdef TPM_ALG_RSAPSS
1193   TPMS_SIG_SCHEME_RSAPSS     rsapss;
1194 #endif
1195 #ifdef TPM_ALG_ECDSA
1196   TPMS_SIG_SCHEME_ECDSA      ecdsa;
1197 #endif
1198 #ifdef TPM_ALG_ECDAA
1199   TPMS_SIG_SCHEME_ECDAA      ecdaa;
1200 #endif
1201 #ifdef TPM_ALG_SM2
1202   TPMS_SIG_SCHEME_SM2        sm2;
1203 #endif
1204 #ifdef TPM_ALG_ECSCHNORR
1205   TPMS_SIG_SCHEME_ECSCHNORR  ecschnorr;
1206 #endif
1207 #ifdef TPM_ALG_RSAES
1208   TPMS_ENC_SCHEME_RSAES      rsaes;
1209 #endif
1210 #ifdef TPM_ALG_OAEP
1211   TPMS_ENC_SCHEME_OAEP       oaep;
1212 #endif
1213   TPMS_SCHEME_HASH           anySig;
1214 } TPMU_ASYM_SCHEME;
1215 
1216 // Table 153  Definition of TPMT_ASYM_SCHEME Structure <>
1217 typedef struct {
1218   TPMI_ALG_ASYM_SCHEME  scheme;
1219   TPMU_ASYM_SCHEME      details;
1220 } TPMT_ASYM_SCHEME;
1221 
1222 // Table 154  Definition of TPMI_ALG_RSA_SCHEME Type
1223 typedef TPM_ALG_ID TPMI_ALG_RSA_SCHEME;
1224 // Table 155  Definition of TPMT_RSA_SCHEME Structure
1225 typedef struct {
1226   TPMI_ALG_RSA_SCHEME  scheme;
1227   TPMU_ASYM_SCHEME     details;
1228 } TPMT_RSA_SCHEME;
1229 
1230 // Table 156  Definition of TPMI_ALG_RSA_DECRYPT Type
1231 typedef TPM_ALG_ID TPMI_ALG_RSA_DECRYPT;
1232 // Table 157  Definition of TPMT_RSA_DECRYPT Structure
1233 typedef struct {
1234   TPMI_ALG_RSA_DECRYPT  scheme;
1235   TPMU_ASYM_SCHEME      details;
1236 } TPMT_RSA_DECRYPT;
1237 
1238 // Table 158  Definition of TPM2B_PUBLIC_KEY_RSA Structure
1239 typedef union {
1240   struct {
1241     UINT16  size;
1242     BYTE    buffer[MAX_RSA_KEY_BYTES];
1243   } t;
1244   TPM2B b;
1245 } TPM2B_PUBLIC_KEY_RSA;
1246 
1247 // Table 159  Definition of TPMI_RSA_KEY_BITS Type
1248 typedef TPM_KEY_BITS TPMI_RSA_KEY_BITS;
1249 // Table 160  Definition of TPM2B_PRIVATE_KEY_RSA Structure
1250 typedef union {
1251   struct {
1252     UINT16  size;
1253     BYTE    buffer[MAX_RSA_KEY_BYTES/2];
1254   } t;
1255   TPM2B b;
1256 } TPM2B_PRIVATE_KEY_RSA;
1257 
1258 // Table 161  Definition of TPM2B_ECC_PARAMETER Structure
1259 typedef union {
1260   struct {
1261     UINT16  size;
1262     BYTE    buffer[MAX_ECC_KEY_BYTES];
1263   } t;
1264   TPM2B b;
1265 } TPM2B_ECC_PARAMETER;
1266 
1267 // Table 162  Definition of TPMS_ECC_POINT Structure
1268 typedef struct {
1269   TPM2B_ECC_PARAMETER  x;
1270   TPM2B_ECC_PARAMETER  y;
1271 } TPMS_ECC_POINT;
1272 
1273 // Table   163    Definition of TPM2B_ECC_POINT Structure
1274 typedef union {
1275   struct {
1276     UINT16          size;
1277     TPMS_ECC_POINT  point;
1278   } t;
1279   TPM2B b;
1280 } TPM2B_ECC_POINT;
1281 
1282 // Table 164  Definition of TPMI_ALG_ECC_SCHEME Type
1283 typedef TPM_ALG_ID TPMI_ALG_ECC_SCHEME;
1284 // Table 165  Definition of TPMI_ECC_CURVE Type
1285 typedef TPM_ECC_CURVE TPMI_ECC_CURVE;
1286 // Table 166  Definition of TPMT_ECC_SCHEME Structure
1287 typedef struct {
1288   TPMI_ALG_ECC_SCHEME  scheme;
1289   TPMU_ASYM_SCHEME     details;
1290 } TPMT_ECC_SCHEME;
1291 
1292 // Table 167  Definition of TPMS_ALGORITHM_DETAIL_ECC Structure <  OUT>
1293 typedef struct {
1294   TPM_ECC_CURVE        curveID;
1295   UINT16               keySize;
1296   TPMT_KDF_SCHEME      kdf;
1297   TPMT_ECC_SCHEME      sign;
1298   TPM2B_ECC_PARAMETER  p;
1299   TPM2B_ECC_PARAMETER  a;
1300   TPM2B_ECC_PARAMETER  b;
1301   TPM2B_ECC_PARAMETER  gX;
1302   TPM2B_ECC_PARAMETER  gY;
1303   TPM2B_ECC_PARAMETER  n;
1304   TPM2B_ECC_PARAMETER  h;
1305 } TPMS_ALGORITHM_DETAIL_ECC;
1306 
1307 // Table 168  Definition of TPMS_SIGNATURE_RSA Structure
1308 typedef struct {
1309   TPMI_ALG_HASH         hash;
1310   TPM2B_PUBLIC_KEY_RSA  sig;
1311 } TPMS_SIGNATURE_RSA;
1312 
1313 // Table 169  Definition of Types for Signature
1314 typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSASSA;
1315 typedef TPMS_SIGNATURE_RSA TPMS_SIGNATURE_RSAPSS;
1316 
1317 // Table 170  Definition of TPMS_SIGNATURE_ECC Structure
1318 typedef struct {
1319   TPMI_ALG_HASH        hash;
1320   TPM2B_ECC_PARAMETER  signatureR;
1321   TPM2B_ECC_PARAMETER  signatureS;
1322 } TPMS_SIGNATURE_ECC;
1323 
1324 // Table 171  Definition of Types for TPMS_SIGNATUE_ECC
1325 typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDSA;
1326 typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECDAA;
1327 typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_SM2;
1328 typedef TPMS_SIGNATURE_ECC TPMS_SIGNATURE_ECSCHNORR;
1329 
1330 // Table 172  Definition of TPMU_SIGNATURE Union <  IN/OUT, S>
1331 typedef union {
1332 #ifdef TPM_ALG_RSASSA
1333   TPMS_SIGNATURE_RSASSA     rsassa;
1334 #endif
1335 #ifdef TPM_ALG_RSAPSS
1336   TPMS_SIGNATURE_RSAPSS     rsapss;
1337 #endif
1338 #ifdef TPM_ALG_ECDSA
1339   TPMS_SIGNATURE_ECDSA      ecdsa;
1340 #endif
1341 #ifdef TPM_ALG_ECDAA
1342   TPMS_SIGNATURE_ECDAA      ecdaa;
1343 #endif
1344 #ifdef TPM_ALG_SM2
1345   TPMS_SIGNATURE_SM2        sm2;
1346 #endif
1347 #ifdef TPM_ALG_ECSCHNORR
1348   TPMS_SIGNATURE_ECSCHNORR  ecschnorr;
1349 #endif
1350 #ifdef TPM_ALG_HMAC
1351   TPMT_HA                   hmac;
1352 #endif
1353   TPMS_SCHEME_HASH          any;
1354 } TPMU_SIGNATURE;
1355 
1356 // Table 173  Definition of TPMT_SIGNATURE Structure
1357 typedef struct {
1358   TPMI_ALG_SIG_SCHEME  sigAlg;
1359   TPMU_SIGNATURE       signature;
1360 } TPMT_SIGNATURE;
1361 
1362 // Table 174  Definition of TPMU_ENCRYPTED_SECRET Union <  S>
1363 typedef union {
1364 #ifdef TPM_ALG_ECC
1365   BYTE  ecc[sizeof(TPMS_ECC_POINT)];
1366 #endif
1367 #ifdef TPM_ALG_RSA
1368   BYTE  rsa[MAX_RSA_KEY_BYTES];
1369 #endif
1370 #ifdef TPM_ALG_SYMCIPHER
1371   BYTE  symmetric[sizeof(TPM2B_DIGEST)];
1372 #endif
1373 #ifdef TPM_ALG_KEYEDHASH
1374   BYTE  keyedHash[sizeof(TPM2B_DIGEST)];
1375 #endif
1376 } TPMU_ENCRYPTED_SECRET;
1377 
1378 // Table 175  Definition of TPM2B_ENCRYPTED_SECRET Structure
1379 typedef union {
1380   struct {
1381     UINT16  size;
1382     BYTE    secret[sizeof(TPMU_ENCRYPTED_SECRET)];
1383   } t;
1384   TPM2B b;
1385 } TPM2B_ENCRYPTED_SECRET;
1386 
1387 // Table 176  Definition of TPMI_ALG_PUBLIC Type
1388 typedef TPM_ALG_ID TPMI_ALG_PUBLIC;
1389 // Table 177  Definition of TPMU_PUBLIC_ID Union <  IN/OUT, S>
1390 typedef union {
1391 #ifdef TPM_ALG_KEYEDHASH
1392   TPM2B_DIGEST          keyedHash;
1393 #endif
1394 #ifdef TPM_ALG_SYMCIPHER
1395   TPM2B_DIGEST          sym;
1396 #endif
1397 #ifdef TPM_ALG_RSA
1398   TPM2B_PUBLIC_KEY_RSA  rsa;
1399 #endif
1400 #ifdef TPM_ALG_ECC
1401   TPMS_ECC_POINT        ecc;
1402 #endif
1403 } TPMU_PUBLIC_ID;
1404 
1405 // Table 178  Definition of TPMS_KEYEDHASH_PARMS Structure
1406 typedef struct {
1407   TPMT_KEYEDHASH_SCHEME  scheme;
1408 } TPMS_KEYEDHASH_PARMS;
1409 
1410 // Table 179  Definition of TPMS_ASYM_PARMS Structure <>
1411 typedef struct {
1412   TPMT_SYM_DEF_OBJECT  symmetric;
1413   TPMT_ASYM_SCHEME     scheme;
1414 } TPMS_ASYM_PARMS;
1415 
1416 // Table 180  Definition of TPMS_RSA_PARMS Structure
1417 typedef struct {
1418   TPMT_SYM_DEF_OBJECT  symmetric;
1419   TPMT_RSA_SCHEME      scheme;
1420   TPMI_RSA_KEY_BITS    keyBits;
1421   UINT32               exponent;
1422 } TPMS_RSA_PARMS;
1423 
1424 // Table 181  Definition of TPMS_ECC_PARMS Structure
1425 typedef struct {
1426   TPMT_SYM_DEF_OBJECT  symmetric;
1427   TPMT_ECC_SCHEME      scheme;
1428   TPMI_ECC_CURVE       curveID;
1429   TPMT_KDF_SCHEME      kdf;
1430 } TPMS_ECC_PARMS;
1431 
1432 // Table 182  Definition of TPMU_PUBLIC_PARMS Union <  IN/OUT, S>
1433 typedef union {
1434 #ifdef TPM_ALG_KEYEDHASH
1435   TPMS_KEYEDHASH_PARMS  keyedHashDetail;
1436 #endif
1437 #ifdef TPM_ALG_SYMCIPHER
1438   TPMS_SYMCIPHER_PARMS  symDetail;
1439 #endif
1440 #ifdef TPM_ALG_RSA
1441   TPMS_RSA_PARMS        rsaDetail;
1442 #endif
1443 #ifdef TPM_ALG_ECC
1444   TPMS_ECC_PARMS        eccDetail;
1445 #endif
1446   TPMS_ASYM_PARMS       asymDetail;
1447 } TPMU_PUBLIC_PARMS;
1448 
1449 // Table 183  Definition of TPMT_PUBLIC_PARMS Structure
1450 typedef struct {
1451   TPMI_ALG_PUBLIC    type;
1452   TPMU_PUBLIC_PARMS  parameters;
1453 } TPMT_PUBLIC_PARMS;
1454 
1455 // Table 184  Definition of TPMT_PUBLIC Structure
1456 typedef struct {
1457   TPMI_ALG_PUBLIC    type;
1458   TPMI_ALG_HASH      nameAlg;
1459   TPMA_OBJECT        objectAttributes;
1460   TPM2B_DIGEST       authPolicy;
1461   TPMU_PUBLIC_PARMS  parameters;
1462   TPMU_PUBLIC_ID     unique;
1463 } TPMT_PUBLIC;
1464 
1465 // Table 185  Definition of TPM2B_PUBLIC Structure
1466 typedef union {
1467   struct {
1468     UINT16       size;
1469     TPMT_PUBLIC  publicArea;
1470   } t;
1471   TPM2B b;
1472 } TPM2B_PUBLIC;
1473 
1474 // Table 186  Definition of TPM2B_PRIVATE_VENDOR_SPECIFIC Structure<>
1475 typedef union {
1476   struct {
1477     UINT16  size;
1478     BYTE    buffer[PRIVATE_VENDOR_SPECIFIC_BYTES];
1479   } t;
1480   TPM2B b;
1481 } TPM2B_PRIVATE_VENDOR_SPECIFIC;
1482 
1483 // Table 187  Definition of TPMU_SENSITIVE_COMPOSITE Union <  IN/OUT, S>
1484 typedef union {
1485 #ifdef TPM_ALG_RSA
1486   TPM2B_PRIVATE_KEY_RSA          rsa;
1487 #endif
1488 #ifdef TPM_ALG_ECC
1489   TPM2B_ECC_PARAMETER            ecc;
1490 #endif
1491 #ifdef TPM_ALG_KEYEDHASH
1492   TPM2B_SENSITIVE_DATA           bits;
1493 #endif
1494 #ifdef TPM_ALG_SYMCIPHER
1495   TPM2B_SYM_KEY                  sym;
1496 #endif
1497   TPM2B_PRIVATE_VENDOR_SPECIFIC  any;
1498 } TPMU_SENSITIVE_COMPOSITE;
1499 
1500 // Table 188  Definition of TPMT_SENSITIVE Structure
1501 typedef struct {
1502   TPMI_ALG_PUBLIC           sensitiveType;
1503   TPM2B_AUTH                authValue;
1504   TPM2B_DIGEST              seedValue;
1505   TPMU_SENSITIVE_COMPOSITE  sensitive;
1506 } TPMT_SENSITIVE;
1507 
1508 // Table 189  Definition of TPM2B_SENSITIVE Structure <  IN/OUT>
1509 typedef union {
1510   struct {
1511     UINT16          size;
1512     TPMT_SENSITIVE  sensitiveArea;
1513   } t;
1514   TPM2B b;
1515 } TPM2B_SENSITIVE;
1516 
1517 // Table 190  Definition of _PRIVATE Structure <>
1518 typedef struct {
1519   TPM2B_DIGEST    integrityOuter;
1520   TPM2B_DIGEST    integrityInner;
1521   TPMT_SENSITIVE  sensitive;
1522 } _PRIVATE;
1523 
1524 // Table 191  Definition of TPM2B_PRIVATE Structure <  IN/OUT, S>
1525 typedef union {
1526   struct {
1527     UINT16  size;
1528     BYTE    buffer[sizeof(_PRIVATE)];
1529   } t;
1530   TPM2B b;
1531 } TPM2B_PRIVATE;
1532 
1533 // Table 192  Definition of _ID_OBJECT Structure <>
1534 typedef struct {
1535   TPM2B_DIGEST  integrityHMAC;
1536   TPM2B_DIGEST  encIdentity;
1537 } _ID_OBJECT;
1538 
1539 // Table 193  Definition of TPM2B_ID_OBJECT Structure <  IN/OUT>
1540 typedef union {
1541   struct {
1542     UINT16  size;
1543     BYTE    credential[sizeof(_ID_OBJECT)];
1544   } t;
1545   TPM2B b;
1546 } TPM2B_ID_OBJECT;
1547 
1548 // Table 194  Definition of TPM_NV_INDEX Bits <>
1549 typedef struct {
1550   UINT32 index : 24;
1551   UINT32 RH_NV : 8;
1552 } TPM_NV_INDEX;
1553 
1554 // Table 195  Definition of TPMA_NV Bits
1555 typedef struct {
1556   UINT32 TPMA_NV_PPWRITE        : 1;
1557   UINT32 TPMA_NV_OWNERWRITE     : 1;
1558   UINT32 TPMA_NV_AUTHWRITE      : 1;
1559   UINT32 TPMA_NV_POLICYWRITE    : 1;
1560   UINT32 TPMA_NV_COUNTER        : 1;
1561   UINT32 TPMA_NV_BITS           : 1;
1562   UINT32 TPMA_NV_EXTEND         : 1;
1563   UINT32 reserved7_9            : 3;
1564   UINT32 TPMA_NV_POLICY_DELETE  : 1;
1565   UINT32 TPMA_NV_WRITELOCKED    : 1;
1566   UINT32 TPMA_NV_WRITEALL       : 1;
1567   UINT32 TPMA_NV_WRITEDEFINE    : 1;
1568   UINT32 TPMA_NV_WRITE_STCLEAR  : 1;
1569   UINT32 TPMA_NV_GLOBALLOCK     : 1;
1570   UINT32 TPMA_NV_PPREAD         : 1;
1571   UINT32 TPMA_NV_OWNERREAD      : 1;
1572   UINT32 TPMA_NV_AUTHREAD       : 1;
1573   UINT32 TPMA_NV_POLICYREAD     : 1;
1574   UINT32 reserved20_24          : 5;
1575   UINT32 TPMA_NV_NO_DA          : 1;
1576   UINT32 TPMA_NV_ORDERLY        : 1;
1577   UINT32 TPMA_NV_CLEAR_STCLEAR  : 1;
1578   UINT32 TPMA_NV_READLOCKED     : 1;
1579   UINT32 TPMA_NV_WRITTEN        : 1;
1580   UINT32 TPMA_NV_PLATFORMCREATE : 1;
1581   UINT32 TPMA_NV_READ_STCLEAR   : 1;
1582 } TPMA_NV;
1583 
1584 // Table 196  Definition of TPMS_NV_PUBLIC Structure
1585 typedef struct {
1586   TPMI_RH_NV_INDEX  nvIndex;
1587   TPMI_ALG_HASH     nameAlg;
1588   TPMA_NV           attributes;
1589   TPM2B_DIGEST      authPolicy;
1590   UINT16            dataSize;
1591 } TPMS_NV_PUBLIC;
1592 
1593 // Table 197  Definition of TPM2B_NV_PUBLIC Structure
1594 typedef union {
1595   struct {
1596     UINT16          size;
1597     TPMS_NV_PUBLIC  nvPublic;
1598   } t;
1599   TPM2B b;
1600 } TPM2B_NV_PUBLIC;
1601 
1602 // Table 198  Definition of TPM2B_CONTEXT_SENSITIVE Structure <  IN/OUT>
1603 typedef union {
1604   struct {
1605     UINT16  size;
1606     BYTE    buffer[MAX_CONTEXT_SIZE];
1607   } t;
1608   TPM2B b;
1609 } TPM2B_CONTEXT_SENSITIVE;
1610 
1611 // Table 199  Definition of TPMS_CONTEXT_DATA Structure <  IN/OUT, S>
1612 typedef struct {
1613   TPM2B_DIGEST             integrity;
1614   TPM2B_CONTEXT_SENSITIVE  encrypted;
1615 } TPMS_CONTEXT_DATA;
1616 
1617 // Table 200  Definition of TPM2B_CONTEXT_DATA Structure <  IN/OUT>
1618 typedef union {
1619   struct {
1620     UINT16  size;
1621     BYTE    buffer[sizeof(TPMS_CONTEXT_DATA)];
1622   } t;
1623   TPM2B b;
1624 } TPM2B_CONTEXT_DATA;
1625 
1626 // Table 201  Definition of TPMS_CONTEXT Structure
1627 typedef struct {
1628   UINT64              sequence;
1629   TPMI_DH_CONTEXT     savedHandle;
1630   TPMI_RH_HIERARCHY   hierarchy;
1631   TPM2B_CONTEXT_DATA  contextBlob;
1632 } TPMS_CONTEXT;
1633 
1634 // Unprocessed: Table 202  Context Handle Values
1635 // Table 203  Definition of TPMS_CREATION_DATA Structure <  OUT>
1636 typedef struct {
1637   TPML_PCR_SELECTION  pcrSelect;
1638   TPM2B_DIGEST        pcrDigest;
1639   TPMA_LOCALITY       locality;
1640   TPM_ALG_ID          parentNameAlg;
1641   TPM2B_NAME          parentName;
1642   TPM2B_NAME          parentQualifiedName;
1643   TPM2B_DATA          outsideInfo;
1644 } TPMS_CREATION_DATA;
1645 
1646 // Table 204  Definition of TPM2B_CREATION_DATA Structure <  OUT>
1647 typedef union {
1648   struct {
1649     UINT16              size;
1650     TPMS_CREATION_DATA  creationData;
1651   } t;
1652   TPM2B b;
1653 } TPM2B_CREATION_DATA;
1654 
1655 
1656 #endif  // TPM2_TPM_TYPES_H_
1657