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

Handle

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

Handle

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

Handle

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+

hashAlg

the hash algorithm 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

responseCode

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

responseCode

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

responseCode

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