Trusted Platform Module Library
Part 3: Commands
Family “2.0”
Level 00 Revision 00.99
October 31, 2013

Contact: admin@trustedcomputinggroup.org

Published
Copyright © TCG 2006-2013

TCG

Part 3: Commands

Trusted Platform Module Library

Licenses and Notices
1. Copyright Licenses:


Trusted Computing Group (TCG) grants to the user of the source code in this specification (the
“Source Code”) a worldwide, irrevocable, nonexclusive, royalty free, copyright license to
reproduce, create derivative works, distribute, display and perform the Source Code and
derivative works thereof, and to grant others the rights granted herein.



The TCG grants to the user of the other parts of the specification (other than the Source Code)
the rights to reproduce, distribute, display, and perform the specification solely for the purpose of
developing products based on such documents.

2. Source Code Distribution Conditions:


Redistributions of Source Code must retain the above copyright licenses, this list of conditions
and the following disclaimers.



Redistributions in binary form must reproduce the above copyright licenses, this list of conditions
and the following disclaimers in the documentation and/or other materials provided with the
distribution.

3. Disclaimers:


THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF
LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH
RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES)
THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE.
Contact TCG Administration (admin@trustedcomputinggroup.org) for information on specification
licensing rights available through TCG membership agreements.



THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED WARRANTIES
WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR NONINFRINGEMENT OF
INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY OTHERWISE ARISING OUT OF
ANY PROPOSAL, SPECIFICATION OR SAMPLE.



Without limitation, TCG and its members and licensors disclaim all liability, including liability for
infringement of any proprietary rights, relating to use of information in this specification and to the
implementation of this specification, and TCG disclaims all liability for cost of procurement of
substitute goods or services, lost profits, loss of use, loss of data or any incidental, consequential,
direct, indirect, or special damages, whether under contract, tort, warranty or otherwise, arising in
any way out of use or reliance upon this specification or any information herein.

Any marks and brands contained herein are the property of their respective owner

Page ii
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

CONTENTS
1
2
3
4

Scope .................................................................................................................................................... 1
Terms and Definitions ........................................................................................................................... 1
Symbols and abbreviated terms ............................................................................................................ 1
Notation ................................................................................................................................................. 1
4.1
4.2
4.3
4.4

5
6
7

Introduction ..................................................................................................................................... 1
Table Decorations ........................................................................................................................... 1
Handle and Parameter Demarcation .............................................................................................. 3
AuthorizationSize and ParameterSize ............................................................................................ 3

Normative References ........................................................................................................................... 4
Symbols and Abbreviated Terms .......................................................................................................... 4
Command Processing ........................................................................................................................... 4
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9

8

Introduction ..................................................................................................................................... 4
Command Header Validation .......................................................................................................... 4
Mode Checks .................................................................................................................................. 4
Handle Area Validation ................................................................................................................... 5
Session Area Validation .................................................................................................................. 6
Authorization Checks ...................................................................................................................... 7
Parameter Decryption ..................................................................................................................... 8
Parameter Unmarshaling ................................................................................................................ 9
Command Post Processing .......................................................................................................... 10

Response Values ................................................................................................................................ 12
8.1
8.2

9
10

Implementation Dependent ................................................................................................................. 15
Detailed Actions Assumptions ............................................................................................................. 16

10.1
10.2
10.3
11

Introduction ................................................................................................................................... 28
TPM2_SelfTest ............................................................................................................................. 29
TPM2_IncrementalSelfTest .......................................................................................................... 32
TPM2_GetTestResult ................................................................................................................... 35

Session Commands ............................................................................................................................ 38

13.1
13.2
14

Introduction ................................................................................................................................... 17
_TPM_Init...................................................................................................................................... 17
TPM2_Startup ............................................................................................................................... 19
TPM2_Shutdown .......................................................................................................................... 24

Testing ................................................................................................................................................. 28

12.1
12.2
12.3
12.4
13

Introduction ................................................................................................................................... 16
Pre-processing .............................................................................................................................. 16
Post Processing ............................................................................................................................ 16

Start-up ................................................................................................................................................ 17

11.1
11.2
11.3
11.4
12

Tag ................................................................................................................................................ 12
Response Codes .......................................................................................................................... 12

TPM2_StartAuthSession .............................................................................................................. 38
TPM2_PolicyRestart ..................................................................................................................... 43

Object Commands............................................................................................................................... 46

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page iii
October 31, 2013

Part 3: Commands
14.1
14.2
14.3
14.4
14.5
14.6
14.7
14.8
15

Introduction ................................................................................................................................. 132
TPM2_HMAC_Start .................................................................................................................... 132
TPM2_HashSequenceStart ........................................................................................................ 136
TPM2_SequenceUpdate ............................................................................................................ 139
TPM2_SequenceComplete......................................................................................................... 143
TPM2_EventSequenceComplete ............................................................................................... 147

Attestation Commands ...................................................................................................................... 151

20.1
20.2
20.3
20.4
20.5
20.6
20.7
21

TPM2_GetRandom ..................................................................................................................... 126
TPM2_StirRandom ..................................................................................................................... 129

Hash/HMAC/Event Sequences ......................................................................................................... 132

19.1
19.2
19.3
19.4
19.5
19.6
20

Introduction ................................................................................................................................. 113
TPM2_EncryptDecrypt ................................................................................................................ 115
TPM2_Hash ................................................................................................................................ 119
TPM2_HMAC .............................................................................................................................. 122

Random Number Generator .............................................................................................................. 126

18.1
18.2
19

Introduction ................................................................................................................................... 92
TPM2_RSA_Encrypt ..................................................................................................................... 92
TPM2_RSA_Decrypt .................................................................................................................... 97
TPM2_ECDH_KeyGen ............................................................................................................... 101
TPM2_ECDH_ZGen ................................................................................................................... 104
TPM2_ECC_Parameters ............................................................................................................ 107
TPM2_ZGen_2Phase ................................................................................................................. 108

Symmetric Primitives ......................................................................................................................... 113

17.1
17.2
17.3
17.4
18

TPM2_Duplicate ........................................................................................................................... 77
TPM2_Rewrap .............................................................................................................................. 81
TPM2_Import ................................................................................................................................ 86

Asymmetric Primitives ......................................................................................................................... 92

16.1
16.2
16.3
16.4
16.5
16.6
16.7
17

TPM2_Create................................................................................................................................ 46
TPM2_Load .................................................................................................................................. 51
TPM2_LoadExternal ..................................................................................................................... 55
TPM2_ReadPublic ........................................................................................................................ 60
TPM2_ActivateCredential ............................................................................................................. 63
TPM2_MakeCredential ................................................................................................................. 67
TPM2_Unseal ............................................................................................................................... 70
TPM2_ObjectChangeAuth ............................................................................................................ 73

Duplication Commands ....................................................................................................................... 77

15.1
15.2
15.3
16

Trusted Platform Module Library

Introduction ................................................................................................................................. 151
TPM2_Certify .............................................................................................................................. 153
TPM2_CertifyCreation ................................................................................................................ 157
TPM2_Quote............................................................................................................................... 161
TPM2_GetSessionAuditDigest ................................................................................................... 165
TPM2_GetCommandAuditDigest ............................................................................................... 169
TPM2_GetTime........................................................................................................................... 173

Ephemeral EC Keys .......................................................................................................................... 177

Page iv
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
21.1
21.2
21.3
22

Introduction ................................................................................................................................. 200
TPM2_PCR_Extend ................................................................................................................... 201
TPM2_PCR_Event ..................................................................................................................... 204
TPM2_PCR_Read ...................................................................................................................... 207
TPM2_PCR_Allocate .................................................................................................................. 210
TPM2_PCR_SetAuthPolicy ........................................................................................................ 213
TPM2_PCR_SetAuthValue ......................................................................................................... 216
TPM2_PCR_Reset ..................................................................................................................... 219
_TPM_Hash_Start ...................................................................................................................... 222
_TPM_Hash_Data ...................................................................................................................... 224
_TPM_Hash_End ....................................................................................................................... 226

Enhanced Authorization (EA) Commands ........................................................................................ 229

25.1
25.2
25.3
25.4
25.5
25.6
25.7
25.8
25.9
25.10
25.11
25.12
25.13
25.14
25.15
25.16
25.17
25.18
25.19
25.20
26

Introduction ................................................................................................................................. 195
TPM2_SetCommandCodeAuditStatus ....................................................................................... 196

Integrity Collection (PCR) .................................................................................................................. 200

24.1
24.2
24.3
24.4
24.5
24.6
24.7
24.8
24.9
24.10
24.11
25

TPM2_VerifySignature ................................................................................................................ 187
TPM2_Sign ................................................................................................................................. 191

Command Audit ................................................................................................................................. 195

23.1
23.2
24

Introduction ................................................................................................................................. 177
TPM2_Commit ............................................................................................................................ 178
TPM2_EC_Ephemeral ................................................................................................................ 184

Signing and Signature Verification .................................................................................................... 187

22.1
22.2
23

Part 3: Commands

Introduction ................................................................................................................................. 229
Signed Authorization Actions ...................................................................................................... 230
TPM2_PolicySigned ................................................................................................................... 234
TPM2_PolicySecret .................................................................................................................... 240
TPM2_PolicyTicket ..................................................................................................................... 244
TPM2_PolicyOR ......................................................................................................................... 248
TPM2_PolicyPCR ....................................................................................................................... 252
TPM2_PolicyLocality .................................................................................................................. 256
TPM2_PolicyNV .......................................................................................................................... 260
TPM2_PolicyCounterTimer......................................................................................................... 265
TPM2_PolicyCommandCode ..................................................................................................... 270
TPM2_PolicyPhysicalPresence .................................................................................................. 273
TPM2_PolicyCpHash .................................................................................................................. 276
TPM2_PolicyNameHash ............................................................................................................. 280
TPM2_PolicyDuplicationSelect ................................................................................................... 283
TPM2_PolicyAuthorize ............................................................................................................... 287
TPM2_PolicyAuthValue .............................................................................................................. 291
TPM2_PolicyPassword ............................................................................................................... 294
TPM2_PolicyGetDigest ............................................................................................................... 297
TPM2_PolicyNvWritten ............................................................................................................... 300

Hierarchy Commands........................................................................................................................ 304

26.1
26.2
26.3

TPM2_CreatePrimary ................................................................................................................. 304
TPM2_HierarchyControl ............................................................................................................. 308
TPM2_SetPrimaryPolicy ............................................................................................................. 312

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page v
October 31, 2013

Part 3: Commands
26.4
26.5
26.6
26.7
26.8
27

TPM2_ReadClock ....................................................................................................................... 372
TPM2_ClockSet .......................................................................................................................... 375
TPM2_ClockRateAdjust .............................................................................................................. 378

Capability Commands ....................................................................................................................... 381

32.1
32.2
32.3
33

Introduction ................................................................................................................................. 354
TPM2_ContextSave .................................................................................................................... 354
TPM2_ContextLoad .................................................................................................................... 359
TPM2_FlushContext ................................................................................................................... 364
TPM2_EvictControl ..................................................................................................................... 367

Clocks and Timers............................................................................................................................. 372

31.1
31.2
31.3
32

Introduction ................................................................................................................................. 343
TPM2_FieldUpgradeStart ........................................................................................................... 345
TPM2_FieldUpgradeData ........................................................................................................... 348
TPM2_FirmwareRead ................................................................................................................. 351

Context Management ........................................................................................................................ 354

30.1
30.2
30.3
30.4
30.5
31

Introduction ................................................................................................................................. 337
TPM2_PP_Commands ............................................................................................................... 337
TPM2_SetAlgorithmSet .............................................................................................................. 340

Field Upgrade .................................................................................................................................... 343

29.1
29.2
29.3
29.4
30

Introduction ................................................................................................................................. 331
TPM2_DictionaryAttackLockReset ............................................................................................. 331
TPM2_DictionaryAttackParameters............................................................................................ 334

Miscellaneous Management Functions ............................................................................................. 337

28.1
28.2
28.3
29

TPM2_ChangePPS .................................................................................................................... 315
TPM2_ChangeEPS .................................................................................................................... 318
TPM2_Clear ................................................................................................................................ 321
TPM2_ClearControl .................................................................................................................... 325
TPM2_HierarchyChangeAuth ..................................................................................................... 328

Dictionary Attack Functions ............................................................................................................... 331

27.1
27.2
27.3
28

Trusted Platform Module Library

Introduction ................................................................................................................................. 381
TPM2_GetCapability ................................................................................................................... 381
TPM2_TestParms ....................................................................................................................... 389

Non-volatile Storage .......................................................................................................................... 392

33.1
33.2
33.3
33.4
33.5
33.6
33.7
33.8
33.9
33.10
33.11

Introduction ................................................................................................................................. 392
NV Counters ............................................................................................................................... 393
TPM2_NV_DefineSpace ............................................................................................................. 394
TPM2_NV_UndefineSpace ......................................................................................................... 400
TPM2_NV_UndefineSpaceSpecial ............................................................................................. 403
TPM2_NV_ReadPublic ............................................................................................................... 406
TPM2_NV_Write ......................................................................................................................... 409
TPM2_NV_Increment ................................................................................................................. 413
TPM2_NV_Extend ...................................................................................................................... 417
TPM2_NV_SetBits ...................................................................................................................... 421
TPM2_NV_WriteLock ................................................................................................................. 425

Page vi
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
33.12
33.13
33.14
33.15
33.16

Part 3: Commands

TPM2_NV_GlobalWriteLock ....................................................................................................... 429
TPM2_NV_Read ......................................................................................................................... 432
TPM2_NV_ReadLock ................................................................................................................. 435
TPM2_NV_ChangeAuth ............................................................................................................. 438
TPM2_NV_Certify ....................................................................................................................... 441

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page vii
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Tables
Table 1 — Command Modifiers and Decoration ........................................................................................... 2
Table 2 — Separators ................................................................................................................................... 3
Table 3 — Unmarshaling Errors ................................................................................................................. 10
Table 4 — Command-Independent Response Codes ................................................................................ 13
Table 5 — TPM2_Startup Command .......................................................................................................... 21
Table 6 — TPM2_Startup Response .......................................................................................................... 21
Table 7 — TPM2_Shutdown Command ..................................................................................................... 25
Table 8 — TPM2_Shutdown Response ...................................................................................................... 25
Table 9 — TPM2_SelfTest Command ........................................................................................................ 30
Table 10 — TPM2_SelfTest Response ...................................................................................................... 30
Table 11 — TPM2_IncrementalSelfTest Command ................................................................................... 33
Table 12 — TPM2_IncrementalSelfTest Response ................................................................................... 33
Table 13 — TPM2_GetTestResult Command ............................................................................................ 36
Table 14 — TPM2_GetTestResult Response............................................................................................. 36
Table 15 — TPM2_StartAuthSession Command ....................................................................................... 40
Table 16 — TPM2_StartAuthSession Response ........................................................................................ 40
Table 17 — TPM2_PolicyRestart Command .............................................................................................. 44
Table 18 — TPM2_PolicyRestart Response .............................................................................................. 44
Table 19 — TPM2_Create Command ........................................................................................................ 48
Table 20 — TPM2_Create Response ......................................................................................................... 48
Table 21 — TPM2_Load Command ........................................................................................................... 52
Table 22 — TPM2_Load Response ............................................................................................................ 52
Table 23 — TPM2_LoadExternal Command .............................................................................................. 57
Table 24 — TPM2_LoadExternal Response .............................................................................................. 57
Table 25 — TPM2_ReadPublic Command ................................................................................................. 61
Table 26 — TPM2_ReadPublic Response ................................................................................................. 61
Table 27 — TPM2_ActivateCredential Command ...................................................................................... 64
Table 28 — TPM2_ActivateCredential Response ...................................................................................... 64
Table 29 — TPM2_MakeCredential Command .......................................................................................... 68
Table 30 — TPM2_MakeCredential Response .......................................................................................... 68
Table 31 — TPM2_Unseal Command ........................................................................................................ 71
Table 32 — TPM2_Unseal Response ........................................................................................................ 71
Table 33 — TPM2_ObjectChangeAuth Command ..................................................................................... 74
Table 34 — TPM2_ObjectChangeAuth Response ..................................................................................... 74
Table 35 — TPM2_Duplicate Command .................................................................................................... 78
Table 36 — TPM2_Duplicate Response ..................................................................................................... 78
Table 37 — TPM2_Rewrap Command ....................................................................................................... 82
Table 38 — TPM2_Rewrap Response ....................................................................................................... 82
Page viii
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Table 39 — TPM2_Import Command ......................................................................................................... 88
Table 40 — TPM2_Import Response ......................................................................................................... 88
Table 41 — Padding Scheme Selection ..................................................................................................... 92
Table 42 — Message Size Limits Based on Padding ................................................................................. 93
Table 43 — TPM2_RSA_Encrypt Command.............................................................................................. 94
Table 44 — TPM2_RSA_Encrypt Response .............................................................................................. 94
Table 45 — TPM2_RSA_Decrypt Command ............................................................................................. 98
Table 46 — TPM2_RSA_Decrypt Response .............................................................................................. 98
Table 47 — TPM2_ECDH_KeyGen Command ........................................................................................ 102
Table 48 — TPM2_ECDH_KeyGen Response ........................................................................................ 102
Table 49 — TPM2_ECDH_ZGen Command ............................................................................................ 105
Table 50 — TPM2_ECDH_ZGen Response ............................................................................................ 105
Table 51 — TPM2_ECC_Parameters Command ..................................................................................... 107
Table 52 — TPM2_ECC_Parameters Response ..................................................................................... 107
Table 53 — TPM2_ZGen_2Phase Command .......................................................................................... 110
Table 54 — TPM2_ZGen_2Phase Response .......................................................................................... 110
Table 55 — Symmetric Chaining Process ................................................................................................ 114
Table 56 — TPM2_EncryptDecrypt Command......................................................................................... 116
Table 57 — TPM2_EncryptDecrypt Response ......................................................................................... 116
Table 58 — TPM2_Hash Command ......................................................................................................... 120
Table 59 — TPM2_Hash Response ......................................................................................................... 120
Table 60 — TPM2_HMAC Command ....................................................................................................... 123
Table 61 — TPM2_HMAC Response ....................................................................................................... 123
Table 62 — TPM2_GetRandom Command .............................................................................................. 127
Table 63 — TPM2_GetRandom Response .............................................................................................. 127
Table 64 — TPM2_StirRandom Command .............................................................................................. 130
Table 65 — TPM2_StirRandom Response ............................................................................................... 130
Table 66 — Hash Selection Matrix ........................................................................................................... 132
Table 67 — TPM2_HMAC_Start Command ............................................................................................. 133
Table 68 — TPM2_HMAC_Start Response ............................................................................................. 133
Table 69 — TPM2_HashSequenceStart Command ................................................................................. 137
Table 70 — TPM2_HashSequenceStart Response ................................................................................. 137
Table 71 — TPM2_SequenceUpdate Command ..................................................................................... 140
Table 72 — TPM2_SequenceUpdate Response ...................................................................................... 140
Table 73 — TPM2_SequenceComplete Command ................................................................................. 144
Table 74 — TPM2_SequenceComplete Response .................................................................................. 144
Table 75 — TPM2_EventSequenceComplete Command ........................................................................ 148
Table 76 — TPM2_EventSequenceComplete Response ......................................................................... 148
Table 77 — TPM2_Certify Command ....................................................................................................... 154
Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page ix
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Table 78 — TPM2_Certify Response ....................................................................................................... 154
Table 79 — TPM2_CertifyCreation Command ......................................................................................... 158
Table 80 — TPM2_CertifyCreation Response .......................................................................................... 158
Table 81 — TPM2_Quote Command ....................................................................................................... 162
Table 82 — TPM2_Quote Response ........................................................................................................ 162
Table 83 — TPM2_GetSessionAuditDigest Command ............................................................................ 166
Table 84 — TPM2_GetSessionAuditDigest Response ............................................................................ 166
Table 85 — TPM2_GetCommandAuditDigest Command ........................................................................ 170
Table 86 — TPM2_GetCommandAuditDigest Response ......................................................................... 170
Table 87 — TPM2_GetTime Command ................................................................................................... 174
Table 88 — TPM2_GetTime Response .................................................................................................... 174
Table 89 — TPM2_Commit Command ..................................................................................................... 180
Table 90 — TPM2_Commit Response ..................................................................................................... 180
Table 91 — TPM2_EC_Ephemeral Command ......................................................................................... 185
Table 92 — TPM2_EC_Ephemeral Response ......................................................................................... 185
Table 93 — TPM2_VerifySignature Command......................................................................................... 188
Table 94 — TPM2_VerifySignature Response ......................................................................................... 188
Table 95 — TPM2_Sign Command .......................................................................................................... 192
Table 96 — TPM2_Sign Response .......................................................................................................... 192
Table 97 — TPM2_SetCommandCodeAuditStatus Command ................................................................ 197
Table 98 — TPM2_SetCommandCodeAuditStatus Response ................................................................ 197
Table 99 — TPM2_PCR_Extend Command ............................................................................................ 202
Table 100 — TPM2_PCR_Extend Response ........................................................................................... 202
Table 101 — TPM2_PCR_Event Command ............................................................................................ 205
Table 102 — TPM2_PCR_Event Response ............................................................................................. 205
Table 103 — TPM2_PCR_Read Command ............................................................................................. 208
Table 104 — TPM2_PCR_Read Response ............................................................................................. 208
Table 105 — TPM2_PCR_Allocate Command ......................................................................................... 211
Table 106 — TPM2_PCR_Allocate Response ......................................................................................... 211
Table 107 — TPM2_PCR_SetAuthPolicy Command ............................................................................... 214
Table 108 — TPM2_PCR_SetAuthPolicy Response ............................................................................... 214
Table 109 — TPM2_PCR_SetAuthValue Command ............................................................................... 217
Table 110 — TPM2_PCR_SetAuthValue Response ................................................................................ 217
Table 111 — TPM2_PCR_Reset Command ............................................................................................ 220
Table 112 — TPM2_PCR_Reset Response ............................................................................................. 220
Table 113 — TPM2_PolicySigned Command .......................................................................................... 236
Table 114 — TPM2_PolicySigned Response ........................................................................................... 236
Table 115 — TPM2_PolicySecret Command ........................................................................................... 241
Table 116 — TPM2_PolicySecret Response ............................................................................................ 241
Page x
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Table 117 — TPM2_PolicyTicket Command ............................................................................................ 245
Table 118 — TPM2_PolicyTicket Response ............................................................................................ 245
Table 119 — TPM2_PolicyOR Command ................................................................................................ 249
Table 120 — TPM2_PolicyOR Response ................................................................................................. 249
Table 121 — TPM2_PolicyPCR Command .............................................................................................. 253
Table 122 — TPM2_PolicyPCR Response .............................................................................................. 253
Table 123 — TPM2_PolicyLocality Command ......................................................................................... 257
Table 124 — TPM2_PolicyLocality Response .......................................................................................... 257
Table 125 — TPM2_PolicyNV Command ................................................................................................. 261
Table 126 — TPM2_PolicyNV Response ................................................................................................. 261
Table 127 — TPM2_PolicyCounterTimer Command ............................................................................... 266
Table 128 — TPM2_PolicyCounterTimer Response ................................................................................ 266
Table 129 — TPM2_PolicyCommandCode Command ............................................................................ 271
Table 130 — TPM2_PolicyCommandCode Response ............................................................................. 271
Table 131 — TPM2_PolicyPhysicalPresence Command ......................................................................... 274
Table 132 — TPM2_PolicyPhysicalPresence Response ......................................................................... 274
Table 133 — TPM2_PolicyCpHash Command......................................................................................... 277
Table 134 — TPM2_PolicyCpHash Response ......................................................................................... 277
Table 135 — TPM2_PolicyNameHash Command.................................................................................... 281
Table 136 — TPM2_PolicyNameHash Response .................................................................................... 281
Table 137 — TPM2_PolicyDuplicationSelect Command .......................................................................... 284
Table 138 — TPM2_PolicyDuplicationSelect Response .......................................................................... 284
Table 139 — TPM2_PolicyAuthorize Command ...................................................................................... 288
Table 140 — TPM2_PolicyAuthorize Response ....................................................................................... 288
Table 141 — TPM2_PolicyAuthValue Command ..................................................................................... 292
Table 142 — TPM2_PolicyAuthValue Response ..................................................................................... 292
Table 143 — TPM2_PolicyPassword Command ...................................................................................... 295
Table 144 — TPM2_PolicyPassword Response ...................................................................................... 295
Table 145 — TPM2_PolicyGetDigest Command...................................................................................... 298
Table 146 — TPM2_PolicyGetDigest Response ...................................................................................... 298
Table 133 — TPM2_PolicyNvWritten Command ...................................................................................... 301
Table 134 — TPM2_PolicyNvWritten Response ...................................................................................... 301
Table 147 — TPM2_CreatePrimary Command ........................................................................................ 305
Table 148 — TPM2_CreatePrimary Response ........................................................................................ 305
Table 149 — TPM2_HierarchyControl Command .................................................................................... 309
Table 150 — TPM2_HierarchyControl Response .................................................................................... 309
Table 151 — TPM2_SetPrimaryPolicy Command .................................................................................... 313
Table 152 — TPM2_SetPrimaryPolicy Response .................................................................................... 313
Table 153 — TPM2_ChangePPS Command ........................................................................................... 316
Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page xi
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Table 154 — TPM2_ChangePPS Response ............................................................................................ 316
Table 155 — TPM2_ChangeEPS Command ........................................................................................... 319
Table 156 — TPM2_ChangeEPS Response ............................................................................................ 319
Table 157 — TPM2_Clear Command ....................................................................................................... 322
Table 158 — TPM2_Clear Response ....................................................................................................... 322
Table 159 — TPM2_ClearControl Command ........................................................................................... 326
Table 160 — TPM2_ClearControl Response ........................................................................................... 326
Table 161 — TPM2_HierarchyChangeAuth Command ............................................................................ 329
Table 162 — TPM2_HierarchyChangeAuth Response ............................................................................ 329
Table 163 — TPM2_DictionaryAttackLockReset Command .................................................................... 332
Table 164 — TPM2_DictionaryAttackLockReset Response .................................................................... 332
Table 165 — TPM2_DictionaryAttackParameters Command .................................................................. 335
Table 166 — TPM2_DictionaryAttackParameters Response ................................................................... 335
Table 167 — TPM2_PP_Commands Command ...................................................................................... 338
Table 168 — TPM2_PP_Commands Response ...................................................................................... 338
Table 169 — TPM2_SetAlgorithmSet Command ..................................................................................... 341
Table 170 — TPM2_SetAlgorithmSet Response...................................................................................... 341
Table 171 — TPM2_FieldUpgradeStart Command .................................................................................. 346
Table 172 — TPM2_FieldUpgradeStart Response .................................................................................. 346
Table 173 — TPM2_FieldUpgradeData Command .................................................................................. 349
Table 174 — TPM2_FieldUpgradeData Response .................................................................................. 349
Table 175 — TPM2_FirmwareRead Command........................................................................................ 352
Table 176 — TPM2_FirmwareRead Response ........................................................................................ 352
Table 177 — TPM2_ContextSave Command........................................................................................... 355
Table 178 — TPM2_ContextSave Response ........................................................................................... 355
Table 179 — TPM2_ContextLoad Command ........................................................................................... 360
Table 180 — TPM2_ContextLoad Response ........................................................................................... 360
Table 181 — TPM2_FlushContext Command .......................................................................................... 365
Table 182 — TPM2_FlushContext Response .......................................................................................... 365
Table 183 — TPM2_EvictControl Command ............................................................................................ 369
Table 184 — TPM2_EvictControl Response ............................................................................................ 369
Table 185 — TPM2_ReadClock Command.............................................................................................. 373
Table 186 — TPM2_ReadClock Response .............................................................................................. 373
Table 187 — TPM2_ClockSet Command ................................................................................................. 376
Table 188 — TPM2_ClockSet Response ................................................................................................. 376
Table 189 — TPM2_ClockRateAdjust Command..................................................................................... 379
Table 190 — TPM2_ClockRateAdjust Response ..................................................................................... 379
Table 191 — TPM2_GetCapability Command.......................................................................................... 385
Table 192 — TPM2_GetCapability Response .......................................................................................... 385
Page xii
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Table 193 — TPM2_TestParms Command .............................................................................................. 390
Table 194 — TPM2_TestParms Response .............................................................................................. 390
Table 195 — TPM2_NV_DefineSpace Command ................................................................................... 396
Table 196 — TPM2_NV_DefineSpace Response .................................................................................... 396
Table 197 — TPM2_NV_UndefineSpace Command ............................................................................... 401
Table 198 — TPM2_NV_UndefineSpace Response ................................................................................ 401
Table 199 — TPM2_NV_UndefineSpaceSpecial Command .................................................................... 404
Table 200 — TPM2_NV_UndefineSpaceSpecial Response .................................................................... 404
Table 201 — TPM2_NV_ReadPublic Command ...................................................................................... 407
Table 202 — TPM2_NV_ReadPublic Response ...................................................................................... 407
Table 203 — TPM2_NV_Write Command ................................................................................................ 410
Table 204 — TPM2_NV_Write Response ................................................................................................ 410
Table 205 — TPM2_NV_Increment Command ........................................................................................ 414
Table 206 — TPM2_NV_Increment Response......................................................................................... 414
Table 207 — TPM2_NV_Extend Command ............................................................................................. 418
Table 208 — TPM2_NV_Extend Response ............................................................................................. 418
Table 209 — TPM2_NV_SetBits Command ............................................................................................. 422
Table 210 — TPM2_NV_SetBits Response ............................................................................................. 422
Table 211 — TPM2_NV_WriteLock Command ........................................................................................ 426
Table 212 — TPM2_NV_WriteLock Response......................................................................................... 426
Table 213 — TPM2_NV_GlobalWriteLock Command .............................................................................. 430
Table 214 — TPM2_NV_GlobalWriteLock Response .............................................................................. 430
Table 215 — TPM2_NV_Read Command................................................................................................ 433
Table 216 — TPM2_NV_Read Response ................................................................................................ 433
Table 217 — TPM2_NV_ReadLock Command ........................................................................................ 436
Table 218 — TPM2_NV_ReadLock Response ........................................................................................ 436
Table 219 — TPM2_NV_ChangeAuth Command .................................................................................... 439
Table 220 — TPM2_NV_ChangeAuth Response .................................................................................... 439
Table 221 — TPM2_NV_Certify Command .............................................................................................. 442
Table 222 — TPM2_NV_Certify Response .............................................................................................. 442

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page xiii
October 31, 2013

Trusted Platform Module Library

Part 3: Commands

Trusted Platform Module Library
Part 3: Commands
1

Scope

This part 3 of the Trusted Module Library specification contains the definitions of the TPM commands.
These commands make use of the constants, flags, structure, and union definitions defined in part 2:
Structures.
The detailed description of the operation of the commands is written in the C language with extensive
comments. The behavior of the C code in this part 3 is normative but does not fully describe the behavior
of a TPM. The combination of this part 3 and part 4: Supporting Routines is sufficient to fully describe the
required behavior of a TPM.
The code in parts 3 and 4 is written to define the behavior of a compliant TPM. In some cases (e.g.,
firmware update), it is not possible to provide a compliant implementation. In those cases, any
implementation provided by the vendor that meets the general description of the function provided in part
3 would be compliant.
The code in parts 3 and 4 is not written to meet any particular level of conformance nor does this
specification require that a TPM meet any particular level of conformance.
2

Terms and Definitions

For the purposes of this document, the terms and definitions given in part 1 of this specification apply.
3

Symbols and abbreviated terms

For the purposes of this document, the symbols and abbreviated terms given in part 1 apply.
4

Notation

4.1 Introduction
In addition to the notation in this clause, the “Notations” clause in Part 1 of this specification is applicable
to this Part 3.
Command and response tables used various decorations to indicate the fields of the command and the
allowed types. These decorations are described in this clause.
4.2

Table Decorations

The symbols and terms in the Notation column of Table 1 are used in the tables for the command
schematics. These values indicate various qualifiers for the parameters or descriptions with which they
are associated.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 1
October 31, 2013

Part 3: Commands

Trusted Platform Module Library
Table 1 — Command Modifiers and Decoration

Notation

Meaning

+

A Type decoration – When appended to a value in the Type column of a command, this symbol
indicates that the parameter is allowed to use the “null” value of the data type (see "Conditional
Types" in Part 2). The null value is usually TPM_RH_NULL for a handle or TPM_ALG_NULL for
an algorithm selector.

@

A Name decoration – When this symbol precedes a handle parameter in the “Name” column, it
indicates that an authorization session is required for use of the entity associated with the handle.
If a handle does not have this symbol, then an authorization session is not allowed.

+PP

A Description modifier – This modifier may follow TPM_RH_PLATFORM in the “Description”
column to indicate that Physical Presence is required when platformAuth/platformPolicy is
provided.

+{PP}

A Description modifier – This modifier may follow TPM_RH_PLATFORM to indicate that Physical
Presence may be required when platformAuth/platformPolicy is provided. The commands with this
notation may be in the setList or clearList of TPM2_PP_Commands().

{NV}

A Description modifier – This modifier may follow the commandCode in the “Description” column
to indicate that the command may result in an update of NV memory and be subject to rate
throttling by the TPM. If the command code does not have this notation, then a write to NV
memory does not occur as part of the command actions.
NOTE Any command that uses authorization may cause a write to NV if there is an authorization
failure. A TPM may use the occasion of command execution to update the NV
copy of clock.

{F}

A Description modifier – This modifier indicates that the “flushed” attribute will be SET in the
TPMA_CC for the command. The modifier may follow the commandCode in the “Description”
column to indicate that any transient handle context used by the command will be flushed from the
TPM when the command completes. This may be combined with the {NV} modifier but not with the
{E} modifier.
EXAMPLE 1

{E}

{NV F}

EXAMPLE 2

TPM2_SequenceComplete() will flush the context associated with the sequenceHandle.

A Description modifier – This modifier indicates that the “extensive” attribute will be SET in the
TPMA_CC for the command. This modifier may follow the commandCode in the “Description”
column to indicate that the command may flush many objects and re-enumeration of the loaded
context likely will be required. This may be combined with the {NV} modifier but not with the {F}
modifier.
EXAMPLE 1

Auth Index:

{NV E}

EXAMPLE 2

TPM2_Clear() will flush all contexts associated with the Storage hierarchy and the
Endorsement hierarchy.

A Description modifier – When a handle has a “@” decoration, the “Description” column will
contain an “Auth Index:” entry for the handle. This entry indicates the number of the authorization
session. The authorization sessions associated with handles will occur in the session area in the
order of the handles with the “@” modifier. Sessions used only for encryption/decryption or only for
audit will follow the handles used for authorization.

Page 2
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Notation

Meaning

Auth Role:

A Description modifier – This will be in the “Description” column of a handle with the “@”
decoration. It may have a value of USER, ADMIN or DUP. If the handle has the Auth Role of
USER and the handle is an Object, the type of authorization is determined by the setting of
userWithAuth in the Object's attributes. If the Auth Role is ADMIN and the handle is an Object, the
type of authorization is determined by the setting of adminWithPolicy in the Object's attributes. If
the DUP role is selected, authorization may only be with a policy session (DUP role only applies to
Objects). When either ADMIN or DUP role is selected, a policy command that selects the
command being authorized is required to be part of the policy.
EXAMPLE

TPM2_Certify requires the ADMIN role for the first handle (objectHandle). The policy authorization
for objectHandle is required to contain TPM2_PolicyCommandCode(commandCode ==
TPM_CC_Certify). This sets the state of the policy so that it can be used for ADMIN role
authorization in TPM2_Certify().

If the handle references an NV Index, then the allowed authorizations are determined by the
settings of the attributes of the NV Index as described in Part 2, "TPMA_NV (NV Index Attributes)."

4.3

Handle and Parameter Demarcation

The demarcations between the header, handle, and parameter parts are indicated by:
Table 2 — Separators
Separator

Meaning
the values immediately following are in the handle area
the values immediately following are in the parameter area

4.4

AuthorizationSize and ParameterSize

Authorization sessions are not shown in the command or response schematics. When the tag of a
command or response is TPM_ST_SESSIONS, then a 32-bit value will be present in the
command/response buffer to indicate the size of the authorization field or the parameter field. This value
shall immediately follow the handle area (which may contain no handles). For a command, this value
(authorizationSize) indicates the size of the Authorization Area and shall have a value of 9 or more. For a
response, this value (parameterSize) indicates the size of the parameter area and may have a value of
zero.
If the authorizationSize field is present in the command, parameterSize will be present in the response,
but only if the responseCode is TPM_RC_SUCCESS.
When the command tag is TPM_ST_NO_SESSIONS, no authorizations are present and no
authorizationSize field is required and shall not be present.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 3
October 31, 2013

Part 3: Commands

5

Trusted Platform Module Library

Normative References

The “Normative References” clause in Part 1 of this specification is applicable to this Part 3.
6

Symbols and Abbreviated Terms

The “Symbols and Abbreviated Terms” clause in Part 1 of this specification is applicable to this Part 3.

7
7.1

Command Processing
Introduction

This clause defines the command validations that are required of any implementation and the response
code returned if the indicated check fails. Unless stated otherwise, the order of the checks is not
normative and different TPM may give different responses when a command has multiple errors.
In the description below, some statements that describe a check may be followed by a response code in
parentheses. This is the normative response code should the indicated check fail. A normative response
code may also be included in the statement.
7.2

Command Header Validation

Before a TPM may begin the actions associated with a command, a set of command format and
consistency checks shall be performed. These checks are listed below and should be performed in the
indicated order.
a) The TPM shall successfully unmarshal a TPMI_ST_COMMAND_TAG and verify that it is either
TPM_ST_SESSIONS or TPM_ST_NO_SESSIONS (TPM_RC_BAD_TAG).
b) The TPM shall successfully unmarshal a UINT32 as the commandSize. If the TPM has an interface
buffer that is loaded by some hardware process, the number of octets in the input buffer for the
command reported by the hardware process shall exactly match the value in commandSize
(TPM_RC_COMMAND_SIZE).
NOTE

A TPM may have direct access to system memory and unmarshal directly from that memory.

c) The TPM shall successfully unmarshal a TPM_CC and verify that the command is implemented
(TPM_RC_COMMAND_CODE).
7.3

Mode Checks

The following mode checks shall be performed in the order listed:

Page 4
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

a) If the TPM is in Failure mode, then the commandCode is TPM_CC_GetTestResult or
TPM_CC_GetCapability (TPM_RC_FAILURE) and the command tag is TPM_ST_NO_SESSIONS
(TPM_RC_FAILURE).
NOTE 1

In Failure mode, the TPM has no cryptographic capability and proc essing of sessions is not
supported.

b) The TPM is in Field Upgrade mode (FUM), the commandCode is TPM_CC_FieldUpgradeData
(TPM_RC_UPGRADE).
c) If the TPM has not been initialized (TPM2_Startup()), then the commandCode is TPM_CC_Startup
(TPM_RC_INITIALIZE).
NOTE 2

The TPM may enter Failure mode during _TPM_Init processing, before TPM2_Startup(). Since
the platform firmware cannot know that the TPM is in Failure mode without accessing it, and
since the first command is required to be TPM2_Startup(), the expected sequence will be that
platform firmware (the CRTM) will issue TPM2_Startup() and receive TPM_RC_FAILURE
indicating that the TPM is in Failure mode.
There may be failures where a TPM cannot record that it received TPM2_Startup(). In those
cases, a TPM in failure mode may process TPM2_GetTestResult(), TPM2_GetCapability(), or
the field upgrade commands. As a side effect, that TPM may process TPM2_GetTestResult(),
TPM2_GetCapability() or the field upgrade commands before TPM2_Startup().
This is a corner case exception to the rule that TPM2_Startup() must be the first command.

The mode checks may be performed before or after the command header validation.
7.4 Handle Area Validation
After successfully unmarshaling and validating the command header, the TPM shall perform the following
checks on the handles and sessions. These checks may be performed in any order.
a) The TPM shall successfully unmarshal the number of handles required by the command and validate
that the value of the handle is consistent with the command syntax. If not, the TPM shall return
TPM_RC_VALUE.
NOTE 1

The TPM may unmarshal a handle and validate that it references an entity on the TPM before
unmarshaling a subsequent handle.

NOTE 2

If the submitted command contains fewer handles than required by the syntax of the command,
the TPM may continue to read into the next area and attempt to interpret the data as a handle.

b) For all handles in the handle area of the command, the TPM will validate that the referenced entity is
present in the TPM.
1) If the handle references a transient object, the handle shall reference a loaded object
(TPM_RC_REFERENCE_H0 + N where N is the number of the handle in the command).
NOTE 3

If the hierarchy for a transient object is disabled, then the transient objects will be flushe d so this
check will fail.

2) If the handle references a persistent object, then
i)

the handle shall reference a persistent object that is currently in TPM non-volatile memory
(TPM_RC_HANDLE);

ii)

the hierarchy associated with the object is not disabled (TPM_RC_HIERARCHY); and

iii) if the TPM implementation moves a persistent object to RAM for command processing then
sufficient RAM space is available (TPM_RC_OBJECT_MEMORY).

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 5
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

3) If the handle references an NV Index, then
i)

an Index exists that corresponds to the handle (TPM_RC_HANDLE); and

ii)

the hierarchy associated with the existing NV Index is not disabled (TPM_RC_HANDLE).

iii) the hierarchy associated
(TPM_RC_HIERARCHY)

with

an

NV

index

being

defined

is

not

disabled

4) If the handle references a session, then the session context shall be present in TPM memory
(TPM_RC_REFERENCE_S0 + N).
5) If the handle references a primary seed for a hierarchy (TPM_RH_ENDORSEMENT,
TPM_RH_OWNER, or TPM_RH_PLATFORM) then the enable for the hierarchy is SET
(TPM_RC_HIERARCHY).
6) If the handle references a PCR, then the value is within the range of PCR supported by the TPM
(TPM_RC_VALUE)
NOTE 4

7.5

In the reference implementation, this TPM_RC_VALUE is returned by the unmarshaling code for
a TPMI_DH_PCR.

Session Area Validation

a) If the tag is TPM_ST_SESSIONS and the command is a context management command
(TPM2_ContextSave(), TPM2_ContextLoad(), or TPM2_FlushContext()) the TPM will return
TPM_RC_AUTH_CONTEXT.
b) If the tag is TPM_ST_SESSIONS, the TPM will attempt to unmarshal an authorizationSize and return
TPM_RC_AUTHSIZE if the value is not within an acceptable range.
1) The minimum value is (sizeof(TPM_HANDLE) + sizeof(UINT16) + sizeof(TPMA_SESSION) +
sizeof(UINT16)).
2) The maximum value of authorizationSize is equal to commandSize – (sizeof(TPM_ST) +
sizeof(UINT32) + sizeof(TPM_CC) + (N * sizeof(TPM_HANDLE)) + sizeof(UINT32)) where N is
the number of handles associated with the commandCode and may be zero.
NOTE 1

(sizeof(TPM_ST) + sizeof(UINT32) + sizeof(TPM_CC)) is the size of a command header. The
last UINT32 contains the authorizationSize octets, which are not counted as being in the
authorization session area.

c) The TPM will unmarshal the authorization sessions and perform the following validations:
1) If the session handle is not a handle for an HMAC session, a handle for a policy session, or,
TPM_RS_PW then the TPM shall return TPM_RC_HANDLE.
2) If the session is not loaded, the TPM will return the warning TPM_RC_REFERENCE_S0 + N
where N is the number of the session. The first session is session zero, N = 0.
NOTE 2

If the HMAC and policy session contexts use the same memory, the type of the context must
match the type of the handle.

3) If the maximum allowed number of sessions have been unmarshaled and fewer octets than
indicated in authorizationSize were unmarshaled (that is, authorizationSize is too large), the TPM
shall return TPM_RC_AUTHSIZE.

Page 6
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

4) The consistency of the authorization session attributes is checked.
i)

An authorization session is present for each of the handles with the “@” decoration
(TPM_RC_AUTH_MISSING).

ii)

Only one session is allowed for:
(a) session auditing (TPM_RC_ATTRIBUTES) – this session may be used for encrypt or
decrypt but may not be a session that is also used for authorization;
(b) decrypting a command parameter (TPM_RC_ATTRIBUTES) – this may be any of the
authorization sessions, or the audit session, or a session may be added for the single
purpose of decrypting a command parameter, as long as the total number of sessions
does not exceed three; and
(c) encrypting a response parameter (TPM_RC_ATTRIBUTES) – this may be any of the
authorization sessions, or the audit session if present, ora session may be added for the
single purpose of encrypting a response parameter, as long as the total number of
sessions does not exceed three.
NOTE 3

7.6

A session used for decrypting a command parameter may also be used for
encrypting a response parameter.

Authorization Checks

After unmarshaling and validating the handles and the consistency of the authorization sessions, the
authorizations shall be checked. Authorization checks only apply to handles if the handle in the command
schematic has the “@” decoration.
a) The public and sensitive portions
(TPM_RC_AUTH_UNAVAILABLE).

of

the

object

shall

be

present

on

the

TPM

b) If the associated handle is TPM_RH_PLATFORM, and the command requires confirmation with
physical presence, then physical presence is asserted (TPM_RC_PP).
c) If the object or NV Index is subject to DA protection, and the authorization is with an HMAC or
password, then the TPM is not in lockout (TPM_RC_LOCKOUT).
NOTE 1

An object is subject to DA protection if its noDA attribute is CLEAR. An NV Index is subject to
DA protection if its TPMA_NV_NO_DA attribute is CLEAR.

NOTE 2

An HMAC or password is required in a policy
TPM2_PolicyAuthValue() or TPM2_PolicyPassword().

session

when

the

policy

contains

d) If the command requires a handle to have DUP role authorization, then the associated authorization
session is a policy session (TPM_RC_POLICY_FAIL).
e) If the command requires a handle to have ADMIN role authorization:
1) If the entity being authorized is an object and its adminWithPolicy attribute is SET, then the
authorization session is a policy session (TPM_RC_POLICY_FAIL).
NOTE 3

If adminWithPolicy is CLEAR, then any type of authorization session is allowed .

2) If the entity being authorized is an NV Index, then the associated authorization session is a policy
session.
NOTE 4

The only commands that are currently defined that required use of ADMIN role authorization are
commands that operate on objects and NV Indices.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 7
October 31, 2013

Part 3: Commands
f)

Trusted Platform Module Library

If the command requires a handle to have USER role authorization:
1) If the entity being authorized is an object and its userWithAuth attribute is CLEAR, then the
associated authorization session is a policy session (TPM_RC_POLICY_FAIL).
2) If the entity being authorized is an NV Index;
i)

if the authorization session is a policy session;
(a) the TPMA_NV_POLICYWRITE attribute of the NV Index is SET if the command modifies
the NV Index data (TPM_RC_AUTH_UNAVAILABLE);
(b) the TPMA_NV_POLICYREAD attribute of the NV Index is SET if the command reads the
NV Index data (TPM_RC_AUTH_UNAVAILABLE);

ii)

if the authorization is an HMAC session or a password;
(a) the TPMA_NV_AUTHWRITE attribute of the NV Index is SET if the command modifies
the NV Index data (TPM_RC_AUTH_UNAVAILABLE);
(b) the TPMA_NV_AUTHREAD attribute of the NV Index is SET if the command reads the
NV Index data (TPM_RC_AUTH_UNAVAILABLE).

g) If the authorization is provided by a policy session, then:
1) if policySession→timeOut
(TPM_RC_EXPIRED);

has

been

set,

the

session

shall

not

have

expired

2) if policySession→cpHash has been set, it shall match the cpHash of the command
(TPM_RC_POLICY_FAIL);
3) if policySession→commandCode has been set, then commandCode of the command shall match
(TPM_RC_POLICY_CC);
4) policySession→policyDigest
(TPM_RC_POLICY_FAIL);

shall

match

the

authPolicy

associated

with

the

handle

5) if policySession→pcrUpdateCounter has been set, then it shall match the value of
pcrUpdateCounter (TPM_RC_PCR_CHANGED);
6) if policySession->commandLocality has been set, it shall match the locality of the command
(TPM_RC_LOCALITY), and
7) if the authorization uses an HMAC, then the HMAC is properly constructed using the authValue
associated with the handle and/or the session secret (TPM_RC_AUTH_FAIL or
TPM_RC_BAD_AUTH).
NOTE 5

For a bound session, if the handle references the object us ed to initiate the session, then the
authValue will not be required but proof of knowledge of the session secret is necessary.

NOTE 6

A policy session may require proof of knowledge of the authValue of the object being authorized.

If the TPM returns an error other than TPM_RC_AUTH_FAIL then the TPM shall not alter any TPM state.
If the TPM return TPM_RC_AUTH_FAIL, then the TPM shall not alter any TPM state other than
lockoutCount.
NOTE 7

7.7

The TPM may decrease failedTries regardless of any other processing performed by the TPM. That
is, the TPM may exit Lockout mode, regardless of the return code.

Parameter Decryption

If an authorization session has the TPMA_SESSION.decrypt attribute SET, and the command does not
allow a command parameter to be encrypted, then the TPM will return TPM_RC_ATTRIBUTES.

Page 8
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Otherwise, the TPM will decrypt the parameter using the values associated with the session before
parsing parameters.
7.8
7.8.1

Parameter Unmarshaling
Introduction

The detailed actions for each command assume that the input parameters of the command have been
unmarshaled into a command-specific structure with the structure defined by the command schematic.
Additionally, a response-specific output structure is assumed which will receive the values produced by
the detailed actions.
NOTE

An implementation is not required to process parameters in this manner or to separate the
parameter parsing from the command actions. This method was chosen for the specification so that
the normative behavior described by the detailed actions would be clear and unencumbered.

Unmarshaling is the process of processing the parameters in the input buffer and preparing the
parameters for use by the command-specific action code. No data movement need take place but it is
required that the TPM validate that the parameters meet the requirements of the expected data type as
defined in Part 2 of this specification.
7.8.2

Unmarshaling Errors

When an error is encountered while unmarshaling a command parameter, an error response code is
returned and no command processing occurs. A table defining a data type may have response codes
embedded in the table to indicate the error returned when the input value does not match the parameters
of the table.
NOTE

In the reference implementation, a parameter number is added to the response code so that the
offending parameter can be isolated. This is optional.

In many cases, the table contains no specific response code value and the return code will be determined
as defined in Table 3.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 9
October 31, 2013

Part 3: Commands

Trusted Platform Module Library
Table 3 — Unmarshaling Errors

Response Code

Meaning

TPM_RC_ASYMMETRIC

a parameter that should be an asymmetric algorithm selection does not have a
value that is supported by the TPM

TPM_RC_BAD_TAG

a parameter that should be a command tag selection has a value that is not
supported by the TPM

TPM_RC_COMMAND_CODE

a parameter that should be a command code does not have a value that is
supported by the TPM

TPM_RC_HASH

a parameter that should be a hash algorithm selection does not have a value that
is supported by the TPM

TPM_RC_INSUFFICIENT

the input buffer did not contain enough octets to allow unmarshaling of the
expected data type;

TPM_RC_KDF

a parameter that should be a key derivation scheme (KDF) selection does not
have a value that is supported by the TPM

TPM_RC_KEY_SIZE

a parameter that is a key size has a value that is not supported by the TPM

TPM_RC_MODE

a parameter that should be a symmetric encryption mode selection does not have
a value that is supported by the TPM

TPM_RC_RESERVED

a non-zero value was found in a reserved field of an attribute structure (TPMA_)

TPM_RC_SCHEME

a parameter that should be signing or encryption scheme selection does not have
a value that is supported by the TPM

TPM_RC_SIZE

the value of a size parameter is larger or smaller than allowed

TPM_RC_SYMMETRIC

a parameter that should be a symmetric algorithm selection does not have a
value that is supported by the TPM

TPM_RC_TAG

a parameter that should be a structure tag has a value that is not supported by
the TPM

TPM_RC_TYPE

The type parameter of a TPMT_PUBLIC or TPMT_SENSITIVE has a value that is
not supported by the TPM

TPM_RC_VALUE

a parameter does not have one of its allowed values

In some commands, a parameter may not be used because of various options of that command.
However, the unmarshaling code is required to validate that all parameters have values that are allowed
by the Part 2 definition of the parameter type even if that parameter is not used in the command actions.
7.9

Command Post Processing

When the code that implements the detailed actions of the command completes, it returns a response
code. If that code is not TPM_RC_SUCCESS, the post processing code will not update any session or
audit data and will return a 10-octet response packet.
If the command completes successfully, the tag of the command determines if any authorization sessions
will be in the response. If so, the TPM will encrypt the first parameter of the response if indicated by the
authorization attributes. The TPM will then generate a new nonce value for each session and, if
appropriate, generate an HMAC.

Page 10
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

NOTE 1

The authorization attributes were validated during the session area validation to ensure that only
one session was used for parameter encryption of the response and that the command allowed
encryption in the response.

NOTE 2

No session nonce value is used for a password authorization but the session data is present.

Additionally, if the command is being audited by Command Audit, the audit digest is updated with the
cpHash of the command and rpHash of the response.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 11
October 31, 2013

Part 3: Commands

8
8.1

Trusted Platform Module Library

Response Values
Tag

When a command completes successfully, the tag parameter in the response shall have the same value
as the tag parameter in the command (TPM_ST_SESSIONS or TPM_RC_NO_SESSIONS). When a
command fails (the responseCode is not TPM_RC_SUCCESS), then the tag parameter in the response
shall be TPM_ST_NO_SESSIONS.
A special case exists when the command tag parameter is not an allowed value (TPM_ST_SESSIONS or
TPM_ST_NO_SESSIONS). For this case, it is assumed that the system software is attempting to send a
command formatted for a TPM 1.2 but the TPM is not capable of executing TPM 1.2 commands. So that
the TPM 1.2 compatible software will have a recognizable response, the TPM sets tag to
TPM_ST_RSP_COMMAND, responseSize to 00 00 00 0A16 and responseCode to TPM_RC_BAD_TAG.
This is the same response as the TPM 1.2 fatal error for TPM_BADTAG.
8.2

Response Codes

The normal response for any command is TPM_RC_SUCCESS. Any other value indicates that the
command did not complete and the state of the TPM is unchanged. An exception to this general rule is
that the logic associated with dictionary attack protection is allowed to be modified when an authorization
failure occurs.
Commands have response codes that are specific to that command, and those response codes are
enumerated in the detailed actions of each command. The codes associated with the unmarshaling of
parameters are documented Table 3. Another set of response code value are not command specific and
indicate a problem that is not specific to the command. That is, if the indicated problem is remedied, the
same command could be resubmitted and may complete normally.
The response codes that are not command specific are listed and described in Table 4.
The reference code for the command actions may have code that generates specific response codes
associated with a specific check but the listing of responses may not have that response code listed.

Page 12
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Table 4 — Command-Independent Response Codes
Response Code

Meaning

TPM_RC_CANCELLED

This response code may be returned by a TPM that supports command cancel.
When the TPM receives an indication that the current command should be
cancelled, the TPM may complete the command or return this code. If this code
is returned, then the TPM state is not changed and the same command may be
retried.

TPM_RC_CONTEXT_GAP

This response code can be returned for commands that manage session
contexts. It indicates that the gap between the lowest numbered active session
and the highest numbered session is at the limits of the session tracking logic.
The remedy is to load the session context with the lowest number so that its
tracking number can be updated.

TPM_RC_LOCKOUT

This response indicates that authorizations for objects subject to DA protection
are not allowed at this time because the TPM is in DA lockout mode. The remedy
is to wait or to exeucte TPM2_DictionaryAttackLockoutReset().

TPM_RC_MEMORY

A TPM may use a common pool of memory for objects, sessions, and other
purposes. When the TPM does not have enough memory available to perform
the actions of the command, it may return TPM_RC_MEMORY. This indicates
that the TPM resource manager may flush either sessions or objects in order to
make memory available for the command execution. A TPM may choose to
return TPM_RC_OBJECT_MEMORY or TPM_RC_SESSION_MEMORY if it
needs contexts of a particular type to be flushed.

TPM_RC_NV_RATE

This response code indicates that the TPM is rate-limiting writes to the NV
memory in order to prevent wearout. This response is possible for any command
that explicity writes to NV or commands that incidentally use NV such as a
command that uses authorization session that may need to update the dictionary
attack logic.

TPM_RC_NV_UNAVAILABLE

This response code is similar to TPM_RC_NV_RATE but indicates that access to
NV memory is currently not available and the command is not allowed to proceed
until it is. This would occur in a system where the NV memory used by the TPM
is not exclusive to the TPM and is a shared system resource.

TPM_RC_OBJECT_HANDLES

This response code indicates that the TPM has exhausted its handle space and
no new objects can be loaded unless the TPM is rebooted. This does not occur in
the reference implementation because of the way that object handles are
allocated. However, other implementations are allowed to assign each object a
unique handle each time the object is loaded. A TPM using this implementation
24
would be able to load 2 objects before the object space is exhausted.

TPM_RC_OBJECT_MEMORY

This response code can be returned by any command that causes the TPM to
need an object 'slot'. The most common case where this might be returned is
when an object is loaded (TPM2_Load, TPM2_CreatePrimary(), or
TPM2_ContextLoad()). However, the TPM implementation is allowed to use
object slots for other reasons. In the reference implementation, the TPM copies a
referenced persistent object into RAM for the duration of the commannd. If all the
slots are previously occupied, the TPM may return this value. A TPM is allowed
to use object slots for other purposes and return this value. The remedy when
this response is returned is for the TPM resource manager to flush a transient
object.

TPM_RC_REFERENCE_Hx

This response code indicates that a handle in the handle area of the command is
not associated with a loaded object. The value of 'x' is in the range 0 to 6 with a
st
th
value of 0 indicating the 1 handle and 6 representing the 7 . The TPM resource
manager needs to find the correct object and load it. It may then adjust the
handle and retry the command.
NOTE

Family “2.0”
Level 00 Revision 00.99

Usually, this error indicates that the TPM resource manager has a corrupted
database.

Published
Copyright © TCG 2006-2013

Page 13
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Response Code

Meaning

TPM_RC_REFERENCE_Sx

This response code indicates that a handle in the session area of the command
is not associated with a loaded session. The value of 'x' is in the range 0 to 6 with
st
th
a value of 0 indicating the 1 session handle and 6 representing the 7 . The
TPM resource manager needs to find the correct session and load it. It may then
retry the command.
NOTE Usually, this error indicates that the TPM resource manager has a
corrupted database.

TPM_RC_RETRY

the TPM was not able to start the command

This response code indicates that the TPM does not have a handle to assign to a
new session. This respose is only returned by TPM2_StartAuthSession(). It is
TPM_RC_SESSION_HANDLES
listed here because the command is not in error and the TPM resource manager
can remedy the situation by flushing a session (TPM2_FlushContext().

TPM_RC_SESSION_MEMORY

This response code can be returned by any command that causes the TPM to
need a session 'slot'. The most common case where this might be returned is
when a session is loaded (TPM2_StartAuthSession() or TPM2_ContextLoad()).
However, the TPM implementation is allowed to use object slots for other
purposes. The remedy when this response is returned is for the TPM resource
manager to flush a transient object.

TPM_RC_SUCCESS

Normal completion for any command. If the responseCode is
TPM_RC_SESSIONS, then the rest of the response has the format indicated in
the response schematic. Otherwise, the response is a 10 octet value indicating
an error.

TPM_RC_TESTING

This response code indicates that the TPM is performing tests and cannot
respond to the request at this time. The command may be retried.

TPM_RC_YIELDED

the TPM has suspended operation on the command; forward progress was made
and the command may be retried.
See Part 1, “Multi-tasking.”
NOTE

Page 14
October 31, 2013

This cannot occur on the reference implementation.

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

9

Part 3: Commands

Implementation Dependent

The actions code for each command makes assumptions about the behavior of various sub-systems.
There are many possible implementations of the subsystems that would achieve equivalent results. The
actions code is not written to anticipate all possible implementations of the sub-systems. Therefore, it is
the responsibility of the implementer to ensure that the necessary changes are made to the actions code
when the sub-system behavior changes.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 15
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Detailed Actions Assumptions

10
10.1

Introduction

The C code in the Detailed Actions for each command is written with a set of assumptions about the
processing performed before the action code is called and the processing that will be done after the
action code completes.
10.2

Pre-processing

Before calling the command actions code, the following actions have occurred.


Verification that the handles in the handle area reference entities that are resident on the TPM.
NOTE

If a handle is in the parameter portion of the command, the associated entity does not have to
be loaded, but the handle is required to be the correct type.



If use of a handle requires authorization, the Password, HMAC, or Policy session associated with the
handle has been verified.



If a command parameter was encrypted using parameter encryption, it was decrypted before being
unmarshaled.



If the command uses handles or parameters, the calling stack contains a pointer to a data structure
(in) that holds the unmarshaled values for the handles and commands. If the response has handles
or parameters, the calling stack contains a pointer to a data structure ( out) to hold the handles and
parameters generated by the command.



All parameters of the in structure have been validated and meet the requirements of the parameter
type as defined in Part 2.



Space set aside for the out structure is sufficient to hold the largest out structure that could be
produced by the command

10.3

Post Processing

When the function implementing the command actions completes,


response parameters that require parameter encryption will be encrypted after the command actions
complete;



audit and session contexts will be updated if the command response is TPM_RC_SUCCESS; and



the command header and command response parameters will be marshaled to the response buffer.

Page 16
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

11

Part 3: Commands

Start-up

11.1

Introduction

This clause contains the commands used to manage the startup and restart state of a TPM.
11.2

_TPM_Init

11.2.1 General Description
_TPM_Init initializes a TPM.
Initialization actions include testing code required to execute the next expected command. If the TPM is in
FUM, the next expected command is TPM2_FieldUpgradeData(); otherwise, the next expected command
is TPM2_Startup().
NOTE 1

If the TPM performs self-tests after receiving _TPM_Init() and the TPM enters Failure mode before
receiving TPM2_Startup() or TPM2_FieldUpgradeData(), then the TPM may be able to accept
TPM2_GetTestResult() or TPM2_GetCapability().

The means of signaling _TPM_Init shall be defined in the platform-specific specifications that define the
physical interface to the TPM. The platform shall send this indication whenever the platform starts its boot
process and only when the platform starts its boot process.
There shall be no software method of generating this indication that does not also reset the platform and
begin execution of the CRTM.
NOTE 2

In the reference implementation, this signal causes an internal flag ( s_initialized) to be CLEAR.
While this flag is CLEAR, the TPM will only accept the next expected command described above.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 17
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

11.2.2 Detailed Actions
1

#include "InternalRoutines.h"

This function is used to process a _TPM_Init() indication.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

void _TPM_Init(void)
{
// Initialize crypto engine
CryptInitUnits();
// Initialize NV environment
NvPowerOn();
// Start clock
TimePowerOn();
// Set initialization state
TPMInit();
// Set g_DRTMHandle as unassigned
g_DRTMHandle = TPM_RH_UNASSIGNED;
// No H-CRTM, yet.
g_DrtmPreStartup = FALSE;
return;
}

Page 18
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

11.3

Part 3: Commands

TPM2_Startup

11.3.1 General Description
TPM2_Startup() is always preceded by _TPM_Init, which is the physical indication that TPM initialization
is necessary because of a system-wide reset. TPM2_Startup() is only valid after _TPM_Init Additional
TPM2_Startup() commands are not allowed after it has completed successfully. If a TPM requires
TPM2_Startup() and another command is received, or if the TPM receives TPM2_Startup() when it is not
required, the TPM shall return TPM_RC_INITIALIZE.
NOTE 1

See 11.2.1 for other command options for a TPM supporting field upgrade mode.

NOTE 2

_TPM_Hash_Start, _TPM_Hash_Data, and _TPM_Hash_End are not commands and a platform specific specification may allow these indications between _TPM_Init and TPM2_Startup().

If in Failure mode the TPM shall accept TPM2_GetTestResult() and TPM2_GetCapability() even if
TPM2_Startup() is not completed successfully or processed at all.
A Shutdown/Startup sequence determines the way in which the TPM will operate in response to
TPM2_Startup(). The three sequences are:
1) TPM Reset – This is a Startup(CLEAR) preceded by either Shutdown(CLEAR) or no
TPM2_Shutdown(). On TPM Reset, all variables go back to their default initialization state.
NOTE 3

Only those values that are specified as having a default initialization state are changed by TPM
Reset. Persistent values that have no default initialization state are not changed by this
command. Values such as seeds have no default initialization state and only change due to
specific commands.

2) TPM Restart – This is a Startup(CLEAR) preceded by Shutdown(STATE). This preserves much of the
previous state of the TPM except that PCR and the controls associated with the Platform hierarchy
are all returned to their default initialization state;
3) TPM Resume – This is a Startup(STATE) preceded by Shutdown(STATE). This preserves the
previous state of the TPM including the static Root of Trust for Measurement (S-RTM) PCR and the
platform controls other than the phEnable and phEnableNV.
If a TPM receives Startup(STATE) and that was not preceded by Shutdown(STATE), the TPM shall return
TPM_RC_VALUE.
If, during TPM Restart or TPM Resume, the TPM fails to restore the state saved at the last
Shutdown(STATE), the TPM shall enter Failure Mode and return TPM_RC_FAILURE.
On any TPM2_Startup(),


phEnable and phEnableNV shall be SET;



all transient contexts (objects, sessions, and sequences) shall be flushed from TPM memory;



TPMS_TIME_INFO.time shall be reset to zero; and



use of lockoutAuth shall be enabled if lockoutRecovery is zero.

Additional actions are performed based on the Shutdown/Startup sequence.
On TPM Reset

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 19
October 31, 2013

Part 3: Commands

Trusted Platform Module Library



platformAuth and platformPolicy shall be set to the Empty Buffer,



tracking data for saved session contexts shall be set to its initial value,



the object context sequence number is reset to zero,



a new context encryption key shall be generated,



TPMS_CLOCK_INFO.restartCount shall be reset to zero,



TPMS_CLOCK_INFO.resetCount shall be incremented,



the PCR Update Counter shall be clear to zero,



shEnable and ehEnable shall be SET, and



PCR in all banks are reset to their default initial conditions as determined by the relevant platformspecific specification.
NOTE 4

PCR may be initialized any time between _TPM_Init and the end of TPM2_Startup(). PCR that
are preserved by TPM Resume will need to be restored during TPM2_Startup().

NOTE 5

See "Initializing PCR" in Part 1 of this specification for a description of the default initial
conditions for a PCR.

On TPM Restart


TPMS_CLOCK_INFO.restartCount shall be incremented,



shEnable and ehEnable shall be SET,



platformAuth and platformPolicy shall be set to the Empty Buffer, and



PCR in all banks are reset to their default initial conditions.



If a CRTM Event sequence is active, extend the PCR designated by the platform-specific
specification.

On TPM Resume


the H-CRTM startup method is the same for this TPM2_Startup() as for the previous TPM2_Startup();
(TPM_RC_LOCALITY)



TPMS_CLOCK_INFO.restartCount shall be incremented; and



PCR that are specified in a platform-specific specification to be preserved on TPM Resume are
restored to their saved state and other PCR are set to their initial value as determined by a platformspecific specification.

Other TPM state may change as required to meet the needs of the implementation.
If the startupType is TPM_SU_STATE and the TPM requires TPM_SU_CLEAR, then the TPM shall return
TPM_RC_VALUE.
NOTE 6

The TPM will require
Shutdown(CLEAR).

NOTE 7

If startupType is neither TPM_SU_STATE nor TPM_SU_CLEAR, then the unmarshaling code returns
TPM_RC_VALUE.

Page 20
October 31, 2013

TPM_SU_CLEAR

when

no

Published
Copyright © TCG 2006-2013

shutdown

was

performed

or

after

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

11.3.2 Command and Response
Table 5 — TPM2_Startup Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

TPM_ST_NO_SESSIONS

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Startup {NV}

TPM_SU

startupType

TPM_SU_CLEAR or TPM_SU_STATE

Table 6 — TPM2_Startup Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 21
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

11.3.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "Startup_fp.h"
Error Returns
TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

Meaning
start up type is not compatible with previous shutdown sequence

TPM_RC
TPM2_Startup(
Startup_In

*in

// IN: input parameter list

)
{
STARTUP_TYPE
TPM_RC
BOOL

startup;
result;
prevDrtmPreStartup;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Input Validation
// Read orderly shutdown states from previous power cycle
NvReadReserved(NV_ORDERLY, &g_prevOrderlyState);
// HACK to extract the DRTM startup type associated with the previous shutdown
prevDrtmPreStartup = (g_prevOrderlyState == (TPM_SU_STATE + 0x8000));
if(prevDrtmPreStartup)
g_prevOrderlyState = TPM_SU_STATE;
// if the previous power cycle was shut down with no StateSave command, or
// with StateSave command for CLEAR, this cycle can not startup up with
// STATE
if(
(
g_prevOrderlyState == SHUTDOWN_NONE
|| g_prevOrderlyState == TPM_SU_CLEAR
)
&& in->startupType == TPM_SU_STATE
)
return TPM_RC_VALUE + RC_Startup_startupType;
// Internal Date Update
// Translate the TPM2_ShutDown and TPM2_Startup sequence into the startup
// types.
if(in->startupType == TPM_SU_CLEAR && g_prevOrderlyState == TPM_SU_STATE)
{
startup = SU_RESTART;
// Read state reset data
NvReadReserved(NV_STATE_RESET, &gr);
}
else if(in->startupType == TPM_SU_STATE && g_prevOrderlyState == TPM_SU_STATE)
{
// For a resume, the H-CRTM startup method must be the same
if(g_DrtmPreStartup != prevDrtmPreStartup)
return TPM_RC_LOCALITY;

Page 22
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

Part 3: Commands

// Read state clear and state reset data
NvReadReserved(NV_STATE_CLEAR, &gc);
NvReadReserved(NV_STATE_RESET, &gr);
startup = SU_RESUME;
}
else
{
startup = SU_RESET;
}
// Read persistent data from NV
NvReadPersistent();
// Crypto Startup
CryptUtilStartup(startup);
// Start up subsystems
// Start counters and timers
TimeStartup(startup);
// Start dictionary attack subsystem
DAStartup(startup);
// Enable hierarchies
HierarchyStartup(startup);
// Restore/Initialize PCR
PCRStartup(startup);
// Restore/Initialize command audit information
CommandAuditStartup(startup);
// Object context variables
if(startup == SU_RESET)
{
// Reset object context ID to 0
gr.objectContextID = 0;
// Reset clearCount to 0
gr.clearCount= 0;
}
// Initialize object table
ObjectStartup();
// Initialize session table
SessionStartup(startup);
// Initialize index/evict data.
// in NV index
NvEntityStartup(startup);

This function clear read/write locks

// Initialize the orderly shut down flag for this cycle to SHUTDOWN_NONE.
gp.orderlyState = SHUTDOWN_NONE;
NvWriteReserved(NV_ORDERLY, &gp.orderlyState);
// Update TPM internal states if command succeeded.
// Record a TPM2_Startup command has been received.
TPMRegisterStartup();
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 23
October 31, 2013

Part 3: Commands

11.4

Trusted Platform Module Library

TPM2_Shutdown

11.4.1 General Description
This command is used to prepare the TPM for a power cycle. The shutdownType parameter indicates
how the subsequent TPM2_Startup() will be processed.
For a shutdownType of any type, the volatile portion of Clock is saved to NV memory and the orderly
shutdown indication is SET. NV with the TPMA_NV_ORDERY attribute will be updated.
For a shutdownType of TPM_SU_STATE, the following additional items are saved:


tracking information for saved session contexts;



the session context counter;



PCR that are designated as being preserved by TPM2_Shutdown(TPM_SU_STATE);



the PCR Update Counter;



flags associated with supporting the TPMA_NV_WRITESTCLEAR and TPMA_NV_READSTCLEAR
attributes; and



the command audit digest and count.

The following items shall not be saved and will not be in TPM memory after the next TPM2_Startup:


TPM-memory-resident session contexts;



TPM-memory-resident transient objects; or



TPM-memory-resident hash contexts created by TPM2_HashSequenceStart().

Some values may be either derived from other values or saved to NV memory.
This command saves TPM state but does not change the state other than the internal indication that the
context has been saved. The TPM shall continue to accept commands. If a subsequent command
changes TPM state saved by this command, then the effect of this command is nullified. The TPM MAY
nullify this command for any subsequent command rather than check whether the command changed
state saved by this command. If this command is nullified. and if no TPM2_Shutdown() occurs before the
next TPM2_Startup(), then the next TPM2_Startup() shall be TPM2_Startup(CLEAR).

Page 24
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

11.4.2 Command and Response
Table 7 — TPM2_Shutdown Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Shutdown {NV}

TPM_SU

shutdownType

TPM_SU_CLEAR or TPM_SU_STATE

Table 8 — TPM2_Shutdown Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 25
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

11.4.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "Shutdown_fp.h"
Error Returns
TPM_RC_TYPE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning
if PCR bank has been re-configured, a CLEAR StateSave() is
required

TPM_RC
TPM2_Shutdown(
Shutdown_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation
// If PCR bank has been reconfigured, a CLEAR state save is required
if(g_pcrReConfig && in->shutdownType == TPM_SU_STATE)
return TPM_RC_TYPE + RC_Shutdown_shutdownType;
// Internal Data Update
// PCR private date state save
PCRStateSave(in->shutdownType);
// Get DRBG state
CryptDrbgGetPutState(GET_STATE);
// Save all orderly data
NvWriteReserved(NV_ORDERLY_DATA, &go);
// Save RAM backed NV index data
NvStateSave();
if(in->shutdownType == TPM_SU_STATE)
{
// Save STATE_RESET and STATE_CLEAR data
NvWriteReserved(NV_STATE_CLEAR, &gc);
NvWriteReserved(NV_STATE_RESET, &gr);
}
else if(in->shutdownType == TPM_SU_CLEAR)
{
// Save STATE_RESET data
NvWriteReserved(NV_STATE_RESET, &gr);
}
// Write orderly shut down state
if(in->shutdownType == TPM_SU_CLEAR)
gp.orderlyState = TPM_SU_CLEAR;
else if(in->shutdownType == TPM_SU_STATE)
gp.orderlyState = TPM_SU_STATE;
else

Page 26
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
54
55
56
57
58
59

Part 3: Commands

pAssert(FALSE);
NvWriteReserved(NV_ORDERLY, &gp.orderlyState);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 27
October 31, 2013

Part 3: Commands

12
12.1

Trusted Platform Module Library

Testing
Introduction

Compliance to standards for hardware security modules may require that the TPM test its functions
before the results that depend on those functions may be returned. The TPM may perform operations
using testable functions before those functions have been tested as long as the TPM returns no value
that depends on the correctness of the testable function.
EXAMPLE

TPM2_PCR_Event() may be executed before the hash algorithms have been tested. However, until
the hash algorithms have been tested, the contents of a PCR may not be used in any command if
that command may result in a value being returned to the TPM user. This means tha t
TPM2_PCR_Read() or TPM2_PolicyPCR() could not complete until the hashes have been checked
but other TPM2_PCR_Event() commands may be executed even though the operation uses previous
PCR values.

If a command is received that requires return of a value that depends on untested functions, the TPM
shall test the required functions before completing the command.
Once the TPM has received TPM2_SelfTest() and before completion of all tests, the TPM is required to
return TPM_RC_TESTING for any command that uses a function that requires a test.
If a self-test fails at any time, the TPM will enter Failure mode. While in Failure mode, the TPM will return
TPM_RC_FAILURE for any command other than TPM2_GetTestResult() and TPM2_GetCapability(). The
TPM will remain in Failure mode until the next _TPM_Init.

Page 28
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

12.2

Part 3: Commands

TPM2_SelfTest

12.2.1 General Description
This command causes the TPM to perform a test of its capabilities. If the fullTest is YES, the TPM will test
all functions. If fullTest = NO, the TPM will only test those functions that have not previously been tested.
If any tests are required, the TPM shall either
a) return TPM_RC_TESTING and begin self-test of the required functions, or
NOTE 1

If fullTest is NO, and all functions have been tested, the TPM shall return TPM_RC_SUCCESS.

b) perform the tests and return the test result when complete.
If the TPM uses option a), the TPM shall return TPM_RC_TESTING for any command that requires use
of a testable function, even if the functions required for completion of the command have already been
tested.
NOTE 2

This command may cause the TPM to continue processing after it has returned the response. So
that software can be notified of the completion of the testing, the interface may include controls that
would allow the TPM to generate an interrupt when the “background” processing is complete. This
would be in addition to the interrupt may be available for signaling normal command completion. It is
not necessary that there be two interrupts, but the interface should provide a way to indicate the
nature of the interrupt (normal command or deferred command).

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 29
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

12.2.2 Command and Response
Table 9 — TPM2_SelfTest Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_SelfTest {NV}

TPMI_YES_NO

fullTest

YES if full test to be performed
NO if only test of untested functions required

Table 10 — TPM2_SelfTest Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 30
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

12.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "SelfTest_fp.h"
Error Returns
TPM_RC_TESTING

3
4
5
6
7
8
9
10
11
12

Meaning
self test in process

TPM_RC
TPM2_SelfTest(
SelfTest_In
)
{
// Command Output

*in

// IN: input parameter list

// Call self test function in crypt module
return CryptSelfTest(in->fullTest);
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 31
October 31, 2013

Part 3: Commands

12.3

Trusted Platform Module Library

TPM2_IncrementalSelfTest

12.3.1 General Description
This command causes the TPM to perform a test of the selected algorithms.
NOTE 1

The toTest list indicates the algorithms that software would like the TPM to test in anticipation of
future use. This allows tests to be done so that a future commands will not be delayed due to
testing.

If toTest contains an algorithm that has already been tested, it will not be tested again.
NOTE 2

The only way to force retesting of an algorithm is with TPM2_SelfTest( fullTest = YES).

The TPM will return in toDoList a list of algorithms that are yet to be tested. This list is not the list of
algorithms that are scheduled to be tested but the algorithms/functions that have not been tested. Only
the algorithms on the toTest list are scheduled to be tested by this command.
Making toTest an empty list allows the determination of the algorithms that remain untested without
triggering any testing.
If toTest is not an empty list, the TPM shall return TPM_RC_SUCCESS for this command and then return
TPM_RC_TESTING for any subsequent command (including TPM2_IncrementalSelfTest()) until the
requested testing is complete.
NOTE 3

If toDoList is empty, then no additional tests are required and TPM_RC_TESTING will not be
returned in subsequent commands and no additional delay will occur in a command due to testing.

NOTE 4

If none of the algorithms listed in toTest is in the toDoList, then no tests will be performed.

If all the parameters in this command are valid, the TPM returns TPM_RC_SUCCESS and the toDoList
(which may be empty).
NOTE 5

An implementation may perform all requested tests before returning TPM_RC_SUCCESS, or it may
return TPM_RC_SUCCESS for this command and then return TPM_RC_TESTING for all
subsequence commands (including TPM2_IncrementatSelfTest()) until the requested tests are
complete.

Page 32
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

12.3.2 Command and Response
Table 11 — TPM2_IncrementalSelfTest Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_IncrementalSelfTest {NV}

TPML_ALG

toTest

list of algorithms that should be tested

Table 12 — TPM2_IncrementalSelfTest Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPML_ALG

toDoList

Family “2.0”
Level 00 Revision 00.99

list of algorithms that need testing

Published
Copyright © TCG 2006-2013

Page 33
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

12.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13

#include "InternalRoutines.h"
#include "IncrementalSelfTest_fp.h"

TPM_RC
TPM2_IncrementalSelfTest(
IncrementalSelfTest_In
IncrementalSelfTest_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Command Output
// Call incremental self test function in crypt module
return CryptIncrementalSelfTest(&in->toTest, &out->toDoList);
}

Page 34
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

12.4

Part 3: Commands

TPM2_GetTestResult

12.4.1 General Description
This command returns manufacturer-specific information regarding the results of a self-test and an
indication of the test status.
If TPM2_SelfTest() has not been executed and a testable function has not been tested, testResult will be
TPM_RC_NEEDS_TEST. If TPM2_SelfTest() has been received and the tests are not complete,
testResult will be TPM_RC_TESTING. If testing of all functions is complete without functional failures,
testResult will be TPM_RC_SUCCESS. If any test failed, testResult will be TPM_RC_FAILURE. If the
TPM is in Failure mode because of an invalid startupType in TPM2_Startup(), testResult will be
TPM_RC_INITIALIZE.
This command will operate when the TPM is in Failure mode so that software can determine the test
status of the TPM and so that diagnostic information can be obtained for use in failure analysis. If the
TPM is in Failure mode, then tag is required to be TPM_ST_NO_SESSIONS or the TPM shall return
TPM_RC_FAILURE.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 35
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

12.4.2 Command and Response
Table 13 — TPM2_GetTestResult Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_GetTestResult

Table 14 — TPM2_GetTestResult Response
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_MAX_BUFFER

outData

TPM_RC

testResult

Page 36
October 31, 2013

test result data
contains manufacturer-specific information

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

12.4.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include "InternalRoutines.h"
#include "GetTestResult_fp.h"

TPM_RC
TPM2_GetTestResult(
GetTestResult_Out
)
{
// Command Output

*out

// OUT: output parameter list

// Call incremental self test function in crypt module
out->testResult = CryptGetTestResult(&out->outData);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 37
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Session Commands

13
13.1

TPM2_StartAuthSession

13.1.1 General Description
This command is used to start an authorization session using alternative methods of establishing the
session key (sessionKey). The session key is then used to derive values used for authorization and for
encrypting parameters.
This command allows injection of a secret into the TPM using either asymmetric or symmetric encryption.
The type of tpmKey determines how the value in encryptedSalt is encrypted. The decrypted secret value
is used to compute the sessionKey.
NOTE 1

If tpmKey Is TPM_RH_NULL, then encryptedSalt is required to be an Empty Buffer.

The label value of “SECRET” (see “Terms and Definitions” in Part 1 of this specification) is used in the
recovery of the secret value.
The TPM generates the sessionKey from the recovered secret value.
No authorization is required for tpmKey or bind.
NOTE 2

The justification for using tpmKey without providing authorization is that the result o f using the key is
not available to the caller, except indirectly through the sessionKey. This does not represent a point
of attack on the value of the key. If the caller attempts to use the session without knowing the
sessionKey value, it is an authorization failure that will trigger the dictionary attack logic.

The entity referenced with the bind parameter contributes an authorization value to the sessionKey
generation process.
If both tpmKey and bind are TPM_ALG_NULL, then sessionKey is set to the Empty Buffer. If tpmKey is
not TPM_ALG_NULL, then encryptedSalt is used in the computation of sessionKey. If bind is not
TPM_ALG_NULL, the authValue of bind is used in the sessionKey computation.
If symmetric specifies a block cipher, then TPM_ALG_CFB is the only allowed value for the mode field in
the symmetric parameter (TPM_RC_MODE).
This command starts an authorization session and returns the session handle along with an initial
nonceTPM in the response.
If the TPM does not have
TPM_RC_SESSION_HANDLES.

a

free

slot

for

an

authorization

session,

it

shall

return

If the TPM implements a “gap” scheme for assigning contextID values, then the TPM shall return
TPM_RC_CONTEXT_GAP if creating the session would prevent recycling of old saved contexts (See
“Context Management” in Part 1).
If tpmKey is not TPM_ALG_NULL then encryptedSalt shall be a TPM2B_ENCRYPTED_SECRET of the
proper type for tpmKey. The TPM shall return TPM_RC_VALUE if:
a) tpmKey references an RSA key and
1) encryptedSalt does not contain a value that is the size of the public modulus of tpmKey,
2) encryptedSalt has a value that is greater than the public modulus of tpmKey,
3) encryptedSalt is not a properly encode OAEP value, or
4) the decrypted salt value is larger than the size of the digest produced by the nameAlg of tpmKey;
or

Page 38
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

b) tpmKey references an ECC key and encryptedSalt
1) does not contain a TPMS_ECC_POINT or
2) is not a point on the curve of tpmKey;
NOTE 3

When ECC is used, the point multiply process produces a value (Z) that is used in a KDF to
produce the final secret value. The size of the secret value is an input parameter to the KDF
and the result will be set to be the size of the digest produced by the nameAlg of tpmKey.

c) tpmKey references a symmetric block cipher or a keyedHash object and encryptedSalt contains a
value that is larger than the size of the digest produced by the nameAlg of tpmKey.
For all session types, this command will cause initialization of the sessionKey and may establish binding
between the session and an object (the bind object). If sessionType is TPM_SE_POLICY or
TPM_SE_TRIAL, the additional session initialization is:


set policySession→policyDigest to a Zero Digest (the digest size for policySession→policyDigest is
the size of the digest produced by authHash);



authorization may be given at any locality;



authorization may apply to any command code;



authorization may apply to any command parameters or handles;



the authorization has no time limit;



an authValue is not needed when the authorization is used;



the session is not bound;



the session is not an audit session; and



the time at which the policy session was created is recorded.

Additionally, if sessionType is TPM_SE_TRIAL, the session will not be usable for authorization but can be
used to compute the authPolicy for an object.
NOTE 4

Although this command changes the session allocation information in the TPM, it does not invalidate
a saved context. That is, TPM2_Shutdown() is not required after this comm and in order to reestablish the orderly state of the TPM. This is because the created context will occupy an available
slot in the TPM and sessions in the TPM do not survive any TPM2_Startup(). However, if a created
session is context saved, the orderly state does change.

The TPM shall return TPM_RC_SIZE if nonceCaller is less than 16 octets or is greater than the size of
the digest produced by authHash.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 39
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

13.1.2 Command and Response
Table 15 — TPM2_StartAuthSession Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_StartAuthSession

TPMI_DH_OBJECT+

tpmKey

handle of a loaded decrypt key used to encrypt salt
may be TPM_RH_NULL
Auth Index: None

TPMI_DH_ENTITY+

bind

entity providing the authValue
may be TPM_RH_NULL
Auth Index: None

TPM2B_NONCE

nonceCaller

Description

initial nonceCaller, sets nonce size for the session
shall be at least 16 octets

TPM2B_ENCRYPTED_SECRET

encryptedSalt

value encrypted according to the type of tpmKey
If tpmKey is TPM_RH_NULL, this shall be the Empty
Buffer.

TPM_SE

sessionType

indicates the type of the session; simple HMAC or policy
(including a trial policy)

TPMT_SYM_DEF+

symmetric

the algorithm and key size for parameter encryption
may select TPM_ALG_NULL

TPMI_ALG_HASH

authHash

hash algorithm to use for the session
Shall be a hash algorithm supported by the TPM and
not TPM_ALG_NULL

Table 16 — TPM2_StartAuthSession Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMI_SH_AUTH_SESSION

sessionHandle

handle for the newly created session

TPM2B_NONCE

nonceTPM

the initial nonce from the TPM, used in the computation
of the sessionKey

Page 40
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

13.1.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "StartAuthSession_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

tpmKey does not reference a decrypt key

TPM_RC_CONTEXT_GAP

the difference between the most recently created active context and
the oldest active context is at the limits of the TPM

TPM_RC_HANDLE

input decrypt key handle only has public portion loaded

TPM_RC_MODE

symmetric specifies a block cipher but the mode is not
TPM_ALG_CFB.

TPM_RC_SESSION_HANDLES

no session handle is available

TPM_RC_SESSION_MEMORY

no more slots for loading a session

TPM_RC_SIZE

nonce less than 16 octets or greater than the size of the digest
produced by authHash

TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

Meaning

secret size does not match decrypt key type; or the recovered secret
is larget than the digest size of the nameAlg of tpmKey; or, for an
RSA decrypt key, if encryptedSecret is greater than the public
exponent of tpmKey.

TPM_RC
TPM2_StartAuthSession(
StartAuthSession_In
StartAuthSession_Out

*in,
*out

// IN: input parameter buffer
// OUT: output parameter buffer

TPM_RC
OBJECT
SESSION
TPM2B_DATA

result = TPM_RC_SUCCESS;
*tpmKey;
// TPM key for decrypt salt
*session;
// session internal data
salt;

)
{

// Input Validation
// Check input nonce size. IT should be at least 16 bytes but not larger
// than the digest size of session hash.
if(
in->nonceCaller.t.size < 16
|| in->nonceCaller.t.size > CryptGetHashDigestSize(in->authHash))
return TPM_RC_SIZE + RC_StartAuthSession_nonceCaller;
// If an decrypt key is passed in, check its validation
if(in->tpmKey != TPM_RH_NULL)
{
// secret size cannot be 0
if(in->encryptedSalt.t.size == 0)
return TPM_RC_VALUE + RC_StartAuthSession_encryptedSalt;
// Get pointer to loaded decrypt key
tpmKey = ObjectGet(in->tpmKey);
// Decrypting salt requires accessing the private portion of a key.
// Therefore, tmpKey can not be a key with only public portion loaded
if(tpmKey->attributes.publicOnly)
return TPM_RC_HANDLE + RC_StartAuthSession_tpmKey;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 41
October 31, 2013

Part 3: Commands
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

Trusted Platform Module Library

// HMAC session input handle check.
// tpmKey should be a decryption key
if(tpmKey->publicArea.objectAttributes.decrypt != SET)
return TPM_RC_ATTRIBUTES + RC_StartAuthSession_tpmKey;
// Secret Decryption. A TPM_RC_VALUE, TPM_RC_KEY or Unmarshal errors
// may be returned at this point
result = CryptSecretDecrypt(in->tpmKey, &in->nonceCaller, "SECRET",
&in->encryptedSalt, &salt);
if(result != TPM_RC_SUCCESS)
return TPM_RC_VALUE + RC_StartAuthSession_encryptedSalt;
}
else
{
// secret size must be 0
if(in->encryptedSalt.t.size != 0)
return TPM_RC_VALUE + RC_StartAuthSession_encryptedSalt;
salt.t.size = 0;
}
// If 'symmetric' is a symmetric block cipher (not TPM_ALG_NULL or TPM_ALG_XOR)
// then the mode must be CFB.
if(
in->symmetric.algorithm != TPM_ALG_NULL
&& in->symmetric.algorithm != TPM_ALG_XOR
&& in->symmetric.mode.sym != TPM_ALG_CFB)
return TPM_RC_MODE + RC_StartAuthSession_symmetric;
// Internal Data Update
// Create internal session structure. TPM_RC_CONTEXT_GAP, TPM_RC_NO_HANDLES
// or TPM_RC_SESSION_MEMORY errors may be returned returned at this point.
//
// The detailed actions for creating the session context are not shown here
// as the details are implementation dependent
// SessionCreate sets the output handle
result = SessionCreate(in->sessionType, in->authHash,
&in->nonceCaller, &in->symmetric,
in->bind, &salt, &out->sessionHandle);
if(result != TPM_RC_SUCCESS)
return result;
// Command Output
// Get session pointer
session = SessionGet(out->sessionHandle);
// Copy nonceTPM
out->nonceTPM = session->nonceTPM;
return TPM_RC_SUCCESS;
}

Page 42
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

13.2

Part 3: Commands

TPM2_PolicyRestart

13.2.1 General Description
This command allows a policy authorization session to be returned to its initial state. This command is
used after the TPM returns TPM_RC_PCR_CHANGED. That response code indicates that a policy will
fail because the PCR have changed after TPM2_PolicyPCR() was executed. Restarting the session
allows the authorizations to be replayed because the session restarts with the same nonceTPM. If the
PCR are valid for the policy, the policy may then succeed.
This command does not reset the policy ID or the policy start time.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 43
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

13.2.2 Command and Response
Table 17 — TPM2_PolicyRestart Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyRestart

TPMI_SH_POLICY

sessionHandle

the handle for the policy session

Table 18 — TPM2_PolicyRestart Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 44
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

13.2.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#include "InternalRoutines.h"
#include "PolicyRestart_fp.h"

TPM_RC
TPM2_PolicyRestart(
PolicyRestart_In

*in

// IN: input parameter list

SESSION
BOOL

*session;
wasTrialSession;

)
{

// Internal Data Update
session = SessionGet(in->sessionHandle);
wasTrialSession = session->attributes.isTrialPolicy == SET;
// Initialize policy session
SessionResetPolicyData(session);
session->attributes.isTrialPolicy = wasTrialSession;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 45
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

Object Commands

14
14.1

TPM2_Create

14.1.1 General Description
This command is used to create an object that can be loaded into a TPM using TPM2_Load(). If the
command completes successfully, the TPM will create the new object and return the object’s creation
data (creationData), its public area (outPublic), and its encrypted sensitive area (outPrivate). Preservation
of the returned data is the responsibility of the caller. The object will need to be loaded (TPM2_Load())
before it may be used.
TPM2B_PUBLIC template (inPublic) contains all of the fields necessary to define the properties of the
new object. The setting for these fields is defined in “Public Area Template” in Part 1 and
“TPMA_OBJECT” in Part 2.
The parentHandle parameter shall reference a loaded decryption key that has both the public and
sensitive area loaded.
When defining the object, the caller provides a template structure for the object in a TPM2B_PUBLIC
structure (inPublic), an initial value for the object’s authValue (inSensitive.authValue), and, if the object is
a symmetric object, an optional initial data value (inSensitive.data). The TPM shall validate the
consistency of inPublic.attributes according to the Creation rules in “TPMA_OBJECT” in Part 2.
The sensitive parameter may be encrypted using parameter encryption.
The methods in this clause are used by both TPM2_Create() and TPM2_CreatePrimary(). When a value
is indicated as being TPM-generated, the value is filled in by bits from the RNG if the command is
TPM2_Create() and with values from KDFa() if the command is TPM2_CreatePrimary(). The parameters
of each creation value are specified in Part 1.
The sensitiveDataOrigin attribute of inPublic shall be SET if inSensitive.data is an Empty Buffer and
CLEAR if inSensitive.data is not an Empty Buffer or the TPM shall return TPM_RC_ATTRIBUTES.
The TPM will create new data for the sensitive area and compute a TPMT_PUBLIC.unique from the
sensitive area based on the object type:
a) For a symmetric key:
1) If inSensitive.data is the Empty Buffer, a TPM-generated key value is placed in the new object’s
TPMT_SENSITIVE.sensitive.sym. The size of the key will be determined by
inPublic.publicArea.parameters.
2) If inSensitive.data is not the Empty Buffer, the TPM will validate that the size of inSensitive.data is
no larger than the key size indicated in the inPublic template (TPM_RC_SIZE) and copy the
inSensitive.data to TPMT_SENSITIVE.sensitive.sym of the new object.
3) A TPM-generated obfuscation value is placed in TPMT_SENSITIVE.sensitive.seedValue. The
size of the obfuscation value is the size of the digest produced by the nameAlg in inPublic. This
value prevents the public unique value from leaking information about the sensitive area.
4) The TPMT_PUBLIC.unique.sym.buffer value for the new object is then generated, as shown in
equation (1) below, by hashing the key and obfuscation values in the TPMT_SENSITIVE with the
nameAlg of the object.

unique ≔ HnameAlg(sensitive.seedValue.buffer || sensitive.any.buffer)

(1)

b) If the Object is an asymmetric key:
1) If sensitive.data is not the Empty Buffer, then the TPM shall return TPM_RC_VALUE.

Page 46
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

2) A TPM-generated private key value is created with the size determined by the parameters of
inPublic.publicArea.parameters.
3) If the key is a Storage Key, a TPM-generated TPMT_SENSITIVE.symKey value is created;
otherwise, TPMT_SENSITIVE.symKey.size is set to zero.
4) The public unique value is computed from the private key according to the methods of the key
type.
5) If the key is an ECC key and the scheme required by the curveID is not the same as scheme in
the public area of the template, then the TPM shall return TPM_RC_SCHEME.
6) If the key is an ECC key and the KDF required by the curveID is not the same as kdf in the pubic
area of the template, then the TPM shall return TPM_RC_KDF.
NOTE 1

There is currently no command in which the caller may specify the KDF to be used with an
ECC decryption key. Since there is no use for this capability, the reference implementation
requires that the kdf in the template be set to TPM_ALG_NULL or TPM_RC_KDF is
returned.

c) If the Object is a keyedHash object:
1) If inSensitive.data is an Empty Buffer, and neither sign nor decrypt is SET in inPublic.attributes,
the TPM shall return TPM_RC_ATTRIBUTES. This would be a data object with no data.
2) If inSensitive.data is not an Empty Buffer, the TPM will copy the inSensitive.data to
TPMT_SENSITIVE.sensitive of the new object.
NOTE 2

The size of inSensitive.data is limited to be no larger
TPMT_SENSITIVE.sensitive.bits.data by MAX_SYM_DATA.

than

the

largest

value

of

3) If inSensitive.data is an Empty Buffer, a TPM-generated key value that is the size of the digest
produced by the nameAlg in inPublic is placed in TPMT_SENSITIVE.sensitive.any.buffer.
4) A TPM-generated obfuscation value that is the size of the digest produced by the nameAlg of
inPublic is placed in TPMT_SENSITIVE.symKey.buffer.
5) The TPMT_PUBLIC.unique.sym.buffer value for the new object is then generated, as shown in
equation (1) above, by hashing the key and obfuscation values in the TPMT_SENSITIVE with the
nameAlg of the object.
For TPM2_Load(), the TPM will apply normal symmetric protections to the created TPMT_SENSITIVE to
create outPublic.
NOTE 3

The encryption key is derived from the symmetric seed in the sensitive area of the parent.

In addition to outPublic and outPrivate, the TPM will build a TPMS_CREATION_DATA structure for the
object. TPMS_CREATION_DATA.outsideInfo is set to outsideInfo. This structure is returned in
creationData. Additionally, the digest of this structure is returned in creationHash, and, finally, a
TPMT_TK_CREATION is created so that the association between the creation data and the object may
be validated by TPM2_CertifyCreation().
If the object being created is a Storage Key and inPublic.objectAttributes.fixedParent is SET, then the
algorithms of inPublic are required to match those of the parent. The algorithms that must match are
inPublic.type, inPublic.nameAlg, and inPublic.parameters. If inPublic.type does not match, the TPM shall
return TPM_RC_TYPE. If inPublic.nameAlg does not match, the TPM shall return TPM_RC_HASH. If
inPublic.parameters does not match, the TPM shall return TPM_RC_ASSYMETRIC. The TPM shall not
differentiate between mismatches of the components of inPublic.parameters.
EXAMPLE

If the inPublic.parameters.ecc.symmetric.algorithm does not match the parent, the TPM shall return
TPM_RC_ ASYMMETRIC rather than TPM_RC_SYMMETRIC.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 47
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.1.2 Command and Response
Table 19 — TPM2_Create Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Create

TPMI_DH_OBJECT

@parentHandle

handle of parent for new object
Auth Index: 1
Auth Role: USER

TPM2B_SENSITIVE_CREATE

inSensitive

the sensitive data

TPM2B_PUBLIC

inPublic

the public template

TPM2B_DATA

outsideInfo

data that will be included in the creation data for this
object to provide permanent, verifiable linkage between
this object and some object owner data

TPML_PCR_SELECTION

creationPCR

PCR that will be used in creation data

Table 20 — TPM2_Create Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PRIVATE

outPrivate

the private portion of the object

TPM2B_PUBLIC

outPublic

the public portion of the created object

TPM2B_CREATION_DATA

creationData

contains a TPMS_CREATION_DATA

TPM2B_DIGEST

creationHash

digest of creationData using nameAlg of outPublic

TPMT_TK_CREATION

creationTicket

ticket used by TPM2_CertifyCreation() to validate that
the creation data was produced by the TPM

Page 48
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.1.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Object_spt_fp.h"
#include "Create_fp.h"
Error Returns
TPM_RC_ASYMMETRIC

non-duplicable storage key and its parent have different public
params

TPM_RC_ATTRIBUTES

sensitiveDataOrigin is CLEAR when 'sensitive. data' is an Empty
Buffer, or is SET when 'sensitive. data' is not empty; fixedTPM,
fixedParent, or encryptedDuplication attributes are inconsistent
between themselves or with those of the parent object; inconsistent
restricted, decrypt and sign attributes; attempt to inject sensitive data
for an asymmetric key; attempt to create a symmetric cipher key that
is not a decryption key

TPM_RC_HASH

non-duplicable storage key and its parent have different name
algorithm

TPM_RC_KDF

incorrect KDF specified for decrypting keyed hash object

TPM_RC_KEY

invalid key size values in an asymmetric key public area

TPM_RC_KEY_SIZE

key size in public area for symmetric key differs from the size in the
sensitive creation area; may also be returned if the TPM does not
allow the key size to be used for a Storage Key

TPM_RC_RANGE

FOr() an RSA key, the exponent value is not supported.

TPM_RC_SCHEME

inconsistent attributes decrypt, sign, restricted and key's scheme ID;
or hash algorithm is inconsistent with the scheme ID for keyed hash
object

TPM_RC_SIZE

size of public auth policy or sensitive auth value does not match
digest size of the name algorithm sensitive data size for the keyed
hash object is larger than is allowed for the scheme

TPM_RC_SYMMETRIC

a storage key with no symmetric algorithm specified; or non-storage
key with symmetric algorithm different from TPM_ALG_NULL

TPM_RC_TYPE

unknown object type; non-duplicable storage key and its parent have
different types; parentHandle does not reference a restricted
decryption key in the storage hierarchy with both public and sensitive
portion loaded

TPM_RC_VALUE

exponent is not prime or could not find a prime using the provided
parameters for an RSA key; unsupported name algorithm for an ECC
key

TPM_RC_OBJECT_MEMORY

4
5
6
7
8
9
10
11
12
13

Meaning

there is no free slot for the object. This implementation does not
return this error.

TPM_RC
TPM2_Create(
Create_In
Create_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMT_SENSITIVE
TPM2B_NAME

Family “2.0”
Level 00 Revision 00.99

result = TPM_RC_SUCCESS;
sensitive;
name;

Published
Copyright © TCG 2006-2013

Page 49
October 31, 2013

Part 3: Commands
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

Trusted Platform Module Library

// Input Validation
OBJECT

*parentObject;

parentObject = ObjectGet(in->parentHandle);
// Does parent have the proper attributes?
if(!AreAttributesForParent(parentObject))
return TPM_RC_TYPE + RC_Create_parentHandle;
// The sensitiveDataOrigin attribute must be consistent with the setting of
// the size of the data object in inSensitive.
if(
(in->inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin == SET)
!= (in->inSensitive.t.sensitive.data.t.size == 0))
// Mismatch between the object attributes and the parameter.
return TPM_RC_ATTRIBUTES + RC_Create_inSensitive;
// Check attributes in input public area. TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES,
// TPM_RC_HASH, TPM_RC_KDF, TPM_RC_SCHEME, TPM_RC_SIZE, TPM_RC_SYMMETRIC,
// or TPM_RC_TYPE error may be returned at this point.
result = PublicAttributesValidation(FALSE, in->parentHandle,
&in->inPublic.t.publicArea);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_Create_inPublic);
// Validate the sensitive area values
if( MemoryRemoveTrailingZeros(&in->inSensitive.t.sensitive.userAuth)
> CryptGetHashDigestSize(in->inPublic.t.publicArea.nameAlg))
return TPM_RC_SIZE + RC_Create_inSensitive;
// Command Output
// Create object crypto data
result = CryptCreateObject(in->parentHandle, &in->inPublic.t.publicArea,
&in->inSensitive.t.sensitive, &sensitive);
if(result != TPM_RC_SUCCESS)
return result;
// Fill in creation data
FillInCreationData(in->parentHandle, in->inPublic.t.publicArea.nameAlg,
&in->creationPCR, &in->outsideInfo,
&out->creationData, &out->creationHash);
// Copy public area from input to output
out->outPublic.t.publicArea = in->inPublic.t.publicArea;
// Compute name from public area
ObjectComputeName(&(out->outPublic.t.publicArea), &name);
// Compute creation ticket
TicketComputeCreation(EntityGetHierarchy(in->parentHandle), &name,
&out->creationHash, &out->creationTicket);
// Prepare output private data from sensitive
SensitiveToPrivate(&sensitive, &name, in->parentHandle,
out->outPublic.t.publicArea.nameAlg,
&out->outPrivate);
return TPM_RC_SUCCESS;
}

Page 50
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

14.2

Part 3: Commands

TPM2_Load

14.2.1 General Description
This command is used to load objects into the TPM. This command is used when both a TPM2B_PUBLIC
and TPM2B_PRIVATE are to be loaded. If only a TPM2B_PUBLIC is to be loaded, the
TPM2_LoadExternal command is used.
NOTE 1

Loading an object is not the same as restoring a saved object context.

The object’s TPMA_OBJECT attributes will be checked according to the rules defined in
“TPMA_OBJECT” in Part 2 of this specification.
Objects loaded using this command will have a Name. The Name is the concatenation of nameAlg and
the digest of the public area using the nameAlg.
NOTE 2

nameAlg is a parameter in the public area of the inPublic structure.

If inPrivate.size is zero, the load will fail.
After inPrivate.buffer is decrypted using the symmetric key of the parent, the integrity value shall be
checked before the sensitive area is used, or unmarshaled.
NOTE 3

Checking the integrity before the data is used prevents attacks o n the sensitive area by fuzzing the
data and looking at the differences in the response codes.

The command returns a handle for the loaded object and the Name that the TPM computed for
inPublic.public (that is, the digest of the TPMT_PUBLIC structure in inPublic).
NOTE 4

The TPM-computed Name is provided as a convenience to the caller for those cases where the
caller does not implement the hash algorithms specified in the nameAlg of the object.

NOTE 5

The returned handle is associated with the object until the object is flushed (TPM2_FlushContext) or
until the next TPM2_Startup.

For all objects, the size of the key in the sensitive area shall be consistent with the key size indicated in
the public area or the TPM shall return TPM_RC_KEY_SIZE.
Before use, a loaded object shall be checked to validate that the public and sensitive portions are
properly linked, cryptographically. Use of an object includes use in any policy command. If the parts of the
object are not properly linked, the TPM shall return TPM_RC_BINDING.
EXAMPLE 1

For a symmetric object, the unique value in the public area shall be the digest of the sensitive key
and the obfuscation value.

EXAMPLE 2

For a two-prime RSA key, the remainder when dividing the public modulus by the private key shall
be zero and it shall be possible to form a private exponent from the two prime factors of the public
modulus.

EXAMPLE 3

For an ECC key, the public point shall be f(x) where x is the private key.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 51
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.2.2 Command and Response
Table 21 — TPM2_Load Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Load

TPMI_DH_OBJECT

@parentHandle

TPM handle of parent key; shall not be a reserved
handle
Auth Index: 1
Auth Role: USER

TPM2B_PRIVATE

inPrivate

the private portion of the object

TPM2B_PUBLIC

inPublic

the public portion of the object

Table 22 — TPM2_Load Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM_HANDLE

objectHandle

handle for the loaded object

TPM2B_NAME

name

Name of the loaded object

Page 52
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Load_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_ASYMMETRIC

storage key with different asymmetric type than parent

TPM_RC_ATTRIBUTES

inPulblic attributes are not allowed with selected parent

TPM_RC_BINDING

inPrivate and inPublic are not cryptographically bound

TPM_RC_HASH

incorrect hash selection for signing key

TPM_RC_INTEGRITY

HMAC on inPrivate was not valid

TPM_RC_KDF

KDF selection not allowed

TPM_RC_KEY

the size of the object's unique field is not consistent with the indicated
size in the object's parameters

TPM_RC_OBJECT_MEMORY

no available object slot

TPM_RC_SCHEME

the signing scheme is not valid for the key

TPM_RC_SENSITIVE

the inPrivate did not unmarshal correctly

TPM_RC_SIZE

inPrivate missing, or authPolicy size for inPublic or is not valid

TPM_RC_SYMMETRIC

symmetric algorithm not provided when required

TPM_RC_TYPE

parentHandle is not a storage key, or the object to load is a storage
key but its parameters do not match the parameters of the parent.

TPM_RC_VALUE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Meaning

decryption failure

TPM_RC
TPM2_Load(
Load_In *in,
Load_Out *out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMT_SENSITIVE
TPMI_RH_HIERARCHY
OBJECT
BOOL

result = TPM_RC_SUCCESS;
sensitive;
hierarchy;
*parentObject = NULL;
skipChecks = FALSE;

// Input Validation
if(in->inPrivate.t.size == 0)
return TPM_RC_SIZE + RC_Load_inPrivate;
parentObject = ObjectGet(in->parentHandle);
// Is the object that is being used as the parent actually a parent.
if(!AreAttributesForParent(parentObject))
return TPM_RC_TYPE + RC_Load_parentHandle;
// If the parent is fixedTPM, then the attributes of the object
// are either "correct by construction" or were validated
// when the object was imported. If they pass the integrity
// check, then the values are valid
if(parentObject->publicArea.objectAttributes.fixedTPM)
skipChecks = TRUE;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 53
October 31, 2013

Part 3: Commands
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

Trusted Platform Module Library

else
{
// If parent doesn't have fixedTPM SET, then this can't have
// fixedTPM SET.
if(in->inPublic.t.publicArea.objectAttributes.fixedTPM == SET)
return TPM_RC_ATTRIBUTES + RC_Load_inPublic;
// Perform self check on input public area. A TPM_RC_SIZE, TPM_RC_SCHEME,
// TPM_RC_VALUE, TPM_RC_SYMMETRIC, TPM_RC_TYPE, TPM_RC_HASH,
// TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES or TPM_RC_KDF error may be returned
// at this point
result = PublicAttributesValidation(TRUE, in->parentHandle,
&in->inPublic.t.publicArea);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_Load_inPublic);
}
// Compute the name of object
ObjectComputeName(&in->inPublic.t.publicArea, &out->name);
// Retrieve sensitive data. PrivateToSensitive() may return TPM_RC_INTEGRITY or
// TPM_RC_SENSITIVE
// errors may be returned at this point
result = PrivateToSensitive(&in->inPrivate, &out->name, in->parentHandle,
in->inPublic.t.publicArea.nameAlg,
&sensitive);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_Load_inPrivate);
// Internal Data Update
// Get hierarchy of parent
hierarchy = ObjectGetHierarchy(in->parentHandle);
// Create internal object. A lot of different errors may be returned by this
// loading operation as it will do several validations, including the public
// binding check
result = ObjectLoad(hierarchy, &in->inPublic.t.publicArea, &sensitive,
&out->name, in->parentHandle, skipChecks,
&out->objectHandle);
if(result != TPM_RC_SUCCESS)
return result;
return TPM_RC_SUCCESS;
}

Page 54
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

14.3

Part 3: Commands

TPM2_LoadExternal

14.3.1 General Description
This command is used to load an object that is not a Protected Object into the TPM. The command allows
loading of a public area or both a public and sensitive area.
NOTE 1

Typical use for loading a public area is to allow the TPM to validate an asymmetric signature.
Typical use for loading both a public and sensitive area is to allow the TPM to be used as a crypto
accelerator.

Load of a public external object area allows the object be associated with a hierarchy so that the correct
algorithms may be used when creating tickets. The hierarchy parameter provides this association. If the
public and sensitive portions of the object are loaded, hierarchy is required to be TPM_RH_NULL.
NOTE 2

If both the public and private portions of an object are loaded, the object is not allowed to appear to
be part of a hierarchy.

The object’s TPMA_OBJECT attributes will be checked according to the rules defined in
“TPMA_OBJECT” in Part 2. In particular, fixedTPM, fixedParent, and restricted shall be CLEAR if
inPrivate is not the Empty Buffer.
NOTE 3

The duplication status of a public key needs to be able to be the same as the full key which may be
resident on a different TPM. If both the public and private parts of the key are loaded, then it is not
possible for the key to be either fixedTPM or fixedParent, since, its private area would not be
available in the clear to load.

Objects loaded using this command will have a Name. The Name is the nameAlg of the object
concatenated with the digest of the public area using the nameAlg. The Qualified Name for the object will
be the same as its Name. The TPM will validate that the authPolicy is either the size of the digest
produced by nameAlg or the Empty Buffer.
NOTE 4

If nameAlg is TPM_ALG_NULL, then the Name is the Empty Buffer. When the authorization value for
an object with no Name is computed, no Name value is included in the HMAC. To ensure that these
unnamed entities are not substituted, they should have an authValue that is statistically unique.

NOTE 5

The digest size for TPM_ALG_NULL is zero.

If the nameAlg is TPM_ALG_NULL, the TPM shall not verify the cryptographic binding between the public
and sensitive areas, but the TPM will validate that the size of the key in the sensitive area is consistent
with the size indicated in the public area. If it is not, the TPM shall return TPM_RC_KEY_SIZE.
NOTE 6

For an ECC object, the TPM will verify that the public key is on the curve of the key before the public
area is used.

If nameAlg is not TPM_ALG_NULL, then the same consistency checks between inPublic and inPrivate
are made as for TPM2_Load().
NOTE 7

Consistency checks are necessary because an object with a Name needs to have the public and
sensitive portions cryptographically bound so that an attacker cannot mix pubic and sensitive areas.

The command returns a handle for the loaded object and the Name that the TPM computed for
inPublic.public (that is, the TPMT_PUBLIC structure in inPublic).
NOTE 8

The TPM-computed Name is provided as a convenience to the caller for those cases where the
caller does not implement the hash algorithm specified in the nameAlg of the object.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 55
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

The hierarchy parameter associates the external object with a hierarchy. External objects are flushed
when their associated hierarchy is disabled. If hierarchy is TPM_RH_NULL, the object is part of no
hierarchy, and there is no implicit flush.
If hierarchy is TPM_RH_NULL or nameAlg is TPM_ALG_NULL, a ticket produced using the object shall
be a NULL Ticket.
EXAMPLE

If a key is loaded with hierarchy set to TPM_RH_NULL, then TPM2_VerifySignature() will produce a
NULL Ticket of the required type.

External objects are Temporary Objects. The saved external object contexts shall be invalidated at the
next TPM Reset.

Page 56
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.3.2 Command and Response
Table 23 — TPM2_LoadExternal Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_LoadExternal

TPM2B_SENSITIVE

inPrivate

the sensitive portion of the object (optional)

TPM2B_PUBLIC+

inPublic

the public portion of the object

TPMI_RH_HIERARCHY+

hierarchy

hierarchy with which the object area is associated

Table 24 — TPM2_LoadExternal Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM_HANDLE

objectHandle

handle for the loaded object

TPM2B_NAME

name

name of the loaded object

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 57
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "LoadExternal_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

'fixedParent" and fixedTPM must be CLEAR on on an external key if
both public and sensitive portions are loaded

TPM_RC_BINDING

the inPublic and inPrivate structures are not cryptographically bound.

TPM_RC_HASH

incorrect hash selection for signing key

TPM_RC_HIERARCHY

hierarchy is turned off, or only NULL hierarchy is allowed when
loading public and private parts of an object

TPM_RC_KDF

incorrect KDF selection for decrypting keyedHash object

TPM_RC_KEY

the size of the object's unique field is not consistent with the indicated
size in the object's parameters

TPM_RC_OBJECT_MEMORY

if there is no free slot for an object

TPM_RC_SCHEME

the signing scheme is not valid for the key

TPM_RC_SIZE

authPolicy is not zero and is not the size of a digest produced by the
object's nameAlg TPM_RH_NULL hierarchy

TPM_RC_SYMMETRIC

symmetric algorithm not provided when required

TPM_RC_TYPE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Meaning

inPublic and inPrivate are not the same type

TPM_RC
TPM2_LoadExternal(
LoadExternal_In
LoadExternal_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
TPMT_SENSITIVE
BOOL

result;
*sensitive;
skipChecks;

)
{

// Input Validation
// If the target hierarchy is turned off, the object can not be loaded.
if(!HierarchyIsEnabled(in->hierarchy))
return TPM_RC_HIERARCHY + RC_LoadExternal_hierarchy;
// the size of authPolicy is either 0 or the digest size of nameAlg
if(in->inPublic.t.publicArea.authPolicy.t.size != 0
&& in->inPublic.t.publicArea.authPolicy.t.size !=
CryptGetHashDigestSize(in->inPublic.t.publicArea.nameAlg))
return TPM_RC_SIZE + RC_LoadExternal_inPublic;
// For loading an object with both public and sensitive
if(in->inPrivate.t.size != 0)
{
// An external object can only be loaded at TPM_RH_NULL hierarchy
if(in->hierarchy != TPM_RH_NULL)
return TPM_RC_HIERARCHY + RC_LoadExternal_hierarchy;
// An external object with a sensitive area must have fixedTPM == CLEAR
// fixedParent == CLEAR, and must have restrict CLEAR so that it does not

Page 58
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

Part 3: Commands

// appear to be a key that was created by this TPM.
if(
in->inPublic.t.publicArea.objectAttributes.fixedTPM != CLEAR
|| in->inPublic.t.publicArea.objectAttributes.fixedParent != CLEAR
|| in->inPublic.t.publicArea.objectAttributes.restricted != CLEAR
)
return TPM_RC_ATTRIBUTES + RC_LoadExternal_inPublic;
}
// Validate the scheme parameters
result = SchemeChecks(TRUE, TPM_RH_NULL, &in->inPublic.t.publicArea);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_LoadExternal_inPublic);
// Internal Data Update
// Need the name to compute the qualified name
ObjectComputeName(&in->inPublic.t.publicArea, &out->name);
skipChecks = (in->inPublic.t.publicArea.nameAlg == TPM_ALG_NULL);
// If a sensitive area was provided, load it
if(in->inPrivate.t.size != 0)
sensitive = &in->inPrivate.t.sensitiveArea;
else
sensitive = NULL;
// Create external object. A TPM_RC_BINDING, TPM_RC_KEY, TPM_RC_OBJECT_MEMORY
// or TPM_RC_TYPE error may be returned by ObjectLoad()
result = ObjectLoad(in->hierarchy, &in->inPublic.t.publicArea,
sensitive, &out->name, TPM_RH_NULL, skipChecks,
&out->objectHandle);
return result;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 59
October 31, 2013

Part 3: Commands

14.4

Trusted Platform Module Library

TPM2_ReadPublic

14.4.1 General Description
This command allows access to the public area of a loaded object.
Use of the objectHandle does not require authorization.
NOTE

Since the caller is not likely to know the public area of the object associated with objectHandle, it
would not be possible to include the Name associated with objectHandle in the cpHash computation.

If objectHandle references a sequence object, the TPM shall return TPM_RC_SEQUENCE.

Page 60
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.4.2 Command and Response
Table 25 — TPM2_ReadPublic Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ReadPublic

TPMI_DH_OBJECT

objectHandle

TPM handle of an object
Auth Index: None

Table 26 — TPM2_ReadPublic Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PUBLIC

outPublic

structure containing the public area of an object

TPM2B_NAME

name

name of the object

TPM2B_NAME

qualifiedName

the Qualified Name of the object

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 61
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.4.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "ReadPublic_fp.h"
Error Returns
TPM_RC_SEQUENCE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

Meaning
can not read the public area of a sequence object

TPM_RC
TPM2_ReadPublic(
ReadPublic_In
ReadPublic_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

OBJECT

*object;

)
{
// Input Validation
// Get loaded object pointer
object = ObjectGet(in->objectHandle);
// Can not read public area of a sequence object
if(ObjectIsSequence(object))
return TPM_RC_SEQUENCE;
// Command Output
// Compute size of public area in canonical form
out->outPublic.t.size = TPMT_PUBLIC_Marshal(&object->publicArea, NULL, NULL);
// Copy public area to output
out->outPublic.t.publicArea = object->publicArea;
// Copy name to output
out->name.t.size = ObjectGetName(in->objectHandle, &out->name.t.name);
// Copy qualified name to output
ObjectGetQualifiedName(in->objectHandle, &out->qualifiedName);
return TPM_RC_SUCCESS;
}

Page 62
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

14.5

Part 3: Commands

TPM2_ActivateCredential

14.5.1 General Description
This command enables the association of a credential with an object in a way that ensures that the TPM
has validated the parameters of the credentialed object.
If both the public and private portions of activateHandle and keyHandle are not loaded, then the TPM
shall return TPM_RC_AUTH_UNAVAILABLE.
If keyHandle is not a Storage Key, then the TPM shall return TPM_RC_TYPE.
Authorization for activateHandle requires the ADMIN role.
The key associated with keyHandle is used to recover a seed from secret, which is the encrypted seed.
The Name of the object associated with activateHandle and the recovered seed are used in a KDF to
recover the symmetric key. The recovered seed (but not the Name) is used is used in a KDF to recover
the HMAC key.
The HMAC is used to validate that the credentialBlob is associated with activateHandle and that the data
in credentialBlob has not been modified. The linkage to the object associated with activateHandle is
achieved by including the Name in the HMAC calculation.
If the integrity checks succeed, credentialBlob is decrypted and returned as certInfo.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 63
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.5.2 Command and Response
Table 27 — TPM2_ActivateCredential Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

Description

TPM_CC_ActivateCredential

TPMI_DH_OBJECT

@activateHandle

handle of the object associated with certificate in
credentialBlob
Auth Index: 1
Auth Role: ADMIN

TPMI_DH_OBJECT

@keyHandle

loaded key used to decrypt the TPMS_SENSITIVE in
credentialBlob
Auth Index: 2
Auth Role: USER

TPM2B_ID_OBJECT

credentialBlob

the credential

TPM2B_ENCRYPTED_SECRET

secret

keyHandle algorithm-dependent encrypted seed that
protects credentialBlob

Table 28 — TPM2_ActivateCredential Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DIGEST

certInfo

Page 64
October 31, 2013

the decrypted certificate information
the data should be no larger than the size of the digest
of the nameAlg associated with keyHandle

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.5.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ActivateCredential_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

keyHandle does not reference a decryption key

TPM_RC_ECC_POINT

secret is invalid (when keyHandle is an ECC key)

TPM_RC_INSUFFICIENT

secret is invalid (when keyHandle is an ECC key)

TPM_RC_INTEGRITY

credentialBlob fails integrity test

TPM_RC_NO_RESULT

secret is invalid (when keyHandle is an ECC key)

TPM_RC_SIZE

secret size is invalid or the credentialBlob does not unmarshal
correctly

TPM_RC_TYPE

keyHandle does not reference an asymmetric key.

TPM_RC_VALUE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

Meaning

secret is invalid (when keyHandle is an RSA key)

TPM_RC
TPM2_ActivateCredential(
ActivateCredential_In
ActivateCredential_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
OBJECT
OBJECT
// credential
TPM2B_DATA

result = TPM_RC_SUCCESS;
*object;
// decrypt key
*activateObject;// key associated with

)
{

data;

// credential data

// Input Validation
// Get decrypt key pointer
object = ObjectGet(in->keyHandle);
// Get certificated object pointer
activateObject = ObjectGet(in->activateHandle);
// input decrypt key must be an asymmetric, restricted decryption key
if(
!CryptIsAsymAlgorithm(object->publicArea.type)
|| object->publicArea.objectAttributes.decrypt == CLEAR
|| object->publicArea.objectAttributes.restricted == CLEAR)
return TPM_RC_TYPE + RC_ActivateCredential_keyHandle;
// Command output
// Decrypt input credential data via asymmetric decryption. A
// TPM_RC_VALUE, TPM_RC_KEY or unmarshal errors may be returned at this
// point
result = CryptSecretDecrypt(in->keyHandle, NULL,
"IDENTITY", &in->secret, &data);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_FAILURE;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 65
October 31, 2013

Part 3: Commands
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

Trusted Platform Module Library

return RcSafeAddToResult(result, RC_ActivateCredential_secret);
}
// Retrieve secret data. A TPM_RC_INTEGRITY error or unmarshal
// errors may be returned at this point
result = CredentialToSecret(&in->credentialBlob,
&activateObject->name,
(TPM2B_SEED *) &data,
in->keyHandle,
&out->certInfo);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result,RC_ActivateCredential_credentialBlob);
return TPM_RC_SUCCESS;
}

Page 66
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

14.6

Part 3: Commands

TPM2_MakeCredential

14.6.1 General Description
This command allows the TPM to perform the actions required of a Certificate Authority (CA) in creating a
TPM2B_ID_OBJECT containing an activation credential.
The TPM will produce a TPM_ID_OBJECT according to the methods in “Credential Protection” in Part 1.
The loaded public area referenced by handle is required to be the public area of a Storage key,
otherwise, the credential cannot be properly sealed.
This command does not use any TPM secrets nor does it require authorization. It is a convenience
function, using the TPM to perform cryptographic calculations that could be done externally.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 67
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.6.2 Command and Response
Table 29 — TPM2_MakeCredential Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_MakeCredential

TPMI_DH_OBJECT

handle

loaded public area, used to encrypt the sensitive area
containing the credential key
Auth Index: None

TPM2B_DIGEST

credential

the credential information

TPM2B_NAME

objectName

Name of the object to which the credential applies

Table 30 — TPM2_MakeCredential Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ID_OBJECT

credentialBlob

TPM2B_ENCRYPTED_SECRET

secret

Page 68
October 31, 2013

the credential
handle algorithm-dependent data that wraps the key
that encrypts credentialBlob

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.6.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "MakeCredential_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_KEY

handle referenced an ECC key that has a unique field that is not a
point on the curve of the key

TPM_RC_SIZE

credential is larger than the digest size of Name algorithm of handle

TPM_RC_TYPE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

Meaning

handle does not reference an asymmetric decryption key

TPM_RC
TPM2_MakeCredential(
MakeCredential_In
MakeCredential_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC

result = TPM_RC_SUCCESS;

OBJECT
TPM2B_DATA

*object;
data;

)
{

// Input Validation
// Get object pointer
object = ObjectGet(in->handle);
// input key must be an asymmetric, restricted decryption key
// NOTE: Needs to be restricted to have a symmetric value.
if(
!CryptIsAsymAlgorithm(object->publicArea.type)
|| object->publicArea.objectAttributes.decrypt == CLEAR
|| object->publicArea.objectAttributes.restricted == CLEAR
)
return TPM_RC_TYPE + RC_MakeCredential_handle;
// The credential information may not be larger than the digest size used for
// the Name of the key associated with handle.
if(in->credential.t.size > CryptGetHashDigestSize(object->publicArea.nameAlg))
return TPM_RC_SIZE + RC_MakeCredential_credential;
// Command Output
// Make encrypt key and its associated secret structure.
// Even though CrypeSecretEncrypt() may return
out->secret.t.size = sizeof(out->secret.t.secret);
result = CryptSecretEncrypt(in->handle, "IDENTITY", &data, &out->secret);
if(result != TPM_RC_SUCCESS)
return result;
// Prepare output credential data from secret
SecretToCredential(&in->credential, &in->objectName, (TPM2B_SEED *) &data,
in->handle, &out->credentialBlob);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 69
October 31, 2013

Part 3: Commands

14.7

Trusted Platform Module Library

TPM2_Unseal

14.7.1 General Description
This command returns the data in a loaded Sealed Data Object.
NOTE

A random, TPM-generated, Sealed Data Object may be created by the TPM with TPM2_Create() or
TPM2_CreatePrimary() using the template for a Sealed Data Object. A Sealed Data Object is more
likely to be created externally and imported (TPM2_Import()) so that the data is not created by the
TPM.

The returned value may be encrypted using authorization session encryption.
If either restricted, decrypt, or sign is SET in the attributes of itemHandle, then the TPM shall return
TPM_RC_ATTRIBUTES. If the type of itemHandle is not TPM_ALG_KEYEDHASH, then the TPM shall
return TPM_RC_TYPE.

Page 70
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.7.2 Command and Response
Table 31 — TPM2_Unseal Command
Type

Name

TPMI_ST_COMMAND_TAG

Tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Unseal

TPMI_DH_OBJECT

@itemHandle

handle of a loaded data object
Auth Index: 1
Auth Role: USER

Description

Table 32 — TPM2_Unseal Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_SENSITIVE_DATA

outData

Family “2.0”
Level 00 Revision 00.99

unsealed data
Size of outData is limited to be no more than 128 octets.

Published
Copyright © TCG 2006-2013

Page 71
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.7.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "Unseal_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

itemHandle has wrong attributes

TPM_RC_TYPE
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

Meaning

itemHandle is not a KEYEDHASH data object

TPM_RC
TPM2_Unseal(Unseal_In *in, Unseal_Out *out)
{
OBJECT

*object;

// Input Validation
// Get pointer to loaded object
object = ObjectGet(in->itemHandle);
// Input handle must be a data object
if(object->publicArea.type != TPM_ALG_KEYEDHASH)
return TPM_RC_TYPE + RC_Unseal_itemHandle;
if(
object->publicArea.objectAttributes.decrypt == SET
|| object->publicArea.objectAttributes.sign == SET
|| object->publicArea.objectAttributes.restricted == SET)
return TPM_RC_ATTRIBUTES + RC_Unseal_itemHandle;
// Command Output
// Copy data
MemoryCopy2B(&out->outData.b, &object->sensitive.sensitive.bits.b,
sizeof(out->outData.t.buffer));
return TPM_RC_SUCCESS;
}

Page 72
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

14.8

Part 3: Commands

TPM2_ObjectChangeAuth

14.8.1 General Description
This command is used to change the authorization secret for a TPM-resident object.
If successful, a new private area for the TPM-resident object associated with objectHandle is returned,
which includes the new authorization value.
This command does not change the authorization of the TPM-resident object on which it operates.
Therefore, the old authValue (of the TPM-resident object) is used when generating the response HMAC
key if required..
NOTE 1

The returned outPrivate will need to be loaded before the new authorization will apply.

NOTE 2

The TPM-resident object may be persistent and changing the authorization value of the persistent
object could prevent other users from accessing the object. This is why this command does not
change the TPM-resident object.

EXAMPLE

If a persistent key is being used as a Storage Root Key and the authorization of the key is a well known value so that the key can be used generally, then changing the authorization value in the
persistent key would deny access to other users.

This command may not be used to change the authorization value for an NV Index or a Primary Object.
NOTE 3

If an NV Index is to have a new authorization, it is done with TPM2_NV_ChangeAuth().

NOTE 4

If a Primary Object is to have a new authorization, it needs to be recreated (TPM2_CreatePrimary()).

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 73
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

14.8.2 Command and Response
Table 33 — TPM2_ObjectChangeAuth Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ObjectChangeAuth

TPMI_DH_OBJECT

@objectHandle

handle of the object
Auth Index: 1
Auth Role: ADMIN

TPMI_DH_OBJECT

parentHandle

handle of the parent
Auth Index: None

TPM2B_AUTH

newAuth

new authorization value

Table 34 — TPM2_ObjectChangeAuth Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PRIVATE

outPrivate

Page 74
October 31, 2013

private area containing the new authorization value

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

14.8.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ObjectChangeAuth_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_SIZE

newAuth is larger than the size of the digest of the Name algorithm of
objectHandle

TPM_RC_TYPE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Meaning

the key referenced by parentHandle is not the parent of the object
referenced by objectHandle; or objectHandle is a sequence object.

TPM_RC
TPM2_ObjectChangeAuth(
ObjectChangeAuth_In
ObjectChangeAuth_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPMT_SENSITIVE
OBJECT
TPM2B_NAME
TPM2B_NAME

sensitive;
*object;
objectQN, QNCompare;
parentQN;

// Input Validation
// Get object pointer
object = ObjectGet(in->objectHandle);
// Can not change auth on sequence object
if(ObjectIsSequence(object))
return TPM_RC_TYPE + RC_ObjectChangeAuth_objectHandle;
// Make sure that the auth value is consistent with the nameAlg
if( MemoryRemoveTrailingZeros(&in->newAuth)
> CryptGetHashDigestSize(object->publicArea.nameAlg))
return TPM_RC_SIZE + RC_ObjectChangeAuth_newAuth;
// Check parent for object
// parent handle must be the parent of object handle. In this
// implementation we verify this by checking the QN of object. Other
// implementation may choose different method to verify this attribute.
ObjectGetQualifiedName(in->parentHandle, &parentQN);
ObjectComputeQualifiedName(&parentQN, object->publicArea.nameAlg,
&object->name, &QNCompare);
ObjectGetQualifiedName(in->objectHandle, &objectQN);
if(!Memory2BEqual(&objectQN.b, &QNCompare.b))
return TPM_RC_TYPE + RC_ObjectChangeAuth_parentHandle;
// Command Output
// Copy internal sensitive area
sensitive = object->sensitive;
// Copy authValue
sensitive.authValue = in->newAuth;
// Prepare output private data from sensitive
SensitiveToPrivate(&sensitive, &object->name, in->parentHandle,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 75
October 31, 2013

Part 3: Commands
52
53
54
55
56

Trusted Platform Module Library
object->publicArea.nameAlg,
&out->outPrivate);

return TPM_RC_SUCCESS;
}

Page 76
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

15

Part 3: Commands

Duplication Commands

15.1

TPM2_Duplicate

15.1.1 General Description
This command duplicates a loaded object so that it may be used in a different hierarchy. The new parent
key for the duplicate may be on the same or different TPM or TPM_RH_NULL. Only the public area of
newParentHandle is required to be loaded.
NOTE 1

Since the new parent may only be extant on a different TPM, it is likely that the new parent’s
sensitive area could not be loaded in the TPM from which objectHandle is being duplicated.

If encryptedDuplication is SET in the object being duplicated, then the TPM shall return
TPM_RC_SYMMETRIC if symmetricAlg is TPM_RH_NULL or TPM_RC_HIERARCHY if
newParentHandle is TPM_RH_NULL.
The authorization for this command shall be with a policy session.
If fixedParent of objectHandle→attributes is SET, the TPM shall return TPM_RC_ATTRIBUTES. If
objectHandle→nameAlg is TPM_ALG_NULL, the TPM shall return TPM_RC_TYPE.
The policySession→commandCode parameter in the policy session is required to be TPM_CC_Duplicate
to indicate that authorization for duplication has been provided. This indicates that the policy that is being
used is a policy that is for duplication, and not a policy that would approve another use. That is, authority
to use an object does not grant authority to duplicate the object.
The policy is likely to include cpHash in order to restrict where duplication can occur.
If
TPM2_PolicyCpHash() has been executed as part of the policy, the policySession→cpHash is compared
to the cpHash of the command.
If TPM2_PolicyDuplicationSelect() has
policySession→nameHash is compared to

been

executed

as

part

of

the

policy,

HpolicyAlg(objectHandle→Name || newParentHandle→Name)

the
(2)

If the compared hashes are not the same, then the TPM shall return TPM_RC_POLICY_FAIL.
NOTE 2

It is allowed that policySesion→nameHash and policySession→cpHash share the same memory
space.

NOTE 3

A duplication policy is not required to have either TPM2_PolicyDuplicationSelect() or
TPM2_PolicyCpHash() as part of the policy. If neither is present, then the duplication policy may be
satisfied with a policy that only contains TPM2_PolicyCommaneCode( code = TPM_CC_Duplicate).

The TPM shall follow the process of encryption defined in the “Duplication” subclause of “Protected
Storage Hierarchy” in Part 1 of this specification.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 77
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

15.1.2 Command and Response
Table 35 — TPM2_Duplicate Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Duplicate

TPMI_DH_OBJECT

@objectHandle

loaded object to duplicate
Auth Index: 1
Auth Role: DUP

TPMI_DH_OBJECT+

newParentHandle

shall reference the public area of an asymmetric key
Auth Index: None

TPM2B_DATA

encryptionKeyIn

optional symmetric encryption key
The size for this key is set to zero when the TPM is to
generate the key. This parameter may be encrypted.

TPMT_SYM_DEF_OBJECT+

symmetricAlg

definition for the symmetric algorithm to be used for the
inner wrapper
may be TPM_ALG_NULL if no inner wrapper is applied

Table 36 — TPM2_Duplicate Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DATA

encryptionKeyOut

If the caller provided an encryption key or if
symmetricAlg was TPM_ALG_NULL, then this will be
the Empty Buffer; otherwise, it shall contain the TPMgenerated, symmetric encryption key for the inner
wrapper.

TPM2B_PRIVATE

duplicate

private area that may be encrypted by encryptionKeyIn;
and may be doubly encrypted

TPM2B_ENCRYPTED_SECRET

outSymSeed

Page 78
October 31, 2013

seed protected by the asymmetric algorithms of new
parent (NP)

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

15.1.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Duplicate_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

key to duplicate has fixedParent SET

TPM_RC_HIERARCHY

encryptedDuplication is SET and newParentHandle specifies Null
Hierarchy

TPM_RC_KEY

newParentHandle references invalid ECC key (public point not on the
curve)

TPM_RC_SIZE

input encryption key size does not match the size specified in
symmetric algorithm

TPM_RC_SYMMETRIC

encryptedDuplication is SET but no symmetric algorithm is provided

TPM_RC_TYPE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Meaning

newParentHandle is neither a storage key nor TPM_RH_NULL; or
the object has a NULL nameAlg

TPM_RC
TPM2_Duplicate(
Duplicate_In
Duplicate_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMT_SENSITIVE

result = TPM_RC_SUCCESS;
sensitive;

UINT16

innerKeySize = 0; // encrypt key size for inner wrap

OBJECT
TPM2B_DATA

*object;
data;

// Input Validation
// Get duplicate object pointer
object = ObjectGet(in->objectHandle);
// duplicate key must have fixParent bit CLEAR.
if(object->publicArea.objectAttributes.fixedParent == SET)
return TPM_RC_ATTRIBUTES + RC_Duplicate_objectHandle;
// Do not duplicate object with NULL nameAlg
if(object->publicArea.nameAlg == TPM_ALG_NULL)
return TPM_RC_TYPE + RC_Duplicate_objectHandle;
// new parent key must be a storage object or TPM_RH_NULL
if(in->newParentHandle != TPM_RH_NULL
&& !ObjectIsStorage(in->newParentHandle))
return TPM_RC_TYPE + RC_Duplicate_newParentHandle;
// If the duplicates object has encryptedDuplication SET, then there must be
// an inner wrapper and the new parent may not be TPM_RH_NULL
if(object->publicArea.objectAttributes.encryptedDuplication == SET)
{
if(in->symmetricAlg.algorithm == TPM_ALG_NULL)
return TPM_RC_SYMMETRIC + RC_Duplicate_symmetricAlg;
if(in->newParentHandle == TPM_RH_NULL)

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 79
October 31, 2013

Part 3: Commands
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

Trusted Platform Module Library

return TPM_RC_HIERARCHY + RC_Duplicate_newParentHandle;
}
if(in->symmetricAlg.algorithm == TPM_ALG_NULL)
{
// if algorithm is TPM_ALG_NULL, input key size must be 0
if(in->encryptionKeyIn.t.size != 0)
return TPM_RC_SIZE + RC_Duplicate_encryptionKeyIn;
}
else
{
// Get inner wrap key size
innerKeySize = in->symmetricAlg.keyBits.sym;
// If provided the input symmetric key must match the size of the algorithm
if(in->encryptionKeyIn.t.size != 0
&& in->encryptionKeyIn.t.size != (innerKeySize + 7) / 8)
return TPM_RC_SIZE + RC_Duplicate_encryptionKeyIn;
}
// Command Output
if(in->newParentHandle != TPM_RH_NULL)
{
// Make encrypt key and its associated secret structure. A TPM_RC_KEY
// error may be returned at this point
out->outSymSeed.t.size = sizeof(out->outSymSeed.t.secret);
result = CryptSecretEncrypt(in->newParentHandle,
"DUPLICATE", &data, &out->outSymSeed);
pAssert(result != TPM_RC_VALUE);
if(result != TPM_RC_SUCCESS)
return result;
}
else
{
// Do not apply outer wrapper
data.t.size = 0;
out->outSymSeed.t.size = 0;
}
// Copy sensitive area
sensitive = object->sensitive;
// Prepare output private data from sensitive
SensitiveToDuplicate(&sensitive, &object->name, in->newParentHandle,
object->publicArea.nameAlg, (TPM2B_SEED *) &data,
&in->symmetricAlg, &in->encryptionKeyIn,
&out->duplicate);
out->encryptionKeyOut = in->encryptionKeyIn;
return TPM_RC_SUCCESS;
}

Page 80
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

15.2

Part 3: Commands

TPM2_Rewrap

15.2.1 General Description
This command allows the TPM to serve in the role as a Duplication Authority. If proper authorization for
use of the oldParent is provided, then an HMAC key and a symmetric key are recovered from inSymSeed
and used to integrity check and decrypt inDuplicate. A new protection seed value is generated according
to the methods appropriate for newParent and the blob is re-encrypted and a new integrity value is
computed. The re-encrypted blob is returned in outDuplicate and the symmetric key returned in
outSymKey.
In the rewrap process, L is “DUPLICATE” (see “Terms and Definitions” in Part 1).
If inSymSeed has a zero length, then oldParent is required to be TPM_RH_NULL and no decryption of
inDuplicate takes place.
If newParent is TPM_RH_NULL, then no encryption is performed on outDuplicate. outSymSeed will have
a zero length. See Part 2 encryptedDuplication.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 81
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

15.2.2 Command and Response
Table 37 — TPM2_Rewrap Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Rewrap

TPMI_DH_OBJECT+

@oldParent

parent of object
Auth Index: 1
Auth Role: User

TPMI_DH_OBJECT+

newParent

new parent of the object
Auth Index: None

TPM2B_PRIVATE

inDuplicate

an object encrypted using symmetric key derived from
inSymSeed

TPM2B_NAME

name

the Name of the object being rewrapped

TPM2B_ENCRYPTED_SECRET

inSymSeed

Description

seed for symmetric key
needs oldParent private key to recover the seed and
generate the symmetric key

Table 38 — TPM2_Rewrap Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PRIVATE

outDuplicate

TPM2B_ENCRYPTED_SECRET

outSymSeed

Page 82
October 31, 2013

an object encrypted using symmetric key derived from
outSymSeed
seed for a symmetric key protected by newParent
asymmetric key

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

15.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Rewrap_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

newParent is not a decryption key

TPM_RC_HANDLE

oldParent does not consistent with inSymSeed

TPM_RC_INTEGRITY

the integrity check of inDuplicate failed

TPM_RC_KEY

for an ECC key, the public key is not on the curve of the curve ID

TPM_RC_KEY_SIZE

the decrypted input symmetric key size does not matches the
symmetric algorithm key size of oldParent

TPM_RC_TYPE

oldParent is not a storage key, or 'newParent is not a storage key

TPM_RC_VALUE

for an 'oldParent; RSA key, the data to be decrypted is greater than
the public exponent

Unmarshal errors

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

Meaning

errors during unmarshaling the input encrypted buffer to a ECC public
key, or unmarshal the private buffer to sensitive

TPM_RC
TPM2_Rewrap(
Rewrap_In
Rewrap_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
OBJECT
TPM2B_DATA
UINT16
TPM2B_PRIVATE

result = TPM_RC_SUCCESS;
*oldParent;
data;
// symmetric key
hashSize = 0;
privateBlob;
// A temporary private blob
// to transit between old
// and new wrappers

)
{

// Input Validation
if((in->inSymSeed.t.size == 0 && in->oldParent != TPM_RH_NULL)
|| (in->inSymSeed.t.size != 0 && in->oldParent == TPM_RH_NULL))
return TPM_RC_HANDLE + RC_Rewrap_oldParent;
if(in->oldParent != TPM_RH_NULL)
{
// Get old parent pointer
oldParent = ObjectGet(in->oldParent);
// old parent key must be a storage object
if(!ObjectIsStorage(in->oldParent))
return TPM_RC_TYPE + RC_Rewrap_oldParent;
// Decrypt input secret data via asymmetric decryption. A
// TPM_RC_VALUE, TPM_RC_KEY or unmarshal errors may be returned at this
// point
result = CryptSecretDecrypt(in->oldParent, NULL,
"DUPLICATE", &in->inSymSeed, &data);
if(result != TPM_RC_SUCCESS)
return TPM_RC_VALUE + RC_Rewrap_inSymSeed;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 83
October 31, 2013

Part 3: Commands
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

Trusted Platform Module Library

// Unwrap Outer
result = UnwrapOuter(in->oldParent, &in->name,
oldParent->publicArea.nameAlg, (TPM2B_SEED *) &data,
FALSE,
in->inDuplicate.t.size, in->inDuplicate.t.buffer);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_Rewrap_inDuplicate);
// Copy unwrapped data to temporary variable, remove the integrity field
hashSize = sizeof(UINT16) +
CryptGetHashDigestSize(oldParent->publicArea.nameAlg);
privateBlob.t.size = in->inDuplicate.t.size - hashSize;
MemoryCopy(privateBlob.t.buffer, in->inDuplicate.t.buffer + hashSize,
privateBlob.t.size, sizeof(privateBlob.t.buffer));
}
else
{
// No outer wrap from input blob.
privateBlob = in->inDuplicate;
}

Direct copy.

if(in->newParent != TPM_RH_NULL)
{
OBJECT
*newParent;
newParent = ObjectGet(in->newParent);
// New parent must be a storage object
if(!ObjectIsStorage(in->newParent))
return TPM_RC_TYPE + RC_Rewrap_newParent;
// Make new encrypt key and its associated secret structure. A
// TPM_RC_VALUE error may be returned at this point if RSA algorithm is
// enabled in TPM
out->outSymSeed.t.size = sizeof(out->outSymSeed.t.secret);
result = CryptSecretEncrypt(in->newParent,
"DUPLICATE", &data, &out->outSymSeed);
if(result != TPM_RC_SUCCESS) return result;
// Command output
// Copy temporary variable to output, reserve the space for integrity
hashSize = sizeof(UINT16) +
CryptGetHashDigestSize(newParent->publicArea.nameAlg);
out->outDuplicate.t.size = privateBlob.t.size;
MemoryCopy(out->outDuplicate.t.buffer + hashSize, privateBlob.t.buffer,
privateBlob.t.size, sizeof(out->outDuplicate.t.buffer));
// Produce outer wrapper for output
out->outDuplicate.t.size = ProduceOuterWrap(in->newParent, &in->name,
newParent->publicArea.nameAlg,
(TPM2B_SEED *) &data,
FALSE,
out->outDuplicate.t.size,
out->outDuplicate.t.buffer);
}
else // New parent is a null key so there is no seed
{
out->outSymSeed.t.size = 0;
// Copy privateBlob directly
out->outDuplicate = privateBlob;
}

Page 84
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
104
105

Part 3: Commands

return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 85
October 31, 2013

Part 3: Commands

15.3

Trusted Platform Module Library

TPM2_Import

15.3.1 General Description
This command allows an object to be encrypted using the symmetric encryption values of a Storage Key.
After encryption, the object may be loaded and used in the new hierarchy. The imported object (duplicate)
may be singly encrypted, multiply encrypted, or unencrypted.
If fixedTPM or fixedParent is SET in objectPublic, the TPM shall return TPM_RC_ATTRIBUTES.
If encryptedDuplication is SET in the object referenced by parentHandle, then encryptedDuplication shall
be set in objectPublic (TPM_RC_ATTRIBUTES). However, see Note 2.
Recovery of the sensitive data of the object occurs in the TPM in a three-step process in the following
order:


If present, the outer layer of symmetric encryption is removed. If inSymSeed has a non-zero size, the
asymmetric parameters and private key of parentHandle are used to recover the seed used in the
creation of the HMAC key and encryption keys used to protect the duplication blob. When recovering
the seed, L is “DUPLICATE”.
NOTE 1

If the encryptedDuplication attribute of the object
TPM_RC_ATTRIBUTES if inSymSeed is an empty buffer.

is

SET,

the

TPM

shall

return



If present, the inner layer of symmetric encryption is removed. If encryptionKey and symmetricAlg are
provided, they are used to decrypt duplication.



If present, the integrity value of the blob is checked. The presence of the integrity value is indicated
by a non-zero value for duplicate.data.integrity.size. The integrity of the private area is validated using
the Name of objectPublic in the integrity HMAC computation. If either the outer layer or inner layer of
encryption is performed, then the integrity value shall be present.

If the inner or outer wrapper is present, then a valid integrity value shall be present or the TPM shall
return TPM_RC_INTEGRITY.
NOTE 2

It is not necessary to validate that the sensitive area data is cryptographically bound to the public
area other than that the Name of the public area is included in the HMAC. However, if the binding is
not validated by this command, the binding must be checked each time the object is loaded. For an
object that is imported under a parent with fixedTPM SET, binding need only be checked at import. If
the parent has fixedTPM CLEAR, then the binding needs to be checked each time the object is
loaded, or before the TPM performs an operation for which the binding affects the outcome of the
operation (for example, TPM2_PolicySigned() or TPM2_Certify()).
Similarly, if the new parent's fixedTPM is set, the encryptedDuplication state need only be checked
at import.
If the new parent is not fixedTPM, then that object will be loadable on any TPM (including SW
versions) on which the new parent exists. This means that, each time an object is loaded under a
parent that is not fixedTPM, it is necessary to validate all of the properties of that object. If the
parent is fixedTPM, then the new private blob is integrity protected by the TPM that “owns” the
parent. So, it is sufficient to validate the object’s properties (attribute and public -private binding) on
import and not again.

Before duplicate.buffer is decrypted using the symmetric key of the parent, the integrity value shall be
checked before the sensitive area is used, or unmarshaled.
After integrity checks and decryption, the TPM will create a new symmetrically encrypted private area
using the encryption key of the parent.
NOTE 3

Checking the integrity before the data is used prevents attacks on the sensitive area by fuzzing the
data and looking at the differences in the response codes.

Page 86
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
NOTE 4

Part 3: Commands

The symmetric re-encryption is the normal integrity generation and symmetric encryption applied to
a child object.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 87
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

15.3.2 Command and Response
Table 39 — TPM2_Import Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Import

TPMI_DH_OBJECT

@parentHandle

the handle of the new parent for the object
Auth Index: 1
Auth Role: USER

TPM2B_DATA

encryptionKey

the optional symmetric encryption key used as the inner
wrapper for duplicate
If symmetricAlg is TPM_ALG_NULL, then this
parameter shall be the Empty Buffer.

TPM2B_PUBLIC

objectPublic

Description

the public area of the object to be imported
This is provided so that the integrity value for duplicate
and the object attributes can be checked.
NOTE

TPM2B_PRIVATE

duplicate

Even if the integrity value of the object is not
checked on input, the object Name is required to
create the integrity value for the imported object.

the symmetrically encrypted duplicate object that may
contain an inner symmetric wrapper

TPM2B_ENCRYPTED_SECRET
inSymSeed

symmetric key used to encrypt duplicate
inSymSeed is encrypted/encoded using the algorithms
of newParent.

TPMT_SYM_DEF_OBJECT+

symmetricAlg

definition for the symmetric algorithm to use for the inner
wrapper
If this algorithm is TPM_ALG_NULL, no inner wrapper is
present and encryptionKey shall be the Empty Buffer.

Table 40 — TPM2_Import Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PRIVATE

outPrivate

Page 88
October 31, 2013

the sensitive area encrypted with the symmetric key of
parentHandle

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

15.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Import_fp.h"
#include "Object_spt_fp.h"
Error Returns

Meaning

TPM_RC_ASYMMETRIC

non-duplicable storage key represented by objectPublic and its
parent referenced by parentHandle have different public params

TPM_RC_ATTRIBUTES

attributes FixedTPM and fixedParent of objectPublic are not both
CLEAR; or inSymSeed is nonempty and parentHandle does not
reference a decryption key; or objectPublic and parentHandle have
incompatible or inconsistent attributes

TPM_RC_BINDING

duplicate and objectPublic are not cryptographically bound

TPM_RC_ECC_POINT

inSymSeed is nonempty and ECC point in inSymSeed is not on the
curve

TPM_RC_HASH

non-duplicable storage key represented by objectPublic and its
parent referenced by parentHandle have different name algorithm

TPM_RC_INSUFFICIENT

inSymSeed is nonempty and failed to retrieve ECC point from the
secret; or unmarshaling sensitive value from duplicate failed the
result of inSymSeed decryption

TPM_RC_INTEGRITY

duplicate integrity is broken

TPM_RC_KDF

objectPublic representing decrypting keyed hash object specifies
invalid KDF

TPM_RC_KEY

inconsistent parameters of objectPublic; or inSymSeed is nonempty
and parentHandle does not reference a key of supported type; or
invalid key size in objectPublic representing an asymmetric key

TPM_RC_NO_RESULT

inSymSeed is nonempty and multiplication resulted in ECC point at
infinity

TPM_RC_OBJECT_MEMORY

no available object slot

TPM_RC_SCHEME

inconsistent attributes decrypt, sign, restricted and key's scheme ID
in objectPublic; or hash algorithm is inconsistent with the scheme ID
for keyed hash object

TPM_RC_SIZE

authPolicy size does not match digest size of the name algorithm in
objectPublic; or symmetricAlg and encryptionKey have different
sizes; or inSymSeed is nonempty and it is not of the same size as
RSA key referenced by parentHandle; or unmarshaling sensitive
value from duplicate failed

TPM_RC_SYMMETRIC

objectPublic is either a storage key with no symmetric algorithm or a
non-storage key with symmetric algorithm different from
TPM_ALG_NULL

TPM_RC_TYPE

unsupported type of objectPublic; or non-duplicable storage key
represented by objectPublic and its parent referenced by
parentHandle are of different types; or parentHandle is not a storage
key; or only the public portion of parentHandle is loaded; or
objectPublic and duplicate are of different types

TPM_RC_VALUE

nonempty inSymSeed and its numeric value is greater than the
modulus of the key referenced by parentHandle or inSymSeed is
larger than the size of the digest produced by the name algorithm of
the symmetric key referenced by parentHandle

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 89
October 31, 2013

Part 3: Commands
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

Trusted Platform Module Library

TPM_RC
TPM2_Import(
Import_In
Import_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
OBJECT
TPM2B_DATA
TPMT_SENSITIVE
TPM2B_NAME

result = TPM_RC_SUCCESS;
*parentObject;
data;
// symmetric key
sensitive;
name;

UINT16

innerKeySize = 0;

// encrypt key size for inner
// wrapper

// Input Validation
// FixedTPM and fixedParent must be CLEAR
if(
in->objectPublic.t.publicArea.objectAttributes.fixedTPM == SET
|| in->objectPublic.t.publicArea.objectAttributes.fixedParent == SET)
return TPM_RC_ATTRIBUTES + RC_Import_objectPublic;
// Get parent pointer
parentObject = ObjectGet(in->parentHandle);
if(!AreAttributesForParent(parentObject))
return TPM_RC_TYPE + RC_Import_parentHandle;
if(in->symmetricAlg.algorithm != TPM_ALG_NULL)
{
// Get inner wrap key size
innerKeySize = in->symmetricAlg.keyBits.sym;
// Input symmetric key must match the size of algorithm.
if(in->encryptionKey.t.size != (innerKeySize + 7) / 8)
return TPM_RC_SIZE + RC_Import_encryptionKey;
}
else
{
// If input symmetric algorithm is NULL, input symmetric key size must
// be 0 as well
if(in->encryptionKey.t.size != 0)
return TPM_RC_SIZE + RC_Import_encryptionKey;
}
// See if there is an outer wrapper
if(in->inSymSeed.t.size != 0)
{
// Decrypt input secret data via asymmetric decryption. TPM_RC_ATTRIBUTES,
// TPM_RC_ECC_POINT, TPM_RC_INSUFFICIENT, TPM_RC_KEY, TPM_RC_NO_RESULT,
// TPM_RC_SIZE, TPM_RC_VALUE may be returned at this point
result = CryptSecretDecrypt(in->parentHandle, NULL, "DUPLICATE",
&in->inSymSeed, &data);
pAssert(result != TPM_RC_BINDING);
if(result != TPM_RC_SUCCESS)
return TPM_RC_VALUE + RC_Import_inSymSeed;
}
else
{
data.t.size = 0;
}
// Compute name of object
ObjectComputeName(&(in->objectPublic.t.publicArea), &name);

Page 90
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

Part 3: Commands

// Retrieve sensitive from private.
// TPM_RC_INSUFFICIENT, TPM_RC_INTEGRITY, TPM_RC_SIZE may be returned here.
result = DuplicateToSensitive(&in->duplicate, &name, in->parentHandle,
in->objectPublic.t.publicArea.nameAlg,
(TPM2B_SEED *) &data, &in->symmetricAlg,
&in->encryptionKey, &sensitive);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_Import_duplicate);
// If the parent of this object has fixedTPM SET, then fully validate this
// object so that validation can be skipped when it is loaded
if(parentObject->publicArea.objectAttributes.fixedTPM == SET)
{
TPM_HANDLE
objectHandle;
// Perform self check on input public area. A TPM_RC_SIZE, TPM_RC_SCHEME,
// TPM_RC_VALUE, TPM_RC_SYMMETRIC, TPM_RC_TYPE, TPM_RC_HASH,
// TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES or TPM_RC_KDF error may be returned
// at this point
result = PublicAttributesValidation(TRUE, in->parentHandle,
&in->objectPublic.t.publicArea);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_Import_objectPublic);
// Create internal object. A TPM_RC_KEY_SIZE, TPM_RC_KEY or
// TPM_RC_OBJECT_MEMORY error may be returned at this point
result = ObjectLoad(TPM_RH_NULL, &in->objectPublic.t.publicArea,
&sensitive, NULL, in->parentHandle, FALSE,
&objectHandle);
if(result != TPM_RC_SUCCESS)
return result;
// Don't need the object, just needed the checks to be performed so
// flush the object
ObjectFlush(objectHandle);
}
// Command output
// Prepare output private data from sensitive
SensitiveToPrivate(&sensitive, &name, in->parentHandle,
in->objectPublic.t.publicArea.nameAlg,
&out->outPrivate);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 91
October 31, 2013

Part 3: Commands

16

Trusted Platform Module Library

Asymmetric Primitives

16.1

Introduction

The commands in this clause provide low-level primitives for access to the asymmetric algorithms
implemented in the TPM. Many of these commands are only allowed if the asymmetric key is an
unrestricted key.
16.2

TPM2_RSA_Encrypt

16.2.1 General Description
This command performs RSA encryption using the indicated padding scheme according to PKCS#1v2.1
(PKCS#1). If the scheme of keyHandle is TPM_ALG_NULL, then the caller may use inScheme to specify
the padding scheme. If scheme of keyHandle is not TPM_ALG_NULL, then inScheme shall either be
TPM_ALG_NULL or be the same as scheme (TPM_RC_SCHEME).
The key referenced by keyHandle is required to be an RSA key (TPM_RC_KEY) with the decrypt attribute
SET (TPM_RC_ATTRIBUTES).
NOTE

Requiring that the decrypt attribute be set allows the TPM to ensure that the scheme selection is
done with the presumption that the scheme of the key is a decryption scheme selection. It is
understood that this command will operate on a key with only the publi c part loaded so the caller
may modify any key in any desired way. So, this constraint only serves to simplify the TPM logic.

The three types of allowed padding are:
1) TPM_ALG_OAEP – Data is OAEP padded as described in 7.1 of PKCS#1 v2.1. The only
supported mask generation is MGF1.
2) TPM_ALG_RSAES – Data is padded as described in 7.2 of PKCS#1 v2.1.
3) TPM_ALG_NULL – Data is not padded by the TPM and the TPM will treat message as an
unsigned integer and perform a modular exponentiation of message using the public
exponent of the key referenced by keyHandle. This scheme is only used if both the scheme
in the key referenced by keyHandle is TPM_ALG_NULL, and the inScheme parameter of the
command is TPM_ALG_NULL. The input value cannot be larger than the public modulus of
the key referenced by keyHandle.
Table 41 — Padding Scheme Selection
keyHandle→scheme

OAEP
RSAES

TPM_ALG_RSAES

RSAES
error (TPM_RC_SCHEME)

TPM_ALG_NULL

OAEP

TPM_ALG_RSAES

error (TPM_RC_SCHEME)

TPM_AGL_OAEP

October 31, 2013

RSAES

TPM_ALG_OAEP

Page 92

TPM_ALG_RSAES

TPM_ALG_NULL

TPM_ALG_OAEP

none

TPM_ALG_OAEP

TPM_ALG_RSAES

padding scheme used

TPM_ALG_NULL
TPM_ALG_NULL

inScheme

OAEP

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

After padding, the data is RSAEP encrypted according to 5.1.1 of PKCS#1v2.1.
NOTE 1

It is required that decrypt be SET so that the commands that load a key can validate that the
scheme is consistent rather than have that deferred until the key is used.

NOTE 2

If it is desired to use a key that had restricted SET, the caller may CLEAR restricted and load the
public part of the key and use that unrestricted version of the key for encryption.

If inScheme is used, and the scheme requires a hash algorithm it may not be TPM_ALG_NULL.
NOTE 3

Because only the public portion of the key needs to be loaded for this command, the caller can
manipulate the attributes of the key in any way desired. As a result , the TPM shall not check the
consistency of the attributes. The only property checking is that the key is an RSA key and that the
padding scheme is supported.

The message parameter is limited in size by the padding scheme according to the following table:
Table 42 — Message Size Limits Based on Padding
Scheme

Maximum Message Length
(mLen) in Octets

TPM_ALG_OAEP

mLen  k – 2hLen – 2

TPM_ALG_RSAES

mLen  k – 11

TPM_ALG_NULL

mLen  k

Comments

The numeric value of the message must be
less than the numeric value of the public
modulus (n).

NOTES
1)
2)

k ≔ the number of byes in the public modulus
hLen ≔ the number of octets in the digest produced by the hash algorithm used in the process

The label parameter is optional. If provided (label.size != 0) then the TPM shall return TPM_RC_VALUE if
the last octet in label is not zero. If a zero octet occurs before label.buffer[label.size-1], the TPM shall
truncate the label at that point. The terminating octet of zero is included in the label used in the padding
scheme.
NOTE 4

If the scheme does not use a label, the TPM will still verify that label is properly formatted if label is
present.

The function returns padded and encrypted value outData.
The message parameter in the command may be encrypted using parameter encryption.
NOTE 5

Only the public area of keyHandle is required to be loaded. A public key may be loaded with any
desired scheme. If the scheme is to be changed, a different public area must be loaded.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 93
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

16.2.2 Command and Response
Table 43 — TPM2_RSA_Encrypt Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_RSA_Encrypt

TPMI_DH_OBJECT

keyHandle

reference to public portion of RSA key to use for
encryption
Auth Index: None
message to be encrypted

TPM2B_PUBLIC_KEY_RSA

message

TPMT_RSA_DECRYPT+

inScheme

TPM2B_DATA

label

NOTE 1

The data type was chosen because it limits the
overall size of the input to no greater than the size
of the largest RSA public key. This may be larger
than allowed for keyHandle.

the padding scheme to use if scheme associated with
keyHandle is TPM_ALG_NULL
optional label L to be associated with the message
Size of the buffer is zero if no label is present
NOTE 2

See description of label above.

Table 44 — TPM2_RSA_Encrypt Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PUBLIC_KEY_RSA

outData

Page 94
October 31, 2013

encrypted output

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

16.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "RSA_Encrypt_fp.h"
#ifdef TPM_ALG_RSA
Error Returns
TPM_RC_ATTRIBUTES

decrypt attribute is not SET in key referenced by keyHandle

TPM_RC_KEY

keyHandle does not reference an RSA key

TPM_RC_SCHEME

incorrect input scheme, or the chosen scheme is not a valid RSA
decrypt scheme

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

Meaning

the numeric value of message is greater than the public modulus of
the key referenced by keyHandle, or label is not a null-terminated
string

TPM_RC
TPM2_RSA_Encrypt(
RSA_Encrypt_In
RSA_Encrypt_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
OBJECT
TPMT_RSA_DECRYPT
char

result;
*rsaKey;
*scheme;
*label = NULL;

)
{

// Input Validation
rsaKey = ObjectGet(in->keyHandle);
// selected key must be an RSA key
if(rsaKey->publicArea.type != TPM_ALG_RSA)
return TPM_RC_KEY + RC_RSA_Encrypt_keyHandle;
// selected key must have the decryption attribute
if(rsaKey->publicArea.objectAttributes.decrypt != SET)
return TPM_RC_ATTRIBUTES + RC_RSA_Encrypt_keyHandle;
// Is there a label?
if(in->label.t.size > 0)
{
// label is present, so make sure that is it NULL-terminated
if(in->label.t.buffer[in->label.t.size - 1] != 0)
return TPM_RC_VALUE + RC_RSA_Encrypt_label;
label = (char *)in->label.t.buffer;
}
// Command Output
// Select a scheme for encryption
scheme = CryptSelectRSAScheme(in->keyHandle, &in->inScheme);
if(scheme == NULL)
return TPM_RC_SCHEME + RC_RSA_Encrypt_inScheme;
// Encryption. TPM_RC_VALUE, or TPM_RC_SCHEME errors my be returned buy
// CryptEncyptRSA. Note: It can also return TPM_RC_ATTRIBUTES if the key does
// not have the decrypt attribute but that was checked above.
out->outData.t.size = sizeof(out->outData.t.buffer);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 95
October 31, 2013

Part 3: Commands
47
48
49
50
51
52

Trusted Platform Module Library

result = CryptEncryptRSA(&out->outData.t.size, out->outData.t.buffer, rsaKey,
scheme, in->message.t.size, in->message.t.buffer,
label);
return result;
}
#endif

Page 96
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

16.3

Part 3: Commands

TPM2_RSA_Decrypt

16.3.1 General Description
This command performs RSA decryption using the indicated padding scheme according to PKCS#1v2.1
(PKCS#1).
The scheme selection for this command is the same as for TPM2_RSA_Encrypt() and is shown in Table
41.
The key referenced by keyHandle shall be an RSA key (TPM_RC_KEY) with restricted CLEAR and
decrypt SET (TPM_RC_ATTRIBUTES).
This command uses the private key of keyHandle for this operation and authorization is required.
The TPM will perform a modular exponentiation of ciphertext using the private exponent associated with
keyHandle (this is described in PKCS#1v2.1, clause 5.1.2). It will then validate the padding according to
the selected scheme. If the padding checks fail, TPM_RC_VALUE is returned. Otherwise, the data is
returned with the padding removed. If no padding is used, the returned value is an unsigned integer value
that is the result of the modular exponentiation of cipherText using the private exponent of keyHandle.
The returned value may include leading octets zeros so that it is the same size as the public modulus. For
the other padding schemes, the returned value will be smaller than the public modulus but will contain all
the data remaining after padding is removed and this may include leading zeros if the original encrypted
value contained leading zeros..
If a label is used in the padding process of the scheme, the label parameter is required to be present in
the decryption process and label is required to be the same in both cases. The TPM shall verify that the
label is consistent and if not it shall return TPM_RC_VALUE.
If label is present (label.size != 0), it
shall be a NULL-terminated string or the TPM will return TPM_RC_VALUE.
NOTE 1

The size of label includes the terminating null.

The message parameter in the response may be encrypted using parameter encryption.
If the decryption scheme does not require a hash function, the hash parameter of inScheme may be set
to any valid hash function or TPM_ALG_NULL.
If the description scheme does not require a label, the value in label is not used but the size of the label
field is checked for consistency with the indicated data type (TPM2B_DATA). That is, the field may not be
larger than allowed for a TPM2B_DATA.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 97
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

16.3.2 Command and Response
Table 45 — TPM2_RSA_Decrypt Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_RSA_Decrypt

TPMI_DH_OBJECT

@keyHandle

RSA key to use for decryption
Auth Index: 1
Auth Role: USER

TPM2B_PUBLIC_KEY_RSA

cipherText

NOTE

TPMT_RSA_DECRYPT+

inScheme

the padding scheme to use if scheme associated with
keyHandle is TPM_ALG_NULL

TPM2B_DATA

label

label whose association with the message is to be
verified

cipher text to be decrypted
An encrypted RSA data block is the size of the
public modulus.

Table 46 — TPM2_RSA_Decrypt Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_PUBLIC_KEY_RSA

message

Page 98
October 31, 2013

decrypted output

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

16.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "RSA_Decrypt_fp.h"
#ifdef TPM_ALG_RSA
Error Returns
TPM_RC_KEY

keyHandle does not reference an unrestricted decrypt key

TPM_RC_SCHEME

incorrect input scheme, or the chosen scheme is not a valid RSA
decrypt scheme

TPM_RC_SIZE

cipherText is not the size of the modulus of key referenced by
keyHandle

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

Meaning

label is not a null terminated string or the value of cipherText is
greater that the modulus of keyHandle

TPM_RC
TPM2_RSA_Decrypt(
RSA_Decrypt_In
RSA_Decrypt_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
OBJECT
TPMT_RSA_DECRYPT
char

result;
*rsaKey;
*scheme;
*label = NULL;

)
{

// Input Validation
rsaKey = ObjectGet(in->keyHandle);
// The selected key must be an RSA key
if(rsaKey->publicArea.type != TPM_ALG_RSA)
return TPM_RC_KEY + RC_RSA_Decrypt_keyHandle;
// The selected key must be an unrestricted decryption key
if(
rsaKey->publicArea.objectAttributes.restricted == SET
|| rsaKey->publicArea.objectAttributes.decrypt == CLEAR)
return TPM_RC_ATTRIBUTES + RC_RSA_Decrypt_keyHandle;
//
//
//
//

NOTE: Proper operation of this command requires that the sensitive area
of the key is loaded. This is assured because authorization is required
to use the sensitive area of the key. In order to check the authorization,
the sensitive area has to be loaded, even if authorization is with policy.

// If label is present, make sure that it is a NULL-terminated string
if(in->label.t.size > 0)
{
// Present, so make sure that it is NULL-terminated
if(in->label.t.buffer[in->label.t.size - 1] != 0)
return TPM_RC_VALUE + RC_RSA_Decrypt_label;
label = (char *)in->label.t.buffer;
}
// Command Output
// Select a scheme for decrypt.
scheme = CryptSelectRSAScheme(in->keyHandle, &in->inScheme);
if(scheme == NULL)

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 99
October 31, 2013

Part 3: Commands
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

Trusted Platform Module Library

return TPM_RC_SCHEME + RC_RSA_Decrypt_inScheme;
// Decryption. TPM_RC_VALUE, TPM_RC_SIZE, and TPM_RC_KEY error may be
// returned by CryptDecryptRSA.
// NOTE: CryptDecryptRSA can also return TPM_RC_ATTRIBUTES or TPM_RC_BINDING
// when the key is not a decryption key but that was checked above.
out->message.t.size = sizeof(out->message.t.buffer);
result = CryptDecryptRSA(&out->message.t.size, out->message.t.buffer, rsaKey,
scheme, in->cipherText.t.size,
in->cipherText.t.buffer,
label);
return result;
}
#endif

Page 100
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

16.4

Part 3: Commands

TPM2_ECDH_KeyGen

16.4.1 General Description
This command uses the TPM to generate an ephemeral key pair (de, Qe where Qe ≔ [de]G). It uses the private
ephemeral key and a loaded public key (QS) to compute the shared secret value (P ≔ [hde]QS).

keyHandle shall refer to a loaded ECC key. The sensitive portion of this key need not be loaded.
The curve parameters of the loaded ECC key are used to generate the ephemeral key.
NOTE 1

This function is the equivalent of encrypting data to another object’s public key. The seed value is
used in a KDF to generate a symmetric key and that key is used to encrypt the data. Once the data
is encrypted and the symmetric key discarded, only the ob ject with the private portion of the
keyHandle will be able to decrypt it.

The zPoint in the response may be encrypted using parameter encryption.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 101
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

16.4.2 Command and Response
Table 47 — TPM2_ECDH_KeyGen Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ECDH_KeyGen

TPMI_DH_OBJECT

keyHandle

Handle of a loaded ECC key public area.
Auth Index: None

Table 48 — TPM2_ECDH_KeyGen Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ECC_POINT

zPoint

results of P ≔ h[de]Qs

TPM2B_ECC_POINT

pubPoint

generated ephemeral public point (Qe)

Page 102
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

16.4.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ECDH_KeyGen_fp.h"
#ifdef TPM_ALG_ECC
Error Returns
TPM_RC_KEY

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning
keyHandle does not reference a non-restricted decryption ECC key

TPM_RC
TPM2_ECDH_KeyGen(
ECDH_KeyGen_In
ECDH_KeyGen_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
OBJECT
TPM2B_ECC_PARAMETER
TPM_RC

*eccKey;
sensitive;
result;

// Input Validation
eccKey = ObjectGet(in->keyHandle);
// Input key must be a non-restricted, decrypt ECC key
if(
eccKey->publicArea.type != TPM_ALG_ECC
|| eccKey->publicArea.objectAttributes.restricted == SET
|| eccKey->publicArea.objectAttributes.decrypt != SET
)
return TPM_RC_KEY + RC_ECDH_KeyGen_keyHandle;
// Command Output
do
{
// Create ephemeral ECC key
CryptNewEccKey(eccKey->publicArea.parameters.eccDetail.curveID,
&out->pubPoint.t.point, &sensitive);
out->pubPoint.t.size = TPMS_ECC_POINT_Marshal(&out->pubPoint.t.point,
NULL, NULL);
// Compute Z
result = CryptEccPointMultiply(&out->zPoint.t.point,
eccKey->publicArea.parameters.eccDetail.curveID,
&sensitive, &eccKey->publicArea.unique.ecc);
// The point in the key is not on the curve. Indicate that the key is bad.
if(result == TPM_RC_ECC_POINT)
return TPM_RC_KEY + RC_ECDH_KeyGen_keyHandle;
// The other possible error is TPM_RC_NO_RESULT indicating that the
// multiplication resulted in the point at infinity, so get a new
// random key and start over (hardly ever happens).
}
while(result != TPM_RC_SUCCESS);
// Marshal the values to generate the point.
out->zPoint.t.size = TPMS_ECC_POINT_Marshal(&out->zPoint.t.point, NULL, NULL);
return TPM_RC_SUCCESS;
}
#endif

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 103
October 31, 2013

Part 3: Commands

16.5

Trusted Platform Module Library

TPM2_ECDH_ZGen

16.5.1 General Description
This command uses the TPM to recover the Z value from a public point (QB) and a private key (ds). It will
perform the multiplication of the provided inPoint (QB) with the private key (ds) and return the coordinates
of the resultant point (Z = (xZ , yZ) ≔ [hds]QB; where h is the cofactor of the curve).
keyHandle shall refer to a loaded, ECC key (TPM_RC_KEY) with the restricted attribute CLEAR and the
decrypt attribute SET (TPM_RC_ATTRIBUTES).
The scheme of the key referenced by keyHandle is required to be either TPM_ALG_ECDH or
TPM_ALG_NULL (TPM_RC_SCHEME).
inPoint is required to be on the curve of the key referenced by keyHandle (TPM_RC_ECC_POINT).
The parameters of the key referenced by keyHandle are used to perform the point multiplication.

Page 104
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

16.5.2 Command and Response
Table 49 — TPM2_ECDH_ZGen Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ECDH_ZGen

TPMI_DH_OBJECT

@keyHandle

handle of a loaded ECC key
Auth Index: 1
Auth Role: USER

TPM2B_ECC_POINT

inPoint

a public key

Table 50 — TPM2_ECDH_ZGen Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ECC_POINT

outPoint

Family “2.0”
Level 00 Revision 00.99

X and Y coordinates of the product of the multiplication

Z = (xZ , yZ) ≔ [hdS]QB

Published
Copyright © TCG 2006-2013

Page 105
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

16.5.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ECDH_ZGen_fp.h"
#ifdef TPM_ALG_ECC
Error Returns
TPM_RC_KEY

keyHandle does not reference a non-restricted decryption ECC key

TPM_RC_ECC_POINT

invalid argument

TPM_RC_NO_RESULT
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

Meaning

multiplying inPoint resulted in a point at infinity

TPM_RC
TPM2_ECDH_ZGen(
ECDH_ZGen_In
ECDH_ZGen_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
OBJECT

result;
*eccKey;

// Input Validation
eccKey = ObjectGet(in->keyHandle);
// Input key must be a non-restricted, decrypt ECC key
if(
eccKey->publicArea.type != TPM_ALG_ECC
|| eccKey->publicArea.objectAttributes.restricted == SET
|| eccKey->publicArea.objectAttributes.decrypt != SET
)
return TPM_RC_KEY + RC_ECDH_ZGen_keyHandle;
// Command Output
// Compute Z. TPM_RC_ECC_POINT or TPM_RC_NO_RESULT may be returned here.
result = CryptEccPointMultiply(&out->outPoint.t.point,
eccKey->publicArea.parameters.eccDetail.curveID,
&eccKey->sensitive.sensitive.ecc,
&in->inPoint.t.point);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_ECDH_ZGen_inPoint);
out->outPoint.t.size = TPMS_ECC_POINT_Marshal(&out->outPoint.t.point,
NULL, NULL);
return TPM_RC_SUCCESS;
}
#endif

Page 106
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

16.6

Part 3: Commands

TPM2_ECC_Parameters

16.6.1 General Description
This command returns the parameters of an ECC curve identified by its TCG-assigned curveID.
16.6.2 Command and Response
Table 51 — TPM2_ECC_Parameters Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ECC_Parameters

TPMI_ECC_CURVE

curveID

parameter set selector

Table 52 — TPM2_ECC_Parameters Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMS_ALGORITHM_DETAIL_ECC

parameters

Family “2.0”
Level 00 Revision 00.99

ECC parameters for the selected curve

Published
Copyright © TCG 2006-2013

Page 107
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

16.6.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ECC_Parameters_fp.h"
#ifdef TPM_ALG_ECC
Error Returns
TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Meaning
Unsupported ECC curve ID

TPM_RC
TPM2_ECC_Parameters(
ECC_Parameters_In
ECC_Parameters_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Command Output
// Get ECC curve parameters
if(CryptEccGetParameters(in->curveID, &out->parameters))
return TPM_RC_SUCCESS;
else
return TPM_RC_VALUE + RC_ECC_Parameters_curveID;
}
#endif

16.7
16.7.1

TPM2_ZGen_2Phase
General Description

This command supports two-phase key exchange protocols. The command is used in combination with
TPM2_EC_Ephemeral(). TPM2_EC_Ephemeral() generates an ephemeral key and returns the public
point of that ephemeral key along with a numeric value that allows the TPM to regenerate the associated
private key.
The input parameters for this command are a static public key (inQsU), an ephemeral key (inQeU) from
party B, and the commitCounter returned by TPM2_EC_Ephemeral(). The TPM uses the counter value to
regenerate the ephemeral private key (de,V) and the associated public key (Qe,V). keyA provides the static
ephemeral elements ds,V and Qs,V. This provides the two pairs of ephemeral and static keys that are
required for the schemes supported by this command.
The TPM will compute Z or Zs and Ze according to the selected scheme. If the scheme is not a two-phase
key exchange scheme or if the scheme is not supported, the TPM will return TPM_RC_SCHEME.
It is an error if inQsB or inQeB are not on the curve of keyA (TPM_RC_ECC_POINT).
The two-phase key schemes that were assigned an algorithm ID as of the time of the publication of this
specification are TPM_ALG_ECDH, TPM_ALG_ECMQV, and TPM_ALG_SM2.
If this command is supported, then support for TPM_ALG_ECDH is required. Support for
TPM_ALG_ECMQV or TPM_ALG_SM2 is optional.
NOTE 1

If SM2 is supported and this command is supported, then the implementation is required to support
the key exchange protocol of SM2, part 3.

For TPM_ALG_ECDH outZ1 will be Zs and outZ2 will Ze as defined in 6.1.1.2 of SP800-56A.

Page 108
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
NOTE 2

Part 3: Commands

A non-restricted decryption key using ECDH may be used in either TPM2_ECDH_ZGen() or
TPM2_ZGen_2Phase as the computation done with the private part of keyA is the same in both
cases.

For TPM_ALG_ECMQV or TPM_ALG_SM2 outZ1 will be Z and outZ2 will be an Empty Point.
NOTE 3

An Empty Point has two Empty Buffers as coordinates meaning the minimum size value for outZ2
will be four.

If the input scheme is TPM_ALG_ECDH, then outZ1 will be Zs and outZ2 will be Ze. For schemes like
MQV (including SM2), outZ1 will contain the computed value and outZ2 will be an Empty Point.
NOTE

The Z values returned by the TPM are a full point and not ju st an x-coordinate.

If a computation of either Z produces the point at infinity, then the corresponding Z value will be an Empty
Point.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 109
October 31, 2013

Part 3: Commands

16.7.2

Trusted Platform Module Library

Command and Response
Table 53 — TPM2_ZGen_2Phase Command

Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

Description

TPM_CC_ZGen_2Phase
handle of an unrestricted decryption key ECC
The private key referenced by this handle is used as dS,A

TPMI_DH_OBJECT

@keyA

TPM2B_ECC_POINT

inQsB

other party’s static public key (Qs,B = (Xs,B, Ys,B))

TPM2B_ECC_POINT

inQeB

other party's ephemeral public key (Qe,B = (Xe,B, Ye,B))

TPMI_ECC_KEY_EXCHANGE

inScheme

the key exchange scheme

UINT16

counter

value returned by TPM2_EC_Ephemeral()

Auth Index: 1
Auth Role: USER

Table 54 — TPM2_ZGen_2Phase Response
Type

Name

TPM_ST

tag

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ECC_POINT

outZ1

X and Y coordinates of the computed value (scheme
dependent)

TPM2B_ECC_POINT

outZ2

X and Y coordinates of the second computed value
(scheme dependent)

Page 110
October 31, 2013

Description

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

16.7.3
1
2
3

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "ZGen_2Phase_fp.h"
#if defined TPM_ALG_ECC && (CC_ZGen_2Phase == YES)

This command uses the TPM to recover one or two Z values in a two phase key exchange protocol
Error Returns
TPM_RC_ATTRIBUTES

key referenced by keyA is restricted or not a decrypt key

TPM_RC_ECC_POINT

inQsB or inQeB is not on the curve of the key reference by keyA

TPM_RC_KEY

key referenced by keyA is not an ECC key

TPM_RC_SCHEME

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

Meaning

the scheme of the key referenced by keyA is not TPM_ALG_NULL,
TPM_ALG_ECDH, TPM_ALG_ECMQV or TPM_ALG_SM2

TPM_RC
TPM2_ZGen_2Phase(
ZGen_2Phase_In
ZGen_2Phase_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
OBJECT
TPM2B_ECC_PARAMETER
TPM_ALG_ID

result;
*eccKey;
r;
scheme;

// Input Validation
eccKey = ObjectGet(in->keyA);
// keyA must be an ECC key
if(eccKey->publicArea.type != TPM_ALG_ECC)
return TPM_RC_KEY + RC_ZGen_2Phase_keyA;
// keyA must not be restricted and must be a decrypt key
if(
eccKey->publicArea.objectAttributes.restricted == SET
|| eccKey->publicArea.objectAttributes.decrypt != SET
)
return TPM_RC_ATTRIBUTES + RC_ZGen_2Phase_keyA;
// if the scheme of keyA is TPM_ALG_NULL, then use the input scheme; otherwise
// the input scheme must be the same as the scheme of keyA
scheme = eccKey->publicArea.parameters.asymDetail.scheme.scheme;
if(scheme != TPM_ALG_NULL)
{
if(scheme != in->inScheme)
return TPM_RC_SCHEME + RC_ZGen_2Phase_inScheme;
}
else
scheme = in->inScheme;
if(scheme == TPM_ALG_NULL)
return TPM_RC_SCHEME + RC_ZGen_2Phase_inScheme;
// Input points must be on the curve of keyA
if(!CryptEccIsPointOnCurve(eccKey->publicArea.parameters.eccDetail.curveID,
&in->inQsB.t.point))
return TPM_RC_ECC_POINT + RC_ZGen_2Phase_inQsB;
if(!CryptEccIsPointOnCurve(eccKey->publicArea.parameters.eccDetail.curveID,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 111
October 31, 2013

Part 3: Commands
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

Trusted Platform Module Library

&in->inQeB.t.point))
return TPM_RC_ECC_POINT + RC_ZGen_2Phase_inQeB;
if(!CryptGenerateR(&r, &in->counter,
eccKey->publicArea.parameters.eccDetail.curveID,
NULL))
return TPM_RC_VALUE + RC_ZGen_2Phase_counter;
// Command Output
result = CryptEcc2PhaseKeyExchange(&out->outZ1.t.point,
&out->outZ2.t.point,
eccKey->publicArea.parameters.eccDetail.curveID,
scheme,
&eccKey->sensitive.sensitive.ecc,
&r,
&in->inQsB.t.point,
&in->inQeB.t.point);
if(result != TPM_RC_SUCCESS)
return result;
CryptEndCommit(in->counter);
return TPM_RC_SUCCESS;
}
#endif

Page 112
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

17
17.1

Part 3: Commands

Symmetric Primitives
Introduction

The commands in this clause provide low-level primitives for access to the symmetric algorithms
implemented in the TPM that operate on blocks of data. These include symmetric encryption and
decryption as well as hash and HMAC. All of the commands in this group are stateless. That is, they have
no persistent state that is retained in the TPM when the command is complete.
For hashing, HMAC, and Events that require large blocks of data with retained state, the sequence
commands are provided (see clause 1).
Some of the symmetric encryption/decryption modes use an IV. When an IV is used, it may be an
initiation value or a chained value from a previous stage. The chaining for each mode is:

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 113
October 31, 2013

Part 3: Commands

Trusted Platform Module Library
Table 55 — Symmetric Chaining Process

Mode

Chaining process

TPM_ALG_CTR

The TPM will increment the entire IV provided by the caller. The last encrypted value will be
returned to the caller as ivOut. This can be the input value to the next encrypted buffer.
ivIn is required to be the size of a block encrypted by the selected algorithm and key
combination. If the size of ivIn is not correct, the TPM shall return TPM_RC_SIZE.
EXAMPLE 1 AES requires that ivIn be 128 bits (16 octets).

ivOut will be the size of a cipher block and not the size of the last encrypted block.
NOTE

ivOut will be the value of the counter after the last block is encrypted.

EXAMPLE 2 If ivIn were 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0016 and four data blocks
were encrypted, ivOut will have a value of
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0416.

All the bits of the IV are incremented as if it were an unsigned integer.
TPM_ALG_OFB

In Output Feedback (OFB), the output of the pseudo-random function (the block encryption
algorithm) is XORed with a plaintext block to produce a ciphertext block. ivOut will be the
value that was XORed with the last plaintext block. That value can be used as the ivIn for a
next buffer.
ivIn is required to be the size of a block encrypted by the selected algorithm and key
combination. If the size of ivIn is not correct, the TPM shall return TPM_RC_SIZE.
ivOut will be the size of a cipher block and not the size of the last encrypted block.

TPM_ALG_CBC

For Cipher Block Chaining (CBC), a block of ciphertext is XORed with the next plaintext
block and that block is encrypted. The encrypted block is then input to the encryption of the
next block. The last ciphertext block then is used as an IV for the next buffer.
Even though the last ciphertext block is evident in the encrypted data, it is also returned in
ivOut.
ivIn is required to be the size of a block encrypted by the selected algorithm and key
combination. If the size of ivIn is not correct, the TPM shall return TPM_RC_SIZE.
inData is required to be an even multiple of the block encrypted by the selected algorithm
and key combination. If the size of inData is not correct, the TPM shall return
TPM_RC_SIZE.

TPM_ALG_CFB

Similar to CBC in that the last ciphertext block is an input to the encryption of the next block.
ivOut will be the value that was XORed with the last plaintext block. That value can be used
as the ivIn for a next buffer.
ivIn is required to be the size of a block encrypted by the selected algorithm and key
combination. If the size of ivIn is not correct, the TPM shall return TPM_RC_SIZE.
ivOut will be the size of a cipher block and not the size of the last encrypted block.

TPM_ALG_ECB

Electronic Codebook (ECB) has no chaining. Each block of plaintext is encrypted using the
key. ECB does not support chaining and ivIn shall be the Empty Buffer. ivOut will be the
Empty Buffer.
inData is required to be an even multiple of the block encrypted by the selected algorithm
and key combination. If the size of inData is not correct, the TPM shall return
TPM_RC_SIZE.

Page 114
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

17.2

Part 3: Commands

TPM2_EncryptDecrypt

17.2.1 General Description
This command performs symmetric encryption or decryption.
keyHandle shall reference a symmetric cipher object (TPM_RC_KEY).
For a restricted key, mode shall be either the same as the mode of the key, or TPM_ALG_NULL
(TPM_RC_VALUE). For an unrestricted key, mode may be the same or different from the mode of the key
but both shall not be TPM_ALG_NULL (TPM_RC_VALUE).
If the TPM allows this command to be canceled before completion, then the TPM may produce
incremental results and return TPM_RC_SUCCESS rather than TPM_RC_CANCEL. In such case,
outData may be less than inData.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 115
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

17.2.2 Command and Response
Table 56 — TPM2_EncryptDecrypt Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_EncryptDecrypt

TPMI_DH_OBJECT

@keyHandle

the symmetric key used for the operation
Auth Index: 1
Auth Role: USER

TPMI_YES_NO

decrypt

if YES, then the operation is decryption; if NO, the
operation is encryption

TPMI_ALG_SYM_MODE+

mode

symmetric mode
For a restricted key, this field shall match the default
mode of the key or be TPM_ALG_NULL.

TPM2B_IV

ivIn

an initial value as required by the algorithm

TPM2B_MAX_BUFFER

inData

the data to be encrypted/decrypted

Table 57 — TPM2_EncryptDecrypt Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_MAX_BUFFER

outData

encrypted output

TPM2B_IV

ivOut

chaining value to use for IV in next round

Page 116
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

17.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "EncryptDecrypt_fp.h"
Error Returns
TPM_RC_KEY

is not a symmetric decryption key with both public and private
portions loaded

TPM_RC_SIZE

IvIn size is incompatible with the block cipher mode; or inData size is
not an even multiple of the block size for CBC or ECB mode

TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

Meaning

keyHandle is restricted and the argument mode does not match the
key's mode

TPM_RC
TPM2_EncryptDecrypt(
EncryptDecrypt_In
EncryptDecrypt_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
OBJECT
UINT16
UINT16
BYTE
TPM_ALG_ID

*symKey;
keySize;
blockSize;
*key;
alg;

// Input Validation
symKey = ObjectGet(in->keyHandle);
// The input key should be a symmetric decrypt key.
if(
symKey->publicArea.type != TPM_ALG_SYMCIPHER
|| symKey->attributes.publicOnly == SET)
return TPM_RC_KEY + RC_EncryptDecrypt_keyHandle;
// If the input mode is TPM_ALG_NULL, use the key's mode
if( in->mode == TPM_ALG_NULL)
in->mode = symKey->publicArea.parameters.symDetail.sym.mode.sym;
// If the key is restricted, the input sym mode should match the key's sym
// mode
if(
symKey->publicArea.objectAttributes.restricted == SET
&& symKey->publicArea.parameters.symDetail.sym.mode.sym != in->mode)
return TPM_RC_VALUE + RC_EncryptDecrypt_mode;
// If the mode is null, then we have a problem.
// Note: Construction of a TPMT_SYM_DEF does not allow the 'mode' to be
// TPM_ALG_NULL so setting in->mode to the mode of the key should have
// produced a valid mode. However, this is suspenders.
if(in->mode == TPM_ALG_NULL)
return TPM_RC_VALUE + RC_EncryptDecrypt_mode;
// The input iv for ECB mode should be null. All the other modes should
// have an iv size same as encryption block size
keySize = symKey->publicArea.parameters.symDetail.sym.keyBits.sym;
alg = symKey->publicArea.parameters.symDetail.sym.algorithm;
blockSize = CryptGetSymmetricBlockSize(alg, keySize);
if(
(in->mode == TPM_ALG_ECB && in->ivIn.t.size != 0)
|| (in->mode != TPM_ALG_ECB && in->ivIn.t.size != blockSize))
return TPM_RC_SIZE + RC_EncryptDecrypt_ivIn;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 117
October 31, 2013

Part 3: Commands
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

Trusted Platform Module Library

// The input data size of CBC mode or ECB mode must be an even multiple of
// the symmetric algorithm's block size
if(
(in->mode == TPM_ALG_CBC || in->mode == TPM_ALG_ECB)
&& (in->inData.t.size % blockSize) != 0)
return TPM_RC_SIZE + RC_EncryptDecrypt_inData;
// Copy IV
// Note: This is copied here so that the calls to the encrypt/decrypt functions
// will modify the output buffer, not the input buffer
out->ivOut = in->ivIn;
// Command Output
key = symKey->sensitive.sensitive.sym.t.buffer;
// For symmetric encryption, the cipher data size is the same as plain data
// size.
out->outData.t.size = in->inData.t.size;
if(in->decrypt == YES)
{
// Decrypt data to output
CryptSymmetricDecrypt(out->outData.t.buffer,
alg,
keySize, in->mode, key,
&(out->ivOut),
in->inData.t.size,
in->inData.t.buffer);
}
else
{
// Encrypt data to output
CryptSymmetricEncrypt(out->outData.t.buffer,
alg,
keySize,
in->mode, key,
&(out->ivOut),
in->inData.t.size,
in->inData.t.buffer);
}
return TPM_RC_SUCCESS;
}

Page 118
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

17.3

Part 3: Commands

TPM2_Hash

17.3.1 General Description
This command performs a hash operation on a data buffer and returns the results.
NOTE

If the data buffer to be hashed is larger than will fit into the TPM’s input buffer, then the sequence
hash commands will need to be used.

If the results of the hash will be used in a signing operation that uses a restricted signing key, then the
ticket returned by this command can indicate that the hash is safe to sign.
If the digest is not safe to sign, then the TPM will return a TPMT_TK_HASHCHECK with the hierarchy set
to TPM_RH_NULL and digest set to the Empty Buffer.
If hierarchy is TPM_RH_NULL, then digest in the ticket will be the Empty Buffer.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 119
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

17.3.2 Command and Response
Table 58 — TPM2_Hash Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

Shall have at least one session

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Hash

TPM2B_MAX_BUFFER

data

data to be hashed

TPMI_ALG_HASH

hashAlg

algorithm for the hash being computed – shall not be
TPM_ALG_NULL

TPMI_RH_HIERARCHY+

hierarchy

hierarchy to use for the ticket (TPM_RH_NULL allowed)

Table 59 — TPM2_Hash Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DIGEST

outHash

results

TPMT_TK_HASHCHECK

validation

ticket indicating that the sequence of octets used to
compute outDigest did not start with
TPM_GENERATED_VALUE
will be a NULL ticket if the digest may not be signed
with a restricted key

Page 120
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

17.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#include "InternalRoutines.h"
#include "Hash_fp.h"

TPM_RC
TPM2_Hash(
Hash_In
Hash_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
HASH_STATE

hashState;

// Command Output
// Output hash
// Start hash stack
out->outHash.t.size = CryptStartHash(in->hashAlg, &hashState);
// Adding hash data
CryptUpdateDigest2B(&hashState, &in->data.b);
// Complete hash
CryptCompleteHash2B(&hashState, &out->outHash.b);
// Output ticket
out->validation.tag = TPM_ST_HASHCHECK;
out->validation.hierarchy = in->hierarchy;
if(in->hierarchy == TPM_RH_NULL)
{
// Ticket is not required
out->validation.hierarchy = TPM_RH_NULL;
out->validation.digest.t.size = 0;
}
else if( in->data.t.size >= sizeof(TPM_GENERATED)
&& !TicketIsSafe(&in->data.b))
{
// Ticket is not safe
out->validation.hierarchy = TPM_RH_NULL;
out->validation.digest.t.size = 0;
}
else
{
// Compute ticket
TicketComputeHashCheck(in->hierarchy, &out->outHash, &out->validation);
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 121
October 31, 2013

Part 3: Commands

17.4

Trusted Platform Module Library

TPM2_HMAC

17.4.1 General Description
This command performs an HMAC on the supplied data using the indicated hash algorithm.
The caller shall provide proper authorization for use of handle.
If the sign attribute is not SET in the key referenced by handle then the TPM shall return
TPM_RC_ATTRIBUTES. If the key type is not TPM_ALG_KEYEDHASH then the TPM shall return
TPM_RC_TYPE.
If handle references a restricted key, then the hash algorithm specified in the key's scheme is used as the
hash algorithm for the HMAC and the TPM shall return TPM_RC_VALUE if hashAlg is not
TPM_ALG_NULL or the same algorithm as selected in the key's scheme.
NOTE 1
A restricted key may only have one of sign or decrypt SET and the default scheme may not
be TPM_ALG_NULL. These restrictions are enforced by TPM2_Create() and TPM2_CreatePrimary(),
If the key referenced by handle is not restricted, then the TPM will use hashAlg for the HMAC. However, if
hashAlg is TPM_ALG_NULL the TPM will use the default scheme of the key.
If both hashAlg and the key default are TPM_ALG_NULL, the TPM shall return TPM_RC_VALUE.
NOTE

A key may only have both sign and decrypt SET if the key is unrestricted. When bo th sign and
decrypt are set, there is no default scheme for the key and the hash algorithm must be specified .

Page 122
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

17.4.2 Command and Response
Table 60 — TPM2_HMAC Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_HMAC

TPMI_DH_OBJECT

@handle

handle for the symmetric signing key providing the
HMAC key
Auth Index: 1
Auth Role: USER

TPM2B_MAX_BUFFER

buffer

HMAC data

TPMI_ALG_HASH+

hashAlg

algorithm to use for HMAC

Table 61 — TPM2_HMAC Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DIGEST

outHMAC

Family “2.0”
Level 00 Revision 00.99

the returned HMAC in a sized buffer

Published
Copyright © TCG 2006-2013

Page 123
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

17.4.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "HMAC_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

key referenced by handle is not a signing key

TPM_RC_TYPE

key referenced by handle is not an HMAC key

TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Meaning

hashAlg specified when the key is restricted is neither
TPM_ALG_NULL not equal to that of the key scheme; or both
hashAlg and the key scheme's algorithm are TPM_ALG_NULL

TPM_RC
TPM2_HMAC(
HMAC_In
HMAC_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

HMAC_STATE
OBJECT
TPMI_ALG_HASH
TPMT_PUBLIC

hmacState;
*hmacObject;
hashAlg;
*publicArea;

)
{

// Input Validation
// Get HMAC key object and public area pointers
hmacObject = ObjectGet(in->handle);
publicArea = &hmacObject->publicArea;
// Make sure that the key is an HMAC signing key
if(publicArea->type != TPM_ALG_KEYEDHASH)
return TPM_RC_TYPE + RC_HMAC_handle;
if(publicArea->objectAttributes.sign != SET)
return TPM_RC_ATTRIBUTES + RC_HMAC_handle;
// Assume that the key default scheme is used
hashAlg = publicArea->parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
// if the key is restricted, then need to use the scheme of the key and the
// input algorithm must be TPM_ALG_NULL or the same as the key scheme
if(publicArea->objectAttributes.restricted == SET)
{
if(in->hashAlg != TPM_ALG_NULL && in->hashAlg != hashAlg)
hashAlg = TPM_ALG_NULL;
}
else
{
// for a non-restricted key, use hashAlg if it is provided;
if(in->hashAlg != TPM_ALG_NULL)
hashAlg = in->hashAlg;
}
// if the hashAlg is TPM_ALG_NULL, then the input hashAlg is not compatible
// with the key scheme or type
if(hashAlg == TPM_ALG_NULL)
return TPM_RC_VALUE + RC_HMAC_hashAlg;
// Command Output

Page 124
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
50
51
52
53
54
55
56
57
58
59
60
61

Part 3: Commands

// Start HMAC stack
out->outHMAC.t.size = CryptStartHMAC2B(hashAlg,
&hmacObject->sensitive.sensitive.bits.b,
&hmacState);
// Adding HMAC data
CryptUpdateDigest2B(&hmacState, &in->buffer.b);
// Complete HMAC
CryptCompleteHMAC2B(&hmacState, &out->outHMAC.b);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 125
October 31, 2013

Part 3: Commands

18

Trusted Platform Module Library

Random Number Generator

18.1

TPM2_GetRandom

18.1.1 General Description
This command returns the next bytesRequested octets from the random number generator (RNG).
NOTE 1

It is recommended that a TPM implement the RNG in a manner that would allow it to return RNG
octets such that the frequency of bytesRequested being more than the number of octets available is
an infrequent occurrence.

If bytesRequested is more than will fit into a TPM2B_DIGEST on the TPM, no error is returned but the
TPM will only return as much data as will fit into a TPM2B_DIGEST buffer for the TPM.
NOTE 2

TPM2B_DIGEST is large enough to hold the largest digest that may be produced by the TPM.
Because that digest size changes according to the implemented hashes, the maximum amount of
data returned by this command is TPM implementation-dependent.

Page 126
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

18.1.2 Command and Response
Table 62 — TPM2_GetRandom Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_GetRandom

UINT16

bytesRequested

number of octets to return

Table 63 — TPM2_GetRandom Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DIGEST

randomBytes

Family “2.0”
Level 00 Revision 00.99

the random octets

Published
Copyright © TCG 2006-2013

Page 127
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

18.1.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include "InternalRoutines.h"
#include "GetRandom_fp.h"

TPM_RC
TPM2_GetRandom(
GetRandom_In
GetRandom_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Command Output
// if the requested bytes exceed the output buffer size, generates the
// maximum bytes that the output buffer allows
if(in->bytesRequested > sizeof(TPMU_HA))
out->randomBytes.t.size = sizeof(TPMU_HA);
else
out->randomBytes.t.size = in->bytesRequested;
CryptGenerateRandom(out->randomBytes.t.size, out->randomBytes.t.buffer);
return TPM_RC_SUCCESS;
}

Page 128
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

18.2

Part 3: Commands

TPM2_StirRandom

18.2.1 General Description
This command is used to add "additional information" to the RNG state.
NOTE

The "additional information" is as defined in SP800 -90A.

The inData parameter may not be larger than 128 octets.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 129
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

18.2.2 Command and Response
Table 64 — TPM2_StirRandom Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_StirRandom {NV}

TPM2B_SENSITIVE_DATA

inData

additional information

Table 65 — TPM2_StirRandom Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 130
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

18.2.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12

#include "InternalRoutines.h"
#include "StirRandom_fp.h"

TPM_RC
TPM2_StirRandom(
StirRandom_In
*in
// IN: input parameter list
)
{
// Internal Data Update
CryptStirRandom(in->inData.t.size, in->inData.t.buffer);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 131
October 31, 2013

Part 3: Commands

19

Trusted Platform Module Library

Hash/HMAC/Event Sequences

19.1

Introduction

All of the commands in this group are to support sequences for which an intermediate state must be
maintained. For a description of sequences, see “Hash, HMAC, and Event Sequences” in Part 1.
19.2

TPM2_HMAC_Start

19.2.1 General Description
This command starts an HMAC sequence. The TPM will create and initialize an HMAC sequence
structure, assign a handle to the sequence, and set the authValue of the sequence object to the value in
auth.
NOTE 1

The structure of a sequence object is vendor -dependent.

The caller shall provide proper authorization for use of handle.
If the sign attribute is not SET in the key referenced by handle then the TPM shall return
TPM_RC_ATTRIBUTES. If the key type is not TPM_ALG_KEYEDHASH then the TPM shall return
TPM_RC_TYPE.
If handle references a restricted key, then the hash algorithm specified in the key's scheme is used as the
hash algorithm for the HMAC and the TPM shall return TPM_RC_VALUE if hashAlg is not
TPM_ALG_NULL or the same algorithm in the key's scheme.
If the key referenced by handle is not restricted, then the TPM will use hashAlg for the HMAC; unless
hashAlg is TPM_ALG_NULL in which case it will use the default scheme of the key.
Table 66 — Hash Selection Matrix
handle→restricted
(key's restricted
attribute)

handle→scheme
(hash algorithm
from key's scheme)

CLEAR (unrestricted)

TPM_ALG_NULL

CLEAR

don’t care

CLEAR

valid hash

hash used

TPM_ALG_NULL

error

valid hash

(1)

hashAlg

hashAlg

(2)

(TPM_RC_SCHEME)

TPM_ALG_NULL

handle→scheme

same as handle→scheme

handle→scheme

(3)

SET

handle→scheme

(3)

SET (restricted)

TPM_ALG_NULL

(3)

not same as
handle→scheme

error

valid hash
valid hash

SET

valid hash

(4)

(TPM_RC_SCHEME)

NOTES:
1)

The scheme for the handle may only be TPM_ALG_NULL if both sign and decrypt are SET.

2)

A hash algorithm is required for the HMAC.

3)

A restricted key is required to have a scheme with a valid hash algorithm. A restricted key may not have both sign and
decrypt SET.

4)

The scheme for a restricted key cannot be overridden.

Page 132
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

19.2.2 Command and Response
Table 67 — TPM2_HMAC_Start Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_HMAC_Start

TPMI_DH_OBJECT

@handle

handle of an HMAC key
Auth Index: 1
Auth Role: USER

TPM2B_AUTH

auth

authorization value for subsequent use of the sequence

TPMI_ALG_HASH+

hashAlg

the hash algorithm to use for the HMAC

Table 68 — TPM2_HMAC_Start Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMI_DH_OBJECT

sequenceHandle

Family “2.0”
Level 00 Revision 00.99

a handle to reference the sequence

Published
Copyright © TCG 2006-2013

Page 133
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

19.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "HMAC_Start_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

key referenced by handle is not a signing key

TPM_RC_OBJECT_MEMORY

no space to create an internal object

TPM_RC_TYPE

key referenced by handle is not an HMAC key

TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

Meaning

hashAlg specified when the key is restricted is neither
TPM_ALG_NULL not equal to that of the key scheme; or both
hashAlg and the key scheme's algorithm are TPM_ALG_NULL

TPM_RC
TPM2_HMAC_Start(
HMAC_Start_In
HMAC_Start_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
OBJECT
TPMT_PUBLIC
TPM_ALG_ID

*hmacObject;
*publicArea;
hashAlg;

// Input Validation
// Get HMAC key object and public area pointers
hmacObject = ObjectGet(in->handle);
publicArea = &hmacObject->publicArea;
// Make sure that the key is an HMAC signing key
if(publicArea->type != TPM_ALG_KEYEDHASH)
return TPM_RC_TYPE + RC_HMAC_Start_handle;
if(publicArea->objectAttributes.sign != SET)
return TPM_RC_ATTRIBUTES + RC_HMAC_Start_handle;
// Assume that the key default scheme is used
hashAlg = publicArea->parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
// if the key is restricted, then need to use the scheme of the key and the
// input algorithm must be TPM_ALG_NULL or the same as the key scheme
if(publicArea->objectAttributes.restricted == SET)
{
if(in->hashAlg != TPM_ALG_NULL && in->hashAlg != hashAlg)
hashAlg = TPM_ALG_NULL;
}
else
{
// for a non-restricted key, use hashAlg if it is provided;
if(in->hashAlg != TPM_ALG_NULL)
hashAlg = in->hashAlg;
}
// if the algorithm selection ended up with TPM_ALG_NULL, then either the
// schemes are not compatible or no hash was provided and both conditions
// are errors.
if(hashAlg == TPM_ALG_NULL)
return TPM_RC_VALUE + RC_HMAC_Start_hashAlg;
// Internal Data Update

Page 134
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
48
49
50
51
52
53
54
55

Part 3: Commands

// Create a HMAC sequence object. A TPM_RC_OBJECT_MEMORY error may be
// returned at this point
return ObjectCreateHMACSequence(hashAlg,
in->handle,
&in->auth,
&out->sequenceHandle);
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 135
October 31, 2013

Part 3: Commands

19.3

Trusted Platform Module Library

TPM2_HashSequenceStart

19.3.1 General Description
This command starts a hash or an Event sequence. If hashAlg is an implemented hash, then a hash
sequence is started. If hashAlg is TPM_ALG_NULL, then an Event sequence is started. If hashAlg is
neither an implemented algorithm nor TPM_ALG_NULL, then the TPM shall return TPM_RC_HASH.
Depending on hashAlg, the TPM will create and initialize a hash sequence structure or an Event
sequence structure. Additionally, it will assign a handle to the sequence and set the authValue of the
sequence to the value in auth. A sequence structure for an Event (hashAlg = TPM_ALG_NULL) contains
a hash context for each of the PCR banks implemented on the TPM.

Page 136
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

19.3.2 Command and Response
Table 69 — TPM2_HashSequenceStart Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_HashSequenceStart

TPM2B_AUTH

auth

authorization value for subsequent use of the sequence

TPMI_ALG_HASH+

hashAlg

the hash algorithm to use for the hash sequence
An Event sequence starts if this is TPM_ALG_NULL.

Table 70 — TPM2_HashSequenceStart Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMI_DH_OBJECT

sequenceHandle

Family “2.0”
Level 00 Revision 00.99

a handle to reference the sequence

Published
Copyright © TCG 2006-2013

Page 137
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

19.3.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "HashSequenceStart_fp.h"
Error Returns
TPM_RC_OBJECT_MEMORY

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Meaning
no space to create an internal object

TPM_RC
TPM2_HashSequenceStart(
HashSequenceStart_In
HashSequenceStart_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Internal Data Update
if(in->hashAlg == TPM_ALG_NULL)
// Start a event sequence. A TPM_RC_OBJECT_MEMORY error may be
// returned at this point
return ObjectCreateEventSequence(&in->auth, &out->sequenceHandle);
// Start a hash sequence. A TPM_RC_OBJECT_MEMORY error may be
// returned at this point
return ObjectCreateHashSequence(in->hashAlg, &in->auth, &out->sequenceHandle);
}

Page 138
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

19.4

Part 3: Commands

TPM2_SequenceUpdate

19.4.1 General Description
This command is used to add data to a hash or HMAC sequence. The amount of data in buffer may be
any size up to the limits of the TPM.
NOTE

In all TPM, a buffer size of 1,024 octets is allowed.

Proper authorization for the sequence object associated with sequenceHandle is required. If an
authorization or audit of this command requires computation of a cpHash and an rpHash, the Name
associated with sequenceHandle will be the Empty Buffer.
If the command does not return TPM_RC_SUCCESS, the state of the sequence is unmodified.
If the sequence is intended to produce a digest that will be signed by a restricted signing key, then the
first block of data shall contain sizeof(TPM_GENERATED) octets and the first octets shall not be
TPM_GENERATED_VALUE.
NOTE

This requirement allows the TPM to validate that the first block is safe to sign without having to
accumulate octets over multiple calls.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 139
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

19.4.2 Command and Response
Table 71 — TPM2_SequenceUpdate Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_SequenceUpdate

TPMI_DH_OBJECT

@sequenceHandle

handle for the sequence object
Auth Index: 1
Auth Role: USER

TPM2B_MAX_BUFFER

buffer

data to be added to hash

Table 72 — TPM2_SequenceUpdate Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 140
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

19.4.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "SequenceUpdate_fp.h"
Error Returns
TPM_RC_MODE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning
sequenceHandle does not reference a hash or HMAC sequence
object

TPM_RC
TPM2_SequenceUpdate(
SequenceUpdate_In

*in

// IN: input parameter list

)
{
OBJECT

*object;

// Input Validation
// Get sequence object pointer
object = ObjectGet(in->sequenceHandle);
// Check that referenced object is a sequence object.
if(!ObjectIsSequence(object))
return TPM_RC_MODE + RC_SequenceUpdate_sequenceHandle;
// Internal Data Update
if(object->attributes.eventSeq == SET)
{
// Update event sequence object
UINT32
i;
HASH_OBJECT
*hashObject = (HASH_OBJECT *)object;
for(i = 0; i < HASH_COUNT; i++)
{
// Update sequence object
CryptUpdateDigest2B(&hashObject->state.hashState[i], &in->buffer.b);
}
}
else
{
HASH_OBJECT
*hashObject = (HASH_OBJECT *)object;
// Update hash/HMAC sequence object
if(hashObject->attributes.hashSeq == SET)
{
// Is this the first block of the sequence
if(hashObject->attributes.firstBlock == CLEAR)
{
// If so, indicate that first block was received
hashObject->attributes.firstBlock = SET;
// Check the first block to see if the first block can contain
// the TPM_GENERATED_VALUE. If it does, it is not safe for
// a ticket.
if(TicketIsSafe(&in->buffer.b))
hashObject->attributes.ticketSafe = SET;
}
// Update sequence object hash/HMAC stack
CryptUpdateDigest2B(&hashObject->state.hashState[0], &in->buffer.b);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 141
October 31, 2013

Part 3: Commands
54
55
56
57
58
59
60
61
62
63
64
65

Trusted Platform Module Library

}
else if(object->attributes.hmacSeq == SET)
{
HASH_OBJECT
*hashObject = (HASH_OBJECT *)object;
// Update sequence object hash/HMAC stack
CryptUpdateDigest2B(&hashObject->state.hmacState, &in->buffer.b);
}
}
return TPM_RC_SUCCESS;
}

Page 142
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

19.5

Part 3: Commands

TPM2_SequenceComplete

19.5.1 General Description
This command adds the last part of data, if any, to a hash/HMAC sequence and returns the result.
NOTE 1

This command is not used to complete an Event sequence. TPM2_EventSequenceComplete() is
used for that purpose.

For a hash sequence, if the results of the hash will be used in a signing operation that uses a restricted
signing key, then the ticket returned by this command can indicate that the hash is safe to sign.
If the digest is not safe to sign, then validation will be a TPMT_TK_HASHCHECK with the hierarchy set to
TPM_RH_NULL and digest set to the Empty Buffer.
NOTE 2

Regardless of the contents of the first octets of the hashed message, if the first buffer sent to the
TPM had fewer than sizeof(TPM_GENERATED) octets, then the TPM will operate as if digest is not
safe to sign.

If sequenceHandle references an Event sequence, then the TPM shall return TPM_RC_MODE.
Proper authorization for the sequence object associated with sequenceHandle is required. If an
authorization or audit of this command requires computation of a cpHash and an rpHash, the Name
associated with sequenceHandle will be the Empty Buffer.
If this command completes successfully, the sequenceHandle object will be flushed.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 143
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

19.5.2 Command and Response
Table 73 — TPM2_SequenceComplete Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_SequenceComplete {F}

TPMI_DH_OBJECT

@sequenceHandle

authorization for the sequence
Auth Index: 1
Auth Role: USER

TPM2B_MAX_BUFFER

buffer

data to be added to the hash/HMAC

TPMI_RH_HIERARCHY+

hierarchy

hierarchy of the ticket for a hash

Table 74 — TPM2_SequenceComplete Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DIGEST

result

the returned HMAC or digest in a sized buffer

TPMT_TK_HASHCHECK

validation

ticket indicating that the sequence of octets used to
compute outDigest did not start with
TPM_GENERATED_VALUE
This is a NULL Ticket when the session is HMAC.

Page 144
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

19.5.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "SequenceComplete_fp.h"
#include <Platform.h>
Error Returns
TPM_RC_TYPE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning
sequenceHandle does not reference a hash or HMAC sequence
object

TPM_RC
TPM2_SequenceComplete(
SequenceComplete_In
SequenceComplete_Out

*in,
*out

OBJECT

// IN: input parameter list
// OUT: output parameter list

*object;

)
{
// Input validation
// Get hash object pointer
object = ObjectGet(in->sequenceHandle);
// input handle must be a hash or HMAC sequence object.
if(
object->attributes.hashSeq == CLEAR
&& object->attributes.hmacSeq == CLEAR)
return TPM_RC_MODE + RC_SequenceComplete_sequenceHandle;
// Command Output
if(object->attributes.hashSeq == SET)
// sequence object for hash
{
// Update last piece of data
HASH_OBJECT
*hashObject = (HASH_OBJECT *)object;
CryptUpdateDigest2B(&hashObject->state.hashState[0], &in->buffer.b);
// Complete hash
out->result.t.size
= CryptGetHashDigestSize(
CryptGetContextAlg(&hashObject->state.hashState[0]));
CryptCompleteHash2B(&hashObject->state.hashState[0], &out->result.b);
// Check if the first block of the sequence has been received
if(hashObject->attributes.firstBlock == CLEAR)
{
// If not, then this is the first block so see if it is 'safe'
// to sign.
if(TicketIsSafe(&in->buffer.b))
hashObject->attributes.ticketSafe = SET;
}
// Output ticket
out->validation.tag = TPM_ST_HASHCHECK;
out->validation.hierarchy = in->hierarchy;
if(in->hierarchy == TPM_RH_NULL)
{
// Ticket is not required
out->validation.digest.t.size = 0;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 145
October 31, 2013

Part 3: Commands
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

Trusted Platform Module Library

}
else if(object->attributes.ticketSafe == CLEAR)
{
// Ticket is not safe to generate
out->validation.hierarchy = TPM_RH_NULL;
out->validation.digest.t.size = 0;
}
else
{
// Compute ticket
TicketComputeHashCheck(out->validation.hierarchy,
&out->result, &out->validation);
}
}
else
{
HASH_OBJECT

*hashObject = (HASH_OBJECT *)object;

//
Update last piece of data
CryptUpdateDigest2B(&hashObject->state.hmacState, &in->buffer.b);
// Complete hash/HMAC
out->result.t.size =
CryptGetHashDigestSize(
CryptGetContextAlg(&hashObject->state.hmacState.hashState));
CryptCompleteHMAC2B(&(hashObject->state.hmacState), &out->result.b);
// No ticket is generated for HMAC sequence
out->validation.tag = TPM_ST_HASHCHECK;
out->validation.hierarchy = TPM_RH_NULL;
out->validation.digest.t.size = 0;
}
// Internal Data Update
// mark sequence object as evict so it will be flushed on the way out
object->attributes.evict = SET;
return TPM_RC_SUCCESS;
}

Page 146
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

19.6

Part 3: Commands

TPM2_EventSequenceComplete

19.6.1 General Description
This command adds the last part of data, if any, to an Event sequence and returns the result in a digest
list. If pcrHandle references a PCR and not TPM_RH_NULL, then the returned digest list is processed in
the same manner as the digest list input parameter to TPM2_PCR_Extend() with the pcrHandle in each
bank extended with the associated digest value.
If sequenceHandle references a hash or HMAC sequence, the TPM shall return TPM_RC_MODE.
Proper authorization for the sequence object associated with sequenceHandle is required. If an
authorization or audit of this command requires computation of a cpHash and an rpHash, the Name
associated with sequenceHandle will be the Empty Buffer.
If this command completes successfully, the sequenceHandle object will be flushed.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 147
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

19.6.2 Command and Response
Table 75 — TPM2_EventSequenceComplete Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_EventSequenceComplete {NV F}

TPMI_DH_PCR+

@pcrHandle

PCR to be extended with the Event data
Auth Index: 1
Auth Role: USER

TPMI_DH_OBJECT

@sequenceHandle

authorization for the sequence
Auth Index: 2
Auth Role: USER

TPM2B_MAX_BUFFER

buffer

data to be added to the Event

Description

Table 76 — TPM2_EventSequenceComplete Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPML_DIGEST_VALUES

results

Page 148
October 31, 2013

list of digests computed for the PCR

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

19.6.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "EventSequenceComplete_fp.h"
Error Returns
TPM_RC_LOCALITY

PCR extension is not allowed at the current locality

TPM_RC_MODE
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning

input handle is not a valid event sequence object

TPM_RC
TPM2_EventSequenceComplete(
EventSequenceComplete_In
EventSequenceComplete_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
HASH_OBJECT
UINT32
TPM_ALG_ID

result;
*hashObject;
i;
hashAlg;

// Input validation
// get the event sequence object pointer
hashObject = (HASH_OBJECT *)ObjectGet(in->sequenceHandle);
// input handle must reference an event sequence object
if(hashObject->attributes.eventSeq != SET)
return TPM_RC_MODE + RC_EventSequenceComplete_sequenceHandle;
// see if a PCR extend is requested in call
if(in->pcrHandle != TPM_RH_NULL)
{
// see if extend of the PCR is allowed at the locality of the command,
if(!PCRIsExtendAllowed(in->pcrHandle))
return TPM_RC_LOCALITY;
// if an extend is going to take place, then check to see if there has
// been an orderly shutdown. If so, and the selected PCR is one of the
// state saved PCR, then the orderly state has to change. The orderly state
// does not change for PCR that are not preserved.
// NOTE: This doesn't just check for Shutdown(STATE) because the orderly
// state will have to change if this is a state-saved PCR regardless
// of the current state. This is because a subsequent Shutdown(STATE) will
// check to see if there was an orderly shutdown and not do anything if
// there was. So, this must indicate that a future Shutdown(STATE) has
// something to do.
if(gp.orderlyState != SHUTDOWN_NONE && PCRIsStateSaved(in->pcrHandle))
{
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
g_clearOrderly = TRUE;
}
}
// Command Output
out->results.count = 0;
for(i = 0; i < HASH_COUNT; i++)
{
hashAlg = CryptGetHashAlgByIndex(i);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 149
October 31, 2013

Part 3: Commands
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

Trusted Platform Module Library

// Update last piece of data
CryptUpdateDigest2B(&hashObject->state.hashState[i], &in->buffer.b);
// Complete hash
out->results.digests[out->results.count].hashAlg = hashAlg;
CryptCompleteHash(&hashObject->state.hashState[i],
CryptGetHashDigestSize(hashAlg),
(BYTE *) &out->results.digests[out->results.count].digest);
// Extend PCR
if(in->pcrHandle != TPM_RH_NULL)
PCRExtend(in->pcrHandle, hashAlg,
CryptGetHashDigestSize(hashAlg),
(BYTE *) &out->results.digests[out->results.count].digest);
out->results.count++;
}
// Internal Data Update
// mark sequence object as evict so it will be flushed on the way out
hashObject->attributes.evict = SET;
return TPM_RC_SUCCESS;
}

Page 150
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Attestation Commands

20
20.1

Introduction

The attestation commands cause the TPM to sign an internally generated data structure. The contents of
the data structure vary according to the command.
For all signing commands, provisions are made for the caller to provide a scheme to be used for the
signing operation. This scheme will be applied only if the scheme of the key is TPM_ALG_NULL. If the
scheme for signHandle is not TPM_ALG_NULL, then inScheme.scheme shall be TPM_ALG_NULL or the
same as scheme in the public area of the key. If the scheme for signHandle is TPM_ALG_NULL, then
inScheme will be used for the signing operation and may not be TPM_ALG_NULL. The TPM shall return
TPM_RC_SCHEME to indicate that the scheme is not appropriate.
For a signing key that is not restricted, the caller may specify the scheme to be used as long as the
scheme is compatible with the family of the key (for example, TPM_ALG_RSAPSS cannot be selected for
an ECC key). If the caller sets scheme to TPM_ALG_NULL, then the default scheme of the key is used.
If the handle for the signing key (signHandle) is TPM_RH_NULL, then all of the actions of the command
are performed and the attestation block is “signed” with the NULL Signature.
NOTE 1

This mechanism is provided so that additional commands are not required to access the data that
might be in an attestation structure.

NOTE 2

When signHandle is TPM_RH_NULL, scheme is still required to be a valid signing scheme (may be
TPM_ALG_NULL), but the scheme will have no effect on the format of the signature. It will always
be the NULL Signature.

TPM2_NV_Certify() is an attestation command that is documented in 1. The remaining attestation
commands are collected in the remainder of this clause.
Each of the attestation structures contains a TPMS_CLOCK_INFO structure and a firmware version
number. These values may be considered privacy-sensitive, because they would aid in the correlation of
attestations by different keys. To provide improved privacy, the resetCount, restartCount, and
firmwareVersion numbers are obfuscated when the signing key is not in the Endorsement or Platform
hierarchies.
The obfuscation value is computed by:

obfuscation ≔ KDFa(signHandle→nameAlg, shProof, “OBFUSCATE”, signHandle→QN, 0, 128) (3)
Of the returned 128 bits, 64 bits are added to the versionNumber field of the attestation structure; 32 bits
are added to the clockInfo.resetCount and 32 bits are added to the clockInfo.restartCount. The order in
which the bits are added is implementation-dependent.
NOTE 3

The obfuscation value for each signing key will be unique to that key in a specific location. That is,
each version of a duplicated signing key will have a different obfuscation value.

When the signing key is TPM_RH_NULL, the data structure is produced but not signed; and the values in
the signed data structure are obfuscated. When computing the obfuscation value for TPM_RH_NULL, the
hash used for context integrity is used.
NOTE 4

The QN for TPM_RH_NULL is TPM_RH_NULL.

If the signing scheme of signHandle is an anonymous scheme, then the attestation blocks will not contain
the Qualified Name of the signHandle.
Each of the attestation structures allows the caller to provide some qualifying data (qualifyingData). For
most signing schemes, this value will be placed in the TPMS_ATTEST.extraData parameter that is then

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 151
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

hashed and signed. However, for some schemes such as ECDAA, the qualifyingData is used in a
different manner (for details, see “ECDAA” in Part 1).

Page 152
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

20.2

Part 3: Commands

TPM2_Certify

20.2.1 General Description
The purpose of this command is to prove that an object with a specific Name is loaded in the TPM. By
certifying that the object is loaded, the TPM warrants that a public area with a given Name is selfconsistent and associated with a valid sensitive area. If a relying party has a public area that has the
same Name as a Name certified with this command, then the values in that public area are correct.
NOTE 1

See 20.1 for description of how the signing scheme is selected.

Authorization for objectHandle requires ADMIN role authorization. If performed with a policy session, the
session shall have a policySession→commandCode set to TPM_CC_Certify. This indicates that the
policy that is being used is a policy that is for certification, and not a policy that would approve another
use. That is, authority to use an object does not grant authority to certify the object.
The object may be any object that is loaded with TPM2_Load() or TPM2_CreatePrimary(). An object that
only has its public area loaded cannot be certified.
NOTE 2

The restriction occurs because the Name is used to identify the object being certified. If the TPM
has not validated that the public area is associated with a matched sensitive area, then the public
area may not represent a valid object a nd cannot be certified.

The certification includes the Name and Qualified Name of the certified object as well as the Name and
the Qualified Name of the certifying object.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 153
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

20.2.2 Command and Response
Table 77 — TPM2_Certify Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Certify

TPMI_DH_OBJECT

@objectHandle

handle of the object to be certified
Auth Index: 1
Auth Role: ADMIN

TPMI_DH_OBJECT+

@signHandle

handle of the key used to sign the attestation structure
Auth Index: 2
Auth Role: USER

TPM2B_DATA

qualifyingData

user provided qualifying data

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

Description

Table 78 — TPM2_Certify Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

.

TPM2B_ATTEST

certifyInfo

the structure that was signed

TPMT_SIGNATURE

signature

the asymmetric signature over certifyInfo using the key
referenced by signHandle

Page 154
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

20.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Attest_spt_fp.h"
#include "Certify_fp.h"
Error Returns
TPM_RC_KEY

key referenced by signHandle is not a signing key

TPM_RC_SCHEME

inScheme is not compatible with signHandle

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

Meaning

digest generated for inScheme is greater or has larger size than the
modulus of signHandle, or the buffer for the result in signature is too
small (for an RSA key); invalid commit status (for an ECC key with a
split scheme).

TPM_RC
TPM2_Certify(
Certify_In
Certify_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMS_ATTEST

result;
certifyInfo;

// Command Output
// Filling in attest information
// Common fields
result = FillInAttestInfo(in->signHandle,
&in->inScheme,
&in->qualifyingData,
&certifyInfo);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_Certify_signHandle;
else
return RcSafeAddToResult(result, RC_Certify_inScheme);
}
// Certify specific fields
// Attestation type
certifyInfo.type = TPM_ST_ATTEST_CERTIFY;
// Certified object name
certifyInfo.attested.certify.name.t.size =
ObjectGetName(in->objectHandle,
&certifyInfo.attested.certify.name.t.name);
// Certified object qualified name
ObjectGetQualifiedName(in->objectHandle,
&certifyInfo.attested.certify.qualifiedName);
// Sign attestation structure. A NULL signature will be returned if
// signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
// TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned
// by SignAttestInfo()
result = SignAttestInfo(in->signHandle,
&in->inScheme,
&certifyInfo,
&in->qualifyingData,
&out->certifyInfo,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 155
October 31, 2013

Part 3: Commands
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

Trusted Platform Module Library
&out->signature);

// TPM_RC_ATTRIBUTES cannot be returned here as FillInAttestInfo would already
// have returned TPM_RC_KEY
pAssert(result != TPM_RC_ATTRIBUTES);
if(result != TPM_RC_SUCCESS)
return result;
// orderly state should be cleared because of the reporting of clock info
// if signing happens
if(in->signHandle != TPM_RH_NULL)
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 156
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

20.3

Part 3: Commands

TPM2_CertifyCreation

20.3.1 General Description
This command is used to prove the association between an object and its creation data. The TPM will
validate that the ticket was produced by the TPM and that the ticket validates the association between a
loaded public area and the provided hash of the creation data (creationHash).
NOTE 1

See 20.1 for description of how the signing scheme is selected.

The TPM will create a test ticket using the Name associated with objectHandle and creationHash as:

HMAC(proof, (TPM_ST_CREATION || objectHandle→Name || creationHash))

(4)

This ticket is then compared to creation ticket. If the tickets are not the same, the TPM shall return
TPM_RC_TICKET.
If the ticket is valid, then the TPM will create a TPMS_ATTEST structure and place creationHash of the
command in the creationHash field of the structure. The Name associated with objectHandle will be
included in the attestation data that is then signed using the key associated with signHandle.
NOTE 2

If signHandle is TPM_RH_NULL, the TPMS_ATTEST structure is returned and signature is a NULL
Signature.

ObjectHandle may be any object that is loaded with TPM2_Load() or TPM2_CreatePrimary().

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 157
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

20.3.2 Command and Response
Table 79 — TPM2_CertifyCreation Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_CertifyCreation

TPMI_DH_OBJECT+

@signHandle

handle of the key that will sign the attestation block
Auth Index: 1
Auth Role: USER

TPMI_DH_OBJECT

objectHandle

the object associated with the creation data
Auth Index: None

TPM2B_DATA

qualifyingData

user-provided qualifying data

TPM2B_DIGEST

creationHash

hash of the creation data produced by TPM2_Create()
or TPM2_CreatePrimary()

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

TPMT_TK_CREATION

creationTicket

ticket produced by TPM2_Create() or
TPM2_CreatePrimary()

Table 80 — TPM2_CertifyCreation Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ATTEST

certifyInfo

the structure that was signed

TPMT_SIGNATURE

signature

the signature over certifyInfo

Page 158
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

20.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Attest_spt_fp.h"
#include "CertifyCreation_fp.h"
Error Returns
TPM_RC_KEY

key referenced by signHandle is not a signing key

TPM_RC_SCHEME

inScheme is not compatible with signHandle

TPM_RC_TICKET

creationTicket does not match objectHandle

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

Meaning

digest generated for inScheme is greater or has larger size than the
modulus of signHandle, or the buffer for the result in signature is too
small (for an RSA key); invalid commit status (for an ECC key with a
split scheme).

TPM_RC
TPM2_CertifyCreation(
CertifyCreation_In
CertifyCreation_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPM2B_NAME
TPMT_TK_CREATION
TPMS_ATTEST

result;
name;
ticket;
certifyInfo;

// Input Validation
// CertifyCreation specific input validation
// Get certified object name
name.t.size = ObjectGetName(in->objectHandle, &name.t.name);
// Re-compute ticket
TicketComputeCreation(in->creationTicket.hierarchy, &name,
&in->creationHash, &ticket);
// Compare ticket
if(!Memory2BEqual(&ticket.digest.b, &in->creationTicket.digest.b))
return TPM_RC_TICKET + RC_CertifyCreation_creationTicket;
// Command Output
// Common fields
result = FillInAttestInfo(in->signHandle, &in->inScheme, &in->qualifyingData,
&certifyInfo);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_CertifyCreation_signHandle;
else
return RcSafeAddToResult(result, RC_CertifyCreation_inScheme);
}
// CertifyCreation specific fields
// Attestation type
certifyInfo.type = TPM_ST_ATTEST_CREATION;
certifyInfo.attested.creation.objectName = name;
// Copy the creationHash
certifyInfo.attested.creation.creationHash = in->creationHash;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 159
October 31, 2013

Part 3: Commands
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

Trusted Platform Module Library

// Sign attestation structure. A NULL signature will be returned if
// signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
// TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
// this point
result = SignAttestInfo(in->signHandle,
&in->inScheme,
&certifyInfo,
&in->qualifyingData,
&out->certifyInfo,
&out->signature);
// TPM_RC_ATTRIBUTES cannot be returned here as FillInAttestInfo would already
// have returned TPM_RC_KEY
pAssert(result != TPM_RC_ATTRIBUTES);
if(result != TPM_RC_SUCCESS)
return result;
// orderly state should be cleared because of the reporting of clock info
// if signing happens
if(in->signHandle != TPM_RH_NULL)
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 160
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

20.4

Part 3: Commands

TPM2_Quote

20.4.1 General Description
This command is used to quote PCR values.
NOTE

See 20.1 for description of how the signing scheme is selected.

The TPM will hash the list of PCR selected by PCRselect using the hash algorithm associated with
signHandle (this is the hash algorithm of the signing scheme, not the nameAlg of signHandle).
The digest is computed as the hash of the concatenation of all of the digest values of the selected PCR.
The concatenation of PCR is described in Part 1, Selecting Multiple PCR.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 161
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

20.4.2 Command and Response
Table 81 — TPM2_Quote Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Quote

TPMI_DH_OBJECT

@signHandle

handle of key that will perform signature
Auth Index: 1
Auth Role: USER

TPM2B_DATA

qualifyingData

data supplied by the caller

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

TPML_PCR_SELECTION

PCRselect

PCR set to quote

Table 82 — TPM2_Quote Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ATTEST

quoted

the quoted information

TPMT_SIGNATURE

signature

the signature over quoted

Page 162
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

20.4.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Attest_spt_fp.h"
#include "Quote_fp.h"
Error Returns
TPM_RC_KEY

signHandle does not reference a signing key;

TPM_RC_SCHEME

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Meaning

the scheme is not compatible with sign key type, or input scheme is
not compatible with default scheme, or the chosen scheme is not a
valid sign scheme

TPM_RC
TPM2_Quote(
Quote_In
Quote_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMI_ALG_HASH
TPMS_ATTEST

result;
hashAlg;
quoted;

// Command Output
// Filling in attest information
// Common fields
// FillInAttestInfo will return TPM_RC_SCHEME or TPM_RC_KEY
result = FillInAttestInfo(in->signHandle,
&in->inScheme,
&in->qualifyingData,
&quoted);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_Quote_signHandle;
else
return RcSafeAddToResult(result, RC_Quote_inScheme);
}
// Quote specific fields
// Attestation type
quoted.type = TPM_ST_ATTEST_QUOTE;
// Get hash algorithm in sign scheme. This hash algorithm is used to
// compute PCR digest. If there is no algorithm, then the PCR cannot
// be digested and this command returns TPM_RC_SCHEME
hashAlg = in->inScheme.details.any.hashAlg;
if(hashAlg == TPM_ALG_NULL)
return TPM_RC_SCHEME + RC_Quote_inScheme;
// Compute PCR digest
PCRComputeCurrentDigest(hashAlg,
&in->PCRselect,
&quoted.attested.quote.pcrDigest);
// Copy PCR select. "PCRselect" is modified in PCRComputeCurrentDigest
// function
quoted.attested.quote.pcrSelect = in->PCRselect;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 163
October 31, 2013

Part 3: Commands
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

Trusted Platform Module Library

// Sign attestation structure. A NULL signature will be returned if
// signHandle is TPM_RH_NULL. TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES
// error may be returned by SignAttestInfo.
// NOTE: TPM_RC_ATTRIBUTES means that the key is not a signing key but that
// was checked above and TPM_RC_KEY was returned. TPM_RC_VALUE means that the
// value to sign is too large but that means that the digest is too big and
// that can't happen.
result = SignAttestInfo(in->signHandle,
&in->inScheme,
&quoted,
&in->qualifyingData,
&out->quoted,
&out->signature);
if(result != TPM_RC_SUCCESS)
return result;
// orderly state should be cleared because of the reporting of clock info
// if signing happens
if(in->signHandle != TPM_RH_NULL)
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 164
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

20.5

Part 3: Commands

TPM2_GetSessionAuditDigest

20.5.1 General Description
This command returns a digital signature of the audit session digest.
NOTE 1

See 20.1 for description of how the signing scheme is selected.

If sessionHandle is not an audit session, the TPM shall return TPM_RC_TYPE.
NOTE 2

A session does not become an audit session until the successful completion of the command in
which the session is first used as an audit session.

This command requires authorization from the privacy administrator of the TPM (expressed with
endorsementAuth) as well as authorization to use the key associated with signHandle.
If this command is audited, then the audit digest that is signed will not include the digest of this command
because the audit digest is only updated when the command completes successfully.
This command does not cause the audit session to be closed and does not reset the digest value.
NOTE 3

The audit session digest will be reset if the sessionHandle is used as the audit session for the
command and the auditReset attribute of the session is set; and this command will be the first
command in the audit digest.

NOTE 4

A reason for using 'sessionHahdle' in this command is so that the continueSession attribute may be
CLEAR. This will flush the session at the end of the command.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 165
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

20.5.2 Command and Response
Table 83 — TPM2_GetSessionAuditDigest Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_GetSessionAuditDigest

TPMI_RH_ENDORSEMENT

@privacyAdminHandle

handle of the privacy administrator
(TPM_RH_ENDORSEMENT)
Auth Index: 1
Auth Role: USER

TPMI_DH_OBJECT+

@signHandle

handle of the signing key
Auth Index: 2
Auth Role: USER

TPMI_SH_HMAC

sessionHandle

handle of the audit session
Auth Index: None

TPM2B_DATA

qualifyingData

user-provided qualifying data – may be zero-length

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

Description

Table 84 — TPM2_GetSessionAuditDigest Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ATTEST

auditInfo

the audit information that was signed

TPMT_SIGNATURE

signature

the signature over auditInfo

Page 166
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

20.5.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Attest_spt_fp.h"
#include "GetSessionAuditDigest_fp.h"
Error Returns
TPM_RC_KEY

key referenced by signHandle is not a signing key

TPM_RC_SCHEME

inScheme is incompatible with signHandle type; or both scheme and
key's default scheme are empty; or scheme is empty while key's
default scheme requires explicit input scheme (split signing); or nonempty default key scheme differs from scheme

TPM_RC_TYPE

sessionHandle does not reference an audit session

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Meaning

digest generated for the given scheme is greater than the modulus of
signHandle (for an RSA key); invalid commit status or failed to
generate r value (for an ECC key)

TPM_RC
TPM2_GetSessionAuditDigest(
GetSessionAuditDigest_In
GetSessionAuditDigest_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
SESSION
TPMS_ATTEST

result;
*session;
auditInfo;

// Input Validation
// SessionAuditDigest specific input validation
// Get session pointer
session = SessionGet(in->sessionHandle);
// session must be an audit session
if(session->attributes.isAudit == CLEAR)
return TPM_RC_TYPE + RC_GetSessionAuditDigest_sessionHandle;
// Command Output
// Filling in attest information
// Common fields
result = FillInAttestInfo(in->signHandle,
&in->inScheme,
&in->qualifyingData,
&auditInfo);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_GetSessionAuditDigest_signHandle;
else
return RcSafeAddToResult(result, RC_GetSessionAuditDigest_inScheme);
}
// SessionAuditDigest specific fields
// Attestation type
auditInfo.type = TPM_ST_ATTEST_SESSION_AUDIT;
// Copy digest

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 167
October 31, 2013

Part 3: Commands
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

Trusted Platform Module Library

auditInfo.attested.sessionAudit.sessionDigest = session->u2.auditDigest;
// Exclusive audit session
if(g_exclusiveAuditSession == in->sessionHandle)
auditInfo.attested.sessionAudit.exclusiveSession = TRUE;
else
auditInfo.attested.sessionAudit.exclusiveSession = FALSE;
// Sign attestation structure. A NULL signature will be returned if
// signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
// TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
// this point
result = SignAttestInfo(in->signHandle,
&in->inScheme,
&auditInfo,
&in->qualifyingData,
&out->auditInfo,
&out->signature);
if(result != TPM_RC_SUCCESS)
return result;
// orderly state should be cleared because of the reporting of clock info
// if signing happens
if(in->signHandle != TPM_RH_NULL)
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 168
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

20.6

Part 3: Commands

TPM2_GetCommandAuditDigest

20.6.1 General Description
This command returns the current value of the command audit digest, a digest of the commands being
audited, and the audit hash algorithm. These values are placed in an attestation structure and signed with
the key referenced by signHandle.
NOTE 1

See 20.1 for description of how the signing scheme is selected.

When this command completes successfully, and signHandle is not TPM_RH_NULL, the audit digest is
cleared.
NOTE 2

The way that the TPM tracks that the digest is clear is vendor -dependent. The reference
implementation resets the size of the digest to zero.

If this command is being audited, then the signed digest produced by the command will not include the
command. At the end of this command, the audit digest will be extended with cpHash and the rpHash of
the command which would change the command audit digest signed by the next invocation of this
command.
This command requires authorization from the privacy administrator of the TPM (expressed with
endorsementAuth) as well as authorization to use the key associated with signHandle.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 169
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

20.6.2 Command and Response
Table 85 — TPM2_GetCommandAuditDigest Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_GetCommandAuditDigest {NV}

TPMI_RH_ENDORSEMENT

@privacyHandle

handle of the privacy administrator
(TPM_RH_ENDORSEMENT)
Auth Index: 1
Auth Role: USER

TPMI_DH_OBJECT+

@signHandle

the handle of the signing key
Auth Index: 2
Auth Role: USER

TPM2B_DATA

qualifyingData

other data to associate with this audit digest

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

Table 86 — TPM2_GetCommandAuditDigest Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_ATTEST

auditInfo

the auditInfo that was signed

TPMT_SIGNATURE

signature

the signature over auditInfo

Page 170
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

20.6.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Attest_spt_fp.h"
#include "GetCommandAuditDigest_fp.h"
Error Returns
TPM_RC_KEY

key referenced by signHandle is not a signing key

TPM_RC_SCHEME

inScheme is incompatible with signHandle type; or both scheme and
key's default scheme are empty; or scheme is empty while key's
default scheme requires explicit input scheme (split signing); or nonempty default key scheme differs from scheme

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

Meaning

digest generated for the given scheme is greater than the modulus of
signHandle (for an RSA key); invalid commit status or failed to
generate r value (for an ECC key)

TPM_RC
TPM2_GetCommandAuditDigest(
GetCommandAuditDigest_In
GetCommandAuditDigest_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMS_ATTEST

result;
auditInfo;

// Command Output
// Filling in attest information
// Common fields
result = FillInAttestInfo(in->signHandle,
&in->inScheme,
&in->qualifyingData,
&auditInfo);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_GetCommandAuditDigest_signHandle;
else
return RcSafeAddToResult(result, RC_GetCommandAuditDigest_inScheme);
}
// CommandAuditDigest specific fields
// Attestation type
auditInfo.type = TPM_ST_ATTEST_COMMAND_AUDIT;
// Copy audit hash algorithm
auditInfo.attested.commandAudit.digestAlg = gp.auditHashAlg;
// Copy counter value
auditInfo.attested.commandAudit.auditCounter = gp.auditCounter;
// Copy command audit log
auditInfo.attested.commandAudit.auditDigest = gr.commandAuditDigest;
CommandAuditGetDigest(&auditInfo.attested.commandAudit.commandDigest);
//
//
//
//

Sign attestation structure. A NULL signature will be returned if
signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
this point

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 171
October 31, 2013

Part 3: Commands
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

Trusted Platform Module Library

result = SignAttestInfo(in->signHandle,
&in->inScheme,
&auditInfo,
&in->qualifyingData,
&out->auditInfo,
&out->signature);
if(result != TPM_RC_SUCCESS)
return result;
// Internal Data Update
if(in->signHandle != TPM_RH_NULL)
{
// Reset log
gr.commandAuditDigest.t.size = 0;
// orderly state should be cleared because of the update in
// commandAuditDigest, as well as the reporting of clock info
g_clearOrderly = TRUE;
}
return TPM_RC_SUCCESS;
}

Page 172
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

20.7

Part 3: Commands

TPM2_GetTime

20.7.1 General Description
This command returns the current values of Time and Clock.
NOTE 1

See 20.1 for description of how the signing scheme is selected.

The values of Clock, resetCount and restartCount appear in two places in timeInfo: once in
TPMS_ATTEST.clockInfo and again in TPMS_ATTEST.attested.time.clockInfo. The firmware version
number
also
appears
in
two
places
(TPMS_ATTEST.firmwareVersion
and
TPMS_ATTEST.attested.time.firmwareVersion). If signHandle is in the endorsement or platform
hierarchies, both copies of the data will be the same. However, if signHandle is in the storage hierarchy or
is TPM_RH_NULL, the values in TPMS_ATTEST.clockInfo and TPMS_ATTEST.firmwareVersion are
obfuscated but the values in TPM_ATTEST.attested.time are not.
NOTE 2

The purpose of this duplication is to allow an entity who is trusted by the privacy Administrator to
correlate the obfuscated values with the clear -text values.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 173
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

20.7.2 Command and Response
Table 87 — TPM2_GetTime Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_GetTime

TPMI_RH_ENDORSEMENT

@privacyAdminHandle

handle of the privacy administrator
(TPM_RH_ENDORSEMENT)
Auth Index: 1
Auth Role: USER

TPMI_DH_OBJECT+

@signHandle

the keyHandle identifier of a loaded key that can
perform digital signatures
Auth Index: 2
Auth Role: USER

TPM2B_DATA

qualifyingData

data to tick stamp

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

Description

Table 88 — TPM2_GetTime Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

.

TPM2B_ATTEST

timeInfo

standard TPM-generated attestation block

TPMT_SIGNATURE

signature

the signature over timeInfo

Page 174
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

20.7.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Attest_spt_fp.h"
#include "GetTime_fp.h"
Error Returns
TPM_RC_KEY

key referenced by signHandle is not a signing key

TPM_RC_SCHEME

inScheme is incompatible with signHandle type; or both scheme and
key's default scheme are empty; or scheme is empty while key's
default scheme requires explicit input scheme (split signing); or nonempty default key scheme differs from scheme

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

Meaning

digest generated for the given scheme is greater than the modulus of
signHandle (for an RSA key); invalid commit status or failed to
generate r value (for an ECC key)

TPM_RC
TPM2_GetTime(
GetTime_In
GetTime_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
TPMS_ATTEST

result;
timeInfo;

// Command Output
// Filling in attest information
// Common fields
result = FillInAttestInfo(in->signHandle,
&in->inScheme,
&in->qualifyingData,
&timeInfo);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_GetTime_signHandle;
else
return RcSafeAddToResult(result, RC_GetTime_inScheme);
}
// GetClock specific fields
// Attestation type
timeInfo.type = TPM_ST_ATTEST_TIME;
// current clock in plain text
timeInfo.attested.time.time.time = g_time;
TimeFillInfo(&timeInfo.attested.time.time.clockInfo);
// Firmware version in plain text
timeInfo.attested.time.firmwareVersion
= ((UINT64) gp.firmwareV1) << 32;
timeInfo.attested.time.firmwareVersion += gp.firmwareV2;
// Sign attestation structure. A NULL signature will be returned if
// signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
// TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
// this point
result = SignAttestInfo(in->signHandle,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 175
October 31, 2013

Part 3: Commands
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

Trusted Platform Module Library

&in->inScheme,
&timeInfo,
&in->qualifyingData,
&out->timeInfo,
&out->signature);
if(result != TPM_RC_SUCCESS)
return result;
// orderly state should be cleared because of the reporting of clock info
// if signing happens
if(in->signHandle != TPM_RH_NULL)
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 176
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

21

Part 3: Commands

Ephemeral EC Keys

21.1

Introduction

The TPM generates keys that have different lifetimes. TPM keys in a hierarchy can be persistent for as
long as the seed of the hierarchy is unchanged and these keys may be used multiple times. Other TPMgenerated keys are only useful for a single operation. Some of these single-use keys are used in the
command in which they are created. Examples of this use are TPM2_Duplicate() where an ephemeral
key is created for a single pass key exchange with another TPM. However, there are other cases, such
as anonymous attestation, where the protocol requires two passes where the public part of the ephemeral
key is used outside of the TPM before the final command "consumes" the ephemeral key.
For these uses, TPM2_Commit() or TPM2_EC_Ephemeral() may be used to have the TPM create an
ephemeral EC key and return the public part of the key for external use. Then in a subsequent command,
the caller provides a reference to the ephemeral key so that the TPM can retrieve or recreate the
associated private key.
When an ephemeral EC key is created, it is assigned a number and that number is returned to the caller
as the identifier for the key. This number is not a handle. A handle is assigned to a key that may be
context saved but these ephemeral EC keys may not be saved and do not have a full key context. When
a subsequent command uses the ephemeral key, the caller provides the number of the ephemeral key.
The TPM uses that number to either look up or recompute the associated private key. After the key is
used, the TPM records the fact that the key has been used so that it cannot be used again.
As mentioned, the TPM can keep each assigned private ephemeral key in memory until it is used.
However, this could consume a large amount of memory. To limit the memory size, the TPM is allowed to
restrict the number of pending private keys – keys that have been allocated but not used.
NOTE

The minimum number of ephemeral keys is determined by a platform specific specification

To further reduce the memory requirements for the ephemeral private keys, the TPM is allowed to use
pseudo-random values for the ephemeral keys. Instead of keeping the full value of the key in memory, the
TPM can use a counter as input to a KDF. Incrementing the counter will cause the TPM to generate a
new pseudo-random value.
Using the counter to generate pseudo-random private ephemeral keys greatly simplifies tracking of key
usage. When a counter value is used to create a key, a bit in an array may be set to indicate that the key
use is pending. When the ephemeral key is consumed, the bit is cleared. This prevents the key from
being used more than once.
Since the TPM is allowed to restrict the number of pending ephemeral keys, the array size can be limited.
For example, a 128 bit array would allow 128 keys to be "pending".
The management of the array is described in greater detail in the Split Operations clause in Annex C of
part 1.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 177
October 31, 2013

Part 3: Commands

21.2

Trusted Platform Module Library

TPM2_Commit

21.2.1 General Description
TPM2_Commit() performs the first part of an ECC anonymous signing operation. The TPM will perform
the point multiplications on the provided points and return intermediate signing values. The signHandle
parameter shall refer to an ECC key with the sign attribute (TPM_RC_ATTRIBUTES) using an
anonymous signing scheme (TPM_RC_SCHEME).
For this command, p1, s2 and y2 are optional parameters. If s2 is an Empty Buffer, then the TPM shall
return TPM_RC_SIZE if y2 is not an Empty Buffer. If p1, s2, and y2 are all Empty Buffers, the TPM shall
return TPM_RC_NO_RESULT.
In the algorithm below, the following additional values are used in addition to the command parameters:

HnameAlg

hash function using the nameAlg of the key associated with
signHandle

p

field modulus of the curve associated with signHandle

n

order of the curve associated with signHandle

ds

private key associated with signHandle

c

counter that increments each time a TPM2_Commit() is
successfully completed

A[i]

array of bits used to indicate when a value of c has been used in
a signing operation; values of i are 0 to 2n-1

k

nonce that is set to a random value on each TPM Reset; nonce
size is twice the security strength of any ECDAA key supported
by the TPM.

The algorithm is:
a) set K, L, and E to be Empty Buffers.
b) if s2 is not an Empty Buffer, compute x2 ≔ HnameAlg (s2) mod p, else skip to step (e)
c) if (x2, y2) is not a point on the curve of signHandle, return TPM_RC_ECC_POINT
d) set K ≔ [ds] (x2, y2)
e) generate or derive r (see the "Commit Random Value" clause in Part 1)
f)

set r ≔ r mod n

NOTE 1

nLen is the number of bits in n

g) if p1 is an Empty Buffer, skip to step i)
h) if (p1) is not a point on the curve of signHandle, return TPM_RC_ECC_POINT
i)

set E ≔ [r] (p1)

j)

if K is not an Empty Buffer, set L ≔ [r] (x2, y2)

k) if K, L, or E is the point at infinity, return TPM_RC_NO_RESULT
l)

set counter ≔ commitCount

m) set commitCount ≔ commitCount + 1

Page 178
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
NOTE 2

Part 3: Commands

Depending on the method of generating r, it may be necessary to update the tracking array here.

n) output K, L, E and counter
NOTE 3

Depending on the input parameters K and L may be Empty Buffers or E may be an Empty Buffer

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 179
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

21.2.2 Command and Response
Table 89 — TPM2_Commit Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

paramSize

TPM_CC

commandCode

Description

TPM_CC_Commit
handle of the key that will be used in the signing
operation

TPMI_DH_OBJECT

@signHandle

Auth Index: 1
Auth Role: USER

TPM2B_ECC_POINT

P1

a point (M) on the curve used by signHandle

TPM2B_SENSITIVE_DATA

s2

octet array used to derive x-coordinate of a base point

TPM2B_ECC_PARAMETER

y2

y coordinate of the point associated with s2

Table 90 — TPM2_Commit Response
Type

Name

Description

TPM_ST

tag

see 8

UINT32

paramSize

TPM_RC

responseCode

TPM2B_ECC_POINT

K

ECC point K ≔ [ds](x2, y2)

TPM2B_ECC_POINT

L

ECC point L ≔ [r](x2, y2)

TPM2B_ECC_POINT

E

ECC point E ≔ [r]P1

UINT16

counter

least-significant 16 bits of commitCount

Page 180
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

21.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Commit_fp.h"
#ifdef TPM_ALG_ECC
Error Returns
TPM_RC_ATTRIBUTES

keyHandle references a restricted key that is not a signing key

TPM_RC_ECC_POINT

either P1 or the point derived from s2 is not on the curve of
keyHandle

TPM_RC_HASH

invalid name algorithm in keyHandle

TPM_RC_KEY

keyHandle does not reference an ECC key

TPM_RC_SCHEME

keyHandle references a restricted signing key that does not use and
anonymous scheme

TPM_RC_NO_RESULT

K, L or E was a point at infinity; or failed to generate r value

TPM_RC_SIZE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

Meaning

s2 is empty but y2 is not or s2 provided but y2 is not

TPM_RC
TPM2_Commit(
Commit_In
Commit_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
OBJECT
TPMS_ECC_POINT
TPMS_ECC_POINT
TPMS_ECC_POINT
TPM2B_ECC_PARAMETER
TPM2B
TPM_RC
UINT16

*eccKey;
P2;
*pP2 = NULL;
*pP1 = NULL;
r;
*p;
result;
hashResults;

// Input Validation
eccKey = ObjectGet(in->signHandle);
// Input key must be an ECC key
if(eccKey->publicArea.type != TPM_ALG_ECC)
return TPM_RC_KEY + RC_Commit_signHandle;
// if the key is restricted, it must be a signing key using an anonymous scheme
if(eccKey->publicArea.objectAttributes.restricted == SET)
{
if(eccKey->publicArea.objectAttributes.sign != SET)
return TPM_RC_ATTRIBUTES + RC_Commit_signHandle;
if(!CryptIsSchemeAnonymous(
eccKey->publicArea.parameters.eccDetail.scheme.scheme))
return TPM_RC_SCHEME + RC_Commit_signHandle;
}
else
{
// if not restricted, s2, and y2 must be an Empty Buffer
if(in->s2.t.size)
return TPM_RC_SIZE + RC_Commit_s2;
}
// Make sure that both parts of P2 are present if either is present
if((in->s2.t.size == 0) != (in->y2.t.size == 0))

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 181
October 31, 2013

Part 3: Commands
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

Trusted Platform Module Library

return TPM_RC_SIZE + RC_Commit_y2;
// Get prime modulus for the curve. This is needed later but getting this now
// allows confirmation that the curve exists
p = (TPM2B *)CryptEccGetParameter('p',
eccKey->publicArea.parameters.eccDetail.curveID);
// if no p, then the curve ID is bad
// NOTE: This should never occur if the input unmarshaling code is working
// correctly
if(p == NULL)
return TPM_RC_KEY + RC_Commit_signHandle;
// Get the random value that will be used in the point multiplications
// Note: this does not commit the count.
if(!CryptGenerateR(&r,
NULL,
eccKey->publicArea.parameters.eccDetail.curveID,
&eccKey->name))
return TPM_RC_NO_RESULT;
// Set up P2 if s2 and Y2 are provided
if(in->s2.t.size != 0)
{
pP2 = &P2;
// copy y2 for P2
MemoryCopy2B(&P2.y.b, &in->y2.b, sizeof(P2.y.t.buffer));
// Compute x2 HnameAlg(s2) mod p
//
do the hash operation on s2 with the size of curve 'p'
hashResults = CryptHashBlock(eccKey->publicArea.nameAlg,
in->s2.t.size,
in->s2.t.buffer,
p->size,
P2.x.t.buffer);
// If there were error returns in the hash routine, indicate a problem
// with the hash in
if(hashResults == 0)
return TPM_RC_HASH + RC_Commit_signHandle;
// set the size of the X value to the size of the hash
P2.x.t.size = hashResults;
// set p2.x = hash(s2) mod p
if(CryptDivide(&P2.x.b, p, NULL, &P2.x.b) != TPM_RC_SUCCESS)
return TPM_RC_NO_RESULT;
if(!CryptEccIsPointOnCurve(eccKey->publicArea.parameters.eccDetail.curveID,
pP2))
return TPM_RC_ECC_POINT + RC_Commit_s2;
if(eccKey->attributes.publicOnly == SET)
return TPM_RC_KEY + RC_Commit_signHandle;
}
else
// If there is a P1, make sure that it is on the curve
// NOTE: an "empty" point has two UINT16 values which are the size values
// for each of the coordinates.
if(in->P1.t.size > 4)
{

Page 182
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

Part 3: Commands

pP1 = &in->P1.t.point;
if(!CryptEccIsPointOnCurve(eccKey->publicArea.parameters.eccDetail.curveID,
pP1))
return TPM_RC_ECC_POINT + RC_Commit_P1;
}
// Pass the parameters to CryptCommit.
// The work is not done inline because it does several point multiplies
// with the same curve. There is significant optimization by not
// having to reload the curve parameters multiple times.
result = CryptCommitCompute(&out->K.t.point,
&out->L.t.point,
&out->E.t.point,
eccKey->publicArea.parameters.eccDetail.curveID,
pP1,
pP2,
&eccKey->sensitive.sensitive.ecc,
&r);
if(result != TPM_RC_SUCCESS)
return result;
out->K.t.size = TPMS_ECC_POINT_Marshal(&out->K.t.point, NULL, NULL);
out->L.t.size = TPMS_ECC_POINT_Marshal(&out->L.t.point, NULL, NULL);
out->E.t.size = TPMS_ECC_POINT_Marshal(&out->E.t.point, NULL, NULL);
// The commit computation was successful so complete the commit by setting
// the bit
out->counter = CryptCommit();
return TPM_RC_SUCCESS;
}
#endif

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 183
October 31, 2013

Part 3: Commands

21.3

Trusted Platform Module Library

TPM2_EC_Ephemeral

21.3.1 General Description
TPM2_EC_Ephemeral() creates an ephemeral key for use in a two-phase key exchange protocol.
The TPM will use the commit mechanism to assign an ephemeral key r and compute a public point Q ≔
[r]G where G is the generator point associated with curveID.

Page 184
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

21.3.2 Command and Response
Table 91 — TPM2_EC_Ephemeral Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

paramSize

TPM_CC

commandCode

TPM_CC_EC_Ephemeral

TPMI_ECC_CURVE

curveID

The curve for the computed ephemeral point

Table 92 — TPM2_EC_Ephemeral Response
Type

Name

Description

TPM_ST

tag

see 8

UINT32

paramSize

TPM_RC

responseCode

TPM2B_ECC_POINT

Q

ephemeral public key Q ≔ [r]G

UINT16

counter

least-significant 16 bits of commitCount

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 185
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

21.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "EC_Ephemeral_fp.h"
#ifdef TPM_ALG_ECC
Error Returns
none

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

Meaning
...

TPM_RC
TPM2_EC_Ephemeral(
EC_Ephemeral_In
EC_Ephemeral_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM2B_ECC_PARAMETER

r;

// Get the random value that will be used in the point multiplications
// Note: this does not commit the count.
if(!CryptGenerateR(&r,
NULL,
in->curveID,
NULL))
return TPM_RC_NO_RESULT;
CryptEccPointMultiply(&out->Q.t.point, in->curveID, &r, NULL);
// commit the count value
out->counter = CryptCommit();
return TPM_RC_SUCCESS;
}
#endif

Page 186
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

22

Part 3: Commands

Signing and Signature Verification

22.1

TPM2_VerifySignature

22.1.1 General Description
This command uses loaded keys to validate a signature on a message with the message digest passed
to the TPM.
If the signature check succeeds, then the TPM will produce a TPMT_TK_VERIFIED. Otherwise, the TPM
shall return TPM_RC_SIGNATURE.
NOTE 1

A valid ticket may be used in subsequent commands to provide proof to the TPM that the TPM has
validated the signature over the message using the key referenced by keyHandle.

If keyHandle references an asymmetric key, only the public portion of the key needs to be loaded. If
keyHandle references a symmetric key, both the public and private portions need to be loaded.
NOTE 2

The sensitive area of the symmetric object is required to allow verification of the symmetric
signature (the HMAC).

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 187
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

22.1.2 Command and Response
Table 93 — TPM2_VerifySignature Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_VerifySignature

TPMI_DH_OBJECT

keyHandle

handle of public key that will be used in the validation
Auth Index: None

TPM2B_DIGEST

digest

digest of the signed message

TPMT_SIGNATURE

signature

signature to be tested

Table 94 — TPM2_VerifySignature Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMT_TK_VERIFIED

validation

Page 188
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

22.1.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "VerifySignature_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

keyHandle does not reference a signing key

TPM_RC_SIGNATURE

signature is not genuine

TPM_RC_SCHEME

CryptVerifySignature()

TPM_RC_HANDLE
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Meaning

the input handle is not a sign key with private portion loaded

TPM_RC
TPM2_VerifySignature(
VerifySignature_In
VerifySignature_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
TPM2B_NAME
OBJECT
TPMI_RH_HIERARCHY

result;
name;
*signObject;
hierarchy;

)
{

// Input Validation
// Get sign object pointer
signObject = ObjectGet(in->keyHandle);
// The object to validate the signature must be a signing key.
if(signObject->publicArea.objectAttributes.sign != SET)
return TPM_RC_ATTRIBUTES + RC_VerifySignature_keyHandle;
// If it doesn't have a sensitive area loaded
// then it can't be a keyed hash signing key
if(
signObject->attributes.publicOnly == SET
&& signObject->publicArea.type == TPM_ALG_KEYEDHASH
)
return TPM_RC_HANDLE + RC_VerifySignature_keyHandle;
// Validate Signature. A TPM_RC_BINDING, TPM_RC_SCHEME or TPM_RC_SIGNATURE
// error may be returned by CryptCVerifySignatrue()
result = CryptVerifySignature(in->keyHandle, &in->digest, &in->signature);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_VerifySignature_signature);
// Command Output
hierarchy = ObjectGetHierarchy(in->keyHandle);
if(
hierarchy == TPM_RH_NULL
|| signObject->publicArea.nameAlg == TPM_ALG_NULL)
{
// produce empty ticket if hierarchy is TPM_RH_NULL or nameAlg is
// TPM_ALG_NULL
out->validation.tag = TPM_ST_VERIFIED;
out->validation.hierarchy = TPM_RH_NULL;
out->validation.digest.t.size = 0;
}
else
{

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 189
October 31, 2013

Part 3: Commands
50
51
52
53
54
55
56
57

Trusted Platform Module Library

// Get object name that verifies the signature
name.t.size = ObjectGetName(in->keyHandle, &name.t.name);
// Compute ticket
TicketComputeVerified(hierarchy, &in->digest, &name, &out->validation);
}
return TPM_RC_SUCCESS;
}

Page 190
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

22.2

Part 3: Commands

TPM2_Sign

22.2.1 General Description
This command causes the TPM to sign an externally provided hash with the specified asymmetric signing
key.
NOTE 1

Symmetric “signing” is done with an HMAC.

If keyHandle references a restricted signing key, then validation shall be provided indicating that the TPM
performed the hash of the data and validation shall indicate that hashed data did not start with
TPM_GENERATED_VALUE.
NOTE 2

If the hashed data did start with TPM_GENERATED_VALUE, then the validation will be a NULL
ticket.

If the scheme of keyHandle is not TPM_ALG_NULL, then inScheme shall either be the same scheme as
keyHandle or TPM_ALG_NULL.
If the scheme of keyHandle is TPM_ALG_NULL, the TPM will sign using inScheme; otherwise, it will sign
using the scheme of keyHandle.
NOTE 3

When the signing scheme requires a hash algorithm, the hash is defined in the qualifying data of the
scheme.

If inScheme is not a valid signing scheme for the type of keyHandle (or TPM_ALG_NULL), then the TPM
shall return TPM_RC_SCHEME.
If the scheme of keyHandle is an anonymous scheme, then inScheme shall have the same scheme
algorithm as keyHandle and inScheme will contain a counter value that will be used in the signing
process.
As long as it is no larger than allowed, the digest parameter is not required to have any specific size but
the signature operation may fail if digest is too large for the selected scheme.
If the validation parameter is not the Empty Buffer, then it will be checked even if the key referenced by
keyHandle is not a restricted signing key.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 191
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

22.2.2 Command and Response
Table 95 — TPM2_Sign Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Sign

TPMI_DH_OBJECT

@keyHandle

Handle of key that will perform signing
Auth Index: 1
Auth Role: USER

TPM2B_DIGEST

digest

digest to be signed

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for keyHandle is
TPM_ALG_NULL

TPMT_TK_HASHCHECK

validation

proof that digest was created by the TPM
If keyHandle is not a restricted signing key, then this
may be a NULL Ticket with tag =
TPM_ST_CHECKHASH.

Description

Table 96 — TPM2_Sign Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMT_SIGNATURE

signature

Page 192
October 31, 2013

the signature

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

22.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Sign_fp.h"
#include "Attest_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

key referenced by keHandle is not a signing key

TPM_RC_BINDING

The public and private portions of the key are not properly bound.

TPM_RC_SCHEME

inScheme is not compatible with keyHandle; both inScheme and
key's default scheme are empty; or inScheme is empty while key's
default scheme requires explicit input scheme (split signing); or nonempty default key scheme differs from inScheme

TPM_RC_TICKET

validation is not a valid ticket

TPM_RC_VALUE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Meaning

the value to sign is larger than allowed for the type of keyHandle

TPM_RC
TPM2_Sign(
Sign_In
Sign_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
TPMT_TK_HASHCHECK
OBJECT

result;
ticket;
*signKey;

)
{

// Input Validation
// Get sign key pointer
signKey = ObjectGet(in->keyHandle);
// If validation is provided, or the key is restricted, check the ticket
if(
in->validation.digest.t.size != 0
|| signKey->publicArea.objectAttributes.restricted == SET)
{
// Compute and compare ticket
TicketComputeHashCheck(in->validation.hierarchy, &in->digest, &ticket);
if(!Memory2BEqual(&in->validation.digest.b, &ticket.digest.b))
return TPM_RC_TICKET + RC_Sign_validation;
}
// Command Output
// pick a scheme for sign. If the input sign scheme is not compatible with
// the default scheme, return an error.
result = CryptSelectSignScheme(in->keyHandle, &in->inScheme);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_Sign_keyHandle;
else
return RcSafeAddToResult(result, RC_Sign_inScheme);
}
// Sign the hash. A TPM_RC_VALUE, TPM_RC_SCHEME, or TPM_RC_ATTRIBUTES
// error may be returned at this point
result = CryptSign(in->keyHandle, &in->inScheme, &in->digest, &out->signature);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 193
October 31, 2013

Part 3: Commands
45
46
47

Trusted Platform Module Library

return result;
}

Page 194
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

23

Part 3: Commands

Command Audit

23.1

Introduction

If a command has been selected for command audit, the command audit status will be updated when that
command completes successfully. The digest is updated as:

commandAuditDigestnew ≔ HauditAlg(commandAuditDigestold || cpHash || rpHash)

(5)

where

HauditAlg

hash function using the algorithm of the audit sequence

commandAuditDigest

accumulated digest

cpHash

the command parameter hash

rpHash

the response parameter hash

TPM2_Shutdown() cannot be audited but TPM2_Startup() can be audited. If the cpHash of the
TPM2_Startup() is TPM_SU_STATE, that would indicate that a TPM2_Shutdown() had been successfully
executed.
TPM2_SetCommandCodeAuditStatus() is always audited.
If the TPM is in Failure mode, command audit is not functional.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 195
October 31, 2013

Part 3: Commands

23.2

Trusted Platform Module Library

TPM2_SetCommandCodeAuditStatus

23.2.1 General Description
This command may be used by the Privacy Administrator or platform to change the audit status of a
command or to set the hash algorithm used for the audit digest, but not both at the same time.
If the auditAlg parameter is a supported hash algorithm and not the same as the current algorithm, then
the TPM will check both setList and clearList are empty (zero length). If so, then the algorithm is changed,
and the audit digest is cleared. If auditAlg is TPM_ALG_NULL or the same as the current algorithm, then
the algorithm and audit digest are unchanged and the setList and clearList will be processed.
NOTE 1

Because the audit digest is cleared, the audit counter will increment the next time that an audited
command is executed.

Use of TPM2_SetCommandCodeAuditStatus() to change the list of audited commands is an audited
event. If TPM_CC_SetCommandCodeAuditStatus is in clearList, it is ignored.
NOTE 2

Use of this command to change the audit hash algorithm is not audited and the digest is reset when
the command completes. The change in the audit hash algorithm is the evidence that this command
was used to change the algorithm.

The commands in setList indicate the commands that to be added to the list of audited commands and
the commands in clearList indicate the commands that will no longer be audited. It is not an error if a
command in setList is already audited or is not implemented. It is not an error if a command in clearList is
not currently being audited or is not implemented.
If a command code is in both setList and clearList, then it will not be audited (that is, setList shall be
processed first).

Page 196
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

23.2.2 Command and Response
Table 97 — TPM2_SetCommandCodeAuditStatus Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_SetCommandCodeAuditStatus {NV}

TPMI_RH_PROVISION

@auth

TPM_RH_ENDORSEMENT or
TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPMI_ALG_HASH+

auditAlg

hash algorithm for the audit digest; if
TPM_ALG_NULL, then the hash is not changed

TPML_CC

setList

list of commands that will be added to those that will
be audited

TPML_CC

clearList

list of commands that will no longer be audited

Table 98 — TPM2_SetCommandCodeAuditStatus Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 197
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

23.2.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

#include "InternalRoutines.h"
#include "SetCommandCodeAuditStatus_fp.h"

TPM_RC
TPM2_SetCommandCodeAuditStatus(
SetCommandCodeAuditStatus_In

*in

// IN: input parameter list

)
{
TPM_RC
UINT32
BOOL

result;
i;
changed = FALSE;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Internal Data Update
// Update hash algorithm
if(
in->auditAlg != TPM_ALG_NULL
&& in->auditAlg != gp.auditHashAlg)
{
// Can't change the algorithm and command list at the same time
if(in->setList.count != 0 || in->clearList.count != 0)
return TPM_RC_VALUE + RC_SetCommandCodeAuditStatus_auditAlg;
// Change the hash algorithm for audit
gp.auditHashAlg = in->auditAlg;
// Set the digest size to a unique value that indicates that the digest
// algorithm has been changed. The size will be cleared to zero in the
// command audit processing on exit.
gr.commandAuditDigest.t.size = 1;
// Save the change of command audit data (this sets g_updateNV so that NV
// will be updagted on exit.)
NvWriteReserved(NV_AUDIT_HASH_ALG, &gp.auditHashAlg);
} else {
// Process set list
for(i = 0; i < in->setList.count; i++)
// If change is made in CommandAuditSet, set changed flag
if(CommandAuditSet(in->setList.commandCodes[i]))
changed = TRUE;
// Process clear list
for(i = 0; i < in->clearList.count; i++)
// If change is made in CommandAuditClear, set changed flag
if(CommandAuditClear(in->clearList.commandCodes[i]))
changed = TRUE;
// if change was made to command list, update NV
if(changed)
// this sets g_updateNV so that NV will be updagted on exit.
NvWriteReserved(NV_AUDIT_COMMANDS, &gp.auditComands);

Page 198
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
61
62
63
64

Part 3: Commands

}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 199
October 31, 2013

Part 3: Commands

24

Trusted Platform Module Library

Integrity Collection (PCR)

24.1

Introduction

In TPM 1.2, an Event was hashed using SHA-1 and then the 20-octet digest was extended to a PCR
using TPM_Extend(). This specification allows the use of multiple PCR at a given Index, each using a
different hash algorithm. Rather than require that the external software generate multiple hashes of the
Event with each being extended to a different PCR, the Event data may be sent to the TPM for hashing.
This ensures that the resulting digests will properly reflect the algorithms chosen for the PCR even if the
calling software is unable to implement the hash algorithm.
NOTE 1

There is continued support for software hashing of events with TPM2_PCR_Extend().

To support recording of an Event that is larger than the TPM input buffer, the caller may use the
command sequence described in clause 1.
Change to a PCR requires authorization. The authorization may be with either an authorization value or
an authorization policy. The platform-specific specifications determine which PCR may be controlled by
policy. All other PCR are controlled by authorization.
If a PCR may be associated with a policy, then the algorithm ID of that policy determines whether the
policy is to be applied. If the algorithm ID is not TPM_ALG_NULL, then the policy digest associated with
the PCR must match the policySession→policyDigest in a policy session. If the algorithm ID is
TPM_ALG_NULL, then no policy is present and the authorization requires an EmptyAuth.
If a platform-specific specification indicates that PCR are grouped, then all the PCR in the group use the
same authorization policy or authorization value.
PcrUpdateCounter counter will be incremented on the successful completion of any command that
modifies (Extends or resets) a PCR unless the platform-specific specification explicitly excludes the PCR
from being counted.
NOTE 2

If a command causes PCR in multiple banks to change, the PCR Update Counter may be
incremented either once or once for each bank.

A platform-specific specification may designate a set of PCR that are under control of the TCB. These
PCR may not be modified without the proper authorization. Updates of these PCR shall not cause the
PCR Update Counter to increment.
EXAMPLE

Updates of the TCB PCR will not cause the PCR update counter to increment b ecause these PCR
are changed at the whim of the TCB and are not intended to represent the trust state of the platform.

Page 200
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

24.2

Part 3: Commands

TPM2_PCR_Extend

24.2.1 General Description
This command is used to cause an update to the indicated PCR. The digests parameter contains one or
more tagged digest value identified by an algorithm ID. For each digest, the PCR associated with
pcrHandle is Extended into the bank identified by the tag (hashAlg).
EXAMPLE

A SHA1 digest would be Extended into the SHA1 bank and a SHA256 digest would be Extended into
a SHA256 bank.

For each list entry, the TPM will check to see if pcrNum is implemented for that algorithm. If so, the TPM
shall perform the following operation:

PCR.digestnew [pcrNum][alg] ≔ Halg(PCR.digestold [pcrNum][alg] || data[alg].buffer))

(6)

where

Halg()

hash function using the hash algorithm associated with the PCR
instance

PCR.digest

the digest value in a PCR

pcrNum

the PCR numeric
TPM_RH_PCR0)

alg

the PCR algorithm selector for the digest

data[alg].buffer

the bank-specific data to be extended

selector

(equal

to

pcrHandle

–

If no digest value is specified for a bank, then the PCR in that bank are not modified.
NOTE 1

This allows consistent operation of the digests list for all of the Event recording commands.

If a digest is present and the PCR in that bank is not implemented, the digest value is not used.
NOTE 2

If the caller includes digests for algorithms that are not implemented, then the TPM will fail the call
because the unmarshalling of digests will fail. Each of the entries in the list is a TPMT_HA which is a
hash algorithm followed by a digest. If the algorithm is not implemented, unmarshalling of the
hashAlg will fail and the TPM will return TPM_RC_HASH.

If the TPM unmarshals the hashAlg of a list entry and the unmarshaled value is not a hash algorithm
implemented on the TPM, the TPM shall return TPM_RC_HASH.
The pcrHandle parameter is allowed to reference TPM_RH_NULL. If so, the input parameters are
processed but no action is taken by the TPM.
NOTE 3

This command allows a list of digests so that PCR in all banks may be updated in a single
command. While the semantics of this command allow multiple extends to a single PCR bank, this is
not the preferred use and the limit on the number of entries in the list make this use somewhat
impractical.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 201
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.2.2 Command and Response
Table 99 — TPM2_PCR_Extend Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_Extend {NV}

TPMI_DH_PCR+

@pcrHandle

handle of the PCR
Auth Handle: 1
Auth Role: USER

TPML_DIGEST_VALUES

digests

list of tagged digest values to be extended

Table 100 — TPM2_PCR_Extend Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 202
October 31, 2013

.

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PCR_Extend_fp.h"
Error Returns
TPM_RC_LOCALITY

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Meaning
current command locality is not allowed to extend the PCR
referenced by pcrHandle

TPM_RC
TPM2_PCR_Extend(
PCR_Extend_In

*in

// IN: input parameter list

)
{
TPM_RC
UINT32

result;
i;

// Input Validation
//
//
//
//
//
//
//

NOTE: This function assumes that the unmarshaling function for 'digests' will
have validated that all of the indicated hash algorithms are valid. If the
hash algorithms are correct, the unmarshaling code will unmarshal a digest
of the size indicated by the hash algorithm. If the overall size is not
consistent, the unmarshaling code will run out of input data or have input
data left over. In either case, it will cause an unmarshaling error and this
function will not be called.

// For NULL handle, do nothing and return success
if(in->pcrHandle == TPM_RH_NULL)
return TPM_RC_SUCCESS;
// Check if the extend operation is allowed by the current command locality
if(!PCRIsExtendAllowed(in->pcrHandle))
return TPM_RC_LOCALITY;
// If PCR is state saved and we need to update orderlyState, check NV
// availability
if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
{
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
g_clearOrderly = TRUE;
}
// Internal Data Update
// Iterate input digest list to extend
for(i = 0; i < in->digests.count; i++)
{
PCRExtend(in->pcrHandle, in->digests.digests[i].hashAlg,
CryptGetHashDigestSize(in->digests.digests[i].hashAlg),
(BYTE *) &in->digests.digests[i].digest);
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 203
October 31, 2013

Part 3: Commands

24.3

Trusted Platform Module Library

TPM2_PCR_Event

24.3.1 General Description
This command is used to cause an update to the indicated PCR.
The data in eventData is hashed using the hash algorithm associated with each bank in which the
indicated PCR has been allocated. After the data is hashed, the digests list is returned. If the pcrHandle
references an implemented PCR and not TPM_ALG_NULL, digests list is processed as in
TPM2_PCR_Extend().
A TPM shall support an Event.size of zero through 1,024 inclusive (Event.size is an octet count). An
Event.size of zero indicates that there is no data but the indicated operations will still occur,
EXAMPLE 1

If the command implements PCR[2] in a SHA1 bank and a SHA256 bank, then an extend to PCR[2]
will cause eventData to be hashed twice, once with SHA1 and once with SHA256. The SHA1 hash of
eventData will be Extended to PCR[2] in the SHA1 bank and the SHA256 hash of eventData will be
Extended to PCR[2] of the SHA256 bank.

On successful command completion, digests will contain the list of tagged digests of eventData that was
computed in preparation for extending the data into the PCR. At the option of the TPM, the list may
contain a digest for each bank, or it may only contain a digest for each bank in which pcrHandle is extant.
EXAMPLE 2

Assume a TPM that implements a SHA1 bank and a SHA256 bank and that PCR[22] is only
implemented in the SHA1 bank. If pcrHandle references PCR[22], then digests may contain either a
SHA1 and a SHA256 digest or just a SHA1 digest.

Page 204
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.3.2 Command and Response
Table 101 — TPM2_PCR_Event Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_Event {NV}

TPMI_DH_PCR+

@pcrHandle

Handle of the PCR
Auth Handle: 1
Auth Role: USER

TPM2B_EVENT

eventData

Event data in sized buffer

Table 102 — TPM2_PCR_Event Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPML_DIGEST_VALUES

digests

Family “2.0”
Level 00 Revision 00.99

.

Published
Copyright © TCG 2006-2013

Page 205
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.3.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PCR_Event_fp.h"
Error Returns
TPM_RC_LOCALITY

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Meaning
current command locality is not allowed to extend the PCR
referenced by pcrHandle

TPM_RC
TPM2_PCR_Event(
PCR_Event_In
PCR_Event_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
HASH_STATE
UINT32
UINT16

result;
hashState;
i;
size;

// Input Validation
// If a PCR extend is required
if(in->pcrHandle != TPM_RH_NULL)
{
// If the PCR is not allow to extend, return error
if(!PCRIsExtendAllowed(in->pcrHandle))
return TPM_RC_LOCALITY;
// If PCR is state saved and we need to update orderlyState, check NV
// availability
if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
{
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
g_clearOrderly = TRUE;
}
}
// Internal Data Update
out->digests.count = HASH_COUNT;
// Iterate supported PCR bank algorithms to extend
for(i = 0; i < HASH_COUNT; i++)
{
TPM_ALG_ID hash = CryptGetHashAlgByIndex(i);
out->digests.digests[i].hashAlg = hash;
size = CryptStartHash(hash, &hashState);
CryptUpdateDigest2B(&hashState, &in->eventData.b);
CryptCompleteHash(&hashState, size,
(BYTE *) &out->digests.digests[i].digest);
if(in->pcrHandle != TPM_RH_NULL)
PCRExtend(in->pcrHandle, hash, size,
(BYTE *) &out->digests.digests[i].digest);
}
return TPM_RC_SUCCESS;
}

Page 206
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

24.4

Part 3: Commands

TPM2_PCR_Read

24.4.1 General Description
This command returns the values of all PCR specified in pcrSelect.
The TPM will process the list of TPMS_PCR_SELECTION in pcrSelectionIn in order. Within each
TPMS_PCR_SELECTION, the TPM will process the bits in the pcrSelect array in ascending PCR order
(see Part 2 for definition of the PCR order). If a bit is SET, and the indicated PCR is present, then the
TPM will add the digest of the PCR to the list of values to be returned in pcrValue.
The TPM will continue processing bits until all have been processed or until pcrValues would be too large
to fit into the output buffer if additional values were added.
The returned pcrSelectionOut will have a bit SET in its pcrSelect structures for each value present in
pcrValues.
The current value of the PCR Update Counter is returned in pcrUpdateCounter.
The returned list may be empty if none of the selected PCR are implemented.
NOTE

If no PCR are returned from a bank, the selector for the bank will be present in pcrSelectionOut.

No authorization is required to read a PCR and any implemented PCR may be read from any locality.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 207
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.4.2 Command and Response
Table 103 — TPM2_PCR_Read Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_Read

TPML_PCR_SELECTION

pcrSelectionIn

The selection of PCR to read

Table 104 — TPM2_PCR_Read Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

UINT32

pcrUpdateCounter

the current value of the PCR update counter

TPML_PCR_SELECTION

pcrSelectionOut

the PCR in the returned list

TPML_DIGEST

pcrValues

the contents of the PCR indicated in pcrSelect as
tagged digests

Page 208
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.4.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include "InternalRoutines.h"
#include "PCR_Read_fp.h"

TPM_RC
TPM2_PCR_Read(
PCR_Read_In
PCR_Read_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Command Output
// Call PCR read function. input pcrSelectionIn parameter could be changed
// to reflect the actual PCR being returned
PCRRead(&in->pcrSelectionIn, &out->pcrValues, &out->pcrUpdateCounter);
out->pcrSelectionOut = in->pcrSelectionIn;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 209
October 31, 2013

Part 3: Commands

24.5

Trusted Platform Module Library

TPM2_PCR_Allocate

24.5.1 General Description
This command is used to set the desired PCR allocation of PCR and algorithms. This command requires
platformAuth.
The TPM will evaluate the request and, if sufficient memory is available for the requested allocation, the
TPM will store the allocation request for use during the next TPM2_Startup(TPM_SU_CLEAR) operation.
The PCR allocation in place when this command is executed will be retained until the next
TPM2_Startup(TPM_SU_CLEAR).
If no allocation is specified for a bank, then no PCR will be allocated to that bank. If a bank is listed more
than once, then the last selection in the pcrAllocation list is the one that the TPM will attempt to allocate.
This command shall not allocate more PCR in any bank than there are PCR attribute definitions. The
PCR attribute definitions indicate how a PCR is to be managed – if it is resettable, the locality for update,
etc. In the response to this command, the TPM returns the maximum number of PCR allowed for any
bank.
If the command is properly authorized, it will return SUCCESS even though the request fails. This is to
allow the TPM to return information about the size needed for the requested allocation and the size
available. If the sizeNeeded parameter in the return is less than or equal to the sizeAvailable parameter,
then the allocationSuccess parameter will be YES.
After this command, TPM2_Shutdown() is only allowed to have a startupType equal to TPM_SU_CLEAR.
NOTE

Even if this command does not cause the PCR allocation to change, the TPM cannot have its state
saved. This is done in order to simplify the implementation. There is no need to optimize this
command as it is not expected to be used more than once in the lifetime of the TPM (it can be used
any number of times but there is no justification for optimization) .

Page 210
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.5.2 Command and Response
Table 105 — TPM2_PCR_Allocate Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_Allocate {NV}

TPMI_RH_PLATFORM

@authHandle

TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPML_PCR_SELECTION

pcrAllocation

the requested allocation

Table 106 — TPM2_PCR_Allocate Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMI_YES_NO

allocationSuccess

YES if the allocation succeeded

UINT32

maxPCR

maximum number of PCR that may be in a bank

UINT32

sizeNeeded

number of octets required to satisfy the request

UINT32

sizeAvailable

Number of octets available. Computed before the
allocation.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 211
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.5.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#include "InternalRoutines.h"
#include "PCR_Allocate_fp.h"

TPM_RC
TPM2_PCR_Allocate(
PCR_Allocate_In
PCR_Allocate_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point.
// Note: These codes are not listed in the return values above because it is
// an implementation choice to check in this routine rather than in a common
// function that is called before these actions are called. These return values
// are described in the Response Code section of Part 3.
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Command Output
// Call PCR Allocation function.
out->allocationSuccess = PCRAllocate(&in->pcrAllocation, &out->maxPCR,
&out->sizeNeeded, &out->sizeAvailable);
// if re-configuration succeeds, set the flag to indicate PCR configuration is
// going to be changed in next boot
if(out->allocationSuccess == YES)
g_pcrReConfig = TRUE;
return TPM_RC_SUCCESS;
}

Page 212
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

24.6

Part 3: Commands

TPM2_PCR_SetAuthPolicy

24.6.1 General Description
This command is used to associate a policy with a PCR or group of PCR. The policy determines the
conditions under which a PCR may be extended or reset.
A policy may only be associated with a PCR that has been defined by a platform-specific specification as
allowing a policy. If the TPM implementation does not allow a policy for pcrNum, the TPM shall return
TPM_RC_VALUE.
A platform-specific specification may group PCR so that they share a common policy. In such case, a
pcrNum that selects any of the PCR in the group will change the policy for all PCR in the group.
The policy setting is persistent and may only be changed by TPM2_PCR_SetAuthPolicy() or by
TPM2_ChangePPS().
Before this command is first executed on a TPM or after TPM2_ChangePPS(), the access control on the
PCR will be set to the default value defined in the platform-specific specification.
NOTE 1

It is expected that the typical default will be with the policy hash set to TPM_ALG_NULL and an
Empty Buffer for the authPolicy value. This will allow an EmptyAuth to be used as the authorization
value.

If the size of the data buffer in authPolicy is not the size of a digest produced by hashAlg, the TPM shall
return TPM_RC_SIZE.
NOTE 2

If hashAlg is TPM_ALG_NULL, then the size is required to be zero.

This command requires platformAuth/platformPolicy.
NOTE 3

If the PCR is in multiple policy sets, the policy will be changed in only one set. The set that is
changed will be implementation dependent.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 213
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.6.2 Command and Response
Table 107 — TPM2_PCR_SetAuthPolicy Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_SetAuthPolicy {NV}

TPMI_RH_PLATFORM

@authHandle

TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPM2B_DIGEST

authPolicy

the desired authPolicy

TPMI_ALG_HASH+

policyDigest

the digest of the policy

TPMI_DH_PCR

pcrNum

the PCR for which the policy is to be set

Table 108 — TPM2_PCR_SetAuthPolicy Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 214
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.6.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PCR_SetAuthPolicy_fp.h"
Error Returns
TPM_RC_SIZE

size of authPolicy is not the size of a digest produced by policyDigest

TPM_RC_VALUE
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Meaning

PCR referenced by pcrNum is not a member of a PCR policy group

TPM_RC
TPM2_PCR_SetAuthPolicy(
PCR_SetAuthPolicy_In

*in

// IN: input parameter list

)
{
UINT32

groupIndex;

TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation:
// Check the authPolicy consistent with hash algorithm
if(in->authPolicy.t.size != CryptGetHashDigestSize(in->policyDigest))
return TPM_RC_SIZE + RC_PCR_SetAuthPolicy_authPolicy;
// If PCR does not belong to a policy group, return TPM_RC_VALUE
if(!PCRBelongsPolicyGroup(in->pcrNum, &groupIndex))
return TPM_RC_VALUE + RC_PCR_SetAuthPolicy_pcrNum;
// Internal Data Update
// Set PCR policy
gp.pcrPolicies.hashAlg[groupIndex] = in->policyDigest;
gp.pcrPolicies.policy[groupIndex] = in->authPolicy;
// Save new policy to NV
NvWriteReserved(NV_PCR_POLICIES, &gp.pcrPolicies);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 215
October 31, 2013

Part 3: Commands

24.7

Trusted Platform Module Library

TPM2_PCR_SetAuthValue

24.7.1 General Description
This command changes the authValue of a PCR or group of PCR.
An authValue may only be associated with a PCR that has been defined by a platform-specific
specification as allowing an authorization value. If the TPM implementation does not allow an
authorization for pcrNum, the TPM shall return TPM_RC_VALUE. A platform-specific specification may
group PCR so that they share a common authorization value. In such case, a pcrNum that selects any of
the PCR in the group will change the authValue value for all PCR in the group.
The authorization setting is set to EmptyAuth on each STARTUP(CLEAR) or by TPM2_Clear(). The
authorization setting is preserved by SHUTDOWN(STATE).

Page 216
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.7.2 Command and Response
Table 109 — TPM2_PCR_SetAuthValue Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_SetAuthValue

TPMI_DH_PCR

@pcrHandle

handle for a PCR that may have an authorization value
set
Auth Index: 1
Auth Role: USER

TPM2B_DIGEST

auth

the desired authorization value

Table 110 — TPM2_PCR_SetAuthValue Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 217
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.7.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PCR_SetAuthValue_fp.h"
Error Returns
TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

Meaning
PCR referenced by pcrHandle is not a member of a PCR
authorization group

TPM_RC
TPM2_PCR_SetAuthValue(
PCR_SetAuthValue_In

*in

// IN: input parameter list

)
{
UINT32
TPM_RC

groupIndex;
result;

// Input Validation:
// If PCR does not belong to an auth group, return TPM_RC_VALUE
if(!PCRBelongsAuthGroup(in->pcrHandle, &groupIndex))
return TPM_RC_VALUE;
// The command may cause the orderlyState to be cleared due to the update of
// state clear data. If this is the case, Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
if(gp.orderlyState != SHUTDOWN_NONE)
{
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
g_clearOrderly = TRUE;
}
// Internal Data Update
// Set PCR authValue
gc.pcrAuthValues.auth[groupIndex] = in->auth;
return TPM_RC_SUCCESS;
}

Page 218
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

24.8

Part 3: Commands

TPM2_PCR_Reset

24.8.1 General Description
If the attribute of a PCR allows the PCR to be reset and proper authorization is provided, then this
command may be used to set the PCR to zero. The attributes of the PCR may restrict the locality that can
perform the reset operation.
NOTE 1

The definition of TPMI_DH_PCR in Part 2 indicates that if pcrHandle is out of the allowed range for
PCR, then the appropriate return value is TPM_RC_VALUE.

If pcrHandle references a PCR that cannot be reset, the TPM shall return TPM_RC_LOCALITY.
NOTE 2

TPM_RC_LOCALITY is returned because the reset attributes are defined on a per -locality basis.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 219
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.8.2 Command and Response
Table 111 — TPM2_PCR_Reset Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PCR_Reset {NV}

TPMI_DH_PCR

@pcrHandle

the PCR to reset
Auth Index: 1
Auth Role: USER

Table 112 — TPM2_PCR_Reset Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 220
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.8.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PCR_Reset_fp.h"
Error Returns
TPM_RC_LOCALITY

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

Meaning
current command locality is not allowed to reset the PCR referenced
by pcrHandle

TPM_RC
TPM2_PCR_Reset(
PCR_Reset_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// Input Validation
// Check if the reset operation is allowed by the current command locality
if(!PCRIsResetAllowed(in->pcrHandle))
return TPM_RC_LOCALITY;
// If PCR is state saved and we need to update orderlyState, check NV
// availability
if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
{
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
g_clearOrderly = TRUE;
}
// Internal Data Update
// Reset seleccted PCR in all banks to 0
PCRSetValue(in->pcrHandle, 0);
// Indicate that the PCR changed so that pcrCounter will be incremented if
// necessary.
PCRChanged(in->pcrHandle);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 221
October 31, 2013

Part 3: Commands

24.9

Trusted Platform Module Library

_TPM_Hash_Start

24.9.1 Description
This indication from the TPM interface indicates the start of a dynamic Core Root of Trust for
Measurement (D-CRTM) measurement sequence. On receipt of this indication, the TPM will initialize an
Event sequence context.
If no object memory is available for creation of the sequence context, the TPM will flush the context of an
object so that creation of the Event sequence context will always succeed.
A platform-specific specification may allow this indication before TPM2_Startup().
NOTE

If this indication occurs after TPM2_Startup(), it is the responsibility of software to ensure that an
object context slot is available or to deal with the consequences of having the TPM select an
arbitrary object to be flushed. If this indication occurs before TPM2_Startup() then all context slots
are available.

Page 222
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

24.9.2 Detailed Actions
1

#include "InternalRoutines.h"

This function is called to process a _TPM_Hash_Start() indication.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

void
_TPM_Hash_Start(void)
{
TPM_RC
TPMI_DH_OBJECT

result;
handle;

// If a DRTM sequence object exists, terminate it.
if(g_DRTMHandle != TPM_RH_UNASSIGNED)
ObjectTerminateEvent();
// Create an event sequence object and store the handle in global
// g_DRTMHandle. A TPM_RC_OBJECT_MEMORY error may be returned at this point
// The null value for the 'auth' parameter will cause the sequence structure to
// be allocated without being set as present. This keeps the sequence from
// being left behind if the sequence is terminated early.
result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
// If a free slot was not available, then free up a slot.
if(result != TPM_RC_SUCCESS)
{
// An implementation does not need to have a fixed relationship between
// slot numbers and handle numbers. To handle the general case, scan for
// a handle that is assigned an free it for the DRTM sequence.
// In the reference implementation, the relationship between handles and
// slots is fixed. So, if the call to ObjectCreateEvenSequence()
// failed indicating that all slots are occupied, then the first handle we
// are going to check (TRANSIENT_FIRST) will be occupied. It will be freed
// so that it can be assigned for use as the DRTM sequence object.
for(handle = TRANSIENT_FIRST; handle < TRANSIENT_LAST; handle++)
{
// try to flush the first object
if(ObjectIsPresent(handle))
break;
}
// If the first call to find a slot fails but none of the slots is occupied
// then there's a big problem
pAssert(handle < TRANSIENT_LAST);
// Free the slot
ObjectFlush(handle);
// Try to create an event sequence object again. This time, we must
// succeed.
result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
pAssert(result == TPM_RC_SUCCESS);
}
return;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 223
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.10 _TPM_Hash_Data
24.10.1

Description

This indication from the TPM interface indicates arrival of one or more octets of data that are to be
included in the Core Root of Trust for Measurement (CRTM) sequence context created by the
_TPM_Hash_Start indication. The context holds data for each hash algorithm for each PCR bank
implemented on the TPM.
If no DRTM Event Sequence context exists, this indication is discarded and no other action is performed.

Page 224
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

24.10.2
1
2

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "Platform.h"

This function is called to process a _TPM_Hash_Data() indication.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

void
_TPM_Hash_Data(
UINT32
BYTE

dataSize,
*data

UINT32
HASH_OBJECT

// IN: size of data to be extend
// IN: data buffer

i;
*hashObject;

)
{

// If there is no DRTM sequence object, then _TPM_Hash_Start
// was not called so this function returns without doing
// anything.
if(g_DRTMHandle == TPM_RH_UNASSIGNED)
return;
hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
pAssert(hashObject->attributes.eventSeq);
// For each of the implemented hash algorithms, update the digest with the
// data provided. NOTE: the implementation could be done such that the TPM
// only computes the hash for the banks that contain the DRTM PCR.
for(i = 0; i < HASH_COUNT; i++)
{
// Update sequence object
CryptUpdateDigest(&hashObject->state.hashState[i], dataSize, data);
}
return;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 225
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

24.11 _TPM_Hash_End
24.11.1

Description

This indication from the TPM interface indicates the end of the CRTM measurement. This indication is
discarded and no other action performed if the TPM does not contain a CRTM Event sequence context.
NOTE

A CRTM Event Sequence context is created by _TPM_Hash_Start().

If the CRTM Event sequence occurs after TPM2_Startup(), the TPM will set all of the PCR designated in
the platform-specific specifications as resettable by this event to the value indicated in the platform
specific specification, and increment restartCount. The TPM will then Extend the Event Sequence
digest/digests into the designated, DRTM PCR.
PCR[DRTM][hashAlg] ≔ HhashAlg (initial_value || HhashAlg (hash_data))

(7)

where
DRTM

index for CRTM PCR designated by a platform-specific
specification

hashAlg

hash algorithm associated with a bank of PCR

initial_value

initialization value specified in the platform-specific specification
(should be 0…0)

hash_data

all the octets of data received in _TPM_Hash_Data indications

A _TPM_Hash_End indication that occurs after TPM2_Startup() will increment pcrUpdateCounter unless
a platform-specific specification excludes modifications of PCR[DRTM] from causing an increment.
A platform-specific specification may allow an H-CRTM Event Sequence before TPM2_Startup(). If so,
_TPM_Hash_End will complete the digest, initialize PCR[0] with a digest-size value of 4, and then extend
the H-CRTM Event Sequence data into PCR[0].
PCR[0][hashAlg] ≔ HhashAlg (0…04 || HhashAlg (hash_data))
NOTE

(8)

The entire sequence of _TPM_Hash_Start, _TPM_Hash_Data, and _TPM_Hash_End are required to
complete before TPM2_Startup() or the sequence will have no effect on the TPM.

Page 226
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

24.11.2
1

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"

This function is called to process a _TPM_Hash_End() indication.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

void
_TPM_Hash_End(void)
{
UINT32
TPM2B_DIGEST
HASH_OBJECT
TPMI_DH_PCR

i;
digest;
*hashObject;
pcrHandle;

// If the DRTM handle is not being used, then either _TPM_Hash_Start has not
// been called, _TPM_Hash_End was previously called, or some other command
// was executed and the sequence was aborted.
if(g_DRTMHandle == TPM_RH_UNASSIGNED)
return;
// Get DRTM sequence object
hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
// Is this _TPM_Hash_End after Startup or before
if(TPMIsStarted())
{
// After
// Reset the DRTM PCR
PCRResetDynamics();
// Extend the DRTM_PCR.
pcrHandle = PCR_FIRST + DRTM_PCR;
// DRTM sequence increments restartCount
gr.restartCount++;
}
else
{
pcrHandle = PCR_FIRST + HCRTM_PCR;
}
// Complete hash and extend PCR, or if this is an HCRTM, complete
// the hash and write the PCR
for(i = 0; i < HASH_COUNT; i++)
{
TPMI_ALG_HASH
hash = CryptGetHashAlgByIndex(i);
// Complete hash
digest.t.size = CryptGetHashDigestSize(hash);
CryptCompleteHash2B(&hashObject->state.hashState[i], &digest.b);
// If this is DRTM, extend to zeroed PCR
// If this is H-DRTM, copy to HCRM PCR
if(TPMIsStarted())
// Extend PCR
PCRExtend(pcrHandle, hash, digest.t.size, digest.t.buffer);
else
PcrWrite(pcrHandle, hash, &digest);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 227
October 31, 2013

Part 3: Commands
58
59
60
61
62
63
64
65
66
67
68

Trusted Platform Module Library

}
// Flush sequence object.
ObjectFlush(g_DRTMHandle);
g_DRTMHandle = TPM_RH_UNASSIGNED;
g_DrtmPreStartup = TRUE;
return;
}

Page 228
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25

Part 3: Commands

Enhanced Authorization (EA) Commands

25.1

Introduction

The commands in this clause 1 are used for policy evaluation. When successful, each command will
update the policySession→policyDigest in a policy session context in order to establish that the
authorizations required to use an object have been provided. Many of the commands will also modify
other parts of a policy context so that the caller may constrain the scope of the authorization that is
provided.
NOTE 1

Many of the terms used in this clause are described in detail i n Part 1 and are not redefined in this
clause.

The policySession parameter of the command is the handle of the policy session context to be modified
by the command.
If the policySession parameter indicates a trial policy session, then the policySession→policyDigest will
be updated and the indicated validations are not performed.
NOTE 2

A policy session is a trial policy by TPM2_StartAuthSession( sessionType = TPM_SE_TRIAL).

NOTE 3

Unless there is an unmarshaling error in the parameters of the command, these commands will
return TPM_RC_SUCCESS when policySession references a trial session.

NOTE 4

Policy context other than the policySession→policyDigest may be updated for a trial policy but it is
not required.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 229
October 31, 2013

Part 3: Commands

25.2

Trusted Platform Module Library

Signed Authorization Actions

25.2.1 Introduction
The TPM2_PolicySigned, TPM_PolicySecret, and TPM2_PolicyTicket commands use many of the same
functions. This clause consolidates those functions to simplify the document and to ensure uniformity of
the operations.
25.2.2 Policy Parameter Checks
These parameter checks will be performed when indicated in the description of each of the commands:
a) nonceTPM – If this parameter is not the Empty Buffer, and
policySession→nonceTPM, then the TPM shall return TPM_RC_VALUE.

it

does

not

match

b) expiration – If this parameter is not zero, then its absolute value is compared to the time in seconds
since the policySession→nonceTPM was generated. If more time has passed than indicted in
expiration, the TPM shall return TPM_RC_EXPIRED. If nonceTPM is the Empty buffer, and expiration
is non-zero, then the TPM shall return TPM_RC_EXPIRED.
c) timeout – This parameter is compared to the current TPM time. If policySession→timeout is in the
past, then the TPM shall return TPM_RC_EXPIRED.
NOTE 1

The expiration parameter is present in the TPM2_PolicySigned and TPM2_PolicySecret
command and timeout is the analogous parameter in the TPM2_PolicyTicket command.

d) cpHashA – If this parameter is not an Empty Buffer
NOTE 2

CpHashA is the hash of the command to be executed using this policy session in the
authorization. The algorithm used to compute this hash is required to be the algorithm of the
policy session.

1) the TPM shall return TPM_RC_CPHASH if policySession→cpHash does not have its default
value or the contents of policySession→cpHash are not the same as cpHashA; or
NOTE 3

CpHash is the expected cpHash value held in the policy session context.

2) the TPM shall return TPM_RC_SIZE
policySession→policyDigest.
NOTE 4

Page 230
October 31, 2013

if

cpHashA

is

not

the

same

size

as

PolicySession→policyDigest is the size of the digest produced by the hash algorithm used to
compute policyDigest.

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.2.3 PolicyDigest Update Function (PolicyUpdate())
This is the update process for policySession→policyDigest used by TPM2_PolicySigned(),
TPM2_PolicySecret(), TPM2_PolicyTicket(), and TPM2_PolicyAuthorize(). The function prototype for the
update function is:

PolicyUpdate(commandCode, arg2, arg3)

(9)

where

arg2

a TPM2B_NAME

arg3

a TPM2B

These parameters are used to update policySession→policyDigest by

policyDigestnew ≔ HpolicyAlg(policyDigestold || commandCode || arg2.name)

(10)

policyDigestnew+1 ≔ HpolicyAlg(policyDigestnew || arg3.buffer)

(11)

followed by

where

HpolicyAlg()

the hash algorithm chosen when the policy session was started

NOTE 1

If arg3 is a TPM2B_NAME, then arg3.buffer will actually be an arg3.name.

NOTE 2

The arg2.size and arg3.size fields are not included in the hashes.

NOTE 3

PolicyUpdate() uses two hashes because arg2 and arg3 are variable-sized and the concatenation of
arg2 and arg3 in a single hash could produce the same digest even though arg2 and arg3 are
different. Processing of the arguments separately in different Extend operation insures that the
digest produced by PolicyUpdate() will be different if arg2 and arg3 are different.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 231
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.2.4 Policy Context Updates
When a policy command modifies some part of the policy session context other than the
policySession→policyDigest, the following rules apply.


cpHash – this parameter may only be changed if it contains its initialization value (an Empty String).
If cpHash is not the Empty String when a policy command attempts to update it, the TPM will return
an error (TPM_RC_CPHASH) if the current and update values are not the same.



timeOut – this parameter may only be changed to a smaller value. If a command attempts to update
this value with a larger value (longer into the future), the TPM will discard the update value. This is
not an error condition.



commandCode – once set by a policy command, this value may not be change except by
TPM2_PolicyRestart(). If a policy command tries to change this to a different value, an error is
returned (TPM_RC_POLICY_CC).



pcrUpdateCounter – this parameter is updated by TPM2_PolicyPCR(). This value may only be set
once during a policy. Each time TPM2_PolicyPCR() executes, it checks to see if
policySession→pcrUpdateCounter has its default state indicating that this is the first
TPM2_PolicyPCR(). If it has its default value, then policySession→pcrUpdateCounter is set to the
current value of pcrUpdateCounter. If policySession→pcrUpdateCounter does not have its default
value and its value is not the same as pcrUpdateCounter, the TPM shall return
TPM_RC_PCR_CHANGED.
NOTE

If this parameter and pcrUpdateCounter are not the same, it indicates that PCR have changed
since checked by the previous TPM2_PolicyPCR(). Since they have changed, the previous PCR
validation is no longer valid.



commandLocality – this parameter is the logical AND of all enabled localities. All localities are
enabled for a policy when the policy session is created. TPM2_PolicyLocalities() selectively disables
localities. Once use of a policy for a locality has been disabled, it cannot be enabled except by
TPM2_PolicyRestart().



isPPRequired – once SET, this parameter may only be CLEARed by TPM2_PolicyRestart().



isAuthValueNeeded – once SET, this parameter may only be CLEARed by TPM2_PolicyPassword()
or TPM2_PolicyRestart().



isPasswordNeeded – once SET, this parameter may only be CLEARed by TPM2_PolicyAuthValue()
or TPM2_PolicyRestart(),

NOTE

Both TPM2_PolicyAuthValue() and TPM2_PolicyPassword() change policySession→policyDigest in
the same way. The different commands simply indicate to the TPM the format used for the authValue
(HMAC or clear text). Both commands could be in the same policy. The final instance of these
commands determines the format.

Page 232
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.2.5 Policy Ticket Creation
If for TPM2_PolicySigned() or TPM2_PolicySecret() the caller specified a negative value for expiration,
and the policy update succeeds, then the TPM will return a ticket that includes a value indicating when
the authorization expires. The required computation for the digest in the authorization ticket is:

HMAC(proof, HpolicyAlg(ticketType || timeout || cpHashA || policyRef || authObject→Name)) (12)
where

proof

secret associated with the storage primary seed (SPS) of the
TPM

HpolicyAlg

hash function using the hash algorithm associated with the policy
session

ticketType

either TPM_ST_AUTH_SECRET or TPM_ST_AUTH_SIGNED,
used to indicate type of the ticket

NOTE 1

If
the
ticket
is
produced
by
TPM2_PolicySecret()
then
ticketType
is
TPM_ST_AUTH_SECRET and if produced by TPM2_PolicySigned() then ticketType is
TPM_ST_AUTH_SIGNED.

timeout

NOTE 2

implementation-specific representation of the expiration time of
the ticket; required to be the implementation equivalent of
policySession→startTime plus the absolute value of expiration
Timeout is not the same as expiration. The expiration value in the aHash is a relative time,
using the creation time of the authorization session (TPM2_StartAuthSession()) as its
reference. The timeout parameter is an absolute time, using TPM Clock as the reference.

cpHashA

the command parameter digest for the command being
authorized; computed using the hash algorithm of the policy
session

policyRef

the commands that use this function have a policyRef parameter
and the value of that parameter is used here

authObject→Name

Name associated with the authObject parameter

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 233
October 31, 2013

Part 3: Commands
25.3

Trusted Platform Module Library

TPM2_PolicySigned

25.3.1 General Description
This command includes a signed authorization in a policy. The command ties the policy to a signing key
by including the Name of the signing key in the policyDigest
If policySession is a trial session, the TPM will not check the signature and will update
policySession→policyDigest as described in 25.2.3 as if a properly signed authorization was received; but
no ticket will be produced.
If policySession is not a trial session, the TPM will validate auth and only perform the update if it is a valid
signature over the fields of the command.
The authorizing object will sign a digest of the authorization qualifiers: nonceTPM, expiration, cpHashA,
and policyRef. The digest is computed as:

aHash ≔ HauthAlg(nonceTPM || expiration || cpHashA || policyRef)

(13)

where

HauthAlg()
NOTE 1

the hash associated with the auth parameter of this command
Each signature and key combination indicates the scheme and each scheme has an
associated hash.

nonceTPM

the nonceTPM parameter from the TPM2_StartAuthSession()
response. If the authorization is not limited to this session, the
size of this value is zero.

expiration

time limit on authorization set by authorizing object. This 32-bit
value is set to zero if the expiration time is not being set.

cpHashA

digest of the command parameters for the command being
approved using the hash algorithm of the policy session. Set to
an EmptyAuth if the authorization is not limited to a specific
command.

NOTE 2

This is not the cpHash of this TPM2_PolicySigned() command.

policyRef
EXAMPLE

an opaque value determined by the authorizing entity. Set to the
Empty Buffer if no value is present.

The computation for an aHash if there are no restrictions is:

aHash ≔ HauthAlg(00 00 00 0016)
which is the hash of an expiration time of zero.

The aHash is signed by the private key associated with key. The signature and signing parameters are
combined to create the auth parameter.
The TPM will perform the parameter checks listed in 25.2.2
If the parameter checks succeed, the TPM will construct a test digest (tHash) over the provided
parameters using the same formulation a shown in equation (13) above.
If tHash does not match the digest of the signed aHash, then the authorization fails and the TPM shall
return TPM_RC_POLICY_FAIL and make no change to policySession→policyDigest.

Page 234
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

When all validations have succeeded, policySession→policyDigest is updated by PolicyUpdate() (see
25.2.3).

PolicyUpdate(TPM_CC_PolicySigned, authObject→Name, policyRef)

(14)

If the cpHashA parameter is not an Empty Buffer, it is copied to policySession→cpHash.
The TPM will optionally produce a ticket as described in 25.2.5.
Authorization to use authObject is not required.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 235
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.3.2 Command and Response
Table 113 — TPM2_PolicySigned Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicySigned

TPMI_DH_OBJECT

authObject

handle for a public key that will validate the signature
Auth Index: None

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_NONCE

nonceTPM

the policy nonce for the session
If the nonce is not included in the authorization
qualification, this field is the Empty Buffer.

TPM2B_DIGEST

cpHashA

digest of the command parameters to which this
authorization is limited
This is not the cpHash for this command but the cpHash
for the command to which this policy session will be
applied. If it is not limited, the parameter will be the
Empty Buffer.

TPM2B_NONCE

policyRef

a reference to a policy relating to the authorization –
may be the Empty Buffer
Size is limited to be no larger than the nonce size
supported on the TPM.

INT32

expiration

time when authorization will expire, measured in
seconds from the time that nonceTPM was generated
If expiration is zero, a NULL Ticket is returned.

TPMT_SIGNATURE

auth

signed authorization (not optional)

Description

Table 114 — TPM2_PolicySigned Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_TIMEOUT

timeout

TPMT_TK_AUTH

policyTicket

Page 236
October 31, 2013

implementation-specific time value, used to indicate to
the TPM when the ticket expires
NOTE

If policyTicket is a NULL Ticket, then this shall be
the Empty Buffer.

produced if the command succeeds and expiration in
the command was non-zero; this ticket will use the
TPMT_ST_AUTH_SIGNED structure tag

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "Policy_spt_fp.h"
#include "PolicySigned_fp.h"
Error Returns
TPM_RC_CPHASH

cpHash was previously set to a different value

TPM_RC_EXPIRED

expiration indicates a time in the past or expiration is non-zero but no
nonceTPM is present

TPM_RC_HANDLE

authObject need to have sensitive portion loaded

TPM_RC_KEY

authObject is not a signing scheme

TPM_RC_NONCE

nonceTPM is not the nonce associated with the policySession

TPM_RC_SCHEME

the signing scheme of auth is not supported by the TPM

TPM_RC_SIGNATURE

the signature is not genuine

TPM_RC_SIZE

input cpHash has wrong size

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

Meaning

input policyID or expiration does not match the internal data in policy
session

TPM_RC
TPM2_PolicySigned(
PolicySigned_In
PolicySigned_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
SESSION
OBJECT
TPM2B_NAME
TPM2B_DIGEST
HASH_STATE
UINT32

result = TPM_RC_SUCCESS;
*session;
*authObject;
entityName;
authHash;
hashState;
expiration = (in->expiration < 0)
? -(in->expiration) : in->expiration;
authTimeout = 0;

)
{

UINT64
// Input Validation

// Set up local pointers
session = SessionGet(in->policySession);
authObject = ObjectGet(in->authObject);

// the session structure
// pointer for the object
//
providing authorization
//
signature

// Only do input validation if this is not a trial policy session
if(session->attributes.isTrialPolicy == CLEAR)
{
if(expiration != 0)
authTimeout = expiration * 1000 + session->startTime;
result = PolicyParameterChecks(session, authTimeout,
&in->cpHashA, &in->nonceTPM,
RC_PolicySigned_nonceTPM,
RC_PolicySigned_cpHashA,
RC_PolicySigned_expiration);
if(result != TPM_RC_SUCCESS)

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 237
October 31, 2013

Part 3: Commands
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

Trusted Platform Module Library

return result;
// Re-compute the digest being signed
/*(See part 3 specification)
// The digest is computed as:
//
aHash := hash ( nonceTPM | expiration | cpHashA | policyRef)
// where:
//
hash()
the hash associated with the signed auth
//
nonceTPM
the nonceTPM value from the TPM2_StartAuthSession .
//
response If the authorization is not limited to this
//
session, the size of this value is zero.
//
expiration time limit on authorization set by authorizing object.
//
This 32-bit value is set to zero if the expiration
//
time is not being set.
//
cpHashA
hash of the command parameters for the command being
//
approved using the hash algorithm of the PSAP session.
//
Set to NULLauth if the authorization is not limited
//
to a specific command.
//
policyRef
hash of an opaque value determined by the authorizing
//
object. Set to the NULLdigest if no hash is present.
*/
// Start hash
authHash.t.size = CryptStartHash(CryptGetSignHashAlg(&in->auth),
&hashState);
// add nonceTPM
CryptUpdateDigest2B(&hashState, &in->nonceTPM.b);
// add expiration
CryptUpdateDigestInt(&hashState, sizeof(UINT32), (BYTE*) &in->expiration);
// add cpHashA
CryptUpdateDigest2B(&hashState, &in->cpHashA.b);
// add policyRef
CryptUpdateDigest2B(&hashState, &in->policyRef.b);
// Complete digest
CryptCompleteHash2B(&hashState, &authHash.b);
// Validate Signature. A TPM_RC_SCHEME, TPM_RC_TYPE or TPM_RC_SIGNATURE
// error may be returned at this point
result = CryptVerifySignature(in->authObject, &authHash, &in->auth);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_PolicySigned_auth);
}
// Internal Data Update
// Need the Name of the signing entity
entityName.t.size = EntityGetName(in->authObject, &entityName.t.name);
// Update policy with input policyRef and name of auth key
// These values are updated even if the session is a trial session
PolicyContextUpdate(TPM_CC_PolicySigned, &entityName, &in->policyRef,
&in->cpHashA, authTimeout, session);
// Command Output
// Create ticket and timeout buffer if in->expiration < 0 and this is not
// a trial session.
// NOTE: PolicyParameterChecks() makes sure that nonceTPM is present
// when expiration is non-zero.
if(
in->expiration < 0
&& session->attributes.isTrialPolicy == CLEAR
)

Page 238
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

Part 3: Commands

{
// Generate timeout buffer. The format of output timeout buffer is
// TPM-specific.
// Note: can't do a direct copy because the output buffer is a byte
// array and it may not be aligned to accept a 64-bit value. The method
// used has the side-effect of making the returned value a big-endian,
// 64-bit value that is byte aligned.
out->timeout.t.size = sizeof(UINT64);
UINT64_TO_BYTE_ARRAY(authTimeout, out->timeout.t.buffer);
// Compute policy ticket
TicketComputeAuth(TPM_ST_AUTH_SIGNED, EntityGetHierarchy(in->authObject),
authTimeout, &in->cpHashA, &in->policyRef, &entityName,
&out->policyTicket);
}
else
{
// Generate a null ticket.
// timeout buffer is null
out->timeout.t.size = 0;
// auth ticket is null
out->policyTicket.tag = TPM_ST_AUTH_SIGNED;
out->policyTicket.hierarchy = TPM_RH_NULL;
out->policyTicket.digest.t.size = 0;
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 239
October 31, 2013

Part 3: Commands

25.4

Trusted Platform Module Library

TPM2_PolicySecret

25.4.1 General Description
This command includes a secret-based authorization to a policy. The caller proves knowledge of the
secret value using an authorization session using the authValue associated with authHandle. A
password session, an HMAC session, or a policy session containing TPM2_PolicyAuthValue() or
TPM2_PolicyPassword() will satisfy this requirement.
“If a policy session is used and use of the authValue of authHandle is not required, the TPM will return
TPM_RC_MODE.”
The secret is the authValue of authObject, which may be any TPM entity with a handle and an associated
authValue. This includes the reserved handles (for example, Platform, Storage, and Endorsement), NV
Indexes, and loaded objects.
NOTE 1

The authorization value for a hierarchy cannot be used in th is command if the hierarchy is disabled.

If the authorization check fails, then the normal dictionary attack logic is invoked.
If the authorization provided by the authorization session is valid, the command parameters are checked
as described in 25.2.2.
When all validations have succeeded, policySession→policyDigest is updated by PolicyUpdate() (see
25.2.3).

PolicyUpdate(TPM_CC_PolicySecret, authObject→Name, policyRef)

(15)

If the cpHashA command parameter is not an Empty Buffer, it is copied to cpHash in the session context.
The TPM will optionally produce a ticket as described in 25.2.5.
If the session is a trial session, policySession→policyDigest is updated as if the authorization is valid but
no check is performed.
NOTE 2

If an HMAC is used to convey the authorization, a separate session is needed for the authorization.
Because the HMAC in that authorization will include a nonce that prevents replay of the
authorization, the value of the nonceTPM parameter in this command is limited. It is retained mostly
to provide processing consistency with TPM2_PolicySigned().

Page 240
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.4.2 Command and Response
Table 115 — TPM2_PolicySecret Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

see clause 8

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicySecret

TPMI_DH_ENTITY

@authHandle

handle for an entity providing the authorization
Auth Index: 1
Auth Role: USER

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_NONCE

nonceTPM

the policy nonce for the session
If the nonce is not included in the authorization
qualification, this field is the Empty Buffer.

TPM2B_DIGEST

cpHashA

digest of the command parameters to which this
authorization is limited
This not the cpHash for this command but the cpHash
for the command to which this policy session will be
applied. If it is not limited, the parameter will be the
Empty Buffer.

TPM2B_NONCE

policyRef

a reference to a policy relating to the authorization –
may be the Empty Buffer
Size is limited to be no larger than the nonce size
supported on the TPM.

INT32

expiration

time when authorization will expire, measured in
seconds from the time that nonceTPM was generated
If expiration is zero, a NULL Ticket is returned.

Table 116 — TPM2_PolicySecret Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_TIMEOUT

timeout

implementation-specific time value used to indicate to
the TPM when the ticket expires; this ticket will use the
TPMT_ST_AUTH_SECRET structure tag

TPMT_TK_AUTH

policyTicket

produced if the command succeeds and expiration in
the command was non-zero

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 241
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.4.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "PolicySecret_fp.h"
#include "Policy_spt_fp.h"
Error Returns
TPM_RC_CPHASH

cpHash for policy was previously set to a value that is not the same
as cpHashA

TPM_RC_EXPIRED

expiration indicates a time in the past

TPM_RC_NONCE

nonceTPM does not match the nonce associated with policySession

TPM_RC_SIZE

cpHashA is not the size of a digest for the hash associated with
policySession

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Meaning

input policyID or expiration does not match the internal data in policy
session

TPM_RC
TPM2_PolicySecret(
PolicySecret_In
PolicySecret_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

TPM_RC
SESSION
TPM2B_NAME
UINT32

result;
*session;
entityName;
expiration = (in->expiration < 0)
? -(in->expiration) : in->expiration;
authTimeout = 0;

)
{

UINT64
// Input Validation

// Get pointer to the session structure
session = SessionGet(in->policySession);
//Only do input validation if this is not a trial policy session
if(session->attributes.isTrialPolicy == CLEAR)
{
if(expiration != 0)
authTimeout = expiration * 1000 + session->startTime;
result = PolicyParameterChecks(session, authTimeout,
&in->cpHashA, &in->nonceTPM,
RC_PolicySecret_nonceTPM,
RC_PolicySecret_cpHashA,
RC_PolicySecret_expiration);
if(result != TPM_RC_SUCCESS)
return result;
}
// Internal Data Update
// Need the name of the authorizing entity
entityName.t.size = EntityGetName(in->authHandle, &entityName.t.name);
// Update policy context with input policyRef and name of auth key
// This value is computed even for trial sessions. Possibly update the cpHash
PolicyContextUpdate(TPM_CC_PolicySecret, &entityName, &in->policyRef,

Page 242
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

Part 3: Commands

&in->cpHashA, authTimeout, session);
// Command Output
// Create ticket and timeout buffer if in->expiration < 0 and this is not
// a trial session.
// NOTE: PolicyParameterChecks() makes sure that nonceTPM is present
// when expiration is non-zero.
if(
in->expiration < 0
&& session->attributes.isTrialPolicy == CLEAR
)
{
// Generate timeout buffer. The format of output timeout buffer is
// TPM-specific.
// Note: can't do a direct copy because the output buffer is a byte
// array and it may not be aligned to accept a 64-bit value. The method
// used has the side-effect of making the returned value a big-endian,
// 64-bit value that is byte aligned.
out->timeout.t.size = sizeof(UINT64);
UINT64_TO_BYTE_ARRAY(authTimeout, out->timeout.t.buffer);
// Compute policy ticket
TicketComputeAuth(TPM_ST_AUTH_SECRET, EntityGetHierarchy(in->authHandle),
authTimeout, &in->cpHashA, &in->policyRef,
&entityName, &out->policyTicket);
}
else
{
// timeout buffer is null
out->timeout.t.size = 0;
// auth ticket is null
out->policyTicket.tag = TPM_ST_AUTH_SECRET;
out->policyTicket.hierarchy = TPM_RH_NULL;
out->policyTicket.digest.t.size = 0;
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 243
October 31, 2013

Part 3: Commands

25.5

Trusted Platform Module Library

TPM2_PolicyTicket

25.5.1 General Description
This command is similar to TPM2_PolicySigned() except that it takes a ticket instead of a signed
authorization. The ticket represents a validated authorization that had an expiration time associated with
it.
The parameters of this command are checked as described in 25.2.2.
If the checks succeed, the TPM uses the timeout, cpHashA, policyRef, and keyName to construct a ticket
to compare with the value in ticket. If these tickets match, then the TPM will create a TPM2B_NAME
(objectName) using authName and update the context of policySession by PolicyUpdate() (see 25.2.3).

PolicyUpdate(commandCode, authName, policyRef)

(16)

If the structure tag of ticket is TPM_ST_AUTH_SECRET, then commandCode will be
TPM_CC_PolicySecret. If the structure tag of ticket is TPM_ST_AUTH_SIGNED, then commandCode will
be TPM_CC_PolicySIgned.
If the cpHashA command parameter is not an Empty Buffer, it may be copied to cpHash in the session
context.as described in 25.2.1.

Page 244
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.5.2 Command and Response
Table 117 — TPM2_PolicyTicket Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

see clause 8

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyTicket

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_TIMEOUT

timeout

time when authorization will expire
The contents are TPM specific. This shall be the value
returned when ticket was produced.

TPM2B_DIGEST

cpHashA

digest of the command parameters to which this
authorization is limited
If it is not limited, the parameter will be the Empty
Buffer.

TPM2B_NONCE

policyRef

reference to a qualifier for the policy – may be the
Empty Buffer

TPM2B_NAME

authName

name of the object that provided the authorization

TPMT_TK_AUTH

ticket

an authorization ticket returned by the TPM in response
to a TPM2_PolicySigned() or TPM2_PolicySecret()

Table 118 — TPM2_PolicyTicket Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 245
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.5.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "PolicyTicket_fp.h"
#include "Policy_spt_fp.h"
Error Returns
TPM_RC_CPHASH

policy's cpHash was previously set to a different value

TPM_RC_EXPIRED

timeout value in the ticket is in the past and the ticket has expired

TPM_RC_SIZE

timeout or cpHash has invalid size for the

TPM_RC_TICKET
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Meaning

ticket is not valid

TPM_RC
TPM2_PolicyTicket(
PolicyTicket_In

*in

// IN: input parameter list

TPM_RC
SESSION
UINT64
TPMT_TK_AUTH
TPM_CC

result;
*session;
timeout;
ticketToCompare;
commandCode = TPM_CC_PolicySecret;

)
{

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// NOTE: A trial policy session is not allowed to use this command.
// A ticket is used in place of a previously given authorization. Since
// a trial policy doesn't actually authenticate, the validated
// ticket is not necessary and, in place of using a ticket, one
// should use the intended authorization for which the ticket
// would be a subsitute.
if(session->attributes.isTrialPolicy)
return TPM_RCS_ATTRIBUTES + RC_PolicyTicket_policySession;
// Restore timeout data. The format of timeout buffer is TPM-specific.
// In this implementation, we simply copy the value of timeout to the
// buffer.
if(in->timeout.t.size != sizeof(UINT64))
return TPM_RC_SIZE + RC_PolicyTicket_timeout;
timeout = BYTE_ARRAY_TO_UINT64(in->timeout.t.buffer);
// Do the normal checks on the cpHashA and timeout values
result = PolicyParameterChecks(session, timeout,
&in->cpHashA, NULL,
0,
// no bad nonce return
RC_PolicyTicket_cpHashA,
RC_PolicyTicket_timeout);
if(result != TPM_RC_SUCCESS)
return result;
// Validate Ticket
// Re-generate policy ticket by input parameters
TicketComputeAuth(in->ticket.tag, in->ticket.hierarchy, timeout, &in->cpHashA,
&in->policyRef, &in->authName, &ticketToCompare);

Page 246
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

Part 3: Commands

// Compare generated digest with input ticket digest
if(!Memory2BEqual(&in->ticket.digest.b, &ticketToCompare.digest.b))
return TPM_RC_TICKET + RC_PolicyTicket_ticket;
// Internal Data Update
// Is this ticket to take the place of a TPM2_PolicySigned() or
// a TPM2_PolicySecret()?
if(in->ticket.tag == TPM_ST_AUTH_SIGNED)
commandCode = TPM_CC_PolicySigned;
else if(in->ticket.tag == TPM_ST_AUTH_SECRET)
commandCode = TPM_CC_PolicySecret;
else
// There could only be two possible tag values. Any other value should
// be caught by the ticket validation process.
pAssert(FALSE);
// Update policy context
PolicyContextUpdate(commandCode, &in->authName, &in->policyRef,
&in->cpHashA, timeout, session);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 247
October 31, 2013

Part 3: Commands

25.6

Trusted Platform Module Library

TPM2_PolicyOR

25.6.1 General Description
This command allows options in authorizations without requiring that the TPM evaluate all of the options.
If a policy may be satisfied by different sets of conditions, the TPM need only evaluate one set that
satisfies the policy. This command will indicate that one of the required sets of conditions has been
satisfied.
PolicySession→policyDigest is compared against the list of provided values. If the current
policySession→policyDigest does not match any value in the list, the TPM shall return TPM_RC_VALUE.
Otherwise, it will replace policySession→policyDigest with the digest of the concatenation of all of the
digests and return TPM_RC_SUCCESS.
If policySession is a trial session, the TPM will assume that policySession→policyDigest matches one of
the list entries and compute the new value of policyDigest.
The algorithm for computing the new value for policyDigest of policySession is:
a) Concatenate all the digest values in pHashList:

digests ≔ pHashList.digests[1].buffer || … || pHashList.digests[n].buffer
NOTE 1

(17)

The TPM makes no check to see if the size of an entry matches the size of the digest of the
policy.

b) Reset policyDigest to a Zero Digest.
c) Extend the command code and the hashes computed in step a) above:

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyOR || digests)
NOTE 2

(18)

The computation in b) and c) above is equivalent to:

policyDigestnew ≔ HpolicyAlg(0…0 || TPM_CC_PolicyOR || digests)

A TPM shall support a list with at least eight tagged digest values.
NOTE 3

If policies are to be portable between TPMs, then they should not use more than eight values.

Page 248
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.6.2 Command and Response
Table 119 — TPM2_PolicyOR Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyOR.

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPML_DIGEST

pHashList

the list of hashes to check for a match

Table 120 — TPM2_PolicyOR Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 249
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.6.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "PolicyOR_fp.h"
#include "Policy_spt_fp.h"
Error Returns
TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning
no digest in pHashList matched the current value of policyDigest for
policySession

TPM_RC
TPM2_PolicyOR(
PolicyOR_In *in

// IN: input parameter list

)
{
SESSION
UINT32

*session;
i;

// Input Validation and Update
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Compare and Update Internal Session policy if match
for(i = 0; i < in->pHashList.count; i++)
{
if(
session->attributes.isTrialPolicy == SET
|| (Memory2BEqual(&session->u2.policyDigest.b,
&in->pHashList.digests[i].b))
)
{
// Found a match
HASH_STATE
hashState;
TPM_CC
commandCode = TPM_CC_PolicyOR;
// Start hash
session->u2.policyDigest.t.size = CryptStartHash(session->authHashAlg,
&hashState);
// Set policyDigest to 0 string and add it to hash
MemorySet(session->u2.policyDigest.t.buffer, 0,
session->u2.policyDigest.t.size);
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add command code
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// Add each of the hashes in the list
for(i = 0; i < in->pHashList.count; i++)
{
// Extend policyDigest
CryptUpdateDigest2B(&hashState, &in->pHashList.digests[i].b);
}
// Complete digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
return TPM_RC_SUCCESS;
}
}
// None of the values in the list matched the current policyDigest
return TPM_RC_VALUE + RC_PolicyOR_pHashList;

Page 250
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
54

Part 3: Commands

}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 251
October 31, 2013

Part 3: Commands

25.7

Trusted Platform Module Library

TPM2_PolicyPCR

25.7.1 General Description
This command is used to cause conditional gating of a policy based on PCR. This allows one group of
authorizations to occur when PCR are in one state and a different set of authorizations when the PCR are
in a different state. If this command is used for a trial policySession, policySession→policyDigest will be
updated using the values from the command rather than the values from digest of the TPM PCR.
The TPM will modify the pcrs parameter so that bits that correspond to unimplemented PCR are CLEAR.
If policySession is not a trial policy session, the TPM will use the modified value of pcrs to select PCR
values to hash according to Part 1, Selecting Multiple PCR. The hash algorithm of the policy session is
used to compute a digest (digestTPM) of the selected PCR. If pcrDigest does not have a length of zero,
then it is compared to digestTPM; and if the values do not match, the TPM shall return TPM_RC_VALUE
and make no change to policySession→policyDigest. If the values match, or if the length of pcrDigest is
zero, then policySession→policyDigest is extended by:

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyPCR || pcrs || digestTPM)

(19)

where

pcrs

the pcrs parameter with bits corresponding to unimplemented
PCR set to 0

digestTPM

the digest of the selected PCR using the hash algorithm of the
policy session

NOTE 1

If the caller provides the expected PCR value, the intention is that the policy evaluation stop at that
point if the PCR do not match. If the caller does not provide the expected PCR value, then the
validity of the settings will not be determined until an attempt is made to use the policy for
authorization. If the policy is constructed such that the PCR check comes before user authorization
checks, this early termination would allow software to avoid unnecessary prompts for user input to
satisfy a policy that would fail later due to incorr ect PCR values.

After this command completes successfully, the TPM shall return TPM_RC_PCR_CHANGED if the policy
session is used for authorization and the PCR are not known to be correct.
The TPM uses a “generation” number (pcrUpdateCounter) that is incremented each time PCR are
updated (unless the PCR being changed is specified not to cause a change to this counter). The value of
this counter is stored in the policy session context (policySession→pcrUpdateCounter) when this
command is executed. When the policy is used for authorization, the current value of the counter is
compared to the value in the policy session context and the authorization will fail if the values are not the
same.
When this command is executed, policySession→pcrUpdateCounter is checked to see if it has been
previously set (in the reference implementation, it has a value of zero if not previously set). If it has been
set, it will be compared with the current value of pcrUpdateCounter to determine if any PCR changes
have occurred. If the values are different, the TPM shall return TPM_RC_PCR_CHANGED. If
policySession→pcrUpdateCounter has not been set, then it is set to the current value of
pcrUpdateCounter.
If policySession is a trial policy session, the TPM will not check any PCR and will compute:

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyPCR || pcrs || pcrDigest)

(20)

In this computation, pcrs is the input parameter without modification.
NOTE 2

The pcrs parameter is expected to match the configuration of the TPM for which the policy is being
computed which may not be the same as the TPM on which the trial policy is being computed.

Page 252
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.7.2 Command and Response
Table 121 — TPM2_PolicyPCR Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyPCR

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_DIGEST

pcrDigest

expected digest value of the selected PCR using the
hash algorithm of the session; may be zero length

TPML_PCR_SELECTION

pcrs

the PCR to include in the check digest

Table 122 — TPM2_PolicyPCR Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 253
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.7.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PolicyPCR_fp.h"
Error Returns
TPM_RC_VALUE

if provided, pcrDigest does not match the current PCR settings

TPM_RC_PCR_CHANGED
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning

a previous TPM2_PolicyPCR() set pcrCounter and it has changed

TPM_RC
TPM2_PolicyPCR(
PolicyPCR_In

*in

// IN: input parameter list

SESSION
TPM2B_DIGEST
BYTE
UINT32
BYTE
TPM_CC
HASH_STATE

*session;
pcrDigest;
pcrs[sizeof(TPML_PCR_SELECTION)];
pcrSize;
*buffer;
commandCode = TPM_CC_PolicyPCR;
hashState;

)
{

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Do validation for non trial session
if(session->attributes.isTrialPolicy == CLEAR)
{
// Make sure that this is not going to invalidate a previous PCR check
if(session->pcrCounter != 0 && session->pcrCounter != gr.pcrCounter)
return TPM_RC_PCR_CHANGED;
// Compute current PCR digest
PCRComputeCurrentDigest(session->authHashAlg, &in->pcrs, &pcrDigest);
// If the caller specified the PCR digest and it does not
// match the current PCR settings, return an error..
if(in->pcrDigest.t.size != 0)
{
if(!Memory2BEqual(&in->pcrDigest.b, &pcrDigest.b))
return TPM_RC_VALUE + RC_PolicyPCR_pcrDigest;
}
}
else
{
// For trial session, just use the input PCR digest
pcrDigest = in->pcrDigest;
}
// Internal Data Update
// Update policy hash
// policyDigestnew = hash(
policyDigestold || TPM_CC_PolicyPCR
//
|| pcrs || pcrDigest)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);

Page 254
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

Part 3: Commands

// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add PCRS
buffer = pcrs;
pcrSize = TPML_PCR_SELECTION_Marshal(&in->pcrs, &buffer, NULL);
CryptUpdateDigest(&hashState, pcrSize, pcrs);
// add PCR digest
CryptUpdateDigest2B(&hashState, &pcrDigest.b);
// complete the hash and get the results
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// update pcrCounter in session context for non trial session
if(session->attributes.isTrialPolicy == CLEAR)
{
session->pcrCounter = gr.pcrCounter;
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 255
October 31, 2013

Part 3: Commands

25.8

Trusted Platform Module Library

TPM2_PolicyLocality

25.8.1 General Description
This command indicates that the authorization will be limited to a specific locality.
policySession→commandLocality is a parameter kept in the session context. It is initialized when the
policy session is started to allow the policy to apply to any locality.
If locality has a value greater than 31, then an extended locality is indicated. For an extended locality, the
TPM will validate that policySession→commandLocality is has not previously been set or that the current
value of policySession→commandLocality is the same as locality (TPM_RC_RANGE).
When locality is not an extended locality, the TPM will validate that the policySession→commandLocality
is not set or is not set to an extended locality value (TPM_RC_RANGE). If not the TPM will disable any
locality not SET in the locality parameter. If the result of disabling localities results in no locality being
enabled, the TPM will return TPM_RC_RANGE.
If no error occurred in the validation of locality, policySession→policyDigest is extended with

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyLocality || locality)

(21)

Then policySession→commandLocality is updated to indicate which localities are still allowed after
execution of TPM2_PolicyLocality().
When the policy session is used to authorize a command, the authorization will fail if the locality used for
the command is not one of the enabled localities in policySession→commandLocality.

Page 256
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.8.2 Command and Response
Table 123 — TPM2_PolicyLocality Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyLocality

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPMA_LOCALITY

locality

the allowed localities for the policy

Table 124 — TPM2_PolicyLocality Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 257
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.8.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "PolicyLocality_fp.h"

Limit a policy to a specific locality
Error Returns
TPM_RC_RANGE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Meaning
all the locality values selected by locality have been disabled by
previous TPM2_PolicyLocality() calls.

TPM_RC
TPM2_PolicyLocality(
PolicyLocality_In

*in

// IN: input parameter list

)
{
SESSION
BYTE
BYTE
UINT32
BYTE
TPM_CC
HASH_STATE

*session;
marshalBuffer[sizeof(TPMA_LOCALITY)];
prevSetting[sizeof(TPMA_LOCALITY)];
marshalSize;
*buffer;
commandCode = TPM_CC_PolicyLocality;
hashState;

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Get new locality setting in canonical form
buffer = marshalBuffer;
marshalSize = TPMA_LOCALITY_Marshal(&in->locality, &buffer, NULL);
// Its an error if the locality parameter is zero
if(marshalBuffer[0] == 0)
return TPM_RC_RANGE + RC_PolicyLocality_locality;
// Get existing locality setting in canonical form
buffer = prevSetting;
TPMA_LOCALITY_Marshal(&session->commandLocality, &buffer, NULL);
// If the locality has been previously set, then it needs to be the same
// tye as the input locality (i.e. both extended or both normal
if(prevSetting[0] != 0 && ((prevSetting[0] <= 0) != (marshalBuffer[0] <= 0)))
return TPM_RC_RANGE + RC_PolicyLocality_locality;
// See if the input is a regular or extended locality
if(marshalBuffer[0] < 32)
{
// For regular locality
// The previous setting must not be an extended locality
if(prevSetting[0] > 31)
return TPM_RC_RANGE + RC_PolicyLocality_locality;
// if there was no previous setting, start with all normal localities
// enabled
if(prevSetting[0] == 0)
prevSetting[0] = 0x1F;
// AND the new setting with the previous setting and store it in prevSetting

Page 258
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

Part 3: Commands

prevSetting[0] &= marshalBuffer[0];
// The result setting can not be 0
if(prevSetting[0] == 0)
return TPM_RC_RANGE + RC_PolicyLocality_locality;
}
else
{
// for extended locality
// if the locality has already been set, then it must match the
if(prevSetting[0] != 0 && prevSetting[0] != marshalBuffer[0])
return TPM_RC_RANGE + RC_PolicyLocality_locality;
// Setting is OK
prevSetting[0] = marshalBuffer[0];
}
// Internal Data Update
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyLocality || locality)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add input locality
CryptUpdateDigest(&hashState, marshalSize, marshalBuffer);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// update session locality by unmarshal function. The function must succeed
// because both input and existing locality setting have been validated.
buffer = prevSetting;
TPMA_LOCALITY_Unmarshal(&session->commandLocality, &buffer,
(INT32 *) &marshalSize);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 259
October 31, 2013

Part 3: Commands

25.9

Trusted Platform Module Library

TPM2_PolicyNV

25.9.1 General Description
This command is used to cause conditional gating of a policy based on the contents of an NV Index.
If policySession is a trial policy session, the TPM will update policySession→policyDigest as shown in
equations (22) and (23) below and return TPM_RC_SUCCESS. It will not perform any validation. The
remainder of this general description would apply only if policySession is not a trial policy session.
An authorization session providing authorization to read the NV Index shall be provided.
NOTE 1

If read access is controlled by policy, the policy should include a branch that authorizes a
TPM2_PolicyNV().

If TPMA_NV_WRITTEN is not SET in the NV Index, the TPM shall return TPM_RC_NV_UNINITIALIZED.
The TPM will validate that the size of operandB plus offset is not greater than the size of the NV Index. If
it is, the TPM shall return TPM_RC_SIZE.
The TPM will perform the indicated arithmetic check on the indicated portion of the selected NV Index. If
the check fails, the TPM shall return TPM_RC_POLICY and not change policySession→policyDigest. If
the check succeeds, the TPM will hash the arguments:

args ≔ HpolicyAlg(operand.buffer || offset || operation)

(22)

where

HpolicyAlg()

hash function using the algorithm of the policy session

operandB

the value used for the comparison

offset

offset from the start of the NV Index data to start the comparison

operation

the operation parameter indicating the comparison being
performed

The value of args and the Name of the NV Index are extended to policySession→policyDigest by

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyNV || args || nvIndex→Name)

(23)

where

HpolicyAlg()

hash function using the algorithm of the policy session

args

value computed in equation (22)

nvIndex→Name

the Name of the NV Index

The signed arithmetic operations are performed using twos-compliment.
Magnitude comparisons assume that the octet at offset zero in the referenced NV location and in
operandB contain the most significant octet of the data.
NOTE 2

When an Index is written, it has a different authorization name than an Index that has not been
written. It is possible to use this change in the NV Index to create a write-once Index.

Page 260
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.9.2 Command and Response
Table 125 — TPM2_PolicyNV Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyNV

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index of the area to read
Auth Index: None

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_OPERAND

operandB

the second operand

UINT16

offset

the offset in the NV Index for the start of operand A

TPM_EO

operation

the comparison to make

Table 126 — TPM2_PolicyNV Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 261
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.9.3 Detailed Actions
1
2
3
4

#include
#include
#include
#include

"InternalRoutines.h"
"PolicyNV_fp.h"
"Policy_spt_fp.h"
"NV_spt_fp.h"

// Include NV support routine for read access check

Error Returns
TPM_RC_AUTH_TYPE

NV index authorization type is not correct

TPM_RC_NV_LOCKED

NV index read locked

TPM_RC_NV_UNINITIALIZED

the NV index has not been initialized

TPM_RC_POLICY

the comparison to the NV contents failed

TPM_RC_SIZE

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

Meaning

the size of nvIndex data starting at offset is less than the size of
operandB

TPM_RC
TPM2_PolicyNV(
PolicyNV_In

*in

// IN: input parameter list

TPM_RC
SESSION
NV_INDEX
BYTE
TPM2B_NAME
TPM_CC
HASH_STATE
TPM2B_DIGEST

result;
*session;
nvIndex;
nvBuffer[sizeof(in->operandB.t.buffer)];
nvName;
commandCode = TPM_CC_PolicyNV;
hashState;
argHash;

)
{

// Input Validation
// Get NV index information
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Get pointer to the session structure
session = SessionGet(in->policySession);
//If this is a trial policy, skip all validations and the operation
if(session->attributes.isTrialPolicy == CLEAR)
{
// NV Read access check. NV index should be allowed for read. A
// TPM_RC_AUTH_TYPE or TPM_RC_NV_LOCKED error may be return at this
// point
result = NvReadAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS) return result;
// Valid NV data size should not be smaller than input operandB size
if((nvIndex.publicArea.dataSize - in->offset) < in->operandB.t.size)
return TPM_RC_SIZE + RC_PolicyNV_operandB;
// Arithmetic Comparison
// Get NV data. The size of NV data equals the input operand B size
NvGetIndexData(in->nvIndex, &nvIndex, in->offset,
in->operandB.t.size, nvBuffer);
switch(in->operation)

Page 262
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

Part 3: Commands

{
case TPM_EO_EQ:
// compare A = B
if(CryptCompare(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_NEQ:
// compare A != B
if(CryptCompare(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_GT:
// compare A > B signed
if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_GT:
// compare A > B unsigned
if(CryptCompare(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_LT:
// compare A < B signed
if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_LT:
// compare A < B unsigned
if(CryptCompare(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_GE:
// compare A >= B signed
if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_GE:
// compare A >= B unsigned
if(CryptCompare(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_LE:
// compare A <= B signed
if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_LE:
// compare A <= B unsigned
if(CryptCompare(in->operandB.t.size, nvBuffer,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_BITSET:
// All bits SET in B are SET in A. ((A&B)=B)
{

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

!= 0)

== 0)

<= 0)

<= 0)

>= 0)

>= 0)

< 0)

< 0)

> 0)

> 0)

Page 263
October 31, 2013

Part 3: Commands
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

Trusted Platform Module Library

UINT32 i;
for (i = 0; i < in->operandB.t.size; i++)
if((nvBuffer[i] & in->operandB.t.buffer[i])
!= in->operandB.t.buffer[i])
return TPM_RC_POLICY;
}
break;
case TPM_EO_BITCLEAR:
// All bits SET in B are CLEAR in A. ((A&B)=0)
{
UINT32 i;
for (i = 0; i < in->operandB.t.size; i++)
if((nvBuffer[i] & in->operandB.t.buffer[i]) != 0)
return TPM_RC_POLICY;
}
break;
default:
pAssert(FALSE);
break;
}
}
// Internal Data Update
// Start argument hash
argHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
// add operandB
CryptUpdateDigest2B(&hashState, &in->operandB.b);
// add offset
CryptUpdateDigestInt(&hashState, sizeof(UINT16), &in->offset);
// add operation
CryptUpdateDigestInt(&hashState, sizeof(TPM_EO), &in->operation);
// complete argument digest
CryptCompleteHash2B(&hashState, &argHash.b);
// Update policyDigest
// Start digest
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add argument digest
CryptUpdateDigest2B(&hashState, &argHash.b);
// Adding nvName
nvName.t.size = EntityGetName(in->nvIndex, &nvName.t.name);
CryptUpdateDigest2B(&hashState, &nvName.b);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
return TPM_RC_SUCCESS;
}

Page 264
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.10 TPM2_PolicyCounterTimer
25.10.1

General Description

This command is used to cause conditional gating of a policy based on the contents of the
TPMS_TIME_INFO structure.
If policySession is a trial policy session, the TPM will update policySession→policyDigest as shown in
equations (24) and (25) below and return TPM_RC_SUCCESS. It will not perform any validation. The
remainder of this general description would apply only if policySession is not a trial policy session.
The TPM will perform the indicated arithmetic check on the indicated portion of the TPMS_TIME_INFO
structure. If the check fails, the TPM shall return TPM_RC_POLICY and not change
policySession→policyDigest. If the check succeeds, the TPM will hash the arguments:

args ≔ HpolicyAlg(operandB.buffer || offset || operation)

(24)

where

HpolicyAlg()

hash function using the algorithm of the policy session

operandB.buffer

the value used for the comparison

offset

offset from the start of the TPMS_TIME_INFO structure at which
the comparison starts

operation

the operation parameter indicating the comparison being
performed

The value of args is extended to policySession→policyDigest by

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyCounterTimer || args)

(25)

where

HpolicyAlg()

hash function using the algorithm of the policy session

args

value computed in equation (24)

The signed arithmetic operations are performed using twos-compliment.
Magnitude comparisons assume that the octet at offset zero in the referenced location and in operandB
contain the most significant octet of the data.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 265
October 31, 2013

Part 3: Commands

25.10.2

Trusted Platform Module Library

Command and Response
Table 127 — TPM2_PolicyCounterTimer Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyCounterTimer

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_OPERAND

operandB

the second operand

UINT16

offset

the offset in TPMS_TIME_INFO structure for the start of
operand A

TPM_EO

operation

the comparison to make

Table 128 — TPM2_PolicyCounterTimer Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 266
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.10.3
1
2
3

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyCounterTimer_fp.h"
#include "Policy_spt_fp.h"
Error Returns
TPM_RC_POLICY

the comparison of the selected portion of the TPMS_TIME_INFO with
operandB failed

TPM_RC_RANGE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Meaning

offset + size exceed size of TPMS_TIME_INFO structure

TPM_RC
TPM2_PolicyCounterTimer(
PolicyCounterTimer_In

*in

// IN: input parameter list

)
{
TPM_RC
SESSION
TIME_INFO
TPM_CC
HASH_STATE
TPM2B_DIGEST

result;
*session;
infoData;
// data buffer of TPMS_TIME_INFO
commandCode = TPM_CC_PolicyCounterTimer;
hashState;
argHash;

// Input Validation
// If the command is going to use any part of the counter or timer, need
// to verify that time is advancing.
// The time and clock vales are the first two 64-bit values in the clock
if(in->offset < <K>sizeof(UINT64) + sizeof(UINT64))
{
// Using Clock or Time so see if clock is running. Clock doesn't run while
// NV is unavailable.
// TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned here.
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
}
// Get pointer to the session structure
session = SessionGet(in->policySession);
//If this is a trial policy, skip all validations and the operation
if(session->attributes.isTrialPolicy == CLEAR)
{
// Get time data info. The size of time info data equals the input
// operand B size. A TPM_RC_RANGE error may be returned at this point
result = TimeGetRange(in->offset, in->operandB.t.size, &infoData);
if(result != TPM_RC_SUCCESS) return result;
// Arithmetic Comparison
switch(in->operation)
{
case TPM_EO_EQ:
// compare A = B
if(CryptCompare(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer) != 0)
return TPM_RC_POLICY;
break;
case TPM_EO_NEQ:
// compare A != B
if(CryptCompare(in->operandB.t.size, infoData,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 267
October 31, 2013

Part 3: Commands
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

Trusted Platform Module Library

in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_GT:
// compare A > B signed
if(CryptCompareSigned(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_GT:
// compare A > B unsigned
if(CryptCompare(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_LT:
// compare A < B signed
if(CryptCompareSigned(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_LT:
// compare A < B unsigned
if(CryptCompare(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_GE:
// compare A >= B signed
if(CryptCompareSigned(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_GE:
// compare A >= B unsigned
if(CryptCompare(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_SIGNED_LE:
// compare A <= B signed
if(CryptCompareSigned(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_UNSIGNED_LE:
// compare A <= B unsigned
if(CryptCompare(in->operandB.t.size, infoData,
in->operandB.t.size, in->operandB.t.buffer)
return TPM_RC_POLICY;
break;
case TPM_EO_BITSET:
// All bits SET in B are SET in A. ((A&B)=B)
{
UINT32 i;
for (i = 0; i < in->operandB.t.size; i++)
if(
(infoData[i] & in->operandB.t.buffer[i])
!= in->operandB.t.buffer[i])
return TPM_RC_POLICY;
}
break;
case TPM_EO_BITCLEAR:
// All bits SET in B are CLEAR in A. ((A&B)=0)
{

Page 268
October 31, 2013

Published
Copyright © TCG 2006-2013

== 0)

<= 0)

<= 0)

>= 0)

>= 0)

< 0)

< 0)

> 0)

> 0)

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

Part 3: Commands

UINT32 i;
for (i = 0; i < in->operandB.t.size; i++)
if((infoData[i] & in->operandB.t.buffer[i]) != 0)
return TPM_RC_POLICY;
}
break;
default:
pAssert(FALSE);
break;
}
}
// Internal Data Update
// Start argument list hash
argHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
// add operandB
CryptUpdateDigest2B(&hashState, &in->operandB.b);
// add offset
CryptUpdateDigestInt(&hashState, sizeof(UINT16), &in->offset);
// add operation
CryptUpdateDigestInt(&hashState, sizeof(TPM_EO), &in->operation);
// complete argument hash
CryptCompleteHash2B(&hashState, &argHash.b);
// update policyDigest
// start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add argument digest
CryptUpdateDigest2B(&hashState, &argHash.b);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 269
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.11 TPM2_PolicyCommandCode
25.11.1

General Description

This command indicates that the authorization will be limited to a specific command code.
If policySession→commandCode has its default value, then it will be set to code. If
policySession→commandCode does not have its default value, then the TPM will return
TPM_RC_VALUE if the two values are not the same.
If code is not implemented, the TPM will return TPM_RC_POLICY_CC.
If the TPM does not return an error, it will update policySession→policyDigest by

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyCommandCode || code)

(26)

NOTE 1

If a previous TPM2_PolicyCommandCode() had been executed, then it is probable that the policy
expression is improperly formed but the TPM does not return an error.

NOTE 2

A TPM2_PolicyOR() would be used to allow an authorization to be used for multiple commands.

When the policy session is used to authorize a command, the TPM will fail the command if the
commandCode of that command does not match policySession→commandCode.
This command, or TPM2_PolicyDuplicationSelect(), is required to enable the policy to be used for ADMIN
role authorization.
EXAMPLE

Before TPM2_Certify() can
TPM_CC_Certify is required.

Page 270
October 31, 2013

be

executed,

TPM2_PolicyCommandCode()

Published
Copyright © TCG 2006-2013

with

code

set

to

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.11.2

Part 3: Commands

Command and Response
Table 129 — TPM2_PolicyCommandCode Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyCommandCode

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM_CC

code

the allowed commandCode

Table 130 — TPM2_PolicyCommandCode Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 271
October 31, 2013

Part 3: Commands

25.11.3
1
2

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyCommandCode_fp.h"
Error Returns
TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Meaning
commandCode of policySession previously set to a different value

TPM_RC
TPM2_PolicyCommandCode(
PolicyCommandCode_In *in

// IN: input parameter list

)
{
SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyCommandCode;
hashState;

// Input validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
if(session->commandCode != 0 && session->commandCode != in->code)
return TPM_RC_VALUE + RC_PolicyCommandCode_code;
if(!CommandIsImplemented(in->code))
return TPM_RC_POLICY_CC + RC_PolicyCommandCode_code;
// Internal Data Update
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCommandCode || code)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add input commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &in->code);
// complete the hash and get the results
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// update commandCode value in session context
session->commandCode = in->code;
return TPM_RC_SUCCESS;
}

Page 272
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.12 TPM2_PolicyPhysicalPresence
25.12.1

General Description

This command indicates that physical presence will need to be asserted at the time the authorization is
performed.
If this command is successful, policySession→isPPRequired will be SET to indicate that this check is
required when the policy is used for authorization. Additionally, policySession→policyDigest is extended
with

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyPhysicalPresence)

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

(27)

Page 273
October 31, 2013

Part 3: Commands

25.12.2

Trusted Platform Module Library

Command and Response
Table 131 — TPM2_PolicyPhysicalPresence Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyPhysicalPresence

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

Table 132 — TPM2_PolicyPhysicalPresence Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 274
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.12.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyPhysicalPresence_fp.h"

TPM_RC
TPM2_PolicyPhysicalPresence(
PolicyPhysicalPresence_In *in

// IN: input parameter list

)
{
SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyPhysicalPresence;
hashState;

// Internal Data Update
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyPhysicalPresence)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// update session attribute
session->attributes.isPPRequired = SET;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 275
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.13 TPM2_PolicyCpHash
25.13.1

General Description

This command is used to allow a policy to be bound to a specific command and command parameters.
TPM2_PolicySigned(), TPM2_PolicySecret(), and TPM2_PolicyTIcket() are designed to allow an
authorizing entity to execute an arbitrary command as the cpHashA parameter of those commands is not
included in policySession→policyDigest. TPM2_PolicyCommandCode() allows the policy to be bound to a
specific Command Code so that only certain entities may authorize specific command codes. This
command allows the policy to be restricted such that an entity may only authorize a command with a
specific set of parameters.
If policySession→cpHash is already set and not the same as cpHashA, then the TPM shall return
TPM_RC_VALUE. If cpHashA does not have the size of the policySession→policyDigest, the TPM shall
return TPM_RC_SIZE.
If the cpHashA checks succeed, policySession→cpHash
policySession→policyDigest is updated with

is

set

to

cpHashA

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyCpHash || cpHashA)

Page 276
October 31, 2013

Published
Copyright © TCG 2006-2013

and
(28)

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.13.2

Part 3: Commands

Command and Response
Table 133 — TPM2_PolicyCpHash Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyCpHash

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_DIGEST

cpHashA

the cpHash added to the policy

Table 134 — TPM2_PolicyCpHash Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 277
October 31, 2013

Part 3: Commands

25.13.3
1
2

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyCpHash_fp.h"
Error Returns
TPM_RC_CPHASH

cpHash of policySession has previously been set to a different value

TPM_RC_SIZE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Meaning

cpHashA is not the size of a digest produced by the hash algorithm
associated with policySession

TPM_RC
TPM2_PolicyCpHash(
PolicyCpHash_In *in

// IN: input parameter list

)
{
SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyCpHash;
hashState;

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// A new cpHash is given in input parameter, but cpHash in session context
// is not empty, or is not the same as the new cpHash
if(
in->cpHashA.t.size != 0
&& session->u1.cpHash.t.size != 0
&& !Memory2BEqual(&in->cpHashA.b, &session->u1.cpHash.b)
)
return TPM_RC_CPHASH;
// A valid cpHash must have the same size as session hash digest
if(in->cpHashA.t.size != CryptGetHashDigestSize(session->authHashAlg))
return TPM_RC_SIZE + RC_PolicyCpHash_cpHashA;
// Internal Data Update
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCpHash || cpHashA)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add cpHashA
CryptUpdateDigest2B(&hashState, &in->cpHashA.b);
// complete the digest and get the results
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// update cpHash in session context
session->u1.cpHash = in->cpHashA;
session->attributes.iscpHashDefined = SET;
return TPM_RC_SUCCESS;

Page 278
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
53

Part 3: Commands

}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 279
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.14 TPM2_PolicyNameHash
25.14.1

General Description

This command allows a policy to be bound to a specific set of TPM entities without being bound to the
parameters of the command. This is most useful for commands such as TPM2_Duplicate() and for
TPM2_PCR_Event() when the referenced PCR requires a policy.
The nameHash parameter should contain the digest of the Names associated with the handles to be used
in the authorized command.
EXAMPLE

For the TPM2_Duplicate() command, two handles are provided. One is the handle of the object
being duplicated and the other is the handle of the new parent. For that command, nameHash would
contain:

nameHash ≔ H policyAlg (objectHandle→Name || newParentHandle→Name)

If policySession→cpHash is already set, the TPM shall return TPM_RC_VALUE. If the size of nameHash
is not the size of policySession→policyDigest, the TPM shall return TPM_RC_SIZE. Otherwise,
policySession→cpHash is set to nameHash.
If this command completes successfully, the cpHash of the authorized command will not be used for
validation. Only the digest of the Names associated with the handles in the command will be used.
NOTE 1

This allows the space normally
policySession→nameHash instead.

used

to

hold

policySession→cpHash

to

be

used

for

The policySession→policyDigest will be updated with

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyNameHash || nameHash)
NOTE 2

(29)

This command will often be used with TPM2_PolicyAuthorize() where the owner of the object being
duplicated provides approval for their object to be migrated to a specific new parent.

Page 280
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.14.2

Part 3: Commands

Command and Response
Table 135 — TPM2_PolicyNameHash Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyNameHash

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_DIGEST

nameHash

the digest to be added to the policy

Table 136 — TPM2_PolicyNameHash Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 281
October 31, 2013

Part 3: Commands

25.14.3
1
2

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyNameHash_fp.h"
Error Returns
TPM_RC_CPHASH

nameHash has been previously set to a different value

TPM_RC_SIZE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Meaning

nameHash is not the size of the digest produced by the hash
algorithm associated with policySession

TPM_RC
TPM2_PolicyNameHash(
PolicyNameHash_In

*in

// IN: input parameter list

SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyNameHash;
hashState;

)
{

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// A new nameHash is given in input parameter, but cpHash in session context
// is not empty
if(in->nameHash.t.size != 0 && session->u1.cpHash.t.size != 0)
return TPM_RC_CPHASH;
// A valid nameHash must have the same size as session hash digest
if(in->nameHash.t.size != CryptGetHashDigestSize(session->authHashAlg))
return TPM_RC_SIZE + RC_PolicyNameHash_nameHash;
// Internal Data Update
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyNameHash || nameHash)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add nameHash
CryptUpdateDigest2B(&hashState, &in->nameHash.b);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// clear iscpHashDefined bit to indicate now this field contains a nameHash
session->attributes.iscpHashDefined = CLEAR;
// update nameHash in session context
session->u1.cpHash = in->nameHash;
return TPM_RC_SUCCESS;
}

Page 282
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.15 TPM2_PolicyDuplicationSelect
25.15.1

General Description

This command allows qualification of duplication to allow duplication to a selected new parent.
If this command not used in conjunction with TPM2_PolicyAuthorize(), then only the new parent is
selected.
EXAMPLE

When an object is created when the list of allowed duplication targets is known, the policy would be
created with includeObject CLEAR.

NOTE 1

Only the new parent may be selected because, without TPM2_PolicyAuthorize() , the Name of the
Object to be duplicated would need to be known at the time that Object's policy is created. However,
since the Name of the Object includes its policy, the Name is not known.

If used in conjunction with TPM2_PolicyAuthorize(), then the authorizer of the new policy has the option
of selecting just the new parent or of selecting both the new parent and the duplication Object..
NOTE 2

If the authorizing entity for an TPM2_PolicyAuthorize() only specifies the new parent, then that
authorization may be applied to the duplication of any number of other Objects. If the authorizing
entity specifies both a new parent and the duplicated Object, then the authorization only applies to
that pairing of Object and new parent.

If either policySession→cpHash or policySession→nameHash has been previously set, the TPM shall
return TPM_RC_CPHASH. Otherwise, policySession→nameHash will be set to:

nameHash ≔ HpolicyAlg(objectName || newParentName)

(30)

It is allowed that policySesion→nameHash and policySession→cpHash share the same memory
space.

NOTE 3

The policySession→policyDigest will be updated according to the setting of includeObject. If equal to
YES, policySession→policyDigest is updated by:

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyDuplicationSelect ||
objectName || newParentName || includeObject)

(31)

If includeObject is NO, policySession→policyDigest is updated by:

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyDuplicationSelect ||
newParentName || includeObject)
NOTE 4

(32)

PolicySession→CpHash receives the digest of both Names so that the check performed in
TPM2_Duplicate() may be the same regardless of which Names are included in
policySession→policyDigest. This means that, when TPM2_PolicyDuplicationSelect() is executed, it
is only valid for a specific pair of duplication object and new parent.

If the command succeeds, commandCode in the policy session context is set to TPM_CC_Duplicate.
NOTE 5

The normal use of this command is before a TPM2_PolicyAuthorize(). An authorized entity would
approve a policyDigest that allowed duplication to a specific new parent. The authorizing entity may
want to limit the authorization so that the approval allows only a specific object to be duplicated to
the new parent. In that case, the authorizing entity would approve the policyDigest of equation (31).

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 283
October 31, 2013

Part 3: Commands

25.15.2

Trusted Platform Module Library

Command and Response
Table 137 — TPM2_PolicyDuplicationSelect Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyDuplicationSelect

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_NAME

objectName

the Name of the object to be duplicated

TPM2B_NAME

newParentName

the Name of the new parent

TPMI_YES_NO

includeObject

if YES, the objectName will be included in the value in
policySession→policyDigest

Table 138 — TPM2_PolicyDuplicationSelect Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 284
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.15.3
1
2

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyDuplicationSelect_fp.h"
Error Returns
TPM_RC_COMMAND_CODE

commandCode of 'policySession; is not empty

TPM_RC_CPHASH
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning

cpHash of policySession is not empty

TPM_RC
TPM2_PolicyDuplicationSelect(
PolicyDuplicationSelect_In *in

// IN: input parameter list

)
{
SESSION
HASH_STATE
TPM_CC

*session;
hashState;
commandCode = TPM_CC_PolicyDuplicationSelect;

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// cpHash in session context must be empty
if(session->u1.cpHash.t.size != 0)
return TPM_RC_CPHASH;
// commandCode in session context must be empty
if(session->commandCode != 0)
return TPM_RC_COMMAND_CODE;
// Internal Data Update
// Update name hash
session->u1.cpHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
// add objectName
CryptUpdateDigest2B(&hashState, &in->objectName.b);
// add new parent name
CryptUpdateDigest2B(&hashState, &in->newParentName.b);
// complete hash
CryptCompleteHash2B(&hashState, &session->u1.cpHash.b);
// update policy hash
// Old policyDigest size should be the same as the new policyDigest size since
// they are using the same hash algorithm
session->u2.policyDigest.t.size
= CryptStartHash(session->authHashAlg, &hashState);
// add old policy
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add command code
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add objectName
if(in->includeObject == YES)
CryptUpdateDigest2B(&hashState, &in->objectName.b);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 285
October 31, 2013

Part 3: Commands
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

Trusted Platform Module Library

// add new parent name
CryptUpdateDigest2B(&hashState, &in->newParentName.b);
// add includeObject
CryptUpdateDigestInt(&hashState, sizeof(TPMI_YES_NO), &in->includeObject);
// complete digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// clear iscpHashDefined bit to indicate now this field contains a nameHash
session->attributes.iscpHashDefined = CLEAR;
// set commandCode in session context
session->commandCode = TPM_CC_Duplicate;
return TPM_RC_SUCCESS;
}

Page 286
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.16 TPM2_PolicyAuthorize
25.16.1

General Description

This command allows policies to change. If a policy were static, then it would be difficult to add users to a
policy. This command lets a policy authority sign a new policy so that it may be used in an existing policy.
The authorizing entity signs a structure that contains

aHash ≔ HaHashAlg(approvedPolicy || policyRef)

(33)

The aHashAlg is required to be the nameAlg of the key used to sign the aHash. The aHash value is then
signed (symmetric or asymmetric) by keySign. That signature is then checked by the TPM in
TPM2_VerifySignature() which produces a ticket by

HMAC(proof, (TPM_ST_VERIFIED || aHash || keySign→Name))
NOTE

(34)

The reason for the validation is because of the expectation that the policy will be used multiple times
and it is more efficient to check a ticket than to load an object each time to chec k a signature.

The ticket is then used in TPM2_PolicyAuthorize() to validate the parameters.
The keySign parameter is required to be a valid object name using nameAlg other than TPM_ALG_NULL.
If the first two octets of keySign are not a valid hash algorithm, the TPM shall return TPM_RC_HASH. If
the remainder of the Name is not the size of the indicated digest, the TPM shall return TPM_RC_SIZE.
The TPM validates that the approvedPolicy matches the current value of policySession→policyDigest and
if not, shall return TPM_RC_VALUE.
The TPM then validates that the parameters to TPM2_PolicyAuthorize() match the values used to
generate the ticket. If so, the TPM will reset policySession→policyDigest to a Zero Digest. Then it will
create a TPM2B_NAME (keyName) using keySign and update policySession→policyDigest with
PolicyUpdate() (see 25.2.3).

PolicyUpdate(TPM_CC_PolicyAuthorize, keyName, policyRef)

(35)

If the ticket is not valid, the TPM shall return TPM_RC_POLICY.
If policySession is a trial session, policySession→policyDigest is extended as if the ticket is valid without
actual verification.
NOTE

The unmarshaling process requires that a proper TPMT_TK_VERIFIED be provided for checkTicket
but it may be a NULL Ticket.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 287
October 31, 2013

Part 3: Commands

25.16.2

Trusted Platform Module Library

Command and Response
Table 139 — TPM2_PolicyAuthorize Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyAuthorize

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPM2B_DIGEST

approvedPolicy

digest of the policy being approved

TPM2B_NONCE

policyRef

a policy qualifier

TPM2B_NAME

keySign

Name of a key that can sign a policy addition

TPMT_TK_VERIFIED

checkTicket

ticket validating that approvedPolicy and policyRef were
signed by keySign

Table 140 — TPM2_PolicyAuthorize Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 288
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.16.3
1
2
3

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyAuthorize_fp.h"
#include "Policy_spt_fp.h"
Error Returns
TPM_RC_HASH

hash algorithm in keyName is not supported

TPM_RC_SIZE

keyName is not the correct size for its hash algorithm

TPM_RC_VALUE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

Meaning

the current policyDigest of policySession does not match
approvedPolicy; or checkTicket doesn't match the provided values

TPM_RC
TPM2_PolicyAuthorize(
PolicyAuthorize_In

*in

// IN: input parameter list

SESSION
TPM2B_DIGEST
HASH_STATE
TPMT_TK_VERIFIED
TPM_ALG_ID
UINT16

*session;
authHash;
hashState;
ticket;
hashAlg;
digestSize;

)
{

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Extract from the Name of the key, the algorithm used to compute it's Name
hashAlg = BYTE_ARRAY_TO_UINT16(in->keySign.t.name);
// 'keySign' parameter needs to use a supported hash algorithm, otherwise
// can't tell how large the digest should be
digestSize = CryptGetHashDigestSize(hashAlg);
if(digestSize == 0)
return TPM_RC_HASH + RC_PolicyAuthorize_keySign;
if(digestSize != (in->keySign.t.size - 2))
return TPM_RC_SIZE + RC_PolicyAuthorize_keySign;
//If this is a trial policy, skip all validations
if(session->attributes.isTrialPolicy == CLEAR)
{
// Check that "approvedPolicy" matches the current value of the
// policyDigest in policy session
if(!Memory2BEqual(&session->u2.policyDigest.b,
&in->approvedPolicy.b))
return TPM_RC_VALUE + RC_PolicyAuthorize_approvedPolicy;
// Validate ticket TPMT_TK_VERIFIED
// Compute aHash. The authorizing object sign a digest
// aHash := hash(approvedPolicy || policyRef).
// Start hash
authHash.t.size = CryptStartHash(hashAlg, &hashState);
// add approvedPolicy
CryptUpdateDigest2B(&hashState, &in->approvedPolicy.b);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 289
October 31, 2013

Part 3: Commands
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

Trusted Platform Module Library

// add policyRef
CryptUpdateDigest2B(&hashState, &in->policyRef.b);
// complete hash
CryptCompleteHash2B(&hashState, &authHash.b);
// re-compute TPMT_TK_VERIFIED
TicketComputeVerified(in->checkTicket.hierarchy, &authHash,
&in->keySign, &ticket);
// Compare ticket digest. If not match, return error
if(!Memory2BEqual(&in->checkTicket.digest.b, &ticket.digest.b))
return TPM_RC_VALUE+ RC_PolicyAuthorize_checkTicket;
}
// Internal Data Update
// Set policyDigest to zero digest
MemorySet(session->u2.policyDigest.t.buffer, 0,
session->u2.policyDigest.t.size);
// Update policyDigest
PolicyContextUpdate(TPM_CC_PolicyAuthorize, &in->keySign, &in->policyRef,
NULL, 0, session);
return TPM_RC_SUCCESS;
}

Page 290
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.17 TPM2_PolicyAuthValue
25.17.1

General Description

This command allows a policy to be bound to the authorization value of the authorized object.
When this command completes successfully, policySession→isAuthValueNeeded is SET to indicate that
the authValue will be included in hmacKey when the authorization HMAC is computed for this session.
Additionally, policySession→isPasswordNeeded will be CLEAR.
NOTE

If a policy does not use this command, then the hmacKey for the authorized command would only
use sessionKey. If sessionKey is not present, then the hmacKey is an Empty Buffer and no HMAC
would be computed.

If successful, policySession→policyDigest will be updated with

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyAuthValue)

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

(36)

Page 291
October 31, 2013

Part 3: Commands

25.17.2

Trusted Platform Module Library

Command and Response
Table 141 — TPM2_PolicyAuthValue Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyAuthValue

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

Table 142 — TPM2_PolicyAuthValue Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 292
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.17.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyAuthValue_fp.h"
#include "Policy_spt_fp.h"

TPM_RC
TPM2_PolicyAuthValue(
PolicyAuthValue_In

*in

// IN: input parameter list

SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyAuthValue;
hashState;

)
{

// Internal Data Update
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyAuthValue)
//
Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// complete the hash and get the results
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// update isAuthValueNeeded bit in the session context
session->attributes.isAuthValueNeeded = SET;
session->attributes.isPasswordNeeded = CLEAR;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 293
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.18 TPM2_PolicyPassword
25.18.1

General Description

This command allows a policy to be bound to the authorization value of the authorized object.
When this command completes successfully, policySession→isPasswordNeeded is SET to indicate that
authValue of the authorized object will be checked when the session is used for authorization. The caller
will provide the authValue in clear text in the hmac parameter of the authorization. The comparison of
hmac to authValue is performed as if the authorization is a password.
NOTE 1

The parameter field in the policy session where the authorization value is provided is called hmac. If
TPM2_PolicyPassword() is part of the sequence, then the field will contain a password and not an
HMAC.

If successful, policySession→policyDigest will be updated with

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyAuthValue)
NOTE 2

(37)

This is the same extend value as used with TPM2_PolicyAuthValue so that the evaluation may be
done using either an HMAC or a password with no change to the authPolicy of the object. The
reason that two commands are present is to indicate to the TPM if the hmac field in the authorization
will contain an HMAC or a password value.

When this command is successful, policySession→isAuthValueNeeded will be CLEAR.

Page 294
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.18.2

Part 3: Commands

Command and Response
Table 143 — TPM2_PolicyPassword Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyPassword

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

Table 144 — TPM2_PolicyPassword Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 295
October 31, 2013

Part 3: Commands

25.18.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyPassword_fp.h"
#include "Policy_spt_fp.h"

TPM_RC
TPM2_PolicyPassword(
PolicyPassword_In

*in

// IN: input parameter list

SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyAuthValue;
hashState;

)
{

// Internal Data Update
// Get pointer to the session structure
session = SessionGet(in->policySession);
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyAuthValue)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
// Update isPasswordNeeded bit
session->attributes.isPasswordNeeded = SET;
session->attributes.isAuthValueNeeded = CLEAR;
return TPM_RC_SUCCESS;
}

Page 296
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

25.19 TPM2_PolicyGetDigest
25.19.1

General Description

This command returns the current policyDigest of the session. This command allows the TPM to be used
to perform the actions required to pre-compute the authPolicy for an object.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 297
October 31, 2013

Part 3: Commands

25.19.2

Trusted Platform Module Library

Command and Response
Table 145 — TPM2_PolicyGetDigest Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyGetDigest

TPMI_SH_POLICY

policySession

handle for the policy session
Auth Index: None

Table 146 — TPM2_PolicyGetDigest Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_DIGEST

policyDigest

Page 298
October 31, 2013

the current value of the policySession→policyDigest

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.19.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyGetDigest_fp.h"

TPM_RC
TPM2_PolicyGetDigest(
PolicyGetDigest_In
PolicyGetDigest_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
SESSION

*session;

// Command Output
// Get pointer to the session structure
session = SessionGet(in->policySession);
out->policyDigest = session->u2.policyDigest;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 299
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

25.20 TPM2_PolicyNvWritten
25.20.1

General Description

This command allows a policy to be bound to the TPMA_NV_WRITTEN attributes. This is a deferred
assertion. Values are stored in the policy session context and checked when the policy is used for
authorization.
If policySession→checkNVWritten is CLEAR, it is SET and policySession→nvWrittenState is set to
writtenSet.
If policySession→checkNVWritten is SET, the TPM will return TPM_RC_VALUE if
policySession→nvWrittenState and writtenSet are not the same.
If the TPM does not return and error, it will update policySession→policyDigest by

policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyNvWritten || writtenSet)

(38)

When the policy session is used to authorize a command, the TPM will fail the command if
policySession→checkNVWritten is SET and nvIndex→attributes→TPMA_NV_WRITTEN does not match
policySession→nvWrittenState.
NOTE

A typical use case is a simple policy for the first write during manufacturing provisioning that would
require TPMA_NV_WRITTEN CLEAR and a more complex policy for later use that would require
TPMA_NV_WRITTEN SET.

Page 300
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

25.20.2

Part 3: Commands

Command and Response
Table 147 — TPM2_PolicyNvWritten Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

Tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PolicyNVWritten

TPMI_SH_POLICY

policySession

handle for the policy session being extended
Auth Index: None

TPMI_YES_NO

writtenSet

YES if NV Index is required to have been written
NO if NV Index is required not to have been written

Table 148 — TPM2_PolicyNvWritten Response
Type

Name

Description

TPM_ST

Tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 301
October 31, 2013

Part 3: Commands

25.20.3
1
2

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "PolicyNvWritten_fp.h"

Make an NV Index policy dependent on the state of the TPMA_NV_WRITTEN attribute of the index.
Error Returns
TPM_RC_VALUE
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Meaning
a conflicting request for the attribute has already been processed

TPM_RC
TPM2_PolicyNvWritten(
PolicyNvWritten_In

*in

// IN: input parameter list

)
{
SESSION
TPM_CC
HASH_STATE

*session;
commandCode = TPM_CC_PolicyNvWritten;
hashState;

// Input Validation
// Get pointer to the session structure
session = SessionGet(in->policySession);
// If already set is this a duplicate (the same setting)? If it
// is a conflicting setting, it is an error
if(session->attributes.checkNvWritten == SET)
{
if((
(session->attributes.nvWrittenState == SET)
!= (in->writtenSet == YES)))
return TPM_RC_VALUE + RC_PolicyNvWritten_writtenSet;
}
// Internal Data Update
// Set session attributes so that the NV Index needs to be checked
session->attributes.checkNvWritten = SET;
session->attributes.nvWrittenState = (in->writtenSet == YES);
// Update policy hash
// policyDigestnew = hash(policyDigestold || TPM_CC_PolicyNvWritten
//
|| writtenSet)
// Start hash
CryptStartHash(session->authHashAlg, &hashState);
// add old digest
CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
// add commandCode
CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
// add the byte of writtenState
CryptUpdateDigestInt(&hashState, sizeof(TPMI_YES_NO), &in->writtenSet);
// complete the digest
CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
return TPM_RC_SUCCESS;
}

Page 302
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Family “2.0”
Level 00 Revision 00.99

Part 3: Commands

Published
Copyright © TCG 2006-2013

Page 303
October 31, 2013

Part 3: Commands

26

Trusted Platform Module Library

Hierarchy Commands

26.1

TPM2_CreatePrimary

26.1.1 General Description
This command is used to create a Primary Object under one of the Primary Seeds or a Temporary Object
under TPM_RH_NULL. The command uses a TPM2B_PUBLIC as a template for the object to be created.
The command will create and load a Primary Object. The sensitive area is not returned.
NOTE:

Since the sensitive data is not returned, the key cannot be reloaded.
persistent or it can be recreated.

It can either be made

Any type of object and attributes combination that is allowed by TPM2_Create() may be created by this
command. The constraints on templates and parameters are the same as TPM2_Create() except that a
Primary Storage Key and a Temporary Storage Key are not constrained to use the algorithms of their
parents.
For setting of the attributes of the created object, fixedParent, fixedTPM, userWithAuth, adminWithPolicy,
encrypt, and restricted are implied to be SET in the parent (a Permanent Handle). The remaining
attributes are implied to be CLEAR.
The TPM will derive the object from the Primary Seed indicated in primaryHandle using an approved
KDF. All of the bits of the template are used in the creation of the Primary Key. Methods for creating a
Primary Object from a Primary Seed are described in Part 1 of this specification and implemented in Part
4.
If this command is called multiple times with the same inPublic parameter, inSensitive.data, and Primary
Seed, the TPM shall produce the same Primary Object.
NOTE

If the Primary Seed is changed, the Primary Objects generated with the new seed shall be
statistically unique even if the parameters of the call are the same.

This command requires authorization. Authorization for a Primary Object attached to the Platform Primary
Seed (PPS) shall be provided by platformAuth or platformPolicy. Authorization for a Primary Object
attached to the Storage Primary Seed (SPS) shall be provided by ownerAuth or ownerPolicy.
Authorization for a Primary Key attached to the Endorsement Primary Seed (EPS) shall be provided by
endorsementAuth or endorsementPolicy.

Page 304
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.1.2 Command and Response
Table 149 — TPM2_CreatePrimary Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_CreatePrimary

TPMI_RH_HIERARCHY+

@primaryHandle

TPM_RH_ENDORSEMENT, TPM_RH_OWNER,
TPM_RH_PLATFORM+{PP}, or TPM_RH_NULL
Auth Index: 1
Auth Role: USER

TPM2B_SENSITIVE_CREATE

inSensitive

the sensitive data, see Part 1 Sensitive Values

TPM2B_PUBLIC

inPublic

the public template

TPM2B_DATA

outsideInfo

data that will be included in the creation data for this
object to provide permanent, verifiable linkage between
this object and some object owner data

TPML_PCR_SELECTION

creationPCR

PCR that will be used in creation data

Table 150 — TPM2_CreatePrimary Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM_HANDLE

objectHandle

Handle for created Primary Object

TPM2B_PUBLIC

outPublic

the public portion of the created object

TPM2B_CREATION_DATA

creationData

contains a TPMT_CREATION_DATA

TPM2B_DIGEST

creationHash

digest of creationData using nameAlg of outPublic

TPMT_TK_CREATION

creationTicket

ticket used by TPM2_CertifyCreation() to validate that
the creation data was produced by the TPM

TPM2B_NAME

name

the name of the created object

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 305
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.1.3 Detailed Actions
1
2
3
4

#include
#include
#include
#include

"InternalRoutines.h"
"CreatePrimary_fp.h"
"Object_spt_fp.h"
<Platform.h>

Error Returns
TPM_RC_ATTRIBUTES

sensitiveDataOrigin is CLEAR when 'sensitive. data' is an Empty
Buffer, or is SET when 'sensitive. data' is not empty; fixedTPM,
fixedParent, or encryptedDuplication attributes are inconsistent
between themselves or with those of the parent object; inconsistent
restricted, decrypt and sign attributes; attempt to inject sensitive data
for an asymmetric key; attempt to create a symmetric cipher key that
is not a decryption key

TPM_RC_KDF

incorrect KDF specified for decrypting keyed hash object

TPM_RC_OBJECT_MEMORY

there is no free slot for the object

TPM_RC_SCHEME

inconsistent attributes decrypt, sign, restricted and key's scheme ID;
or hash algorithm is inconsistent with the scheme ID for keyed hash
object

TPM_RC_SIZE

size of public auth policy or sensitive auth value does not match
digest size of the name algorithm sensitive data size for the keyed
hash object is larger than is allowed for the scheme

TPM_RC_SYMMETRIC

a storage key with no symmetric algorithm specified; or non-storage
key with symmetric algorithm different from TPM_ALG_NULL

TPM_RC_TYPE
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Meaning

unknown object type;

TPM_RC
TPM2_CreatePrimary(
CreatePrimary_In
CreatePrimary_Out
)
{
// Local variables
TPM_RC
TPMT_SENSITIVE

*in,
*out

// IN: input parameter list
// OUT: output parameter list

result = TPM_RC_SUCCESS;
sensitive;

// Input Validation
// The sensitiveDataOrigin attribute must be consistent with the setting of
// the size of the data object in inSensitive.
if(
(in->inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin == SET)
!= (in->inSensitive.t.sensitive.data.t.size == 0 ))
// Mismatch between the object attributes and the parameter.
return TPM_RC_ATTRIBUTES + RC_CreatePrimary_inSensitive;
// Check attributes in input public area. TPM_RC_ATTRIBUTES, TPM_RC_KDF,
// TPM_RC_SCHEME, TPM_RC_SIZE, TPM_RC_SYMMETRIC, or TPM_RC_TYPE error may
// be returned at this point.
result = PublicAttributesValidation(FALSE, in->primaryHandle,
&in->inPublic.t.publicArea);
if(result != TPM_RC_SUCCESS)
return RcSafeAddToResult(result, RC_CreatePrimary_inPublic);
// Validate the sensitive area values
if( MemoryRemoveTrailingZeros(&in->inSensitive.t.sensitive.userAuth)
> CryptGetHashDigestSize(in->inPublic.t.publicArea.nameAlg))

Page 306
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

Part 3: Commands

return TPM_RC_SIZE + RC_CreatePrimary_inSensitive;
// Command output
// Generate Primary Object
// The primary key generation process uses the Name of the input public
// template to compute the key. The keys are generated from the template
// before anything in the template is allowed to be changed.
// A TPM_RC_KDF, TPM_RC_SIZE error may be returned at this point
result = CryptCreateObject(in->primaryHandle, &in->inPublic.t.publicArea,
&in->inSensitive.t.sensitive,&sensitive);
if(result != TPM_RC_SUCCESS)
return result;
// Fill in creation data
FillInCreationData(in->primaryHandle, in->inPublic.t.publicArea.nameAlg,
&in->creationPCR, &in->outsideInfo, &out->creationData,
&out->creationHash);
// Copy public area
out->outPublic = in->inPublic;
// Fill in private area for output
ObjectComputeName(&(out->outPublic.t.publicArea), &out->name);
// Compute creation ticket
TicketComputeCreation(EntityGetHierarchy(in->primaryHandle), &out->name,
&out->creationHash, &out->creationTicket);
// Create a internal object. A TPM_RC_OBJECT_MEMORY error may be returned
// at this point.
result = ObjectLoad(in->primaryHandle, &in->inPublic.t.publicArea, &sensitive,
&out->name, in->primaryHandle, TRUE, &out->objectHandle);
return result;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 307
October 31, 2013

Part 3: Commands

26.2

Trusted Platform Module Library

TPM2_HierarchyControl

26.2.1 General Description
This command enables and disables use of a hierarchy and its associated NV storage. The command
allows phEnable, phEnableNV, shEnable, and ehEnable to be changed when the proper authorization is
provided.
This command may be used to CLEAR phEnable and phEnableNV if platformAuth/platformPolicy is
provided. phEnable may not be SET using this command.
This command may be used to CLEAR shEnable if either platformAuth/platformPolicy
ownerAuth/ownerPolicy is provided. shEnable may be SET if platformAuth/platformPolicy is provided.

or

This command may be used to CLEAR ehEnable if either platformAuth/platformPolicy or
endorsementAuth/endorsementPolicy is provided. ehEnable may be SET if platformAuth/platformPolicy is
provided.
When this command is used to CLEAR phEnable, shEnable, or ehEnable, the TPM will disable use of
any persistent entity associated with the disabled hierarchy and will flush any transient objects associated
with the disabled hierarchy.
When this command is used to CLEAR shEnable, the TPM will disable access to any NV index that has
TPMA_NV_PLATFORMCREATE CLEAR (indicating that the NV Index was defined using ownerAuth). As
long as shEnable is CLEAR, the TPM will return an error in response to any command that attempts to
operate upon an NV index that has TPMA_NV_PLATFORMCREATE CLEAR.
When this command is used to CLEAR phEnableNV, the TPM will disable access to any NV index that
has TPMA_NV_PLATFORMCREATE SET (indicating that the NV Index was defined using platformAuth).
As long as phEnableNV is CLEAR, the TPM will return an error in response to any command that
attempts to operate upon an NV index that has TPMA_NV_PLATFORMCREATE SET.

Page 308
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.2.2 Command and Response
Table 151 — TPM2_HierarchyControl Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_HierarchyControl {NV E}

TPMI_RH_HIERARCHY

@authHandle

TPM_RH_ENDORSEMENT, TPM_RH_OWNER or
TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPMI_RH_ENABLES

enable

the enable being modified
TPM_RH_ENDORSEMENT, TPM_RH_OWNER,
TPM_RH_PLATFORM, or TPM_RH_PLATFORM_NV

TPMI_YES_NO

state

YES if the enable should be SET, NO if the enable
should be CLEAR

Table 152 — TPM2_HierarchyControl Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 309
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "HierarchyControl_fp.h"
Error Returns
TPM_RC_AUTH_TYPE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

Meaning
authHandle is not applicable to hierarchy in its current state

TPM_RC
TPM2_HierarchyControl(
HierarchyControl_In

*in

// IN: input parameter list

)
{
TPM_RC
BOOL
BOOL

result;
select = (in->state == YES);
*selected = NULL;

// Input Validation
switch(in->enable)
{
// Platform hierarchy has to be disabled by platform auth
// If the platform hierarchy has already been disabled, only a reboot
// can enable it again
case TPM_RH_PLATFORM:
case TPM_RH_PLATFORM_NV:
if(in->authHandle != TPM_RH_PLATFORM)
return TPM_RC_AUTH_TYPE;
break;
// ShEnable may be disabled if PlatformAuth/PlatformPolicy or
// OwnerAuth/OwnerPolicy is provided. If ShEnable is disabled, then it
// may only be enabled if PlatformAuth/PlatformPolicy is provided.
case TPM_RH_OWNER:
if(
in->authHandle != TPM_RH_PLATFORM
&& in->authHandle != TPM_RH_OWNER)
return TPM_RC_AUTH_TYPE;
if(
gc.shEnable == FALSE && in->state == YES
&& in->authHandle != TPM_RH_PLATFORM)
return TPM_RC_AUTH_TYPE;
break;
// EhEnable may be disabled if either PlatformAuth/PlatformPolicy or
// EndosementAuth/EndorsementPolicy is provided. If EhEnable is disabled,
// then it may only be enabled if PlatformAuth/PlatformPolicy is
// provided.
case TPM_RH_ENDORSEMENT:
if(
in->authHandle != TPM_RH_PLATFORM
&& in->authHandle != TPM_RH_ENDORSEMENT)
return TPM_RC_AUTH_TYPE;
if(
gc.ehEnable == FALSE && in->state == YES
&& in->authHandle != TPM_RH_PLATFORM)
return TPM_RC_AUTH_TYPE;
break;
default:
pAssert(FALSE);
break;
}
// Internal Data Update

Page 310
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

Part 3: Commands

// Enable or disable the selected hierarchy
// Note: the authorization processing for this command may keep these
// command actions from being executed. For example, if phEnable is
// CLEAR, then platformAuth cannot be used for authorization. This
// means that would not be possible to use platformAuth to change the
// state of phEnable from CLEAR to SET.
// If it is decided that platformPolicy can still be used when phEnable
// is CLEAR, then this code could SET phEnable when proper platform
// policy is provided.
switch(in->enable)
{
case TPM_RH_OWNER:
selected = &gc.shEnable;
break;
case TPM_RH_ENDORSEMENT:
selected = &gc.ehEnable;
break;
case TPM_RH_PLATFORM:
selected = &g_phEnable;
break;
case TPM_RH_PLATFORM_NV:
selected = &gc.phEnableNV;
break;
default:
pAssert(FALSE);
break;
}
if(selected != NULL && *selected != select)
{
// Before changing the internal state, make sure that NV is available.
// Only need to update NV if changing the orderly state
if(gp.orderlyState != SHUTDOWN_NONE)
{
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
}
// state is changing and NV is available so modify
*selected = select;
// If a hierarchy was just disabled, flush it
if(select == CLEAR && in->enable != TPM_RH_PLATFORM_NV)
// Flush hierarchy
ObjectFlushHierarchy(in->enable);
// orderly state should be cleared because of the update to state clear data
// This gets processed in ExecuteCommand() on the way out.
g_clearOrderly = TRUE;
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 311
October 31, 2013

Part 3: Commands

26.3

Trusted Platform Module Library

TPM2_SetPrimaryPolicy

26.3.1 General Description
This command allows setting of the authorization policy for the platform hierarchy (platformPolicy), the
storage hierarchy (ownerPolicy), and the endorsement hierarchy (endorsementPolicy).
The command requires an authorization session. The session shall use the current authValue or satisfy
the current authPolicy for the referenced hierarchy.
The policy that is changed is the policy associated with authHandle.
If the enable associated with authHandle is not SET, then the associated authorization values (authValue
or authPolicy) may not be used.

Page 312
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.3.2 Command and Response
Table 153 — TPM2_SetPrimaryPolicy Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_SetPrimaryPolicy {NV}

TPMI_RH_HIERARCHY

@authHandle

TPM_RH_ENDORSEMENT, TPM_RH_OWNER or
TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPM2B_DIGEST

authPolicy

an authorization policy digest; may be the Empty Buffer
If hashAlg is TPM_ALG_NULL, then this shall be an
Empty Buffer.

TPMI_ALG_HASH+

hashAlg

the hash algorithm to use for the policy
If the authPolicy is an Empty Buffer, then this field shall
be TPM_ALG_NULL.

Table 154 — TPM2_SetPrimaryPolicy Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 313
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.3.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "SetPrimaryPolicy_fp.h"
Error Returns
TPM_RC_SIZE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

Meaning
size of input authPolicy is not consistent with input hash algorithm

TPM_RC
TPM2_SetPrimaryPolicy(
SetPrimaryPolicy_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// Input Validation
// Check the authPolicy consistent with hash algorithm
if(
in->authPolicy.t.size != 0
&& in->authPolicy.t.size != CryptGetHashDigestSize(in->hashAlg))
return TPM_RC_SIZE + RC_SetPrimaryPolicy_authPolicy;
// The command need NV update for OWNER and ENDORSEMENT hierarchy, and
// might need orderlyState update for PLATFROM hierarchy.
// Check if NV is available. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE
// error may be returned at this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Internal Data Update
// Set hierarchy policy
switch(in->authHandle)
{
case TPM_RH_OWNER:
gp.ownerAlg = in->hashAlg;
gp.ownerPolicy = in->authPolicy;
NvWriteReserved(NV_OWNER_ALG, &gp.ownerAlg);
NvWriteReserved(NV_OWNER_POLICY, &gp.ownerPolicy);
break;
case TPM_RH_ENDORSEMENT:
gp.endorsementAlg = in->hashAlg;
gp.endorsementPolicy = in->authPolicy;
NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
break;
case TPM_RH_PLATFORM:
gc.platformAlg = in->hashAlg;
gc.platformPolicy = in->authPolicy;
// need to update orderly state
g_clearOrderly = TRUE;
break;
default:
pAssert(FALSE);
break;
}
return TPM_RC_SUCCESS;
}

Page 314
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

26.4

Part 3: Commands

TPM2_ChangePPS

26.4.1 General Description
This replaces the current PPS with a value from the RNG and sets platformPolicy to the default
initialization value (the Empty Buffer).
NOTE 1

A policy that is the Empty Buffer can match no policy.

NOTE 2

platformAuth is not changed.

All loaded transient and persistent objects in the Platform hierarchy are flushed.
Saved contexts in the Platform hierarchy that were created under the old PPS will no longer be able to be
loaded.
The policy hash algorithm for PCR is reset to TPM_ALG_NULL.
This command does not clear any NV Index values.
NOTE 3

Index values belonging to the Platform are preserved because the indexes may have configuration
information that will be the same after the PPS changes. The Platform may remove the indexes that
are no longer needed using TPM2_NV_UndefineSpace().

This command requires platformAuth.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 315
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.4.2 Command and Response
Table 155 — TPM2_ChangePPS Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ChangePPS {NV E}

TPMI_RH_PLATFORM

@authHandle

TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

Description

Table 156 — TPM2_ChangePPS Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 316
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.4.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

#include "InternalRoutines.h"
#include "ChangePPS_fp.h"

TPM_RC
TPM2_ChangePPS(
ChangePPS_In

*in

// IN: input parameter list

)
{
UINT32
TPM_RC

i;
result;

// Check if NV is available. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE
// error may be returned at this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input parameter is not reference in command action
in = NULL;
// Internal Data Update
// Reset platform hierarchy seed from RNG
CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.PPSeed.t.buffer);
// Create a new phProof value from RNG to prevent the saved platform
// hierarchy contexts being loaded
CryptGenerateRandom(PROOF_SIZE, gp.phProof.t.buffer);
// Set platform authPolicy to null
gc.platformAlg = TPM_ALG_NULL;
gc.platformPolicy.t.size = 0;
// Flush loaded object in platform hierarchy
ObjectFlushHierarchy(TPM_RH_PLATFORM);
// Flush platform evict object and index in NV
NvFlushHierarchy(TPM_RH_PLATFORM);
// Save hierarchy changes to NV
NvWriteReserved(NV_PP_SEED, &gp.PPSeed);
NvWriteReserved(NV_PH_PROOF, &gp.phProof);
// Re-initialize PCR policies
for(i = 0; i < NUM_POLICY_PCR_GROUP; i++)
{
gp.pcrPolicies.hashAlg[i] = TPM_ALG_NULL;
gp.pcrPolicies.policy[i].t.size = 0;
}
NvWriteReserved(NV_PCR_POLICIES, &gp.pcrPolicies);
// orderly state should be cleared because of the update to state clear data
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 317
October 31, 2013

Part 3: Commands

26.5

Trusted Platform Module Library

TPM2_ChangeEPS

26.5.1 General Description
This replaces the current EPS with a value from the RNG and sets the Endorsement hierarchy controls to
their default initialization values: ehEnable is SET, endorsementAuth and endorsementPolicy both equal
to the Empty Buffer. It will flush any loaded objects in the EPS hierarchy and not allow objects in the
hierarchy associated with the previous EPS to be loaded.
NOTE

In the reference implementation, ehProof is a non-volatile value from the RNG. It is allowed that the
ehProof be generated by a KDF using both the EPS and SPS as inputs. If generated with a KDF, the
ehProof can be generated on an as-needed basis or made a non-volatile value.

This command requires platformAuth.

Page 318
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.5.2 Command and Response
Table 157 — TPM2_ChangeEPS Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ChangeEPS {NV E}

TPMI_RH_PLATFORM

@authHandle

TPM_RH_PLATFORM+{PP}
Auth Handle: 1
Auth Role: USER

Description

Table 158 — TPM2_ChangeEPS Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 319
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.5.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

#include "InternalRoutines.h"
#include "ChangeEPS_fp.h"

TPM_RC
TPM2_ChangeEPS(
ChangeEPS_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input parameter is not reference in command action
in = NULL;
// Internal Data Update
// Reset endorsement hierarchy seed from RNG
CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.EPSeed.t.buffer);
// Create new ehProof value from RNG
CryptGenerateRandom(PROOF_SIZE, gp.ehProof.t.buffer);
// Enable endorsement hierarchy
gc.ehEnable = TRUE;
// set authValue buffer to zeros
MemorySet(gp.endorsementAuth.t.buffer, 0, gp.endorsementAuth.t.size);
// Set endorsement authValue to null
gp.endorsementAuth.t.size = 0;
// Set endorsement authPolicy to null
gp.endorsementAlg = TPM_ALG_NULL;
gp.endorsementPolicy.t.size = 0;
// Flush loaded object in endorsement hierarchy
ObjectFlushHierarchy(TPM_RH_ENDORSEMENT);
// Flush evict object of endorsement hierarchy stored in NV
NvFlushHierarchy(TPM_RH_ENDORSEMENT);
// Save hierarchy changes to NV
NvWriteReserved(NV_EP_SEED, &gp.EPSeed);
NvWriteReserved(NV_EH_PROOF, &gp.ehProof);
NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
// orderly state should be cleared because of the update to state clear data
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 320
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

26.6

Part 3: Commands

TPM2_Clear

26.6.1 General Description
This command removes all TPM context associated with a specific Owner.
The clear operation will:


flush loaded objects (persistent and volatile) in the Storage and Endorsement hierarchies;



delete any NV Index with TPMA_NV_PLATFORMCREATE == CLEAR;



change the SPS to a new value from the TPM’s random number generator (RNG),



change shProof and ehProof,
NOTE

The proof values may be set from the RNG or derived from the associated new Primary Seed. If
derived from the Primary Seeds, the derivation of ehProof shall use both the SPS and EPS. The
computation shall use the SPS as an HMAC key and the derived value may then be a parameter
in a second HMAC in which the EPS is the HMAC key. The reference design uses values from
the RNG.



SET shEnable and ehEnable;



set ownerAuth, endorsementAuth, and lockoutAuth to the Empty Buffer;



set ownerPolicy and endorsementPolicy to the Empty Buffer;



set Clock to zero;



set resetCount to zero;



set restartCount to zero; and



set Safe to YES.

This command requires platformAuth or lockoutAuth. If TPM2_ClearControl() has disabled this command,
the TPM shall return TPM_RC_DISABLED.
If this command is authorized using lockoutAuth, the HMAC in the response shall use the new
lockoutAuth value (that is, the Empty Buffer) when computing response HMAC.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 321
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.6.2 Command and Response
Table 159 — TPM2_Clear Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_Clear {NV E}

TPMI_RH_CLEAR

@authHandle

TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
Auth Handle: 1
Auth Role: USER

Description

Table 160 — TPM2_Clear Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 322
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.6.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "Clear_fp.h"
Error Returns
TPM_RC_DISABLED

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

Meaning
Clear command has been disabled

TPM_RC
TPM2_Clear(
Clear_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// Input parameter is not reference in command action
in = NULL;
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation
// If Clear command is disabled, return an error
if(gp.disableClear)
return TPM_RC_DISABLED;
// Internal Data Update
// Reset storage hierarchy seed from RNG
CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.SPSeed.t.buffer);
// Create new shProof and ehProof value from RNG
CryptGenerateRandom(PROOF_SIZE, gp.shProof.t.buffer);
CryptGenerateRandom(PROOF_SIZE, gp.ehProof.t.buffer);
// Enable storage and endorsement hierarchy
gc.shEnable = gc.ehEnable = TRUE;
// set the authValue buffers to zero
MemorySet(gp.ownerAuth.t.buffer, 0, gp.ownerAuth.t.size);
MemorySet(gp.endorsementAuth.t.buffer, 0, gp.endorsementAuth.t.size);
MemorySet(gp.lockoutAuth.t.buffer, 0, gp.lockoutAuth.t.size);
// Set storage, endorsement and lockout authValue to null
gp.ownerAuth.t.size = gp.endorsementAuth.t.size = gp.lockoutAuth.t.size = 0;
// Set storage and endorsement authPolicy to null
gp.ownerAlg = gp.endorsementAlg = TPM_ALG_NULL;
gp.ownerPolicy.t.size = gp.endorsementPolicy.t.size = 0;
// Flush loaded object in storage and endorsement hierarchy
ObjectFlushHierarchy(TPM_RH_OWNER);
ObjectFlushHierarchy(TPM_RH_ENDORSEMENT);
// Flush owner and endorsement object and owner index in NV
NvFlushHierarchy(TPM_RH_OWNER);
NvFlushHierarchy(TPM_RH_ENDORSEMENT);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 323
October 31, 2013

Part 3: Commands
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

Trusted Platform Module Library

// Save hierarchy changes to NV
NvWriteReserved(NV_SP_SEED, &gp.SPSeed);
NvWriteReserved(NV_SH_PROOF, &gp.shProof);
NvWriteReserved(NV_EH_PROOF, &gp.ehProof);
NvWriteReserved(NV_OWNER_AUTH, &gp.ownerAuth);
NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
NvWriteReserved(NV_LOCKOUT_AUTH, &gp.lockoutAuth);
NvWriteReserved(NV_OWNER_ALG, &gp.ownerAlg);
NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
NvWriteReserved(NV_OWNER_POLICY, &gp.ownerPolicy);
NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
// Initialize dictionary attack parameters
DAPreInstall_Init();
// Reset clock
go.clock = 0;
go.clockSafe = YES;
// Update the DRBG state whenever writing orderly state to NV
CryptDrbgGetPutState(GET_STATE);
NvWriteReserved(NV_ORDERLY_DATA, &go);
// Reset counters
gp.resetCount = gr.restartCount = gr.clearCount = 0;
gp.auditCounter = 0;
NvWriteReserved(NV_RESET_COUNT, &gp.resetCount);
NvWriteReserved(NV_AUDIT_COUNTER, &gp.auditCounter);
// orderly state should be cleared because of the update to state clear data
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 324
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

26.7

Part 3: Commands

TPM2_ClearControl

26.7.1 General Description
TPM2_ClearControl() disables and enables the execution of TPM2_Clear().
The TPM will SET the TPM’s TPMA_PERMANENT.disableClear attribute if disable is YES and will
CLEAR the attribute if disable is NO. When the attribute is SET, TPM2_Clear() may not be executed.
NOTE

This is to simplify the logic of TPM2_Clear(). TPM2_ClearControl() can be called using platformAuth
to CLEAR the disableClear attribute and then execute TPM2_Clear().

LockoutAuth may be used to SET disableClear but not to CLEAR it.
PlatformAuth may be used to SET or CLEAR disableClear.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 325
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.7.2 Command and Response
Table 161 — TPM2_ClearControl Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ClearControl {NV}

TPMI_RH_CLEAR

@auth

TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
Auth Handle: 1
Auth Role: USER

TPMI_YES_NO

disable

YES if the disableOwnerClear flag is to be SET, NO if
the flag is to be CLEAR.

Table 162 — TPM2_ClearControl Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 326
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.7.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "ClearControl_fp.h"
Error Returns
TPM_RC_AUTH_FAIL

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Meaning
authorization is not properly given

TPM_RC
TPM2_ClearControl(
ClearControl_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation
// LockoutAuth may be used to set disableLockoutClear to TRUE but not to FALSE
if(in->auth == TPM_RH_LOCKOUT && in->disable == NO)
return TPM_RC_AUTH_FAIL;
// Internal Data Update
if(in->disable == YES)
gp.disableClear = TRUE;
else
gp.disableClear = FALSE;
// Record the change to NV
NvWriteReserved(NV_DISABLE_CLEAR, &gp.disableClear);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 327
October 31, 2013

Part 3: Commands

26.8

Trusted Platform Module Library

TPM2_HierarchyChangeAuth

26.8.1 General Description
This command allows the authorization secret for a hierarchy or lockout to be changed using the current
authorization value as the command authorization.
If authHandle is TPM_RH_PLATFORM, then platformAuth is changed. If authHandle is
TPM_RH_OWNER, then ownerAuth is changed. If authHandle is TPM_RH_ENDORSEMENT, then
endorsementAuth is changed. If authHandle is TPM_RH_LOCKOUT, then lockoutAuth is changed.
If authHandle is TPM_RH_PLATFORM, then Physical Presence may need to be asserted for this
command to succeed (see 28.2, “TPM2_PP_Commands”).
The authorization value may be no larger than the digest produced by the hash algorithm used for context
integrity.
EXAMPLE

If SHA384 is used in the computation of the integrity values for saved contexts, then the largest
authorization value is 48 octets.

Page 328
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

26.8.2 Command and Response
Table 163 — TPM2_HierarchyChangeAuth Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_HierarchyChangeAuth {NV}

TPMI_RH_HIERARCHY_AUTH

@authHandle

TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT,
TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPM2B_AUTH

newAuth

new authorization value

Table 164 — TPM2_HierarchyChangeAuth Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 329
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

26.8.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "HierarchyChangeAuth_fp.h"
#include "Object_spt_fp.h"
Error Returns
TPM_RC_SIZE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Meaning
newAuth size is greater than that of integrity hash digest

TPM_RC
TPM2_HierarchyChangeAuth(
HierarchyChangeAuth_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Make sure the the auth value is a reasonable size (not larger than
// the size of the digest produced by the integrity hash. The integrity
// hash is assumed to produce the longest digest of any hash implemented
// on the TPM.
if( MemoryRemoveTrailingZeros(&in->newAuth)
> CryptGetHashDigestSize(CONTEXT_INTEGRITY_HASH_ALG))
return TPM_RC_SIZE + RC_HierarchyChangeAuth_newAuth;
// Set hierarchy authValue
switch(in->authHandle)
{
case TPM_RH_OWNER:
gp.ownerAuth = in->newAuth;
NvWriteReserved(NV_OWNER_AUTH, &gp.ownerAuth);
break;
case TPM_RH_ENDORSEMENT:
gp.endorsementAuth = in->newAuth;
NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
break;
case TPM_RH_PLATFORM:
gc.platformAuth = in->newAuth;
// orderly state should be cleared
g_clearOrderly = TRUE;
break;
case TPM_RH_LOCKOUT:
gp.lockoutAuth = in->newAuth;
NvWriteReserved(NV_LOCKOUT_AUTH, &gp.lockoutAuth);
break;
default:
pAssert(FALSE);
break;
}
return TPM_RC_SUCCESS;
}

Page 330
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

27

Part 3: Commands

Dictionary Attack Functions

27.1

Introduction

A TPM is required to have support for logic that will help prevent a dictionary attack on an authorization
value. The protection is provided by a counter that increments when a password authorization or an
HMAC authorization fails. When the counter reaches a predefined value, the TPM will not accept, for
some time interval, further requests that require authorization and the TPM is in Lockout mode. While the
TPM is in Lockout mode, the TPM will return TPM_RC_LOCKED if the command requires use of an
object’s or Index’s authValue unless the authorization applies to an entry in the Platform hierarchy.
NOTE

Authorizations for objects and NV Index values in the Platform hierarchy are never locked out.
However, a command that requires multiple authorizations will not be accepted when the TPM is in
Lockout mode unless all of the authorizations reference objects and indexes in the Platform
hierarchy.

If the TPM is continuously powered for the duration of newRecoveryTime and no authorization failures
occur, the authorization failure counter will be decremented by one. This property is called “self-healing.”
Self-healing shall not cause the count of failed attempts to decrement below zero.
The count of failed attempts, the lockout interval, and self-healing interval are settable using
TPM2_DictionaryAttackParameters(). The lockout parameters and the current value of the lockout
counter can be read with TPM2_GetCapability().
Dictionary attack protection does not apply to an entity associated with a permanent handle (handle type
== TPM_HT_PERMANENT).
27.2

TPM2_DictionaryAttackLockReset

27.2.1 General Description
This command cancels the effect of a TPM lockout due to a number of successive authorization failures.
If this command is properly authorized, the lockout counter is set to zero.
Only one authorization failure is allowed for this command during a lockoutRecovery interval (set using
TPM2_DictionaryAttackParameters().

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 331
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

27.2.2 Command and Response
Table 165 — TPM2_DictionaryAttackLockReset Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_DictionaryAttackLockReset {NV}

TPMI_RH_LOCKOUT

@lockHandle

TPM_RH_LOCKOUT
Auth Index: 1
Auth Role: USER

Description

Table 166 — TPM2_DictionaryAttackLockReset Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 332
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

27.2.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#include "InternalRoutines.h"
#include "DictionaryAttackLockReset_fp.h"

TPM_RC
TPM2_DictionaryAttackLockReset(
DictionaryAttackLockReset_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// Input parameter is not reference in command action
in = NULL;
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Internal Data Update
// Set failed tries to 0
gp.failedTries = 0;
// Record the changes to NV
NvWriteReserved(NV_FAILED_TRIES, &gp.failedTries);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 333
October 31, 2013

Part 3: Commands

27.3

Trusted Platform Module Library

TPM2_DictionaryAttackParameters

27.3.1 General Description
This command changes the lockout parameters.
The command requires lockoutAuth.
The timeout parameters (newRecoveryTime and lockoutRecovery) indicate values that are measured with
respect to the Time and not Clock.
NOTE

Use of Time means that the TPM shall be continuously powered for the duration of a timeout.

If newRecoveryTime is zero, then DA protection is disabled. Authorizations are checked but authorization
failures will not cause the TPM to enter lockout.
If newMaxTries is zero, the TPM will be in lockout and use of DA protected entities will be disabled.
If lockoutRecovery is zero, then the recovery interval is a boot cycle (_TPM_Init followed by
Startup(CLEAR).
This command will set the authorization failure count (failedTries) to zero.
Only one authorization failure is allowed for this command during a lockoutRecovery interval.

Page 334
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

27.3.2 Command and Response
Table 167 — TPM2_DictionaryAttackParameters Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_DictionaryAttackParameters {NV}

TPMI_RH_LOCKOUT

@lockHandle

TPM_RH_LOCKOUT
Auth Index: 1
Auth Role: USER

UINT32

newMaxTries

count of authorization failures before the lockout is
imposed

UINT32

newRecoveryTime

time in seconds before the authorization failure count
is automatically decremented
A value of zero indicates that DA protection is
disabled.

UINT32

lockoutRecovery

time in seconds after a lockoutAuth failure before use
of lockoutAuth is allowed
A value of zero indicates that a reboot is required.

Table 168 — TPM2_DictionaryAttackParameters Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 335
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

27.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#include "InternalRoutines.h"
#include "DictionaryAttackParameters_fp.h"

TPM_RC
TPM2_DictionaryAttackParameters(
DictionaryAttackParameters_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Internal Data Update
// Set dictionary attack parameters
gp.maxTries = in->newMaxTries;
gp.recoveryTime = in->newRecoveryTime;
gp.lockoutRecovery = in->lockoutRecovery;
// Set failed tries to 0
gp.failedTries = 0;
// Record the changes to NV
NvWriteReserved(NV_FAILED_TRIES, &gp.failedTries);
NvWriteReserved(NV_MAX_TRIES, &gp.maxTries);
NvWriteReserved(NV_RECOVERY_TIME, &gp.recoveryTime);
NvWriteReserved(NV_LOCKOUT_RECOVERY, &gp.lockoutRecovery);
return TPM_RC_SUCCESS;
}

Page 336
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

28

Part 3: Commands

Miscellaneous Management Functions

28.1

Introduction

This clause contains commands that do not logically group with any other commands.
28.2

TPM2_PP_Commands

28.2.1 General Description
This command is used to determine which commands require assertion of Physical Presence (PP) in
addition to platformAuth/platformPolicy.
This command requires that auth is TPM_RH_PLATFORM and that Physical Presence be asserted.
After this command executes successfully, the commands listed in setList will be added to the list of
commands that require that Physical Presence be asserted when the handle associated with the
authorization is TPM_RH_PLATFORM. The commands in clearList will no longer require assertion of
Physical Presence in order to authorize a command.
If a command is not in either list, its state is not changed. If a command is in both lists, then it will no
longer require Physical Presence (for example, setList is processed first).
Only commands with
handle types of
TPMI_RH_PLATFORM, TPMI_RH_PROVISION,
TPMI_RH_CLEAR, or TPMI_RH_HIERARCHY can be gated with Physical Presence. If any other
command is in either list, it is discarded.
When a command requires that Physical Presence be provided, then Physical Presence shall be
asserted for either an HMAC or a Policy authorization.
NOTE

Physical Presence may be made a requirement of any policy.

TPM2_PP_Commands() always requires assertion of Physical Presence.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 337
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

28.2.2 Command and Response
Table 169 — TPM2_PP_Commands Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_PP_Commands {NV}

TPMI_RH_PLATFORM

@auth

TPM_RH_PLATFORM+PP
Auth Index: 1
Auth Role: USER + Physical Presence

TPML_CC

setList

list of commands to be added to those that will require
that Physical Presence be asserted

TPML_CC

clearList

list of commands that will no longer require that
Physical Presence be asserted

Table 170 — TPM2_PP_Commands Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 338
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

28.2.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#include "InternalRoutines.h"
#include "PP_Commands_fp.h"

TPM_RC
TPM2_PP_Commands(
PP_Commands_In

*in

// IN: input parameter list

)
{
UINT32
TPM_RC

i;
result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Internal Data Update
// Process set list
for(i = 0; i < in->setList.count; i++)
// If command is implemented, set it as PP required. If the input
// command is not a PP command, it will be ignored at
// PhysicalPresenceCommandSet().
if(CommandIsImplemented(in->setList.commandCodes[i]))
PhysicalPresenceCommandSet(in->setList.commandCodes[i]);
// Process clear list
for(i = 0; i < in->clearList.count; i++)
// If command is implemented, clear it as PP required. If the input
// command is not a PP command, it will be ignored at
// PhysicalPresenceCommandClear(). If the input command is
// TPM2_PP_Commands, it will be ignored as well
if(CommandIsImplemented(in->clearList.commandCodes[i]))
PhysicalPresenceCommandClear(in->clearList.commandCodes[i]);
// Save the change of PP list
NvWriteReserved(NV_PP_LIST, &gp.ppList);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 339
October 31, 2013

Part 3: Commands

28.3

Trusted Platform Module Library

TPM2_SetAlgorithmSet

28.3.1 General Description
This command allows the platform to change the set of algorithms that are used by the TPM. The
algorithmSet setting is a vendor-dependent value.
If the changing of the algorithm set results in a change of the algorithms of PCR banks, then the TPM will
need to be reset (_TPM_Init and TPM2_Startup(TPM_SU_CLEAR)) before the new PCR settings take
effect. After this command executes successfully, if startupType in the next TPM2_Startup() is not
TPM_SU_CLEAR, the TPM shall return TPM_RC_VALUE and enter Failure mode.
This command does not change the algorithms available to the platform.
NOTE

The reference implementation does not have support for this command. In particular, it does not
support use of this command to selectively disable algorithms. Proper support wo uld require
modification of the unmarshaling code so that each time an algorithm is unmarshaled, it would be
verified as being enabled.

Page 340
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

28.3.2 Command and Response
Table 171 — TPM2_SetAlgorithmSet Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_SetAlgorithmSet {NV}

TPMI_RH_PLATFORM

@authHandle

TPM_RH_PLATFORM
Auth Index: 1
Auth Role: USER

UINT32

algorithmSet

a TPM vendor-dependent value indicating the
algorithm set selection

Table 172 — TPM2_SetAlgorithmSet Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 341
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

28.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#include "InternalRoutines.h"
#include "SetAlgorithmSet_fp.h"

TPM_RC
TPM2_SetAlgorithmSet(
SetAlgorithmSet_In

*in

// IN: input parameter list

)
{
TPM_RC

result;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Internal Data Update
gp.algorithmSet = in->algorithmSet;
// Write the algorithm set changes to NV
NvWriteReserved(NV_ALGORITHM_SET, &gp.algorithmSet);
return TPM_RC_SUCCESS;
}

Page 342
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

Field Upgrade

29
29.1

Introduction

This clause contains the commands for managing field upgrade of the firmware in the TPM. The field
upgrade scheme may be used for replacement or augmentation of the firmware installed in the TPM.
EXAMPLE 1

If an algorithm is found to be flawed, a patch of that algorithm might be installed using the firmware
upgrade process. The patch might be a replacement of a portion of the code or a complete
replacement of the firmware.

EXAMPLE 2

If an additional set of ECC parameters is needed, the firmware process may be used to add the
parameters to the TPM data set.

The
field
upgrade
process
uses
two
commands
(TPM2_FieldUpgradeStart()
and
TPM2_FieldUpgradeData()). TPM2_FieldUpgradeStart() validates that a signature on the provided digest
is from the TPM manufacturer and that proper authorization is provided using platformPolicy.
NOTE 1

The platformPolicy for field upgraded is defined by the PM and may include requirements that the
upgrade be signed by the PM or the TPM owner and include any other constraints that are desired
by the PM.

If the proper authorization is given, the TPM will retain the signed digest and enter the Field Upgrade
mode (FUM). While in FUM, the TPM will accept TPM2_FieldUpgradeData() commands. It may accept
other commands if it is able to complete them using the previously installed firmware. Otherwise, it will
return TPM_RC_UPGRADE.
Each block of the field upgrade shall contain the digest of the next block of the field upgrade data. That
digest shall be included in the digest of the previous block. The digest of the first block is signed by the
TPM manufacturer. That signature and first block digest are the parameters for
TPM2_FieldUpgradeStart(). The digest is saved in the TPM as the required digest for the next field
upgrade data block and as the identifier of the field upgrade sequence.
For each field upgrade data block that is sent to the TPM by TPM2_FieldUpgradeData(), the TPM shall
validate that the digest matches the required digest and if not, shall return TPM_RC_VALUE. The TPM
shall extract the digest of the next expected block and return that value to the caller, along with the digest
of the first data block of the update sequence.
The system may attempt to abandon the firmware upgrade by using a zero-length buffer in
TPM2_FieldUpdateData(). If the TPM is able to resume operation using the firmware present when the
upgrade started, then the TPM will indicate that it has abandon the update by setting the digest of the
next block to the Empty Buffer. If the TPM cannot abandon the update, it will return the expected next
digest.
The system may also attempt to abandon the update because of a power interruption. If the TPM is able
to resume normal operations, then it will respond normally to TPM2_Startup(). If the TPM is not able to
resume normal operations, then it will respond to any command but TPM2_FieldUpgradeData() with
TPM_RC_FIELDUPGRADE.
After a _TPM_Init, system software may not be able to resume the field upgrade that was in process
when the power interruption occurred. In such case, the TPM firmware may be reset to one of two other
values:


the original firmware that was installed at the factory (“initial firmware”); or



the firmware that was in the TPM when the field upgrade process started (“previous firmware”).

The TPM retains the digest of the first block for these firmware images and checks to see if the first block
after _TPM_Init matches either of those digests. If so, the firmware update process restarts and the
original firmware may be loaded.
Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 343
October 31, 2013

Part 3: Commands
NOTE 2

Trusted Platform Module Library

The TPM is required to accept the previous firmware as either a vendor -provided update or as
recovered from the TPM using TPM2_FirmwareRead().

When the last block of the firmware upgrade is loaded into the TPM (indicated to the TPM by data in the
data block in a TPM vendor-specific manner), the TPM will complete the upgrade process. If the TPM is
able to resume normal operations without a reboot, it will set the hash algorithm of the next block to
TPM_ALG_NULL and return TPM_RC_SUCCESS. If a reboot is required, the TPM shall return
TPM_RC_REBOOT in response to the last TPM2_FieldUpgradeData() and all subsequent TPM
commands until a _TPM_Init is received.
NOTE 3

Because no additional data is allowed when the res ponse code is not TPM_RC_SUCCESS, the TPM
returns TPM_RC_SUCCESS for all calls to TPM2_FieldUpgradeData() except the last. In this
manner, the TPM is able to indicate the digest of the next block. If a _TPM_Init occurs while the
TPM is in FUM, the next block may be the digest for the first block of the original firmware. If it is
not, then the TPM will not accept the original firmware until the next _TPM_Init when the TPM is in
FUM.

During the field upgrade process, the TPM shall preserve:


Primary Seeds;



Hierarchy authValue, authPolicy, and proof values;



Lockout authValue and authorization failure count values;



PCR authValue and authPolicy values;



NV Index allocations and contents;



Persistent object allocations and contents; and



Clock.

Page 344
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

29.2

Part 3: Commands

TPM2_FieldUpgradeStart

29.2.1 General Description
This command uses platformPolicy and a TPM Vendor Authorization Key to authorize a Field Upgrade
Manifest.
If the signature checks
TPM2_FieldUpgradeData().

succeed,

the

authorization

is

valid

and

the

TPM

will

accept

This signature is checked against the loaded key referenced by keyHandle. This key will have a Name
that is the same as a value that is part of the TPM firmware data. If the signature is not valid, the TPM
shall return TPM_RC_SIGNATURE.
NOTE

A loaded key is used rather than a hard-coded key to reduce the amount of memory needed for this
key data in case more than one vendor key is needed.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 345
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

29.2.2 Command and Response
Table 173 — TPM2_FieldUpgradeStart Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_FieldUpgradeStart

TPMI_RH_PLATFORM

@authorization

TPM_RH_PLATFORM+{PP}
Auth Index:1
Auth Role: ADMIN

TPMI_DH_OBJECT

keyHandle

handle of a public area that contains the TPM Vendor
Authorization Key that will be used to validate
manifestSignature
Auth Index: None

TPM2B_DIGEST

fuDigest

digest of the first block in the field upgrade sequence

TPMT_SIGNATURE

manifestSignature

signature over fuDigest using the key associated with
keyHandle (not optional)

Table 174 — TPM2_FieldUpgradeStart Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 346
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

29.2.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13

#include "InternalRoutines.h"
#include "FieldUpgradeStart_fp.h"
#if CC_FieldUpgradeStart == YES

TPM_RC
TPM2_FieldUpgradeStart(
FieldUpgradeStart_In

*in

// IN: input parameter list

)
{
// Not implemented
UNUSED_PARAMETER(in);
return TPM_RC_SUCCESS;
}
#endif

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 347
October 31, 2013

Part 3: Commands

29.3

Trusted Platform Module Library

TPM2_FieldUpgradeData

29.3.1 General Description
This command will take the actual field upgrade image to be installed on the TPM. The exact format of
fuData is vendor-specific. This command is only possible following a successful
TPM2_FieldUpgradeStart().
If
the
TPM
has
not
received
a
properly
authorized
TPM2_FieldUpgradeStart(), then the TPM shall return TPM_RC_FIELDUPGRADE.
The TPM will validate that the digest of fuData matches an expected value. If so, the TPM may buffer or
immediately apply the update. If the digest of fuData does not match an expected value, the TPM shall
return TPM_RC_VALUE.

Page 348
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

29.3.2 Command and Response
Table 175 — TPM2_FieldUpgradeData Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_FieldUpgradeData {NV}

TPM2B_MAX_BUFFER

fuData

field upgrade image data

Table 176 — TPM2_FieldUpgradeData Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMT_HA+

nextDigest

tagged digest of the next block
TPM_ALG_NULL if field update is complete

TPMT_HA

firstDigest

tagged digest of the first block of the sequence

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 349
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

29.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include "InternalRoutines.h"
#include "FieldUpgradeData_fp.h"
#if CC_FieldUpgradeData == YES

TPM_RC
TPM2_FieldUpgradeData(
FieldUpgradeData_In
FieldUpgradeData_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Not implemented
UNUSED_PARAMETER(in);
UNUSED_PARAMETER(out);
return TPM_RC_SUCCESS;
}
#endif

Page 350
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

29.4

Part 3: Commands

TPM2_FirmwareRead

29.4.1 General Description
This command is used to read a copy of the current firmware installed in the TPM.
The presumption is that the data will be returned in reverse order so that the last block in the sequence
would be the first block given to the TPM in case of a failure recovery. If the TPM2_FirmwareRead
sequence completes successfully, then the data provided from the TPM will be sufficient to allow the TPM
to recover from an abandoned upgrade of this firmware.
To start the sequence of retrieving the data, the caller sets sequenceNumber to zero. When the TPM has
returned all the firmware data, the TPM will return the Empty Buffer as fuData.
The contents of fuData are opaque to the caller.
NOTE 1

The caller should retain the ordering of the update blocks so that the blocks sent to the TPM have
the same size and inverse order as the blocks returned by a sequence of calls to this command.

NOTE 2

Support for this command is optional even if the TPM implements TPM2_FieldUpgradeStart() and
TPM2_FieldUpgradeData().

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 351
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

29.4.2 Command and Response
Table 177 — TPM2_FirmwareRead Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_FirmwareRead

UINT32

sequenceNumber

the number of previous calls to this command in this
sequence
set to 0 on the first call

Table 178 — TPM2_FirmwareRead Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_MAX_BUFFER

fuData

Page 352
October 31, 2013

field upgrade image data

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

29.4.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13

#include "InternalRoutines.h"
#include "FirmwareRead_fp.h"

TPM_RC
TPM2_FirmwareRead(
FirmwareRead_In
FirmwareRead_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Not implemented
UNUSED_PARAMETER(in);
UNUSED_PARAMETER(out);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 353
October 31, 2013

Part 3: Commands

30

Trusted Platform Module Library

Context Management

30.1

Introduction

Three of the commands in this clause (TPM2_ContextSave(), TPM2_ContextLoad(), and
TPM2_FlushContext()) implement the resource management described in the "Context Management"
clause in Part 1.
The fourth command in this clause (TPM2_EvictControl()) is used to control the persistence of a loadable
objects in TPM memory. Background for this command may be found in the "Owner and Platform Evict
Objects" clause in Part 1.
30.2

TPM2_ContextSave

30.2.1 General Description
This command saves a session context, object context, or sequence object context outside the TPM.
No authorization sessions of any type are allowed with this command and tag is required to be
TPM_ST_NO_SESSIONS.
NOTE

This preclusion avoids complex issues of dealing with the same session in handle and in the session
area. While it might be possible to provide specificity, it would add unnecessary complexity to the
TPM and, because this capability would provide no application benefit, use of authorization ses sions
for audit or encryption is prohibited.

The TPM shall encrypt and integrity protect the context as described in the "Context Protection" clause in
Part 1.
See the “Context Data” clause in Part 2 for a description of the context structure in the response.

Page 354
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

30.2.2 Command and Response
Table 179 — TPM2_ContextSave Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

TPM_ST_NO_SESSIONS

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ContextSave

TPMI_DH_CONTEXT

saveHandle

handle of the resource to save
Auth Index: None

Table 180 — TPM2_ContextSave Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMS_CONTEXT

context

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 355
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

30.2.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ContextSave_fp.h"
#include "Context_spt_fp.h"
Error Returns
TPM_RC_CONTEXT_GAP

a contextID could not be assigned for a session context save

TPM_RC_TOO_MANY_CONTEXTS
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Meaning

no more contexts can be saved as the counter has maxed out

TPM_RC
TPM2_ContextSave(
ContextSave_In
ContextSave_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
UINT16
// blob.
UINT64
TPM2B_SYM_KEY
TPM2B_IV

result;
fingerprintSize;

TPM2B_DIGEST
UINT16
BYTE

integrity;
integritySize;
*buffer;

contextID = 0;
symKey;
iv;

// The size of fingerprint in context
// session context ID

// This command may cause the orderlyState to be cleared due to
// the update of state reset data. If this is the case, check if NV is
// available first
if(gp.orderlyState != SHUTDOWN_NONE)
{
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
}
// Internal Data Update
// Initialize output handle. At the end of command action, the output
// handle of an object will be replaced, while the output handle
// for a session will be the same as input
out->context.savedHandle = in->saveHandle;
// Get the size of fingerprint in context blob. The sequence value in
// TPMS_CONTEXT structure is used as the fingerprint
fingerprintSize = sizeof(out->context.sequence);
// Compute the integrity size at the beginning of context blob
integritySize = sizeof(integrity.t.size)
+ CryptGetHashDigestSize(CONTEXT_INTEGRITY_HASH_ALG);
// Perform object or session specific context save
switch(HandleGetType(in->saveHandle))
{
case TPM_HT_TRANSIENT:
{

Page 356
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

OBJECT
OBJECT

Part 3: Commands

*object = ObjectGet(in->saveHandle);
*outObject =
(OBJECT *)(out->context.contextBlob.t.buffer
+ integritySize + fingerprintSize);

// Set size of the context data. The contents of context blob is vendor
// defined. In this implementation, the size is size of integrity
// plus fingerprint plus the whole internal OBJECT structure
out->context.contextBlob.t.size = integritySize +
fingerprintSize + sizeof(*object);
// Copy the whole internal OBJECT structure to context blob, leave
// the size for fingerprint
*outObject = *object;
// Increment object context ID
gr.objectContextID++;
// If object context ID overflows, TPM should be put in failure mode
if(gr.objectContextID == 0)
FAIL(FATAL_ERROR_INTERNAL);
// Fill in other return values for an object.
out->context.sequence = gr.objectContextID;
// For regular object, savedHandle is 0x80000000. For sequence object,
// savedHandle is 0x80000001. For object with stClear, savedHandle
// is 0x80000002
if(ObjectIsSequence(object))
{
out->context.savedHandle = 0x80000001;
SequenceDataImportExport(object, outObject, EXPORT_STATE);
}
else if(object->attributes.stClear == SET)
{
out->context.savedHandle = 0x80000002;
}
else
{
out->context.savedHandle = 0x80000000;
}
// Get object hierarchy
out->context.hierarchy = ObjectDataGetHierarchy(object);
break;
}
case TPM_HT_HMAC_SESSION:
case TPM_HT_POLICY_SESSION:
{
SESSION
*session = SessionGet(in->saveHandle);
// Set size of the context data. The contents of context blob is vendor
// defined. In this implementation, the size of context blob is the
// size of a internal session structure plus the size of
// fingerprint plus the size of integrity
out->context.contextBlob.t.size = integritySize +
fingerprintSize + sizeof(*session);
// Copy the whole internal SESSION structure to context blob.
// Save space for fingerprint at the beginning of the buffer
// This is done before anything else so that the actual context
// can be reclaimed after this call
MemoryCopy(out->context.contextBlob.t.buffer
+ integritySize + fingerprintSize,
session, sizeof(*session),

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 357
October 31, 2013

Part 3: Commands
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174

Trusted Platform Module Library
sizeof(out->context.contextBlob.t.buffer)
- integritySize - fingerprintSize);

// Fill in the other return parameters for a session
// Get a context ID and set the session tracking values appropriately
// TPM_RC_CONTEXT_GAP is a possible error.
// SessionContextSave() will flush the in-memory context
// so no additional errors may occur after this call.
result = SessionContextSave(out->context.savedHandle, &contextID);
if(result != TPM_RC_SUCCESS) return result;
// sequence number is the current session contextID
out->context.sequence = contextID;
// use TPM_RH_NULL as hierarchy for session context
out->context.hierarchy = TPM_RH_NULL;
break;
}
default:
// SaveContext may only take an object handle or a session handle.
// All the other handle type should be filtered out at unmarshal
pAssert(FALSE);
break;
}
// Save fingerprint at the beginning of encrypted area of context blob.
// Reserve the integrity space
MemoryCopy(out->context.contextBlob.t.buffer + integritySize,
&out->context.sequence, sizeof(out->context.sequence),
sizeof(out->context.contextBlob.t.buffer) - integritySize);
// Compute context encryption key
ComputeContextProtectionKey(&out->context, &symKey, &iv);
// Encrypt context blob
CryptSymmetricEncrypt(out->context.contextBlob.t.buffer + integritySize,
CONTEXT_ENCRYPT_ALG, CONTEXT_ENCRYPT_KEY_BITS,
TPM_ALG_CFB, symKey.t.buffer, &iv,
out->context.contextBlob.t.size - integritySize,
out->context.contextBlob.t.buffer + integritySize);
// Compute integrity hash for the object
// In this implementation, the same routine is used for both sessions
// and objects.
ComputeContextIntegrity(&out->context, &integrity);
// add integrity at the beginning of context blob
buffer = out->context.contextBlob.t.buffer;
TPM2B_DIGEST_Marshal(&integrity, &buffer, NULL);
// orderly state should be cleared because of the update of state reset and
// state clear data
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 358
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

30.3

Part 3: Commands

TPM2_ContextLoad

30.3.1 General Description
This command is used to reload a context that has been saved by TPM2_ContextSave().
No authorization sessions of any type are allowed with this command and tag is required to be
TPM_ST_NO_SESSIONS (see note in 30.2.1).
The TPM will return TPM_RC_HIERARCHY if the context is associated with a hierarchy that is disabled.
NOTE

Contexts for authorization sessions and for sequence object s belong to the NULL hierarchy which is
never disabled.

See the “Context Data” clause in Part 2 for a description of the values in the context parameter.
If the integrity HMAC of the saved context is not valid, the TPM shall return TPM_RC_INTEGRITY.
The TPM shall perform a check on the decrypted context as described in the "Context Confidentiality
Protections" clause of Part 1 and enter failure mode if the check fails.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 359
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

30.3.2 Command and Response
Table 181 — TPM2_ContextLoad Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

TPM_ST_NO_SESSIONS

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ContextLoad

TPMS_CONTEXT

context

the context blob

Table 182 — TPM2_ContextLoad Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMI_DH_CONTEXT

loadedHandle

Page 360
October 31, 2013

the handle assigned to the resource after it has been
successfully loaded

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

30.3.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "ContextLoad_fp.h"
#include "Context_spt_fp.h"
Error Returns
TPM_RC_CONTEXT_GAP

there is only one available slot and this is not the oldest saved
session context

TPM_RC_HANDLE

'context. savedHandle' does not reference a saved session

TPM_RC_HIERARCHY

'context.hierarchy' is disabled

TPM_RC_INTEGRITY

context integrity check fail

TPM_RC_OBJECT_MEMORY

no free slot for an object

TPM_RC_SESSION_MEMORY

no free session slots

TPM_RC_SIZE
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

Meaning

incorrect context blob size

TPM_RC
TPM2_ContextLoad(
ContextLoad_In
ContextLoad_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Local Variables
TPM_RC
result = TPM_RC_SUCCESS;
TPM2B_DIGEST
TPM2B_DIGEST
UINT16
UINT64
BYTE
INT32

ingerityToCompare;
integrity;
integritySize;
fingerprint;
*buffer;
size;

TPM_HT
TPM2B_SYM_KEY
TPM2B_IV

handleType;
symKey;
iv;

// Input Validation
// Check context blob size
handleType = HandleGetType(in->context.savedHandle);
// Check integrity
// In this implementation, the same routine is used for both sessions
// and objects.
integritySize = sizeof(integrity.t.size)
+ CryptGetHashDigestSize(CONTEXT_INTEGRITY_HASH_ALG);
// Get integrity from context blob
buffer = in->context.contextBlob.t.buffer;
size = (INT32) in->context.contextBlob.t.size;
result = TPM2B_DIGEST_Unmarshal(&integrity, &buffer, &size);
if(result != TPM_RC_SUCCESS)
return result;
// Compute context integrity
ComputeContextIntegrity(&in->context, &ingerityToCompare);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 361
October 31, 2013

Part 3: Commands
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

Trusted Platform Module Library

// Compare integrity
if(!Memory2BEqual(&integrity.b, &ingerityToCompare.b))
return TPM_RC_INTEGRITY + RC_ContextLoad_context;
// Compute context encryption key
ComputeContextProtectionKey(&in->context, &symKey, &iv);
// Decrypt context data in place
CryptSymmetricDecrypt(in->context.contextBlob.t.buffer + integritySize,
CONTEXT_ENCRYPT_ALG, CONTEXT_ENCRYPT_KEY_BITS,
TPM_ALG_CFB, symKey.t.buffer, &iv,
in->context.contextBlob.t.size - integritySize,
in->context.contextBlob.t.buffer + integritySize);
// Read the fingerprint value, skip the leading integrity size
MemoryCopy(&fingerprint, in->context.contextBlob.t.buffer + integritySize,
sizeof(fingerprint), sizeof(fingerprint));
// Check fingerprint. If the check fails, TPM should be put to failure mode
if(fingerprint != in->context.sequence)
FAIL(FATAL_ERROR_INTERNAL);
// Perform object or session specific input check
switch(handleType)
{
case TPM_HT_TRANSIENT:
{
// Get a pointer to the object in the context blob
OBJECT
*outObject = (OBJECT *)(in->context.contextBlob.t.buffer
+ integritySize + sizeof(fingerprint));
// Discard any changes to the handle that the TRM might have made
in->context.savedHandle = TRANSIENT_FIRST;
// If hierarchy is disabled, no object context can be loaded in this
// hierarchy
if(!HierarchyIsEnabled(in->context.hierarchy))
return TPM_RC_HIERARCHY + RC_ContextLoad_context;
// Restore object. A TPM_RC_OBJECT_MEMORY error may be returned at
// this point
result = ObjectContextLoad(outObject, &out->loadedHandle);
if(result != TPM_RC_SUCCESS)
return result;
// If this is a sequence object, the crypto library may need to
// reformat the data into an internal format
if(ObjectIsSequence(outObject))
SequenceDataImportExport(ObjectGet(out->loadedHandle),
outObject, IMPORT_STATE);
break;
}
case TPM_HT_POLICY_SESSION:
case TPM_HT_HMAC_SESSION:
{
SESSION

*session = (SESSION *)(in->context.contextBlob.t.buffer
+ integritySize + sizeof(fingerprint));

// This command may cause the orderlyState to be cleared due to
// the update of state reset data. If this is the case, check if NV is
// available first

Page 362
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

Part 3: Commands

if(gp.orderlyState != SHUTDOWN_NONE)
{
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned
// at this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
}
// Check if input handle points to a valid saved session
if(!SessionIsSaved(in->context.savedHandle))
return TPM_RC_HANDLE + RC_ContextLoad_context;
// Restore session. A TPM_RC_SESSION_MEMORY, TPM_RC_CONTEXT_GAP error
// may be returned at this point
result = SessionContextLoad(session, &in->context.savedHandle);
if(result != TPM_RC_SUCCESS)
return result;
out->loadedHandle = in->context.savedHandle;
// orderly state should be cleared because of the update of state
// reset and state clear data
g_clearOrderly = TRUE;
break;
}
default:
// Context blob may only have an object handle or a session handle.
// All the other handle type should be filtered out at unmarshal
pAssert(FALSE);
break;
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 363
October 31, 2013

Part 3: Commands

30.4

Trusted Platform Module Library

TPM2_FlushContext

30.4.1 General Description
This command causes all context associated with a loaded object or session to be removed from TPM
memory.
This command may not be used to remove a persistent object from the TPM.
A session does not have to be loaded in TPM memory to have its context flushed. The saved session
context associated with the indicated handle is invalidated.
No sessions of any type are allowed with
TPM_ST_NO_SESSIONS (see note in 30.2.1).

this

command

and

tag

is

required

to

be

If the handle is for a transient object and the handle is not associated with a loaded object, then the TPM
shall return TPM_RC_HANDLE.
If the handle is for an authorization session and the handle does not reference a loaded or active session,
then the TPM shall return TPM_RC_HANDLE.
NOTE

flushHandle is a parameter and not a handle. If it were in the handle area, the TPM would validate
that the context for the referenced entity is in the TPM. When a TPM2_FlushContext references a
saved session context, it is not necessary for the context to be in the TPM .

Page 364
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

30.4.2 Command and Response
Table 183 — TPM2_FlushContext Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

TPM_ST_NO_SESSIONS

UINT32

commandSize

TPM_CC

commandCode

TPMI_DH_CONTEXT

flushHandle

TPM_CC_FlushContext
the handle of the item to flush
NOTE

This is a use of a handle as a parameter.

Table 184 — TPM2_FlushContext Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 365
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

30.4.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "FlushContext_fp.h"
Error Returns
TPM_RC_HANDLE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Meaning
flushHandle does not reference a loaded object or session

TPM_RC
TPM2_FlushContext(
FlushContext_In
)
{
// Internal Data Update

*in

// IN: input parameter list

// Call object or session specific routine to flush
switch(HandleGetType(in->flushHandle))
{
case TPM_HT_TRANSIENT:
if(!ObjectIsPresent(in->flushHandle))
return TPM_RC_HANDLE;
// Flush object
ObjectFlush(in->flushHandle);
break;
case TPM_HT_HMAC_SESSION:
case TPM_HT_POLICY_SESSION:
if(
!SessionIsLoaded(in->flushHandle)
&& !SessionIsSaved(in->flushHandle)
)
return TPM_RC_HANDLE;
// If the session to be flushed is the exclusive audit session, then
// indicate that there is no exclusive audit session any longer.
if(in->flushHandle == g_exclusiveAuditSession)
g_exclusiveAuditSession = TPM_RH_UNASSIGNED;
// Flush session
SessionFlush(in->flushHandle);
break;
default:
// This command only take object or session handle.
// should be filtered out at handle unmarshal
pAssert(FALSE);
break;
}

Other handles

return TPM_RC_SUCCESS;
}

Page 366
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

30.5

Part 3: Commands

TPM2_EvictControl

30.5.1 General Description
This command allows a transient object to be made persistent or a persistent object to be evicted.
NOTE 1

A transient object is one that may be removed from TPM memory using either TPM2_FlushContext
or TPM2_Startup(). A persistent object is not removed from TPM memory by TPM2_FlushContext()
or TPM2_Startup().

If objectHandle is a transient object, then the call is to make the object persistent and assign
persistentHandle to the persistent version of the object. If objectHandle is a persistent object, then the call
is to evict the persistent object.
Before execution of TPM2_EvictControl code below, the TPM verifies that objectHandle references an
object that is resident on the TPM and that persistentHandle is a valid handle for a persistent object.
NOTE 2

This requirement simplifies the unmarshaling code so that it only need check that persistentHandle
is always a persistent object.

If objectHandle references a transient object:
a) The TPM shall return TPM_RC_ATTRIBUTES if
1) it is in the hierarchy of TPM_RH_NULL,
2) only the public portion of the object is loaded, or
3) the stClear is SET in the object or in an ancestor key.
b) The TPM shall return TPM_RC_HIERARCHY if the object is not in the proper hierarchy as
determined by auth.
1) If auth is TPM_RH_PLATFORM, the proper hierarchy is the Platform hierarchy.
2) If auth is TPM_RH_OWNER, the proper hierarchy is either the Storage or the Endorsement
hierarchy.
c) The TPM shall return TPM_RC_RANGE if persistentHandle is not in the proper range as determined
by auth.
1) If auth is TPM_RH_OWNER, then persistentHandle shall be in the inclusive range of
81 00 00 0016 to 81 7F FF FF16.
2) If auth is TPM_RH_PLATFORM, then persistentHandle shall be in the inclusive range of
81 80 00 0016 to 81 FF FF FF16.
d) The TPM shall return TPM_RC_NV_DEFINED if a persistent object exists with the same handle as
persistentHandle.
e) The TPM shall return TPM_RC_NV_SPACE if insufficient space is available to make the object
persistent.
f)

The TPM shall return TPM_RC_NV_SPACE if execution of this command will prevent the TPM from
being able to hold two transient objects of any kind.
NOTE 3

This requirement anticipates that a TPM may be implemented such that all TPM memory is non volatile and not subject to endurance issues. In such case, there is no movement of an object
between memory of different types and it is necessary that the TPM ensure that it is always
possible for the management software to move objects to/from TPM memory in order to ensure
that the objects required for command execution can be context restored.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 367
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

g) If the TPM returns TPM_RC_SUCCESS, the object referenced by objectHandle will not be flushed
and both objectHandle and persistentHandle may be used to access the object.
If objectHandle references a persistent object:
h) The TPM shall return TPM_RC_RANGE if objectHandle is not in the proper range as determined by
auth. If auth is TPM_RC_OWNER, objectHandle shall be in the inclusive range of 81 00 00 0016 to
81 7F FF FF16. If auth is TPM_RC_PLATFORM, objectHandle may be any valid persistent object
handle.
i)

If the TPM returns TPM_RC_SUCCESS, objectHandle will be removed from persistent memory and
no longer be accessible.

NOTE 4

The persistent object is not converted to a transient object, as this would prevent the immediate
revocation of an object by removing it from persistent memory.

Page 368
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

30.5.2 Command and Response
Table 185 — TPM2_EvictControl Command
Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_EvictControl {NV}

TPMI_RH_PROVISION

@auth

TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Handle: 1
Auth Role: USER

TPMI_DH_OBJECT

objectHandle

the handle of a loaded object
Auth Index: None

TPMI_DH_PERSISTENT

persistentHandle

if objectHandle is a transient object handle, then this is
the persistent handle for the object
if objectHandle is a persistent object handle, then this
shall be the same value as persistentHandle

Description

Table 186 — TPM2_EvictControl Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 369
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

30.5.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "EvictControl_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

an object with temporary, stClear or publicOnly attribute SET cannot
be made persistent

TPM_RC_HIERARCHY

auth cannot authorize the operation in the hierarchy of evictObject

TPM_RC_HANDLE

evictHandle of the persistent object to be evicted is not the same as
the persistentHandle argument

TPM_RC_NV_HANDLE

persistentHandle is unavailable

TPM_RC_NV_SPACE

no space in NV to make evictHandle persistent

TPM_RC_RANGE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

Meaning

persistentHandle is not in the range corresponding to the hierarchy of
evictObject

TPM_RC
TPM2_EvictControl(
EvictControl_In

*in

// IN: input parameter list

)
{
TPM_RC
OBJECT

result;
*evictObject;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation
// Get internal object pointer
evictObject = ObjectGet(in->objectHandle);
// Temporary, stClear or public only objects can not be made persistent
if(
evictObject->attributes.temporary == SET
|| evictObject->attributes.stClear == SET
|| evictObject->attributes.publicOnly == SET
)
return TPM_RC_ATTRIBUTES + RC_EvictControl_objectHandle;
// If objectHandle refers to a persistent object, it should be the same as
// input persistentHandle
if(
evictObject->attributes.evict == SET
&& evictObject->evictHandle != in->persistentHandle
)
return TPM_RC_HANDLE + RC_EvictControl_objectHandle;
// Additional auth validation
if(in->auth == TPM_RH_PLATFORM)
{
// To make persistent
if(evictObject->attributes.evict == CLEAR)
{
// Platform auth can not set evict object in storage or endorsement
// hierarchy

Page 370
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

Part 3: Commands

if(evictObject->attributes.ppsHierarchy == CLEAR)
return TPM_RC_HIERARCHY + RC_EvictControl_objectHandle;
// Platform cannot use a handle outside of platform persistent range.
if(!NvIsPlatformPersistentHandle(in->persistentHandle))
return TPM_RC_RANGE + RC_EvictControl_persistentHandle;
}
// Platform auth can delete any persistent object
}
else if(in->auth == TPM_RH_OWNER)
{
// Owner auth can not set or clear evict object in platform hierarchy
if(evictObject->attributes.ppsHierarchy == SET)
return TPM_RC_HIERARCHY + RC_EvictControl_objectHandle;
// Owner cannot use a handle outside of owner persistent range.
if(
evictObject->attributes.evict == CLEAR
&& !NvIsOwnerPersistentHandle(in->persistentHandle)
)
return TPM_RC_RANGE + RC_EvictControl_persistentHandle;
}
else
{
// Other auth is not allowed in this command and should be filtered out
// at unmarshal process
pAssert(FALSE);
}
// Internal Data Update
// Change evict state
if(evictObject->attributes.evict == CLEAR)
{
// Make object persistent
// A TPM_RC_NV_HANDLE or TPM_RC_NV_SPACE error may be returned at this
// point
result = NvAddEvictObject(in->persistentHandle, evictObject);
if(result != TPM_RC_SUCCESS) return result;
}
else
{
// Delete the persistent object in NV
NvDeleteEntity(evictObject->evictHandle);
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 371
October 31, 2013

Part 3: Commands

31

Trusted Platform Module Library

Clocks and Timers

31.1

TPM2_ReadClock

31.1.1 General Description
This command reads the current TPMS_TIME_INFO structure that contains the current setting of Time,
Clock, resetCount, and restartCount.
No authorization sessions of any type are allowed with this command and tag is required to be
TPM_ST_NO_SESSIONS.
NOTE

This command is intended to allow the TCB to have access to values that have the potential to be
privacy sensitive. The values may be read without authorization because the TCB will not disclose
these values. Since they are not signed and cannot be accessed in a command that uses an
authorization session, it is not possible for any entity, other than the TCB, to be assured that the
values are accurate.

Page 372
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

31.1.2 Command and Response
Table 187 — TPM2_ReadClock Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

TPM_ST_NO_SESSIONS

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ReadClock

Table 188 — TPM2_ReadClock Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

returnCode

TPMS_TIME_INFO

currentTime

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 373
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

31.1.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include "InternalRoutines.h"
#include "ReadClock_fp.h"

TPM_RC
TPM2_ReadClock(
ReadClock_Out *out
)
{
// Command Output

// OUT: output parameter list

out->currentTime.time = g_time;
TimeFillInfo(&out->currentTime.clockInfo);
return TPM_RC_SUCCESS;
}

Page 374
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

31.2

Part 3: Commands

TPM2_ClockSet

31.2.1 General Description
This command is used to advance the value of the TPM’s Clock. The command will fail if newTime is less
than the current value of Clock or if the new time is greater than FF FF 00 00 00 00 00 0016. If both of
these checks succeed, Clock is set to newTime. If either of these checks fails, the TPM shall return
TPM_RC_VALUE and make no change to Clock.
NOTE

This maximum setting would prevent Clock from rolling over to zero for approximately 8,000 years if
the Clock update rate was set so that TPM time was passing 33 percent faster than real time. This
would still be more than 6,000 years before Clock would roll over to zero. Because Clock will not roll
over in the lifetime of the TPM, there is no need for external software to deal with the possibility that
Clock may wrap around.

If the value of Clock after the update makes the volatile and non-volatile versions of
TPMS_CLOCK_INFO.clock differ by more than the reported update interval, then the TPM shall update
the non-volatile version of TPMS_CLOCK_INFO.clock before returning.
This command requires platformAuth or ownerAuth.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 375
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

31.2.2 Command and Response
Table 189 — TPM2_ClockSet Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ClockSet {NV}

TPMI_RH_PROVISION

@auth

TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Handle: 1
Auth Role: USER

UINT64

newTime

new Clock setting in milliseconds

Table 190 — TPM2_ClockSet Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

returnCode

Page 376
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

31.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "ClockSet_fp.h"

Read the current TPMS_TIMER_INFO structure settings
Error Returns
TPM_RC_VALUE
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

Meaning
invalid new clock

TPM_RC
TPM2_ClockSet(
ClockSet_In *in
)
{
#define CLOCK_UPDATE_MASK
UINT64
clockNow;

// IN: input parameter list
((1ULL << NV_CLOCK_UPDATE_INTERVAL)- 1)

// Input Validation
// new time can not be bigger than 0xFFFF000000000000 or smaller than
// current clock
if(in->newTime > 0xFFFF000000000000ULL
|| in->newTime < go.clock)
return TPM_RC_VALUE + RC_ClockSet_newTime;
// Internal Data Update
// Internal Data Update
clockNow = go.clock;
// grab the old value
go.clock = in->newTime;
// set the new value
// Check to see if the update has caused a need for an nvClock update
if((in->newTime & CLOCK_UPDATE_MASK) > (clockNow & CLOCK_UPDATE_MASK))
{
CryptDrbgGetPutState(GET_STATE);
NvWriteReserved(NV_ORDERLY_DATA, &go);
// Now the time state is safe
go.clockSafe = YES;
}
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 377
October 31, 2013

Part 3: Commands

31.3

Trusted Platform Module Library

TPM2_ClockRateAdjust

31.3.1 General Description
This command adjusts the rate of advance of Clock and Time to provide a better approximation to real
time.
The rateAdjust value is relative to the current rate and not the nominal rate of advance.
EXAMPLE 1

If this command had been called three times with rateAdjust = TPM_CLOCK_COARSE_SLOWER
and once with rateAdjust = TPM_CLOCK_COARSE_FASTER, the net effect will be as if the
command had been called twice with rateAdjust = TPM_CLOCK_COARSE_SLOWER.

The range of adjustment shall be sufficient to allow Clock and Time to advance at real time but no more.
If the requested adjustment would make the rate advance faster or slower than the nominal accuracy of
the input frequency, the TPM shall return TPM_RC_VALUE.
EXAMPLE 2

If the frequency tolerance of the TPM's input clock is +/-10 percent, then the TPM will return
TPM_RC_VALUE if the adjustment would make Clock run more than 10 percent faster or slower than
nominal. That is, if the input oscillator were nominally 100 megahertz (MHz), then 1 millisecond (ms)
would normally take 100,000 counts. The update Clock should be adjustable so that 1 ms is between
90,000 and 110,000 counts.

The interpretation of “fine” and “coarse” adjustments is implementation-specific.
The nominal rate of advance for Clock and Time shall be accurate to within 15 percent. That is, with no
adjustment applied, Clock and Time shall be advanced at a rate within 15 percent of actual time.
NOTE

If the adjustments are incorrect, it will be possible to m ake the difference between advance of
Clock/Time and real time to be as much as 1.15 2 or ~1.33.

Changes to the current Clock update rate adjustment need not be persisted across TPM power cycles.

Page 378
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

31.3.2 Command and Response
Table 191 — TPM2_ClockRateAdjust Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_ClockRateAdjust

TPMI_RH_PROVISION

@auth

TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Handle: 1
Auth Role: USER

TPM_CLOCK_ADJUST

rateAdjust

Adjustment to current Clock update rate

Table 192 — TPM2_ClockRateAdjust Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

returnCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 379
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

31.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12

#include "InternalRoutines.h"
#include "ClockRateAdjust_fp.h"

TPM_RC
TPM2_ClockRateAdjust(
ClockRateAdjust_In
*in
)
{
// Internal Data Update
TimeSetAdjustRate(in->rateAdjust);

// IN: input parameter list

return TPM_RC_SUCCESS;
}

Page 380
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

32

Part 3: Commands

Capability Commands

32.1

Introduction

The TPM has numerous values that indicate the state, capabilities, and properties of the TPM. These
values are needed for proper management of the TPM. The TPM2_GetCapability() command is used to
access these values.
TPM2_GetCapability() allows reporting of multiple values in a single call. The values are grouped
according to type.
NOTE

32.2

TPM2_TestParms()is used to determine if a TPM supports a particular combination of algorithm
parameters

TPM2_GetCapability

32.2.1 General Description
This command returns various information regarding the TPM and its current state.
The capability parameter determines the category of data returned. The property parameter selects the
first value of the selected category to be returned. If there is no property that corresponds to the value of
property, the next higher value is returned, if it exists.
EXAMPLE 1

The list of handles of transient objects currently loaded in the TPM may be read one at a time. On
the first read, set the property to TRANSIENT_FIRST and propertyCount to one. If a transient object
is present, the lowest numbered handle is returned and moreData will be YES if transient objects
with higher handles are loaded. On the subsequent call, use returned handle value plus 1 in order to
access the next higher handle.

The propertyCount parameter indicates the number of capabilities in the indicated group that are
requested. The TPM will return the number of requested values (propertyCount) or until the last property
of the requested type has been returned.
NOTE 1

The type of the capability is determined by a combination of capability and property.

When all of the properties of the requested type have been returned, the moreData parameter in the
response will be set to NO. Otherwise, it will be set to YES.
NOTE 2

The moreData parameter will be YES if there are more properties e ven if the requested number of
capabilities has been returned.

The TPM is not required to return more than one value at a time. It is not required to provide the same
number of values in response to subsequent requests.
EXAMPLE 2

A TPM may return 4 properties in response to a TPM2_GetCapability(capability =
TPM_CAP_TPM_PROPERTY, property = TPM_PT_MANUFACTURER, propertyCount = 8 ) and for a
latter request with the same parameters, the TPM may return as few as one and as many as 8
values.

When the TPM is in Failure mode, a TPM is required to allow use of this command for access of the
following capabilities:

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 381
October 31, 2013

Part 3: Commands

Trusted Platform Module Library



TPM_PT_MANUFACTURER



TPM_PT_VENDOR_STRING_1



TPM_PT_VENDOR_STRING_2

(3)



TPM_PT_VENDOR_STRING_3

(3)



TPM_PT_VENDOR_STRING_4

(3)



TPM_PT_VENDOR_TPM_TYPE



TPM_PT_FIRMWARE_VERSION_1



TPM_PT_FIRMWARE_VERSION_2

NOTE 3

If the vendor string does not require one of these values, the property type does not need to exist.

A vendor may optionally allow the TPM to return other values.
If in Failure mode and a capability is requested that is not available in Failure mode, the TPM shall return
no value.
EXAMPLE 3

Assume the TPM is in Failure mode and the TPM only supports reporting of the minimum required
set of properties (the limited set to TPML_TAGGED_PCR_PROPERTY values). If a
TPM2_GetCapability is received requesting a capability that has a property type value greater than
TPM_PT_FIRMWARE_VERSION_2, the TPM will return a zero length list with the moreData
parameter set to NO. If the property type is less than TPM_PT_M ANUFACTURER, the TPM will
return TPM_PT_MANUFACTURER.

In Failure mode, tag is required to be TPM_ST_NO_SESSIONS or the TPM shall return
TPM_RC_FAILURE.
The capability categories and the types of the return values are:
capability

Return Type

property
(1)

TPM_CAP_ALGS

TPM_ALG_ID

TPML_ALG_PROPERTY

TPM_CAP_HANDLES

TPM_HANDLE

TPML_HANDLE

TPM_CAP_COMMANDS

TPM_CC

TPML_CCA

TPM_CAP_PP_COMMANDS

TPM_CC

TPML_CC

TPM_CAP_AUDIT_COMMANDS

TPM_CC

TPML_CC

TPM_CAP_PCRS

Reserved

TPML_PCR_SELECTION

TPM_CAP_TPM_PROPERTIES

TPM_PT

TPML_TAGGED_TPM_PROPERTY

TPM_CAP_PCR_PROPERTIES

TPM_PT_PCR

TPML_TAGGED_PCR_PROPERTY
(1)

TPM_CAP_ECC_CURVE

TPM_ECC_CURVE

TPM_CAP_VENDOR_PROPERTY

manufacturer specific

TPML_ECC_CURVE
manufacturer-specific values

NOTES:
(1) The TPM_ALG_ID or TPM_ECC_CURVE is cast to a UINT32

Page 382
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands



TPM_CAP_ALGS – Returns a list of TPMS_ALG_PROPERTIES. Each entry is an algorithm ID and a
set of properties of the algorithm.



TPM_CAP_HANDLES – Returns a list of all of the handles within the handle range of the property
parameter. The range of the returned handles is determined by the handle type (the most-significant
octet (MSO) of the property). Any of the defined handle types is allowed
EXAMPLE 4

EXAMPLE 5



If the MSO of property is TPM_HT_NV_INDEX, then the TPM will return a list of NV Index
values.
If the MSO of property is TPM_HT_PCR, then the TPM will return a list of PCR.

For this capability, use of TPM_HT_LOADED_SESSION and TPM_HT_SAVED_SESSION is
allowed. Requesting handles with a handle type of TPM_HT_LOADED_SESSION will return handles
for loaded sessions. The returned handle values will have a handle type of either
TPM_HT_HMAC_SESSION or TPM_HT_POLICY_SESSION. If saved sessions are requested, all
returned values will have the TPM_HT_HMAC_SESSION handle type because the TPM does not
track the session type of saved sessions.
NOTE 2



TPM_HT_LOADED_SESSION and TPM_HT_HMAC_SESSION have the same value, as do
TPM_HT_SAVED_SESSION and TPM_HT_POLICY_SESSION. It is not possible to request that
the TPM return a list of loaded HMAC sessions without including the policy sessions.

TPM_CAP_COMMANDS – Returns a list of the command attributes for all of the commands
implemented in the TPM, starting with the TPM_CC indicated by the property parameter. If vendor
specific commands are implemented, the vendor-specific command attribute with the lowest
commandIndex, is returned after the non-vendor-specific (base) command.
NOTE 4

The type of the property parameter is a TPM_CC while the type of the returned list is
TPML_CCA.



TPM_CAP_PP_COMMANDS – Returns a list of all of the commands currently requiring Physical
Presence for confirmation of platform authorization. The list will start with the TPM_CC indicated by
property.



TPM_CAP_AUDIT_COMMANDS – Returns a list of all of the commands currently set for command
audit.



TPM_CAP_PCRS – Returns the current allocation of PCR in a TPML_PCR_SELECTION. The
property parameter shall be zero. The TPM will always respond to this command with the full PCR
allocation and moreData will be NO.



TPM_CAP_TPM_PROPERTIES – Returns a list of tagged properties. The tag is a TPM_PT and the
property is a 32-bit value. The properties are returned in groups. Each property group is on a 256value boundary (that is, the boundary occurs when the TPM_PT is evenly divisible by 256). The TPM
will only return values in the same group as the property parameter in the command.



TPM_CAP_PCR_PROPERTIES – Returns a list of tagged PCR properties. The tag is a
TPM_PT_PCR and the property is a TPMS_PCR_SELECT.

The input command property is a TPM_PT_PCR (see Part 2 for PCR properties to be requested) that
specifies the first property to be returned. If propertyCount is greater than 1, the list of properties begins
with that property and proceeds in TPM_PT_PCR sequence.
NOTE 5

If the propertyCount selects an unimplemented property, the next higher implemented property
is returned.

Each item in the list is a TPMS_PCR_SELECT structure that contains a bitmap of all PCR.
NOTE 6

A PCR index in all banks (all hash algorithms) has the same properties, so the hash algorithm is
not specified here.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 383
October 31, 2013

Part 3: Commands


Trusted Platform Module Library

TPM_CAP_TPM_ECC_CURVES – Returns a list of ECC curve identifiers currently available for use
in the TPM.

The moreData parameter will have a value of YES if there are more values of the requested type that
were not returned.
If no next capability exists, the TPM will return a zero-length list and moreData will have a value of NO.

Page 384
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

32.2.2 Command and Response
Table 193 — TPM2_GetCapability Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_GetCapability

TPM_CAP

capability

group selection; determines the format of the response

UINT32

property

further definition of information

UINT32

propertyCount

number of properties of the indicated type to return

Table 194 — TPM2_GetCapability Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPMI_YES_NO

moreData

flag to indicate if there are more values of this type

TPMS_CAPABILITY_DATA

capabilityData

the capability data

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 385
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

32.2.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "GetCapability_fp.h"
Error Returns
TPM_RC_HANDLE

value of property is in an unsupported handle range for the
TPM_CAP_HANDLES capability value

TPM_RC_VALUE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Meaning

invalid capability; or property is not 0 for the TPM_CAP_PCRS
capability value

TPM_RC
TPM2_GetCapability(
GetCapability_In
GetCapability_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
// Command Output
// Set output capability type the same as input type
out->capabilityData.capability = in->capability;
switch(in->capability)
{
case TPM_CAP_ALGS:
out->moreData = AlgorithmCapGetImplemented((TPM_ALG_ID) in->property,
in->propertyCount, &out->capabilityData.data.algorithms);
break;
case TPM_CAP_HANDLES:
switch(HandleGetType((TPM_HANDLE) in->property))
{
case TPM_HT_TRANSIENT:
// Get list of handles of loaded transient objects
out->moreData = ObjectCapGetLoaded((TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);
break;
case TPM_HT_PERSISTENT:
// Get list of handles of persistent objects
out->moreData = NvCapGetPersistent((TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);
break;
case TPM_HT_NV_INDEX:
// Get list of defined NV index
out->moreData = NvCapGetIndex((TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);
break;
case TPM_HT_LOADED_SESSION:
// Get list of handles of loaded sessions
out->moreData = SessionCapGetLoaded((TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);
break;
case TPM_HT_ACTIVE_SESSION:
// Get list of handles of
out->moreData = SessionCapGetSaved((TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);

Page 386
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115

Part 3: Commands

break;
case TPM_HT_PCR:
// Get list of handles of PCR
out->moreData = PCRCapGetHandles((TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);
break;
case TPM_HT_PERMANENT:
// Get list of permanent handles
out->moreData = PermanentCapGetHandles(
(TPM_HANDLE) in->property,
in->propertyCount,
&out->capabilityData.data.handles);
break;
default:
// Unsupported input handle type
return TPM_RC_HANDLE + RC_GetCapability_property;
break;
}
break;
case TPM_CAP_COMMANDS:
out->moreData = CommandCapGetCCList((TPM_CC) in->property,
in->propertyCount,
&out->capabilityData.data.command);
break;
case TPM_CAP_PP_COMMANDS:
out->moreData = PhysicalPresenceCapGetCCList((TPM_CC) in->property,
in->propertyCount, &out->capabilityData.data.ppCommands);
break;
case TPM_CAP_AUDIT_COMMANDS:
out->moreData = CommandAuditCapGetCCList((TPM_CC) in->property,
in->propertyCount,
&out->capabilityData.data.auditCommands);
break;
case TPM_CAP_PCRS:
// Input property must be 0
if(in->property != 0)
return TPM_RC_VALUE + RC_GetCapability_property;
out->moreData = PCRCapGetAllocation(in->propertyCount,
&out->capabilityData.data.assignedPCR);
break;
case TPM_CAP_PCR_PROPERTIES:
out->moreData = PCRCapGetProperties((TPM_PT_PCR) in->property,
in->propertyCount,
&out->capabilityData.data.pcrProperties);
break;
case TPM_CAP_TPM_PROPERTIES:
out->moreData = TPMCapGetProperties((TPM_PT) in->property,
in->propertyCount,
&out->capabilityData.data.tpmProperties);
break;
#ifdef TPM_ALG_ECC
case TPM_CAP_ECC_CURVES:
out->moreData = CryptCapGetECCCurve((TPM_ECC_CURVE
) in->property,
in->propertyCount,
&out->capabilityData.data.eccCurves);
break;
#endif // TPM_ALG_ECC
case TPM_CAP_VENDOR_PROPERTY:
// vendor property is not implemented
default:
// Unexpected TPM_CAP value
return TPM_RC_VALUE;
break;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 387
October 31, 2013

Part 3: Commands
116
117
118
119

Trusted Platform Module Library

}
return TPM_RC_SUCCESS;
}

Page 388
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

32.3

Part 3: Commands

TPM2_TestParms

32.3.1 General Description
This command is used to check to see if specific combinations of algorithm parameters are supported.
The TPM will unmarshal the provided TPMT_PUBLIC_PARMS. If the parameters unmarshal correctly,
then the TPM will return TPM_RC_SUCCESS, indicating that the parameters are valid for the TPM. The
TPM will return the appropriate unmarshaling error if a parameter is not valid.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 389
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

32.3.2 Command and Response
Table 195 — TPM2_TestParms Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_TestParms

TPMT_PUBLIC_PARMS

parameters

algorithm parameters to be validated

Table 196 — TPM2_TestParms Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 390
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

32.3.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include "InternalRoutines.h"
#include "TestParms_fp.h"

TPM_RC
TPM2_TestParms(
TestParms_In

*in

// IN: input parameter list

)
{
// Input parameter is not reference in command action
in = NULL;
// The parameters are tested at unmarshal process.
// action
return TPM_RC_SUCCESS;

We do nothing in command

}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 391
October 31, 2013

Part 3: Commands

33

Trusted Platform Module Library

Non-volatile Storage

33.1

Introduction

The NV commands are used to create, update, read, and delete allocations of space in NV memory.
Before an Index may be used, it must be defined (TPM2_NV_DefineSpace()).
An Index may be modified if the proper write authorization is provided or read if the proper read
authorization is provided. Different controls are available for reading and writing.
An Index may have an Index-specific authValue and authPolicy. The authValue may be used to authorize
reading if TPMA_NV_AUTHREAD is SET and writing if TPMA_NV_AUTHREAD is SET. The authPolicy
may be used to authorize reading if TPMA_NV_POLICYREAD is SET and writing if
TPMA_NV_POLICYWRITE is SET.
TPMA_NV_PPREAD and TPMA_NV_PPWRITE indicate if reading or writing of the NV Index may be
authorized by platformAuth or platformPolicy.
TPMA_NV_OWNERREAD and TPMA_NV_OWNERWRITE indicate if reading or writing of the NV Index
may be authorized by ownerAuth or ownerPolicy.
If an operation on an NV index requires authorization, and the authHandle parameter is the handle of an
NV Index, then the nvIndex parameter must have the same value or the TPM will return
TPM_RC_NV_AUTHORIZATION.
NOTE 1

This check ensures that the authorization that was provided is associated with the NV Index being
authorized.

For creating an Index, ownerAuth may not be used if shEnable is CLEAR and platformAuth may not be
used if phEnableNV is CLEAR.
If an Index was defined using platformAuth, then that Index is not accessible when phEnableNV is
CLEAR. If an Index was defined using ownerAuth, then that Index is not accessible when shEnable is
CLEAR.
For read access control, any combination of TPMA_NV_PPREAD, TPMA_NV_OWNERREAD,
TPMA_NV_AUTHREAD, or TPMA_NV_POLICYREAD is allowed as long as at least one is SET.
For write access control, any combination of TPMA_NV_PPWRITE, TPMA_NV_OWNERWRITE,
TPMA_NV_AUTHWRITE, or TPMA_NV_POLICYWRITE is allowed as long as at least one is SET.
If an Index has been defined and not written, then any operation on the NV Index that requires read
authorization will fail (TPM_RC_NV_INITIALIZED). This check may be made before or after other
authorization checks but shall be performed before checking the NV Index authValue. An authorization
failure due to the NV Index not having been written shall not be logged by the dictionary attack logic.
If TPMA_NV_CLEAR_STCLEAR is SET, then the TPMA_NV_WRITTEN will be CLEAR on each
TPM2_Startup(TPM_SU_CLEAR).
TPMA_NV_CLEAR_STCLEAR
shall
not
be
SET
if
TPMA_NV_COUNTER is SET.
The code in the “Detailed Actions” clause of each command is written to interface with an implementationdependent library that allows access to NV memory. The actions assume no specific layout of the
structure of the NV data.
Only one NV Index may be directly referenced in a command.
NOTE 2

This means that, if authHandle references an NV Index, then nvIndex will have the same value.
However, this does not limit the number of changes that may occur as side effects. For example, any
number of NV Indexes might be relocated as a result of deleting or adding a NV Ind ex.

Page 392
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.2

Part 3: Commands

NV Counters

When an Index has the TPMA_NV_COUNTER attribute set, it behaves as a monotonic counter and may
only be updated using TPM2_NV_Increment().
When an NV counter is created, the TPM shall initialize the 8-octet counter value with a number that is
greater than any count value for any NV counter on the TPM since the time of TPM manufacture.
An NV counter may be defined with the TPMA_NV_ORDERLY attribute to indicate that the NV Index is
expected to be modified at a high frequency and that the data is only required to persist when the TPM
goes through an orderly shutdown process. The TPM may update the counter value in RAM and
occasionally update the non-volatile version of the counter. An orderly shutdown is one occasion to
update the non-volatile count. If the difference between the volatile and non-volatile version of the counter
becomes as large as MAX_ORDERLY_COUNT, this shall be another occasion for updating the nonvolatile count.
Before an NV counter can be used, the TPM shall validate that the count is not less than a previously
reported value. If the TPMA_NV_ORDERLY attribute is not SET, or if the TPM experienced an orderly
shutdown, then the count is assumed to be correct. If the TPMA_NV_ORDERLY attribute is SET, and the
TPM shutdown was not orderly, then the TPM shall OR MAX_ORDERLY_COUNT to the contents of the
non-volatile counter and set that as the current count.
NOTE 1

Because the TPM would have updated the NV Index if the difference between the count values was
equal to MAX_ORDERLY_COUNT + 1, the highest value that could have been in the NV Index is
MAX_ORDERLY_COUNT so it is safe to restore that value.

NOTE 2

The TPM may implement the RAM portion of the counter such that the effective value of the NV
counter is the sum of both the volatile and non-volatile parts. If so, then the TPM may initialize the
RAM version of the counter to MAX_ORDERLY_COUNT and no update of NV is necessary.

NOTE 3

When a new NV counter is created, the TPM may search all the counters to determine which has the
highest value. In this search, the TPM would use the sum of the non -volatile and RAM portions of
the counter. The RAM portion of the counter shall be properly initialized to reflect shutdown p rocess
(orderly or not) of the TPM.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 393
October 31, 2013

Part 3: Commands

33.3

Trusted Platform Module Library

TPM2_NV_DefineSpace

33.3.1 General Description
This command defines the attributes of an NV Index and causes the TPM to reserve space to hold the
data associated with the NV Index. If a definition already exists at the NV Index, the TPM will return
TPM_RC_NV_DEFINED.
The TPM will return TPM_RC_ATTRIBUTES if more
TPMA_NV_BITS, or TPMA_NV_EXTEND is SET in publicInfo.
NOTE

than

one

of

TPMA_NV_COUNTER,

It is not required that any of these three attributes be set.

The TPM shall return TPM_RC_ATTRIBUTES if TPMA_NV_WRITTEN, TPM_NV_READLOCKED, or
TPMA_NV_WRITELOCKED is SET.
If TPMA_NV_COUNTER or TPMA_NV_BITS is SET, then publicInfo→dataSize shall be set to eight (8) or
the TPM shall return TPM_RC_SIZE.
If TPMA_NV_EXTEND is SET, then publicInfo→dataSize shall match the digest size of the
publicInfo.nameAlg or the TPM shall return TPM_RC_SIZE.
If the NV Index is an ordinary Index and publicInfo→dataSize is larger than supported by the TPM
implementation then the TPM shall return TPM_RC_SIZE.
NOTE

The limit for the data size may vary according to the type of the index. For example, if the index is
has TPMA_NV_ORDERLY SET, then the maximum size of an ordin ary NV Index may be less than
the size of an ordinary NV Index that has TPMA_NV_ORDERLY CLEAR.

At least one of TPMA_NV_PPREAD, TPMA_NV_OWNERREAD, TPMA_NV_AUTHREAD,
TPMA_NV_POLICYREAD shall be SET or the TPM shall return TPM_RC_ATTRIBUTES.

or

At least one of TPMA_NV_PPWRITE, TPMA_NV_OWNERWRITE, TPMA_NV_AUTHWRITE, or
TPMA_NV_POLICYWRITE shall be SET or the TPM shall return TPM_RC_ATTRIBUTES.
If TPMA_NV_CLEAR_STCLEAR is SET, then TPMA_NV_COUNTER shall be CLEAR or the TPM shall
return TPM_RC_ATTRIBUTES.
If platformAuth/platformPolicy is used for authorization, then TPMA_NV_PLATFORMCREATE shall be
SET in publicInfo. If ownerAuth/ownerPolicy is used for authorization, TPMA_NV_PLATFORMCREATE
shall be CLEAR in publicInfo. If TPMA_NV_PLATFORMCREATE is not set correctly for the authorization,
the TPM shall return TPM_RC_ATTRIBUTES.
If TPMA_NV_POLICY_DELETE is SET, then the authorization shall be with platformAuth or the TPM
shall return TPM_RC_ATTRIBUTES.
If the implementation does not support TPM2_NV_Increment(),
TPM_RC_ATTRIBUTES if TPMA_NV_COUNTER is SET.

the

TPM

shall

return

If the implementation does not support TPM2_NV_SetBits(),
TPM_RC_ATTRIBUTES if TPMA_NV_BITS is SET.

the

TPM

shall

return

If the implementation does not support TPM2_NV_Extend(),
TPM_RC_ATTRIBUTES if TPMA_NV_EXTEND is SET.

the

TPM

shall

return

If the implementation does not support TPM2_NV_UndefineSpaceSpecial(), the TPM shall return
TPM_RC_ATTRIBUTES if TPMA_NV_POLICY_DELETE is SET.
After the successful completion of this command, the NV Index exists but TPMA_NV_WRITTEN will be
CLEAR. Any access of the NV data will return TPM_RC_NV_UINITIALIZED.

Page 394
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

In some implementations, an NV Index with the TPMA_NV_COUNTER attribute may require special TPM
resources that provide higher endurance than regular NV. For those implementations, if this command
fails because of lack of resources, the TPM will return TPM_RC_NV_SPACE.
The value of auth is saved in the created structure. The size of auth is limited to be no larger than the size
of the digest produced by the NV Index's nameAlg (TPM_RC_SIZE).

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 395
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.3.2 Command and Response
Table 197 — TPM2_NV_DefineSpace Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_DefineSpace {NV}

TPMI_RH_PROVISION

@authHandle

TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPM2B_AUTH

auth

the authorization value

TPM2B_NV_PUBLIC

publicInfo

the public parameters of the NV area

Table 198 — TPM2_NV_DefineSpace Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 396
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.3.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "NV_DefineSpace_fp.h"
Error Returns
TPM_RC_NV_ATTRIBUTES

attributes of the index are not consistent

TPM_RC_NV_DEFINED

index already exists

TPM_RC_HIERARCHY

for authorizations using TPM_RH_PLATFORM phEnable_NV is
clear.

TPM_RC_NV_SPACE

Insufficient space for the index

TPM_RC_SIZE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Meaning

'auth->size' or 'publicInfo->authPolicy. size' is larger than the digest
size of 'publicInfo->nameAlg', or 'publicInfo->dataSize' is not
consistent with 'publicInfo->attributes'.

TPM_RC
TPM2_NV_DefineSpace(
NV_DefineSpace_In

*in

// IN: input parameter list

)
{
TPM_RC
TPMA_NV
UINT16

result;
attributes;
nameSize;

nameSize = CryptGetHashDigestSize(in->publicInfo.t.nvPublic.nameAlg);
// Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
// TPM_RC_NV_RATE or TPM_RC_SUCCESS.
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Input Validation
// If an index is being created by the owner and shEnable is
// clear, then we would not reach this point because ownerAuth
// can't be given when shEnable is CLEAR. However, if phEnable
// is SET but phEnableNV is CLEAR, we have to check here
if(in->authHandle == TPM_RH_PLATFORM && gc.phEnableNV == CLEAR)
return TPM_RC_HIERARCHY + RC_NV_DefineSpace_authHandle;
attributes = in->publicInfo.t.nvPublic.attributes;
//TPMS_NV_PUBLIC validation.
// Counters and bit fields must have a size of 8
if (
(attributes.TPMA_NV_COUNTER == SET || attributes.TPMA_NV_BITS == SET)
&& (in->publicInfo.t.nvPublic.dataSize != 8))
return TPM_RC_SIZE + RC_NV_DefineSpace_publicInfo;
// check that the authPolicy consistent with hash algorithm
if(
in->publicInfo.t.nvPublic.authPolicy.t.size != 0
&& in->publicInfo.t.nvPublic.authPolicy.t.size != nameSize)
return TPM_RC_SIZE + RC_NV_DefineSpace_publicInfo;
// make sure that the authValue is not too large
MemoryRemoveTrailingZeros(&in->auth);
if(in->auth.t.size > nameSize)
return TPM_RC_SIZE + RC_NV_DefineSpace_auth;

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 397
October 31, 2013

Part 3: Commands
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

Trusted Platform Module Library

//TPMA_NV validation.
// Locks may not be SET and written cannot be SET
if(
attributes.TPMA_NV_WRITTEN == SET
|| attributes.TPMA_NV_WRITELOCKED == SET
|| attributes.TPMA_NV_READLOCKED == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// There must be a way to read the index
if(
attributes.TPMA_NV_OWNERREAD == CLEAR
&& attributes.TPMA_NV_PPREAD == CLEAR
&& attributes.TPMA_NV_AUTHREAD == CLEAR
&& attributes.TPMA_NV_POLICYREAD == CLEAR)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// There must be a way to write the index
if(
attributes.TPMA_NV_OWNERWRITE == CLEAR
&& attributes.TPMA_NV_PPWRITE == CLEAR
&& attributes.TPMA_NV_AUTHWRITE == CLEAR
&& attributes.TPMA_NV_POLICYWRITE == CLEAR)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// Make sure that no attribute is used that is not supported by the proper
// command
#if CC_NV_Increment == NO
if( attributes.TPMA_NV_COUNTER == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
#endif
#if CC_NV_SetBits == NO
if( attributes.TPMA_NV_BITS == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
#endif
#if CC_NV_Extend == NO
if( attributes.TPMA_NV_EXTEND == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
#endif
#if CC_NV_UndefineSpaceSpecial == NO
if( attributes.TPMA_NV_POLICY_DELETE == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
#endif
// Can be COUNTER or BITS or EXTEND but not more than one
if( attributes.TPMA_NV_COUNTER == SET
&& attributes.TPMA_NV_BITS == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
if(
attributes.TPMA_NV_COUNTER == SET
&& attributes.TPMA_NV_EXTEND == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
if(
attributes.TPMA_NV_BITS == SET
&& attributes.TPMA_NV_EXTEND == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// An index with TPMA_NV_CLEAR_STCLEAR can't be a counter
if(
attributes.TPMA_NV_CLEAR_STCLEAR == SET
&& attributes.TPMA_NV_COUNTER == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// The index is allowed to have one of GLOBALLOCK or WRITEDEFINE SET
if(
attributes.TPMA_NV_GLOBALLOCK == SET
&& attributes.TPMA_NV_WRITEDEFINE == SET)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// Make sure that the creator of the index can delete the index

Page 398
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

if(

Part 3: Commands

(

in->publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE == SET
&& in->authHandle == TPM_RH_OWNER
)
|| (
in->publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE == CLEAR
&& in->authHandle == TPM_RH_PLATFORM
)
)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_authHandle;

// If TPMA_NV_POLICY_DELETE is SET, then the index must be defined by
// the platform
if(
in->publicInfo.t.nvPublic.attributes.TPMA_NV_POLICY_DELETE == SET
&& TPM_RH_PLATFORM != in->authHandle
)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// If the NV index is used as a PCR, the data size must match the digest
// size
if(
in->publicInfo.t.nvPublic.attributes.TPMA_NV_EXTEND == SET
&& in->publicInfo.t.nvPublic.dataSize != nameSize
)
return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
// See if the index is already defined.
if(NvIsUndefinedIndex(in->publicInfo.t.nvPublic.nvIndex))
return TPM_RC_NV_DEFINED;
// Internal Data Update
// define the space. A TPM_RC_NV_SPACE error may be returned at this point
result = NvDefineIndex(&in->publicInfo.t.nvPublic, &in->auth);
if(result != TPM_RC_SUCCESS)
return result;
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 399
October 31, 2013

Part 3: Commands

33.4

Trusted Platform Module Library

TPM2_NV_UndefineSpace

33.4.1 General Description
This command removes an Index from the TPM.
If nvIndex is not defined, the TPM shall return TPM_RC_HANDLE.
If nvIndex references an Index that has its TPMA_NV_PLATFORMCREATE attribute SET, the TPM shall
return TPM_RC_NV_AUTHORITY unless platformAuth is provided.
NOTE

An Index with TPMA_NV_PLATFORMCREATE CLEAR may be deleted with platformAuth as long as
shEnable is SET. If shEnable is CLEAR, indexes created using ownerAuth are not accessible even
for deletion by the platform.

Page 400
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.4.2 Command and Response
Table 199 — TPM2_NV_UndefineSpace Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_UndefineSpace {NV}

TPMI_RH_PROVISION

@authHandle

TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index to remove from NV space
Auth Index: None

Table 200 — TPM2_NV_UndefineSpace Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 401
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.4.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "NV_UndefineSpace_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

TPMA_NV_POLICY_DELETE is SET in the Index referenced by
nvIndex so this command may not be used to delete this Index (see
TPM2_NV_UndefineSpaceSpecial())

TPM_RC_NV_AUTHORIZATION
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Meaning

attempt to use ownerAuth to delete an index created by the platform

TPM_RC
TPM2_NV_UndefineSpace(
NV_UndefineSpace_In *in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX

result;
nvIndex;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// This command can't be used to delete an index with TPMA_NV_POLICY_DELETE SET
if(SET == nvIndex.publicArea.attributes.TPMA_NV_POLICY_DELETE)
return TPM_RC_ATTRIBUTES + RC_NV_UndefineSpace_nvIndex;
// The owner may only delete an index that was defined with ownerAuth. The
// platform may delete an index that was created with either auth.
if(
in->authHandle == TPM_RH_OWNER
&& nvIndex.publicArea.attributes.TPMA_NV_PLATFORMCREATE == SET)
return TPM_RC_NV_AUTHORIZATION;
// Internal Data Update
// Call implementation dependent internal routine to delete NV index
NvDeleteEntity(in->nvIndex);
return TPM_RC_SUCCESS;
}

Page 402
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.5

Part 3: Commands

TPM2_NV_UndefineSpaceSpecial

33.5.1 General Description
This command allows removal of a platform-created NV Index that has TPMA_NV_POLICY_DELETE
SET.
This command requires that the policy of the NV Index be satisfied before the NV Index may be deleted.
Because administrative role is required, the policy must contain a command that sets the policy command
code to TPM_CC_NV_UndefineSpaceSpecial. This indicates that the policy that is being used is a policy
that is for this command, and not a policy that would approve another use. That is, authority to use an
object does not grant authority to undefined the object.
If nvIndex is not defined, the TPM shall return TPM_RC_HANDLE.
If
nvIndex
references
an
Index
that
has
its
TPMA_NV_PLATFORMCREATE
TPMA_NV_POLICY_DELETE attribute CLEAR, the TPM shall return TPM_RC_NV_ATTRIBUTES.
NOTE

or

An
Index
with
TPMA_NV_PLATFORMCREATE
CLEAR
may
be
deleted
with
TPM2_UndefineSpace()as long as shEnable is SET. If shEnable is CLEAR, indexes created using
ownerAuth are not accessible even for deletion by the platform .

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 403
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.5.2 Command and Response
Table 201 — TPM2_NV_UndefineSpaceSpecial Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_UndefineSpaceSpecial {NV}

TPMI_RH_NV_INDEX

@nvIndex

Index to be deleted
Auth Index: 1
Auth Role: ADMIN

TPMI_RH_PLATFORM

@platform

TPM_RH_PLATFORM + {PP}
Auth Index: 2
Auth Role: USER

Table 202 — TPM2_NV_UndefineSpaceSpecial Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 404
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.5.3 Detailed Actions
1
2

#include "InternalRoutines.h"
#include "NV_UndefineSpaceSpecial_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Meaning
TPMA_NV_POLICY_DELETE is not SET in the Index referenced by
nvIndex

TPM_RC
TPM2_NV_UndefineSpaceSpecial(
NV_UndefineSpaceSpecial_In *in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX

result;
nvIndex;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Input Validation
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// This operation only applies when the TPMA_NV_POLICY_DELETE attribute is SET
if(CLEAR == nvIndex.publicArea.attributes.TPMA_NV_POLICY_DELETE)
return TPM_RC_ATTRIBUTES + RC_NV_UndefineSpaceSpecial_nvIndex;
// Internal Data Update
// Call implementation dependent internal routine to delete NV index
NvDeleteEntity(in->nvIndex);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 405
October 31, 2013

Part 3: Commands

33.6

Trusted Platform Module Library

TPM2_NV_ReadPublic

33.6.1 General Description
This command is used to read the public area and Name of an NV Index. The public area of an Index is
not privacy-sensitive and no authorization is required to read this data.

Page 406
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.6.2 Command and Response
Table 203 — TPM2_NV_ReadPublic Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_ReadPublic

TPMI_RH_NV_INDEX

nvIndex

the NV Index
Auth Index: None

Table 204 — TPM2_NV_ReadPublic Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_NV_PUBLIC

nvPublic

the public area of the NV Index

TPM2B_NAME

nvName

the Name of the nvIndex

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 407
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.6.3 Detailed Actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#include "InternalRoutines.h"
#include "NV_ReadPublic_fp.h"

TPM_RC
TPM2_NV_ReadPublic(
NV_ReadPublic_In
NV_ReadPublic_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
NV_INDEX

nvIndex;

// Command Output
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Copy data to output
out->nvPublic.t.nvPublic = nvIndex.publicArea;
// Compute NV name
out->nvName.t.size = NvGetName(in->nvIndex, &out->nvName.t.name);
return TPM_RC_SUCCESS;
}

Page 408
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.7

Part 3: Commands

TPM2_NV_Write

33.7.1 General Description
This command writes a value to an area in NV memory that was previously defined by
TPM2_NV_DefineSpace().
Proper authorizations are required for this command as determined by TPMA_NV_PPWRITE;
TPMA_NV_OWNERWRITE; TPMA_NV_AUTHWRITE; and, if TPMA_NV_POLICY_WRITE is SET, the
authPolicy of the NV Index.
If the TPMA_NV_WRITELOCKED attribute of the NV Index is SET, then the TPM shall return
TPM_RC_NV_LOCKED.
NOTE 1

If authorization sessions are present, they are checked before checks to see if writes to the NV
Index are locked.

If TPMA_NV_COUNTER, TPMA_NV_BITS or TPMA_NV_EXTEND of the NV Index is SET, then the
TPM shall return TPM_RC_NV_ATTRIBUTE.
If the size of the data parameter plus the offset parameter adds to a value that is greater than the size of
the NV Index data, the TPM shall return TPM_RC_NV_RANGE and not write any data to the NV Index.
If the TPMA_NV_WRITEALL attribute of the NV Index is SET, then the TPM shall return
TPM_RC_NV_RANGE if the size of the data parameter of the command is not the same as the data field
of the NV Index.
If all checks succeed, the TPM will merge the data.size octets of data.buffer value into the nvIndex→data
starting at nvIndex→data[offset]. If the NV memory is implemented with a technology that has endurance
limitations, the TPM shall check that the merged data is different from the current contents of the NV
Index and only perform a write to NV memory if they differ.
After successful completion of this command, TPMA_NV_WRITTEN for the NV Index will be SET.
NOTE 2

Once SET, TPMA_NV_WRITTEN remains SET until the NV Index is undefined or the NV Index is
cleared.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 409
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.7.2 Command and Response
Table 205 — TPM2_NV_Write Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_Write {NV}

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index of the area to write
Auth Index: None

TPM2B_MAX_NV_BUFFER

data

the data to write

UINT16

offset

the offset into the NV Area

Table 206 — TPM2_NV_Write Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 410
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.7.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "NV_Write_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

Index referenced by nvIndex has either TPMA_NV_BITS,
TPMA_NV_COUNTER, or TPMA_NV_EVENT attribute SET

TPM_RC_NV_AUTHORIZATION

the authorization was valid but the authorizing entity (authHandle) is
not allowed to write to the Index referenced by nvIndex

TPM_RC_NV_LOCKED

Index referenced by nvIndex is write locked

TPM_RC_NV_RANGE

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

Meaning

if TPMA_NV_WRITEALL is SET then the write is not the size of the
Index referenced by nvIndex; otherwise, the write extends beyond the
limits of the Index

TPM_RC
TPM2_NV_Write(
NV_Write_In

*in

// IN: input parameter list

)
{
NV_INDEX
TPM_RC

nvIndex;
result;

// Input Validation
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// common access checks. NvWrtieAccessChecks() may return
// TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
return result;
// Bits index, extend index or counter index may not be updated by
// TPM2_NV_Write
if(
nvIndex.publicArea.attributes.TPMA_NV_COUNTER == SET
|| nvIndex.publicArea.attributes.TPMA_NV_BITS == SET
|| nvIndex.publicArea.attributes.TPMA_NV_EXTEND == SET)
return TPM_RC_ATTRIBUTES;
// Too much data
if((in->data.t.size + in->offset) > nvIndex.publicArea.dataSize)
return TPM_RC_NV_RANGE;
// If this index requires a full sized write, make sure that input range is
// full sized
if(
nvIndex.publicArea.attributes.TPMA_NV_WRITEALL == SET
&& in->data.t.size < nvIndex.publicArea.dataSize)
return TPM_RC_NV_RANGE;
// Internal Data Update
// Perform the write. This called routine will SET the TPMA_NV_WRITTEN
// attribute if it has not already been SET. If NV isn't available, an error
// will be returned.
return NvWriteIndexData(in->nvIndex, &nvIndex, in->offset,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 411
October 31, 2013

Part 3: Commands
46
47
48

Trusted Platform Module Library
in->data.t.size, in->data.t.buffer);

}

Page 412
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.8

Part 3: Commands

TPM2_NV_Increment

33.8.1 General Description
This command is used to increment the value in an NV Index that has TPMA_NV_COUNTER SET. The
data value of the NV Index is incremented by one.
NOTE 1

The NV Index counter is an unsigned value.

If TPMA_NV_COUNTER
TPM_RC_ATTRIBUTES.

is

not

SET

in

the

indicated

NV

Index,

the

TPM

shall

return

If TPMA_NV_WRITELOCKED is SET, the TPM shall return TPM_RC_NV_LOCKED.
If TPMA_NV_WRITTEN is CLEAR, it will be SET.
If TPMA_NV_ORDERLY is SET, and the difference between the volatile and non-volatile versions of this
field is greater than MAX_ORDERLY_COUNT, then the non-volatile version of the counter is updated.
NOTE 2

If a TPM implements TPMA_NV_ORDERLY and an Index is defined with TPMA_NV_ORDERLY and
TPM_NV_COUNTER both SET, then in the Event of a non-orderly shutdown, the non-volatile value
for the counter Index will be advanced by MAX_ORDERLY_COUNT at the next TPM2_Startup().

NOTE 3

An allowed implementation would keep a counter value in NV and a resettable counter in RAM. The
reported value of the NV Index would be the sum of the two values. When the RAM count increments
past the maximum allowed value (MAX_ORDERLY_COUNT), the non-volatile version of the count is
updated with the sum of the values and the RAM count is reset to zero.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 413
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.8.2 Command and Response
Table 207 — TPM2_NV_Increment Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_Increment {NV}

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index to increment
Auth Index: None

Table 208 — TPM2_NV_Increment Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 414
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.8.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "NV_Increment_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

NV index is not a counter

TPM_RC_NV_AUTHORIZATION

authorization failure

TPM_RC_NV_LOCKED
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Meaning

Index is write locked

TPM_RC
TPM2_NV_Increment(
NV_Increment_In

*in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX
UINT64

result;
nvIndex;
countValue;

// Input Validation
// Common access checks, a TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
// error may be returned at this point
result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
return result;
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Make sure that this is a counter
if(nvIndex.publicArea.attributes.TPMA_NV_COUNTER != SET)
return TPM_RC_ATTRIBUTES + RC_NV_Increment_nvIndex;
// Internal Data Update
// If counter index is not been written, initialize it
if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
countValue = NvInitialCounter();
else
// Read NV data in native format for TPM CPU.
NvGetIntIndexData(in->nvIndex, &nvIndex, &countValue);
// Do the increment
countValue++;
// If this is an orderly counter that just rolled over, need to be able to
// write to NV to proceed. This check is done here, because NvWriteIndexData()
// does not see if the update is for counter rollover.
if(
nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == SET
&& (countValue & MAX_ORDERLY_COUNT) == 0)
{
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Need to force an NV update

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 415
October 31, 2013

Part 3: Commands
52
53
54
55
56
57
58
59
60

Trusted Platform Module Library

g_updateNV = TRUE;
}
// Write NV data back. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may
// be returned at this point. If necessary, this function will set the
// TPMA_NV_WRITTEN attribute
return NvWriteIndexData(in->nvIndex, &nvIndex, 0, 8, &countValue);
}

Page 416
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.9

Part 3: Commands

TPM2_NV_Extend

33.9.1 General Description
This command extends a value to an area in NV memory that was previously defined by
TPM2_NV_DefineSpace.
If TPMA_NV_EXTEND is not SET, then the TPM shall return TPM_RC_ATTRIBUTES.
Proper write authorizations are required for this command as determined by TPMA_NV_PPWRITE,
TPMA_NV_OWNERWRITE, TPMA_NV_AUTHWRITE, and the authPolicy of the NV Index.
After successful completion of this command, TPMA_NV_WRITTEN for the NV Index will be SET.
NOTE 1

Once SET, TPMA_NV_WRITTEN remains SET until the NV Index is undefined or the NV Index is
cleared.

If the TPMA_NV_WRITELOCKED attribute of the NV Index is SET, then the TPM shall return
TPM_RC_NV_LOCKED.
NOTE 2

If authorization sessions are present, they are checked before checks to see if writes to the NV
Index are locked.

The data.buffer parameter may be larger than the defined size of the NV Index.
The Index will be updated by:

nvIndex→datanew ≔ HnameAkg(nvIndex→dataold || data.buffer)

(39)

where

HnameAkg()

the hash algorithm indicated in nvIndex→nameAlg

nvIndex→data

the value of the data field in the NV Index

data.buffer

the data buffer of the command parameter

NOTE 3

If TPMA_NV_WRITTEN is CLEAR, then nvIndex→data is a Zero Digest.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 417
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.9.2 Command and Response
Table 209 — TPM2_NV_Extend Command
Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_Extend {NV}

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index to extend
Auth Index: None

TPM2B_MAX_NV_BUFFER

data

the data to extend

Table 210 — TPM2_NV_Extend Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 418
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.9.3 Detailed Actions
1
2
3

#include "InternalRoutines.h"
#include "NV_Extend_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

the TPMA_NV_EXTEND attribute is not SET in the Index referenced
by nvIndex

TPM_RC_NV_AUTHORIZATION

the authorization was valid but the authorizing entity (authHandle) is
not allowed to write to the Index referenced by nvIndex

TPM_RC_NV_LOCKED
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Meaning

the Index referenced by nvIndex is locked for writing

TPM_RC
TPM2_NV_Extend(
NV_Extend_In

*in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX

result;
nvIndex;

TPM2B_DIGEST
TPM2B_DIGEST
HASH_STATE

oldDigest;
newDigest;
hashState;

// Input Validation
// Common access checks, NvWriteAccessCheck() may return TPM_RC_NV_AUTHORIZATION
// or TPM_RC_NV_LOCKED
result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
return result;
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Make sure that this is an extend index
if(nvIndex.publicArea.attributes.TPMA_NV_EXTEND != SET)
return TPM_RC_ATTRIBUTES + RC_NV_Extend_nvIndex;
// If the Index is not-orderly, or if this is the first write, NV will
// need to be updated.
if(
nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == CLEAR
|| nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
{
// Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
// TPM_RC_NV_RATE or TPM_RC_SUCCESS.
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
}
// Internal Data Update
// Perform the write.
oldDigest.t.size = CryptGetHashDigestSize(nvIndex.publicArea.nameAlg);
if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == SET)
{
NvGetIndexData(in->nvIndex, &nvIndex, 0,

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 419
October 31, 2013

Part 3: Commands
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

Trusted Platform Module Library

oldDigest.t.size, oldDigest.t.buffer);
}
else
{
MemorySet(oldDigest.t.buffer, 0, oldDigest.t.size);
}
// Start hash
newDigest.t.size = CryptStartHash(nvIndex.publicArea.nameAlg, &hashState);
// Adding old digest
CryptUpdateDigest2B(&hashState, &oldDigest.b);
// Adding new data
CryptUpdateDigest2B(&hashState, &in->data.b);
// Complete hash
CryptCompleteHash2B(&hashState, &newDigest.b);
// Write extended hash back.
// Note, this routine will SET the TPMA_NV_WRITTEN attribute if necessary
return NvWriteIndexData(in->nvIndex, &nvIndex, 0,
newDigest.t.size, newDigest.t.buffer);
}

Page 420
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.10 TPM2_NV_SetBits
33.10.1

General Description

This command is used to SET bits in an NV Index that was created as a bit field. Any number of bits from
0 to 64 may be SET. The contents of data are ORed with the current contents of the NV Index starting at
offset. The checks on data and offset are the same as for TPM2_NV_Write.
If TPMA_NV_WRITTEN is not SET, then, for the purposes of this command, the NV Index is considered
to contain all zero bits and data is OR with that value.
If TPMA_NV_BITS is not SET, then the TPM shall return TPM_RC_ATTRIBUTES.
After successful completion of this command, TPMA_NV_WRITTEN for the NV Index will be SET.
NOTE

TPMA_NV_WRITTEN will be SET even if no bits were SET.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 421
October 31, 2013

Part 3: Commands

33.10.2

Trusted Platform Module Library

Command and Response
Table 211 — TPM2_NV_SetBits Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_SetBits {NV}

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

NV Index of the area in which the bit is to be set
Auth Index: None

UINT64

bits

the data to OR with the current contents

Table 212 — TPM2_NV_SetBits Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 422
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.10.3
1
2
3

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "NV_SetBits_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

the TPMA_NV_BITS attribute is not SET in the Index referenced by
nvIndex

TPM_RC_NV_AUTHORIZATION

the authorization was valid but the authorizing entity (authHandle) is
not allowed to write to the Index referenced by nvIndex

TPM_RC_NV_LOCKED
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Meaning

the Index referenced by nvIndex is locked for writing

TPM_RC
TPM2_NV_SetBits(
NV_SetBits_In

*in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX
UINT64

result;
nvIndex;
bitValue;

// Input Validation
// Common access checks, NvWriteAccessCheck() may return TPM_RC_NV_AUTHORIZATION
// or TPM_RC_NV_LOCKED
// error may be returned at this point
result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
return result;
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Make sure that this is a bit field
if(nvIndex.publicArea.attributes.TPMA_NV_BITS != SET)
return TPM_RC_ATTRIBUTES + RC_NV_SetBits_nvIndex;
// If the Index is not-orderly, or if this is the first write, NV will
// need to be updated.
if(
nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == CLEAR
|| nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
{
// Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
// TPM_RC_NV_RATE or TPM_RC_SUCCESS.
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
}
// Internal Data Update
// If index is not been written, initialize it
if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
bitValue = 0;
else
// Read index data

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 423
October 31, 2013

Part 3: Commands
50
51
52
53
54
55
56
57
58
59

Trusted Platform Module Library

NvGetIntIndexData(in->nvIndex, &nvIndex, &bitValue);
// OR in the new bit setting
bitValue |= in->bits;
// Write index data back. If necessary, this function will SET
// TPMA_NV_WRITTEN.
return NvWriteIndexData(in->nvIndex, &nvIndex, 0, 8, &bitValue);
}

Page 424
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.11 TPM2_NV_WriteLock
33.11.1

General Description

If the TPMA_NV_WRITEDEFINE or TPMA_NV_WRITE_STCLEAR attributes of an NV location are SET,
then this command may be used to inhibit further writes of the NV Index.
Proper write authorization is required for this command as determined by TPMA_NV_PPWRITE,
TPMA_NV_OWNERWRITE, TPMA_NV_AUTHWRITE, and the authPolicy of the NV Index.
It is not an error if TPMA_NV_WRITELOCKED for the NV Index is already SET.
If neither TPMA_NV_WRITEDEFINE nor TPMA_NV_WRITE_STCLEAR of the NV Index is SET, then the
TPM shall return TPM_RC_ATTRIBUTES.
If the command is properly authorized and TPMA_NV_WRITE_STCLEAR or TPMA_NV_WRITEDEFINE
is SET, then the TPM shall SET TPMA_NV_WRITELOCKED for the NV Index.
TPMA_NV_WRITELOCKED will be clear on the next TPM2_Startup(TPM_SU_CLEAR) unless
TPMA_NV_WRITEDEFINE is SET.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 425
October 31, 2013

Part 3: Commands

33.11.2

Trusted Platform Module Library

Command and Response
Table 213 — TPM2_NV_WriteLock Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_WriteLock {NV}

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index of the area to lock
Auth Index: None

Table 214 — TPM2_NV_WriteLock Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 426
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.11.3
1
2
3

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "NV_WriteLock_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

neither TPMA_NV_WRITEDEFINE nor
TPMA_NV_WRITE_STCLEAR is SET in Index referenced by
nvIndex

TPM_RC_NV_AUTHORIZATION

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

Meaning

the authorization was valid but the authorizing entity (authHandle) is
not allowed to write to the Index referenced by nvIndex

TPM_RC
TPM2_NV_WriteLock(
NV_WriteLock_In *in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX

result;
nvIndex;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Input Validation:
// Common write access checks, a TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
// error may be returned at this point
result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_NV_AUTHORIZATION)
return TPM_RC_NV_AUTHORIZATION;
// If write access failed because the index is already locked, then it is
// no error.
return TPM_RC_SUCCESS;
}
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// if non of TPMA_NV_WRITEDEFINE or TPMA_NV_WRITE_STCLEAR is set, the index
// can not be write-locked
if(
nvIndex.publicArea.attributes.TPMA_NV_WRITEDEFINE == CLEAR
&& nvIndex.publicArea.attributes.TPMA_NV_WRITE_STCLEAR == CLEAR)
return TPM_RC_ATTRIBUTES + RC_NV_WriteLock_nvIndex;
// Internal Data Update
// Set the WRITELOCK attribute
nvIndex.publicArea.attributes.TPMA_NV_WRITELOCKED = SET;
// Write index info back
NvWriteIndexInfo(in->nvIndex, &nvIndex);

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 427
October 31, 2013

Part 3: Commands
51
52

Trusted Platform Module Library

return TPM_RC_SUCCESS;
}

Page 428
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.12 TPM2_NV_GlobalWriteLock
33.12.1

General Description

The command will SET TPMA_NV_WRITELOCKED
TPMA_NV_GLOBALLOCK attribute SET.

for

all

indexes

that

have

their

If an Index has both TPMA_NV_WRITELOCKED and TPMA_NV_WRITEDEFINE SET, then this
command will permanently lock the NV Index for writing.
NOTE

If an Index is defined with TPMA_NV_GLOBALLOCK SET, then the global lock does not apply until
the next time this command is executed.

This command requires either platformAuth/platformPolicy or ownerAuth/ownerPolicy.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 429
October 31, 2013

Part 3: Commands

33.12.2

Trusted Platform Module Library

Command and Response
Table 215 — TPM2_NV_GlobalWriteLock Command

Type

Name

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_GlobalWriteLock

TPMI_RH_PROVISION

@authHandle

TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
Auth Index: 1
Auth Role: USER

Description

Table 216 — TPM2_NV_GlobalWriteLock Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 430
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.12.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "NV_GlobalWriteLock_fp.h"

TPM_RC
TPM2_NV_GlobalWriteLock(
NV_GlobalWriteLock_In *in

// IN: input parameter list

)
{
TPM_RC

result;

// Input parameter is not reference in command action
in = NULL; // to silence compiler warnings.
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
// Internal Data Update
// Implementation dependent method of setting the global lock
NvSetGlobalLock();
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 431
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.13 TPM2_NV_Read
33.13.1

General Description

This command reads a
TPM2_NV_DefineSpace().

value

from

an

area

in

NV

memory

previously

defined

by

Proper authorizations are required for this command as determined by TPMA_NV_PPREAD,
TPMA_NV_OWNERREAD, TPMA_NV_AUTHREAD, and the authPolicy of the NV Index.
If TPMA_NV_READLOCKED of the NV Index is SET, then the TPM shall return TPM_RC_NV_LOCKED.
NOTE

If authorization sessions are present, they are checked before the read -lock status of the NV Index
is checked.

If the size parameter plus the offset parameter adds to a value that is greater than the size of the NV
Index data area, the TPM shall return TPM_RC_NV_RANGE and not read any data from the NV Index.
If the NV Index has been defined but the TPMA_NV_WRITTEN attribute is CLEAR, then this command
shall return TPM_RC_NV_UINITIALIZED even if size is zero.
The data parameter in the response may be encrypted using parameter encryption.

Page 432
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.13.2

Part 3: Commands

Command and Response
Table 217 — TPM2_NV_Read Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_Read

TPMI_RH_NV_AUTH

@authHandle

the handle indicating the source of the authorization
value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index to be read
Auth Index: None

UINT16

size

number of octets to read

UINT16

offset

octet offset into the area
This value shall be less than or equal to the size of the
nvIndex data.

Table 218 — TPM2_NV_Read Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

TPM2B_MAX_NV_BUFFER

data

Family “2.0”
Level 00 Revision 00.99

the data read

Published
Copyright © TCG 2006-2013

Page 433
October 31, 2013

Part 3: Commands

33.13.3
1
2
3

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "NV_Read_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_NV_AUTHORIZATION

the authorization was valid but the authorizing entity (authHandle) is
not allowed to read from the Index referenced by nvIndex

TPM_RC_NV_LOCKED

the Index referenced by nvIndex is read locked

TPM_RC_NV_RANGE

read range defined by size and offset is outside the range of the
Index referenced by nvIndex

TPM_RC_NV_UNINITIALIZED
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

Meaning

the Index referenced by nvIndex has not been initialized (written)

TPM_RC
TPM2_NV_Read(
NV_Read_In
NV_Read_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
NV_INDEX
TPM_RC

nvIndex;
result;

// Input Validation
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Common read access checks. NvReadAccessChecks() returns
// TPM_RC_NV_AUTHORIZATION, TPM_RC_NV_LOCKED, or TPM_RC_NV_UNINITIALIZED
// error may be returned at this point
result = NvReadAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
return result;
// Too much data
if((in->size + in->offset) > nvIndex.publicArea.dataSize)
return TPM_RC_NV_RANGE;
// Command Output
// Set the return size
out->data.t.size = in->size;
// Perform the read
NvGetIndexData(in->nvIndex, &nvIndex, in->offset, in->size, out->data.t.buffer);
return TPM_RC_SUCCESS;
}

Page 434
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.14 TPM2_NV_ReadLock
33.14.1

General Description

If TPMA_NV_READ_STCLEAR is SET in an Index, then this command may be used to prevent further
reads of the NV Index until the next TPM2_Startup (TPM_SU_CLEAR).
Proper authorizations are required for this command as determined by TPMA_NV_PPREAD,
TPMA_NV_OWNERREAD, TPMA_NV_AUTHREAD, and the authPolicy of the NV Index.
NOTE

Only an entity that may read an Index is allowed to lock the NV Index for read.

If the command is properly authorized and TPMA_NV_READ_STCLEAR of the NV Index is SET, then the
TPM shall SET TPMA_NV_READLOCKED for the NV Index. If TPMA_NV_READ_STCLEAR of the NV
Index is CLEAR, then the TPM shall return TPM_RC_NV_ATTRIBUTE. TPMA_NV_READLOCKED will
be CLEAR by the next TPM2_Startup(TPM_SU_CLEAR).
It is not an error to use this command for an Index that is already locked for reading.
An Index that had not been written may be locked for reading.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 435
October 31, 2013

Part 3: Commands

33.14.2

Trusted Platform Module Library

Command and Response
Table 219 — TPM2_NV_ReadLock Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_ReadLock

TPMI_RH_NV_AUTH

@authHandle

the handle indicating the source of the authorization
value
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

the NV Index to be locked
Auth Index: None

Table 220 — TPM2_NV_ReadLock Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Page 436
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.14.3
1
2
3

Part 3: Commands

Detailed Actions

#include "InternalRoutines.h"
#include "NV_ReadLock_fp.h"
#include "NV_spt_fp.h"
Error Returns
TPM_RC_ATTRIBUTES

TPMA_NV_READ_STCLEAR is not SET so Index referenced by
nvIndex may not be write locked

TPM_RC_NV_AUTHORIZATION

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

Meaning

the authorization was valid but the authorizing entity (authHandle) is
not allowed to read from the Index referenced by nvIndex

TPM_RC
TPM2_NV_ReadLock(
NV_ReadLock_In *in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX

result;
nvIndex;

// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input Validation
// Common read access checks. NvReadAccessChecks() returns
// TPM_RC_NV_AUTHORIZATION, TPM_RC_NV_LOCKED, or TPM_RC_NV_UNINITIALIZED
// error may be returned at this point
result = NvReadAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_NV_AUTHORIZATION)
return TPM_RC_NV_AUTHORIZATION;
// Index is already locked for write
else if(result == TPM_RC_NV_LOCKED)
return TPM_RC_SUCCESS;
// If NvReadAccessChecks return TPM_RC_NV_UNINITALIZED, then continue.
// It is not an error to read lock an uninitialized Index.
}
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// if TPMA_NV_READ_STCLEAR is not set, the index can not be read-locked
if(nvIndex.publicArea.attributes.TPMA_NV_READ_STCLEAR == CLEAR)
return TPM_RC_ATTRIBUTES + RC_NV_ReadLock_nvIndex;
// Internal Data Update
// Set the READLOCK attribute
nvIndex.publicArea.attributes.TPMA_NV_READLOCKED = SET;
// Write NV info back
NvWriteIndexInfo(in->nvIndex, &nvIndex);
return TPM_RC_SUCCESS;
}

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 437
October 31, 2013

Part 3: Commands

Trusted Platform Module Library

33.15 TPM2_NV_ChangeAuth
33.15.1

General Description

This command allows the authorization secret for an NV Index to be changed.
If successful, the authorization secret (authValue) of the NV Index associated with nvIndex is changed.
This command requires that a policy session be used for authorization of nvIndex so that the ADMIN role
may be asserted and that commandCode in the policy session context shall be
TPM_CC_NV_ChangeAuth. That is, the policy must contain a specific authorization for changing the
authorization value of the referenced object.
NOTE

The reason for this restriction is to ensure that the admin istrative actions on nvIndex require explicit
approval while other commands may use policy that is not command -dependent.

The size of the newAuth value may be no larger than the size of authorization indicated when the NV
Index was defined.
Since the NV Index authorization is changed before the response HMAC is calculated, the newAuth value
is used when generating the response HMAC key if required. See Part 4 ComputeResponseHMAC().

Page 438
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.15.2

Part 3: Commands

Command and Response
Table 221 — TPM2_NV_ChangeAuth Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_ChangeAuth {NV}

TPMI_RH_NV_INDEX

@nvIndex

handle of the object
Auth Index: 1
Auth Role: ADMIN

TPM2B_AUTH

newAuth

new authorization value

Table 222 — TPM2_NV_ChangeAuth Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 439
October 31, 2013

Part 3: Commands

33.15.3
1
2

Trusted Platform Module Library

Detailed Actions

#include "InternalRoutines.h"
#include "NV_ChangeAuth_fp.h"
Error Returns
TPM_RC_SIZE

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

Meaning
newAuth size is larger than the digest size of the Name algorithm for
the Index referenced by 'nvIndex

TPM_RC
TPM2_NV_ChangeAuth(
NV_ChangeAuth_In

*in

// IN: input parameter list

)
{
TPM_RC
NV_INDEX

result;
nvIndex;

// Input Validation
// Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
// TPM_RC_NV_RATE or TPM_RC_SUCCESS.
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Read index info from NV
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Remove any trailing zeros that might have been added by the caller
// to obfuscate the size.
MemoryRemoveTrailingZeros(&(in->newAuth));
// Make sure that the authValue is no larger than the nameAlg of the Index
if(in->newAuth.t.size > CryptGetHashDigestSize(nvIndex.publicArea.nameAlg))
return TPM_RC_SIZE + RC_NV_ChangeAuth_newAuth;
// Internal Data Update
// Change auth
nvIndex.authValue = in->newAuth;
// Write index info back to NV
NvWriteIndexInfo(in->nvIndex, &nvIndex);
return TPM_RC_SUCCESS;
}

Page 440
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

Part 3: Commands

33.16 TPM2_NV_Certify
33.16.1

General Description

The purpose of this command is to certify the contents of an NV Index or portion of an NV Index.
If proper authorization for reading the NV Index is provided, the portion of the NV Index selected by size
and offset are included in an attestation block and signed using the key indicated by signHandle. The
attestation also includes size and offset so that the range of the data can be determined.
NOTE

See 20.1 for description of how the signing scheme is selected.

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 441
October 31, 2013

Part 3: Commands

33.16.2

Trusted Platform Module Library

Command and Response
Table 223 — TPM2_NV_Certify Command

Type

Name

Description

TPMI_ST_COMMAND_TAG

tag

UINT32

commandSize

TPM_CC

commandCode

TPM_CC_NV_Certify

TPMI_DH_OBJECT+

@signHandle

handle of the key used to sign the attestation structure
Auth Index: 1
Auth Role: USER

TPMI_RH_NV_AUTH

@authHandle

handle indicating the source of the authorization value
for the NV Index
Auth Index: 2
Auth Role: USER

TPMI_RH_NV_INDEX

nvIndex

Index for the area to be certified
Auth Index: None

TPM2B_DATA

qualifyingData

user-provided qualifying data

TPMT_SIG_SCHEME+

inScheme

signing scheme to use if the scheme for signHandle is
TPM_ALG_NULL

UINT16

size

number of octets to certify

UINT16

offset

octet offset into the area
This value shall be less than or equal to the size of the
nvIndex data.

Table 224 — TPM2_NV_Certify Response
Type

Name

Description

TPM_ST

tag

see clause 8

UINT32

responseSize

TPM_RC

responseCode

.

TPM2B_ATTEST

certifyInfo

the structure that was signed

TPMT_SIGNATURE

signature

the asymmetric signature over certifyInfo using the key
referenced by signHandle

Page 442
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99

Trusted Platform Module Library

33.16.3
1
2
3
4

Detailed Actions

#include
#include
#include
#include

Part 3: Commands

"InternalRoutines.h"
"Attest_spt_fp.h"
"NV_spt_fp.h"
"NV_Certify_fp.h"

Error Returns
TPM_RC_NV_AUTHORIZATION

the authorization was valid but the authorizing entity (authHandle) is
not allowed to read from the Index referenced by nvIndex

TPM_RC_KEY

signHandle does not reference a signing key

TPM_RC_NV_LOCKED

Index referenced by nvIndex is locked for reading

TPM_RC_NV_RANGE

offset plus size extends outside of the data range of the Index
referenced by nvIndex

TPM_RC_NV_UNINITIALIZED

Index referenced by nvIndex has not been written

TPM_RC_SCHEME
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

Meaning

inScheme is not an allowed value for the key definition

TPM_RC
TPM2_NV_Certify(
NV_Certify_In
NV_Certify_Out

*in,
*out

// IN: input parameter list
// OUT: output parameter list

)
{
TPM_RC
NV_INDEX
TPMS_ATTEST

result;
nvIndex;
certifyInfo;

// Attestation command may cause the orderlyState to be cleared due to
// the reporting of clock info. If this is the case, check if NV is
// available first
if(gp.orderlyState != SHUTDOWN_NONE)
{
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS)
return result;
}
// Input Validation
// Get NV index info
NvGetIndexInfo(in->nvIndex, &nvIndex);
// Common access checks. A TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
// error may be returned at this point
result = NvReadAccessChecks(in->authHandle, in->nvIndex);
if(result != TPM_RC_SUCCESS)
return result;
// See if the range to be certified is out of the bounds of the defined
// Index
if((in->size + in->offset) > nvIndex.publicArea.dataSize)
return TPM_RC_NV_RANGE;
// Command Output

Family “2.0”
Level 00 Revision 00.99

Published
Copyright © TCG 2006-2013

Page 443
October 31, 2013

Part 3: Commands
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

Trusted Platform Module Library

// Filling in attest information
// Common fields
// FillInAttestInfo can return TPM_RC_SCHEME or TPM_RC_KEY
result = FillInAttestInfo(in->signHandle,
&in->inScheme,
&in->qualifyingData,
&certifyInfo);
if(result != TPM_RC_SUCCESS)
{
if(result == TPM_RC_KEY)
return TPM_RC_KEY + RC_NV_Certify_signHandle;
else
return RcSafeAddToResult(result, RC_NV_Certify_inScheme);
}
// NV certify specific fields
// Attestation type
certifyInfo.type = TPM_ST_ATTEST_NV;
// Get the name of the index
certifyInfo.attested.nv.indexName.t.size =
NvGetName(in->nvIndex, &certifyInfo.attested.nv.indexName.t.name);
// Set the return size
certifyInfo.attested.nv.nvContents.t.size = in->size;
// Set the offset
certifyInfo.attested.nv.offset = in->offset;
// Perform the read
NvGetIndexData(in->nvIndex, &nvIndex,
in->offset, in->size,
certifyInfo.attested.nv.nvContents.t.buffer);
// Sign attestation structure. A NULL signature will be returned if
// signHandle is TPM_RH_NULL. SignAttestInfo() may return TPM_RC_VALUE,
// TPM_RC_SCHEME or TPM_RC_ATTRUBUTES.
// Note: SignAttestInfo may return TPM_RC_ATTRIBUTES if the key is not a
// signing key but that was checked above. TPM_RC_VALUE would mean that the
// data to sign is too large but the data to sign is a digest
result = SignAttestInfo(in->signHandle,
&in->inScheme,
&certifyInfo,
&in->qualifyingData,
&out->certifyInfo,
&out->signature);
if(result != TPM_RC_SUCCESS)
return result;
// orderly state should be cleared because of the reporting of clock info
// if signing happens
if(in->signHandle != TPM_RH_NULL)
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}

Page 444
October 31, 2013

Published
Copyright © TCG 2006-2013

Family “2.0”
Level 00 Revision 00.99


