• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*++
2 
3 Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   Tpm12.h
15 
16 Abstract:
17 
18   TPM Specification data structures (TCG TPM Specification Version 1.2 Revision 103)
19 
20   See http://trustedcomputinggroup.org for latest specification updates
21 
22 --*/
23 
24 #ifndef _TPM12_H_
25 #define _TPM12_H_
26 
27 //
28 // Structures are all packed on 1-byte alignment
29 //
30 
31 #ifndef __GNUC__
32 #pragma pack (push)
33 #pragma pack (1)
34 #endif
35 
36 //
37 // Part 2, section 2.2: Basic types & Helper redefinitions
38 //
39 typedef UINT8                       TPM_AUTH_DATA_USAGE;
40 typedef UINT8                       TPM_PAYLOAD_TYPE;
41 typedef UINT8                       TPM_VERSION_BYTE;
42 typedef UINT8                       TPM_DA_STATE;
43 typedef UINT16                      TPM_TAG;
44 typedef UINT16                      TPM_PROTOCOL_ID;
45 typedef UINT16                      TPM_STARTUP_TYPE;
46 typedef UINT16                      TPM_ENC_SCHEME;
47 typedef UINT16                      TPM_SIG_SCHEME;
48 typedef UINT16                      TPM_MIGRATE_SCHEME;
49 typedef UINT16                      TPM_PHYSICAL_PRESENCE;
50 typedef UINT16                      TPM_ENTITY_TYPE;
51 typedef UINT16                      TPM_KEY_USAGE;
52 typedef UINT16                      TPM_EK_TYPE;
53 typedef UINT16                      TPM_STRUCTURE_TAG;
54 typedef UINT16                      TPM_PLATFORM_SPECIFIC;
55 typedef UINT32                      TPM_COMMAND_CODE;
56 typedef UINT32                      TPM_CAPABILITY_AREA;
57 typedef UINT32                      TPM_KEY_FLAGS;
58 typedef UINT32                      TPM_ALGORITHM_ID;
59 typedef UINT32                      TPM_MODIFIER_INDICATOR;
60 typedef UINT32                      TPM_ACTUAL_COUNT;
61 typedef UINT32                      TPM_TRANSPORT_ATTRIBUTES;
62 typedef UINT32                      TPM_AUTHHANDLE;
63 typedef UINT32                      TPM_DIRINDEX;
64 typedef UINT32                      TPM_KEY_HANDLE;
65 typedef UINT32                      TPM_PCRINDEX;
66 typedef UINT32                      TPM_RESULT;
67 typedef UINT32                      TPM_RESOURCE_TYPE;
68 typedef UINT32                      TPM_KEY_CONTROL;
69 typedef UINT32                      TPM_NV_INDEX;
70 typedef UINT32                      TPM_FAMILY_ID;
71 typedef UINT32                      TPM_FAMILY_VERIFICATION;
72 typedef UINT32                      TPM_STARTUP_EFFECTS;
73 typedef UINT32                      TPM_SYM_MODE;
74 typedef UINT32                      TPM_FAMILY_FLAGS;
75 typedef UINT32                      TPM_DELEGATE_INDEX;
76 typedef UINT32                      TPM_CMK_DELEGATE;
77 typedef UINT32                      TPM_COUNT_ID;
78 typedef UINT32                      TPM_REDIT_COMMAND;
79 typedef UINT32                      TPM_TRANSHANDLE;
80 typedef UINT32                      TPM_HANDLE;
81 typedef UINT32                      TPM_FAMILY_OPERATION;
82 
83 //
84 // Part 2, section 2.2.4: Vendor specific
85 // The following defines allow for the quick specification of a
86 // vendor specific item.
87 //
88 #define TPM_Vendor_Specific32       ((UINT32) 0x00000400)
89 #define TPM_Vendor_Specific8        ((UINT8) 0x80)
90 
91 //
92 // Part 2, section 3.1: Structure TAGs
93 //
94 #define TPM_TAG_CONTEXTBLOB         ((TPM_STRUCTURE_TAG) 0x0001)
95 #define TPM_TAG_CONTEXT_SENSITIVE   ((TPM_STRUCTURE_TAG) 0x0002)
96 #define TPM_TAG_CONTEXTPOINTER      ((TPM_STRUCTURE_TAG) 0x0003)
97 #define TPM_TAG_CONTEXTLIST         ((TPM_STRUCTURE_TAG) 0x0004)
98 #define TPM_TAG_SIGNINFO            ((TPM_STRUCTURE_TAG) 0x0005)
99 #define TPM_TAG_PCR_INFO_LONG       ((TPM_STRUCTURE_TAG) 0x0006)
100 #define TPM_TAG_PERSISTENT_FLAGS    ((TPM_STRUCTURE_TAG) 0x0007)
101 #define TPM_TAG_VOLATILE_FLAGS      ((TPM_STRUCTURE_TAG) 0x0008)
102 #define TPM_TAG_PERSISTENT_DATA     ((TPM_STRUCTURE_TAG) 0x0009)
103 #define TPM_TAG_VOLATILE_DATA       ((TPM_STRUCTURE_TAG) 0x000A)
104 #define TPM_TAG_SV_DATA             ((TPM_STRUCTURE_TAG) 0x000B)
105 #define TPM_TAG_EK_BLOB             ((TPM_STRUCTURE_TAG) 0x000C)
106 #define TPM_TAG_EK_BLOB_AUTH        ((TPM_STRUCTURE_TAG) 0x000D)
107 #define TPM_TAG_COUNTER_VALUE       ((TPM_STRUCTURE_TAG) 0x000E)
108 #define TPM_TAG_TRANSPORT_INTERNAL  ((TPM_STRUCTURE_TAG) 0x000F)
109 #define TPM_TAG_TRANSPORT_LOG_IN    ((TPM_STRUCTURE_TAG) 0x0010)
110 #define TPM_TAG_TRANSPORT_LOG_OUT   ((TPM_STRUCTURE_TAG) 0x0011)
111 #define TPM_TAG_AUDIT_EVENT_IN      ((TPM_STRUCTURE_TAG) 0x0012)
112 #define TPM_TAG_AUDIT_EVENT_OUT     ((TPM_STRUCTURE_TAG) 0x0013)
113 #define TPM_TAG_CURRENT_TICKS       ((TPM_STRUCTURE_TAG) 0x0014)
114 #define TPM_TAG_KEY                 ((TPM_STRUCTURE_TAG) 0x0015)
115 #define TPM_TAG_STORED_DATA12       ((TPM_STRUCTURE_TAG) 0x0016)
116 #define TPM_TAG_NV_ATTRIBUTES       ((TPM_STRUCTURE_TAG) 0x0017)
117 #define TPM_TAG_NV_DATA_PUBLIC      ((TPM_STRUCTURE_TAG) 0x0018)
118 #define TPM_TAG_NV_DATA_SENSITIVE   ((TPM_STRUCTURE_TAG) 0x0019)
119 #define TPM_TAG_DELEGATIONS         ((TPM_STRUCTURE_TAG) 0x001A)
120 #define TPM_TAG_DELEGATE_PUBLIC     ((TPM_STRUCTURE_TAG) 0x001B)
121 #define TPM_TAG_DELEGATE_TABLE_ROW  ((TPM_STRUCTURE_TAG) 0x001C)
122 #define TPM_TAG_TRANSPORT_AUTH      ((TPM_STRUCTURE_TAG) 0x001D)
123 #define TPM_TAG_TRANSPORT_PUBLIC    ((TPM_STRUCTURE_TAG) 0x001E)
124 #define TPM_TAG_PERMANENT_FLAGS     ((TPM_STRUCTURE_TAG) 0x001F)
125 #define TPM_TAG_STCLEAR_FLAGS       ((TPM_STRUCTURE_TAG) 0x0020)
126 #define TPM_TAG_STANY_FLAGS         ((TPM_STRUCTURE_TAG) 0x0021)
127 #define TPM_TAG_PERMANENT_DATA      ((TPM_STRUCTURE_TAG) 0x0022)
128 #define TPM_TAG_STCLEAR_DATA        ((TPM_STRUCTURE_TAG) 0x0023)
129 #define TPM_TAG_STANY_DATA          ((TPM_STRUCTURE_TAG) 0x0024)
130 #define TPM_TAG_FAMILY_TABLE_ENTRY  ((TPM_STRUCTURE_TAG) 0x0025)
131 #define TPM_TAG_DELEGATE_SENSITIVE  ((TPM_STRUCTURE_TAG) 0x0026)
132 #define TPM_TAG_DELG_KEY_BLOB       ((TPM_STRUCTURE_TAG) 0x0027)
133 #define TPM_TAG_KEY12               ((TPM_STRUCTURE_TAG) 0x0028)
134 #define TPM_TAG_CERTIFY_INFO2       ((TPM_STRUCTURE_TAG) 0x0029)
135 #define TPM_TAG_DELEGATE_OWNER_BLOB ((TPM_STRUCTURE_TAG) 0x002A)
136 #define TPM_TAG_EK_BLOB_ACTIVATE    ((TPM_STRUCTURE_TAG) 0x002B)
137 #define TPM_TAG_DAA_BLOB            ((TPM_STRUCTURE_TAG) 0x002C)
138 #define TPM_TAG_DAA_CONTEXT         ((TPM_STRUCTURE_TAG) 0x002D)
139 #define TPM_TAG_DAA_ENFORCE         ((TPM_STRUCTURE_TAG) 0x002E)
140 #define TPM_TAG_DAA_ISSUER          ((TPM_STRUCTURE_TAG) 0x002F)
141 #define TPM_TAG_CAP_VERSION_INFO    ((TPM_STRUCTURE_TAG) 0x0030)
142 #define TPM_TAG_DAA_SENSITIVE       ((TPM_STRUCTURE_TAG) 0x0031)
143 #define TPM_TAG_DAA_TPM             ((TPM_STRUCTURE_TAG) 0x0032)
144 #define TPM_TAG_CMK_MIGAUTH         ((TPM_STRUCTURE_TAG) 0x0033)
145 #define TPM_TAG_CMK_SIGTICKET       ((TPM_STRUCTURE_TAG) 0x0034)
146 #define TPM_TAG_CMK_MA_APPROVAL     ((TPM_STRUCTURE_TAG) 0x0035)
147 #define TPM_TAG_QUOTE_INFO2         ((TPM_STRUCTURE_TAG) 0x0036)
148 #define TPM_TAG_DA_INFO             ((TPM_STRUCTURE_TAG) 0x0037)
149 #define TPM_TAG_DA_LIMITED          ((TPM_STRUCTURE_TAG) 0x0038)
150 #define TPM_TAG_DA_ACTION_TYPE      ((TPM_STRUCTURE_TAG) 0x0039)
151 
152 //
153 // Part 2, section 4: TPM Types
154 //
155 
156 //
157 // Part 2, section 4.1: TPM_RESOURCE_TYPE
158 //
159 #define TPM_RT_KEY                  ((TPM_RESOURCE_TYPE) 0x00000001) // The handle is a key handle and is the result of a LoadKey type operation
160 #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
161 #define TPM_RT_HASH                 ((TPM_RESOURCE_TYPE) 0x00000003) // Reserved for hashes
162 #define TPM_RT_TRANS                ((TPM_RESOURCE_TYPE) 0x00000004) // The handle is for a transport session. Transport handles come from TPM_EstablishTransport
163 #define TPM_RT_CONTEXT              ((TPM_RESOURCE_TYPE) 0x00000005) // Resource wrapped and held outside the TPM using the context save/restore commands
164 #define TPM_RT_COUNTER              ((TPM_RESOURCE_TYPE) 0x00000006) // Reserved for counters
165 #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
166 #define TPM_RT_DAA_TPM              ((TPM_RESOURCE_TYPE) 0x00000008) // The value is a DAA TPM specific blob
167 #define TPM_RT_DAA_V0               ((TPM_RESOURCE_TYPE) 0x00000009) // The value is a DAA V0 parameter
168 #define TPM_RT_DAA_V1               ((TPM_RESOURCE_TYPE) 0x0000000A) // The value is a DAA V1 parameter
169 
170 //
171 // Part 2, section 4.2: TPM_PAYLOAD_TYPE
172 //
173 #define TPM_PT_ASYM                 ((TPM_PAYLOAD_TYPE) 0x01) // The entity is an asymmetric key
174 #define TPM_PT_BIND                 ((TPM_PAYLOAD_TYPE) 0x02) // The entity is bound data
175 #define TPM_PT_MIGRATE              ((TPM_PAYLOAD_TYPE) 0x03) // The entity is a migration blob
176 #define TPM_PT_MAINT                ((TPM_PAYLOAD_TYPE) 0x04) // The entity is a maintenance blob
177 #define TPM_PT_SEAL                 ((TPM_PAYLOAD_TYPE) 0x05) // The entity is sealed data
178 #define TPM_PT_MIGRATE_RESTRICTED   ((TPM_PAYLOAD_TYPE) 0x06) // The entity is a restricted-migration asymmetric key
179 #define TPM_PT_MIGRATE_EXTERNAL     ((TPM_PAYLOAD_TYPE) 0x07) // The entity is a external migratable key
180 #define TPM_PT_CMK_MIGRATE          ((TPM_PAYLOAD_TYPE) 0x08) // The entity is a CMK migratable blob
181 #define TPM_PT_VENDOR_SPECIFIC      ((TPM_PAYLOAD_TYPE) 0x80) // 0x80 - 0xFF Vendor specific payloads
182 
183 //
184 // Part 2, section 4.3: TPM_ENTIRY_TYPE
185 //
186 #define TPM_ET_KEYHANDLE            ((UINT16) 0x0001) // The entity is a keyHandle or key
187 #define TPM_ET_OWNER                ((UINT16) 0x0002) // The entity is the TPM Owner
188 #define TPM_ET_DATA                 ((UINT16) 0x0003) // The entity is some data
189 #define TPM_ET_SRK                  ((UINT16) 0x0004) // The entity is the SRK
190 #define TPM_ET_KEY                  ((UINT16) 0x0005) // The entity is a key or keyHandle
191 #define TPM_ET_REVOKE               ((UINT16) 0x0006) // The entity is the RevokeTrust value
192 #define TPM_ET_DEL_OWNER_BLOB       ((UINT16) 0x0007) // The entity is a delegate owner blob
193 #define TPM_ET_DEL_ROW              ((UINT16) 0x0008) // The entity is a delegate row
194 #define TPM_ET_DEL_KEY_BLOB         ((UINT16) 0x0009) // The entity is a delegate key blob
195 #define TPM_ET_COUNTER              ((UINT16) 0x000A) // The entity is a counter
196 #define TPM_ET_NV                   ((UINT16) 0x000B) // The entity is a NV index
197 #define TPM_ET_OPERATOR             ((UINT16) 0x000C) // The entity is the operator
198 #define TPM_ET_RESERVED_HANDLE      ((UINT16) 0x0040) // Reserved. This value avoids collisions with the handle MSB setting.
199 //
200 // TPM_ENTITY_TYPE MSB Values: The MSB is used to indicate the ADIP encryption sheme when applicable
201 //
202 #define TPM_ET_XOR                  ((UINT16) 0x0000) // ADIP encryption scheme: XOR
203 #define TPM_ET_AES128               ((UINT16) 0x0006) // ADIP encryption scheme: AES 128 bits
204 
205 //
206 // Part 2, section 4.4.1: Reserved Key Handles
207 //
208 #define TPM_KH_SRK                  ((TPM_KEY_HANDLE) 0x40000000) // The handle points to the SRK
209 #define TPM_KH_OWNER                ((TPM_KEY_HANDLE) 0x40000001) // The handle points to the TPM Owner
210 #define TPM_KH_REVOKE               ((TPM_KEY_HANDLE) 0x40000002) // The handle points to the RevokeTrust value
211 #define TPM_KH_TRANSPORT            ((TPM_KEY_HANDLE) 0x40000003) // The handle points to the EstablishTransport static authorization
212 #define TPM_KH_OPERATOR             ((TPM_KEY_HANDLE) 0x40000004) // The handle points to the Operator auth
213 #define TPM_KH_ADMIN                ((TPM_KEY_HANDLE) 0x40000005) // The handle points to the delegation administration auth
214 #define TPM_KH_EK                   ((TPM_KEY_HANDLE) 0x40000006) // The handle points to the PUBEK, only usable with TPM_OwnerReadInternalPub
215 
216 //
217 // Part 2, section 4.5: TPM_STARTUP_TYPE
218 //
219 #define TPM_ST_CLEAR                ((TPM_STARTUP_TYPE) 0x0001) // The TPM is starting up from a clean state
220 #define TPM_ST_STATE                ((TPM_STARTUP_TYPE) 0x0002) // The TPM is starting up from a saved state
221 #define TPM_ST_DEACTIVATED          ((TPM_STARTUP_TYPE) 0x0003) // The TPM is to startup and set the deactivated flag to TRUE
222 
223 //
224 // Part 2, section 4.6: TPM_STATUP_EFFECTS
225 // The table makeup is still an open issue.
226 //
227 
228 //
229 // Part 2, section 4.7: TPM_PROTOCOL_ID
230 //
231 #define TPM_PID_OIAP                ((TPM_PROTOCOL_ID) 0x0001) // The OIAP protocol.
232 #define TPM_PID_OSAP                ((TPM_PROTOCOL_ID) 0x0002) // The OSAP protocol.
233 #define TPM_PID_ADIP                ((TPM_PROTOCOL_ID) 0x0003) // The ADIP protocol.
234 #define TPM_PID_ADCP                ((TPM_PROTOCOL_ID) 0x0004) // The ADCP protocol.
235 #define TPM_PID_OWNER               ((TPM_PROTOCOL_ID) 0x0005) // The protocol for taking ownership of a TPM.
236 #define TPM_PID_DSAP                ((TPM_PROTOCOL_ID) 0x0006) // The DSAP protocol
237 #define TPM_PID_TRANSPORT           ((TPM_PROTOCOL_ID) 0x0007) // The transport protocol
238 
239 //
240 // Part 2, section 4.8: TPM_ALGORITHM_ID
241 //   The TPM MUST support the algorithms TPM_ALG_RSA, TPM_ALG_SHA, TPM_ALG_HMAC,
242 //   TPM_ALG_MGF1
243 //
244 #define TPM_ALG_RSA                 ((TPM_ALGORITHM_ID) 0x00000001) // The RSA algorithm.
245 #define TPM_ALG_DES                 ((TPM_ALGORITHM_ID) 0x00000002) // The DES algorithm
246 #define TPM_ALG_3DES                ((TPM_ALGORITHM_ID) 0x00000003) // The 3DES algorithm in EDE mode
247 #define TPM_ALG_SHA                 ((TPM_ALGORITHM_ID) 0x00000004) // The SHA1 algorithm
248 #define TPM_ALG_HMAC                ((TPM_ALGORITHM_ID) 0x00000005) // The RFC 2104 HMAC algorithm
249 #define TPM_ALG_AES128              ((TPM_ALGORITHM_ID) 0x00000006) // The AES algorithm, key size 128
250 #define TPM_ALG_MGF1                ((TPM_ALGORITHM_ID) 0x00000007) // The XOR algorithm using MGF1 to create a string the size of the encrypted block
251 #define TPM_ALG_AES192              ((TPM_ALGORITHM_ID) 0x00000008) // AES, key size 192
252 #define TPM_ALG_AES256              ((TPM_ALGORITHM_ID) 0x00000009) // AES, key size 256
253 #define TPM_ALG_XOR                 ((TPM_ALGORITHM_ID) 0x0000000A) // XOR using the rolling nonces
254 
255 //
256 // Part 2, section 4.9: TPM_PHYSICAL_PRESENCE
257 //
258 #define TPM_PHYSICAL_PRESENCE_HW_DISABLE    ((TPM_PHYSICAL_PRESENCE) 0x0200) // Sets the physicalPresenceHWEnable to FALSE
259 #define TPM_PHYSICAL_PRESENCE_CMD_DISABLE   ((TPM_PHYSICAL_PRESENCE) 0x0100) // Sets the physicalPresenceCMDEnable to FALSE
260 #define TPM_PHYSICAL_PRESENCE_LIFETIME_LOCK ((TPM_PHYSICAL_PRESENCE) 0x0080) // Sets the physicalPresenceLifetimeLock to TRUE
261 #define TPM_PHYSICAL_PRESENCE_HW_ENABLE     ((TPM_PHYSICAL_PRESENCE) 0x0040) // Sets the physicalPresenceHWEnable to TRUE
262 #define TPM_PHYSICAL_PRESENCE_CMD_ENABLE    ((TPM_PHYSICAL_PRESENCE) 0x0020) // Sets the physicalPresenceCMDEnable to TRUE
263 #define TPM_PHYSICAL_PRESENCE_NOTPRESENT    ((TPM_PHYSICAL_PRESENCE) 0x0010) // Sets PhysicalPresence = FALSE
264 #define TPM_PHYSICAL_PRESENCE_PRESENT       ((TPM_PHYSICAL_PRESENCE) 0x0008) // Sets PhysicalPresence = TRUE
265 #define TPM_PHYSICAL_PRESENCE_LOCK          ((TPM_PHYSICAL_PRESENCE) 0x0004) // Sets PhysicalPresenceLock = TRUE
266 
267 //
268 // Part 2, section 4.10: TPM_MIGRATE_SCHEME
269 //
270 #define TPM_MS_MIGRATE                      ((TPM_MIGRATE_SCHEME) 0x0001) // A public key that can be used with all TPM migration commands other than 'ReWrap' mode.
271 #define TPM_MS_REWRAP                       ((TPM_MIGRATE_SCHEME) 0x0002) // A public key that can be used for the ReWrap mode of TPM_CreateMigrationBlob.
272 #define TPM_MS_MAINT                        ((TPM_MIGRATE_SCHEME) 0x0003) // A public key that can be used for the Maintenance commands
273 #define TPM_MS_RESTRICT_MIGRATE             ((TPM_MIGRATE_SCHEME) 0x0004) // The key is to be migrated to a Migration Authority.
274 #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
275 
276 //
277 // Part 2, section 4.11: TPM_EK_TYPE
278 //
279 #define TPM_EK_TYPE_ACTIVATE        ((TPM_EK_TYPE) 0x0001) // The blob MUST be TPM_EK_BLOB_ACTIVATE
280 #define TPM_EK_TYPE_AUTH            ((TPM_EK_TYPE) 0x0002) // The blob MUST be TPM_EK_BLOB_AUTH
281 
282 //
283 // Part 2, section 4.12: TPM_PLATFORM_SPECIFIC
284 //
285 #define TPM_PS_PC_11                ((TPM_PLATFORM_SPECIFIC) 0x0001) // PC Specific version 1.1
286 #define TPM_PS_PC_12                ((TPM_PLATFORM_SPECIFIC) 0x0002) // PC Specific version 1.2
287 #define TPM_PS_PDA_12               ((TPM_PLATFORM_SPECIFIC) 0x0003) // PDA Specific version 1.2
288 #define TPM_PS_Server_12            ((TPM_PLATFORM_SPECIFIC) 0x0004) // Server Specific version 1.2
289 #define TPM_PS_Mobile_12            ((TPM_PLATFORM_SPECIFIC) 0x0005) // Mobil Specific version 1.2
290 
291 //
292 // Part 2, section 5: Basic Structures
293 //
294 
295 //
296 // Part 2, section 5.1: TPM_STRUCT_VER
297 //
298 typedef struct tdTPM_STRUCT_VER {
299   UINT8                             major;
300   UINT8                             minor;
301   UINT8                             revMajor;
302   UINT8                             revMinor;
303 } TPM_STRUCT_VER;
304 
305 //
306 // Part 2, section 5.3: TPM_VERSION
307 //
308 typedef struct tdTPM_VERSION {
309   TPM_VERSION_BYTE                  major;
310   TPM_VERSION_BYTE                  minor;
311   UINT8                             revMajor;
312   UINT8                             revMinor;
313 } TPM_VERSION;
314 
315 //
316 // Part 2, section 5.4: TPM_DIGEST
317 //
318 #define TPM_SHA1_160_HASH_LEN       0x14
319 #define TPM_SHA1BASED_NONCE_LEN     TPM_SHA1_160_HASH_LEN
320 
321 typedef struct tdTPM_DIGEST{
322   UINT8                             digest[TPM_SHA1_160_HASH_LEN];
323 } TPM_DIGEST;
324 
325 typedef TPM_DIGEST                  TPM_CHOSENID_HASH; // This SHALL be the digest of the chosen identityLabel and privacyCA for a new TPM identity.
326 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.
327 typedef TPM_DIGEST                  TPM_DIRVALUE; // This SHALL be the value of a DIR register
328 typedef TPM_DIGEST                  TPM_HMAC;
329 typedef TPM_DIGEST                  TPM_PCRVALUE; // The value inside of the PCR
330 typedef TPM_DIGEST                  TPM_AUDITDIGEST; // This SHALL be the value of the current internal audit state
331 
332 //
333 // Part 2, section 5.5: TPM_NONCE
334 //
335 typedef struct tdTPM_NONCE{
336   UINT8                             nonce[20];
337 } TPM_NONCE;
338 
339 typedef TPM_NONCE                  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
340 typedef TPM_NONCE                  TPM_DAA_CONTEXT_SEED; // This SHALL be a random value
341 
342 //
343 // Part 2, section 5.6: TPM_AUTHDATA
344 //
345 typedef UINT8                       tdTPM_AUTHDATA[20];
346 typedef tdTPM_AUTHDATA              TPM_AUTHDATA;
347 typedef TPM_AUTHDATA                TPM_SECRET;
348 typedef TPM_AUTHDATA                TPM_ENCAUTH;
349 
350 //
351 // Part 2, section 5.7: TPM_KEY_HANDLE_LIST
352 // Size of handle is loaded * sizeof(TPM_KEY_HANDLE)
353 //
354 typedef struct tdTPM_KEY_HANDLE_LIST {
355   UINT16                            loaded;
356   TPM_KEY_HANDLE                    handle[1];
357 } TPM_KEY_HANDLE_LIST;
358 
359 //
360 // Part 2, section 5.8: TPM_KEY_USAGE values
361 //
362 
363 #define TPM_KEY_SIGNING             ((UINT16) 0x0010)
364 // TPM_KEY_SIGNING SHALL indicate a signing key. The [private] key SHALL be
365 // used for signing operations, only. This means that it MUST be a leaf of the
366 // Protected Storage key hierarchy.
367 
368 #define TPM_KEY_STORAGE             ((UINT16) 0x0011)
369 // TPM_KEY_STORAGE SHALL indicate a storage key. The key SHALL be used to wrap
370 // and unwrap other keys in the Protected Storage hierarchy
371 
372 #define TPM_KEY_IDENTITY            ((UINT16) 0x0012)
373 // TPM_KEY_IDENTITY SHALL indicate an identity key. The key SHALL be used for
374 // operations that require a TPM identity, only.
375 
376 #define TPM_KEY_AUTHCHANGE          ((UINT16) 0x0013)
377 // TPM_KEY_AUTHCHANGE SHALL indicate an ephemeral key that is in use during
378 // the ChangeAuthAsym process, only.
379 
380 #define TPM_KEY_BIND                ((UINT16) 0x0014)
381 // TPM_KEY_BIND SHALL indicate a key that can be used for TPM_Bind and
382 // TPM_Unbind operations only.
383 
384 #define TPM_KEY_LEGACY              ((UINT16) 0x0015)
385 // TPM_KEY_LEGACY SHALL indicate a key that can perform signing and binding
386 // operations. The key MAY be used for both signing and binding operations.
387 // The TPM_KEY_LEGACY key type is to allow for use by applications where both
388 // signing and encryption operations occur with the same key. The use of this
389 // key type is not recommended TPM_KEY_MIGRATE 0x0016 This SHALL indicate a
390 // key in use for TPM_MigrateKey
391 
392 #define TPM_KEY_MIGRATE             ((UINT16) 0x0016)
393 // TPM_KEY_MIGRAGE SHALL indicate a key in use for TPM_MigrateKey
394 
395 //
396 // Part 2, section 5.8.1: Encryption/Signature schemes
397 //
398 
399 #define TPM_ES_NONE                 ((TPM_ENC_SCHEME) 0x0001)
400 #define TPM_ES_RSAESPKCSv15         ((TPM_ENC_SCHEME) 0x0002)
401 #define TPM_ES_RSAESOAEP_SHA1_MGF1  ((TPM_ENC_SCHEME) 0x0003)
402 #define TPM_ES_SYM_CNT              ((TPM_ENC_SCHEME) 0x0004)  // rev94 defined
403 #define TPM_ES_SYM_CTR              ((TPM_ENC_SCHEME) 0x0004)
404 #define TPM_ES_SYM_OFB              ((TPM_ENC_SCHEME) 0x0005)
405 
406 #define TPM_SS_NONE                 ((TPM_SIG_SCHEME) 0x0001)
407 #define TPM_SS_RSASSAPKCS1v15_SHA1  ((TPM_SIG_SCHEME) 0x0002)
408 #define TPM_SS_RSASSAPKCS1v15_DER   ((TPM_SIG_SCHEME) 0x0003)
409 #define TPM_SS_RSASSAPKCS1v15_INFO  ((TPM_SIG_SCHEME) 0x0004)
410 
411 //
412 // Part 2, section 5.9: TPM_AUTH_DATA_USAGE values
413 //
414 #define TPM_AUTH_NEVER              ((TPM_AUTH_DATA_USAGE) 0x00)
415 #define TPM_AUTH_ALWAYS             ((TPM_AUTH_DATA_USAGE) 0x01)
416 #define TPM_AUTH_PRIV_USE_ONLY      ((TPM_AUTH_DATA_USAGE) 0x03)
417 
418 //
419 // Part 2, section 5.10: TPM_KEY_FLAGS
420 //
421 enum tdTPM_KEY_FLAGS {
422   redirection                       = 0x00000001,
423   migratable                        = 0x00000002,
424   isVolatile                        = 0x00000004,
425   pcrIgnoredOnRead                  = 0x00000008,
426   migrateAuthority                  = 0x00000010
427 };
428 
429 //
430 // Part 2, section 5.11: TPM_CHANGEAUTH_VALIDATE
431 //
432 typedef struct tdTPM_CHANGEAUTH_VALIDATE {
433   TPM_SECRET                        newAuthSecret;
434   TPM_NONCE                         n1;
435 } TPM_CHANGEAUTH_VALIDATE;
436 
437 //
438 // Part 2, section 5.12: TPM_MIGRATIONKEYAUTH
439 //   decalared after section 10 to catch declaration of TPM_PUBKEY
440 //
441 // Part 2 section 10.1: TPM_KEY_PARMS
442 //   [size_is(parmSize)] BYTE* parms;
443 //
444 typedef struct tdTPM_KEY_PARMS {
445   TPM_ALGORITHM_ID                  algorithmID;
446   TPM_ENC_SCHEME                    encScheme;
447   TPM_SIG_SCHEME                    sigScheme;
448   UINT32                            parmSize;
449   UINT8                             *parms;
450 } TPM_KEY_PARMS;
451 
452 //
453 // Part 2, section 10.4: TPM_STORE_PUBKEY
454 //
455 typedef struct tdTPM_STORE_PUBKEY {
456   UINT32                            keyLength;
457   UINT8                             key[1];
458 } TPM_STORE_PUBKEY;
459 
460 //
461 // Part 2, section 10.5: TPM_PUBKEY
462 //
463 typedef struct tdTPM_PUBKEY{
464   TPM_KEY_PARMS                     algorithmParms;
465   TPM_STORE_PUBKEY                  pubKey;
466 } TPM_PUBKEY;
467 
468 //
469 // Part 2, section 5.12: TPM_MIGRATIONKEYAUTH
470 //
471 typedef struct tdTPM_MIGRATIONKEYAUTH{
472   TPM_PUBKEY                        migrationKey;
473   TPM_MIGRATE_SCHEME                migrationScheme;
474   TPM_DIGEST                        digest;
475 } TPM_MIGRATIONKEYAUTH;
476 
477 //
478 // Part 2, section 5.13: TPM_COUNTER_VALUE
479 //
480 typedef struct tdTPM_COUNTER_VALUE{
481   TPM_STRUCTURE_TAG                 tag;
482   UINT8                             label[4];
483   TPM_ACTUAL_COUNT                  counter;
484 } TPM_COUNTER_VALUE;
485 
486 //
487 // Part 2, section 5.14: TPM_SIGN_INFO
488 //   Size of data indicated by dataLen
489 //
490 typedef struct tdTPM_SIGN_INFO {
491   TPM_STRUCTURE_TAG                 tag;
492   UINT8                             fixed[4];
493   TPM_NONCE                         replay;
494   UINT32                            dataLen;
495   UINT8                             *data;
496 } TPM_SIGN_INFO;
497 
498 //
499 // Part 2, section 5.15: TPM_MSA_COMPOSITE
500 //   Number of migAuthDigest indicated by MSAlist
501 //
502 typedef struct tdTPM_MSA_COMPOSITE {
503   UINT32                            MSAlist;
504   TPM_DIGEST                        migAuthDigest[1];
505 } TPM_MSA_COMPOSITE;
506 
507 //
508 // Part 2, section 5.16: TPM_CMK_AUTH
509 //
510 typedef struct tdTPM_CMK_AUTH{
511   TPM_DIGEST                        migrationAuthorityDigest;
512   TPM_DIGEST                        destinationKeyDigest;
513   TPM_DIGEST                        sourceKeyDigest;
514 } TPM_CMK_AUTH;
515 
516 //
517 // Part 2, section 5.17: TPM_CMK_DELEGATE
518 //
519 #define TPM_CMK_DELEGATE_SIGNING    (((TPM_CMK_DELEGATE)1) << 31)
520 #define TPM_CMK_DELEGATE_STORAGE    (((TPM_CMK_DELEGATE)1) << 30)
521 #define TPM_CMK_DELEGATE_BIND       (((TPM_CMK_DELEGATE)1) << 29)
522 #define TPM_CMK_DELEGATE_LEGACY     (((TPM_CMK_DELEGATE)1) << 28)
523 #define TPM_CMK_DELEGATE_MIGRATE    (((TPM_CMK_DELEGATE)1) << 27)
524 
525 //
526 // Part 2, section 5.18: TPM_SELECT_SIZE
527 //
528 typedef struct tdTPM_SELECT_SIZE {
529   UINT8                             major;
530   UINT8                             minor;
531   UINT16                            reqSize;
532 } TPM_SELECT_SIZE;
533 
534 //
535 // Part 2, section 5,19: TPM_CMK_MIGAUTH
536 //
537 typedef struct tdTPM_CMK_MIGAUTH{
538   TPM_STRUCTURE_TAG                 tag;
539   TPM_DIGEST                        msaDigest;
540   TPM_DIGEST                        pubKeyDigest;
541 } TPM_CMK_MIGAUTH;
542 
543 //
544 // Part 2, section 5.20: TPM_CMK_SIGTICKET
545 //
546 typedef struct tdTPM_CMK_SIGTICKET{
547   TPM_STRUCTURE_TAG                 tag;
548   TPM_DIGEST                        verKeyDigest;
549   TPM_DIGEST                        signedData;
550 } TPM_CMK_SIGTICKET;
551 
552 //
553 // Part 2, section 5.21: TPM_CMK_MA_APPROVAL
554 //
555 typedef struct tdTPM_CMK_MA_APPROVAL{
556   TPM_STRUCTURE_TAG                 tag;
557   TPM_DIGEST                        migrationAuthorityDigest;
558 } TPM_CMK_MA_APPROVAL;
559 
560 //
561 // Part 2, section 6: Command Tags
562 //
563 #define TPM_TAG_RQU_COMMAND         ((TPM_STRUCTURE_TAG) 0x00C1)
564 #define TPM_TAG_RQU_AUTH1_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C2)
565 #define TPM_TAG_RQU_AUTH2_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C3)
566 #define TPM_TAG_RSP_COMMAND         ((TPM_STRUCTURE_TAG) 0x00C4)
567 #define TPM_TAG_RSP_AUTH1_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C5)
568 #define TPM_TAG_RSP_AUTH2_COMMAND   ((TPM_STRUCTURE_TAG) 0x00C6)
569 
570 //
571 // Part 2, section 7.1: TPM_PERMANENT_FLAGS
572 //
573 typedef struct tdTPM_PERMANENT_FLAGS{
574   TPM_STRUCTURE_TAG                 tag;
575   BOOLEAN                           disable;
576   BOOLEAN                           ownership;
577   BOOLEAN                           deactivated;
578   BOOLEAN                           readPubek;
579   BOOLEAN                           disableOwnerClear;
580   BOOLEAN                           allowMaintenance;
581   BOOLEAN                           physicalPresenceLifetimeLock;
582   BOOLEAN                           physicalPresenceHWEnable;
583   BOOLEAN                           physicalPresenceCMDEnable;
584   BOOLEAN                           CEKPUsed;
585   BOOLEAN                           TPMpost;
586   BOOLEAN                           TPMpostLock;
587   BOOLEAN                           FIPS;
588   BOOLEAN                           operator;
589   BOOLEAN                           enableRevokeEK;
590   BOOLEAN                           nvLocked;
591   BOOLEAN                           readSRKPub;
592   BOOLEAN                           tpmEstablished;
593   BOOLEAN                           maintenanceDone;
594   BOOLEAN                           disableFullDALogicInfo;
595 } TPM_PERMANENT_FLAGS;
596 
597 //
598 // Part 2, section 7.1.1: PERMANENT_FLAGS Subcap for SetCapability
599 //
600 #define TPM_PF_DISABLE                      ((TPM_CAPABILITY_AREA) 1)
601 #define TPM_PF_OWNERSHIP                    ((TPM_CAPABILITY_AREA) 2)
602 #define TPM_PF_DEACTIVATED                  ((TPM_CAPABILITY_AREA) 3)
603 #define TPM_PF_READPUBEK                    ((TPM_CAPABILITY_AREA) 4)
604 #define TPM_PF_DISABLEOWNERCLEAR            ((TPM_CAPABILITY_AREA) 5)
605 #define TPM_PF_ALLOWMAINTENANCE             ((TPM_CAPABILITY_AREA) 6)
606 #define TPM_PF_PHYSICALPRESENCELIFETIMELOCK ((TPM_CAPABILITY_AREA) 7)
607 #define TPM_PF_PHYSICALPRESENCEHWENABLE     ((TPM_CAPABILITY_AREA) 8)
608 #define TPM_PF_PHYSICALPRESENCECMDENABLE    ((TPM_CAPABILITY_AREA) 9)
609 #define TPM_PF_CEKPUSED                     ((TPM_CAPABILITY_AREA) 10)
610 #define TPM_PF_TPMPOST                      ((TPM_CAPABILITY_AREA) 11)
611 #define TPM_PF_TPMPOSTLOCK                  ((TPM_CAPABILITY_AREA) 12)
612 #define TPM_PF_FIPS                         ((TPM_CAPABILITY_AREA) 13)
613 #define TPM_PF_OPERATOR                     ((TPM_CAPABILITY_AREA) 14)
614 #define TPM_PF_ENABLEREVOKEEK               ((TPM_CAPABILITY_AREA) 15)
615 #define TPM_PF_NV_LOCKED                    ((TPM_CAPABILITY_AREA) 16)
616 #define TPM_PF_READSRKPUB                   ((TPM_CAPABILITY_AREA) 17)
617 #define TPM_PF_TPMESTABLISHED               ((TPM_CAPABILITY_AREA) 18)
618 #define TPM_PF_MAINTENANCEDONE              ((TPM_CAPABILITY_AREA) 19)
619 #define TPM_PF_DISABLEFULLDALOGICINFO       ((TPM_CAPABILITY_AREA) 20)
620 
621 //
622 // Part 2, section 7.2: TPM_STCLEAR_FLAGS
623 //
624 typedef struct tdTPM_STCLEAR_FLAGS{
625   TPM_STRUCTURE_TAG                 tag;
626   BOOLEAN                           deactivated;
627   BOOLEAN                           disableForceClear;
628   BOOLEAN                           physicalPresence;
629   BOOLEAN                           physicalPresenceLock;
630   BOOLEAN                           bGlobalLock;
631 } TPM_STCLEAR_FLAGS;
632 
633 //
634 // Part 2, section 7.2.1: STCLEAR_FLAGS Subcap for SetCapability
635 //
636 #define TPM_SF_DEACTIVATED          ((TPM_CAPABILITY_AREA) 1)
637 #define TPM_SF_DISABLEFORCECLEAR    ((TPM_CAPABILITY_AREA) 2)
638 #define TPM_SF_PHYSICALPRESENCE     ((TPM_CAPABILITY_AREA) 3)
639 #define TPM_SF_PHYSICALPRESENCELOCK ((TPM_CAPABILITY_AREA) 4)
640 #define TPM_SF_BGLOBALLOCK          ((TPM_CAPABILITY_AREA) 5)
641 
642 //
643 // Part 2, section 7.3: TPM_STANY_FLAGS
644 //
645 typedef struct tdTPM_STANY_FLAGS{
646   TPM_STRUCTURE_TAG                 tag;
647   BOOLEAN                           postInitialise;
648   TPM_MODIFIER_INDICATOR            localityModifier;
649   BOOLEAN                           transportExclusive;
650   BOOLEAN                           TOSPresent;
651 } TPM_STANY_FLAGS;
652 
653 //
654 // Part 2, section 7.3.1: STANY_FLAGS Subcap for SetCapability
655 //
656 #define TPM_AF_POSTINITIALISE       ((TPM_CAPABILITY_AREA) 1)
657 #define TPM_AF_LOCALITYMODIFIER     ((TPM_CAPABILITY_AREA) 2)
658 #define TPM_AF_TRANSPORTEXCLUSIVE   ((TPM_CAPABILITY_AREA) 3)
659 #define TPM_AF_TOSPRESENT           ((TPM_CAPABILITY_AREA) 4)
660 
661 //
662 // All those structures (section 7.4, 7.5, 7.6) are not normative and
663 // thus no definitions here
664 //
665 // Part 2, section 7.4: TPM_PERMANENT_DATA
666 //
667 #define TPM_MIN_COUNTERS            4   // the minimum number of counters is 4
668 #define TPM_DELEGATE_KEY            TPM_KEY
669 #define TPM_NUM_PCR                 16
670 #define TPM_MAX_NV_WRITE_NOOWNER    64
671 
672 //typedef struct tdTPM_PERMANENT_DATA
673 //{
674 //    TPM_STRUCTURE_TAG               tag;
675 //    UINT8                           revMajor;
676 //    UINT8                           revMinor;
677 //    TPM_NONCE                       tpmProof;
678 //    TPM_NONCE                       ekReset;
679 //    TPM_SECRET                      ownerAuth;
680 //    TPM_SECRET                      operatorAuth;
681 //    TPM_DIRVALUE                    authDIR[1];
682 //    TPM_PUBKEY                      manuMaintPub;
683 //    TPM_KEY                         endorsementKey;
684 //    TPM_KEY                         srk;
685 //    TPM_KEY                         contextKey;
686 //    TPM_KEY                         delegateKey;
687 //    TPM_COUNTER_VALUE               auditMonotonicCounter;
688 //    TPM_COUNTER_VALUE               monitonicCounter[TPM_MIN_COUNTERS];
689 //    TPM_PCR_ATTRIBUTES              pcrAttrib[TPM_NUM_PCR];
690 //    UINT8                           ordinalAuditStatus[];
691 //    UINT8                           *rngState;
692 //    TPM_FAMILY_TABLE                familyTable;
693 //    TPM_DELEGATE_TABLE              delegateTable;
694 //    UINT32                          maxNVBufSize;
695 //    UINT32                          lastFamilyID;
696 //    UINT32                          noOwnerNVWrite;
697 //    TPM_CMK_DELEGATE                restrictDelegate;
698 //    TPM_DAA_TPM_SEED                tpmDAASeed;
699 //    TPM_NONCE                       daaProff;
700 //    TPM_KEY                         daaBlobKey;
701 //} TPM_PERMANENT_DATA;
702 
703 //
704 // Part 2, section 7.4.1: PERMANENT_DATA Subcap for SetCapability
705 //
706 #define TPM_PD_REVMAJOR               ((TPM_CAPABILITY_AREA) 1)
707 #define TPM_PD_REVMINOR               ((TPM_CAPABILITY_AREA) 2)
708 #define TPM_PD_TPMPROOF               ((TPM_CAPABILITY_AREA) 3)
709 #define TPM_PD_OWNERAUTH              ((TPM_CAPABILITY_AREA) 4)
710 #define TPM_PD_OPERATORAUTH           ((TPM_CAPABILITY_AREA) 5)
711 #define TPM_PD_MANUMAINTPUB           ((TPM_CAPABILITY_AREA) 6)
712 #define TPM_PD_ENDORSEMENTKEY         ((TPM_CAPABILITY_AREA) 7)
713 #define TPM_PD_SRK                    ((TPM_CAPABILITY_AREA) 8)
714 #define TPM_PD_DELEGATEKEY            ((TPM_CAPABILITY_AREA) 9)
715 #define TPM_PD_CONTEXTKEY             ((TPM_CAPABILITY_AREA) 10)
716 #define TPM_PD_AUDITMONOTONICCOUNTER  ((TPM_CAPABILITY_AREA) 11)
717 #define TPM_PD_MONOTONICCOUNTER       ((TPM_CAPABILITY_AREA) 12)
718 #define TPM_PD_PCRATTRIB              ((TPM_CAPABILITY_AREA) 13)
719 #define TPM_PD_ORDINALAUDITSTATUS     ((TPM_CAPABILITY_AREA) 14)
720 #define TPM_PD_AUTHDIR                ((TPM_CAPABILITY_AREA) 15)
721 #define TPM_PD_RNGSTATE               ((TPM_CAPABILITY_AREA) 16)
722 #define TPM_PD_FAMILYTABLE            ((TPM_CAPABILITY_AREA) 17)
723 #define TPM_DELEGATETABLE             ((TPM_CAPABILITY_AREA) 18)
724 #define TPM_PD_EKRESET                ((TPM_CAPABILITY_AREA) 19)
725 #define TPM_PD_MAXNVBUFSIZE           ((TPM_CAPABILITY_AREA) 20)
726 #define TPM_PD_LASTFAMILYID           ((TPM_CAPABILITY_AREA) 21)
727 #define TPM_PD_NOOWNERNVWRITE         ((TPM_CAPABILITY_AREA) 22)
728 #define TPM_PD_RESTRICTDELEGATE       ((TPM_CAPABILITY_AREA) 23)
729 #define TPM_PD_TPMDAASEED             ((TPM_CAPABILITY_AREA) 24)
730 #define TPM_PD_DAAPROOF               ((TPM_CAPABILITY_AREA) 25)
731 
732 //
733 // Part 2, section 7.5: TPM_STCLEAR_DATA
734 //   available inside TPM only
735 //
736  typedef struct tdTPM_STCLEAR_DATA{
737    TPM_STRUCTURE_TAG                  tag;
738    TPM_NONCE                          contextNonceKey;
739    TPM_COUNT_ID                       countID;
740    UINT32                             ownerReference;
741    BOOLEAN                            disableResetLock;
742    TPM_PCRVALUE                       PCR[TPM_NUM_PCR];
743    UINT32                             deferredPhysicalPresence;
744  }TPM_STCLEAR_DATA;
745 
746 //
747 // Part 2, section 7.5.1: STCLEAR_DATA Subcap for SetCapability
748 //
749 #define TPM_SD_CONTEXTNONCEKEY            ((TPM_CAPABILITY_AREA)0x00000001)
750 #define TPM_SD_COUNTID                    ((TPM_CAPABILITY_AREA)0x00000002)
751 #define TPM_SD_OWNERREFERENCE             ((TPM_CAPABILITY_AREA)0x00000003)
752 #define TPM_SD_DISABLERESETLOCK           ((TPM_CAPABILITY_AREA)0x00000004)
753 #define TPM_SD_PCR                        ((TPM_CAPABILITY_AREA)0x00000005)
754 #define TPM_SD_DEFERREDPHYSICALPRESENCE   ((TPM_CAPABILITY_AREA)0x00000006)
755 
756 //
757 // Part 2, section 7.6: TPM_STANY_DATA
758 //   available inside TPM only
759 //
760 //typedef struct tdTPM_STANY_DATA
761 //{
762 //    TPM_STRUCTURE_TAG               tag;
763 //    TPM_NONCE                       contextNonceSession;
764 //    TPM_DIGEST                      auditDigest;
765 //    TPM_CURRENT_TICKS               currentTicks;
766 //    UINT32                          contextCount;
767 //    UINT32                          contextList[TPM_MIN_SESSION_LIST];
768 //    TPM_SESSION_DATA                sessions[TPM_MIN_SESSIONS];
769 //} TPM_STANY_DATA;
770 
771 //
772 // Part 2, section 7.6.1: STANY_DATA Subcap for SetCapability
773 //
774 #define TPM_AD_CONTEXTNONCESESSION        ((TPM_CAPABILITY_AREA) 1)
775 #define TPM_AD_AUDITDIGEST                ((TPM_CAPABILITY_AREA) 2)
776 #define TPM_AD_CURRENTTICKS               ((TPM_CAPABILITY_AREA) 3)
777 #define TPM_AD_CONTEXTCOUNT               ((TPM_CAPABILITY_AREA) 4)
778 #define TPM_AD_CONTEXTLIST                ((TPM_CAPABILITY_AREA) 5)
779 #define TPM_AD_SESSIONS                   ((TPM_CAPABILITY_AREA) 6)
780 
781 //
782 // Part 2, section 8: PCR Structures
783 //
784 
785 //
786 // Part 2, section 8.1: TPM_PCR_SELECTION
787 //   Size of pcrSelect[] indicated by sizeOfSelect
788 //
789 typedef struct tdTPM_PCR_SELECTION {
790   UINT16                            sizeOfSelect;
791   UINT8                             pcrSelect[1];
792 } TPM_PCR_SELECTION;
793 
794 //
795 // Part 2, section 8.2: TPM_PCR_COMPOSITE
796 //   Size of pcrValue[] indicated by valueSize
797 //
798 typedef struct tdTPM_PCR_COMPOSITE {
799   TPM_PCR_SELECTION                 select;
800   UINT32                            valueSize;
801   TPM_PCRVALUE                      pcrValue[1];
802 } TPM_PCR_COMPOSITE;
803 
804 //
805 // Part 2, section 8.3: TPM_PCR_INFO
806 //
807 typedef struct tdTPM_PCR_INFO {
808   TPM_PCR_SELECTION                 pcrSelection;
809   TPM_COMPOSITE_HASH                digestAtRelease;
810   TPM_COMPOSITE_HASH                digestAtCreation;
811 } TPM_PCR_INFO;
812 
813 //
814 // Part 2, section 8.6: TPM_LOCALITY_SELECTION
815 //
816 typedef UINT8                       TPM_LOCALITY_SELECTION;
817 
818 #define TPM_LOC_FOUR                ((UINT8) 0x10)
819 #define TPM_LOC_THREE               ((UINT8) 0x08)
820 #define TPM_LOC_TWO                 ((UINT8) 0x04)
821 #define TPM_LOC_ONE                 ((UINT8) 0x02)
822 #define TPM_LOC_ZERO                ((UINT8) 0x01)
823 
824 //
825 // Part 2, section 8.4: TPM_PCR_INFO_LONG
826 //
827 typedef struct tdTPM_PCR_INFO_LONG {
828   TPM_STRUCTURE_TAG                 tag;
829   TPM_LOCALITY_SELECTION            localityAtCreation;
830   TPM_LOCALITY_SELECTION            localityAtRelease;
831   TPM_PCR_SELECTION                 creationPCRSelection;
832   TPM_PCR_SELECTION                 releasePCRSelection;
833   TPM_COMPOSITE_HASH                digestAtCreation;
834   TPM_COMPOSITE_HASH                digestAtRelease;
835 } TPM_PCR_INFO_LONG;
836 
837 //
838 // Part 2, section 8.5: TPM_PCR_INFO_SHORT
839 //
840 typedef struct tdTPM_PCR_INFO_SHORT{
841   TPM_PCR_SELECTION                 pcrSelection;
842   TPM_LOCALITY_SELECTION            localityAtRelease;
843   TPM_COMPOSITE_HASH                digestAtRelease;
844 } TPM_PCR_INFO_SHORT;
845 
846 //
847 // Part 2, section 8.8: TPM_PCR_ATTRIBUTES
848 //
849 typedef struct tdTPM_PCR_ATTRIBUTES{
850   BOOLEAN                           pcrReset;
851   TPM_LOCALITY_SELECTION            pcrExtendLocal;
852   TPM_LOCALITY_SELECTION            pcrResetLocal;
853 } TPM_PCR_ATTRIBUTES;
854 
855 //
856 // Part 2, section 9: Storage Structures
857 //
858 
859 //
860 // Part 2, section 9.1: TPM_STORED_DATA
861 //   [size_is(sealInfoSize)] BYTE* sealInfo;
862 //   [size_is(encDataSize)] BYTE* encData;
863 //
864 typedef struct tdTPM_STORED_DATA {
865   TPM_STRUCT_VER                    ver;
866   UINT32                            sealInfoSize;
867   UINT8                             *sealInfo;
868   UINT32                            encDataSize;
869   UINT8                             *encData;
870 } TPM_STORED_DATA;
871 
872 //
873 // Part 2, section 9.2: TPM_STORED_DATA12
874 //   [size_is(sealInfoSize)] BYTE* sealInfo;
875 //   [size_is(encDataSize)] BYTE* encData;
876 //
877 typedef struct tdTPM_STORED_DATA12 {
878   TPM_STRUCTURE_TAG                 tag;
879   TPM_ENTITY_TYPE                   et;
880   UINT32                            sealInfoSize;
881   UINT8                             *sealInfo;
882   UINT32                            encDataSize;
883   UINT8                             *encData;
884 } TPM_STORED_DATA12;
885 
886 //
887 // Part 2, section 9.3: TPM_SEALED_DATA
888 //   [size_is(dataSize)] BYTE* data;
889 //
890 typedef struct tdTPM_SEALED_DATA {
891   TPM_PAYLOAD_TYPE                  payload;
892   TPM_SECRET                        authData;
893   TPM_NONCE                         tpmProof;
894   TPM_DIGEST                        storedDigest;
895   UINT32                            dataSize;
896   UINT8                             *data;
897 } TPM_SEALED_DATA;
898 
899 //
900 // Part 2, section 9.4: TPM_SYMMETRIC_KEY
901 //   [size_is(size)] BYTE* data;
902 //
903 typedef struct tdTPM_SYMMETRIC_KEY {
904   TPM_ALGORITHM_ID                  algId;
905   TPM_ENC_SCHEME                    encScheme;
906   UINT16                            dataSize;
907   UINT8                             *data;
908 } TPM_SYMMETRIC_KEY;
909 
910 //
911 // Part 2, section 9.5: TPM_BOUND_DATA
912 //
913 typedef struct tdTPM_BOUND_DATA {
914   TPM_STRUCT_VER                    ver;
915   TPM_PAYLOAD_TYPE                  payload;
916   UINT8                             payloadData[1];
917 } TPM_BOUND_DATA;
918 
919 //
920 // Part 2 section 10: TPM_KEY complex
921 //
922 
923 //
924 // Part 2, section 10.2: TPM_KEY
925 //   [size_is(encDataSize)] BYTE* encData;
926 //
927 typedef struct tdTPM_KEY{
928   TPM_STRUCT_VER                    ver;
929   TPM_KEY_USAGE                     keyUsage;
930   TPM_KEY_FLAGS                     keyFlags;
931   TPM_AUTH_DATA_USAGE               authDataUsage;
932   TPM_KEY_PARMS                     algorithmParms;
933   UINT32                            PCRInfoSize;
934   UINT8                             *PCRInfo;
935   TPM_STORE_PUBKEY                  pubKey;
936   UINT32                            encDataSize;
937   UINT8                             *encData;
938 } TPM_KEY;
939 
940 //
941 // Part 2, section 10.3: TPM_KEY12
942 //   [size_is(encDataSize)] BYTE* encData;
943 //
944 typedef struct tdTPM_KEY12{
945   TPM_STRUCTURE_TAG                 tag;
946   UINT16                            fill;
947   TPM_KEY_USAGE                     keyUsage;
948   TPM_KEY_FLAGS                     keyFlags;
949   TPM_AUTH_DATA_USAGE               authDataUsage;
950   TPM_KEY_PARMS                     algorithmParms;
951   UINT32                            PCRInfoSize;
952   UINT8                             *PCRInfo;
953   TPM_STORE_PUBKEY                  pubKey;
954   UINT32                            encDataSize;
955   UINT8                             *encData;
956 } TPM_KEY12;
957 
958 //
959 // Part 2, section 10.7: TPM_STORE_PRIVKEY
960 //   [size_is(keyLength)] BYTE* key;
961 //
962 typedef struct tdTPM_STORE_PRIVKEY {
963   UINT32                            keyLength;
964   UINT8                             *key;
965 } TPM_STORE_PRIVKEY;
966 
967 //
968 // Part 2, section 10.6: TPM_STORE_ASYMKEY
969 //
970 typedef struct tdTPM_STORE_ASYMKEY {                // pos len total
971   TPM_PAYLOAD_TYPE                  payload;        // 0    1   1
972   TPM_SECRET                        usageAuth;      // 1    20  21
973   TPM_SECRET                        migrationAuth;  // 21   20  41
974   TPM_DIGEST                        pubDataDigest;  // 41   20  61
975   TPM_STORE_PRIVKEY                 privKey;        // 61 132-151 193-214
976 } TPM_STORE_ASYMKEY;
977 
978 //
979 // Part 2, section 10.8: TPM_MIGRATE_ASYMKEY
980 //   [size_is(partPrivKeyLen)] BYTE* partPrivKey;
981 //
982 typedef struct tdTPM_MIGRATE_ASYMKEY {              // pos  len  total
983   TPM_PAYLOAD_TYPE                  payload;        //   0    1       1
984   TPM_SECRET                        usageAuth;      //   1   20      21
985   TPM_DIGEST                        pubDataDigest;  //  21   20      41
986   UINT32                            partPrivKeyLen; //  41    4      45
987   UINT8                             *partPrivKey;   //  45 112-127 157-172
988 } TPM_MIGRATE_ASYMKEY;
989 
990 //
991 // Part 2, section 10.9: TPM_KEY_CONTROL
992 //
993 #define TPM_KEY_CONTROL_OWNER_EVICT ((UINT32) 0x00000001)
994 
995 //
996 // Part 2, section 11: Signed Structures
997 //
998 
999 typedef struct tdTPM_CERTIFY_INFO
1000 {
1001     TPM_STRUCT_VER                  version;
1002     TPM_KEY_USAGE                   keyUsage;
1003     TPM_KEY_FLAGS                   keyFlags;
1004     TPM_AUTH_DATA_USAGE             authDataUsage;
1005     TPM_KEY_PARMS                   algorithmParms;
1006     TPM_DIGEST                      pubkeyDigest;
1007     TPM_NONCE                       data;
1008     BOOLEAN                         parentPCRStatus;
1009     UINT32                          PCRInfoSize;
1010     UINT8                           *PCRInfo;
1011 } TPM_CERTIFY_INFO;
1012 
1013 typedef struct tdTPM_CERTIFY_INFO2
1014 {
1015     TPM_STRUCTURE_TAG               tag;
1016     UINT8                           fill;
1017     TPM_PAYLOAD_TYPE                payloadType;
1018     TPM_KEY_USAGE                   keyUsage;
1019     TPM_KEY_FLAGS                   keyFlags;
1020     TPM_AUTH_DATA_USAGE             authDataUsage;
1021     TPM_KEY_PARMS                   algorithmParms;
1022     TPM_DIGEST                      pubkeyDigest;
1023     TPM_NONCE                       data;
1024     BOOLEAN                         parentPCRStatus;
1025     UINT32                          PCRInfoSize;
1026     UINT8                           *PCRInfo;
1027     UINT32                          migrationAuthoritySize;
1028     UINT8                           *migrationAuthority;
1029 } TPM_CERTIFY_INFO2;
1030 
1031 typedef struct tdTPM_QUOTE_INFO
1032 {
1033     TPM_STRUCT_VER                  version;
1034     UINT8                           fixed[4];
1035     TPM_COMPOSITE_HASH              digestValue;
1036     TPM_NONCE                       externalData;
1037 } TPM_QUOTE_INFO;
1038 
1039 typedef struct tdTPM_QUOTE_INFO2
1040 {
1041     TPM_STRUCTURE_TAG               tag;
1042     UINT8                           fixed[4];
1043     TPM_NONCE                       externalData;
1044     TPM_PCR_INFO_SHORT              infoShort;
1045 } TPM_QUOTE_INFO2;
1046 
1047 //
1048 // Part 2, section 12: Identity Structures
1049 //
1050 
1051 typedef struct tdTPM_EK_BLOB
1052 {
1053     TPM_STRUCTURE_TAG               tag;
1054     TPM_EK_TYPE                     ekType;
1055     UINT32                          blobSize;
1056     UINT8                           *blob;
1057 } TPM_EK_BLOB;
1058 
1059 typedef struct tdTPM_EK_BLOB_ACTIVATE
1060 {
1061     TPM_STRUCTURE_TAG               tag;
1062     TPM_SYMMETRIC_KEY               sessionKey;
1063     TPM_DIGEST                      idDigest;
1064     TPM_PCR_INFO_SHORT              pcrInfo;
1065 } TPM_EK_BLOB_ACTIVATE;
1066 
1067 typedef struct tdTPM_EK_BLOB_AUTH
1068 {
1069     TPM_STRUCTURE_TAG               tag;
1070     TPM_SECRET                      authValue;
1071 } TPM_EK_BLOB_AUTH;
1072 
1073 
1074 typedef struct tdTPM_IDENTITY_CONTENTS
1075 {
1076     TPM_STRUCT_VER                  ver;
1077     UINT32                          ordinal;
1078     TPM_CHOSENID_HASH               labelPrivCADigest;
1079     TPM_PUBKEY                      identityPubKey;
1080 } TPM_IDENTITY_CONTENTS;
1081 
1082 typedef struct tdTPM_IDENTITY_REQ
1083 {
1084     UINT32                          asymSize;
1085     UINT32                          symSize;
1086     TPM_KEY_PARMS                   asymAlgorithm;
1087     TPM_KEY_PARMS                   symAlgorithm;
1088     UINT8                           *asymBlob;
1089     UINT8                           *symBlob;
1090 } TPM_IDENTITY_REQ;
1091 
1092 typedef struct tdTPM_IDENTITY_PROOF
1093 {
1094     TPM_STRUCT_VER                  ver;
1095     UINT32                          labelSize;
1096     UINT32                          identityBindingSize;
1097     UINT32                          endorsementSize;
1098     UINT32                          platformSize;
1099     UINT32                          conformanceSize;
1100     TPM_PUBKEY                      identityKey;
1101     UINT8                           *labelArea;
1102     UINT8                           *identityBinding;
1103     UINT8                           *endorsementCredential;
1104     UINT8                           *platformCredential;
1105     UINT8                           *conformanceCredential;
1106 } TPM_IDENTITY_PROOF;
1107 
1108 typedef struct tdTPM_ASYM_CA_CONTENTS
1109 {
1110     TPM_SYMMETRIC_KEY               sessionKey;
1111     TPM_DIGEST                      idDigest;
1112 } TPM_ASYM_CA_CONTENTS;
1113 
1114 typedef struct tdTPM_SYM_CA_ATTESTATION
1115 {
1116     UINT32                          credSize;
1117     TPM_KEY_PARMS                   algorithm;
1118     UINT8                           *credential;
1119 } TPM_SYM_CA_ATTESTATION;
1120 
1121 //
1122 // Part 2, section 15: TPM_CURRENT_TICKS
1123 //   Placed here out of order because definitions are used in section 13.
1124 //
1125 typedef struct tdTPM_CURRENT_TICKS {
1126   TPM_STRUCTURE_TAG                 tag;
1127   UINT64                            currentTicks;
1128   UINT16                            tickRate;
1129   TPM_NONCE                         tickNonce;
1130 } TPM_CURRENT_TICKS;
1131 
1132 //
1133 // Part 2, section 13: Transport structures
1134 //
1135 
1136 #define TPM_TRANSPORT_ENCRYPT       ((UINT32)0x00000001)
1137 #define TPM_TRANSPORT_LOG           ((UINT32)0x00000002)
1138 #define TPM_TRANSPORT_EXCLUSIVE     ((UINT32)0x00000004)
1139 
1140 typedef struct tdTPM_TRANSPORT_PUBLIC
1141 {
1142     TPM_STRUCTURE_TAG               tag;
1143     TPM_TRANSPORT_ATTRIBUTES        transAttributes;
1144     TPM_ALGORITHM_ID                algId;
1145     TPM_ENC_SCHEME                  encScheme;
1146 } TPM_TRANSPORT_PUBLIC;
1147 
1148 typedef struct tdTPM_TRANSPORT_INTERNAL
1149 {
1150     TPM_STRUCTURE_TAG               tag;
1151     TPM_AUTHDATA                    authData;
1152     TPM_TRANSPORT_PUBLIC            transPublic;
1153     TPM_TRANSHANDLE                 transHandle;
1154     TPM_NONCE                       transNonceEven;
1155     TPM_DIGEST                      transDigest;
1156 } TPM_TRANSPORT_INTERNAL;
1157 
1158 typedef struct tdTPM_TRANSPORT_LOG_IN
1159 {
1160     TPM_STRUCTURE_TAG               tag;
1161     TPM_DIGEST                      parameters;
1162     TPM_DIGEST                      pubKeyHash;
1163 } TPM_TRANSPORT_LOG_IN;
1164 
1165 typedef struct tdTPM_TRANSPORT_LOG_OUT
1166 {
1167     TPM_STRUCTURE_TAG               tag;
1168     TPM_CURRENT_TICKS               currentTicks;
1169     TPM_DIGEST                      parameters;
1170     TPM_MODIFIER_INDICATOR          locality;
1171 } TPM_TRANSPORT_LOG_OUT;
1172 
1173 typedef struct tdTPM_TRANSPORT_AUTH
1174 {
1175     TPM_STRUCTURE_TAG               tag;
1176     TPM_AUTHDATA                    authData;
1177 } TPM_TRANSPORT_AUTH;
1178 
1179 //
1180 // Part 2, section 14: Audit Structures
1181 //
1182 
1183 typedef struct tdTPM_AUDIT_EVENT_IN
1184 {
1185     TPM_STRUCTURE_TAG               tag;
1186     TPM_DIGEST                      inputParms;
1187     TPM_COUNTER_VALUE               auditCount;
1188 } TPM_AUDIT_EVENT_IN;
1189 
1190 typedef struct tdTPM_AUDIT_EVENT_OUT
1191 {
1192     TPM_STRUCTURE_TAG               tag;
1193     TPM_COMMAND_CODE                ordinal;
1194     TPM_DIGEST                      outputParms;
1195     TPM_COUNTER_VALUE               auditCount;
1196     TPM_RESULT                      returnCode;
1197 } TPM_AUDIT_EVENT_OUT;
1198 
1199 //
1200 // Part 2, section 16: Return Codes
1201 //
1202 #ifndef TPM_BASE
1203 #error "TPM Error Codes require definition of TPM_BASE"
1204 #endif
1205 
1206 #define TPM_VENDOR_ERROR            TPM_Vendor_Specific32
1207 #define TPM_NON_FATAL               0x00000800
1208 
1209 #define TPM_SUCCESS                 ((TPM_RESULT) TPM_BASE)
1210 #define TPM_AUTHFAIL                ((TPM_RESULT) (TPM_BASE + 1))
1211 #define TPM_BADINDEX                ((TPM_RESULT) (TPM_BASE + 2))
1212 #define TPM_BAD_PARAMETER           ((TPM_RESULT) (TPM_BASE + 3))
1213 #define TPM_AUDITFAILURE            ((TPM_RESULT) (TPM_BASE + 4))
1214 #define TPM_CLEAR_DISABLED          ((TPM_RESULT) (TPM_BASE + 5))
1215 #define TPM_DEACTIVATED             ((TPM_RESULT) (TPM_BASE + 6))
1216 #define TPM_DISABLED                ((TPM_RESULT) (TPM_BASE + 7))
1217 #define TPM_DISABLED_CMD            ((TPM_RESULT) (TPM_BASE + 8))
1218 #define TPM_FAIL                    ((TPM_RESULT) (TPM_BASE + 9))
1219 #define TPM_BAD_ORDINAL             ((TPM_RESULT) (TPM_BASE + 10))
1220 #define TPM_INSTALL_DISABLED        ((TPM_RESULT) (TPM_BASE + 11))
1221 #define TPM_INVALID_KEYHANDLE       ((TPM_RESULT) (TPM_BASE + 12))
1222 #define TPM_KEYNOTFOUND             ((TPM_RESULT) (TPM_BASE + 13))
1223 #define TPM_INAPPROPRIATE_ENC       ((TPM_RESULT) (TPM_BASE + 14))
1224 #define TPM_MIGRATEFAIL             ((TPM_RESULT) (TPM_BASE + 15))
1225 #define TPM_INVALID_PCR_INFO        ((TPM_RESULT) (TPM_BASE + 16))
1226 #define TPM_NOSPACE                 ((TPM_RESULT) (TPM_BASE + 17))
1227 #define TPM_NOSRK                   ((TPM_RESULT) (TPM_BASE + 18))
1228 #define TPM_NOTSEALED_BLOB          ((TPM_RESULT) (TPM_BASE + 19))
1229 #define TPM_OWNER_SET               ((TPM_RESULT) (TPM_BASE + 20))
1230 #define TPM_RESOURCES               ((TPM_RESULT) (TPM_BASE + 21))
1231 #define TPM_SHORTRANDOM             ((TPM_RESULT) (TPM_BASE + 22))
1232 #define TPM_SIZE                    ((TPM_RESULT) (TPM_BASE + 23))
1233 #define TPM_WRONGPCRVAL             ((TPM_RESULT) (TPM_BASE + 24))
1234 #define TPM_BAD_PARAM_SIZE          ((TPM_RESULT) (TPM_BASE + 25))
1235 #define TPM_SHA_THREAD              ((TPM_RESULT) (TPM_BASE + 26))
1236 #define TPM_SHA_ERROR               ((TPM_RESULT) (TPM_BASE + 27))
1237 #define TPM_FAILEDSELFTEST          ((TPM_RESULT) (TPM_BASE + 28))
1238 #define TPM_AUTH2FAIL               ((TPM_RESULT) (TPM_BASE + 29))
1239 #define TPM_BADTAG                  ((TPM_RESULT) (TPM_BASE + 30))
1240 #define TPM_IOERROR                 ((TPM_RESULT) (TPM_BASE + 31))
1241 #define TPM_ENCRYPT_ERROR           ((TPM_RESULT) (TPM_BASE + 32))
1242 #define TPM_DECRYPT_ERROR           ((TPM_RESULT) (TPM_BASE + 33))
1243 #define TPM_INVALID_AUTHHANDLE      ((TPM_RESULT) (TPM_BASE + 34))
1244 #define TPM_NO_ENDORSEMENT          ((TPM_RESULT) (TPM_BASE + 35))
1245 #define TPM_INVALID_KEYUSAGE        ((TPM_RESULT) (TPM_BASE + 36))
1246 #define TPM_WRONG_ENTITYTYPE        ((TPM_RESULT) (TPM_BASE + 37))
1247 #define TPM_INVALID_POSTINIT        ((TPM_RESULT) (TPM_BASE + 38))
1248 #define TPM_INAPPROPRIATE_SIG       ((TPM_RESULT) (TPM_BASE + 39))
1249 #define TPM_BAD_KEY_PROPERTY        ((TPM_RESULT) (TPM_BASE + 40))
1250 #define TPM_BAD_MIGRATION           ((TPM_RESULT) (TPM_BASE + 41))
1251 #define TPM_BAD_SCHEME              ((TPM_RESULT) (TPM_BASE + 42))
1252 #define TPM_BAD_DATASIZE            ((TPM_RESULT) (TPM_BASE + 43))
1253 #define TPM_BAD_MODE                ((TPM_RESULT) (TPM_BASE + 44))
1254 #define TPM_BAD_PRESENCE            ((TPM_RESULT) (TPM_BASE + 45))
1255 #define TPM_BAD_VERSION             ((TPM_RESULT) (TPM_BASE + 46))
1256 #define TPM_NO_WRAP_TRANSPORT       ((TPM_RESULT) (TPM_BASE + 47))
1257 #define TPM_AUDITFAIL_UNSUCCESSFUL  ((TPM_RESULT) (TPM_BASE + 48))
1258 #define TPM_AUDITFAIL_SUCCESSFUL    ((TPM_RESULT) (TPM_BASE + 49))
1259 #define TPM_NOTRESETABLE            ((TPM_RESULT) (TPM_BASE + 50))
1260 #define TPM_NOTLOCAL                ((TPM_RESULT) (TPM_BASE + 51))
1261 #define TPM_BAD_TYPE                ((TPM_RESULT) (TPM_BASE + 52))
1262 #define TPM_INVALID_RESOURCE        ((TPM_RESULT) (TPM_BASE + 53))
1263 #define TPM_NOTFIPS                 ((TPM_RESULT) (TPM_BASE + 54))
1264 #define TPM_INVALID_FAMILY          ((TPM_RESULT) (TPM_BASE + 55))
1265 #define TPM_NO_NV_PERMISSION        ((TPM_RESULT) (TPM_BASE + 56))
1266 #define TPM_REQUIRES_SIGN           ((TPM_RESULT) (TPM_BASE + 57))
1267 #define TPM_KEY_NOTSUPPORTED        ((TPM_RESULT) (TPM_BASE + 58))
1268 #define TPM_AUTH_CONFLICT           ((TPM_RESULT) (TPM_BASE + 59))
1269 #define TPM_AREA_LOCKED             ((TPM_RESULT) (TPM_BASE + 60))
1270 #define TPM_BAD_LOCALITY            ((TPM_RESULT) (TPM_BASE + 61))
1271 #define TPM_READ_ONLY               ((TPM_RESULT) (TPM_BASE + 62))
1272 #define TPM_PER_NOWRITE             ((TPM_RESULT) (TPM_BASE + 63))
1273 #define TPM_FAMILYCOUNT             ((TPM_RESULT) (TPM_BASE + 64))
1274 #define TPM_WRITE_LOCKED            ((TPM_RESULT) (TPM_BASE + 65))
1275 #define TPM_BAD_ATTRIBUTES          ((TPM_RESULT) (TPM_BASE + 66))
1276 #define TPM_INVALID_STRUCTURE       ((TPM_RESULT) (TPM_BASE + 67))
1277 #define TPM_KEY_OWNER_CONTROL       ((TPM_RESULT) (TPM_BASE + 68))
1278 #define TPM_BAD_COUNTER             ((TPM_RESULT) (TPM_BASE + 69))
1279 #define TPM_NOT_FULLWRITE           ((TPM_RESULT) (TPM_BASE + 70))
1280 #define TPM_CONTEXT_GAP             ((TPM_RESULT) (TPM_BASE + 71))
1281 #define TPM_MAXNVWRITES             ((TPM_RESULT) (TPM_BASE + 72))
1282 #define TPM_NOOPERATOR              ((TPM_RESULT) (TPM_BASE + 73))
1283 #define TPM_RESOURCEMISSING         ((TPM_RESULT) (TPM_BASE + 74))
1284 #define TPM_DELEGATE_LOCK           ((TPM_RESULT) (TPM_BASE + 75))
1285 #define TPM_DELEGATE_FAMILY         ((TPM_RESULT) (TPM_BASE + 76))
1286 #define TPM_DELEGATE_ADMIN          ((TPM_RESULT) (TPM_BASE + 77))
1287 #define TPM_TRANSPORT_NOTEXCLUSIVE  ((TPM_RESULT) (TPM_BASE + 78))
1288 #define TPM_OWNER_CONTROL           ((TPM_RESULT) (TPM_BASE + 79))
1289 #define TPM_DAA_RESOURCES           ((TPM_RESULT) (TPM_BASE + 80))
1290 #define TPM_DAA_INPUT_DATA0         ((TPM_RESULT) (TPM_BASE + 81))
1291 #define TPM_DAA_INPUT_DATA1         ((TPM_RESULT) (TPM_BASE + 82))
1292 #define TPM_DAA_ISSUER_SETTINGS     ((TPM_RESULT) (TPM_BASE + 83))
1293 #define TPM_DAA_TPM_SETTINGS        ((TPM_RESULT) (TPM_BASE + 84))
1294 #define TPM_DAA_STAGE               ((TPM_RESULT) (TPM_BASE + 85))
1295 #define TPM_DAA_ISSUER_VALIDITY     ((TPM_RESULT) (TPM_BASE + 86))
1296 #define TPM_DAA_WRONG_W             ((TPM_RESULT) (TPM_BASE + 87))
1297 #define TPM_BAD_HANDLE              ((TPM_RESULT) (TPM_BASE + 88))
1298 #define TPM_BAD_DELEGATE            ((TPM_RESULT) (TPM_BASE + 89))
1299 #define TPM_BADCONTEXT              ((TPM_RESULT) (TPM_BASE + 90))
1300 #define TPM_TOOMANYCONTEXTS         ((TPM_RESULT) (TPM_BASE + 91))
1301 #define TPM_MA_TICKET_SIGNATURE     ((TPM_RESULT) (TPM_BASE + 92))
1302 #define TPM_MA_DESTINATION          ((TPM_RESULT) (TPM_BASE + 93))
1303 #define TPM_MA_SOURCE               ((TPM_RESULT) (TPM_BASE + 94))
1304 #define TPM_MA_AUTHORITY            ((TPM_RESULT) (TPM_BASE + 95))
1305 #define TPM_PERMANENTEK             ((TPM_RESULT) (TPM_BASE + 97))
1306 #define TPM_BAD_SIGNATURE           ((TPM_RESULT) (TPM_BASE + 98))
1307 #define TPM_NOCONTEXTSPACE          ((TPM_RESULT) (TPM_BASE + 99))
1308 
1309 #define TPM_RETRY                   ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL))
1310 #define TPM_NEEDS_SELFTEST          ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL + 1))
1311 #define TPM_DOING_SELFTEST          ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL + 2))
1312 #define TPM_DEFEND_LOCK_RUNNING     ((TPM_RESULT) (TPM_BASE + TPM_NON_FATAL + 3))
1313 
1314 //
1315 // Part 2, section 17: Ordinals
1316 //
1317 // Ordinals are 32 bit values. The upper byte contains values that serve as
1318 // flag indicators, the next byte contains values indicating what committee
1319 // designated the ordinal, and the final two bytes contain the Command
1320 // Ordinal Index.
1321 //      3                   2                   1
1322 //    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
1323 //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1324 //   |P|C|V| Reserved| Purview |     Command Ordinal Index           |
1325 //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1326 //
1327 //  Where:
1328 //
1329 //    * P is Protected/Unprotected command. When 0 the command is a Protected
1330 //      command, when 1 the command is an Unprotected command.
1331 //
1332 //    * C is Non-Connection/Connection related command. When 0 this command
1333 //      passes through to either the protected (TPM) or unprotected (TSS)
1334 //      components.
1335 //
1336 //    * V is TPM/Vendor command. When 0 the command is TPM defined, when 1 the
1337 //      command is vendor defined.
1338 //
1339 //    * All reserved area bits are set to 0.
1340 //
1341 
1342 #define TPM_ORD_ActivateIdentity                  ((TPM_COMMAND_CODE) 0x0000007A)
1343 #define TPM_ORD_AuthorizeMigrationKey             ((TPM_COMMAND_CODE) 0x0000002B)
1344 #define TPM_ORD_CertifyKey                        ((TPM_COMMAND_CODE) 0x00000032)
1345 #define TPM_ORD_CertifyKey2                       ((TPM_COMMAND_CODE) 0x00000033)
1346 #define TPM_ORD_CertifySelfTest                   ((TPM_COMMAND_CODE) 0x00000052)
1347 #define TPM_ORD_ChangeAuth                        ((TPM_COMMAND_CODE) 0x0000000C)
1348 #define TPM_ORD_ChangeAuthAsymFinish              ((TPM_COMMAND_CODE) 0x0000000F)
1349 #define TPM_ORD_ChangeAuthAsymStart               ((TPM_COMMAND_CODE) 0x0000000E)
1350 #define TPM_ORD_ChangeAuthOwner                   ((TPM_COMMAND_CODE) 0x00000010)
1351 #define TPM_ORD_CMK_ApproveMA                     ((TPM_COMMAND_CODE) 0x0000001D)
1352 #define TPM_ORD_CMK_ConvertMigration              ((TPM_COMMAND_CODE) 0x00000024)
1353 #define TPM_ORD_CMK_CreateBlob                    ((TPM_COMMAND_CODE) 0x0000001B)
1354 #define TPM_ORD_CMK_CreateKey                     ((TPM_COMMAND_CODE) 0x00000013)
1355 #define TPM_ORD_CMK_CreateTicket                  ((TPM_COMMAND_CODE) 0x00000012)
1356 #define TPM_ORD_CMK_SetRestrictions               ((TPM_COMMAND_CODE) 0x0000001C)
1357 #define TPM_ORD_ContinueSelfTest                  ((TPM_COMMAND_CODE) 0x00000053)
1358 #define TPM_ORD_ConvertMigrationBlob              ((TPM_COMMAND_CODE) 0x0000002A)
1359 #define TPM_ORD_CreateCounter                     ((TPM_COMMAND_CODE) 0x000000DC)
1360 #define TPM_ORD_CreateEndorsementKeyPair          ((TPM_COMMAND_CODE) 0x00000078)
1361 #define TPM_ORD_CreateMaintenanceArchive          ((TPM_COMMAND_CODE) 0x0000002C)
1362 #define TPM_ORD_CreateMigrationBlob               ((TPM_COMMAND_CODE) 0x00000028)
1363 #define TPM_ORD_CreateRevocableEK                 ((TPM_COMMAND_CODE) 0x0000007F)
1364 #define TPM_ORD_CreateWrapKey                     ((TPM_COMMAND_CODE) 0x0000001F)
1365 #define TPM_ORD_DAA_JOIN                          ((TPM_COMMAND_CODE) 0x00000029)
1366 #define TPM_ORD_DAA_SIGN                          ((TPM_COMMAND_CODE) 0x00000031)
1367 #define TPM_ORD_Delegate_CreateKeyDelegation      ((TPM_COMMAND_CODE) 0x000000D4)
1368 #define TPM_ORD_Delegate_CreateOwnerDelegation    ((TPM_COMMAND_CODE) 0x000000D5)
1369 #define TPM_ORD_Delegate_LoadOwnerDelegation      ((TPM_COMMAND_CODE) 0x000000D8)
1370 #define TPM_ORD_Delegate_Manage                   ((TPM_COMMAND_CODE) 0x000000D2)
1371 #define TPM_ORD_Delegate_ReadTable                ((TPM_COMMAND_CODE) 0x000000DB)
1372 #define TPM_ORD_Delegate_UpdateVerification       ((TPM_COMMAND_CODE) 0x000000D1)
1373 #define TPM_ORD_Delegate_VerifyDelegation         ((TPM_COMMAND_CODE) 0x000000D6)
1374 #define TPM_ORD_DirRead                           ((TPM_COMMAND_CODE) 0x0000001A)
1375 #define TPM_ORD_DirWriteAuth                      ((TPM_COMMAND_CODE) 0x00000019)
1376 #define TPM_ORD_DisableForceClear                 ((TPM_COMMAND_CODE) 0x0000005E)
1377 #define TPM_ORD_DisableOwnerClear                 ((TPM_COMMAND_CODE) 0x0000005C)
1378 #define TPM_ORD_DisablePubekRead                  ((TPM_COMMAND_CODE) 0x0000007E)
1379 #define TPM_ORD_DSAP                              ((TPM_COMMAND_CODE) 0x00000011)
1380 #define TPM_ORD_EstablishTransport                ((TPM_COMMAND_CODE) 0x000000E6)
1381 #define TPM_ORD_EvictKey                          ((TPM_COMMAND_CODE) 0x00000022)
1382 #define TPM_ORD_ExecuteTransport                  ((TPM_COMMAND_CODE) 0x000000E7)
1383 #define TPM_ORD_Extend                            ((TPM_COMMAND_CODE) 0x00000014)
1384 #define TPM_ORD_FieldUpgrade                      ((TPM_COMMAND_CODE) 0x000000AA)
1385 #define TPM_ORD_FlushSpecific                     ((TPM_COMMAND_CODE) 0x000000BA)
1386 #define TPM_ORD_ForceClear                        ((TPM_COMMAND_CODE) 0x0000005D)
1387 #define TPM_ORD_GetAuditDigest                    ((TPM_COMMAND_CODE) 0x00000085)
1388 #define TPM_ORD_GetAuditDigestSigned              ((TPM_COMMAND_CODE) 0x00000086)
1389 #define TPM_ORD_GetAuditEvent                     ((TPM_COMMAND_CODE) 0x00000082)
1390 #define TPM_ORD_GetAuditEventSigned               ((TPM_COMMAND_CODE) 0x00000083)
1391 #define TPM_ORD_GetCapability                     ((TPM_COMMAND_CODE) 0x00000065)
1392 #define TPM_ORD_GetCapabilityOwner                ((TPM_COMMAND_CODE) 0x00000066)
1393 #define TPM_ORD_GetCapabilitySigned               ((TPM_COMMAND_CODE) 0x00000064)
1394 #define TPM_ORD_GetOrdinalAuditStatus             ((TPM_COMMAND_CODE) 0x0000008C)
1395 #define TPM_ORD_GetPubKey                         ((TPM_COMMAND_CODE) 0x00000021)
1396 #define TPM_ORD_GetRandom                         ((TPM_COMMAND_CODE) 0x00000046)
1397 #define TPM_ORD_GetTestResult                     ((TPM_COMMAND_CODE) 0x00000054)
1398 #define TPM_ORD_GetTicks                          ((TPM_COMMAND_CODE) 0x000000F1)
1399 #define TPM_ORD_IncrementCounter                  ((TPM_COMMAND_CODE) 0x000000DD)
1400 #define TPM_ORD_Init                              ((TPM_COMMAND_CODE) 0x00000097)
1401 #define TPM_ORD_KeyControlOwner                   ((TPM_COMMAND_CODE) 0x00000023)
1402 #define TPM_ORD_KillMaintenanceFeature            ((TPM_COMMAND_CODE) 0x0000002E)
1403 #define TPM_ORD_LoadAuthContext                   ((TPM_COMMAND_CODE) 0x000000B7)
1404 #define TPM_ORD_LoadContext                       ((TPM_COMMAND_CODE) 0x000000B9)
1405 #define TPM_ORD_LoadKey                           ((TPM_COMMAND_CODE) 0x00000020)
1406 #define TPM_ORD_LoadKey2                          ((TPM_COMMAND_CODE) 0x00000041)
1407 #define TPM_ORD_LoadKeyContext                    ((TPM_COMMAND_CODE) 0x000000B5)
1408 #define TPM_ORD_LoadMaintenanceArchive            ((TPM_COMMAND_CODE) 0x0000002D)
1409 #define TPM_ORD_LoadManuMaintPub                  ((TPM_COMMAND_CODE) 0x0000002F)
1410 #define TPM_ORD_MakeIdentity                      ((TPM_COMMAND_CODE) 0x00000079)
1411 #define TPM_ORD_MigrateKey                        ((TPM_COMMAND_CODE) 0x00000025)
1412 #define TPM_ORD_NV_DefineSpace                    ((TPM_COMMAND_CODE) 0x000000CC)
1413 #define TPM_ORD_NV_ReadValue                      ((TPM_COMMAND_CODE) 0x000000CF)
1414 #define TPM_ORD_NV_ReadValueAuth                  ((TPM_COMMAND_CODE) 0x000000D0)
1415 #define TPM_ORD_NV_WriteValue                     ((TPM_COMMAND_CODE) 0x000000CD)
1416 #define TPM_ORD_NV_WriteValueAuth                 ((TPM_COMMAND_CODE) 0x000000CE)
1417 #define TPM_ORD_OIAP                              ((TPM_COMMAND_CODE) 0x0000000A)
1418 #define TPM_ORD_OSAP                              ((TPM_COMMAND_CODE) 0x0000000B)
1419 #define TPM_ORD_OwnerClear                        ((TPM_COMMAND_CODE) 0x0000005B)
1420 #define TPM_ORD_OwnerReadInternalPub              ((TPM_COMMAND_CODE) 0x00000081)
1421 #define TPM_ORD_OwnerReadPubek                    ((TPM_COMMAND_CODE) 0x0000007D)
1422 #define TPM_ORD_OwnerSetDisable                   ((TPM_COMMAND_CODE) 0x0000006E)
1423 #define TPM_ORD_PCR_Reset                         ((TPM_COMMAND_CODE) 0x000000C8)
1424 #define TPM_ORD_PcrRead                           ((TPM_COMMAND_CODE) 0x00000015)
1425 #define TPM_ORD_PhysicalDisable                   ((TPM_COMMAND_CODE) 0x00000070)
1426 #define TPM_ORD_PhysicalEnable                    ((TPM_COMMAND_CODE) 0x0000006F)
1427 #define TPM_ORD_PhysicalSetDeactivated            ((TPM_COMMAND_CODE) 0x00000072)
1428 #define TPM_ORD_Quote                             ((TPM_COMMAND_CODE) 0x00000016)
1429 #define TPM_ORD_Quote2                            ((TPM_COMMAND_CODE) 0x0000003E)
1430 #define TPM_ORD_ReadCounter                       ((TPM_COMMAND_CODE) 0x000000DE)
1431 #define TPM_ORD_ReadManuMaintPub                  ((TPM_COMMAND_CODE) 0x00000030)
1432 #define TPM_ORD_ReadPubek                         ((TPM_COMMAND_CODE) 0x0000007C)
1433 #define TPM_ORD_ReleaseCounter                    ((TPM_COMMAND_CODE) 0x000000DF)
1434 #define TPM_ORD_ReleaseCounterOwner               ((TPM_COMMAND_CODE) 0x000000E0)
1435 #define TPM_ORD_ReleaseTransportSigned            ((TPM_COMMAND_CODE) 0x000000E8)
1436 #define TPM_ORD_Reset                             ((TPM_COMMAND_CODE) 0x0000005A)
1437 #define TPM_ORD_ResetLockValue                    ((TPM_COMMAND_CODE) 0x00000040)
1438 #define TPM_ORD_RevokeTrust                       ((TPM_COMMAND_CODE) 0x00000080)
1439 #define TPM_ORD_SaveAuthContext                   ((TPM_COMMAND_CODE) 0x000000B6)
1440 #define TPM_ORD_SaveContext                       ((TPM_COMMAND_CODE) 0x000000B8)
1441 #define TPM_ORD_SaveKeyContext                    ((TPM_COMMAND_CODE) 0x000000B4)
1442 #define TPM_ORD_SaveState                         ((TPM_COMMAND_CODE) 0x00000098)
1443 #define TPM_ORD_Seal                              ((TPM_COMMAND_CODE) 0x00000017)
1444 #define TPM_ORD_Sealx                             ((TPM_COMMAND_CODE) 0x0000003D)
1445 #define TPM_ORD_SelfTestFull                      ((TPM_COMMAND_CODE) 0x00000050)
1446 #define TPM_ORD_SetCapability                     ((TPM_COMMAND_CODE) 0x0000003F)
1447 #define TPM_ORD_SetOperatorAuth                   ((TPM_COMMAND_CODE) 0x00000074)
1448 #define TPM_ORD_SetOrdinalAuditStatus             ((TPM_COMMAND_CODE) 0x0000008D)
1449 #define TPM_ORD_SetOwnerInstall                   ((TPM_COMMAND_CODE) 0x00000071)
1450 #define TPM_ORD_SetOwnerPointer                   ((TPM_COMMAND_CODE) 0x00000075)
1451 #define TPM_ORD_SetRedirection                    ((TPM_COMMAND_CODE) 0x0000009A)
1452 #define TPM_ORD_SetTempDeactivated                ((TPM_COMMAND_CODE) 0x00000073)
1453 #define TPM_ORD_SHA1Complete                      ((TPM_COMMAND_CODE) 0x000000A2)
1454 #define TPM_ORD_SHA1CompleteExtend                ((TPM_COMMAND_CODE) 0x000000A3)
1455 #define TPM_ORD_SHA1Start                         ((TPM_COMMAND_CODE) 0x000000A0)
1456 #define TPM_ORD_SHA1Update                        ((TPM_COMMAND_CODE) 0x000000A1)
1457 #define TPM_ORD_Sign                              ((TPM_COMMAND_CODE) 0x0000003C)
1458 #define TPM_ORD_Startup                           ((TPM_COMMAND_CODE) 0x00000099)
1459 #define TPM_ORD_StirRandom                        ((TPM_COMMAND_CODE) 0x00000047)
1460 #define TPM_ORD_TakeOwnership                     ((TPM_COMMAND_CODE) 0x0000000D)
1461 #define TPM_ORD_Terminate_Handle                  ((TPM_COMMAND_CODE) 0x00000096)
1462 #define TPM_ORD_TickStampBlob                     ((TPM_COMMAND_CODE) 0x000000F2)
1463 #define TPM_ORD_UnBind                            ((TPM_COMMAND_CODE) 0x0000001E)
1464 #define TPM_ORD_Unseal                            ((TPM_COMMAND_CODE) 0x00000018)
1465 #define TSC_ORD_PhysicalPresence                  ((TPM_COMMAND_CODE) 0x4000000A)
1466 #define TSC_ORD_ResetEstablishmentBit             ((TPM_COMMAND_CODE) 0x4000000B)
1467 
1468 //
1469 // Part 2, section 18: Context structures
1470 //
1471 
1472 typedef struct tdTPM_CONTEXT_BLOB
1473 {
1474     TPM_STRUCTURE_TAG               tag;
1475     TPM_RESOURCE_TYPE               resourceType;
1476     TPM_HANDLE                      handle;
1477     UINT8                           label[16];
1478     UINT32                          contextCount;
1479     TPM_DIGEST                      integrityDigest;
1480     UINT32                          additionalSize;
1481     UINT8                           *additionalData;
1482     UINT32                          sensitiveSize;
1483     UINT8                           *sensitiveData;
1484 } TPM_CONTEXT_BLOB;
1485 
1486 typedef struct tdTPM_CONTEXT_SENSITIVE
1487 {
1488     TPM_STRUCTURE_TAG               tag;
1489     TPM_NONCE                       contextNonce;
1490     UINT32                          internalSize;
1491     UINT8                           *internalData;
1492 } TPM_CONTEXT_SENSITIVE;
1493 
1494 //
1495 // Part 2, section 19: NV Structures
1496 //
1497 
1498 #define TPM_NV_INDEX_LOCK              ((UINT32)0xffffffff)
1499 #define TPM_NV_INDEX0                  ((UINT32)0x00000000)
1500 #define TPM_NV_INDEX_DIR               ((UINT32)0x10000001)
1501 #define TPM_NV_INDEX_EKCert            ((UINT32)0x0000f000)
1502 #define TPM_NV_INDEX_TPM_CC            ((UINT32)0x0000f001)
1503 #define TPM_NV_INDEX_PlatformCert      ((UINT32)0x0000f002)
1504 #define TPM_NV_INDEX_Platform_CC       ((UINT32)0x0000f003)
1505 // The following define ranges of reserved indices.
1506 #define TPM_NV_INDEX_TSS_BASE          ((UINT32)0x00011100)
1507 #define TPM_NV_INDEX_PC_BASE           ((UINT32)0x00011200)
1508 #define TPM_NV_INDEX_SERVER_BASE       ((UINT32)0x00011300)
1509 #define TPM_NV_INDEX_MOBILE_BASE       ((UINT32)0x00011400)
1510 #define TPM_NV_INDEX_PERIPHERAL_BASE   ((UINT32)0x00011500)
1511 #define TPM_NV_INDEX_GROUP_RESV_BASE   ((UINT32)0x00010000)
1512 
1513 typedef UINT32 TPM_NV_PER_ATTRIBUTES;
1514 // The typedefs TPM_NV_PER_ATTRIBUTES (not present in TPM 1.2 Spec. have been added
1515 // and structure fields that were to hold the following values
1516 #define TPM_NV_PER_READ_STCLEAR        (((UINT32)1)<<31)
1517 #define TPM_NV_PER_AUTHREAD            (((UINT32)1)<<18)
1518 #define TPM_NV_PER_OWNERREAD           (((UINT32)1)<<17)
1519 #define TPM_NV_PER_PPREAD              (((UINT32)1)<<16)
1520 #define TPM_NV_PER_GLOBALLOCK          (((UINT32)1)<<15)
1521 #define TPM_NV_PER_WRITE_STCLEAR       (((UINT32)1)<<14)
1522 #define TPM_NV_PER_WRITEDEFINE         (((UINT32)1)<<13)
1523 #define TPM_NV_PER_WRITEALL            (((UINT32)1)<<12)
1524 #define TPM_NV_PER_AUTHWRITE           (((UINT32)1)<<2)
1525 #define TPM_NV_PER_OWNERWRITE          (((UINT32)1)<<1)
1526 #define TPM_NV_PER_PPWRITE             (((UINT32)1)<<0)
1527 
1528 typedef struct tdTPM_NV_ATTRIBUTES
1529 {
1530     TPM_STRUCTURE_TAG               tag;
1531     TPM_NV_PER_ATTRIBUTES           attributes;
1532 } TPM_NV_ATTRIBUTES;
1533 
1534 
1535 typedef struct tdTPM_NV_DATA_PUBLIC
1536 {
1537     TPM_STRUCTURE_TAG               tag;
1538     TPM_NV_INDEX                    nvIndex;
1539     TPM_PCR_INFO_SHORT              pcrInfoRead;
1540     TPM_PCR_INFO_SHORT              pcrInfoWrite;
1541     TPM_NV_ATTRIBUTES               permission;
1542     BOOLEAN                         bReadSTClear;
1543     BOOLEAN                         bWriteSTClear;
1544     BOOLEAN                         bWriteDefine;
1545     UINT32                          dataSize;
1546 } TPM_NV_DATA_PUBLIC;
1547 
1548 
1549 
1550 // Internal to TPM:
1551 //typedef struct tdTPM_NV_DATA_SENSITIVE
1552 //{
1553 //    TPM_STRUCTURE_TAG               tag;
1554 //    TPM_NV_DATA_PUBLIC              pubInfo;
1555 //   TPM_AUTHDATA                    authValue;
1556 //    UINT8                           *data;
1557 //} TPM_NV_DATA_SENSITIVE;
1558 
1559 
1560 //
1561 // Part 2, section 20: Delegation
1562 //
1563 
1564 //
1565 // Part 2, section 20.2.1: Owner Permissions Settings for per1 bits
1566 //
1567 #define TPM_DELEGATE_SetOrdinalAuditStatus          (((UINT32)1)<<30)
1568 #define TPM_DELEGATE_DirWriteAuth                   (((UINT32)1)<<29)
1569 #define TPM_DELEGATE_CMK_ApproveMA                  (((UINT32)1)<<28)
1570 #define TPM_DELEGATE_NV_WriteValue                  (((UINT32)1)<<27)
1571 #define TPM_DELEGATE_CMK_CreateTicket               (((UINT32)1)<<26)
1572 #define TPM_DELEGATE_NV_ReadValue                   (((UINT32)1)<<25)
1573 #define TPM_DELEGATE_Delegate_LoadOwnerDelegation   (((UINT32)1)<<24)
1574 #define TPM_DELEGATE_DAA_Join                       (((UINT32)1)<<23)
1575 #define TPM_DELEGATE_AuthorizeMigrationKey          (((UINT32)1)<<22)
1576 #define TPM_DELEGATE_CreateMaintenanceArchive       (((UINT32)1)<<21)
1577 #define TPM_DELEGATE_LoadMaintenanceArchive         (((UINT32)1)<<20)
1578 #define TPM_DELEGATE_KillMaintenanceFeature         (((UINT32)1)<<19)
1579 #define TPM_DELEGATE_OwnerReadInteralPub            (((UINT32)1)<<18)
1580 #define TPM_DELEGATE_ResetLockValue                 (((UINT32)1)<<17)
1581 #define TPM_DELEGATE_OwnerClear                     (((UINT32)1)<<16)
1582 #define TPM_DELEGATE_DisableOwnerClear              (((UINT32)1)<<15)
1583 #define TPM_DELEGATE_NV_DefineSpace                 (((UINT32)1)<<14)
1584 #define TPM_DELEGATE_OwnerSetDisable                (((UINT32)1)<<13)
1585 #define TPM_DELEGATE_SetCapability                  (((UINT32)1)<<12)
1586 #define TPM_DELEGATE_MakeIdentity                   (((UINT32)1)<<11)
1587 #define TPM_DELEGATE_ActivateIdentity               (((UINT32)1)<<10)
1588 #define TPM_DELEGATE_OwnerReadPubek                 (((UINT32)1)<<9)
1589 #define TPM_DELEGATE_DisablePubekRead               (((UINT32)1)<<8)
1590 #define TPM_DELEGATE_SetRedirection                 (((UINT32)1)<<7)
1591 #define TPM_DELEGATE_FieldUpgrade                   (((UINT32)1)<<6)
1592 #define TPM_DELEGATE_Delegate_UpdateVerification    (((UINT32)1)<<5)
1593 #define TPM_DELEGATE_CreateCounter                  (((UINT32)1)<<4)
1594 #define TPM_DELEGATE_ReleaseCounterOwner            (((UINT32)1)<<3)
1595 #define TPM_DELEGATE_DelegateManage                 (((UINT32)1)<<2)
1596 #define TPM_DELEGATE_Delegate_CreateOwnerDelegation (((UINT32)1)<<1)
1597 #define TPM_DELEGATE_DAA_Sign                       (((UINT32)1)<<0)
1598 
1599 //
1600 // Part 2, section 20.2.3: Key Permissions Settings for per1 bits
1601 //
1602 #define TPM_KEY_DELEGATE_CMK_ConvertMigration       (((UINT32)1)<<28)
1603 #define TPM_KEY_DELEGATE_TickStampBlob              (((UINT32)1)<<27)
1604 #define TPM_KEY_DELEGATE_ChangeAuthAsymStart        (((UINT32)1)<<26)
1605 #define TPM_KEY_DELEGATE_ChangeAuthAsymFinish       (((UINT32)1)<<25)
1606 #define TPM_KEY_DELEGATE_CMK_CreateKey              (((UINT32)1)<<24)
1607 #define TPM_KEY_DELEGATE_MigrateKey                 (((UINT32)1)<<23)
1608 #define TPM_KEY_DELEGATE_LoadKey2                   (((UINT32)1)<<22)
1609 #define TPM_KEY_DELEGATE_EstablishTransport         (((UINT32)1)<<21)
1610 #define TPM_KEY_DELEGATE_ReleaseTransportSigned     (((UINT32)1)<<20)
1611 #define TPM_KEY_DELEGATE_Quote2                     (((UINT32)1)<<19)
1612 #define TPM_KEY_DELEGATE_Sealx                      (((UINT32)1)<<18)
1613 #define TPM_KEY_DELEGATE_MakeIdentity               (((UINT32)1)<<17)
1614 #define TPM_KEY_DELEGATE_ActivateIdentity           (((UINT32)1)<<16)
1615 #define TPM_KEY_DELEGATE_GetAuditDigestSigned       (((UINT32)1)<<15)
1616 #define TPM_KEY_DELEGATE_Sign                       (((UINT32)1)<<14)
1617 #define TPM_KEY_DELEGATE_CertifyKey2                (((UINT32)1)<<13)
1618 #define TPM_KEY_DELEGATE_CertifyKey                 (((UINT32)1)<<12)
1619 #define TPM_KEY_DELEGATE_CreateWrapKey              (((UINT32)1)<<11)
1620 #define TPM_KEY_DELEGATE_CMK_CreateBlob             (((UINT32)1)<<10)
1621 #define TPM_KEY_DELEGATE_CreateMigrationBlob        (((UINT32)1)<<9)
1622 #define TPM_KEY_DELEGATE_ConvertMigrationBlob       (((UINT32)1)<<8)
1623 #define TPM_KEY_DELEGATE_CreateKeyDelegation        (((UINT32)1)<<7)
1624 #define TPM_KEY_DELEGATE_ChangeAuth                 (((UINT32)1)<<6)
1625 #define TPM_KEY_DELEGATE_GetPubKey                  (((UINT32)1)<<5)
1626 #define TPM_KEY_DELEGATE_UnBind                     (((UINT32)1)<<4)
1627 #define TPM_KEY_DELEGATE_Quote                      (((UINT32)1)<<3)
1628 #define TPM_KEY_DELEGATE_Unseal                     (((UINT32)1)<<2)
1629 #define TPM_KEY_DELEGATE_Seal                       (((UINT32)1)<<1)
1630 #define TPM_KEY_DELEGATE_LoadKey                    (((UINT32)1)<<0)
1631 
1632 #define TPM_FAMILY_CREATE                 ((UINT32)0x00000001)
1633 #define TPM_FAMILY_ENABLE                 ((UINT32)0x00000002)
1634 #define TPM_FAMILY_ADMIN                  ((UINT32)0x00000003)
1635 #define TPM_FAMILY_INVALIDATE             ((UINT32)0x00000004)
1636 
1637 #define TPM_FAMFLAG_DELEGATE_ADMIN_LOCK   (((UINT32)1)<<1)
1638 #define TPM_FAMFLAG_ENABLE                (((UINT32)1)<<0)
1639 
1640 typedef struct tdTPM_FAMILY_LABEL
1641 {
1642     UINT8                           label;
1643 } TPM_FAMILY_LABEL;
1644 
1645 typedef struct tdTPM_FAMILY_TABLE_ENTRY
1646 {
1647     TPM_STRUCTURE_TAG               tag;
1648     TPM_FAMILY_LABEL                label;
1649     TPM_FAMILY_ID                   familyID;
1650     TPM_FAMILY_VERIFICATION         verificationCount;
1651     TPM_FAMILY_FLAGS                flags;
1652 } TPM_FAMILY_TABLE_ENTRY;
1653 
1654 #define TPM_FAMILY_TABLE_ENTRY_MIN 8
1655 //typedef struct tdTPM_FAMILY_TABLE
1656 //{
1657 //    TPM_FAMILY_TABLE_ENTRY          FamTableRow[TPM_NUM_FAMILY_TABLE_ENTRY_MIN];
1658 //} TPM_FAMILY_TABLE;
1659 
1660 
1661 typedef struct tdTPM_DELEGATE_LABEL
1662 {
1663     UINT8                           label;
1664 } TPM_DELEGATE_LABEL;
1665 
1666 
1667 typedef UINT32 TPM_DELEGATE_TYPE;
1668 #define TPM_DEL_OWNER_BITS          ((UINT32)0x00000001)
1669 #define TPM_DEL_KEY_BITS            ((UINT32)0x00000002)
1670 
1671 typedef struct tdTPM_DELEGATIONS
1672 {
1673     TPM_STRUCTURE_TAG               tag;
1674     TPM_DELEGATE_TYPE               delegateType;
1675     UINT32                          per1;
1676     UINT32                          per2;
1677 } TPM_DELEGATIONS;
1678 
1679 typedef struct tdTPM_DELEGATE_PUBLIC
1680 {
1681     TPM_STRUCTURE_TAG               tag;
1682     TPM_DELEGATE_LABEL              label;
1683     TPM_PCR_INFO_SHORT              pcrInfo;
1684     TPM_DELEGATIONS                 permissions;
1685     TPM_FAMILY_ID                   familyID;
1686     TPM_FAMILY_VERIFICATION         verificationCount;
1687 } TPM_DELEGATE_PUBLIC;
1688 
1689 typedef struct tdTPM_DELEGATE_TABLE_ROW
1690 {
1691     TPM_STRUCTURE_TAG               tag;
1692     TPM_DELEGATE_PUBLIC             pub;
1693     TPM_SECRET                      authValue;
1694 } TPM_DELEGATE_TABLE_ROW;
1695 
1696 
1697 #define TPM_NUM_DELEGATE_TABLE_ENTRY_MIN 2
1698 //typedef struct tdTPM_DELEGATE_TABLE
1699 //{
1700 //    TPM_DELEGATE_TABLE_ROW          delRow[TPM_NUM_DELEGATE_TABLE_ENTRY_MIN];
1701 //} TPM_DELEGATE_TABLE;
1702 
1703 typedef struct tdTPM_DELEGATE_SENSITIVE
1704 {
1705     TPM_STRUCTURE_TAG               tag;
1706     TPM_SECRET                      authValue;
1707 } TPM_DELEGATE_SENSITIVE;
1708 
1709 typedef struct tdTPM_DELEGATE_OWNER_BLOB
1710 {
1711     TPM_STRUCTURE_TAG               tag;
1712     TPM_DELEGATE_PUBLIC             pub;
1713     TPM_DIGEST                      integrityDigest;
1714     UINT32                          additionalSize;
1715     UINT8                           *additionalArea;
1716     UINT32                          sensitiveSize;
1717     UINT8                           *sensitiveArea;
1718 } TPM_DELEGATE_OWNER_BLOB;
1719 
1720 typedef struct tdTPM_DELEGATE_KEY_BLOB
1721 {
1722     TPM_STRUCTURE_TAG               tag;
1723     TPM_DELEGATE_PUBLIC             pub;
1724     TPM_DIGEST                      integrityDigest;
1725     TPM_DIGEST                      pubKeyDigest;
1726     UINT32                          additionalSize;
1727     UINT8                           *additionalArea;
1728     UINT32                          sensitiveSize;
1729     UINT8                           *sensitiveArea;
1730 } TPM_DELEGATE_KEY_BLOB;
1731 
1732 //
1733 // Part 2, section 21.1: TPM_CAPABILITY_AREA for GetCapability
1734 //
1735 #define TPM_CAP_ORD                     ((TPM_CAPABILITY_AREA) 0x00000001)
1736 #define TPM_CAP_ALG                     ((TPM_CAPABILITY_AREA) 0x00000002)
1737 #define TPM_CAP_PID                     ((TPM_CAPABILITY_AREA) 0x00000003)
1738 #define TPM_CAP_FLAG                    ((TPM_CAPABILITY_AREA) 0x00000004)
1739 #define TPM_CAP_PROPERTY                ((TPM_CAPABILITY_AREA) 0x00000005)
1740 #define TPM_CAP_VERSION                 ((TPM_CAPABILITY_AREA) 0x00000006)
1741 #define TPM_CAP_KEY_HANDLE              ((TPM_CAPABILITY_AREA) 0x00000007)
1742 #define TPM_CAP_CHECK_LOADED            ((TPM_CAPABILITY_AREA) 0x00000008)
1743 #define TPM_CAP_SYM_MODE                ((TPM_CAPABILITY_AREA) 0x00000009)
1744 #define TPM_CAP_KEY_STATUS              ((TPM_CAPABILITY_AREA) 0x0000000C)
1745 #define TPM_CAP_NV_LIST                 ((TPM_CAPABILITY_AREA) 0x0000000D)
1746 #define TPM_CAP_MFR                     ((TPM_CAPABILITY_AREA) 0x00000010)
1747 #define TPM_CAP_NV_INDEX                ((TPM_CAPABILITY_AREA) 0x00000011)
1748 #define TPM_CAP_TRANS_ALG               ((TPM_CAPABILITY_AREA) 0x00000012)
1749 #define TPM_CAP_HANDLE                  ((TPM_CAPABILITY_AREA) 0x00000014)
1750 #define TPM_CAP_TRANS_ES                ((TPM_CAPABILITY_AREA) 0x00000015)
1751 #define TPM_CAP_AUTH_ENCRYPT            ((TPM_CAPABILITY_AREA) 0x00000017)
1752 #define TPM_CAP_SELECT_SIZE             ((TPM_CAPABILITY_AREA) 0x00000018)
1753 #define TPM_CAP_VERSION_VAL             ((TPM_CAPABILITY_AREA) 0x0000001A)
1754 
1755 #define TPM_CAP_FLAG_PERMANENT          ((TPM_CAPABILITY_AREA) 0x00000108)
1756 #define TPM_CAP_FLAG_VOLATILE           ((TPM_CAPABILITY_AREA) 0x00000109)
1757 
1758 //
1759 // Part 2, section 21.2: CAP_PROPERTY Subcap values for GetCapability
1760 //
1761 #define TPM_CAP_PROP_PCR                ((TPM_CAPABILITY_AREA) 0x00000101)
1762 #define TPM_CAP_PROP_DIR                ((TPM_CAPABILITY_AREA) 0x00000102)
1763 #define TPM_CAP_PROP_MANUFACTURER       ((TPM_CAPABILITY_AREA) 0x00000103)
1764 #define TPM_CAP_PROP_KEYS               ((TPM_CAPABILITY_AREA) 0x00000104)
1765 #define TPM_CAP_PROP_MIN_COUNTER        ((TPM_CAPABILITY_AREA) 0x00000107)
1766 #define TPM_CAP_PROP_AUTHSESS           ((TPM_CAPABILITY_AREA) 0x0000010A)
1767 #define TPM_CAP_PROP_TRANSESS           ((TPM_CAPABILITY_AREA) 0x0000010B)
1768 #define TPM_CAP_PROP_COUNTERS           ((TPM_CAPABILITY_AREA) 0x0000010C)
1769 #define TPM_CAP_PROP_MAX_AUTHSESS       ((TPM_CAPABILITY_AREA) 0x0000010D)
1770 #define TPM_CAP_PROP_MAX_TRANSESS       ((TPM_CAPABILITY_AREA) 0x0000010E)
1771 #define TPM_CAP_PROP_MAX_COUNTERS       ((TPM_CAPABILITY_AREA) 0x0000010F)
1772 #define TPM_CAP_PROP_MAX_KEYS           ((TPM_CAPABILITY_AREA) 0x00000110)
1773 #define TPM_CAP_PROP_OWNER              ((TPM_CAPABILITY_AREA) 0x00000111)
1774 #define TPM_CAP_PROP_CONTEXT            ((TPM_CAPABILITY_AREA) 0x00000112)
1775 #define TPM_CAP_PROP_MAX_CONTEXT        ((TPM_CAPABILITY_AREA) 0x00000113)
1776 #define TPM_CAP_PROP_FAMILYROWS         ((TPM_CAPABILITY_AREA) 0x00000114)
1777 #define TPM_CAP_PROP_TIS_TIMEOUT        ((TPM_CAPABILITY_AREA) 0x00000115)
1778 #define TPM_CAP_PROP_STARTUP_EFFECT     ((TPM_CAPABILITY_AREA) 0x00000116)
1779 #define TPM_CAP_PROP_DELEGATE_ROW       ((TPM_CAPABILITY_AREA) 0x00000117)
1780 #define TPM_CAP_PROP_DAA_MAX            ((TPM_CAPABILITY_AREA) 0x00000119)
1781 #define CAP_PROP_SESSION_DAA            ((TPM_CAPABILITY_AREA) 0x0000011A)
1782 #define TPM_CAP_PROP_CONTEXT_DIST       ((TPM_CAPABILITY_AREA) 0x0000011B)
1783 #define TPM_CAP_PROP_DAA_INTERRUPT      ((TPM_CAPABILITY_AREA) 0x0000011C)
1784 #define TPM_CAP_PROP_SESSIONS           ((TPM_CAPABILITY_AREA) 0x0000011D)
1785 #define TPM_CAP_PROP_MAX_SESSIONS       ((TPM_CAPABILITY_AREA) 0x0000011E)
1786 #define TPM_CAP_PROP_CMK_RESTRICTION    ((TPM_CAPABILITY_AREA) 0x0000011F)
1787 #define TPM_CAP_PROP_DURATION           ((TPM_CAPABILITY_AREA) 0x00000120)
1788 #define TPM_CAP_PROP_ACTIVE_COUNTER     ((TPM_CAPABILITY_AREA) 0x00000122)
1789 #define TPM_CAP_PROP_MAX_NV_AVAILABLE   ((TPM_CAPABILITY_AREA) 0x00000123)
1790 #define TPM_CAP_PROP_INPUT_BUFFER       ((TPM_CAPABILITY_AREA) 0x00000124)
1791 
1792 //
1793 // Part 2, section 21.4: TPM_CAPABILITY_AREA for SetCapability
1794 //
1795 #define TPM_SET_PERM_FLAGS              ((TPM_CAPABILITY_AREA) 0x00000001)
1796 #define TPM_SET_PERM_DATA               ((TPM_CAPABILITY_AREA) 0x00000002)
1797 #define TPM_SET_STCLEAR_FLAGS           ((TPM_CAPABILITY_AREA) 0x00000003)
1798 #define TPM_SET_STCLEAR_DATA            ((TPM_CAPABILITY_AREA) 0x00000004)
1799 #define TPM_SET_STANY_FLAGS             ((TPM_CAPABILITY_AREA) 0x00000005)
1800 #define TPM_SET_STANY_DATA              ((TPM_CAPABILITY_AREA) 0x00000006)
1801 
1802 // Part 2, section 21.6: TPM_CAP_VERSION_INFO
1803 //   [size_is(vendorSpecificSize)] BYTE* vendorSpecific;
1804 //
1805 typedef struct tdTPM_CAP_VERSION_INFO {
1806   TPM_STRUCTURE_TAG                 tag;
1807   TPM_VERSION                       version;
1808   UINT16                            specLevel;
1809   UINT8                             errataRev;
1810   UINT8                             tpmVendorID[4];
1811   UINT16                            vendorSpecificSize;
1812   UINT8                             *vendorSpecific;
1813 } TPM_CAP_VERSION_INFO;
1814 
1815 //
1816 // Part 2, section 21.10: TPM_DA_ACTION_TYPE
1817 //
1818 typedef struct tdTPM_DA_ACTION_TYPE {
1819   TPM_STRUCTURE_TAG                 tag;
1820   UINT32                            actions;
1821 } TPM_DA_ACTION_TYPE;
1822 
1823 #define TPM_DA_ACTION_FAILURE_MODE     (((UINT32)1)<<3)
1824 #define TPM_DA_ACTION_DEACTIVATE       (((UINT32)1)<<2)
1825 #define TPM_DA_ACTION_DISABLE          (((UINT32)1)<<1)
1826 #define TPM_DA_ACTION_TIMEOUT          (((UINT32)1)<<0)
1827 
1828 //
1829 // Part 2, section 21.7: TPM_DA_INFO
1830 //
1831 typedef struct tdTPM_DA_INFO {
1832   TPM_STRUCTURE_TAG                 tag;
1833   TPM_DA_STATE                      state;
1834   UINT16                            currentCount;
1835   UINT16                            thresholdCount;
1836   TPM_DA_ACTION_TYPE                actionAtThreshold;
1837   UINT32                            actionDependValue;
1838   UINT32                            vendorDataSize;
1839   UINT8                             *vendorData;
1840 } TPM_DA_INFO;
1841 
1842 //
1843 // Part 2, section 21.8: TPM_DA_INFO_LIMITED
1844 //
1845 typedef struct tdTPM_DA_INFO_LIMITED {
1846   TPM_STRUCTURE_TAG                 tag;
1847   TPM_DA_STATE                      state;
1848   TPM_DA_ACTION_TYPE                actionAtThreshold;
1849   UINT32                            vendorDataSize;
1850   UINT8                             *vendorData;
1851 } TPM_DA_INFO_LIMITED;
1852 
1853 //
1854 // Part 2, section 21.9: CAP_PROPERTY Subcap values for GetCapability
1855 //
1856 #define TPM_DA_STATE_INACTIVE          ((UINT8)0x00)
1857 #define TPM_DA_STATE_ACTIVE            ((UINT8)0x01)
1858 
1859 //
1860 // Part 2, section 22: DAA Structures
1861 //
1862 
1863 #define TPM_DAA_SIZE_r0                (43)
1864 #define TPM_DAA_SIZE_r1                (43)
1865 #define TPM_DAA_SIZE_r2                (128)
1866 #define TPM_DAA_SIZE_r3                (168)
1867 #define TPM_DAA_SIZE_r4                (219)
1868 #define TPM_DAA_SIZE_NT                (20)
1869 #define TPM_DAA_SIZE_v0                (128)
1870 #define TPM_DAA_SIZE_v1                (192)
1871 #define TPM_DAA_SIZE_NE                (256)
1872 #define TPM_DAA_SIZE_w                 (256)
1873 #define TPM_DAA_SIZE_issuerModulus     (256)
1874 #define TPM_DAA_power0                 (104)
1875 #define TPM_DAA_power1                 (1024)
1876 
1877 typedef struct tdTPM_DAA_ISSUER
1878 {
1879     TPM_STRUCTURE_TAG               tag;
1880     TPM_DIGEST                      DAA_digest_R0;
1881     TPM_DIGEST                      DAA_digest_R1;
1882     TPM_DIGEST                      DAA_digest_S0;
1883     TPM_DIGEST                      DAA_digest_S1;
1884     TPM_DIGEST                      DAA_digest_n;
1885     TPM_DIGEST                      DAA_digest_gamma;
1886     UINT8                           DAA_generic_q[26];
1887 } TPM_DAA_ISSUER;
1888 
1889 
1890 typedef struct tdTPM_DAA_TPM
1891 {
1892     TPM_STRUCTURE_TAG               tag;
1893     TPM_DIGEST                      DAA_digestIssuer;
1894     TPM_DIGEST                      DAA_digest_v0;
1895     TPM_DIGEST                      DAA_digest_v1;
1896     TPM_DIGEST                      DAA_rekey;
1897     UINT32                          DAA_count;
1898 } TPM_DAA_TPM;
1899 
1900 typedef struct tdTPM_DAA_CONTEXT
1901 {
1902     TPM_STRUCTURE_TAG               tag;
1903     TPM_DIGEST                      DAA_digestContext;
1904     TPM_DIGEST                      DAA_digest;
1905     TPM_DAA_CONTEXT_SEED            DAA_contextSeed;
1906     UINT8                           DAA_scratch[256];
1907     UINT8                           DAA_stage;
1908 } TPM_DAA_CONTEXT;
1909 
1910 typedef struct tdTPM_DAA_JOINDATA
1911 {
1912     UINT8                           DAA_join_u0[128];
1913     UINT8                           DAA_join_u1[138];
1914     TPM_DIGEST                      DAA_digest_n0;
1915 } TPM_DAA_JOINDATA;
1916 
1917 typedef struct tdTPM_DAA_BLOB
1918 {
1919     TPM_STRUCTURE_TAG               tag;
1920     TPM_RESOURCE_TYPE               resourceType;
1921     UINT8                           label[16];
1922     TPM_DIGEST                      blobIntegrity;
1923     UINT32                          additionalSize;
1924     UINT8                           *additionalData;
1925     UINT32                          sensitiveSize;
1926     UINT8                           *sensitiveData;
1927 } TPM_DAA_BLOB;
1928 
1929 typedef struct tdTPM_DAA_SENSITIVE
1930 {
1931     TPM_STRUCTURE_TAG               tag;
1932     UINT32                          internalSize;
1933     UINT8                           *internalData;
1934 } TPM_DAA_SENSITIVE;
1935 
1936 
1937 //
1938 // Part 2, section 23: Redirection
1939 //
1940 
1941 // This section of the TPM spec defines exactly one value but does not
1942 // give it a name. The definition of TPM_SetRedirection in Part3
1943 // refers to exactly one name but does not give its value. We join
1944 // them here.
1945 #define TPM_REDIR_GPIO              (0x00000001)
1946 
1947 //
1948 // TPM Command & Response Headers
1949 //
1950 typedef struct tdTPM_RQU_COMMAND_HDR {
1951   TPM_STRUCTURE_TAG                 tag;
1952   UINT32                            paramSize;
1953   TPM_COMMAND_CODE                  ordinal;
1954 } TPM_RQU_COMMAND_HDR;
1955 
1956 typedef struct tdTPM_RSP_COMMAND_HDR {
1957   TPM_STRUCTURE_TAG                 tag;
1958   UINT32                            paramSize;
1959   TPM_RESULT                        returnCode;
1960 } TPM_RSP_COMMAND_HDR;
1961 
1962 #ifndef __GNUC__
1963 #pragma pack (pop)
1964 #endif
1965 
1966 #endif  // _TPM12_H_
1967