]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add TPM related definitions.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 2 Jan 2008 06:43:26 +0000 (06:43 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 2 Jan 2008 06:43:26 +0000 (06:43 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4461 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/IndustryStandard/Tpm12.h [new file with mode: 0644]
MdePkg/Include/Protocol/TcgService.h [new file with mode: 0644]
MdePkg/Include/Uefi/UefiTcgPlatform.h [new file with mode: 0644]

diff --git a/MdePkg/Include/IndustryStandard/Tpm12.h b/MdePkg/Include/IndustryStandard/Tpm12.h
new file mode 100644 (file)
index 0000000..5ba4bb4
--- /dev/null
@@ -0,0 +1,1852 @@
+/*++\r
+\r
+Copyright (c) 2005 - 2006, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  Tpm12.h\r
+\r
+Abstract:\r
+\r
+  TPM Specification data structures (TCG TPM Specification Version 1.2 Revision 94)\r
+\r
+  See http://trustedcomputinggroup.org for latest specification updates\r
+\r
+--*/\r
+\r
+#ifndef _TPM12_H_\r
+#define _TPM12_H_\r
+\r
+//\r
+// The start of TPM return codes\r
+//\r
+#define TPM_BASE                    (EFI_MAX_BIT + (EFI_MAX_BIT >> 1))\r
+\r
+//\r
+// Structures are all packed on 1-byte alignment\r
+//\r
+\r
+#pragma pack (push)\r
+#pragma pack (1)\r
+\r
+//\r
+// Part 2, section 2.2: Basic types & Helper redefinitions\r
+//\r
+typedef UINT8                       TPM_AUTH_DATA_USAGE;\r
+typedef UINT8                       TPM_PAYLOAD_TYPE;\r
+typedef UINT8                       TPM_VERSION_BYTE;\r
+typedef UINT16                      TPM_TAG;\r
+typedef UINT16                      TPM_PROTOCOL_ID;\r
+typedef UINT16                      TPM_STARTUP_TYPE;\r
+typedef UINT16                      TPM_ENC_SCHEME;\r
+typedef UINT16                      TPM_SIG_SCHEME;\r
+typedef UINT16                      TPM_MIGRATE_SCHEME;\r
+typedef UINT16                      TPM_PHYSICAL_PRESENCE;\r
+typedef UINT16                      TPM_ENTITY_TYPE;\r
+typedef UINT16                      TPM_KEY_USAGE;\r
+typedef UINT16                      TPM_EK_TYPE;\r
+typedef UINT16                      TPM_STRUCTURE_TAG;\r
+typedef UINT16                      TPM_PLATFORM_SPECIFIC;\r
+typedef UINT32                      TPM_COMMAND_CODE;\r
+typedef UINT32                      TPM_CAPABILITY_AREA;\r
+typedef UINT32                      TPM_KEY_FLAGS;\r
+typedef UINT32                      TPM_ALGORITHM_ID;\r
+typedef UINT32                      TPM_MODIFIER_INDICATOR;\r
+typedef UINT32                      TPM_ACTUAL_COUNT;\r
+typedef UINT32                      TPM_TRANSPORT_ATTRIBUTES;\r
+typedef UINT32                      TPM_AUTHHANDLE;\r
+typedef UINT32                      TPM_DIRINDEX;\r
+typedef UINT32                      TPM_KEY_HANDLE;\r
+typedef UINT32                      TPM_PCRINDEX;\r
+typedef UINT32                      TPM_RESULT;\r
+typedef UINT32                      TPM_RESOURCE_TYPE;\r
+typedef UINT32                      TPM_KEY_CONTROL;\r
+typedef UINT32                      TPM_NV_INDEX;\r
+typedef UINT32                      TPM_FAMILY_ID;\r
+typedef UINT32                      TPM_FAMILY_VERIFICATION;\r
+typedef UINT32                      TPM_STARTUP_EFFECTS;\r
+typedef UINT32                      TPM_SYM_MODE;\r
+typedef UINT32                      TPM_FAMILY_FLAGS;\r
+typedef UINT32                      TPM_DELEGATE_INDEX;\r
+typedef UINT32                      TPM_CMK_DELEGATE;\r
+typedef UINT32                      TPM_COUNT_ID;\r
+typedef UINT32                      TPM_REDIT_COMMAND;\r
+typedef UINT32                      TPM_TRANSHANDLE;\r
+typedef UINT32                      TPM_HANDLE;\r
+typedef UINT32                      TPM_FAMILY_OPERATION;\r
+\r
+//\r
+// Part 2, section 2.2.4: Vendor specific\r
+// The following defines allow for the quick specification of a\r
+// vendor specific item.\r
+//\r
+#define TPM_Vendor_Specific32       ((UINT32) 0x00000400)\r
+#define TPM_Vendor_Specific8        ((UINT8) 0x80)\r
+\r
+//\r
+// Part 2, section 3.1: Structure TAGs\r
+//\r
+#define TPM_TAG_CONTEXTBLOB         ((TPM_STRUCTURE_TAG) 0x0001)\r
+#define TPM_TAG_CONTEXT_SENSITIVE   ((TPM_STRUCTURE_TAG) 0x0002)\r
+#define TPM_TAG_CONTEXTPOINTER      ((TPM_STRUCTURE_TAG) 0x0003)\r
+#define TPM_TAG_CONTEXTLIST         ((TPM_STRUCTURE_TAG) 0x0004)\r
+#define TPM_TAG_SIGNINFO            ((TPM_STRUCTURE_TAG) 0x0005)\r
+#define TPM_TAG_PCR_INFO_LONG       ((TPM_STRUCTURE_TAG) 0x0006)\r
+#define TPM_TAG_PERSISTENT_FLAGS    ((TPM_STRUCTURE_TAG) 0x0007)\r
+#define TPM_TAG_VOLATILE_FLAGS      ((TPM_STRUCTURE_TAG) 0x0008)\r
+#define TPM_TAG_PERSISTENT_DATA     ((TPM_STRUCTURE_TAG) 0x0009)\r
+#define TPM_TAG_VOLATILE_DATA       ((TPM_STRUCTURE_TAG) 0x000A)\r
+#define TPM_TAG_SV_DATA             ((TPM_STRUCTURE_TAG) 0x000B)\r
+#define TPM_TAG_EK_BLOB             ((TPM_STRUCTURE_TAG) 0x000C)\r
+#define TPM_TAG_EK_BLOB_AUTH        ((TPM_STRUCTURE_TAG) 0x000D)\r
+#define TPM_TAG_COUNTER_VALUE       ((TPM_STRUCTURE_TAG) 0x000E)\r
+#define TPM_TAG_TRANSPORT_INTERNAL  ((TPM_STRUCTURE_TAG) 0x000F)\r
+#define TPM_TAG_TRANSPORT_LOG_IN    ((TPM_STRUCTURE_TAG) 0x0010)\r
+#define TPM_TAG_TRANSPORT_LOG_OUT   ((TPM_STRUCTURE_TAG) 0x0011)\r
+#define TPM_TAG_AUDIT_EVENT_IN      ((TPM_STRUCTURE_TAG) 0x0012)\r
+#define TPM_TAG_AUDIT_EVENT_OUT     ((TPM_STRUCTURE_TAG) 0x0013)\r
+#define TPM_TAG_CURRENT_TICKS       ((TPM_STRUCTURE_TAG) 0x0014)\r
+#define TPM_TAG_KEY                 ((TPM_STRUCTURE_TAG) 0x0015)\r
+#define TPM_TAG_STORED_DATA12       ((TPM_STRUCTURE_TAG) 0x0016)\r
+#define TPM_TAG_NV_ATTRIBUTES       ((TPM_STRUCTURE_TAG) 0x0017)\r
+#define TPM_TAG_NV_DATA_PUBLIC      ((TPM_STRUCTURE_TAG) 0x0018)\r
+#define TPM_TAG_NV_DATA_SENSITIVE   ((TPM_STRUCTURE_TAG) 0x0019)\r
+#define TPM_TAG_DELEGATIONS         ((TPM_STRUCTURE_TAG) 0x001A)\r
+#define TPM_TAG_DELEGATE_PUBLIC     ((TPM_STRUCTURE_TAG) 0x001B)\r
+#define TPM_TAG_DELEGATE_TABLE_ROW  ((TPM_STRUCTURE_TAG) 0x001C)\r
+#define TPM_TAG_TRANSPORT_AUTH      ((TPM_STRUCTURE_TAG) 0x001D)\r
+#define TPM_TAG_TRANSPORT_PUBLIC    ((TPM_STRUCTURE_TAG) 0x001E)\r
+#define TPM_TAG_PERMANENT_FLAGS     ((TPM_STRUCTURE_TAG) 0x001F)\r
+#define TPM_TAG_STCLEAR_FLAGS       ((TPM_STRUCTURE_TAG) 0x0020)\r
+#define TPM_TAG_STANY_FLAGS         ((TPM_STRUCTURE_TAG) 0x0021)\r
+#define TPM_TAG_PERMANENT_DATA      ((TPM_STRUCTURE_TAG) 0x0022)\r
+#define TPM_TAG_STCLEAR_DATA        ((TPM_STRUCTURE_TAG) 0x0023)\r
+#define TPM_TAG_STANY_DATA          ((TPM_STRUCTURE_TAG) 0x0024)\r
+#define TPM_TAG_FAMILY_TABLE_ENTRY  ((TPM_STRUCTURE_TAG) 0x0025)\r
+#define TPM_TAG_DELEGATE_SENSITIVE  ((TPM_STRUCTURE_TAG) 0x0026)\r
+#define TPM_TAG_DELG_KEY_BLOB       ((TPM_STRUCTURE_TAG) 0x0027)\r
+#define TPM_TAG_KEY12               ((TPM_STRUCTURE_TAG) 0x0028)\r
+#define TPM_TAG_CERTIFY_INFO2       ((TPM_STRUCTURE_TAG) 0x0029)\r
+#define TPM_TAG_DELEGATE_OWNER_BLOB ((TPM_STRUCTURE_TAG) 0x002A)\r
+#define TPM_TAG_EK_BLOB_ACTIVATE    ((TPM_STRUCTURE_TAG) 0x002B)\r
+#define TPM_TAG_DAA_BLOB            ((TPM_STRUCTURE_TAG) 0x002C)\r
+#define TPM_TAG_DAA_CONTEXT         ((TPM_STRUCTURE_TAG) 0x002D)\r
+#define TPM_TAG_DAA_ENFORCE         ((TPM_STRUCTURE_TAG) 0x002E)\r
+#define TPM_TAG_DAA_ISSUER          ((TPM_STRUCTURE_TAG) 0x002F)\r
+#define TPM_TAG_CAP_VERSION_INFO    ((TPM_STRUCTURE_TAG) 0x0030)\r
+#define TPM_TAG_DAA_SENSITIVE       ((TPM_STRUCTURE_TAG) 0x0031)\r
+#define TPM_TAG_DAA_TPM             ((TPM_STRUCTURE_TAG) 0x0032)\r
+#define TPM_TAG_CMK_MIGAUTH         ((TPM_STRUCTURE_TAG) 0x0033)\r
+#define TPM_TAG_CMK_SIGTICKET       ((TPM_STRUCTURE_TAG) 0x0034)\r
+#define TPM_TAG_CMK_MA_APPROVAL     ((TPM_STRUCTURE_TAG) 0x0035)\r
+#define TPM_TAG_QUOTE_INFO2         ((TPM_STRUCTURE_TAG) 0x0036)\r
+\r
+//\r
+// Part 2, section 4: TPM Types\r
+//\r
+\r
+//\r
+// Part 2, section 4.1: TPM_RESOURCE_TYPE\r
+//\r
+#define TPM_RT_KEY                  ((TPM_RESOURCE_TYPE) 0x00000001) // The handle is a key handle and is the result of a LoadKey type operation\r
+#define TPM_RT_AUTH                 ((TPM_RESOURCE_TYPE) 0x00000002) // The handle is an authorization handle. Auth handles come from TPM_OIAP, TPM_OSAP and TPM_DSAP\r
+#define TPM_RT_HASH                 ((TPM_RESOURCE_TYPE) 0x00000003) // Reserved for hashes\r
+#define TPM_RT_TRANS                ((TPM_RESOURCE_TYPE) 0x00000004) // The handle is for a transport session. Transport handles come from TPM_EstablishTransport\r
+#define TPM_RT_CONTEXT              ((TPM_RESOURCE_TYPE) 0x00000005) // Resource wrapped and held outside the TPM using the context save/restore commands\r
+#define TPM_RT_COUNTER              ((TPM_RESOURCE_TYPE) 0x00000006) // Reserved for counters\r
+#define TPM_RT_DELEGATE             ((TPM_RESOURCE_TYPE) 0x00000007) // The handle is for a delegate row. These are the internal rows held in NV storage by the TPM\r
+#define TPM_RT_DAA_TPM              ((TPM_RESOURCE_TYPE) 0x00000008) // The value is a DAA TPM specific blob\r
+#define TPM_RT_DAA_V0               ((TPM_RESOURCE_TYPE) 0x00000009) // The value is a DAA V0 parameter\r
+#define TPM_RT_DAA_V1               ((TPM_RESOURCE_TYPE) 0x0000000A) // The value is a DAA V1 parameter\r
+\r
+//\r
+// Part 2, section 4.2: TPM_PAYLOAD_TYPE\r
+//\r
+#define TPM_PT_ASYM                 ((TPM_PAYLOAD_TYPE) 0x01) // The entity is an asymmetric key\r
+#define TPM_PT_BIND                 ((TPM_PAYLOAD_TYPE) 0x02) // The entity is bound data\r
+#define TPM_PT_MIGRATE              ((TPM_PAYLOAD_TYPE) 0x03) // The entity is a migration blob\r
+#define TPM_PT_MAINT                ((TPM_PAYLOAD_TYPE) 0x04) // The entity is a maintenance blob\r
+#define TPM_PT_SEAL                 ((TPM_PAYLOAD_TYPE) 0x05) // The entity is sealed data\r
+#define TPM_PT_MIGRATE_RESTRICTED   ((TPM_PAYLOAD_TYPE) 0x06) // The entity is a restricted-migration asymmetric key\r
+#define TPM_PT_MIGRATE_EXTERNAL     ((TPM_PAYLOAD_TYPE) 0x07) // The entity is a external migratable key\r
+#define TPM_PT_CMK_MIGRATE          ((TPM_PAYLOAD_TYPE) 0x08) // The entity is a CMK migratable blob\r
+#define TPM_PT_VENDOR_SPECIFIC      ((TPM_PAYLOAD_TYPE) 0x80) // 0x80 - 0xFF Vendor specific payloads\r
+\r
+//\r
+// Part 2, section 4.3: TPM_ENTIRY_TYPE\r
+//\r
+#define TPM_ET_KEYHANDLE            ((UINT16) 0x0001) // The entity is a keyHandle or key\r
+#define TPM_ET_OWNER                ((UINT16) 0x0002) // The entity is the TPM Owner\r
+#define TPM_ET_DATA                 ((UINT16) 0x0003) // The entity is some data\r
+#define TPM_ET_SRK                  ((UINT16) 0x0004) // The entity is the SRK\r
+#define TPM_ET_KEY                  ((UINT16) 0x0005) // The entity is a key or keyHandle\r
+#define TPM_ET_REVOKE               ((UINT16) 0x0006) // The entity is the RevokeTrust value\r
+#define TPM_ET_DEL_OWNER_BLOB       ((UINT16) 0x0007) // The entity is a delegate owner blob\r
+#define TPM_ET_DEL_ROW              ((UINT16) 0x0008) // The entity is a delegate row\r
+#define TPM_ET_DEL_KEY_BLOB         ((UINT16) 0x0009) // The entity is a delegate key blob\r
+#define TPM_ET_COUNTER              ((UINT16) 0x000A) // The entity is a counter\r
+#define TPM_ET_NV                   ((UINT16) 0x000B) // The entity is a NV index\r
+#define TPM_ET_RESERVED_HANDLE      ((UINT16) 0x0040) // Reserved. This value avoids collisions with the handle MSB setting.\r
+//\r
+// TPM_ENTITY_TYPE MSB Values: The MSB is used to indicate the ADIP encryption sheme when applicable\r
+//\r
+#define TPM_ET_XOR                  ((UINT16) 0x0000) // ADIP encryption scheme: XOR\r
+#define TPM_ET_AES128               ((UINT16) 0x0006) // ADIP encryption scheme: AES 128 bits\r
+\r
+//\r
+// Part 2, section 4.4.1: Reserved Key Handles\r
+//\r
+#define TPM_KH_SRK                  ((TPM_KEY_HANDLE) 0x40000000) // The handle points to the SRK\r
+#define TPM_KH_OWNER                ((TPM_KEY_HANDLE) 0x40000001) // The handle points to the TPM Owner\r
+#define TPM_KH_REVOKE               ((TPM_KEY_HANDLE) 0x40000002) // The handle points to the RevokeTrust value\r
+#define TPM_KH_TRANSPORT            ((TPM_KEY_HANDLE) 0x40000003) // The handle points to the EstablishTransport static authorization\r
+#define TPM_KH_OPERATOR             ((TPM_KEY_HANDLE) 0x40000004) // The handle points to the Operator auth\r
+#define TPM_KH_ADMIN                ((TPM_KEY_HANDLE) 0x40000005) // The handle points to the delegation administration auth\r
+#define TPM_KH_EK                   ((TPM_KEY_HANDLE) 0x40000006) // The handle points to the PUBEK, only usable with TPM_OwnerReadInternalPub\r
+\r
+//\r
+// Part 2, section 4.5: TPM_STARTUP_TYPE\r
+//\r
+#define TPM_ST_CLEAR                ((TPM_STARTUP_TYPE) 0x0001) // The TPM is starting up from a clean state\r
+#define TPM_ST_STATE                ((TPM_STARTUP_TYPE) 0x0002) // The TPM is starting up from a saved state\r
+#define TPM_ST_DEACTIVATED          ((TPM_STARTUP_TYPE) 0x0003) // The TPM is to startup and set the deactivated flag to TRUE\r
+\r
+//\r
+// Part 2, section 4.6: TPM_STATUP_EFFECTS\r
+// The table makeup is still an open issue.\r
+//\r
+\r
+//\r
+// Part 2, section 4.7: TPM_PROTOCOL_ID\r
+//\r
+#define TPM_PID_OIAP                ((TPM_PROTOCOL_ID) 0x0001) // The OIAP protocol.\r
+#define TPM_PID_OSAP                ((TPM_PROTOCOL_ID) 0x0002) // The OSAP protocol.\r
+#define TPM_PID_ADIP                ((TPM_PROTOCOL_ID) 0x0003) // The ADIP protocol.\r
+#define TPM_PID_ADCP                ((TPM_PROTOCOL_ID) 0x0004) // The ADCP protocol.\r
+#define TPM_PID_OWNER               ((TPM_PROTOCOL_ID) 0x0005) // The protocol for taking ownership of a TPM.\r
+#define TPM_PID_DSAP                ((TPM_PROTOCOL_ID) 0x0006) // The DSAP protocol\r
+#define TPM_PID_TRANSPORT           ((TPM_PROTOCOL_ID) 0x0007) // The transport protocol\r
+\r
+//\r
+// Part 2, section 4.8: TPM_ALGORITHM_ID\r
+//   The TPM MUST support the algorithms TPM_ALG_RSA, TPM_ALG_SHA, TPM_ALG_HMAC,\r
+//   TPM_ALG_MGF1\r
+//\r
+#define TPM_ALG_RSA                 ((TPM_ALGORITHM_ID) 0x00000001) // The RSA algorithm.\r
+#define TPM_ALG_DES                 ((TPM_ALGORITHM_ID) 0x00000002) // The DES algorithm\r
+#define TPM_ALG_3DES                ((TPM_ALGORITHM_ID) 0x00000003) // The 3DES algorithm in EDE mode\r
+#define TPM_ALG_SHA                 ((TPM_ALGORITHM_ID) 0x00000004) // The SHA1 algorithm\r
+#define TPM_ALG_HMAC                ((TPM_ALGORITHM_ID) 0x00000005) // The RFC 2104 HMAC algorithm\r
+#define TPM_ALG_AES128              ((TPM_ALGORITHM_ID) 0x00000006) // The AES algorithm, key size 128\r
+#define TPM_ALG_MGF1                ((TPM_ALGORITHM_ID) 0x00000007) // The XOR algorithm using MGF1 to create a string the size of the encrypted block\r
+#define TPM_ALG_AES192              ((TPM_ALGORITHM_ID) 0x00000008) // AES, key size 192\r
+#define TPM_ALG_AES256              ((TPM_ALGORITHM_ID) 0x00000009) // AES, key size 256\r
+#define TPM_ALG_XOR                 ((TPM_ALGORITHM_ID) 0x0000000A) // XOR using the rolling nonces\r
+\r
+//\r
+// Part 2, section 4.9: TPM_PHYSICAL_PRESENCE\r
+//\r
+#define TPM_PHYSICAL_PRESENCE_HW_DISABLE    ((TPM_PHYSICAL_PRESENCE) 0x0200) // Sets the physicalPresenceHWEnable to FALSE\r
+#define TPM_PHYSICAL_PRESENCE_CMD_DISABLE   ((TPM_PHYSICAL_PRESENCE) 0x0100) // Sets the physicalPresenceCMDEnable to FALSE\r
+#define TPM_PHYSICAL_PRESENCE_LIFETIME_LOCK ((TPM_PHYSICAL_PRESENCE) 0x0080) // Sets the physicalPresenceLifetimeLock to TRUE\r
+#define TPM_PHYSICAL_PRESENCE_HW_ENABLE     ((TPM_PHYSICAL_PRESENCE) 0x0040) // Sets the physicalPresenceHWEnable to TRUE\r
+#define TPM_PHYSICAL_PRESENCE_CMD_ENABLE    ((TPM_PHYSICAL_PRESENCE) 0x0020) // Sets the physicalPresenceCMDEnable to TRUE\r
+#define TPM_PHYSICAL_PRESENCE_NOTPRESENT    ((TPM_PHYSICAL_PRESENCE) 0x0010) // Sets PhysicalPresence = FALSE\r
+#define TPM_PHYSICAL_PRESENCE_PRESENT       ((TPM_PHYSICAL_PRESENCE) 0x0008) // Sets PhysicalPresence = TRUE\r
+#define TPM_PHYSICAL_PRESENCE_LOCK          ((TPM_PHYSICAL_PRESENCE) 0x0004) // Sets PhysicalPresenceLock = TRUE\r
+\r
+//\r
+// Part 2, section 4.10: TPM_MIGRATE_SCHEME\r
+//\r
+#define TPM_MS_MIGRATE                      ((TPM_MIGRATE_SCHEME) 0x0001) // A public key that can be used with all TPM migration commands other than 'ReWrap' mode.\r
+#define TPM_MS_REWRAP                       ((TPM_MIGRATE_SCHEME) 0x0002) // A public key that can be used for the ReWrap mode of TPM_CreateMigrationBlob.\r
+#define TPM_MS_MAINT                        ((TPM_MIGRATE_SCHEME) 0x0003) // A public key that can be used for the Maintenance commands\r
+#define TPM_MS_RESTRICT_MIGRATE             ((TPM_MIGRATE_SCHEME) 0x0004) // The key is to be migrated to a Migration Authority.\r
+#define TPM_MS_RESTRICT_APPROVE_DOUBLE      ((TPM_MIGRATE_SCHEME) 0x0005) // The key is to be migrated to an entity approved by a Migration Authority using double wrapping\r
+\r
+//\r
+// Part 2, section 4.11: TPM_EK_TYPE\r
+//\r
+#define TPM_EK_TYPE_ACTIVATE        ((TPM_EK_TYPE) 0x0001) // The blob MUST be TPM_EK_BLOB_ACTIVATE\r
+#define TPM_EK_TYPE_AUTH            ((TPM_EK_TYPE) 0x0002) // The blob MUST be TPM_EK_BLOB_AUTH\r
+\r
+//\r
+// Part 2, section 4.12: TPM_PLATFORM_SPECIFIC\r
+//\r
+#define TPM_PS_PC_11                ((TPM_PLATFORM_SPECIFIC) 0x0001) // PC Specific version 1.1\r
+#define TPM_PS_PC_12                ((TPM_PLATFORM_SPECIFIC) 0x0002) // PC Specific version 1.2\r
+#define TPM_PS_PDA_12               ((TPM_PLATFORM_SPECIFIC) 0x0003) // PDA Specific version 1.2\r
+#define TPM_PS_Server_12            ((TPM_PLATFORM_SPECIFIC) 0x0004) // Server Specific version 1.2\r
+#define TPM_PS_Mobile_12            ((TPM_PLATFORM_SPECIFIC) 0x0005) // Mobil Specific version 1.2\r
+\r
+//\r
+// Part 2, section 5: Basic Structures\r
+//\r
+\r
+//\r
+// Part 2, section 5.1: TPM_STRUCT_VER\r
+//\r
+typedef struct tdTPM_STRUCT_VER {\r
+  UINT8                             major;\r
+  UINT8                             minor;\r
+  UINT8                             revMajor;\r
+  UINT8                             revMinor;\r
+} TPM_STRUCT_VER;\r
+\r
+//\r
+// Part 2, section 5.3: TPM_VERSION\r
+//\r
+typedef struct tdTPM_VERSION {\r
+  TPM_VERSION_BYTE                  major;\r
+  TPM_VERSION_BYTE                  minor;\r
+  UINT8                             revMajor;\r
+  UINT8                             revMinor;\r
+} TPM_VERSION;\r
+\r
+//\r
+// Part 2, section 5.4: TPM_DIGEST\r
+//\r
+#define TPM_SHA1_160_HASH_LEN       0x14\r
+#define TPM_SHA1BASED_NONCE_LEN     TPM_SHA1_160_HASH_LEN\r
+\r
+typedef struct tdTPM_DIGEST{\r
+  UINT8                             digest[TPM_SHA1_160_HASH_LEN];\r
+} TPM_DIGEST;\r
+\r
+typedef TPM_DIGEST                  TPM_CHOSENID_HASH; // This SHALL be the digest of the chosen identityLabel and privacyCA for a new TPM identity.\r
+typedef TPM_DIGEST                  TPM_COMPOSITE_HASH; // This SHALL be the hash of a list of PCR indexes and PCR values that a key or data is bound to.\r
+typedef TPM_DIGEST                  TPM_DIRVALUE; // This SHALL be the value of a DIR register\r
+typedef TPM_DIGEST                  TPM_HMAC;\r
+typedef TPM_DIGEST                  TPM_PCRVALUE; // The value inside of the PCR\r
+typedef TPM_DIGEST                  TPM_AUDITDIGEST; // This SHALL be the value of the current internal audit state\r
+typedef TPM_DIGEST                  TPM_DAA_TPM_SEED; // This SHALL be a random value generated by a TPM immediately after the EK is installed in that TPM, whenever an EK is installed in that TPM\r
+typedef TPM_DIGEST                  TPM_DAA_CONTEXT_SEED; // This SHALL be a random value\r
+\r
+//\r
+// Part 2, section 5.5: TPM_NONCE\r
+//\r
+typedef struct tdTPM_NONCE{\r
+  UINT8                             nonce[20];\r
+} TPM_NONCE;\r
+\r
+//\r
+// Part 2, section 5.6: TPM_AUTHDATA\r
+//\r
+typedef UINT8                       tdTPM_AUTHDATA[20];\r
+typedef tdTPM_AUTHDATA              TPM_AUTHDATA;\r
+typedef TPM_AUTHDATA                TPM_SECRET;\r
+typedef TPM_AUTHDATA                TPM_ENCAUTH;\r
+\r
+//\r
+// Part 2, section 5.7: TPM_KEY_HANDLE_LIST\r
+// Size of handle is loaded * sizeof(TPM_KEY_HANDLE)\r
+//\r
+typedef struct tdTPM_KEY_HANDLE_LIST {\r
+  UINT16                            loaded;\r
+  TPM_KEY_HANDLE                    handle[1];\r
+} TPM_KEY_HANDLE_LIST;\r
+\r
+//\r
+// Part 2, section 5.8: TPM_KEY_USAGE values\r
+//\r
+\r
+#define TPM_KEY_SIGNING             ((UINT16) 0x0010)\r
+// TPM_KEY_SIGNING SHALL indicate a signing key. The [private] key SHALL be\r
+// used for signing operations, only. This means that it MUST be a leaf of the\r
+// Protected Storage key hierarchy.\r
+\r
+#define TPM_KEY_STORAGE             ((UINT16) 0x0011)\r
+// TPM_KEY_STORAGE SHALL indicate a storage key. The key SHALL be used to wrap\r
+// and unwrap other keys in the Protected Storage hierarchy\r
+\r
+#define TPM_KEY_IDENTITY            ((UINT16) 0x0012)\r
+// TPM_KEY_IDENTITY SHALL indicate an identity key. The key SHALL be used for\r
+// operations that require a TPM identity, only.\r
+\r
+#define TPM_KEY_AUTHCHANGE          ((UINT16) 0x0013)\r
+// TPM_KEY_AUTHCHANGE SHALL indicate an ephemeral key that is in use during\r
+// the ChangeAuthAsym process, only.\r
+\r
+#define TPM_KEY_BIND                ((UINT16) 0x0014)\r
+// TPM_KEY_BIND SHALL indicate a key that can be used for TPM_Bind and\r
+// TPM_Unbind operations only.\r
+\r
+#define TPM_KEY_LEGACY              ((UINT16) 0x0015)\r
+// TPM_KEY_LEGACY SHALL indicate a key that can perform signing and binding\r
+// operations. The key MAY be used for both signing and binding operations.\r
+// The TPM_KEY_LEGACY key type is to allow for use by applications where both\r
+// signing and encryption operations occur with the same key. The use of this\r
+// key type is not recommended TPM_KEY_MIGRATE 0x0016 This SHALL indicate a\r
+// key in use for TPM_MigrateKey\r
+\r
+#define TPM_KEY_MIGRATE             ((UINT16) 0x0016)\r
+// TPM_KEY_MIGRAGE SHALL indicate a key in use for TPM_MigrateKey\r
+\r
+//\r
+// Part 2, section 5.8.1: Encryption/Signature schemes\r
+//\r
+\r
+#define TPM_ES_NONE                 ((TPM_ENC_SCHEME) 0x0001)\r
+#define TPM_ES_RSAESPKCSv15         ((TPM_ENC_SCHEME) 0x0002)\r
+#define TPM_ES_RSAESOAEP_SHA1_MGF1  ((TPM_ENC_SCHEME) 0x0003)\r
+#define TPM_ES_SYM_CNT              ((TPM_ENC_SCHEME) 0x0004)\r
+#define TPM_ES_SYM_OFB              ((TPM_ENC_SCHEME) 0x0005)\r
+\r
+#define TPM_SS_NONE                 ((TPM_SIG_SCHEME) 0x0001)\r
+#define TPM_SS_RSASSAPKCS1v15_SHA1  ((TPM_SIG_SCHEME) 0x0002)\r
+#define TPM_SS_RSASSAPKCS1v15_DER   ((TPM_SIG_SCHEME) 0x0003)\r
+#define TPM_SS_RSASSAPKCS1v15_INFO  ((TPM_SIG_SCHEME) 0x0004)\r
+\r
+//\r
+// Part 2, section 5.9: TPM_AUTH_DATA_USAGE values\r
+//\r
+#define TPM_AUTH_NEVER              ((TPM_AUTH_DATA_USAGE) 0x00)\r
+#define TPM_AUTH_ALWAYS             ((TPM_AUTH_DATA_USAGE) 0x01)\r
+#define TPM_AUTH_PRIV_USE_ONLY      ((TPM_AUTH_DATA_USAGE) 0x03)\r
+\r
+//\r
+// Part 2, section 5.10: TPM_KEY_FLAGS\r
+//\r
+enum tdTPM_KEY_FLAGS {\r
+  redirection                       = 0x00000001,\r
+  migratable                        = 0x00000002,\r
+  isVolatile                        = 0x00000004,\r
+  pcrIgnoredOnRead                  = 0x00000008,\r
+  migrateAuthority                  = 0x00000010\r
+};\r
+\r
+//\r
+// Part 2, section 5.11: TPM_CHANGEAUTH_VALIDATE\r
+//\r
+typedef struct tdTPM_CHANGEAUTH_VALIDATE {\r
+  TPM_SECRET                        newAuthSecret;\r
+  TPM_NONCE                         n1;\r
+} TPM_CHANGEAUTH_VALIDATE;\r
+\r
+//\r
+// Part 2, section 5.12: TPM_MIGRATIONKEYAUTH\r
+//   decalared after section 10 to catch declaration of TPM_PUBKEY\r
+//\r
+// Part 2 section 10.1: TPM_KEY_PARMS\r
+//   [size_is(parmSize)] BYTE* parms;\r
+//\r
+typedef struct tdTPM_KEY_PARMS {\r
+  TPM_ALGORITHM_ID                  algorithmID;\r
+  TPM_ENC_SCHEME                    encScheme;\r
+  TPM_SIG_SCHEME                    sigScheme;\r
+  UINT32                            parmSize;\r
+  UINT8                             *parms;\r
+} TPM_KEY_PARMS;\r
+\r
+//\r
+// Part 2, section 10.4: TPM_STORE_PUBKEY\r
+//\r
+typedef struct tdTPM_STORE_PUBKEY {\r
+  UINT32                            keyLength;\r
+  UINT8                             key[1];\r
+} TPM_STORE_PUBKEY;\r
+\r
+//\r
+// Part 2, section 10.5: TPM_PUBKEY\r
+//\r
+typedef struct tdTPM_PUBKEY{\r
+  TPM_KEY_PARMS                     algorithmParms;\r
+  TPM_STORE_PUBKEY                  pubKey;\r
+} TPM_PUBKEY;\r
+\r
+//\r
+// Part 2, section 5.12: TPM_MIGRATIONKEYAUTH\r
+//\r
+typedef struct tdTPM_MIGRATIONKEYAUTH{\r
+  TPM_PUBKEY                        migrationKey;\r
+  TPM_MIGRATE_SCHEME                migrationScheme;\r
+  TPM_DIGEST                        digest;\r
+} TPM_MIGRATIONKEYAUTH;\r
+\r
+//\r
+// Part 2, section 5.13: TPM_COUNTER_VALUE\r
+//\r
+typedef struct tdTPM_COUNTER_VALUE{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  UINT8                             label[4];\r
+  TPM_ACTUAL_COUNT                  counter;\r
+} TPM_COUNTER_VALUE;\r
+\r
+//\r
+// Part 2, section 5.14: TPM_SIGN_INFO\r
+//   Size of data indicated by dataLen\r
+//\r
+typedef struct tdTPM_SIGN_INFO {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  UINT8                             fixed[4];\r
+  TPM_NONCE                         replay;\r
+  UINT32                            dataLen;\r
+  UINT8                             *data;\r
+} TPM_SIGN_INFO;\r
+\r
+//\r
+// Part 2, section 5.15: TPM_MSA_COMPOSITE\r
+//   Number of migAuthDigest indicated by MSAlist\r
+//\r
+typedef struct tdTPM_MSA_COMPOSITE {\r
+  UINT32                            MSAlist;\r
+  TPM_DIGEST                        migAuthDigest[1];\r
+} TPM_MSA_COMPOSITE;\r
+\r
+//\r
+// Part 2, section 5.16: TPM_CMK_AUTH\r
+//\r
+typedef struct tdTPM_CMK_AUTH{\r
+  TPM_DIGEST                        migrationAuthorityDigest;\r
+  TPM_DIGEST                        destinationKeyDigest;\r
+  TPM_DIGEST                        sourceKeyDigest;\r
+} TPM_CMK_AUTH;\r
+\r
+//\r
+// Part 2, section 5.17: TPM_CMK_DELEGATE\r
+//\r
+#define TPM_CMK_DELEGATE_SIGNING    (((TPM_CMK_DELEGATE)1) << 31)\r
+#define TPM_CMK_DELEGATE_STORAGE    (((TPM_CMK_DELEGATE)1) << 30)\r
+#define TPM_CMK_DELEGATE_BIND       (((TPM_CMK_DELEGATE)1) << 29)\r
+#define TPM_CMK_DELEGATE_LEGACY     (((TPM_CMK_DELEGATE)1) << 28)\r
+#define TPM_CMK_DELEGATE_MIGRATE    (((TPM_CMK_DELEGATE)1) << 27)\r
+\r
+//\r
+// Part 2, section 5.18: TPM_SELECT_SIZE\r
+//\r
+typedef struct tdTPM_SELECT_SIZE {\r
+  UINT8                             major;\r
+  UINT8                             minor;\r
+  UINT16                            reqSize;\r
+} TPM_SELECT_SIZE;\r
+\r
+//\r
+// Part 2, section 5,19: TPM_CMK_MIGAUTH\r
+//\r
+typedef struct tdTPM_CMK_MIGAUTH{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  TPM_DIGEST                        msaDigest;\r
+  TPM_DIGEST                        pubKeyDigest;\r
+} TPM_CMK_MIGAUTH;\r
+\r
+//\r
+// Part 2, section 5.20: TPM_CMK_SIGTICKET\r
+//\r
+typedef struct tdTPM_CMK_SIGTICKET{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  TPM_DIGEST                        verKeyDigest;\r
+  TPM_DIGEST                        signedData;\r
+} TPM_CMK_SIGTICKET;\r
+\r
+//\r
+// Part 2, section 5.21: TPM_CMK_MA_APPROVAL\r
+//\r
+typedef struct tdTPM_CMK_MA_APPROVAL{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  TPM_DIGEST                        migrationAuthorityDigest;\r
+} TPM_CMK_MA_APPROVAL;\r
+\r
+//\r
+// Part 2, section 6: Command Tags\r
+//\r
+#define TPM_TAG_RQU_COMMAND         ((TPM_STRUCTURE_TAG) 0x00C1)\r
+#define TPM_TAG_RQU_AUTH1_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C2)\r
+#define TPM_TAG_RQU_AUTH2_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C3)\r
+#define TPM_TAG_RSP_COMMAND         ((TPM_STRUCTURE_TAG) 0x00C4)\r
+#define TPM_TAG_RSP_AUTH1_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C5)\r
+#define TPM_TAG_RSP_AUTH2_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C6)\r
+\r
+//\r
+// Part 2, section 7.1: TPM_PERMANENT_FLAGS\r
+//\r
+typedef struct tdTPM_PERMANENT_FLAGS{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  BOOLEAN                           disable;\r
+  BOOLEAN                           ownership;\r
+  BOOLEAN                           deactivated;\r
+  BOOLEAN                           readPubek;\r
+  BOOLEAN                           disableOwnerClear;\r
+  BOOLEAN                           allowMaintenance;\r
+  BOOLEAN                           physicalPresenceLifetimeLock;\r
+  BOOLEAN                           physicalPresenceHWEnable;\r
+  BOOLEAN                           physicalPresenceCMDEnable;\r
+  BOOLEAN                           CEKPUsed;\r
+  BOOLEAN                           TPMpost;\r
+  BOOLEAN                           TPMpostLock;\r
+  BOOLEAN                           FIPS;\r
+  BOOLEAN                           operator;\r
+  BOOLEAN                           enableRevokeEK;\r
+  BOOLEAN                           nvLocked;\r
+  BOOLEAN                           readSRKPub;\r
+  BOOLEAN                           tpmEstablished;\r
+  BOOLEAN                           maintenanceDone;\r
+} TPM_PERMANENT_FLAGS;\r
+\r
+//\r
+// Part 2, section 7.1.1: PERMANENT_FLAGS Subcap for SetCapability\r
+//\r
+#define TPM_PF_DISABLE                      ((TPM_CAPABILITY_AREA) 1)\r
+#define TPM_PF_OWNERSHIP                    ((TPM_CAPABILITY_AREA) 2)\r
+#define TPM_PF_DEACTIVATED                  ((TPM_CAPABILITY_AREA) 3)\r
+#define TPM_PF_READPUBEK                    ((TPM_CAPABILITY_AREA) 4)\r
+#define TPM_PF_DISABLEOWNERCLEAR            ((TPM_CAPABILITY_AREA) 5)\r
+#define TPM_PF_ALLOWMAINTENANCE             ((TPM_CAPABILITY_AREA) 6)\r
+#define TPM_PF_PHYSICALPRESENCELIFETIMELOCK ((TPM_CAPABILITY_AREA) 7)\r
+#define TPM_PF_PHYSICALPRESENCEHWENABLE     ((TPM_CAPABILITY_AREA) 8)\r
+#define TPM_PF_PHYSICALPRESENCECMDENABLE    ((TPM_CAPABILITY_AREA) 9)\r
+#define TPM_PF_CEKPUSED                     ((TPM_CAPABILITY_AREA) 10)\r
+#define TPM_PF_TPMPOST                      ((TPM_CAPABILITY_AREA) 11)\r
+#define TPM_PF_TPMPOSTLOCK                  ((TPM_CAPABILITY_AREA) 12)\r
+#define TPM_PF_FIPS                         ((TPM_CAPABILITY_AREA) 13)\r
+#define TPM_PF_OPERATOR                     ((TPM_CAPABILITY_AREA) 14)\r
+#define TPM_PF_ENABLEREVOKEEK               ((TPM_CAPABILITY_AREA) 15)\r
+#define TPM_PF_NV_LOCKED                    ((TPM_CAPABILITY_AREA) 16)\r
+#define TPM_PF_READSRKPUB                   ((TPM_CAPABILITY_AREA) 17)\r
+#define TPM_PF_TPMESTABLISHED               ((TPM_CAPABILITY_AREA) 18)\r
+#define TPM_PF_MAINTENANCEDONE              ((TPM_CAPABILITY_AREA) 19)\r
+\r
+//\r
+// Part 2, section 7.2: TPM_STCLEAR_FLAGS\r
+//\r
+typedef struct tdTPM_STCLEAR_FLAGS{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  BOOLEAN                           deactivated;\r
+  BOOLEAN                           disableForceClear;\r
+  BOOLEAN                           physicalPresence;\r
+  BOOLEAN                           physicalPresenceLock;\r
+  BOOLEAN                           bGlobalLock;\r
+} TPM_STCLEAR_FLAGS;\r
+\r
+//\r
+// Part 2, section 7.2.1: STCLEAR_FLAGS Subcap for SetCapability\r
+//\r
+#define TPM_SF_DEACTIVATED          ((TPM_CAPABILITY_AREA) 1)\r
+#define TPM_SF_DISABLEFORCECLEAR    ((TPM_CAPABILITY_AREA) 2)\r
+#define TPM_SF_PHYSICALPRESENCE     ((TPM_CAPABILITY_AREA) 3)\r
+#define TPM_SF_PHYSICALPRESENCELOCK ((TPM_CAPABILITY_AREA) 4)\r
+#define TPM_SF_BGLOBALLOCK          ((TPM_CAPABILITY_AREA) 5)\r
+\r
+//\r
+// Part 2, section 7.3: TPM_STANY_FLAGS\r
+//\r
+typedef struct tdTPM_STANY_FLAGS{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  BOOLEAN                           postInitialise;\r
+  TPM_MODIFIER_INDICATOR            localityModifier;\r
+  BOOLEAN                           transportExclusive;\r
+  BOOLEAN                           TOSPresent;\r
+} TPM_STANY_FLAGS;\r
+\r
+//\r
+// Part 2, section 7.3.1: STANY_FLAGS Subcap for SetCapability\r
+//\r
+#define TPM_AF_POSTINITIALISE       ((TPM_CAPABILITY_AREA) 1)\r
+#define TPM_AF_LOCALITYMODIFIER     ((TPM_CAPABILITY_AREA) 2)\r
+#define TPM_AF_TRANSPORTEXCLUSIVE   ((TPM_CAPABILITY_AREA) 3)\r
+#define TPM_AF_TOSPRESENT           ((TPM_CAPABILITY_AREA) 4)\r
+\r
+//\r
+// All those structures (section 7.4, 7.5, 7.6) are not normative and \r
+// thus no definitions here\r
+//\r
+// Part 2, section 7.4: TPM_PERMANENT_DATA\r
+//\r
+//#define TPM_MIN_COUNTERS            4   // the minimum number of counters is 4\r
+//#define TPM_DELEGATE_KEY            TPM_KEY\r
+//#define TPM_NUM_PCR                 16\r
+//#define TPM_MAX_NV_WRITE_NOOWNER    64\r
+//typedef struct tdTPM_PERMANENT_DATA\r
+//{\r
+//    TPM_STRUCTURE_TAG               tag;\r
+//    UINT8                           revMajor;\r
+//    UINT8                           revMinor;\r
+//    TPM_NONCE                       tpmProof;\r
+//    TPM_NONCE                       ekReset;\r
+//    TPM_SECRET                      ownerAuth;\r
+//    TPM_SECRET                      operatorAuth;\r
+//    TPM_DIRVALUE                    authDIR[1];\r
+//    TPM_PUBKEY                      manuMaintPub;\r
+//    TPM_KEY                         endorsementKey;\r
+//    TPM_KEY                         srk;\r
+//    TPM_KEY                         contextKey;\r
+//    TPM_KEY                         delegateKey;\r
+//    TPM_COUNTER_VALUE               auditMonotonicCounter;\r
+//    TPM_COUNTER_VALUE               monitonicCounter[TPM_MIN_COUNTERS];\r
+//    TPM_PCR_ATTRIBUTES              pcrAttrib[TPM_NUM_PCR];\r
+//    UINT8                           ordinalAuditStatus[];\r
+//    UINT8                           *rngState;\r
+//    TPM_FAMILY_TABLE                familyTable;\r
+//    TPM_DELEGATE_TABLE              delegateTable;\r
+//    UINT32                          maxNVBufSize;\r
+//    UINT32                          lastFamilyID;\r
+//    UINT32                          noOwnerNVWrite;\r
+//    TPM_CMK_DELEGATE                restrictDelegate;\r
+//    TPM_DAA_TPM_SEED                tpmDAASeed;\r
+//} TPM_PERMANENT_DATA;\r
+\r
+//\r
+// Part 2, section 7.5: TPM_STCLEAR_DATA\r
+//   available inside TPM only\r
+//\r
+//typedef struct tdTPM_STCLEAR_DATA\r
+//{\r
+//    TPM_STRUCTURE_TAG               tag;\r
+//    TPM_NONCE                       contextNonceKey;\r
+//    TPM_COUNT_ID                    countID;\r
+//    UINT32                          ownerReference;\r
+//    BOOLEAN                         disableResetLock;\r
+//} TPM_STCLEAR_DATA;\r
+\r
+//\r
+// Part 2, section 7.6: TPM_STANY_DATA\r
+//   available inside TPM only\r
+//\r
+//typedef struct tdTPM_STANY_DATA\r
+//{\r
+//    TPM_STRUCTURE_TAG               tag;\r
+//    TPM_NONCE                       contextNonceSession;\r
+//    TPM_DIGEST                      auditDigest;\r
+//    TPM_CURRENT_TICKS               currentTicks;\r
+//    UINT32                          contextCount;\r
+//    UINT32                          contextList[TPM_MIN_SESSION_LIST];\r
+//    TPM_SESSION_DATA                sessions[TPM_MIN_SESSIONS];\r
+//} TPM_STANY_DATA;\r
+\r
+//\r
+// Part 2, section 8: PCR Structures\r
+// \r
+\r
+//\r
+// Part 2, section 8.1: TPM_PCR_SELECTION\r
+//   Size of pcrSelect[] indicated by sizeOfSelect\r
+//\r
+typedef struct tdTPM_PCR_SELECTION {\r
+  UINT16                            sizeOfSelect;\r
+  UINT8                             pcrSelect[1];\r
+} TPM_PCR_SELECTION;\r
+\r
+//\r
+// Part 2, section 8.2: TPM_PCR_COMPOSITE\r
+//   Size of pcrValue[] indicated by valueSize\r
+//\r
+typedef struct tdTPM_PCR_COMPOSITE {\r
+  TPM_PCR_SELECTION                 select;\r
+  UINT32                            valueSize;\r
+  TPM_PCRVALUE                      pcrValue[1];\r
+} TPM_PCR_COMPOSITE;\r
+\r
+//\r
+// Part 2, section 8.3: TPM_PCR_INFO\r
+//\r
+typedef struct tdTPM_PCR_INFO {\r
+  TPM_PCR_SELECTION                 pcrSelection;\r
+  TPM_COMPOSITE_HASH                digestAtRelease;\r
+  TPM_COMPOSITE_HASH                digestAtCreation;\r
+} TPM_PCR_INFO;\r
+\r
+//\r
+// Part 2, section 8.6: TPM_LOCALITY_SELECTION\r
+//\r
+typedef UINT8                       TPM_LOCALITY_SELECTION;\r
+\r
+#define TPM_LOC_FOUR                ((UINT8) 0x10)\r
+#define TPM_LOC_THREE               ((UINT8) 0x08)\r
+#define TPM_LOC_TWO                 ((UINT8) 0x04)\r
+#define TPM_LOC_ONE                 ((UINT8) 0x02)\r
+#define TPM_LOC_ZERO                ((UINT8) 0x01)\r
+\r
+//\r
+// Part 2, section 8.4: TPM_PCR_INFO_LONG\r
+//\r
+typedef struct tdTPM_PCR_INFO_LONG {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  TPM_LOCALITY_SELECTION            localityAtCreation;\r
+  TPM_LOCALITY_SELECTION            localityAtRelease;\r
+  TPM_PCR_SELECTION                 creationPCRSelection;\r
+  TPM_PCR_SELECTION                 releasePCRSelection;\r
+  TPM_COMPOSITE_HASH                digestAtCreation;\r
+  TPM_COMPOSITE_HASH                digestAtRelease;\r
+} TPM_PCR_INFO_LONG;\r
+\r
+//\r
+// Part 2, section 8.5: TPM_PCR_INFO_SHORT\r
+//\r
+typedef struct tdTPM_PCR_INFO_SHORT{\r
+  TPM_PCR_SELECTION                 pcrSelection;\r
+  TPM_LOCALITY_SELECTION            localityAtRelease;\r
+  TPM_COMPOSITE_HASH                digestAtRelease;\r
+} TPM_PCR_INFO_SHORT;\r
+\r
+//\r
+// Part 2, section 8.8: TPM_PCR_ATTRIBUTES\r
+//\r
+typedef struct tdTPM_PCR_ATTRIBUTES{\r
+  BOOLEAN                           pcrReset;\r
+  TPM_LOCALITY_SELECTION            pcrExtendLocal;\r
+  TPM_LOCALITY_SELECTION            pcrResetLocal;\r
+} TPM_PCR_ATTRIBUTES;\r
+\r
+//\r
+// Part 2, section 9: Storage Structures\r
+//\r
+\r
+//\r
+// Part 2, section 9.1: TPM_STORED_DATA\r
+//   [size_is(sealInfoSize)] BYTE* sealInfo;\r
+//   [size_is(encDataSize)] BYTE* encData;\r
+//\r
+typedef struct tdTPM_STORED_DATA {\r
+  TPM_STRUCT_VER                    ver;\r
+  UINT32                            sealInfoSize;\r
+  UINT8                             *sealInfo;\r
+  UINT32                            encDataSize;\r
+  UINT8                             *encData;\r
+} TPM_STORED_DATA;\r
+\r
+//\r
+// Part 2, section 9.2: TPM_STORED_DATA12\r
+//   [size_is(sealInfoSize)] BYTE* sealInfo;\r
+//   [size_is(encDataSize)] BYTE* encData;\r
+//\r
+typedef struct tdTPM_STORED_DATA12 {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  TPM_ENTITY_TYPE                   et;\r
+  UINT32                            sealInfoSize;\r
+  UINT8                             *sealInfo;\r
+  UINT32                            encDataSize;\r
+  UINT8                             *encData;\r
+} TPM_STORED_DATA12;\r
+\r
+//\r
+// Part 2, section 9.3: TPM_SEALED_DATA\r
+//   [size_is(dataSize)] BYTE* data;\r
+//\r
+typedef struct tdTPM_SEALED_DATA {\r
+  TPM_PAYLOAD_TYPE                  payload;\r
+  TPM_SECRET                        authData;\r
+  TPM_NONCE                         tpmProof;\r
+  TPM_DIGEST                        storedDigest;\r
+  UINT32                            dataSize;\r
+  UINT8                             *data;\r
+} TPM_SEALED_DATA;\r
+\r
+//\r
+// Part 2, section 9.4: TPM_SYMMETRIC_KEY\r
+//   [size_is(size)] BYTE* data;\r
+//\r
+typedef struct tdTPM_SYMMETRIC_KEY {\r
+  TPM_ALGORITHM_ID                  algId;\r
+  TPM_ENC_SCHEME                    encScheme;\r
+  UINT16                            dataSize;\r
+  UINT8                             *data;\r
+} TPM_SYMMETRIC_KEY;\r
+\r
+//\r
+// Part 2, section 9.5: TPM_BOUND_DATA\r
+//\r
+typedef struct tdTPM_BOUND_DATA {\r
+  TPM_STRUCT_VER                    ver;\r
+  TPM_PAYLOAD_TYPE                  payload;\r
+  UINT8                             payloadData[1];\r
+} TPM_BOUND_DATA;\r
+\r
+//\r
+// Part 2 section 10: TPM_KEY complex\r
+// \r
+\r
+//\r
+// Part 2, section 10.2: TPM_KEY\r
+//   [size_is(encDataSize)] BYTE* encData;\r
+//\r
+typedef struct tdTPM_KEY{\r
+  TPM_STRUCT_VER                    ver;\r
+  TPM_KEY_USAGE                     keyUsage;\r
+  TPM_KEY_FLAGS                     keyFlags;\r
+  TPM_AUTH_DATA_USAGE               authDataUsage;\r
+  TPM_KEY_PARMS                     algorithmParms;\r
+  UINT32                            PCRInfoSize;\r
+  UINT8                             *PCRInfo;\r
+  TPM_STORE_PUBKEY                  pubKey;\r
+  UINT32                            encDataSize;\r
+  UINT8                             *encData;\r
+} TPM_KEY;\r
+\r
+//\r
+// Part 2, section 10.3: TPM_KEY12\r
+//   [size_is(encDataSize)] BYTE* encData;\r
+//\r
+typedef struct tdTPM_KEY12{\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  UINT16                            fill;\r
+  TPM_KEY_USAGE                     keyUsage;\r
+  TPM_KEY_FLAGS                     keyFlags;\r
+  TPM_AUTH_DATA_USAGE               authDataUsage;\r
+  TPM_KEY_PARMS                     algorithmParms;\r
+  UINT32                            PCRInfoSize;\r
+  UINT8                             *PCRInfo;\r
+  TPM_STORE_PUBKEY                  pubKey;\r
+  UINT32                            encDataSize;\r
+  UINT8                             *encData;\r
+} TPM_KEY12;\r
+\r
+//\r
+// Part 2, section 10.7: TPM_STORE_PRIVKEY\r
+//   [size_is(keyLength)] BYTE* key;\r
+//\r
+typedef struct tdTPM_STORE_PRIVKEY {\r
+  UINT32                            keyLength;\r
+  UINT8                             *key;\r
+} TPM_STORE_PRIVKEY;\r
+\r
+//\r
+// Part 2, section 10.6: TPM_STORE_ASYMKEY\r
+//\r
+typedef struct tdTPM_STORE_ASYMKEY {                // pos len total\r
+  TPM_PAYLOAD_TYPE                  payload;        // 0    1   1\r
+  TPM_SECRET                        usageAuth;      // 1    20  21\r
+  TPM_SECRET                        migrationAuth;  // 21   20  41\r
+  TPM_DIGEST                        pubDataDigest;  // 41   20  61\r
+  TPM_STORE_PRIVKEY                 privKey;        // 61 132-151 193-214\r
+} TPM_STORE_ASYMKEY;\r
+\r
+//\r
+// Part 2, section 10.8: TPM_MIGRATE_ASYMKEY\r
+//   [size_is(partPrivKeyLen)] BYTE* partPrivKey;\r
+//\r
+typedef struct tdTPM_MIGRATE_ASYMKEY {              // pos  len  total\r
+  TPM_PAYLOAD_TYPE                  payload;        //   0    1       1\r
+  TPM_SECRET                        usageAuth;      //   1   20      21\r
+  TPM_DIGEST                        pubDataDigest;  //  21   20      41\r
+  UINT32                            partPrivKeyLen; //  41    4      45\r
+  UINT8                             *partPrivKey;   //  45 112-127 157-172\r
+} TPM_MIGRATE_ASYMKEY;\r
+\r
+//\r
+// Part 2, section 10.9: TPM_KEY_CONTROL\r
+//\r
+#define TPM_KEY_CONTROL_OWNER_EVICT ((UINT32) 0x00000001)\r
+\r
+//\r
+// Part 2, section 11: Signed Structures\r
+//\r
+\r
+typedef struct tdTPM_CERTIFY_INFO                           \r
+{\r
+    TPM_STRUCT_VER                  version;\r
+    TPM_KEY_USAGE                   keyUsage;\r
+    TPM_KEY_FLAGS                   keyFlags;\r
+    TPM_AUTH_DATA_USAGE             authDataUsage;\r
+    TPM_KEY_PARMS                   algorithmParms;\r
+    TPM_DIGEST                      pubkeyDigest;\r
+    TPM_NONCE                       data;\r
+    BOOLEAN                         parentPCRStatus;\r
+    UINT32                          PCRInfoSize;\r
+    UINT8                           *PCRInfo;\r
+} TPM_CERTIFY_INFO;\r
+\r
+typedef struct tdTPM_CERTIFY_INFO2\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    UINT8                           fill;\r
+    TPM_PAYLOAD_TYPE                payloadType;\r
+    TPM_KEY_USAGE                   keyUsage;\r
+    TPM_KEY_FLAGS                   keyFlags;\r
+    TPM_AUTH_DATA_USAGE             authDataUsage;\r
+    TPM_KEY_PARMS                   algorithmParms;\r
+    TPM_DIGEST                      pubkeyDigest;\r
+    TPM_NONCE                       data;\r
+    BOOLEAN                         parentPCRStatus;\r
+    UINT32                          PCRInfoSize;\r
+    UINT8                           *PCRInfo;\r
+    UINT32                          migrationAuthoritySize;\r
+    UINT8                           *migrationAuthority;\r
+} TPM_CERTIFY_INFO2;\r
+\r
+typedef struct tdTPM_QUOTE_INFO                            \r
+{\r
+    TPM_STRUCT_VER                  version;\r
+    UINT8                           fixed[4];\r
+    TPM_COMPOSITE_HASH              digestValue;\r
+    TPM_NONCE                       externalData;\r
+} TPM_QUOTE_INFO;\r
+\r
+typedef struct tdTPM_QUOTE_INFO2\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    UINT8                           fixed[4];\r
+    TPM_NONCE                       externalData;\r
+    TPM_PCR_INFO_SHORT              infoShort;\r
+} TPM_QUOTE_INFO2;\r
+\r
+//\r
+// Part 2, section 12: Identity Structures\r
+//\r
+\r
+typedef struct tdTPM_EK_BLOB\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_EK_TYPE                     ekType;\r
+    UINT32                          blobSize;\r
+    UINT8                           *blob;\r
+} TPM_EK_BLOB;\r
+\r
+typedef struct tdTPM_EK_BLOB_ACTIVATE\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_SYMMETRIC_KEY               sessionKey;\r
+    TPM_DIGEST                      idDigest;\r
+    TPM_PCR_INFO_SHORT              pcrInfo;\r
+} TPM_EK_BLOB_ACTIVATE;\r
+\r
+typedef struct tdTPM_EK_BLOB_AUTH\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_SECRET                      authValue;\r
+} TPM_EK_BLOB_AUTH;\r
+\r
+\r
+// TPM_CHOSENID_HASH = SHA(identityLabel || privacyCA)\r
+typedef TPM_DIGEST                  TPM_CHOSENID_HASH;\r
+\r
+typedef struct tdTPM_IDENTITY_CONTENTS\r
+{\r
+    TPM_STRUCT_VER                  ver;\r
+    UINT32                          ordinal;\r
+    TPM_CHOSENID_HASH               labelPrivCADigest;\r
+    TPM_PUBKEY                      identityPubKey;\r
+} TPM_IDENTITY_CONTENTS;\r
+\r
+typedef struct tdTPM_IDENTITY_REQ                          \r
+{\r
+    UINT32                          asymSize;\r
+    UINT32                          symSize;\r
+    TPM_KEY_PARMS                   asymAlgorithm;\r
+    TPM_KEY_PARMS                   symAlgorithm;\r
+    UINT8                           *asymBlob;\r
+    UINT8                           *symBlob;\r
+} TPM_IDENTITY_REQ;\r
+\r
+typedef struct tdTPM_IDENTITY_PROOF                        \r
+{\r
+    TPM_STRUCT_VER                  ver;\r
+    UINT32                          labelSize;\r
+    UINT32                          identityBindingSize;\r
+    UINT32                          endorsementSize;\r
+    UINT32                          platformSize;\r
+    UINT32                          conformanceSize;\r
+    TPM_PUBKEY                      identityKey;\r
+    UINT8                           *labelArea;\r
+    UINT8                           *identityBinding;\r
+    UINT8                           *endorsementCredential;\r
+    UINT8                           *platformCredential;\r
+    UINT8                           *conformanceCredential;\r
+} TPM_IDENTITY_PROOF;\r
+\r
+typedef struct tdTPM_ASYM_CA_CONTENTS                      \r
+{\r
+    TPM_SYMMETRIC_KEY               sessionKey;\r
+    TPM_DIGEST                      idDigest;\r
+} TPM_ASYM_CA_CONTENTS;\r
+\r
+typedef struct tdTPM_SYM_CA_ATTESTATION\r
+{\r
+    UINT32                          credSize;\r
+    TPM_KEY_PARMS                   algorithm;\r
+    UINT8                           *credential;\r
+} TPM_SYM_CA_ATTESTATION;\r
+\r
+//\r
+// Part 2, section 15: TPM_CURRENT_TICKS\r
+//   Placed here out of order because definitions are used in section 13.\r
+//\r
+typedef struct tdTPM_CURRENT_TICKS {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  UINT64                            currentTicks;\r
+  UINT16                            tickRate;\r
+  TPM_NONCE                         tickNonce;\r
+} TPM_CURRENT_TICKS;\r
+\r
+//\r
+// Part 2, section 13: Transport structures\r
+//\r
+\r
+#define TPM_TRANSPORT_ENCRYPT       ((UINT32)0x00000001)\r
+#define TPM_TRANSPORT_LOG           ((UINT32)0x00000002)\r
+#define TPM_TRANSPORT_EXCLUSIVE     ((UINT32)0x00000004)\r
+\r
+typedef struct tdTPM_TRANSPORT_PUBLIC\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_TRANSPORT_ATTRIBUTES        transAttributes;\r
+    TPM_ALGORITHM_ID                algId;\r
+    TPM_ENC_SCHEME                  encScheme;\r
+} TPM_TRANSPORT_PUBLIC;\r
+\r
+typedef struct tdTPM_TRANSPORT_INTERNAL\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_AUTHDATA                    authData;\r
+    TPM_TRANSPORT_PUBLIC            transPublic;\r
+    TPM_TRANSHANDLE                 transHandle;\r
+    TPM_NONCE                       transNonceEven;\r
+    TPM_DIGEST                      transDigest;\r
+} TPM_TRANSPORT_INTERNAL;\r
+\r
+typedef struct tdTPM_TRANSPORT_LOG_IN\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DIGEST                      parameters;\r
+    TPM_DIGEST                      pubKeyHash;\r
+} TPM_TRANSPORT_LOG_IN;\r
+\r
+typedef struct tdTPM_TRANSPORT_LOG_OUT\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_CURRENT_TICKS               currentTicks;\r
+    TPM_DIGEST                      parameters;\r
+    TPM_MODIFIER_INDICATOR          locality;\r
+} TPM_TRANSPORT_LOG_OUT;\r
+\r
+typedef struct tdTPM_TRANSPORT_AUTH\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_AUTHDATA                    authData;\r
+} TPM_TRANSPORT_AUTH;\r
+\r
+//\r
+// Part 2, section 14: Audit Structures\r
+//\r
+\r
+typedef struct tdTPM_AUDIT_EVENT_IN\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DIGEST                      inputParms;\r
+    TPM_COUNTER_VALUE               auditCount;\r
+} TPM_AUDIT_EVENT_IN;\r
+\r
+typedef struct tdTPM_AUDIT_EVENT_OUT\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_COMMAND_CODE                ordinal;\r
+    TPM_DIGEST                      outputParms;\r
+    TPM_COUNTER_VALUE               auditCount;\r
+    TPM_RESULT                      returnCode;\r
+} TPM_AUDIT_EVENT_OUT;\r
+\r
+//\r
+// Part 2, section 16: Return Codes\r
+//\r
+#ifndef TPM_BASE\r
+#error "TPM Error Codes require definition of TPM_BASE"\r
+#endif\r
+\r
+#define TPM_VENDOR_ERROR            TPM_Vendor_Specific32\r
+#define TPM_NON_FATAL               0x00000800\r
+\r
+#define TPM_SUCCESS                 ((TPM_RESULT) TPM_BASE)\r
+#define TPM_AUTHFAIL                ((TPM_RESULT) (TPM_BASE + 1))\r
+#define TPM_BADINDEX                ((TPM_RESULT) (TPM_BASE + 2))\r
+#define TPM_BAD_PARAMETER           ((TPM_RESULT) (TPM_BASE + 3))\r
+#define TPM_AUDITFAILURE            ((TPM_RESULT) (TPM_BASE + 4))\r
+#define TPM_CLEAR_DISABLED          ((TPM_RESULT) (TPM_BASE + 5))\r
+#define TPM_DEACTIVATED             ((TPM_RESULT) (TPM_BASE + 6))\r
+#define TPM_DISABLED                ((TPM_RESULT) (TPM_BASE + 7))\r
+#define TPM_DISABLED_CMD            ((TPM_RESULT) (TPM_BASE + 8))\r
+#define TPM_FAIL                    ((TPM_RESULT) (TPM_BASE + 9))\r
+#define TPM_BAD_ORDINAL             ((TPM_RESULT) (TPM_BASE + 10))\r
+#define TPM_INSTALL_DISABLED        ((TPM_RESULT) (TPM_BASE + 11))\r
+#define TPM_INVALID_KEYHANDLE       ((TPM_RESULT) (TPM_BASE + 12))\r
+#define TPM_KEYNOTFOUND             ((TPM_RESULT) (TPM_BASE + 13))\r
+#define TPM_INAPPROPRIATE_ENC       ((TPM_RESULT) (TPM_BASE + 14))\r
+#define TPM_MIGRATEFAIL             ((TPM_RESULT) (TPM_BASE + 15))\r
+#define TPM_INVALID_PCR_INFO        ((TPM_RESULT) (TPM_BASE + 16))\r
+#define TPM_NOSPACE                 ((TPM_RESULT) (TPM_BASE + 17))\r
+#define TPM_NOSRK                   ((TPM_RESULT) (TPM_BASE + 18))\r
+#define TPM_NOTSEALED_BLOB          ((TPM_RESULT) (TPM_BASE + 19))\r
+#define TPM_OWNER_SET               ((TPM_RESULT) (TPM_BASE + 20))\r
+#define TPM_RESOURCES               ((TPM_RESULT) (TPM_BASE + 21))\r
+#define TPM_SHORTRANDOM             ((TPM_RESULT) (TPM_BASE + 22))\r
+#define TPM_SIZE                    ((TPM_RESULT) (TPM_BASE + 23))\r
+#define TPM_WRONGPCRVAL             ((TPM_RESULT) (TPM_BASE + 24))\r
+#define TPM_BAD_PARAM_SIZE          ((TPM_RESULT) (TPM_BASE + 25))\r
+#define TPM_SHA_THREAD              ((TPM_RESULT) (TPM_BASE + 26))\r
+#define TPM_SHA_ERROR               ((TPM_RESULT) (TPM_BASE + 27))\r
+#define TPM_FAILEDSELFTEST          ((TPM_RESULT) (TPM_BASE + 28))\r
+#define TPM_AUTH2FAIL               ((TPM_RESULT) (TPM_BASE + 29))\r
+#define TPM_BADTAG                  ((TPM_RESULT) (TPM_BASE + 30))\r
+#define TPM_IOERROR                 ((TPM_RESULT) (TPM_BASE + 31))\r
+#define TPM_ENCRYPT_ERROR           ((TPM_RESULT) (TPM_BASE + 32))\r
+#define TPM_DECRYPT_ERROR           ((TPM_RESULT) (TPM_BASE + 33))\r
+#define TPM_INVALID_AUTHHANDLE      ((TPM_RESULT) (TPM_BASE + 34))\r
+#define TPM_NO_ENDORSEMENT          ((TPM_RESULT) (TPM_BASE + 35))\r
+#define TPM_INVALID_KEYUSAGE        ((TPM_RESULT) (TPM_BASE + 36))\r
+#define TPM_WRONG_ENTITYTYPE        ((TPM_RESULT) (TPM_BASE + 37))\r
+#define TPM_INVALID_POSTINIT        ((TPM_RESULT) (TPM_BASE + 38))\r
+#define TPM_INAPPROPRIATE_SIG       ((TPM_RESULT) (TPM_BASE + 39))\r
+#define TPM_BAD_KEY_PROPERTY        ((TPM_RESULT) (TPM_BASE + 40))\r
+#define TPM_BAD_MIGRATION           ((TPM_RESULT) (TPM_BASE + 41))\r
+#define TPM_BAD_SCHEME              ((TPM_RESULT) (TPM_BASE + 42))\r
+#define TPM_BAD_DATASIZE            ((TPM_RESULT) (TPM_BASE + 43))\r
+#define TPM_BAD_MODE                ((TPM_RESULT) (TPM_BASE + 44))\r
+#define TPM_BAD_PRESENCE            ((TPM_RESULT) (TPM_BASE + 45))\r
+#define TPM_BAD_VERSION             ((TPM_RESULT) (TPM_BASE + 46))\r
+#define TPM_NO_WRAP_TRANSPORT       ((TPM_RESULT) (TPM_BASE + 47))\r
+#define TPM_AUDITFAIL_UNSUCCESSFUL  ((TPM_RESULT) (TPM_BASE + 48))\r
+#define TPM_AUDITFAIL_SUCCESSFUL    ((TPM_RESULT) (TPM_BASE + 49))\r
+#define TPM_NOTRESETABLE            ((TPM_RESULT) (TPM_BASE + 50))\r
+#define TPM_NOTLOCAL                ((TPM_RESULT) (TPM_BASE + 51))\r
+#define TPM_BAD_TYPE                ((TPM_RESULT) (TPM_BASE + 52))\r
+#define TPM_INVALID_RESOURCE        ((TPM_RESULT) (TPM_BASE + 53))\r
+#define TPM_NOTFIPS                 ((TPM_RESULT) (TPM_BASE + 54))\r
+#define TPM_INVALID_FAMILY          ((TPM_RESULT) (TPM_BASE + 55))\r
+#define TPM_NO_NV_PERMISSION        ((TPM_RESULT) (TPM_BASE + 56))\r
+#define TPM_REQUIRES_SIGN           ((TPM_RESULT) (TPM_BASE + 57))\r
+#define TPM_KEY_NOTSUPPORTED        ((TPM_RESULT) (TPM_BASE + 58))\r
+#define TPM_AUTH_CONFLICT           ((TPM_RESULT) (TPM_BASE + 59))\r
+#define TPM_AREA_LOCKED             ((TPM_RESULT) (TPM_BASE + 60))\r
+#define TPM_BAD_LOCALITY            ((TPM_RESULT) (TPM_BASE + 61))\r
+#define TPM_READ_ONLY               ((TPM_RESULT) (TPM_BASE + 62))\r
+#define TPM_PER_NOWRITE             ((TPM_RESULT) (TPM_BASE + 63))\r
+#define TPM_FAMILYCOUNT             ((TPM_RESULT) (TPM_BASE + 64))\r
+#define TPM_WRITE_LOCKED            ((TPM_RESULT) (TPM_BASE + 65))\r
+#define TPM_BAD_ATTRIBUTES          ((TPM_RESULT) (TPM_BASE + 66))\r
+#define TPM_INVALID_STRUCTURE       ((TPM_RESULT) (TPM_BASE + 67))\r
+#define TPM_KEY_OWNER_CONTROL       ((TPM_RESULT) (TPM_BASE + 68))\r
+#define TPM_BAD_COUNTER             ((TPM_RESULT) (TPM_BASE + 69))\r
+#define TPM_NOT_FULLWRITE           ((TPM_RESULT) (TPM_BASE + 70))\r
+#define TPM_CONTEXT_GAP             ((TPM_RESULT) (TPM_BASE + 71))\r
+#define TPM_MAXNVWRITES             ((TPM_RESULT) (TPM_BASE + 72))\r
+#define TPM_NOOPERATOR              ((TPM_RESULT) (TPM_BASE + 73))\r
+#define TPM_RESOURCEMISSING         ((TPM_RESULT) (TPM_BASE + 74))\r
+#define TPM_DELEGATE_LOCK           ((TPM_RESULT) (TPM_BASE + 75))\r
+#define TPM_DELEGATE_FAMILY         ((TPM_RESULT) (TPM_BASE + 76))\r
+#define TPM_DELEGATE_ADMIN          ((TPM_RESULT) (TPM_BASE + 77))\r
+#define TPM_TRANSPORT_NOTEXCLUSIVE  ((TPM_RESULT) (TPM_BASE + 78))\r
+#define TPM_OWNER_CONTROL           ((TPM_RESULT) (TPM_BASE + 79))\r
+#define TPM_DAA_RESOURCES           ((TPM_RESULT) (TPM_BASE + 80))\r
+#define TPM_DAA_INPUT_DATA0         ((TPM_RESULT) (TPM_BASE + 81))\r
+#define TPM_DAA_INPUT_DATA1         ((TPM_RESULT) (TPM_BASE + 82))\r
+#define TPM_DAA_ISSUER_SETTINGS     ((TPM_RESULT) (TPM_BASE + 83))\r
+#define TPM_DAA_TPM_SETTINGS        ((TPM_RESULT) (TPM_BASE + 84))\r
+#define TPM_DAA_STAGE               ((TPM_RESULT) (TPM_BASE + 85))\r
+#define TPM_DAA_ISSUER_VALIDITY     ((TPM_RESULT) (TPM_BASE + 86))\r
+#define TPM_DAA_WRONG_W             ((TPM_RESULT) (TPM_BASE + 87))\r
+#define TPM_BAD_HANDLE              ((TPM_RESULT) (TPM_BASE + 88))\r
+#define TPM_BAD_DELEGATE            ((TPM_RESULT) (TPM_BASE + 89))\r
+#define TPM_BADCONTEXT              ((TPM_RESULT) (TPM_BASE + 90))\r
+#define TPM_TOOMANYCONTEXTS         ((TPM_RESULT) (TPM_BASE + 91))\r
+#define TPM_MA_TICKET_SIGNATURE     ((TPM_RESULT) (TPM_BASE + 92))\r
+#define TPM_MA_DESTINATION          ((TPM_RESULT) (TPM_BASE + 93))\r
+#define TPM_MA_SOURCE               ((TPM_RESULT) (TPM_BASE + 94))\r
+#define TPM_MA_AUTHORITY            ((TPM_RESULT) (TPM_BASE + 95))\r
+#define TPM_PERMANENTEK             ((TPM_RESULT) (TPM_BASE + 97))\r
+#define TPM_BAD_SIGNATURE           ((TPM_RESULT) (TPM_BASE + 98))\r
+#define TPM_NOCONTEXTSPACE          ((TPM_RESULT) (TPM_BASE + 99))\r
+\r
+#define TPM_RETRY                   ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL))\r
+#define TPM_NEEDS_SELFTEST          ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL + 1))\r
+#define TPM_DOING_SELFTEST          ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL + 2))\r
+#define TPM_DEFEND_LOCK_RUNNING     ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL + 3))\r
+\r
+//\r
+// Part 2, section 17: Ordinals\r
+//\r
+// Ordinals are 32 bit values. The upper byte contains values that serve as\r
+// flag indicators, the next byte contains values indicating what committee\r
+// designated the ordinal, and the final two bytes contain the Command\r
+// Ordinal Index.\r
+//      3                   2                   1\r
+//    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\r
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+//   |P|C|V| Reserved| Purview |     Command Ordinal Index           |\r
+//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+//\r
+//  Where:\r
+//\r
+//    * P is Protected/Unprotected command. When 0 the command is a Protected\r
+//      command, when 1 the command is an Unprotected command.\r
+//\r
+//    * C is Non-Connection/Connection related command. When 0 this command\r
+//      passes through to either the protected (TPM) or unprotected (TSS)\r
+//      components.\r
+//\r
+//    * V is TPM/Vendor command. When 0 the command is TPM defined, when 1 the\r
+//      command is vendor defined.\r
+//\r
+//    * All reserved area bits are set to 0.\r
+//\r
+\r
+#define TPM_ORD_ActivateIdentity                  ((TPM_COMMAND_CODE) 0x0000007A)\r
+#define TPM_ORD_AuthorizeMigrationKey             ((TPM_COMMAND_CODE) 0x0000002B)\r
+#define TPM_ORD_CertifyKey                        ((TPM_COMMAND_CODE) 0x00000032)\r
+#define TPM_ORD_CertifyKey2                       ((TPM_COMMAND_CODE) 0x00000033)\r
+#define TPM_ORD_CertifySelfTest                   ((TPM_COMMAND_CODE) 0x00000052)\r
+#define TPM_ORD_ChangeAuth                        ((TPM_COMMAND_CODE) 0x0000000C)\r
+#define TPM_ORD_ChangeAuthAsymFinish              ((TPM_COMMAND_CODE) 0x0000000F)\r
+#define TPM_ORD_ChangeAuthAsymStart               ((TPM_COMMAND_CODE) 0x0000000E)\r
+#define TPM_ORD_ChangeAuthOwner                   ((TPM_COMMAND_CODE) 0x00000010)\r
+#define TPM_ORD_CMK_ApproveMA                     ((TPM_COMMAND_CODE) 0x0000001D)\r
+#define TPM_ORD_CMK_ConvertMigration              ((TPM_COMMAND_CODE) 0x00000024)\r
+#define TPM_ORD_CMK_CreateBlob                    ((TPM_COMMAND_CODE) 0x0000001B)\r
+#define TPM_ORD_CMK_CreateKey                     ((TPM_COMMAND_CODE) 0x00000013)\r
+#define TPM_ORD_CMK_CreateTicket                  ((TPM_COMMAND_CODE) 0x00000012)\r
+#define TPM_ORD_CMK_SetRestrictions               ((TPM_COMMAND_CODE) 0x0000001C)\r
+#define TPM_ORD_ContinueSelfTest                  ((TPM_COMMAND_CODE) 0x00000053)\r
+#define TPM_ORD_ConvertMigrationBlob              ((TPM_COMMAND_CODE) 0x0000002A)\r
+#define TPM_ORD_CreateCounter                     ((TPM_COMMAND_CODE) 0x000000DC)\r
+#define TPM_ORD_CreateEndorsementKeyPair          ((TPM_COMMAND_CODE) 0x00000078)\r
+#define TPM_ORD_CreateMaintenanceArchive          ((TPM_COMMAND_CODE) 0x0000002C)\r
+#define TPM_ORD_CreateMigrationBlob               ((TPM_COMMAND_CODE) 0x00000028)\r
+#define TPM_ORD_CreateRevocableEK                 ((TPM_COMMAND_CODE) 0x0000007F)\r
+#define TPM_ORD_CreateWrapKey                     ((TPM_COMMAND_CODE) 0x0000001F)\r
+#define TPM_ORD_DAA_JOIN                          ((TPM_COMMAND_CODE) 0x00000029)\r
+#define TPM_ORD_DAA_SIGN                          ((TPM_COMMAND_CODE) 0x00000031)\r
+#define TPM_ORD_Delegate_CreateKeyDelegation      ((TPM_COMMAND_CODE) 0x000000D4)\r
+#define TPM_ORD_Delegate_CreateOwnerDelegation    ((TPM_COMMAND_CODE) 0x000000D5)\r
+#define TPM_ORD_Delegate_LoadOwnerDelegation      ((TPM_COMMAND_CODE) 0x000000D8)\r
+#define TPM_ORD_Delegate_Manage                   ((TPM_COMMAND_CODE) 0x000000D2)\r
+#define TPM_ORD_Delegate_ReadTable                ((TPM_COMMAND_CODE) 0x000000DB)\r
+#define TPM_ORD_Delegate_UpdateVerification       ((TPM_COMMAND_CODE) 0x000000D1)\r
+#define TPM_ORD_Delegate_VerifyDelegation         ((TPM_COMMAND_CODE) 0x000000D6)\r
+#define TPM_ORD_DirRead                           ((TPM_COMMAND_CODE) 0x0000001A)\r
+#define TPM_ORD_DirWriteAuth                      ((TPM_COMMAND_CODE) 0x00000019)\r
+#define TPM_ORD_DisableForceClear                 ((TPM_COMMAND_CODE) 0x0000005E)\r
+#define TPM_ORD_DisableOwnerClear                 ((TPM_COMMAND_CODE) 0x0000005C)\r
+#define TPM_ORD_DisablePubekRead                  ((TPM_COMMAND_CODE) 0x0000007E)\r
+#define TPM_ORD_DSAP                              ((TPM_COMMAND_CODE) 0x00000011)\r
+#define TPM_ORD_EstablishTransport                ((TPM_COMMAND_CODE) 0x000000E6)\r
+#define TPM_ORD_EvictKey                          ((TPM_COMMAND_CODE) 0x00000022)\r
+#define TPM_ORD_ExecuteTransport                  ((TPM_COMMAND_CODE) 0x000000E7)\r
+#define TPM_ORD_Extend                            ((TPM_COMMAND_CODE) 0x00000014)\r
+#define TPM_ORD_FieldUpgrade                      ((TPM_COMMAND_CODE) 0x000000AA)\r
+#define TPM_ORD_FlushSpecific                     ((TPM_COMMAND_CODE) 0x000000BA)\r
+#define TPM_ORD_ForceClear                        ((TPM_COMMAND_CODE) 0x0000005D)\r
+#define TPM_ORD_GetAuditDigest                    ((TPM_COMMAND_CODE) 0x00000085)\r
+#define TPM_ORD_GetAuditDigestSigned              ((TPM_COMMAND_CODE) 0x00000086)\r
+#define TPM_ORD_GetAuditEvent                     ((TPM_COMMAND_CODE) 0x00000082)\r
+#define TPM_ORD_GetAuditEventSigned               ((TPM_COMMAND_CODE) 0x00000083)\r
+#define TPM_ORD_GetCapability                     ((TPM_COMMAND_CODE) 0x00000065)\r
+#define TPM_ORD_GetCapabilityOwner                ((TPM_COMMAND_CODE) 0x00000066)\r
+#define TPM_ORD_GetCapabilitySigned               ((TPM_COMMAND_CODE) 0x00000064)\r
+#define TPM_ORD_GetOrdinalAuditStatus             ((TPM_COMMAND_CODE) 0x0000008C)\r
+#define TPM_ORD_GetPubKey                         ((TPM_COMMAND_CODE) 0x00000021)\r
+#define TPM_ORD_GetRandom                         ((TPM_COMMAND_CODE) 0x00000046)\r
+#define TPM_ORD_GetTestResult                     ((TPM_COMMAND_CODE) 0x00000054)\r
+#define TPM_ORD_GetTicks                          ((TPM_COMMAND_CODE) 0x000000F1)\r
+#define TPM_ORD_IncrementCounter                  ((TPM_COMMAND_CODE) 0x000000DD)\r
+#define TPM_ORD_Init                              ((TPM_COMMAND_CODE) 0x00000097)\r
+#define TPM_ORD_KeyControlOwner                   ((TPM_COMMAND_CODE) 0x00000023)\r
+#define TPM_ORD_KillMaintenanceFeature            ((TPM_COMMAND_CODE) 0x0000002E)\r
+#define TPM_ORD_LoadAuthContext                   ((TPM_COMMAND_CODE) 0x000000B7)\r
+#define TPM_ORD_LoadContext                       ((TPM_COMMAND_CODE) 0x000000B9)\r
+#define TPM_ORD_LoadKey                           ((TPM_COMMAND_CODE) 0x00000020)\r
+#define TPM_ORD_LoadKey2                          ((TPM_COMMAND_CODE) 0x00000041)\r
+#define TPM_ORD_LoadKeyContext                    ((TPM_COMMAND_CODE) 0x000000B5)\r
+#define TPM_ORD_LoadMaintenanceArchive            ((TPM_COMMAND_CODE) 0x0000002D)\r
+#define TPM_ORD_LoadManuMaintPub                  ((TPM_COMMAND_CODE) 0x0000002F)\r
+#define TPM_ORD_MakeIdentity                      ((TPM_COMMAND_CODE) 0x00000079)\r
+#define TPM_ORD_MigrateKey                        ((TPM_COMMAND_CODE) 0x00000025)\r
+#define TPM_ORD_NV_DefineSpace                    ((TPM_COMMAND_CODE) 0x000000CC)\r
+#define TPM_ORD_NV_ReadValue                      ((TPM_COMMAND_CODE) 0x000000CF)\r
+#define TPM_ORD_NV_ReadValueAuth                  ((TPM_COMMAND_CODE) 0x000000D0)\r
+#define TPM_ORD_NV_WriteValue                     ((TPM_COMMAND_CODE) 0x000000CD)\r
+#define TPM_ORD_NV_WriteValueAuth                 ((TPM_COMMAND_CODE) 0x000000CE)\r
+#define TPM_ORD_OIAP                              ((TPM_COMMAND_CODE) 0x0000000A)\r
+#define TPM_ORD_OSAP                              ((TPM_COMMAND_CODE) 0x0000000B)\r
+#define TPM_ORD_OwnerClear                        ((TPM_COMMAND_CODE) 0x0000005B)\r
+#define TPM_ORD_OwnerReadInternalPub              ((TPM_COMMAND_CODE) 0x00000081)\r
+#define TPM_ORD_OwnerReadPubek                    ((TPM_COMMAND_CODE) 0x0000007D)\r
+#define TPM_ORD_OwnerSetDisable                   ((TPM_COMMAND_CODE) 0x0000006E)\r
+#define TPM_ORD_PCR_Reset                         ((TPM_COMMAND_CODE) 0x000000C8)\r
+#define TPM_ORD_PcrRead                           ((TPM_COMMAND_CODE) 0x00000015)\r
+#define TPM_ORD_PhysicalDisable                   ((TPM_COMMAND_CODE) 0x00000070)\r
+#define TPM_ORD_PhysicalEnable                    ((TPM_COMMAND_CODE) 0x0000006F)\r
+#define TPM_ORD_PhysicalSetDeactivated            ((TPM_COMMAND_CODE) 0x00000072)\r
+#define TPM_ORD_Quote                             ((TPM_COMMAND_CODE) 0x00000016)\r
+#define TPM_ORD_Quote2                            ((TPM_COMMAND_CODE) 0x0000003E)\r
+#define TPM_ORD_ReadCounter                       ((TPM_COMMAND_CODE) 0x000000DE)\r
+#define TPM_ORD_ReadManuMaintPub                  ((TPM_COMMAND_CODE) 0x00000030)\r
+#define TPM_ORD_ReadPubek                         ((TPM_COMMAND_CODE) 0x0000007C)\r
+#define TPM_ORD_ReleaseCounter                    ((TPM_COMMAND_CODE) 0x000000DF)\r
+#define TPM_ORD_ReleaseCounterOwner               ((TPM_COMMAND_CODE) 0x000000E0)\r
+#define TPM_ORD_ReleaseTransportSigned            ((TPM_COMMAND_CODE) 0x000000E8)\r
+#define TPM_ORD_Reset                             ((TPM_COMMAND_CODE) 0x0000005A)\r
+#define TPM_ORD_ResetLockValue                    ((TPM_COMMAND_CODE) 0x00000040)\r
+#define TPM_ORD_RevokeTrust                       ((TPM_COMMAND_CODE) 0x00000080)\r
+#define TPM_ORD_SaveAuthContext                   ((TPM_COMMAND_CODE) 0x000000B6)\r
+#define TPM_ORD_SaveContext                       ((TPM_COMMAND_CODE) 0x000000B8)\r
+#define TPM_ORD_SaveKeyContext                    ((TPM_COMMAND_CODE) 0x000000B4)\r
+#define TPM_ORD_SaveState                         ((TPM_COMMAND_CODE) 0x00000098)\r
+#define TPM_ORD_Seal                              ((TPM_COMMAND_CODE) 0x00000017)\r
+#define TPM_ORD_Sealx                             ((TPM_COMMAND_CODE) 0x0000003D)\r
+#define TPM_ORD_SelfTestFull                      ((TPM_COMMAND_CODE) 0x00000050)\r
+#define TPM_ORD_SetCapability                     ((TPM_COMMAND_CODE) 0x0000003F)\r
+#define TPM_ORD_SetOperatorAuth                   ((TPM_COMMAND_CODE) 0x00000074)\r
+#define TPM_ORD_SetOrdinalAuditStatus             ((TPM_COMMAND_CODE) 0x0000008D)\r
+#define TPM_ORD_SetOwnerInstall                   ((TPM_COMMAND_CODE) 0x00000071)\r
+#define TPM_ORD_SetOwnerPointer                   ((TPM_COMMAND_CODE) 0x00000075)\r
+#define TPM_ORD_SetRedirection                    ((TPM_COMMAND_CODE) 0x0000009A)\r
+#define TPM_ORD_SetTempDeactivated                ((TPM_COMMAND_CODE) 0x00000073)\r
+#define TPM_ORD_SHA1Complete                      ((TPM_COMMAND_CODE) 0x000000A2)\r
+#define TPM_ORD_SHA1CompleteExtend                ((TPM_COMMAND_CODE) 0x000000A3)\r
+#define TPM_ORD_SHA1Start                         ((TPM_COMMAND_CODE) 0x000000A0)\r
+#define TPM_ORD_SHA1Update                        ((TPM_COMMAND_CODE) 0x000000A1)\r
+#define TPM_ORD_Sign                              ((TPM_COMMAND_CODE) 0x0000003C)\r
+#define TPM_ORD_Startup                           ((TPM_COMMAND_CODE) 0x00000099)\r
+#define TPM_ORD_StirRandom                        ((TPM_COMMAND_CODE) 0x00000047)\r
+#define TPM_ORD_TakeOwnership                     ((TPM_COMMAND_CODE) 0x0000000D)\r
+#define TPM_ORD_Terminate_Handle                  ((TPM_COMMAND_CODE) 0x00000096)\r
+#define TPM_ORD_TickStampBlob                     ((TPM_COMMAND_CODE) 0x000000F2)\r
+#define TPM_ORD_UnBind                            ((TPM_COMMAND_CODE) 0x0000001E)\r
+#define TPM_ORD_Unseal                            ((TPM_COMMAND_CODE) 0x00000018)\r
+#define TSC_ORD_PhysicalPresence                  ((TPM_COMMAND_CODE) 0x4000000A)\r
+#define TSC_ORD_ResetEstablishmentBit             ((TPM_COMMAND_CODE) 0x4000000B)\r
+\r
+//\r
+// Part 2, section 18: Context structures\r
+//\r
+\r
+typedef struct tdTPM_CONTEXT_BLOB\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_RESOURCE_TYPE               resourceType;\r
+    TPM_HANDLE                      handle;\r
+    UINT8                           label[16];\r
+    UINT32                          contextCount;\r
+    TPM_DIGEST                      integrityDigest;\r
+    UINT32                          additionalSize;\r
+    UINT8                           *additionalData;\r
+    UINT32                          sensitiveSize;\r
+    UINT8                           *sensitiveData;\r
+} TPM_CONTEXT_BLOB;\r
+\r
+typedef struct tdTPM_CONTEXT_SENSITIVE\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_NONCE                       contextNonce;\r
+    UINT32                          internalSize;\r
+    UINT8                           *internalData;\r
+} TPM_CONTEXT_SENSITIVE;\r
+\r
+//\r
+// Part 2, section 19: NV Structures\r
+//\r
+\r
+#define TPM_NV_INDEX_LOCK              ((UINT32)0xffffffff)\r
+#define TPM_NV_INDEX0                  ((UINT32)0x00000000)\r
+#define TPM_NV_INDEX_DIR               ((UINT32)0x10000001)\r
+#define TPM_NV_INDEX_EKCert            ((UINT32)0x0000f000)\r
+#define TPM_NV_INDEX_TPM_CC            ((UINT32)0x0000f001)\r
+#define TPM_NV_INDEX_PlatformCert      ((UINT32)0x0000f002)\r
+#define TPM_NV_INDEX_Platform_CC       ((UINT32)0x0000f003)\r
+// The following define ranges of reserved indices.\r
+#define TPM_NV_INDEX_TSS_BASE          ((UINT32)0x00011100)\r
+#define TPM_NV_INDEX_PC_BASE           ((UINT32)0x00011200)\r
+#define TPM_NV_INDEX_SERVER_BASE       ((UINT32)0x00011300)\r
+#define TPM_NV_INDEX_MOBILE_BASE       ((UINT32)0x00011400)\r
+#define TPM_NV_INDEX_PERIPHERAL_BASE   ((UINT32)0x00011500)\r
+#define TPM_NV_INDEX_GROUP_RESV_BASE   ((UINT32)0x00010000)\r
+\r
+typedef UINT32 TPM_NV_PER_ATTRIBUTES;\r
+// The typedefs TPM_NV_PER_ATTRIBUTES (not present in TPM 1.2 Spec. have been added \r
+// and structure fields that were to hold the following values\r
+#define TPM_NV_PER_READ_STCLEAR        (((UINT32)1)<<31)\r
+#define TPM_NV_PER_AUTHREAD            (((UINT32)1)<<18)\r
+#define TPM_NV_PER_OWNERREAD           (((UINT32)1)<<17)\r
+#define TPM_NV_PER_PPREAD              (((UINT32)1)<<16)\r
+#define TPM_NV_PER_GLOBALLOCK          (((UINT32)1)<<15)\r
+#define TPM_NV_PER_WRITE_STCLEAR       (((UINT32)1)<<14)\r
+#define TPM_NV_PER_WRITEDEFINE         (((UINT32)1)<<13)\r
+#define TPM_NV_PER_WRITEALL            (((UINT32)1)<<12)\r
+#define TPM_NV_PER_AUTHWRITE           (((UINT32)1)<<2)\r
+#define TPM_NV_PER_OWNERWRITE          (((UINT32)1)<<1)\r
+#define TPM_NV_PER_PPWRITE             (((UINT32)1)<<0)\r
+\r
+typedef struct tdTPM_NV_ATTRIBUTES\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_NV_PER_ATTRIBUTES           attributes;\r
+} TPM_NV_ATTRIBUTES;\r
+\r
+\r
+typedef struct tdTPM_NV_DATA_PUBLIC\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_NV_INDEX                    nvIndex;\r
+    TPM_PCR_INFO_SHORT              pcrInfoRead;\r
+    TPM_PCR_INFO_SHORT              pcrInfoWrite;\r
+    TPM_NV_ATTRIBUTES               permission;\r
+    BOOLEAN                         bReadSTClear;\r
+    BOOLEAN                         bWriteSTClear;\r
+    BOOLEAN                         bWriteDefine;\r
+    UINT32                          dataSize;\r
+} TPM_NV_DATA_PUBLIC;\r
+\r
+\r
+\r
+// Internal to TPM:\r
+//typedef struct tdTPM_NV_DATA_SENSITIVE\r
+//{\r
+//    TPM_STRUCTURE_TAG               tag;\r
+//    TPM_NV_DATA_PUBLIC              pubInfo;\r
+//   TPM_AUTHDATA                    authValue;\r
+//    UINT8                           *data;\r
+//} TPM_NV_DATA_SENSITIVE;\r
+\r
+\r
+//\r
+// Part 2, section 20: Delegation\r
+//\r
+\r
+//\r
+// Part 2, section 20.3: Owner Permissions Settings for per1 bits\r
+//\r
+#define TPM_DELEGATE_SetOrdinalAuditStatus          (((UINT32)1)<<30)\r
+#define TPM_DELEGATE_DirWriteAuth                   (((UINT32)1)<<29)\r
+#define TPM_DELEGATE_CMK_ApproveMA                  (((UINT32)1)<<28)\r
+#define TPM_DELEGATE_CMK_CreateTicket               (((UINT32)1)<<26)\r
+#define TPM_DELEGATE_Delegate_LoadOwnerDelegation   (((UINT32)1)<<24)\r
+#define TPM_DELEGATE_DAA_Join                       (((UINT32)1)<<23)\r
+#define TPM_DELEGATE_AuthorizeMigrationKey          (((UINT32)1)<<22)\r
+#define TPM_DELEGATE_CreateMaintenanceArchive       (((UINT32)1)<<21)\r
+#define TPM_DELEGATE_LoadMaintenanceArchive         (((UINT32)1)<<20)\r
+#define TPM_DELEGATE_KillMaintenanceFeature         (((UINT32)1)<<19)\r
+#define TPM_DELEGATE_OwnerReadInteralPub            (((UINT32)1)<<18)\r
+#define TPM_DELEGATE_ResetLockValue                 (((UINT32)1)<<17)\r
+#define TPM_DELEGATE_OwnerClear                     (((UINT32)1)<<16)\r
+#define TPM_DELEGATE_DisableOwnerClear              (((UINT32)1)<<15)\r
+#define TPM_DELEGATE_OwnerSetDisable                (((UINT32)1)<<13)\r
+#define TPM_DELEGATE_SetCapability                  (((UINT32)1)<<12)\r
+#define TPM_DELEGATE_MakeIdentity                   (((UINT32)1)<<11)\r
+#define TPM_DELEGATE_ActivateIdentity               (((UINT32)1)<<10)\r
+#define TPM_DELEGATE_OwnerReadPubek                 (((UINT32)1)<<9)\r
+#define TPM_DELEGATE_DisablePubekRead               (((UINT32)1)<<8)\r
+#define TPM_DELEGATE_SetRedirection                 (((UINT32)1)<<7)\r
+#define TPM_DELEGATE_FieldUpgrade                   (((UINT32)1)<<6)\r
+#define TPM_DELEGATE_Delegate_UpdateVerification    (((UINT32)1)<<5)\r
+#define TPM_DELEGATE_CreateCounter                  (((UINT32)1)<<4)\r
+#define TPM_DELEGATE_ReleaseCounterOwner            (((UINT32)1)<<3)\r
+#define TPM_DELEGATE_DelegateManage                 (((UINT32)1)<<2)\r
+#define TPM_DELEGATE_Delegate_CreateOwnerDelegation (((UINT32)1)<<1)\r
+#define TPM_DELEGATE_DAA_Sign                       (((UINT32)1)<<0)\r
+\r
+//\r
+// Part 2, section 20.3: Key Permissions Settings for per1 bits\r
+//\r
+#define TPM_KEY_DELEGATE_CMK_ConvertMigration       (((UINT32)1)<<28)\r
+#define TPM_KEY_DELEGATE_TickStampBlob              (((UINT32)1)<<27)\r
+#define TPM_KEY_DELEGATE_ChangeAuthAsymStart        (((UINT32)1)<<26)\r
+#define TPM_KEY_DELEGATE_ChangeAuthAsymFinish       (((UINT32)1)<<25)\r
+#define TPM_KEY_DELEGATE_CMK_CreateKey              (((UINT32)1)<<24)\r
+#define TPM_KEY_DELEGATE_MigrateKey                 (((UINT32)1)<<23)\r
+#define TPM_KEY_DELEGATE_LoadKey2                   (((UINT32)1)<<22)\r
+#define TPM_KEY_DELEGATE_EstablishTransport         (((UINT32)1)<<21)\r
+#define TPM_KEY_DELEGATE_ReleaseTransportSigned     (((UINT32)1)<<20)\r
+#define TPM_KEY_DELEGATE_Quote2                     (((UINT32)1)<<19)\r
+#define TPM_KEY_DELEGATE_Sealx                      (((UINT32)1)<<18)\r
+#define TPM_KEY_DELEGATE_MakeIdentity               (((UINT32)1)<<17)\r
+#define TPM_KEY_DELEGATE_ActivateIdentity           (((UINT32)1)<<16)\r
+#define TPM_KEY_DELEGATE_GetAuditDigestSigned       (((UINT32)1)<<15)\r
+#define TPM_KEY_DELEGATE_Sign                       (((UINT32)1)<<14)\r
+#define TPM_KEY_DELEGATE_CertifyKey2                (((UINT32)1)<<13)\r
+#define TPM_KEY_DELEGATE_CertifyKey                 (((UINT32)1)<<12)\r
+#define TPM_KEY_DELEGATE_CreateWrapKey              (((UINT32)1)<<11)\r
+#define TPM_KEY_DELEGATE_CMK_CreateBlob             (((UINT32)1)<<10)\r
+#define TPM_KEY_DELEGATE_CreateMigrationBlob        (((UINT32)1)<<9)\r
+#define TPM_KEY_DELEGATE_ConvertMigrationBlob       (((UINT32)1)<<8)\r
+#define TPM_KEY_DELEGATE_CreateKeyDelegation        (((UINT32)1)<<7)\r
+#define TPM_KEY_DELEGATE_ChangeAuth                 (((UINT32)1)<<6)\r
+#define TPM_KEY_DELEGATE_GetPubKey                  (((UINT32)1)<<5)\r
+#define TPM_KEY_DELEGATE_UnBind                     (((UINT32)1)<<4)\r
+#define TPM_KEY_DELEGATE_Quote                      (((UINT32)1)<<3)\r
+#define TPM_KEY_DELEGATE_Unseal                     (((UINT32)1)<<2)\r
+#define TPM_KEY_DELEGATE_Seal                       (((UINT32)1)<<1)\r
+#define TPM_KEY_DELEGATE_LoadKey                    (((UINT32)1)<<0)\r
+\r
+#define TPM_FAMILY_CREATE                 ((UINT32)0x00000001)\r
+#define TPM_FAMILY_ENABLE                 ((UINT32)0x00000002)\r
+#define TPM_FAMILY_ADMIN                  ((UINT32)0x00000003)\r
+#define TPM_FAMILY_INVALIDATE             ((UINT32)0x00000004)\r
+\r
+#define TPM_FAMFLAG_DELEGATE_ADMIN_LOCK   (((UINT32)1)<<1)\r
+#define TPM_FAMFLAG_ENABLE                (((UINT32)1)<<0)\r
+\r
+typedef struct tdTPM_FAMILY_LABEL\r
+{\r
+    UINT8                           label;\r
+} TPM_FAMILY_LABEL;\r
+\r
+typedef struct tdTPM_FAMILY_TABLE_ENTRY\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_FAMILY_LABEL                label;\r
+    TPM_FAMILY_ID                   familyID;\r
+    TPM_FAMILY_VERIFICATION         verificationCount;\r
+    TPM_FAMILY_FLAGS                flags;\r
+} TPM_FAMILY_TABLE_ENTRY;\r
+\r
+#define TPM_FAMILY_TABLE_ENTRY_MIN 8\r
+//typedef struct tdTPM_FAMILY_TABLE\r
+//{\r
+//    TPM_FAMILY_TABLE_ENTRY          FamTableRow[TPM_NUM_FAMILY_TABLE_ENTRY_MIN];\r
+//} TPM_FAMILY_TABLE;\r
+\r
+\r
+typedef struct tdTPM_DELEGATE_LABEL\r
+{\r
+    UINT8                           label;\r
+} TPM_DELEGATE_LABEL;\r
+\r
+\r
+typedef UINT32 TPM_DELEGATE_TYPE;\r
+#define TPM_DEL_OWNER_BITS          ((UINT32)0x00000001)\r
+#define TPM_DEL_KEY_BITS            ((UINT32)0x00000002)\r
+\r
+typedef struct tdTPM_DELEGATIONS\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DELEGATE_TYPE               delegateType;\r
+    UINT32                          per1;\r
+    UINT32                          per2;\r
+} TPM_DELEGATIONS;\r
+\r
+typedef struct tdTPM_DELEGATE_PUBLIC\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DELEGATE_LABEL              label;\r
+    TPM_PCR_INFO_SHORT              pcrInfo;\r
+    TPM_DELEGATIONS                 permissions;\r
+    TPM_FAMILY_ID                   familyID;\r
+    TPM_FAMILY_VERIFICATION         verificationCount;\r
+} TPM_DELEGATE_PUBLIC;\r
+\r
+typedef struct tdTPM_DELEGATE_TABLE_ROW\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DELEGATE_PUBLIC             pub;\r
+    TPM_SECRET                      authValue;\r
+} TPM_DELEGATE_TABLE_ROW;\r
+\r
+\r
+#define TPM_NUM_DELEGATE_TABLE_ENTRY_MIN 2\r
+//typedef struct tdTPM_DELEGATE_TABLE\r
+//{\r
+//    TPM_DELEGATE_TABLE_ROW          delRow[TPM_NUM_DELEGATE_TABLE_ENTRY_MIN];\r
+//} TPM_DELEGATE_TABLE;\r
+\r
+typedef struct tdTPM_DELEGATE_SENSITIVE\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_SECRET                      authValue;\r
+} TPM_DELEGATE_SENSITIVE;\r
+\r
+typedef struct tdTPM_DELEGATE_OWNER_BLOB\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DELEGATE_PUBLIC             pub;\r
+    TPM_DIGEST                      integrityDigest;\r
+    UINT32                          additionalSize;\r
+    UINT8                           *additionalArea;\r
+    UINT32                          sensitiveSize;\r
+    UINT8                           *sensitiveArea;\r
+} TPM_DELEGATE_OWNER_BLOB;\r
+\r
+typedef struct tdTPM_DELEGATE_KEY_BLOB\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DELEGATE_PUBLIC             pub;\r
+    TPM_DIGEST                      integrityDigest;\r
+    TPM_DIGEST                      pubKeyDigest;\r
+    UINT32                          additionalSize;\r
+    UINT8                           *additionalArea;\r
+    UINT32                          sensitiveSize;\r
+    UINT8                           *sensitiveArea;\r
+} TPM_DELEGATE_KEY_BLOB;\r
+\r
+//\r
+// Part 2, section 21.1: TPM_CAPABILITY_AREA for GetCapability\r
+//\r
+#define TPM_CAP_ORD                     ((TPM_CAPABILITY_AREA) 0x00000001)\r
+#define TPM_CAP_ALG                     ((TPM_CAPABILITY_AREA) 0x00000002)\r
+#define TPM_CAP_PID                     ((TPM_CAPABILITY_AREA) 0x00000003)\r
+#define TPM_CAP_FLAG                    ((TPM_CAPABILITY_AREA) 0x00000004)\r
+#define TPM_CAP_PROPERTY                ((TPM_CAPABILITY_AREA) 0x00000005)\r
+#define TPM_CAP_VERSION                 ((TPM_CAPABILITY_AREA) 0x00000006)\r
+#define TPM_CAP_KEY_HANDLE              ((TPM_CAPABILITY_AREA) 0x00000007)\r
+#define TPM_CAP_CHECK_LOADED            ((TPM_CAPABILITY_AREA) 0x00000008)\r
+#define TPM_CAP_SYM_MODE                ((TPM_CAPABILITY_AREA) 0x00000009)\r
+#define TPM_CAP_KEY_STATUS              ((TPM_CAPABILITY_AREA) 0x0000000C)\r
+#define TPM_CAP_NV_LIST                 ((TPM_CAPABILITY_AREA) 0x0000000D)\r
+#define TPM_CAP_MFR                     ((TPM_CAPABILITY_AREA) 0x00000010)\r
+#define TPM_CAP_NV_INDEX                ((TPM_CAPABILITY_AREA) 0x00000011)\r
+#define TPM_CAP_TRANS_ALG               ((TPM_CAPABILITY_AREA) 0x00000012)\r
+#define TPM_CAP_HANDLE                  ((TPM_CAPABILITY_AREA) 0x00000014)\r
+#define TPM_CAP_TRANS_ES                ((TPM_CAPABILITY_AREA) 0x00000015)\r
+#define TPM_CAP_AUTH_ENCRYPT            ((TPM_CAPABILITY_AREA) 0x00000017)\r
+#define TPM_CAP_SELECT_SIZE             ((TPM_CAPABILITY_AREA) 0x00000018)\r
+#define TPM_CAP_VERSION_VAL             ((TPM_CAPABILITY_AREA) 0x0000001A)\r
+\r
+#define TPM_CAP_FLAG_PERMANENT          ((TPM_CAPABILITY_AREA) 0x00000108)\r
+#define TPM_CAP_FLAG_VOLATILE           ((TPM_CAPABILITY_AREA) 0x00000109)\r
+\r
+//\r
+// Part 2, section 21.2: CAP_PROPERTY Subcap values for GetCapability\r
+//\r
+#define TPM_CAP_PROP_PCR                ((TPM_CAPABILITY_AREA) 0x00000101)\r
+#define TPM_CAP_PROP_DIR                ((TPM_CAPABILITY_AREA) 0x00000102)\r
+#define TPM_CAP_PROP_MANUFACTURER       ((TPM_CAPABILITY_AREA) 0x00000103)\r
+#define TPM_CAP_PROP_KEYS               ((TPM_CAPABILITY_AREA) 0x00000104)\r
+#define TPM_CAP_PROP_MIN_COUNTER        ((TPM_CAPABILITY_AREA) 0x00000107)\r
+#define TPM_CAP_PROP_AUTHSESS           ((TPM_CAPABILITY_AREA) 0x0000010A)\r
+#define TPM_CAP_PROP_TRANSESS           ((TPM_CAPABILITY_AREA) 0x0000010B)\r
+#define TPM_CAP_PROP_COUNTERS           ((TPM_CAPABILITY_AREA) 0x0000010C)\r
+#define TPM_CAP_PROP_MAX_AUTHSESS       ((TPM_CAPABILITY_AREA) 0x0000010D)\r
+#define TPM_CAP_PROP_MAX_TRANSESS       ((TPM_CAPABILITY_AREA) 0x0000010E)\r
+#define TPM_CAP_PROP_MAX_COUNTERS       ((TPM_CAPABILITY_AREA) 0x0000010F)\r
+#define TPM_CAP_PROP_MAX_KEYS           ((TPM_CAPABILITY_AREA) 0x00000110)\r
+#define TPM_CAP_PROP_OWNER              ((TPM_CAPABILITY_AREA) 0x00000111)\r
+#define TPM_CAP_PROP_CONTEXT            ((TPM_CAPABILITY_AREA) 0x00000112)\r
+#define TPM_CAP_PROP_MAX_CONTEXT        ((TPM_CAPABILITY_AREA) 0x00000113)\r
+#define TPM_CAP_PROP_FAMILYROWS         ((TPM_CAPABILITY_AREA) 0x00000114)\r
+#define TPM_CAP_PROP_TIS_TIMEOUT        ((TPM_CAPABILITY_AREA) 0x00000115)\r
+#define TPM_CAP_PROP_STARTUP_EFFECT     ((TPM_CAPABILITY_AREA) 0x00000116)\r
+#define TPM_CAP_PROP_DELEGATE_ROW       ((TPM_CAPABILITY_AREA) 0x00000117)\r
+#define TPM_CAP_PROP_DAA_MAX            ((TPM_CAPABILITY_AREA) 0x00000119)\r
+#define CAP_PROP_SESSION_DAA            ((TPM_CAPABILITY_AREA) 0x0000011A)\r
+#define TPM_CAP_PROP_CONTEXT_DIST       ((TPM_CAPABILITY_AREA) 0x0000011B)\r
+#define TPM_CAP_PROP_DAA_INTERRUPT      ((TPM_CAPABILITY_AREA) 0x0000011C)\r
+#define TPM_CAP_PROP_SESSIONS           ((TPM_CAPABILITY_AREA) 0x0000011D)\r
+#define TPM_CAP_PROP_MAX_SESSIONS       ((TPM_CAPABILITY_AREA) 0x0000011E)\r
+#define TPM_CAP_PROP_CMK_RESTRICTION    ((TPM_CAPABILITY_AREA) 0x0000011F)\r
+#define TPM_CAP_PROP_DURATION           ((TPM_CAPABILITY_AREA) 0x00000120)\r
+#define TPM_CAP_PROP_ACTIVE_COUNTER     ((TPM_CAPABILITY_AREA) 0x00000122)\r
+#define TPM_CAP_PROP_MAX_NV_AVAILABLE   ((TPM_CAPABILITY_AREA) 0x00000123)\r
+#define TPM_CAP_PROP_INPUT_BUFFER       ((TPM_CAPABILITY_AREA) 0x00000124)\r
+\r
+//\r
+// Part 2, section 21.6: TPM_CAP_VERSION_INFO\r
+//   [size_is(vendorSpecificSize)] BYTE* vendorSpecific;\r
+//\r
+typedef struct tdTPM_CAP_VERSION_INFO {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  TPM_VERSION                       version;\r
+  UINT16                            specLevel;\r
+  UINT8                             errataRev;\r
+  UINT8                             tpmVendorID[4];\r
+  UINT16                            vendorSpecificSize;\r
+  UINT8                             *vendorSpecific;\r
+} TPM_CAP_VERSION_INFO;\r
+\r
+//\r
+// Part 2, section 22: DAA Structures\r
+//\r
+\r
+#define TPM_DAA_SIZE_r0                (43)\r
+#define TPM_DAA_SIZE_r1                (43)\r
+#define TPM_DAA_SIZE_r2                (128)\r
+#define TPM_DAA_SIZE_r3                (168)\r
+#define TPM_DAA_SIZE_r4                (219)\r
+#define TPM_DAA_SIZE_NT                (20)\r
+#define TPM_DAA_SIZE_v0                (128)\r
+#define TPM_DAA_SIZE_v1                (192)\r
+#define TPM_DAA_SIZE_NE                (256)\r
+#define TPM_DAA_SIZE_w                 (256)\r
+#define TPM_DAA_SIZE_issuerModulus     (256)\r
+#define TPM_DAA_power0                 (104)\r
+#define TPM_DAA_power1                 (1024)\r
+\r
+typedef struct tdTPM_DAA_ISSUER\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DIGEST                      DAA_digest_R0;\r
+    TPM_DIGEST                      DAA_digest_R1;\r
+    TPM_DIGEST                      DAA_digest_S0;\r
+    TPM_DIGEST                      DAA_digest_S1;\r
+    TPM_DIGEST                      DAA_digest_n;\r
+    TPM_DIGEST                      DAA_digest_gamma;\r
+    UINT8                           DAA_generic_q[26];\r
+} TPM_DAA_ISSUER;\r
+\r
+\r
+typedef struct tdTPM_DAA_TPM\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DIGEST                      DAA_digestIssuer;\r
+    TPM_DIGEST                      DAA_digest_v0;\r
+    TPM_DIGEST                      DAA_digest_v1;\r
+    TPM_DIGEST                      DAA_rekey;\r
+    UINT32                          DAA_count;\r
+} TPM_DAA_TPM;\r
+\r
+typedef struct tdTPM_DAA_CONTEXT\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_DIGEST                      DAA_digestContext;\r
+    TPM_DIGEST                      DAA_digest;\r
+    TPM_DAA_CONTEXT_SEED            DAA_contextSeed;\r
+    UINT8                           DAA_scratch[256];\r
+    UINT8                           DAA_stage;\r
+} TPM_DAA_CONTEXT;\r
+\r
+typedef struct tdTPM_DAA_JOINDATA\r
+{\r
+    UINT8                           DAA_join_u0[128];\r
+    UINT8                           DAA_join_u1[138];\r
+    TPM_DIGEST                      DAA_digest_n0;\r
+} TPM_DAA_JOINDATA;\r
+\r
+typedef struct tdTPM_DAA_BLOB\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    TPM_RESOURCE_TYPE               resourceType;\r
+    UINT8                           label[16];\r
+    TPM_DIGEST                      blobIntegrity;\r
+    UINT32                          additionalSize;\r
+    UINT8                           *additionalData;\r
+    UINT32                          sensitiveSize;\r
+    UINT8                           *sensitiveData;\r
+} TPM_DAA_BLOB;\r
+\r
+typedef struct tdTPM_DAA_SENSITIVE\r
+{\r
+    TPM_STRUCTURE_TAG               tag;\r
+    UINT32                          internalSize;\r
+    UINT8                           *internalData;\r
+} TPM_DAA_SENSITIVE;\r
+\r
+\r
+//\r
+// Part 2, section 23: Redirection\r
+//\r
+\r
+// This section of the TPM spec defines exactly one value but does not\r
+// give it a name. The definition of TPM_SetRedirection in Part3\r
+// refers to exactly one name but does not give its value. We join\r
+// them here.\r
+#define TPM_REDIR_GPIO              (0x00000001)\r
+\r
+//\r
+// TPM Command & Response Headers\r
+//\r
+typedef struct tdTPM_RQU_COMMAND_HDR {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  UINT32                            paramSize;\r
+  TPM_COMMAND_CODE                  ordinal;\r
+} TPM_RQU_COMMAND_HDR;\r
+\r
+typedef struct tdTPM_RSP_COMMAND_HDR {\r
+  TPM_STRUCTURE_TAG                 tag;\r
+  UINT32                            paramSize;\r
+  TPM_RESULT                        returnCode;\r
+} TPM_RSP_COMMAND_HDR;\r
+\r
+#pragma pack (pop)\r
+\r
+#endif  // _TPM12_H_\r
diff --git a/MdePkg/Include/Protocol/TcgService.h b/MdePkg/Include/Protocol/TcgService.h
new file mode 100644 (file)
index 0000000..ddc4eaf
--- /dev/null
@@ -0,0 +1,126 @@
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  TcgService.h\r
+\r
+Abstract:\r
+\r
+  TCG Service Protocol as defined in TCG_EFI_Protocol_1_20_Final\r
+\r
+  See http://trustedcomputinggroup.org for the latest specification\r
+\r
+--*/\r
+\r
+#ifndef _TCG_SERVICE_PROTOCOL_H_\r
+#define _TCG_SERVICE_PROTOCOL_H_\r
+\r
+#include <Uefi/UefiTcgPlatform.h>\r
+\r
+#define EFI_TCG_PROTOCOL_GUID  \\r
+  {0xf541796d, 0xa62e, 0x4954, { 0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd } } \r
+\r
+typedef struct _EFI_TCG_PROTOCOL EFI_TCG_PROTOCOL;\r
+\r
+//\r
+// Set structure alignment to 1-byte\r
+//\r
+#pragma pack (push, 1)\r
+\r
+typedef struct {\r
+  UINT8  Major;\r
+  UINT8  Minor;\r
+  UINT8  RevMajor;\r
+  UINT8  RevMinor;\r
+} TCG_VERSION;\r
+\r
+typedef struct _TCG_EFI_BOOT_SERVICE_CAPABILITY {\r
+  UINT8          Size;                // Size of this structure\r
+  TCG_VERSION    StructureVersion;    \r
+  TCG_VERSION    ProtocolSpecVersion;\r
+  UINT8          HashAlgorithmBitmap; // Hash algorithms  \r
+                                      // this protocol is capable of : 01=SHA-1\r
+  BOOLEAN        TPMPresentFlag;      // 00h = TPM not present\r
+  BOOLEAN        TPMDeactivatedFlag;  // 01h = TPM currently deactivated\r
+} TCG_EFI_BOOT_SERVICE_CAPABILITY;\r
+\r
+typedef UINT32   TCG_ALGORITHM_ID;\r
+\r
+//\r
+// Restore original structure alignment\r
+//\r
+#pragma pack (pop)\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_TCG_STATUS_CHECK) (\r
+  IN      EFI_TCG_PROTOCOL          *This,\r
+  OUT     TCG_EFI_BOOT_SERVICE_CAPABILITY\r
+                                    *ProtocolCapability,\r
+  OUT     UINT32                    *TCGFeatureFlags,\r
+  OUT     EFI_PHYSICAL_ADDRESS      *EventLogLocation,\r
+  OUT     EFI_PHYSICAL_ADDRESS      *EventLogLastEntry\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_TCG_HASH_ALL) (\r
+  IN      EFI_TCG_PROTOCOL          *This,\r
+  IN      UINT8                     *HashData,\r
+  IN      UINT64                    HashDataLen,\r
+  IN      TCG_ALGORITHM_ID          AlgorithmId,\r
+  IN OUT  UINT64                    *HashedDataLen,\r
+  IN OUT  UINT8                     **HashedDataResult\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_TCG_LOG_EVENT) (\r
+  IN      EFI_TCG_PROTOCOL          *This,\r
+  IN      TCG_PCR_EVENT             *TCGLogData,\r
+  IN OUT  UINT32                    *EventNumber,\r
+  IN      UINT32                    Flags\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_TCG_PASS_THROUGH_TO_TPM) (\r
+  IN      EFI_TCG_PROTOCOL          *This,\r
+  IN      UINT32                    TpmInputParamterBlockSize,\r
+  IN      UINT8                     *TpmInputParamterBlock,\r
+  IN      UINT32                    TpmOutputParameterBlockSize,\r
+  IN      UINT8                     *TpmOutputParameterBlock\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_TCG_HASH_LOG_EXTEND_EVENT) (\r
+  IN      EFI_TCG_PROTOCOL          *This,\r
+  IN      UINT8                     *HashData,\r
+  IN      UINT64                    HashDataLen,\r
+  IN      TCG_ALGORITHM_ID          AlgorithmId,\r
+  IN OUT  TCG_PCR_EVENT             *TCGLogData,\r
+  IN OUT  UINT32                    *EventNumber,\r
+     OUT  EFI_PHYSICAL_ADDRESS      *EventLogLastEntry\r
+  );\r
+\r
+typedef struct _EFI_TCG_PROTOCOL {\r
+  EFI_TCG_STATUS_CHECK              StatusCheck;\r
+  EFI_TCG_HASH_ALL                  HashAll;\r
+  EFI_TCG_LOG_EVENT                 LogEvent;\r
+  EFI_TCG_PASS_THROUGH_TO_TPM       PassThroughToTpm;\r
+  EFI_TCG_HASH_LOG_EXTEND_EVENT     HashLogExtendEvent;\r
+} EFI_TCG_PROTOCOL;\r
+\r
+extern EFI_GUID gEfiTcgProtocolGuid;\r
+\r
+#endif\r
diff --git a/MdePkg/Include/Uefi/UefiTcgPlatform.h b/MdePkg/Include/Uefi/UefiTcgPlatform.h
new file mode 100644 (file)
index 0000000..12f53b6
--- /dev/null
@@ -0,0 +1,150 @@
+/* @file\r
+  TCG EFI Platform Definition in TCG_EFI_Platform_1_20_Final\r
+\r
+  Copyright (c) 2006 - 2007, Intel Corporation\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __UEFI_TCG_PLATFORM_H__\r
+#define __UEFI_TCG_PLATFOMR_H__\r
+\r
+#include <IndustryStandard/Tpm12.h>\r
+#include <Uefi.h>\r
+//\r
+// Standard event types\r
+//\r
+#define EV_POST_CODE                ((TCG_EVENTTYPE) 0x00000001)\r
+#define EV_SEPARATOR                ((TCG_EVENTTYPE) 0x00000004)\r
+#define EV_S_CRTM_CONTENTS          ((TCG_EVENTTYPE) 0x00000007)\r
+#define EV_S_CRTM_VERSION           ((TCG_EVENTTYPE) 0x00000008)\r
+\r
+//\r
+// EFI specific event types\r
+//\r
+#define EV_EFI_EVENT_BASE                   ((TCG_EVENTTYPE) 0x80000000)\r
+#define EV_EFI_VARIABLE_DRIVER_CONFIG       (EV_EFI_EVENT_BASE + 1)\r
+#define EV_EFI_VARIABLE_BOOT                (EV_EFI_EVENT_BASE + 2)\r
+#define EV_EFI_BOOT_SERVICES_APPLICATION    (EV_EFI_EVENT_BASE + 3)\r
+#define EV_EFI_BOOT_SERVICES_DRIVER         (EV_EFI_EVENT_BASE + 4)\r
+#define EV_EFI_RUNTIME_SERVICES_DRIVER      (EV_EFI_EVENT_BASE + 5)\r
+#define EV_EFI_GPT_EVENT                    (EV_EFI_EVENT_BASE + 6)\r
+#define EV_EFI_ACTION                       (EV_EFI_EVENT_BASE + 7)\r
+#define EV_EFI_PLATFORM_FIRMWARE_BLOB       (EV_EFI_EVENT_BASE + 8)\r
+#define EV_EFI_HANDOFF_TABLES               (EV_EFI_EVENT_BASE + 9)\r
+\r
+#define TSS_EVENT_DATA_MAX_SIZE   256\r
+\r
+#define EFI_CALLING_EFI_APPLICATION         \\r
+  "Calling EFI Application from Boot Option"\r
+#define EFI_RETURNING_FROM_EFI_APPLICATOIN  \\r
+  "Returning from EFI Application from Boot Option"\r
+#define EFI_EXIT_BOOT_SERVICES_INVOCATION   \\r
+  "Exit Boot Services Invocation"\r
+#define EFI_EXIT_BOOT_SERVICES_FAILED       \\r
+  "Exit Boot Services Returned with Failure"\r
+#define EFI_EXIT_BOOT_SERVICES_SUCCEEDED    \\r
+  "Exit Boot Services Returned with Success"\r
+\r
+//\r
+// Set structure alignment to 1-byte\r
+//\r
+#pragma pack (push, 1)\r
+\r
+typedef UINT32                     TCG_EVENTTYPE;\r
+\r
+#define TCG_DIGEST                 TPM_DIGEST\r
+#define TCG_PCRINDEX               TPM_PCRINDEX\r
+\r
+//\r
+// TCG_PCR_EVENT\r
+//\r
+typedef struct tdTCG_PCR_EVENT {\r
+  TCG_PCRINDEX                      PCRIndex;  // PCRIndex event extended to\r
+  TCG_EVENTTYPE                     EventType; // TCG EFI event type\r
+  TCG_DIGEST                        Digest;    // Value extended into PCRIndex\r
+  UINT32                            EventSize; // Size of the event data\r
+  UINT8                             Event[1];  // The event data\r
+} TCG_PCR_EVENT;\r
+\r
+//\r
+// TCG_PCR_EVENT_HDR\r
+//\r
+typedef struct tdTCG_PCR_EVENT_HDR {\r
+  TCG_PCRINDEX                      PCRIndex;\r
+  TCG_EVENTTYPE                     EventType;\r
+  TCG_DIGEST                        Digest;\r
+  UINT32                            EventSize;\r
+} TCG_PCR_EVENT_HDR;\r
+\r
+//\r
+// EFI_PLATFORM_FIRMWARE_BLOB\r
+//\r
+// BlobLength should be of type UINTN but we use UINT64 here\r
+// because PEI is 32-bit while DXE is 64-bit on x64 platforms\r
+//\r
+typedef struct tdEFI_PLATFORM_FIRMWARE_BLOB {\r
+  EFI_PHYSICAL_ADDRESS              BlobBase;\r
+  UINT64                            BlobLength;\r
+} EFI_PLATFORM_FIRMWARE_BLOB;\r
+\r
+//\r
+// EFI_IMAGE_LOAD_EVENT\r
+//\r
+// This structure is used in EV_EFI_BOOT_SERVICES_APPLICATION,\r
+// EV_EFI_BOOT_SERVICES_DRIVER and EV_EFI_RUNTIME_SERVICES_DRIVER\r
+//\r
+typedef struct tdEFI_IMAGE_LOAD_EVENT {\r
+  EFI_PHYSICAL_ADDRESS              ImageLocationInMemory;\r
+  UINTN                             ImageLengthInMemory;\r
+  UINTN                             ImageLinkTimeAddress;\r
+  UINTN                             LengthOfDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL          DevicePath[1];\r
+} EFI_IMAGE_LOAD_EVENT;\r
+\r
+//\r
+// EFI_HANDOFF_TABLE_POINTERS\r
+//\r
+// This structure is used in EV_EFI_HANDOFF_TABLES event to facilitate\r
+// the measurement of given configuration tables.\r
+//\r
+typedef struct tdEFI_HANDOFF_TABLE_POINTERS {\r
+  UINTN                                  NumberOfTables;\r
+  EFI_CONFIGURATION_TABLE           TableEntry[1];\r
+} EFI_HANDOFF_TABLE_POINTERS;\r
+\r
+//\r
+// EFI_VARIABLE_DATA\r
+//\r
+// This structure serves as the header for measuring variables. The name of the\r
+// variable (in Unicode format) should immediately follow, then the variable\r
+// data.\r
+//\r
+typedef struct tdEFI_VARIABLE_DATA {\r
+  EFI_GUID                          VariableName;\r
+  UINTN                             UnicodeNameLength;\r
+  UINTN                             VariableDataLength;\r
+  CHAR16                            UnicodeName[1];\r
+  INT8                              VariableData[1];  // Driver or platform-specific data\r
+} EFI_VARIABLE_DATA;\r
+\r
+typedef struct tdEFI_GPT_DATA {\r
+  EFI_PARTITION_TABLE_HEADER  EfiPartitionHeader;\r
+  UINTN                       NumberOfPartitions; \r
+  EFI_PARTITION_ENTRY         Partitions[1];\r
+} EFI_GPT_DATA;\r
+\r
+//\r
+// Restore original structure alignment\r
+//\r
+#pragma pack (pop)\r
+\r
+#endif\r
+\r
+\r