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