1 #ifndef __TPM2_TYPES_H__
2 #define __TPM2_TYPES_H__
3 
4 #include <stdlib.h>
5 #include <stdint.h>
6 #include "common_types.h"
7 
8 // "implementation.h"
9 // Table 212 -- Logic Values
10 #define    YES      1
11 #define    NO       0
12 #ifndef    TRUE
13 #define    TRUE     1
14 #endif
15 #ifndef    FALSE
16 #define    FALSE    0
17 #endif
18 #ifndef    true
19 #define    true     1
20 #endif
21 #ifndef    false
22 #define    false    0
23 #endif
24 #define    SET      1
25 #define    CLEAR    0
26 
27 
28 // Table 214 -- Implemented Algorithms
29 #define    ALG_RSA               YES    // 1
30 #define    ALG_DES               NO     // 0
31 #define    ALG__3DES             NO     // 0
32 #define    ALG_SHA1              YES    // 1
33 #define    ALG_HMAC              YES    // 1
34 #define    ALG_AES               YES    // 1
35 #define    ALG_MGF1              YES    // 1
36 #define    ALG_XOR               YES    // 1
37 #define    ALG_KEYEDHASH         YES    // 1
38 #define    ALG_SHA256            YES    // 1
39 #define    ALG_SHA384            YES    // 0
40 #define    ALG_SHA512            YES    // 0
41 #define    ALG_WHIRLPOOL512      YES    // 0
42 #define    ALG_SM3_256           YES    // 1
43 #define    ALG_SM4               YES    // 1
44 #define    ALG_RSASSA            YES    // 1
45 #define    ALG_RSAES             YES    // 1
46 #define    ALG_RSAPSS            YES    // 1
47 #define    ALG_OAEP              YES    // 1
48 #define    ALG_ECC               YES    // 1
49 #define    ALG_CFB               YES    // 1
50 #define    ALG_ECDH              YES    // 1
51 #define    ALG_ECDSA             YES    // 1
52 #define    ALG_ECDAA             YES    // 1
53 #define    ALG_SM2               YES    // 1
54 #define    ALG_ECSCHNORR         YES    // 1
55 #define    ALG_SYMCIPHER         YES    // 1
56 #define    ALG_KDF1_SP800_56a    YES    // 1
57 #define    ALG_KDF2              NO     // 0
58 #define    ALG_KDF1_SP800_108    YES    // 1
59 #define    ALG_CTR               YES    // 1
60 #define    ALG_OFB               YES    // 1
61 #define    ALG_CBC               YES    // 1
62 
63 #define HASH_COUNT (ALG_SHA1+ALG_SHA256+ALG_SHA384+ALG_SHA512+ALG_WHIRLPOOL512+ALG_SM3_256)
64 
65 // Table 216 -- RSA Algorithm Constants
66 #define    RSA_KEY_SIZES_BITS    2048    // {1024,2048}
67 #define    MAX_RSA_KEY_BITS      2048
68 #define    MAX_RSA_KEY_BYTES     ((MAX_RSA_KEY_BITS + 7) / 8)    // 256
69 
70 // Table 218 -- AES Algorithm Constants
71 #define    AES_KEY_SIZES_BITS          128
72 #define    MAX_AES_KEY_BITS            128
73 #define    MAX_AES_BLOCK_SIZE_BYTES    16
74 #define    MAX_AES_KEY_BYTES           ((MAX_AES_KEY_BITS + 7) / 8)    // 16
75 
76 
77 // Table 220 -- Symmetric Algorithm Constants
78 #define    MAX_SYM_KEY_BITS      MAX_AES_KEY_BITS    // 128
79 #define    MAX_SYM_KEY_BYTES     MAX_AES_KEY_BYTES    // 16
80 #define    MAX_SYM_BLOCK_SIZE    MAX_AES_BLOCK_SIZE_BYTES    // 16
81 
82 #define    MAX_SYM_DATA         128
83 #define    MAX_ECC_KEY_BITS     256
84 #define    MAX_ECC_KEY_BYTES    ((MAX_ECC_KEY_BITS + 7) / 8)
85 
86 // TPM2 command code
87 
88 typedef UINT32 TPM_CC;
89 #define    TPM_CC_FIRST                         (TPM_CC)(0x0000011F)
90 #define    TPM_CC_PP_FIRST                      (TPM_CC)(0x0000011F)
91 #define    TPM_CC_NV_UndefineSpaceSpecial       (TPM_CC)(0x0000011F)
92 #define    TPM_CC_EvictControl                  (TPM_CC)(0x00000120)
93 #define    TPM_CC_HierarchyControl              (TPM_CC)(0x00000121)
94 #define    TPM_CC_NV_UndefineSpace              (TPM_CC)(0x00000122)
95 #define    TPM_CC_ChangeEPS                     (TPM_CC)(0x00000124)
96 #define    TPM_CC_ChangePPS                     (TPM_CC)(0x00000125)
97 #define    TPM_CC_Clear                         (TPM_CC)(0x00000126)
98 #define    TPM_CC_ClearControl                  (TPM_CC)(0x00000127)
99 #define    TPM_CC_ClockSet                      (TPM_CC)(0x00000128)
100 #define    TPM_CC_HierarchyChangeAuth           (TPM_CC)(0x00000129)
101 #define    TPM_CC_NV_DefineSpace                (TPM_CC)(0x0000012A)
102 #define    TPM_CC_PCR_Allocate                  (TPM_CC)(0x0000012B)
103 #define    TPM_CC_PCR_SetAuthPolicy             (TPM_CC)(0x0000012C)
104 #define    TPM_CC_PP_Commands                   (TPM_CC)(0x0000012D)
105 #define    TPM_CC_SetPrimaryPolicy              (TPM_CC)(0x0000012E)
106 #define    TPM_CC_FieldUpgradeStart             (TPM_CC)(0x0000012F)
107 #define    TPM_CC_ClockRateAdjust               (TPM_CC)(0x00000130)
108 #define    TPM_CC_CreatePrimary                 (TPM_CC)(0x00000131)
109 #define    TPM_CC_NV_GlobalWriteLock            (TPM_CC)(0x00000132)
110 #define    TPM_CC_PP_LAST                       (TPM_CC)(0x00000132)
111 #define    TPM_CC_GetCommandAuditDigest         (TPM_CC)(0x00000133)
112 #define    TPM_CC_NV_Increment                  (TPM_CC)(0x00000134)
113 #define    TPM_CC_NV_SetBits                    (TPM_CC)(0x00000135)
114 #define    TPM_CC_NV_Extend                     (TPM_CC)(0x00000136)
115 #define    TPM_CC_NV_Write                      (TPM_CC)(0x00000137)
116 #define    TPM_CC_NV_WriteLock                  (TPM_CC)(0x00000138)
117 #define    TPM_CC_DictionaryAttackLockReset     (TPM_CC)(0x00000139)
118 #define    TPM_CC_DictionaryAttackParameters    (TPM_CC)(0x0000013A)
119 #define    TPM_CC_NV_ChangeAuth                 (TPM_CC)(0x0000013B)
120 #define    TPM_CC_PCR_Event                     (TPM_CC)(0x0000013C)
121 #define    TPM_CC_PCR_Reset                     (TPM_CC)(0x0000013D)
122 #define    TPM_CC_SequenceComplete              (TPM_CC)(0x0000013E)
123 #define    TPM_CC_SetAlgorithmSet               (TPM_CC)(0x0000013F)
124 #define    TPM_CC_SetCommandCodeAuditStatus     (TPM_CC)(0x00000140)
125 #define    TPM_CC_FieldUpgradeData              (TPM_CC)(0x00000141)
126 #define    TPM_CC_IncrementalSelfTest           (TPM_CC)(0x00000142)
127 #define    TPM_CC_SelfTest                      (TPM_CC)(0x00000143)
128 #define    TPM_CC_Startup                       (TPM_CC)(0x00000144)
129 #define    TPM_CC_Shutdown                      (TPM_CC)(0x00000145)
130 #define    TPM_CC_StirRandom                    (TPM_CC)(0x00000146)
131 #define    TPM_CC_ActivateCredential            (TPM_CC)(0x00000147)
132 #define    TPM_CC_Certify                       (TPM_CC)(0x00000148)
133 #define    TPM_CC_PolicyNV                      (TPM_CC)(0x00000149)
134 #define    TPM_CC_CertifyCreation               (TPM_CC)(0x0000014A)
135 #define    TPM_CC_Duplicate                     (TPM_CC)(0x0000014B)
136 #define    TPM_CC_GetTime                       (TPM_CC)(0x0000014C)
137 #define    TPM_CC_GetSessionAuditDigest         (TPM_CC)(0x0000014D)
138 #define    TPM_CC_NV_Read                       (TPM_CC)(0x0000014E)
139 #define    TPM_CC_NV_ReadLock                   (TPM_CC)(0x0000014F)
140 #define    TPM_CC_ObjectChangeAuth              (TPM_CC)(0x00000150)
141 #define    TPM_CC_PolicySecret                  (TPM_CC)(0x00000151)
142 #define    TPM_CC_Rewrap                        (TPM_CC)(0x00000152)
143 #define    TPM_CC_Create                        (TPM_CC)(0x00000153)
144 #define    TPM_CC_ECDH_ZGen                     (TPM_CC)(0x00000154)
145 #define    TPM_CC_HMAC                          (TPM_CC)(0x00000155)
146 #define    TPM_CC_Import                        (TPM_CC)(0x00000156)
147 #define    TPM_CC_Load                          (TPM_CC)(0x00000157)
148 #define    TPM_CC_Quote                         (TPM_CC)(0x00000158)
149 #define    TPM_CC_RSA_Decrypt                   (TPM_CC)(0x00000159)
150 #define    TPM_CC_HMAC_Start                    (TPM_CC)(0x0000015B)
151 #define    TPM_CC_SequenceUpdate                (TPM_CC)(0x0000015C)
152 #define    TPM_CC_Sign                          (TPM_CC)(0x0000015D)
153 #define    TPM_CC_Unseal                        (TPM_CC)(0x0000015E)
154 #define    TPM_CC_PolicySigned                  (TPM_CC)(0x00000160)
155 #define    TPM_CC_ContextLoad                   (TPM_CC)(0x00000161)
156 #define    TPM_CC_ContextSave                   (TPM_CC)(0x00000162)
157 #define    TPM_CC_ECDH_KeyGen                   (TPM_CC)(0x00000163)
158 #define    TPM_CC_EncryptDecrypt                (TPM_CC)(0x00000164)
159 #define    TPM_CC_FlushContext                  (TPM_CC)(0x00000165)
160 #define    TPM_CC_LoadExternal                  (TPM_CC)(0x00000167)
161 #define    TPM_CC_MakeCredential                (TPM_CC)(0x00000168)
162 #define    TPM_CC_NV_ReadPublic                 (TPM_CC)(0x00000169)
163 #define    TPM_CC_PolicyAuthorize               (TPM_CC)(0x0000016A)
164 #define    TPM_CC_PolicyAuthValue               (TPM_CC)(0x0000016B)
165 #define    TPM_CC_PolicyCommandCode             (TPM_CC)(0x0000016C)
166 #define    TPM_CC_PolicyCounterTimer            (TPM_CC)(0x0000016D)
167 #define    TPM_CC_PolicyCpHash                  (TPM_CC)(0x0000016E)
168 #define    TPM_CC_PolicyLocality                (TPM_CC)(0x0000016F)
169 #define    TPM_CC_PolicyNameHash                (TPM_CC)(0x00000170)
170 #define    TPM_CC_PolicyOR                      (TPM_CC)(0x00000171)
171 #define    TPM_CC_PolicyTicket                  (TPM_CC)(0x00000172)
172 #define    TPM_CC_ReadPublic                    (TPM_CC)(0x00000173)
173 #define    TPM_CC_RSA_Encrypt                   (TPM_CC)(0x00000174)
174 #define    TPM_CC_StartAuthSession              (TPM_CC)(0x00000176)
175 #define    TPM_CC_VerifySignature               (TPM_CC)(0x00000177)
176 #define    TPM_CC_ECC_Parameters                (TPM_CC)(0x00000178)
177 #define    TPM_CC_FirmwareRead                  (TPM_CC)(0x00000179)
178 #define    TPM_CC_GetCapability                 (TPM_CC)(0x0000017A)
179 #define    TPM_CC_GetRandom                     (TPM_CC)(0x0000017B)
180 #define    TPM_CC_GetTestResult                 (TPM_CC)(0x0000017C)
181 #define    TPM_CC_Hash                          (TPM_CC)(0x0000017D)
182 #define    TPM_CC_PCR_Read                      (TPM_CC)(0x0000017E)
183 #define    TPM_CC_PolicyPCR                     (TPM_CC)(0x0000017F)
184 #define    TPM_CC_PolicyRestart                 (TPM_CC)(0x00000180)
185 #define    TPM_CC_ReadClock                     (TPM_CC)(0x00000181)
186 #define    TPM_CC_PCR_Extend                    (TPM_CC)(0x00000182)
187 #define    TPM_CC_PCR_SetAuthValue              (TPM_CC)(0x00000183)
188 #define    TPM_CC_NV_Certify                    (TPM_CC)(0x00000184)
189 #define    TPM_CC_EventSequenceComplete         (TPM_CC)(0x00000185)
190 #define    TPM_CC_HashSequenceStart             (TPM_CC)(0x00000186)
191 #define    TPM_CC_PolicyPhysicalPresence        (TPM_CC)(0x00000187)
192 #define    TPM_CC_PolicyDuplicationSelect       (TPM_CC)(0x00000188)
193 #define    TPM_CC_PolicyGetDigest               (TPM_CC)(0x00000189)
194 #define    TPM_CC_TestParms                     (TPM_CC)(0x0000018A)
195 #define    TPM_CC_Commit                        (TPM_CC)(0x0000018B)
196 #define    TPM_CC_PolicyPassword                (TPM_CC)(0x0000018C)
197 #define    TPM_CC_SM2_ZGen                      (TPM_CC)(0x0000018D)
198 #define    TPM_CC_LAST                          (TPM_CC)(0x0000018D)
199 
200 
201 //TPM_RC
202 typedef UINT32 TPM_RC;
203 
204 // TPM_ST Constants
205 typedef UINT16 TPM_ST;
206 #define    TPM_ST_NULL                    (TPM_ST)(0X8000)
207 #define    TPM_ST_NO_SESSIONS             (TPM_ST)(0x8001)
208 #define    TPM_ST_SESSIONS                (TPM_ST)(0x8002)
209 
210 
211 // TPM Handle types
212 typedef UINT32 TPM2_HANDLE;
213 typedef UINT8 TPM_HT;
214 
215 
216 // TPM_RH Constants
217 typedef UINT32 TPM_RH;
218 
219 #define    TPM_RH_FIRST          (TPM_RH)(0x40000000)
220 #define    TPM_RH_SRK            (TPM_RH)(0x40000000)
221 #define    TPM_RH_OWNER          (TPM_RH)(0x40000001)
222 #define    TPM_RS_PW             (TPM_RH)(0x40000009)
223 #define    TPM_RH_LOCKOUT        (TPM_RH)(0x4000000A)
224 #define    TPM_RH_ENDORSEMENT    (TPM_RH)(0x4000000B)
225 #define    TPM_RH_PLATFORM       (TPM_RH)(0x4000000C)
226 #define    TPM_RH_LAST           (TPM_RH)(0x4000000C)
227 
228 // Table 4 -- DocumentationClarity Types <I/O>
229 typedef UINT32    TPM_MODIFIER_INDICATOR;
230 typedef UINT32    TPM_SESSION_OFFSET;
231 typedef UINT16    TPM_KEY_SIZE;
232 typedef UINT16    TPM_KEY_BITS;
233 typedef UINT64    TPM_SYSTEM_ADDRESS;
234 typedef UINT32    TPM_SPEC;
235 
236 // Table 29 -- TPMA_ALGORITHM Bits <I/O>
237 typedef struct {
238     unsigned int asymmetric:1;
239     unsigned int symmetric:1;
240     unsigned int hash:1;
241     unsigned int object:1;
242     unsigned int reserved5:4;
243     unsigned int signing:1;
244     unsigned int encrypting:1;
245     unsigned int method:1;
246     unsigned int reserved9:21;
247 } TPMA_ALGORITHM;
248 
249 typedef UINT32 TPMA_OBJECT;
250 typedef BYTE TPMA_SESSION;
251 typedef BYTE TPMA_LOCALITY;
252 
253 // Table 37 -- TPMI_YES_NO Type <I/O>
254 typedef BYTE TPMI_YES_NO;
255 
256 // Table 38 -- TPMI_DH_OBJECT Type <I/O>
257 typedef TPM2_HANDLE TPMI_DH_OBJECT;
258 
259 // Table 39 -- TPMI_DH_PERSISTENT Type <I/O>
260 typedef TPM2_HANDLE TPMI_DH_PERSISTENT;
261 
262 // Table 42 -- TPMI_SH_AUTH_SESSION Type <I/O>
263 typedef TPM2_HANDLE TPMI_SH_AUTH_SESSION;
264 
265 // Table 40 -- TPMI_DH_ENTITY Type <I>
266 typedef TPM2_HANDLE TPMI_DH_ENTITY;
267 
268 // Table 45 -- TPMI_DH_CONTEXT Type <I/O>
269 typedef TPM2_HANDLE TPMI_DH_CONTEXT;
270 
271 // Table 46 -- TPMI_RH_HIERARCHY Type <I/O>
272 typedef TPM2_HANDLE TPMI_RH_HIERARCHY;
273 
274 // Table 47 -- TPM2I_RH_HIERARCHY_AUTH Type <I>
275 typedef TPM2_HANDLE TPM2I_RH_HIERARCHY_AUTH;
276 
277 // Table 48 -- TPMI_RH_PLATFORM Type <I>
278 typedef TPM2_HANDLE TPMI_RH_PLATFORM;
279 
280 // Table 49 -- TPMI_RH_OWNER Type <I>
281 typedef TPM2_HANDLE TPMI_RH_OWNER;
282 
283 // Table 50 -- TPMI_RH_ENDORSEMENT Type <I>
284 typedef TPM2_HANDLE TPMI_RH_ENDORSEMENT;
285 
286 // Table 51 -- TPMI_RH_PROVISION Type <I>
287 typedef TPM2_HANDLE TPMI_RH_PROVISION;
288 
289 // Table 52 -- TPMI_RH_CLEAR Type <I>
290 typedef TPM2_HANDLE TPMI_RH_CLEAR;
291 
292 // Table 54 -- TPMI_RH_LOCKOUT Type <I>
293 typedef TPM2_HANDLE TPMI_RH_LOCKOUT;
294 
295 // Table 7 -- TPM_ALG_ID
296 typedef UINT16 TPM_ALG_ID;
297 
298 #define    TPM2_ALG_ERROR             (TPM_ALG_ID)(0x0000) // a: ; D:
299 #define    TPM2_ALG_FIRST             (TPM_ALG_ID)(0x0001) // a: ; D:
300 #if ALG_RSA == YES || ALG_ALL == YES
301 #define    TPM2_ALG_RSA               (TPM_ALG_ID)(0x0001) // a: A O; D:
302 #endif
303 #if ALG_DES == YES || ALG_ALL == YES
304 #define    TPM2_ALG_DES               (TPM_ALG_ID)(0x0002) // a: S; D:
305 #endif
306 #define    TPM2_ALG_SHA1              (TPM_ALG_ID)(0x0004) // a: H; D:
307 #if ALG_HMAC == YES || ALG_ALL == YES
308 #define    TPM2_ALG_HMAC              (TPM_ALG_ID)(0x0005) // a: H X; D:
309 #endif
310 #if ALG_AES == YES || ALG_ALL == YES
311 #define    TPM2_ALG_AES               (TPM_ALG_ID)(0x0006) // a: S; D:
312 #endif
313 #if ALG_XOR == YES || ALG_ALL == YES
314 #define    TPM2_ALG_XOR               (TPM_ALG_ID)(0x000A) // a: H S; D:
315 #endif
316 #if ALG_MGF1 == YES || ALG_ALL == YES
317 #define    TPM2_ALG_MGF1              (TPM_ALG_ID)(0x0007) // a: H M; D:
318 #endif
319 #if ALG_KEYEDHASH == YES || ALG_ALL == YES
320 #define    TPM2_ALG_KEYEDHASH         (TPM_ALG_ID)(0x0008) // a: H E X O; D:
321 #endif
322 #if ALG_SHA256 == YES || ALG_ALL == YES
323 #define    TPM2_ALG_SHA256            (TPM_ALG_ID)(0x000B) // a: H; D:
324 #endif
325 #define    TPM2_ALG_NULL              (TPM_ALG_ID)(0x0010) // a: ; D:
326 #if ALG_OAEP == YES || ALG_ALL == YES
327 #define    TPM2_ALG_OAEP              (TPM_ALG_ID)(0x0017) // a: A E; D: RSA
328 #endif
329 #if ALG_ECC == YES || ALG_ALL == YES
330 #define    TPM2_ALG_ECC               (TPM_ALG_ID)(0x0023) // a: A O; D:
331 #endif
332 #if ALG_SM4 == YES || ALG_ALL == YES
333 #define    TPM2_ALG_SM4               (TPM_ALG_ID)(0x0013) // a: S; D:
334 #endif
335 #if ALG_SYMCIPHER == YES || ALG_ALL == YES
336 #define    TPM2_ALG_SYMCIPHER         (TPM_ALG_ID)(0x0025) // a: O; D:
337 #endif
338 #if ALG_CFB == YES || ALG_ALL == YES
339 #define    TPM2_ALG_CFB               (TPM_ALG_ID)(0x0043) // a: S E; D:
340 #endif
341 #define    TPM2_ALG_LAST              (TPM_ALG_ID)(0x0044)
342 
343 #define    SHA1_DIGEST_SIZE      20
344 #define    SHA1_BLOCK_SIZE       64
345 #define    SHA256_DIGEST_SIZE    32
346 #define    SHA256_BLOCK_SIZE     64
347 
348 // Table 57 -- TPMI_ALG_ASYM Type <I/O>
349 typedef TPM_ALG_ID TPMI_ALG_ASYM;
350 
351 // Table 56 -- TPMI_ALG_HASH Type <I/O>
352 typedef TPM_ALG_ID TPMI_ALG_HASH;
353 
354 // Table 58 -- TPMI_ALG_SYM Type <I/O>
355 typedef TPM_ALG_ID TPMI_ALG_SYM;
356 
357 // Table 59 -- TPMI_ALG_SYM_OBJECT Type <I/O>
358 typedef TPM_ALG_ID TPMI_ALG_SYM_OBJECT;
359 
360 // Table 60 -- TPMI_ALG_SYM_MODE Type <I/O>
361 typedef TPM_ALG_ID TPMI_ALG_SYM_MODE;
362 
363 // Table 61 -- TPMI_ALG_KDF Type <I/O>
364 typedef TPM_ALG_ID TPMI_ALG_KDF;
365 
366 // Table 62 -- TPMI_ALG_SIG_SCHEME Type <I/O>
367 typedef TPM_ALG_ID TPMI_ALG_SIG_SCHEME;
368 
369 // Table 65 -- TPMU_HA Union <I/O,S>
370 typedef union {
371 #ifdef TPM2_ALG_SHA1
372     BYTE  sha1[SHA1_DIGEST_SIZE];
373 #endif
374 #ifdef TPM2_ALG_SHA256
375     BYTE  sha256[SHA256_DIGEST_SIZE];
376 #endif
377 #ifdef TPM2_ALG_SM3_256
378     BYTE  sm3_256[SM3_256_DIGEST_SIZE];
379 #endif
380 #ifdef TPM2_ALG_SHA384
381     BYTE  sha384[SHA384_DIGEST_SIZE];
382 #endif
383 #ifdef TPM2_ALG_SHA512
384     BYTE  sha512[SHA512_DIGEST_SIZE];
385 #endif
386 #ifdef TPM2_ALG_WHIRLPOOL512
387     BYTE  whirlpool[WHIRLPOOL512_DIGEST_SIZE];
388 #endif
389 
390 } TPMU_HA;
391 
392 // Table 67 -- TPM2B_DIGEST Structure <I/O>
393 typedef struct {
394     UINT16    size;
395     BYTE      buffer[sizeof(TPMU_HA)];
396 } TPM2B_DIGEST;
397 
398 // Table 69 -- TPM2B_NONCE Types <I/O>
399 typedef TPM2B_DIGEST    TPM2B_NONCE;
400 
401 typedef TPM2B_DIGEST    TPM2B_DATA;
402 
403 // Table 70 -- TPM2B_AUTH Types <I/O>
404 typedef TPM2B_DIGEST    TPM2B_AUTH;
405 
406 // Table 71 -- TPM2B_OPERAND Types <I/O>
407 typedef TPM2B_DIGEST    TPM2B_OPERAND;
408 
409 // Table 66 -- TPMT_HA Structure <I/O>
410 typedef struct {
411     TPMI_ALG_HASH    hashAlg;
412     TPMU_HA          digest;
413 } TPMT_HA;
414 
415 //Table 80 -- TPM2B_NAME Structure
416 typedef struct {
417     UINT16 size;
418     BYTE name[sizeof(TPMT_HA)];
419 } TPM2B_NAME;
420 
421 #define    IMPLEMENTATION_PCR   24
422 #define    PLATFORM_PCR         24
423 #define    PCR_SELECT_MAX       ((IMPLEMENTATION_PCR+7)/8)
424 #define    PCR_SELECT_NUM(x)    (uint8_t)(x/8)
425 #define    PCR_SELECT_VALUE(x)  (uint8_t)(0x1)<<(x%8)
426 
427 //Table 79 -- TPMS_PCR_SELECT Structure <I/O>
428 typedef struct {
429     UINT8    sizeofSelect;
430     BYTE     pcrSelect[PCR_SELECT_MAX];
431 } TPMS_PCR_SELECT;
432 
433 // Table 80 -- TPMS_PCR_SELECTION Structure <I/O>
434 typedef struct {
435     TPMI_ALG_HASH    hash;
436     UINT8            sizeofSelect;
437     BYTE             pcrSelect[PCR_SELECT_MAX];
438 } TPMS_PCR_SELECTION;
439 
440 // Table 83 -- TPMT_TK_CREATION Structure <I/O>
441 typedef struct {
442     TPM_ST               tag;
443     TPMI_RH_HIERARCHY    hierarchy;
444     TPM2B_DIGEST         digest;
445 } TPMT_TK_CREATION;
446 
447 // Table 96 -- Definition of TPML_DIGEST Structure <I/O>
448 typedef struct {
449     UINT32               count;
450     TPM2B_DIGEST         digests[8];
451 }TPML_DIGEST;
452 
453 // Table 97 -- TPML_PCR_SELECTION Structure <I/O>
454 typedef struct {
455     UINT32                count;
456     TPMS_PCR_SELECTION    pcrSelections[HASH_COUNT];
457 } TPML_PCR_SELECTION;
458 
459 // Table 119 -- TPMI_AES_KEY_BITS Type <I/O>
460 typedef TPM_KEY_BITS TPMI_AES_KEY_BITS;
461 
462 // Table 120 -- TPMI_SM4_KEY_BITS Type <I/O>
463 typedef TPM_KEY_BITS TPMI_SM4_KEY_BITS;
464 
465 // Table 121 -- TPMU_SYM_KEY_BITS Union <I/O>
466 typedef union {
467 #ifdef TPM2_ALG_AES
468     TPMI_AES_KEY_BITS  aes;
469 #endif
470 #ifdef TPM2_ALG_SM4
471     TPMI_SM4_KEY_BITS  SM4;
472 #endif
473     TPM_KEY_BITS  sym;
474 #ifdef TPM2_ALG_XOR
475     TPMI_ALG_HASH  xor;
476 #endif
477 
478 } TPMU_SYM_KEY_BITS;
479 
480 // Table 122 -- TPMU_SYM_MODE Union <I/O>
481 typedef union {
482 #ifdef TPM2_ALG_AES
483     TPMI_ALG_SYM_MODE  aes;
484 #endif
485 #ifdef TPM2_ALG_SM4
486     TPMI_ALG_SYM_MODE  SM4;
487 #endif
488     TPMI_ALG_SYM_MODE  sym;
489 } TPMU_SYM_MODE ;
490 
491 // Table 124 -- TPMT_SYM_DEF Structure <I/O>
492 typedef struct {
493     TPMI_ALG_SYM         algorithm;
494     TPMU_SYM_KEY_BITS    keyBits;
495     TPMU_SYM_MODE        mode;
496 } TPMT_SYM_DEF;
497 
498 // Table 125 -- TPMT_SYM_DEF_OBJECT Structure <I/O>
499 typedef struct {
500     TPMI_ALG_SYM_OBJECT    algorithm;
501     TPMU_SYM_KEY_BITS      keyBits;
502     TPMU_SYM_MODE          mode;
503 } TPMT_SYM_DEF_OBJECT;
504 
505 // Table 126 -- TPM2B_SYM_KEY Structure <I/O>
506 typedef struct {
507     UINT16    size;
508     BYTE      buffer[MAX_SYM_KEY_BYTES];
509 } TPM2B_SYM_KEY;
510 
511 // Table 127 -- TPMS_SYMCIPHER_PARMS Structure <I/O>
512 typedef struct {
513     TPMT_SYM_DEF_OBJECT    sym;
514 } TPMS_SYMCIPHER_PARMS;
515 
516 // Table 128 -- TPM2B_SENSITIVE_DATA Structure <I/O>
517 typedef struct {
518     UINT16    size;
519     BYTE      buffer[MAX_SYM_DATA];
520 } TPM2B_SENSITIVE_DATA;
521 
522 // Table 129 -- TPMS_SENSITIVE_CREATE Structure <I>
523 typedef struct {
524     TPM2B_AUTH              userAuth;
525     TPM2B_SENSITIVE_DATA    data;
526 } TPMS_SENSITIVE_CREATE;
527 
528 // Table 130 -- TPM2B_SENSITIVE_CREATE Structure <I,S>
529 typedef struct {
530     UINT16                   size;
531     TPMS_SENSITIVE_CREATE    sensitive;
532 } TPM2B_SENSITIVE_CREATE;
533 
534 // Table 131 -- TPMS_SCHEME_SIGHASH Structure <I/O>
535 typedef struct {
536     TPMI_ALG_HASH    hashAlg;
537 } TPMS_SCHEME_SIGHASH;
538 
539 // Table 132 -- TPMI_ALG_KEYEDHASH_SCHEME Type <I/O>
540 typedef TPM_ALG_ID TPMI_ALG_KEYEDHASH_SCHEME;
541 
542 // Table 133 -- HMAC_SIG_SCHEME Types <I/O>
543 typedef TPMS_SCHEME_SIGHASH    TPMS_SCHEME_HMAC;
544 
545 // Table 134 -- TPMS_SCHEME_XOR Structure <I/O>
546 typedef struct {
547     TPMI_ALG_HASH    hashAlg;
548     TPMI_ALG_KDF     kdf;
549 } TPMS_SCHEME_XOR;
550 
551 // Table 135 -- TPMU_SCHEME_KEYEDHASH Union <I/O,S>
552 typedef union {
553 #ifdef TPM2_ALG_HMAC
554     TPMS_SCHEME_HMAC  hmac;
555 #endif
556 #ifdef TPM2_ALG_XOR
557     TPMS_SCHEME_XOR  xor;
558 #endif
559 
560 } TPMU_SCHEME_KEYEDHASH ;
561 
562 // Table 136 -- TPMT_KEYEDHASH_SCHEME Structure <I/O>
563 typedef struct {
564     TPMI_ALG_KEYEDHASH_SCHEME    scheme;
565     TPMU_SCHEME_KEYEDHASH        details;
566 } TPMT_KEYEDHASH_SCHEME;
567 
568 // Table 137 -- RSA_SIG_SCHEMES Types <I/O>
569 typedef TPMS_SCHEME_SIGHASH    TPMS_SCHEME_RSASSA;
570 typedef TPMS_SCHEME_SIGHASH    TPMS_SCHEME_RSAPSS;
571 
572 // Table 138 -- ECC_SIG_SCHEMES Types <I/O>
573 typedef TPMS_SCHEME_SIGHASH    TPMS_SCHEME_ECDSA;
574 typedef TPMS_SCHEME_SIGHASH    TPMS_SCHEME_SM2;
575 
576 // Table 139 -- TPMS_SCHEME_ECDAA Structure <I/O>
577 typedef struct {
578     TPMI_ALG_HASH    hashAlg;
579     UINT16           count;
580 } TPMS_SCHEME_ECDAA;
581 
582 // Table 140 -- TPMS_SCHEME_ECSCHNORR Structure <I/O>
583 typedef struct {
584     TPMI_ALG_HASH    hashAlg;
585     UINT16           count;
586 } TPMS_SCHEME_ECSCHNORR;
587 
588 // Table 141 -- TPMU_SIG_SCHEME Union <I/O,S>
589 typedef union {
590 #ifdef TPM2_ALG_RSASSA
591     TPMS_SCHEME_RSASSA  rsassa;
592 #endif
593 #ifdef TPM2_ALG_RSAPSS
594     TPMS_SCHEME_RSAPSS  rsapss;
595 #endif
596 #ifdef TPM2_ALG_ECDSA
597     TPMS_SCHEME_ECDSA  ecdsa;
598 #endif
599 #ifdef TPM2_ALG_SM2
600     TPMS_SCHEME_SM2  sm2;
601 #endif
602 #ifdef TPM2_ALG_ECDAA
603     TPMS_SCHEME_ECDAA  ecdaa;
604 #endif
605 #ifdef TPM2_ALG_ECSCHNORR
606     TPMS_SCHEME_ECSCHNORR  ecSchnorr;
607 #endif
608 #ifdef TPM2_ALG_HMAC
609     TPMS_SCHEME_HMAC  hmac;
610 #endif
611     TPMS_SCHEME_SIGHASH  any;
612 } TPMU_SIG_SCHEME;
613 
614 // Table 142 -- TPMT_SIG_SCHEME Structure <I/O>
615 typedef struct {
616     TPMI_ALG_SIG_SCHEME    scheme;
617     TPMU_SIG_SCHEME        details;
618 } TPMT_SIG_SCHEME;
619 
620 // Table 143 -- TPMS_SCHEME_OAEP Structure <I/O>
621 typedef struct {
622     TPMI_ALG_HASH    hashAlg;
623 } TPMS_SCHEME_OAEP;
624 
625 // Table 144 -- TPMS_SCHEME_ECDH Structure <I/O>
626 typedef struct {
627     TPMI_ALG_HASH    hashAlg;
628 } TPMS_SCHEME_ECDH;
629 
630 // Table 145 -- TPMS_SCHEME_MGF1 Structure <I/O>
631 typedef struct {
632     TPMI_ALG_HASH    hashAlg;
633 } TPMS_SCHEME_MGF1;
634 
635 // Table 146 -- TPMS_SCHEME_KDF1_SP800_56a Structure <I/O>
636 typedef struct {
637     TPMI_ALG_HASH    hashAlg;
638 } TPMS_SCHEME_KDF1_SP800_56a;
639 
640 // Table 147 -- TPMS_SCHEME_KDF2 Structure <I/O>
641 typedef struct {
642     TPMI_ALG_HASH    hashAlg;
643 } TPMS_SCHEME_KDF2;
644 
645 // Table 148 -- TPMS_SCHEME_KDF1_SP800_108 Structure <I/O>
646 typedef struct {
647     TPMI_ALG_HASH    hashAlg;
648 } TPMS_SCHEME_KDF1_SP800_108;
649 
650 // Table 149 -- TPMU_KDF_SCHEME Union <I/O,S>
651 typedef union {
652 #ifdef TPM2_ALG_MGF1
653     TPMS_SCHEME_MGF1  mgf1;
654 #endif
655 #ifdef TPM2_ALG_KDF1_SP800_56a
656     TPMS_SCHEME_KDF1_SP800_56a  kdf1_SP800_56a;
657 #endif
658 #ifdef TPM2_ALG_KDF2
659     TPMS_SCHEME_KDF2  kdf2;
660 #endif
661 #ifdef TPM2_ALG_KDF1_SP800_108
662     TPMS_SCHEME_KDF1_SP800_108  kdf1_sp800_108;
663 #endif
664 
665 } TPMU_KDF_SCHEME;
666 
667 // Table 150 -- TPMT_KDF_SCHEME Structure <I/O>
668 typedef struct {
669     TPMI_ALG_KDF       scheme;
670     TPMU_KDF_SCHEME    details;
671 } TPMT_KDF_SCHEME;
672 typedef TPM_ALG_ID TPMI_ALG_ASYM_SCHEME;
673 
674 // Table 152 -- TPMU_ASYM_SCHEME Union <I/O>
675 typedef union {
676 #ifdef TPM2_ALG_RSASSA
677     TPMS_SCHEME_RSASSA  rsassa;
678 #endif
679 #ifdef TPM2_ALG_RSAPSS
680     TPMS_SCHEME_RSAPSS  rsapss;
681 #endif
682 #ifdef TPM2_ALG_OAEP
683     TPMS_SCHEME_OAEP  oaep;
684 #endif
685 #ifdef TPM2_ALG_ECDSA
686     TPMS_SCHEME_ECDSA  ecdsa;
687 #endif
688 #ifdef TPM2_ALG_SM2
689     TPMS_SCHEME_SM2  sm2;
690 #endif
691 #ifdef TPM2_ALG_ECDAA
692     TPMS_SCHEME_ECDAA  ecdaa;
693 #endif
694 #ifdef TPM2_ALG_ECSCHNORR
695     TPMS_SCHEME_ECSCHNORR  ecSchnorr;
696 #endif
697     TPMS_SCHEME_SIGHASH  anySig;
698 } TPMU_ASYM_SCHEME;
699 
700 typedef struct {
701     TPMI_ALG_ASYM_SCHEME    scheme;
702     TPMU_ASYM_SCHEME        details;
703 } TPMT_ASYM_SCHEME;
704 
705 // Table 154 -- TPMI_ALG_RSA_SCHEME Type <I/O>
706 typedef TPM_ALG_ID TPMI_ALG_RSA_SCHEME;
707 
708 // Table 155 -- TPMT_RSA_SCHEME Structure <I/O>
709 typedef struct {
710     TPMI_ALG_RSA_SCHEME    scheme;
711     TPMU_ASYM_SCHEME       details;
712 } TPMT_RSA_SCHEME;
713 
714 // Table 156 -- TPMI_ALG_RSA_DECRYPT Type <I/O>
715 typedef TPM_ALG_ID TPMI_ALG_RSA_DECRYPT;
716 
717 // Table 157 -- TPMT_RSA_DECRYPT Structure <I/O>
718 typedef struct {
719     TPMI_ALG_RSA_DECRYPT    scheme;
720     TPMU_ASYM_SCHEME        details;
721 } TPMT_RSA_DECRYPT;
722 
723 // Table 158 -- TPM2B_PUBLIC_KEY_RSA Structure <I/O>
724 typedef struct {
725     UINT16    size;
726     BYTE      buffer[MAX_RSA_KEY_BYTES];
727 } TPM2B_PUBLIC_KEY_RSA;
728 
729 // Table 159 -- TPMI_RSA_KEY_BITS Type <I/O>
730 typedef TPM_KEY_BITS TPMI_RSA_KEY_BITS;
731 
732 // Table 160 -- TPM2B_PRIVATE_KEY_RSA Structure <I/O>
733 typedef struct {
734     UINT16    size;
735     BYTE      buffer[MAX_RSA_KEY_BYTES/2];
736 } TPM2B_PRIVATE_KEY_RSA;
737 
738 // Table 162 -- TPM2B_ECC_PARAMETER
739 typedef struct {
740     UINT16 size;
741     BYTE buffer[MAX_ECC_KEY_BYTES];
742 } TPM2B_ECC_PARAMETER;
743 
744 // Table 163 -- TPMS_ECC_POINT Structure <I/O>
745 typedef struct {
746     TPM2B_ECC_PARAMETER    x;
747     TPM2B_ECC_PARAMETER    y;
748 } TPMS_ECC_POINT;
749 
750 // Table 164 -- TPMI_ALG_ECC_SCHEME Type <I/O>
751 typedef TPM_ALG_ID TPMI_ALG_ECC_SCHEME;
752 
753 typedef UINT16 TPM_ECC_CURVE;
754 
755 // Table 165 -- TPMI_ECC_CURVE Type <I/O>
756 typedef TPM_ECC_CURVE TPMI_ECC_CURVE;
757 
758 // Table 166 -- TPMT_ECC_SCHEME Structure <I/O>
759 typedef struct {
760     TPMI_ALG_ECC_SCHEME    scheme;
761     TPMU_SIG_SCHEME        details;
762 } TPMT_ECC_SCHEME;
763 
764 // Table 175 -- TPMI_ALG_PUBLIC Type <I/O>
765 typedef TPM_ALG_ID TPMI_ALG_PUBLIC;
766 
767 // Table 176 -- TPMU_PUBLIC_ID Union <I/O,S>
768 typedef union {
769 #ifdef TPM2_ALG_KEYEDHASH
770     TPM2B_DIGEST  keyedHash;
771 #endif
772 #ifdef TPM2_ALG_SYMCIPHER
773     TPM2B_DIGEST  sym;
774 #endif
775 #ifdef TPM2_ALG_RSA
776     TPM2B_PUBLIC_KEY_RSA  rsa;
777 #endif
778 #ifdef TPM2_ALG_ECC
779     TPMS_ECC_POINT  ecc;
780 #endif
781 } TPMU_PUBLIC_ID;
782 
783 // Table 177 -- TPMS_KEYEDHASH_PARMS Structure <I/O>
784 typedef struct {
785     TPMT_KEYEDHASH_SCHEME    scheme;
786 } TPMS_KEYEDHASH_PARMS;
787 typedef struct {
788     TPMT_SYM_DEF_OBJECT    symmetric;
789     TPMT_ASYM_SCHEME       scheme;
790 } TPMS_ASYM_PARMS;
791 
792 // Table 179 -- TPMS_RSA_PARMS Structure <I/O>
793 typedef struct {
794     TPMT_SYM_DEF_OBJECT    symmetric;
795     TPMT_RSA_SCHEME        scheme;
796     TPMI_RSA_KEY_BITS      keyBits;
797     UINT32                 exponent;
798 } TPMS_RSA_PARMS;
799 
800 // Table 180 -- TPMS_ECC_PARMS Structure <I/O>
801 typedef struct {
802     TPMT_SYM_DEF_OBJECT    symmetric;
803     TPMT_ECC_SCHEME        scheme;
804     TPMI_ECC_CURVE         curveID;
805     TPMT_KDF_SCHEME        kdf;
806 } TPMS_ECC_PARMS;
807 
808 // Table 181 -- TPMU_PUBLIC_PARMS Union <I/O,S>
809 typedef union {
810 #ifdef TPM2_ALG_KEYEDHASH
811     TPMS_KEYEDHASH_PARMS  keyedHashDetail;
812 #endif
813 #ifdef TPM2_ALG_SYMCIPHER
814     TPMT_SYM_DEF_OBJECT  symDetail;
815 #endif
816 #ifdef TPM2_ALG_RSA
817     TPMS_RSA_PARMS  rsaDetail;
818 #endif
819 #ifdef TPM2_ALG_ECC
820     TPMS_ECC_PARMS  eccDetail;
821 #endif
822     TPMS_ASYM_PARMS  asymDetail;
823 } TPMU_PUBLIC_PARMS;
824 
825 // Table 182 -- TPMT_PUBLIC_PARMS Structure <I/O>
826 typedef struct {
827     TPMI_ALG_PUBLIC      type;
828     TPMU_PUBLIC_PARMS    parameters;
829 } TPMT_PUBLIC_PARMS;
830 
831 // Table 183 -- TPMT_PUBLIC Structure <I/O>
832 typedef struct {
833     TPMI_ALG_PUBLIC      type;
834     TPMI_ALG_HASH        nameAlg;
835     TPMA_OBJECT          objectAttributes;
836     TPM2B_DIGEST         authPolicy;
837     TPMU_PUBLIC_PARMS    parameters;
838     TPMU_PUBLIC_ID       unique;
839 } TPMT_PUBLIC;
840 
841 // Table 184 -- TPM2B_PUBLIC
842 typedef struct {
843     UINT16         size;
844     TPMT_PUBLIC    publicArea;
845 } TPM2B_PUBLIC;
846 
847 // Table 185 -- TPMU_SENSITIVE_COMPOSITE Union <I/O,S>
848 typedef union {
849 #ifdef TPM2_ALG_RSA
850     TPM2B_PRIVATE_KEY_RSA  rsa;
851 #endif
852 #ifdef TPM2_ALG_ECC
853     TPM2B_ECC_PARAMETER  ecc;
854 #endif
855 #ifdef TPM2_ALG_KEYEDHASH
856     TPM2B_SENSITIVE_DATA  bits;
857 #endif
858 #ifdef TPM2_ALG_SYMCIPHER
859     TPM2B_SYM_KEY  sym;
860 #endif
861     TPM2B_SENSITIVE_DATA  any;
862 } TPMU_SENSITIVE_COMPOSITE;
863 
864 // Table 186 -- TPMT_SENSITIVE Structure <I/O>
865 typedef struct {
866     TPMI_ALG_PUBLIC             sensitiveType;
867     TPM2B_AUTH                  authValue;
868     TPM2B_DIGEST                seedValue;
869     TPMU_SENSITIVE_COMPOSITE    sensitive;
870 } TPMT_SENSITIVE;
871 
872 // Table 187 -- TPM2B_SENSITIVE Structure <I/O>
873 typedef struct {
874     UINT16            size;
875     TPMT_SENSITIVE    sensitiveArea;
876 } TPM2B_SENSITIVE;
877 
878 typedef struct {
879     TPM2B_DIGEST      integrityOuter;
880     TPM2B_DIGEST      integrityInner;
881     TPMT_SENSITIVE    sensitive;
882 } _PRIVATE;
883 
884 // Table 189 -- TPM2B_PRIVATE Structure <I/O,S>
885 typedef struct {
886     UINT16    size;
887     BYTE      buffer[sizeof(_PRIVATE)];
888 } TPM2B_PRIVATE;
889 
890 // Table 204 -- TPMS_CREATION_DATA <OUT>
891 typedef struct {
892     TPML_PCR_SELECTION    pcrSelect;
893     TPM2B_DIGEST          pcrDigest;
894     TPMA_LOCALITY         locality;
895     TPM_ALG_ID            parentNameAlg;
896     TPM2B_NAME            parentName;
897     TPM2B_NAME            parentQualifiedName;
898     TPM2B_DATA            outsideInfo;
899 } TPMS_CREATION_DATA;
900 
901 // Table 205 -- TPM2B_CREATION_DATA <OUT>
902 typedef struct {
903     UINT16 size;
904     TPMS_CREATION_DATA creationData;
905 } TPM2B_CREATION_DATA;
906 
907 /* the following structs is not part of standard struct defined in TPM2 spec */
908 typedef struct {
909     UINT32            size;
910     TPM_RH            sessionHandle;
911     TPM2B_NONCE       nonce;
912     TPMA_SESSION      sessionAttributes;
913     TPM2B_AUTH        auth;
914 } TPM_AuthArea;
915 
916 typedef struct {
917     TPM2B_SENSITIVE_CREATE  inSensitive;
918     TPM2B_PUBLIC            inPublic;
919     TPM2B_DATA              outsideInfo;
920     TPML_PCR_SELECTION      creationPCR;
921 } TPM2_Create_Params_in;
922 
923 typedef TPM2_Create_Params_in    TPM2_CreatePrimary_Params_in;
924 
925 typedef struct {
926     TPM2B_PUBLIC        outPublic;
927     TPM2B_CREATION_DATA creationData;
928     TPM2B_DIGEST        creationHash;
929     TPMT_TK_CREATION    creationTicket;
930     TPM2B_NAME          name;
931 } TPM2_CreatePrimary_Params_out;
932 
933 typedef struct {
934     TPM2B_PRIVATE       outPrivate;
935     TPM2B_PUBLIC        outPublic;
936     TPM2B_CREATION_DATA creationData;
937     TPM2B_DIGEST        creationHash;
938     TPMT_TK_CREATION    creationTicket;
939 } TPM2_Create_Params_out;
940 typedef struct {
941     TPM2B_PRIVATE    Private;
942     TPM2B_PUBLIC     Public;
943 } TPM2_RSA_KEY;
944 
945 /*
946  * TPM 2.0 Objects
947  */
948 
949 #define TPM_HT_TRANSIENT        0x80
950 #define HR_SHIFT                24
951 #define HR_PERMANENT            (TPM_HT_TRANSIENT << HR_SHIFT)
952 #define TRANSIENT_FIRST         (HR_PERMANENT)
953 #define MAX_LOADED_OBJECTS      3
954 #define TRANSIENT_LAST          (TRANSIENT_FIRST+MAX_LOADED_OBJECTS-1)
955 /*
956  * TPMA_OBJECT Bits
957  */
958 #define fixedTPM                ((1 << 1))
959 #define stClear                 ((1 << 2))
960 #define fixedParent             ((1 << 4))
961 #define sensitiveDataOrigin     ((1 << 5))
962 #define userWithAuth            ((1 << 6))
963 #define adminWithPolicy         ((1 << 7))
964 #define noDA                    ((1 << 10))
965 #define encryptedDuplication    ((1 << 11))
966 #define restricted              ((1 << 16))
967 #define decrypt                 ((1 << 17))
968 #define sign                    ((1 << 18))
969 #endif
970