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