      Trusted Platform Module Library
      Part 3: Commands

      Family “2.0”

      Level 00 Revision 01.16

      October 30, 2014




      Contact: admin@trustedcomputinggroup.org




      TCG Published
      Copyright © TCG 2006-2014




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                                         TCG Published                                      Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                                                                      Part 3: Commands


                                                                    CONTENTS

1     Scope .................................................................................................................................................... 1
2     Terms and Definitions ........................................................................................................................... 1
3     Symbols and abbreviated terms ............................................................................................................ 1
4     Notation ................................................................................................................................................. 1
    4.1     Introduction ..................................................................................................................................... 1
    4.2     Table Decorations ........................................................................................................................... 1
    4.3     Handle and Parameter Demarcation .............................................................................................. 3
    4.4     AuthorizationSize and ParameterSize ............................................................................................ 3
5     Command Processing ........................................................................................................................... 4
    5.1     Introduction ..................................................................................................................................... 4
    5.2     Command Header Validation .......................................................................................................... 4
    5.3     Mode Checks .................................................................................................................................. 4
    5.4     Handle Area Validation ................................................................................................................... 5
    5.5     Session Area Validation .................................................................................................................. 6
    5.6     Authorization Checks ...................................................................................................................... 7
    5.7     Parameter Decryption ..................................................................................................................... 8
    5.8     Parameter Unmarshaling ................................................................................................................ 8
    5.9     Command Post Processing .......................................................................................................... 10
6     Response Values ................................................................................................................................ 12
    6.1     Tag ................................................................................................................................................ 12
    6.2     Response Codes .......................................................................................................................... 12
7     Implementation Dependent ................................................................................................................. 15
8     Detailed Actions Assumptions ............................................................................................................. 16
    8.1     Introduction ................................................................................................................................... 16
    8.2     Pre-processing .............................................................................................................................. 16
    8.3     Post Processing ............................................................................................................................ 16
9     Start-up ................................................................................................................................................ 17
    9.1     Introduction ................................................................................................................................... 17
    9.2     _TPM_Init...................................................................................................................................... 17
    9.3     TPM2_Startup ............................................................................................................................... 19
    9.4     TPM2_Shutdown .......................................................................................................................... 26
10    Testing ................................................................................................................................................. 30
    10.1    Introduction ................................................................................................................................... 30
    10.2    TPM2_SelfTest ............................................................................................................................. 31
    10.3    TPM2_IncrementalSelfTest .......................................................................................................... 34
    10.4    TPM2_GetTestResult ................................................................................................................... 37
11    Session Commands ............................................................................................................................ 40
    11.1    TPM2_StartAuthSession .............................................................................................................. 40
    11.2    TPM2_PolicyRestart ..................................................................................................................... 45
12    Object Commands............................................................................................................................... 48
    12.1    TPM2_Create................................................................................................................................ 48
    12.2    TPM2_Load .................................................................................................................................. 54

Family “2.0”                                                      TCG Published                                                                       Page iii
Level 00 Revision 01.16                                Copyright © TCG 2006-2014                                                     October 30, 2014
Part 3: Commands                                                                                            Trusted Platform Module Library


 12.3     TPM2_LoadExternal ..................................................................................................................... 58
 12.4     TPM2_ReadPublic ........................................................................................................................ 63
 12.5     TPM2_ActivateCredential ............................................................................................................. 66
 12.6     TPM2_MakeCredential ................................................................................................................. 70
 12.7     TPM2_Unseal ............................................................................................................................... 73
 12.8     TPM2_ObjectChangeAuth ............................................................................................................ 76
13   Duplication Commands ....................................................................................................................... 80
 13.1     TPM2_Duplicate ........................................................................................................................... 80
 13.2     TPM2_Rewrap .............................................................................................................................. 84
 13.3     TPM2_Import ................................................................................................................................ 88
14   Asymmetric Primitives ......................................................................................................................... 94
 14.1     Introduction ................................................................................................................................... 94
 14.2     TPM2_RSA_Encrypt ..................................................................................................................... 94
 14.3     TPM2_RSA_Decrypt .................................................................................................................... 99
 14.4     TPM2_ECDH_KeyGen ............................................................................................................... 103
 14.5     TPM2_ECDH_ZGen ................................................................................................................... 107
 14.6     TPM2_ECC_Parameters ............................................................................................................ 110
 14.7     TPM2_ZGen_2Phase ................................................................................................................. 112
15   Symmetric Primitives ......................................................................................................................... 116
 15.1     Introduction ................................................................................................................................. 116
 15.2     TPM2_EncryptDecrypt ................................................................................................................ 118
 15.3     TPM2_Hash ................................................................................................................................ 122
 15.4     TPM2_HMAC .............................................................................................................................. 125
16   Random Number Generator .............................................................................................................. 129
 16.1     TPM2_GetRandom ..................................................................................................................... 129
 16.2     TPM2_StirRandom ..................................................................................................................... 132
17   Hash/HMAC/Event Sequences ......................................................................................................... 135
 17.1     Introduction ................................................................................................................................. 135
 17.2     TPM2_HMAC_Start .................................................................................................................... 135
 17.3     TPM2_HashSequenceStart ........................................................................................................ 139
 17.4     TPM2_SequenceUpdate ............................................................................................................ 142
 17.5     TPM2_SequenceComplete......................................................................................................... 146
 17.6     TPM2_EventSequenceComplete ............................................................................................... 150
18   Attestation Commands ...................................................................................................................... 154
 18.1     Introduction ................................................................................................................................. 154
 18.2     TPM2_Certify .............................................................................................................................. 156
 18.3     TPM2_CertifyCreation ................................................................................................................ 160
 18.4     TPM2_Quote............................................................................................................................... 164
 18.5     TPM2_GetSessionAuditDigest ................................................................................................... 168
 18.6     TPM2_GetCommandAuditDigest ............................................................................................... 172
 18.7     TPM2_GetTime........................................................................................................................... 176
19   Ephemeral EC Keys .......................................................................................................................... 180
 19.1     Introduction ................................................................................................................................. 180
 19.2     TPM2_Commit ............................................................................................................................ 181


Page iv                                                        TCG Published                                                             Family “2.0”
October 30, 2014                                    Copyright © TCG 2006-2014                                        Level 00 Revision 01.16
Trusted Platform Module Library                                                                                                Part 3: Commands


  19.3    TPM2_EC_Ephemeral ................................................................................................................ 186
20   Signing and Signature Verification .................................................................................................... 189
  20.1    TPM2_VerifySignature ................................................................................................................ 189
  20.2    TPM2_Sign ................................................................................................................................. 193
21   Command Audit ................................................................................................................................. 197
  21.1    Introduction ................................................................................................................................. 197
  21.2    TPM2_SetCommandCodeAuditStatus ....................................................................................... 198
22   Integrity Collection (PCR) .................................................................................................................. 202
  22.1    Introduction ................................................................................................................................. 202
  22.2    TPM2_PCR_Extend ................................................................................................................... 203
  22.3    TPM2_PCR_Event ..................................................................................................................... 206
  22.4    TPM2_PCR_Read ...................................................................................................................... 209
  22.5    TPM2_PCR_Allocate .................................................................................................................. 212
  22.6    TPM2_PCR_SetAuthPolicy ........................................................................................................ 215
  22.7    TPM2_PCR_SetAuthValue ......................................................................................................... 218
  22.8    TPM2_PCR_Reset ..................................................................................................................... 221
  22.9    _TPM_Hash_Start ...................................................................................................................... 224
  22.10   _TPM_Hash_Data ...................................................................................................................... 226
  22.11   _TPM_Hash_End ....................................................................................................................... 228
23   Enhanced Authorization (EA) Commands ........................................................................................ 231
  23.1    Introduction ................................................................................................................................. 231
  23.2    Signed Authorization Actions ...................................................................................................... 232
  23.3    TPM2_PolicySigned ................................................................................................................... 236
  23.4    TPM2_PolicySecret .................................................................................................................... 242
  23.5    TPM2_PolicyTicket ..................................................................................................................... 246
  23.6    TPM2_PolicyOR ......................................................................................................................... 250
  23.7    TPM2_PolicyPCR ....................................................................................................................... 254
  23.8    TPM2_PolicyLocality .................................................................................................................. 259
  23.9    TPM2_PolicyNV .......................................................................................................................... 263
  23.10   TPM2_PolicyCounterTimer......................................................................................................... 268
  23.11   TPM2_PolicyCommandCode ..................................................................................................... 273
  23.12   TPM2_PolicyPhysicalPresence .................................................................................................. 276
  23.13   TPM2_PolicyCpHash .................................................................................................................. 279
  23.14   TPM2_PolicyNameHash ............................................................................................................. 283
  23.15   TPM2_PolicyDuplicationSelect ................................................................................................... 287
  23.16   TPM2_PolicyAuthorize ............................................................................................................... 291
  23.17   TPM2_PolicyAuthValue .............................................................................................................. 295
  23.18   TPM2_PolicyPassword ............................................................................................................... 298
  23.19   TPM2_PolicyGetDigest ............................................................................................................... 301
  23.20   TPM2_PolicyNvWritten ............................................................................................................... 304
24   Hierarchy Commands........................................................................................................................ 308
  24.1    TPM2_CreatePrimary ................................................................................................................. 308
  24.2    TPM2_HierarchyControl ............................................................................................................. 312
  24.3    TPM2_SetPrimaryPolicy ............................................................................................................. 316
  24.4    TPM2_ChangePPS .................................................................................................................... 320
  24.5    TPM2_ChangeEPS .................................................................................................................... 323

Family “2.0”                                                   TCG Published                                                                    Page v
Level 00 Revision 01.16                             Copyright © TCG 2006-2014                                                  October 30, 2014
Part 3: Commands                                                                                            Trusted Platform Module Library


 24.6      TPM2_Clear ................................................................................................................................ 326
 24.7      TPM2_ClearControl .................................................................................................................... 330
 24.8      TPM2_HierarchyChangeAuth ..................................................................................................... 333
25   Dictionary Attack Functions ............................................................................................................... 336
 25.1      Introduction ................................................................................................................................. 336
 25.2      TPM2_DictionaryAttackLockReset ............................................................................................. 336
 25.3      TPM2_DictionaryAttackParameters............................................................................................ 339
26   Miscellaneous Management Functions ............................................................................................. 342
 26.1      Introduction ................................................................................................................................. 342
 26.2      TPM2_PP_Commands ............................................................................................................... 342
 26.3      TPM2_SetAlgorithmSet .............................................................................................................. 345
27   Field Upgrade .................................................................................................................................... 348
 27.1      Introduction ................................................................................................................................. 348
 27.2      TPM2_FieldUpgradeStart ........................................................................................................... 350
 27.3      TPM2_FieldUpgradeData ........................................................................................................... 353
 27.4      TPM2_FirmwareRead ................................................................................................................. 356
28   Context Management ........................................................................................................................ 359
 28.1      Introduction ................................................................................................................................. 359
 28.2      TPM2_ContextSave .................................................................................................................... 359
 28.3      TPM2_ContextLoad .................................................................................................................... 364
 28.4      TPM2_FlushContext ................................................................................................................... 369
 28.5      TPM2_EvictControl ..................................................................................................................... 372
29   Clocks and Timers............................................................................................................................. 377
 29.1      TPM2_ReadClock ....................................................................................................................... 377
 29.2      TPM2_ClockSet .......................................................................................................................... 380
 29.3      TPM2_ClockRateAdjust .............................................................................................................. 383
30   Capability Commands ....................................................................................................................... 386
 30.1      Introduction ................................................................................................................................. 386
 30.2      TPM2_GetCapability ................................................................................................................... 386
 30.3      TPM2_TestParms ....................................................................................................................... 394
31   Non-volatile Storage .......................................................................................................................... 397
 31.1      Introduction ................................................................................................................................. 397
 31.2      NV Counters ............................................................................................................................... 398
 31.3      TPM2_NV_DefineSpace ............................................................................................................. 399
 31.4      TPM2_NV_UndefineSpace ......................................................................................................... 405
 31.5      TPM2_NV_UndefineSpaceSpecial ............................................................................................. 408
 31.6      TPM2_NV_ReadPublic ............................................................................................................... 411
 31.7      TPM2_NV_Write ......................................................................................................................... 414
 31.8      TPM2_NV_Increment ................................................................................................................. 418
 31.9      TPM2_NV_Extend ...................................................................................................................... 422
 31.10     TPM2_NV_SetBits ...................................................................................................................... 426
 31.11     TPM2_NV_WriteLock ................................................................................................................. 430
 31.12     TPM2_NV_GlobalWriteLock ....................................................................................................... 434
 31.13     TPM2_NV_Read ......................................................................................................................... 437


Page vi                                                         TCG Published                                                            Family “2.0”
October 30, 2014                                     Copyright © TCG 2006-2014                                       Level 00 Revision 01.16
Trusted Platform Module Library                                                                                         Part 3: Commands


  31.14 TPM2_NV_ReadLock ................................................................................................................. 440
  31.15 TPM2_NV_ChangeAuth ............................................................................................................. 444
  31.16 TPM2_NV_Certify ....................................................................................................................... 447




Family “2.0”                                                TCG Published                                                             Page vii
Level 00 Revision 01.16                           Copyright © TCG 2006-2014                                             October 30, 2014
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 .......................................................................................................... 22
Table 6 — TPM2_Startup Response .......................................................................................................... 22
Table 7 — TPM2_Shutdown Command ..................................................................................................... 27
Table 8 — TPM2_Shutdown Response ...................................................................................................... 27
Table 9 — TPM2_SelfTest Command ........................................................................................................ 32
Table 10 — TPM2_SelfTest Response ...................................................................................................... 32
Table 11 — TPM2_IncrementalSelfTest Command ................................................................................... 35
Table 12 — TPM2_IncrementalSelfTest Response ................................................................................... 35
Table 13 — TPM2_GetTestResult Command ............................................................................................ 38
Table 14 — TPM2_GetTestResult Response............................................................................................. 38
Table 15 — TPM2_StartAuthSession Command ....................................................................................... 42
Table 16 — TPM2_StartAuthSession Response ........................................................................................ 42
Table 17 — TPM2_PolicyRestart Command .............................................................................................. 46
Table 18 — TPM2_PolicyRestart Response .............................................................................................. 46
Table 19 — TPM2_Create Command ........................................................................................................ 51
Table 20 — TPM2_Create Response ......................................................................................................... 51
Table 21 — TPM2_Load Command ........................................................................................................... 55
Table 22 — TPM2_Load Response ............................................................................................................ 55
Table 23 — TPM2_LoadExternal Command .............................................................................................. 60
Table 24 — TPM2_LoadExternal Response .............................................................................................. 60
Table 25 — TPM2_ReadPublic Command ................................................................................................. 64
Table 26 — TPM2_ReadPublic Response ................................................................................................. 64
Table 27 — TPM2_ActivateCredential Command ...................................................................................... 67
Table 28 — TPM2_ActivateCredential Response ...................................................................................... 67
Table 29 — TPM2_MakeCredential Command .......................................................................................... 71
Table 30 — TPM2_MakeCredential Response .......................................................................................... 71
Table 31 — TPM2_Unseal Command ........................................................................................................ 74
Table 32 — TPM2_Unseal Response ........................................................................................................ 74
Table 33 — TPM2_ObjectChangeAuth Command ..................................................................................... 77
Table 34 — TPM2_ObjectChangeAuth Response ..................................................................................... 77
Table 35 — TPM2_Duplicate Command .................................................................................................... 81
Table 36 — TPM2_Duplicate Response ..................................................................................................... 81
Table 37 — TPM2_Rewrap Command ....................................................................................................... 85
Table 38 — TPM2_Rewrap Response ....................................................................................................... 85

Page viii                                                       TCG Published                                                          Family “2.0”
October 30, 2014                                     Copyright © TCG 2006-2014                                     Level 00 Revision 01.16
Trusted Platform Module Library                                                                                       Part 3: Commands

Table 39 — TPM2_Import Command ......................................................................................................... 90
Table 40 — TPM2_Import Response ......................................................................................................... 90
Table 41 — Padding Scheme Selection ..................................................................................................... 94
Table 42 — Message Size Limits Based on Padding ................................................................................. 95
Table 43 — TPM2_RSA_Encrypt Command.............................................................................................. 96
Table 44 — TPM2_RSA_Encrypt Response .............................................................................................. 96
Table 45 — TPM2_RSA_Decrypt Command ........................................................................................... 100
Table 46 — TPM2_RSA_Decrypt Response ............................................................................................ 100
Table 47 — TPM2_ECDH_KeyGen Command ........................................................................................ 104
Table 48 — TPM2_ECDH_KeyGen Response ........................................................................................ 104
Table 49 — TPM2_ECDH_ZGen Command ............................................................................................ 108
Table 50 — TPM2_ECDH_ZGen Response ............................................................................................ 108
Table 51 — TPM2_ECC_Parameters Command ..................................................................................... 110
Table 52 — TPM2_ECC_Parameters Response ..................................................................................... 110
Table 53 — TPM2_ZGen_2Phase Command .......................................................................................... 113
Table 54 — TPM2_ZGen_2Phase Response .......................................................................................... 113
Table 55 — Symmetric Chaining Process ................................................................................................ 117
Table 56 — TPM2_EncryptDecrypt Command......................................................................................... 119
Table 57 — TPM2_EncryptDecrypt Response ......................................................................................... 119
Table 58 — TPM2_Hash Command ......................................................................................................... 123
Table 59 — TPM2_Hash Response ......................................................................................................... 123
Table 60 — TPM2_HMAC Command ....................................................................................................... 126
Table 61 — TPM2_HMAC Response ....................................................................................................... 126
Table 62 — TPM2_GetRandom Command .............................................................................................. 130
Table 63 — TPM2_GetRandom Response .............................................................................................. 130
Table 64 — TPM2_StirRandom Command .............................................................................................. 133
Table 65 — TPM2_StirRandom Response ............................................................................................... 133
Table 66 — Hash Selection Matrix ........................................................................................................... 135
Table 67 — TPM2_HMAC_Start Command ............................................................................................. 136
Table 68 — TPM2_HMAC_Start Response ............................................................................................. 136
Table 69 — TPM2_HashSequenceStart Command ................................................................................. 140
Table 70 — TPM2_HashSequenceStart Response ................................................................................. 140
Table 71 — TPM2_SequenceUpdate Command ..................................................................................... 143
Table 72 — TPM2_SequenceUpdate Response ...................................................................................... 143
Table 73 — TPM2_SequenceComplete Command ................................................................................. 147
Table 74 — TPM2_SequenceComplete Response .................................................................................. 147
Table 75 — TPM2_EventSequenceComplete Command ........................................................................ 151
Table 76 — TPM2_EventSequenceComplete Response ......................................................................... 151
Table 77 — TPM2_Certify Command ....................................................................................................... 157
Family “2.0”                                                TCG Published                                                           Page ix
Level 00 Revision 01.16                           Copyright © TCG 2006-2014                                           October 30, 2014
Part 3: Commands                                                                                 Trusted Platform Module Library

Table 78 — TPM2_Certify Response ....................................................................................................... 157
Table 79 — TPM2_CertifyCreation Command ......................................................................................... 161
Table 80 — TPM2_CertifyCreation Response .......................................................................................... 161
Table 81 — TPM2_Quote Command ....................................................................................................... 165
Table 82 — TPM2_Quote Response ........................................................................................................ 165
Table 83 — TPM2_GetSessionAuditDigest Command ............................................................................ 169
Table 84 — TPM2_GetSessionAuditDigest Response ............................................................................ 169
Table 85 — TPM2_GetCommandAuditDigest Command ........................................................................ 173
Table 86 — TPM2_GetCommandAuditDigest Response ......................................................................... 173
Table 87 — TPM2_GetTime Command ................................................................................................... 177
Table 88 — TPM2_GetTime Response .................................................................................................... 177
Table 89 — TPM2_Commit Command ..................................................................................................... 182
Table 90 — TPM2_Commit Response ..................................................................................................... 182
Table 91 — TPM2_EC_Ephemeral Command ......................................................................................... 187
Table 92 — TPM2_EC_Ephemeral Response ......................................................................................... 187
Table 93 — TPM2_VerifySignature Command......................................................................................... 190
Table 94 — TPM2_VerifySignature Response ......................................................................................... 190
Table 95 — TPM2_Sign Command .......................................................................................................... 194
Table 96 — TPM2_Sign Response .......................................................................................................... 194
Table 97 — TPM2_SetCommandCodeAuditStatus Command ................................................................ 199
Table 98 — TPM2_SetCommandCodeAuditStatus Response ................................................................ 199
Table 99 — TPM2_PCR_Extend Command ............................................................................................ 204
Table 100 — TPM2_PCR_Extend Response ........................................................................................... 204
Table 101 — TPM2_PCR_Event Command ............................................................................................ 207
Table 102 — TPM2_PCR_Event Response ............................................................................................. 207
Table 103 — TPM2_PCR_Read Command ............................................................................................. 210
Table 104 — TPM2_PCR_Read Response ............................................................................................. 210
Table 105 — TPM2_PCR_Allocate Command ......................................................................................... 213
Table 106 — TPM2_PCR_Allocate Response ......................................................................................... 213
Table 107 — TPM2_PCR_SetAuthPolicy Command ............................................................................... 216
Table 108 — TPM2_PCR_SetAuthPolicy Response ............................................................................... 216
Table 109 — TPM2_PCR_SetAuthValue Command ............................................................................... 219
Table 110 — TPM2_PCR_SetAuthValue Response ................................................................................ 219
Table 111 — TPM2_PCR_Reset Command ............................................................................................ 222
Table 112 — TPM2_PCR_Reset Response ............................................................................................. 222
Table 113 — TPM2_PolicySigned Command .......................................................................................... 238
Table 114 — TPM2_PolicySigned Response ........................................................................................... 238
Table 115 — TPM2_PolicySecret Command ........................................................................................... 243
Table 116 — TPM2_PolicySecret Response ............................................................................................ 243
Page x                                                    TCG Published                                                   Family “2.0”
October 30, 2014                                Copyright © TCG 2006-2014                                Level 00 Revision 01.16
Trusted Platform Module Library                                                                                Part 3: Commands

Table 117 — TPM2_PolicyTicket Command ............................................................................................ 247
Table 118 — TPM2_PolicyTicket Response ............................................................................................ 247
Table 119 — TPM2_PolicyOR Command ................................................................................................ 251
Table 120 — TPM2_PolicyOR Response ................................................................................................. 251
Table 121 — TPM2_PolicyPCR Command .............................................................................................. 256
Table 122 — TPM2_PolicyPCR Response .............................................................................................. 256
Table 123 — TPM2_PolicyLocality Command ......................................................................................... 260
Table 124 — TPM2_PolicyLocality Response .......................................................................................... 260
Table 125 — TPM2_PolicyNV Command ................................................................................................. 264
Table 126 — TPM2_PolicyNV Response ................................................................................................. 264
Table 127 — TPM2_PolicyCounterTimer Command ............................................................................... 269
Table 128 — TPM2_PolicyCounterTimer Response ................................................................................ 269
Table 129 — TPM2_PolicyCommandCode Command ............................................................................ 274
Table 130 — TPM2_PolicyCommandCode Response ............................................................................. 274
Table 131 — TPM2_PolicyPhysicalPresence Command ......................................................................... 277
Table 132 — TPM2_PolicyPhysicalPresence Response ......................................................................... 277
Table 133 — TPM2_PolicyCpHash Command......................................................................................... 280
Table 134 — TPM2_PolicyCpHash Response ......................................................................................... 280
Table 135 — TPM2_PolicyNameHash Command.................................................................................... 284
Table 136 — TPM2_PolicyNameHash Response .................................................................................... 284
Table 137 — TPM2_PolicyDuplicationSelect Command .......................................................................... 288
Table 138 — TPM2_PolicyDuplicationSelect Response .......................................................................... 288
Table 139 — TPM2_PolicyAuthorize Command ...................................................................................... 292
Table 140 — TPM2_PolicyAuthorize Response ....................................................................................... 292
Table 141 — TPM2_PolicyAuthValue Command ..................................................................................... 296
Table 142 — TPM2_PolicyAuthValue Response ..................................................................................... 296
Table 143 — TPM2_PolicyPassword Command ...................................................................................... 299
Table 144 — TPM2_PolicyPassword Response ...................................................................................... 299
Table 145 — TPM2_PolicyGetDigest Command...................................................................................... 302
Table 146 — TPM2_PolicyGetDigest Response ...................................................................................... 302
Table 147 — TPM2_PolicyNvWritten Command ...................................................................................... 305
Table 148 — TPM2_PolicyNvWritten Response ...................................................................................... 305
Table 149 — TPM2_CreatePrimary Command ........................................................................................ 309
Table 150 — TPM2_CreatePrimary Response ........................................................................................ 309
Table 151 — TPM2_HierarchyControl Command .................................................................................... 313
Table 152 — TPM2_HierarchyControl Response .................................................................................... 313
Table 153 — TPM2_SetPrimaryPolicy Command .................................................................................... 317
Table 154 — TPM2_SetPrimaryPolicy Response .................................................................................... 317
Table 155 — TPM2_ChangePPS Command ........................................................................................... 321
Family “2.0”                                            TCG Published                                                        Page xi
Level 00 Revision 01.16                        Copyright © TCG 2006-2014                                       October 30, 2014
Part 3: Commands                                                                                Trusted Platform Module Library

Table 156 — TPM2_ChangePPS Response ............................................................................................ 321
Table 157 — TPM2_ChangeEPS Command ........................................................................................... 324
Table 158 — TPM2_ChangeEPS Response ............................................................................................ 324
Table 159 — TPM2_Clear Command ....................................................................................................... 327
Table 160 — TPM2_Clear Response ....................................................................................................... 327
Table 161 — TPM2_ClearControl Command ........................................................................................... 331
Table 162 — TPM2_ClearControl Response ........................................................................................... 331
Table 163 — TPM2_HierarchyChangeAuth Command ............................................................................ 334
Table 164 — TPM2_HierarchyChangeAuth Response ............................................................................ 334
Table 165 — TPM2_DictionaryAttackLockReset Command .................................................................... 337
Table 166 — TPM2_DictionaryAttackLockReset Response .................................................................... 337
Table 167 — TPM2_DictionaryAttackParameters Command .................................................................. 340
Table 168 — TPM2_DictionaryAttackParameters Response ................................................................... 340
Table 169 — TPM2_PP_Commands Command ...................................................................................... 343
Table 170 — TPM2_PP_Commands Response ...................................................................................... 343
Table 171 — TPM2_SetAlgorithmSet Command ..................................................................................... 346
Table 172 — TPM2_SetAlgorithmSet Response...................................................................................... 346
Table 173 — TPM2_FieldUpgradeStart Command .................................................................................. 351
Table 174 — TPM2_FieldUpgradeStart Response .................................................................................. 351
Table 175 — TPM2_FieldUpgradeData Command .................................................................................. 354
Table 176 — TPM2_FieldUpgradeData Response .................................................................................. 354
Table 177 — TPM2_FirmwareRead Command........................................................................................ 357
Table 178 — TPM2_FirmwareRead Response ........................................................................................ 357
Table 179 — TPM2_ContextSave Command........................................................................................... 360
Table 180 — TPM2_ContextSave Response ........................................................................................... 360
Table 181 — TPM2_ContextLoad Command ........................................................................................... 365
Table 182 — TPM2_ContextLoad Response ........................................................................................... 365
Table 183 — TPM2_FlushContext Command .......................................................................................... 370
Table 184 — TPM2_FlushContext Response .......................................................................................... 370
Table 185 — TPM2_EvictControl Command ............................................................................................ 374
Table 186 — TPM2_EvictControl Response ............................................................................................ 374
Table 187 — TPM2_ReadClock Command.............................................................................................. 378
Table 188 — TPM2_ReadClock Response .............................................................................................. 378
Table 189 — TPM2_ClockSet Command ................................................................................................. 381
Table 190 — TPM2_ClockSet Response ................................................................................................. 381
Table 191 — TPM2_ClockRateAdjust Command..................................................................................... 384
Table 192 — TPM2_ClockRateAdjust Response ..................................................................................... 384
Table 193 — TPM2_GetCapability Command.......................................................................................... 390
Table 194 — TPM2_GetCapability Response .......................................................................................... 390
Page xii                                                  TCG Published                                                  Family “2.0”
October 30, 2014                                Copyright © TCG 2006-2014                               Level 00 Revision 01.16
Trusted Platform Module Library                                                                               Part 3: Commands

Table 195 — TPM2_TestParms Command .............................................................................................. 395
Table 196 — TPM2_TestParms Response .............................................................................................. 395
Table 197 — TPM2_NV_DefineSpace Command ................................................................................... 401
Table 198 — TPM2_NV_DefineSpace Response .................................................................................... 401
Table 199 — TPM2_NV_UndefineSpace Command ............................................................................... 406
Table 200 — TPM2_NV_UndefineSpace Response ................................................................................ 406
Table 201 — TPM2_NV_UndefineSpaceSpecial Command .................................................................... 409
Table 202 — TPM2_NV_UndefineSpaceSpecial Response .................................................................... 409
Table 203 — TPM2_NV_ReadPublic Command ...................................................................................... 412
Table 204 — TPM2_NV_ReadPublic Response ...................................................................................... 412
Table 205 — TPM2_NV_Write Command ................................................................................................ 415
Table 206 — TPM2_NV_Write Response ................................................................................................ 415
Table 207 — TPM2_NV_Increment Command ........................................................................................ 419
Table 208 — TPM2_NV_Increment Response......................................................................................... 419
Table 209 — TPM2_NV_Extend Command ............................................................................................. 423
Table 210 — TPM2_NV_Extend Response ............................................................................................. 423
Table 211 — TPM2_NV_SetBits Command ............................................................................................. 427
Table 212 — TPM2_NV_SetBits Response ............................................................................................. 427
Table 213 — TPM2_NV_WriteLock Command ........................................................................................ 431
Table 214 — TPM2_NV_WriteLock Response......................................................................................... 431
Table 215 — TPM2_NV_GlobalWriteLock Command .............................................................................. 435
Table 216 — TPM2_NV_GlobalWriteLock Response .............................................................................. 435
Table 217 — TPM2_NV_Read Command................................................................................................ 438
Table 218 — TPM2_NV_Read Response ................................................................................................ 438
Table 219 — TPM2_NV_ReadLock Command ........................................................................................ 441
Table 220 — TPM2_NV_ReadLock Response ........................................................................................ 441
Table 221 — TPM2_NV_ChangeAuth Command .................................................................................... 445
Table 222 — TPM2_NV_ChangeAuth Response .................................................................................... 445
Table 223 — TPM2_NV_Certify Command .............................................................................................. 448
Table 224 — TPM2_NV_Certify Response .............................................................................................. 448




Family “2.0”                                            TCG Published                                                      Page xiii
Level 00 Revision 01.16                        Copyright © TCG 2006-2014                                      October 30, 2014
Trusted Platform Module Library                                                       Part 3: Commands


                              Trusted Platform Module Library
                                     Part 3: Commands

1     Scope

This TPM 2.0 Part 3 of the Trusted Platform Module Library specification contains the definitions of the
TPM commands. These commands make use of the constants, flags, structures, and union definitions
defined in TPM 2.0 Part 2.
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 TPM 2.0 Part 3 is normative but does not fully describe the
behavior of a TPM. The combination of this TPM 2.0 Part 3 and TPM 2.0 Part 4 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 TPM
2.0 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 TPM 2.0 Part 1 apply.


3     Symbols and abbreviated terms

For the purposes of this document, the symbols and abbreviated terms given in TPM 2.0 Part 1 apply.


4     Notation

4.1 Introduction

For the purposes of this document, the notation given in TPM 2.0 Part 1 applies.
Command and response tables use 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”                                TCG Published                                       Page 1
Level 00 Revision 01.16             Copyright © TCG 2006-2014                         October 30, 2014
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 TPM 2.0 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       {NV F}
               EXAMPLE 2       TPM2_SequenceComplete() will flush the context associated with the sequenceHandle.

     {E}       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       {NV E}
               EXAMPLE 2       TPM2_Clear() will flush all contexts associated with the Storage hierarchy and the
                               Endorsement hierarchy.

 Auth Index:   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                                           TCG Published                                                Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                            Level 00 Revision 01.16
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 handle is
                TPM_RH_OWNER, TPM_RH_ENDORSEMENT, or TPM_RH_PLATFORM, operation is as if
                userWithAuth is SET. 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 TPM 2.0 Part 2,
                "TPMA_NV (NV Index 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 handle is TPM_RH_OWNER,
                TPM_RH_ENDORSEMENT, or TPM_RH_PLATFORM, operation is as if adminWithPolicy is SET.
                If the handle is an NV index, operation is as if adminWithPolicy is SET (see 5.6 e)2)).
                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().




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 authorization is required to use the TPM entity associated with a handle, then at least one session
will be present. To indicate this, the command tag Description field contains TPM_ST_SESSIONS.
Addional sessions for audit, encrypt, and decrypt may be present.
When the command tag Description field contains TPM_ST_NO_SESSIONS, then no sessions are
allowed and the authorizationSize field is not present.
When a command allows use of sessions when not required, the command tag Description field will
indicate the types of sessions that may be used with the command.


Family “2.0”                                     TCG Published                                                      Page 3
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                                     October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library


5     Command Processing

5.1     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.

5.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 direc tly from that memory.

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

5.3     Mode Checks

The following mode checks shall be performed in the order listed:
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 processing 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.

Page 4                                        TCG Published                                         Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                                      Part 3: Commands

The mode checks may be performed before or after the command header validation.

5.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.

NOTE 1             A TPM is required to perform the handle area validation before the authorization checks because an
                   authorization cannot be performed unless the authorization values and attributes for the referenc ed
                   entity are known by the TPM. For them to be known, the referenced entity must be in the TPM and
                   accessible.

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 2              The TPM may unmarshal a handle and validate that it references an entity on the TPM before
                        unmarshaling a subsequent handle.

    NOTE 3              If the submitted command contains fewer handles than re quired 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 flushed
                            so this check will fail.

    2) If the handle references a persistent object, then
         i)    the hierarchy associated with the object (platform or storage, based on the handle value) is
               enabled (TPM_RC_HANDLE);
         ii)   the handle shall reference a persistent object that is currently in TPM non-volatile memory
               (TPM_RC_HANDLE);
         iii) if the handle references a persistent object that is associated with the endorsement hierarchy,
              that the endorsement hierarchy is not disabled (TPM_RC_HANDLE); and

               NOTE 4           The reference implementation keeps an internal attribute, passed down from a primary
                                key to its descendents, indicating the object's hierarchy.

         iv) if the TPM implementation moves a persistent object to RAM for command processing then
             sufficient RAM space is available (TPM_RC_OBJECT_MEMORY).
    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) If the command requires write access to the index data then TPMA_NV_WRITELOCKED is
              not SET (TPM_RC_LOCKED)
         iv) If the command requires read access to the index data then TPMA_NV_READLOCKED is
             not SET (TPM_RC_LOCKED)
    4) If the handle references a session, then the session context shall be present in TPM memory
       (TPM_RC_REFERENCE_S0 + N).



Family “2.0”                                       TCG Published                                                  Page 5
Level 00 Revision 01.16                   Copyright © TCG 2006-2014                                  October 30, 2014
Part 3: Commands                                                                Trusted Platform Module Library

      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 5           In the reference implementation, this TPM_RC_VALUE is returned by the unmarshaling
                           code for a TPMI_DH_PCR.


5.5      Session Area Validation

a) If the tag is TPM_ST_SESSIONS and the command requires TPM_ST_NO_SESSIONS, the TPM will
   return TPM_RC_AUTH_CONTEXT.
b) If the tag is TPM_ST_NO_SESSIONS and the command requires TPM_ST_SESSIONS, the TPM will
   return TPM_RC_AUTH_MISSING.
c) 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.

d) 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.
      4) The consistency of the authorization session attributes is checked.
          i)   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.

Page 6                                            TCG Published                                      Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                                    Part 3: Commands

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

          ii)   If a session is not being used for authorization, at least one of decrypt, encrypt, or audit must
                be SET. (TPM_RC_ATTRIBUTES).


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



5.6      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                   of   the     object   shall   be     present      on     the   TPM
   (TPM_RC_AUTH_UNAVAILABLE).
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               session   when   the    policy   contains
                        TPM2_PolicyAuthValue() or TPM2_PolicyPassword().

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, or a hierarchy,
         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 require use of ADMIN role authorization
                             are commands that operate on objects and NV Indices.

f)    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).

          NOTE 5             There is no check for a hierarchy, because a hierarchy operates as if userWithAuth is SET.

      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);

Family “2.0”                                       TCG Published                                                   Page 7
Level 00 Revision 01.16                    Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library

               (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          has     been    set,   the   session   shall     not   have     expired
         (TPM_RC_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       shall    match    the   authPolicy   associated     with   the   handle
         (TPM_RC_POLICY_FAIL);
      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
h) 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 6            A policy session may require proof of knowledge of the authValue of the object being
                           authorized.

i)    if the authorization uses a password, then the password matches the authValue associated with the
      handle (TPM_RC_AUTH_FAIL or TPM_RC_BAD_AUTH).
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             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.


5.7      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.
Otherwise, the TPM will decrypt the parameter using the values associated with the session before
parsing parameters.

5.8      Parameter Unmarshaling

5.8.1    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.


Page 8                                            TCG Published                                      Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                             Part 3: Commands

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 TPM 2.0 Part 2.

5.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”                                  TCG Published                                             Page 9
Level 00 Revision 01.16               Copyright © TCG 2006-2014                            October 30, 2014
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 TPM 2.0 Part 2 definition of the parameter type even if that parameter is not used in the command
actions.

5.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.
If authorization HMAC computations are performed on the response, the HMAC keys used in the
response will be the same as the HMAC keys used in processing the HMAC in the command.




Page 10                                       TCG Published                                         Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                              Part 3: Commands

NOTE 1         This primarily affects authorizations associated with a first write to an NV Index using a bound
               session. The computation of the HMAC in the response is performed as if the Name of the Index did
               not change as a consequence of the command actions. The session binding to the NV Index will not
               persist to any subsequent command.

NOTE 2         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 3         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”                                  TCG Published                                             Page 11
Level 00 Revision 01.16              Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                          Trusted Platform Module Library



6     Response Values

6.1    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.

6.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 values 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                                     TCG Published                                    Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                  Level 00 Revision 01.16
Trusted Platform Module Library                                                                 Part 3: Commands

                        Table 4 — Command-Independent Response Codes
Response Code                Meaning

                             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
TPM_RC_CANCELED              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.
                             This response code can be returned for commands that manage session
                             contexts. It indicates that the gap between the lowest numbered active session
TPM_RC_CONTEXT_GAP           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.
                             This response indicates that authorizations for objects subject to DA protection
TPM_RC_LOCKOUT               are not allowed at this time because the TPM is in DA lockout mode. The remedy
                             is to wait or to exeucte TPM2_DictionaryAttackLockoutReset().
                             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
TPM_RC_MEMORY                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.
                             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
TPM_RC_NV_RATE               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.
                             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
TPM_RC_NV_UNAVAILABLE
                             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.
                             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
TPM_RC_OBJECT_HANDLES
                             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.
                             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
TPM_RC_OBJECT_MEMORY
                             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.
                             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 . Upper values are
TPM_RC_REFERENCE_Hx          provided for future use. The TPM resource manager needs to find the correct
                             object and load it. It may then adjust the handle and retry the command.
                             NOTE       Usually, this error indicates that the TPM resource manager has a corrupted
                                        database.




Family “2.0”                               TCG Published                                                    Page 13
Level 00 Revision 01.16             Copyright © TCG 2006-2014                                  October 30, 2014
Part 3: Commands                                                                Trusted Platform Module Library


Response Code                 Meaning

                              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 . Upper
TPM_RC_REFERENCE_Sx           values are provided for future use. 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().
                              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()).
TPM_RC_SESSION_MEMORY
                              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.
                              Normal completion for any command. If the responseCode is
                              TPM_RC_SUCCESS, then the rest of the response has the format indicated in
TPM_RC_SUCCESS
                              the response schematic. Otherwise, the response is a 10 octet value indicating
                              an error.
                              This response code indicates that the TPM is performing tests and cannot
TPM_RC_TESTING
                              respond to the request at this time. The command may be retried.
                              the TPM has suspended operation on the command; forward progress was made
                              and the command may be retried.
TPM_RC_YIELDED
                              See TPM 2.0 Part 1, “Multi-tasking.”
                              NOTE        This cannot occur on the reference implementation.




Page 14                                      TCG Published                                           Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                          Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands



7   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”                                TCG Published                                        Page 15
Level 00 Revision 01.16              Copyright © TCG 2006-2014                         October 30, 2014
Part 3: Commands                                                                Trusted Platform Module Library



8     Detailed Actions Assumptions

8.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.

8.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 command parameters. If
          the response has handles or parameters, the calling stack contains a pointer to a data structure
          (out) to hold the handles and response 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 TPM 2.0 Part 2.
         Space set aside for the out structure is sufficient to hold the largest out structure that could be
          produced by the command

8.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                                         TCG Published                                        Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                               Part 3: Commands



9     Start-up

9.1      Introduction

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

9.2      _TPM_Init

9.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”                                   TCG Published                                             Page 17
Level 00 Revision 01.16                Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                                 Trusted Platform Module Library


     9.2.2   Detailed Actions

     This function is used to process a _TPM_Init() indication.

 1   #include "InternalRoutines.h"
 2   LIB_EXPORT void
 3   _TPM_Init(
 4       void
 5       )
 6   {
 7       // Clear the failure mode flags
 8       g_inFailureMode = FALSE;
 9       g_forceFailureMode = FALSE;
10
11       // Initialize the NvEnvironment.
12       g_nvOk = NvPowerOn();
13
14       // Initialize crypto engine
15       CryptInitUnits();
16
17       // Start clock
18       TimePowerOn();
19
20       // Set initialization state
21       TPMInit();
22
23       // Initialize object table
24       ObjectStartup();
25
26       // Set g_DRTMHandle as unassigned
27       g_DRTMHandle = TPM_RH_UNASSIGNED;
28
29       // No H-CRTM, yet.
30       g_DrtmPreStartup = FALSE;
31
32       return;
33   }




     Page 18                                      TCG Published                         Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014        Level 00 Revision 01.16
Trusted Platform Module Library                                                                  Part 3: Commands



9.3       TPM2_Startup

9.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 9.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 t hese 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 platform-specific specification may restrict the localities at which TPM2_Startup() may be received.
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 defa ult 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”                                    TCG Published                                              Page 19
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                                October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


      platformAuth and platformPolicy shall be set to the Empty Buffer,
      For each NV index with TPMA_NV_WRITE_DEFINE CLEAR or TPMA_NV_WRITTEN CLEAR,
       TPMA_NV_WRITELOCKED shall be CLEAR,
      For each NV index with TPMA_NV_CLEAR_STCLEAR SET, TPMA_NV_WRITTEN shall be
       CLEAR,
      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
       platform-specific specification and the H-CRTM state (for exceptions, see TPM 2.0 Part 1, H-
       CRTM before TPM2_Startup() and TPM2_Startup without H-CRTM)

   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 TPM 2.0 Part 1 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,
      For each NV index with TPMA_NV_WRITE_DEFINE CLEAR or TPMA_NV_WRITTEN CLEAR,
       TPMA_NV_WRITELOCKED shall be CLEAR,
      For each NV index with TPMA_NV_CLEAR_STCLEAR SET, TPMA_NV_WRITTEN shall be
       CLEAR, and
      PCR in all banks are reset to their default initial conditions.
      If an H-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
       platform-specific specification. For constraints, see TPM 2.0 Part 1, H-CRTM before
       TPM2_Startup() and TPM2_Startup without H-CRTM.
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.



Page 20                                        TCG Published                                           Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                         Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands

NOTE 6         The TPM will require     TPM_SU_CLEAR      when   no   shutdown   was   performed   or   after
               Shutdown(CLEAR).

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




Family “2.0”                               TCG Published                                           Page 21
Level 00 Revision 01.16            Copyright © TCG 2006-2014                           October 30, 2014
Part 3: Commands                                                Trusted Platform Module Library


9.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 6
UINT32                   responseSize
TPM_RC                   responseCode




Page 22                                 TCG Published                             Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
     Trusted Platform Module Library                                                             Part 3: Commands



     9.3.3   Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Startup_fp.h"
3    #ifdef TPM_CC_Startup // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_LOCALITY                   a Startup(STATE) does not have the same H-CRTM state as the
                                       previous Startup() or the locality of the startup is not 0 pr 3
     TPM_RC_NV_UNINITIALIZED           the saved state cannot be recovered and a Startup(CLEAR) is
                                       requried.
     TPM_RC_VALUE                      start up type is not compatible with previous shutdown sequence

 4   TPM_RC
 5   TPM2_Startup(
 6       Startup_In        *in                 // IN: input parameter list
 7       )
 8   {
 9       STARTUP_TYPE            startup;
10       TPM_RC                  result;
11       BOOL                    prevDrtmPreStartup;
12       BOOL                    prevStartupLoc3;
13       BYTE                    locality = _plat__LocalityGet();
14
15       // In the PC Client specification, only locality 0 and 3 are allowed
16       if(locality != 0 && locality != 3)
17           return TPM_RC_LOCALITY;
18       // Indicate that the locality was 3 unless there was an H-CRTM
19       if(g_DrtmPreStartup)
20           locality = 0;
21       g_StartupLocality3 = (locality == 3);
22
23       // The command needs NV update. Check if NV is available.
24       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
25       // this point
26       result = NvIsAvailable();
27       if(result != TPM_RC_SUCCESS)
28           return result;
29
30   // Input Validation
31
32       // Read orderly shutdown states from previous power cycle
33       NvReadReserved(NV_ORDERLY, &g_prevOrderlyState);
34
35       // See if the orderly state indicates that state was saved
36       if(     (g_prevOrderlyState & ~(PRE_STARTUP_FLAG | STARTUP_LOCALITY_3))
37           == TPM_SU_STATE)
38       {
39           // If so, extrat the saved flags (HACK)
40           prevDrtmPreStartup = (g_prevOrderlyState & PRE_STARTUP_FLAG) != 0;
41           prevStartupLoc3 = (g_prevOrderlyState & STARTUP_LOCALITY_3) != 0;
42           g_prevOrderlyState = TPM_SU_STATE;
43       }
44       else
45       {
46           prevDrtmPreStartup = 0;
47           prevStartupLoc3 = 0;
48       }
49       // if this startup is a TPM Resume, then the H-CRTM states have to match.
50       if(in->startupType == TPM_SU_STATE)

     Family “2.0”                                  TCG Published                                         Page 23
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
      Part 3: Commands                                               Trusted Platform Module Library

 51      {
 52             if(g_DrtmPreStartup != prevDrtmPreStartup)
 53                 return TPM_RC_VALUE + RC_Startup_startupType;
 54             if(g_StartupLocality3 != prevStartupLoc3)
 55                 return TPM_RC_LOCALITY;
 56      }
 57
 58      // if the previous power cycle was shut down with no StateSave command, or
 59      // with StateSave command for CLEAR, or the part of NV used for TPM_SU_STATE
 60      // cannot be recovered, then this cycle can not startup up with STATE
 61      if(in->startupType == TPM_SU_STATE)
 62      {
 63          if(     g_prevOrderlyState == SHUTDOWN_NONE
 64             ||   g_prevOrderlyState == TPM_SU_CLEAR)
 65              return TPM_RC_VALUE + RC_Startup_startupType;
 66
 67             if(g_nvOk == FALSE)
 68                 return TPM_RC_NV_UNINITIALIZED;
 69      }
 70
 71   // Internal Date Update
 72
 73      // Translate the TPM2_ShutDown and TPM2_Startup sequence into the startup
 74      // types. Will only be a SU_RESTART if the NV is OK
 75      if(     in->startupType == TPM_SU_CLEAR
 76          && g_prevOrderlyState == TPM_SU_STATE
 77          && g_nvOk == TRUE)
 78      {
 79          startup = SU_RESTART;
 80          // Read state reset data
 81          NvReadReserved(NV_STATE_RESET, &gr);
 82      }
 83      // In this check, we don't need to look at g_nvOk because that was checked
 84      // above
 85      else if(in->startupType == TPM_SU_STATE && g_prevOrderlyState == TPM_SU_STATE)
 86      {
 87          // Read state clear and state reset data
 88          NvReadReserved(NV_STATE_CLEAR, &gc);
 89          NvReadReserved(NV_STATE_RESET, &gr);
 90          startup = SU_RESUME;
 91      }
 92      else
 93      {
 94          startup = SU_RESET;
 95      }
 96
 97      // Read persistent data from NV
 98      NvReadPersistent();
 99
100      // Crypto Startup
101      CryptUtilStartup(startup);
102
103      // Read the platform unique value that is used as VENDOR_PERMANENT auth value
104      g_platformUniqueDetails.t.size = (UINT16)_plat__GetUnique(1,
105                                         sizeof(g_platformUniqueDetails.t.buffer),
106                                         g_platformUniqueDetails.t.buffer);
107
108      // Start up subsystems
109      // Start counters and timers
110      TimeStartup(startup);
111
112      // Start dictionary attack subsystem
113      DAStartup(startup);
114
115      // Enable hierarchies
116      HierarchyStartup(startup);

      Page 24                                  TCG Published                             Family “2.0”
      October 30, 2014                  Copyright © TCG 2006-2014          Level 00 Revision 01.16
      Trusted Platform Module Library                                              Part 3: Commands

117
118       // Restore/Initialize PCR
119       PCRStartup(startup, locality);
120
121       // Restore/Initialize command audit information
122       CommandAuditStartup(startup);
123
124       // Object context variables
125       if(startup == SU_RESET)
126       {
127           // Reset object context ID to 0
128           gr.objectContextID = 0;
129           // Reset clearCount to 0
130           gr.clearCount= 0;
131       }
132
133       // Initialize session table
134       SessionStartup(startup);
135
136       // Initialize index/evict data.   This function clear read/write locks
137       // in NV index
138       NvEntityStartup(startup);
139
140       // Initialize the orderly shut down flag for this cycle to SHUTDOWN_NONE.
141       gp.orderlyState = SHUTDOWN_NONE;
142       NvWriteReserved(NV_ORDERLY, &gp.orderlyState);
143
144       // Update TPM internal states if command succeeded.
145       // Record a TPM2_Startup command has been received.
146       TPMRegisterStartup();
147
148       // The H-CRTM state no longer matters
149       g_DrtmPreStartup = FALSE;
150
151       return TPM_RC_SUCCESS;
152
153   }
154   #endif // CC_Startup




      Family “2.0”                              TCG Published                              Page 25
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                  October 30, 2014
Part 3: Commands                                                       Trusted Platform Module Library


9.4       TPM2_Shutdown

9.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 26                                       TCG Published                               Family “2.0”
October 30, 2014                         Copyright © TCG 2006-2014           Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands



9.4.2    Command and Response

                                  Table 7 — TPM2_Shutdown Command
Type                          Name                  Description

                                                    TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG           tag
                                                    otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                    Page 27
Level 00 Revision 01.16              Copyright © TCG 2006-2014                      October 30, 2014
     Part 3: Commands                                                          Trusted Platform Module Library



     9.4.3   Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Shutdown_fp.h"
3    #ifdef TPM_CC_Shutdown // Conditional expansion of this file


     Error Returns                   Meaning

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

 4   TPM_RC
 5   TPM2_Shutdown(
 6       Shutdown_In       *in               // IN: input parameter list
 7       )
 8   {
 9       TPM_RC            result;
10
11       // The command needs NV update. Check if NV is available.
12       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
13       // this point
14       result = NvIsAvailable();
15       if(result != TPM_RC_SUCCESS) return result;
16
17   // Input Validation
18
19       // If PCR bank has been reconfigured, a CLEAR state save is required
20       if(g_pcrReConfig && in->shutdownType == TPM_SU_STATE)
21           return TPM_RC_TYPE + RC_Shutdown_shutdownType;
22
23   // Internal Data Update
24
25       // PCR private date state save
26       PCRStateSave(in->shutdownType);
27
28       // Get DRBG state
29       CryptDrbgGetPutState(GET_STATE);
30
31       // Save all orderly data
32       NvWriteReserved(NV_ORDERLY_DATA, &go);
33
34       // Save RAM backed NV index data
35       NvStateSave();
36
37       if(in->shutdownType == TPM_SU_STATE)
38       {
39           // Save STATE_RESET and STATE_CLEAR data
40           NvWriteReserved(NV_STATE_CLEAR, &gc);
41           NvWriteReserved(NV_STATE_RESET, &gr);
42       }
43       else if(in->shutdownType == TPM_SU_CLEAR)
44       {
45           // Save STATE_RESET data
46           NvWriteReserved(NV_STATE_RESET, &gr);
47       }
48
49       // Write orderly shut down state
50       if(in->shutdownType == TPM_SU_CLEAR)
51           gp.orderlyState = TPM_SU_CLEAR;
52       else if(in->shutdownType == TPM_SU_STATE)
53       {
54           gp.orderlyState = TPM_SU_STATE;
55           // Hack for the H-CRTM and Startup locality settings

     Page 28                                     TCG Published                                    Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                               Part 3: Commands

56             if(g_DrtmPreStartup)
57                 gp.orderlyState |= PRE_STARTUP_FLAG;
58             else if(g_StartupLocality3)
59                 gp.orderlyState |= STARTUP_LOCALITY_3;
60       }
61       else
62           pAssert(FALSE);
63
64       NvWriteReserved(NV_ORDERLY, &gp.orderlyState);
65
66       //   If PRE_STARTUP_FLAG was SET, then it will stay set in gp.orderlyState even
67       //   if the TPM isn't actually shut down. This is OK because all other checks
68       //   of gp.orderlyState are to see if it is SHUTDOWN_NONE. So, having
69       //   gp.orderlyState set to another value that is also not SHUTDOWN_NONE, is not
70       //   an issue. This must be the case, otherwise, it would be impossible to add
71       //   an additional shutdown type without major changes to the code.
72
73       return TPM_RC_SUCCESS;
74   }
75   #endif // CC_Shutdown




     Family “2.0”                             TCG Published                                 Page 29
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                   October 30, 2014
Part 3: Commands                                                            Trusted Platform Module Library


10     Testing

10.1    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 that
                 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 30                                       TCG Published                                     Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                                   Part 3: Commands



10.2     TPM2_SelfTest

10.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 th e “background” processing is complete. This
                would be in addition to the interrupt that 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”                                    TCG Published                                                Page 31
Level 00 Revision 01.16                Copyright © TCG 2006-2014                                  October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library


10.2.2 Command and Response

                         Table 9 — TPM2_SelfTest Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG    tag
                                             otherwise, TPM_ST_NO_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_SelfTest {NV}

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


                        Table 10 — TPM2_SelfTest Response
Type                   Name                  Description

TPM_ST                 tag                   see clause 6
UINT32                 responseSize
TPM_RC                 responseCode




Page 32                               TCG Published                                      Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                        Part 3: Commands



     10.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "SelfTest_fp.h"
3    #ifdef TPM_CC_SelfTest // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_CANCELED                   the command was canceled (some incremental process may have
                                       been made)
     TPM_RC_TESTING                    self test in process

 4   TPM_RC
 5   TPM2_SelfTest(
 6       SelfTest_In      *in                   // IN: input parameter list
 7       )
 8   {
 9   // Command Output
10
11       // Call self test function in crypt module
12       return CryptSelfTest(in->fullTest);
13   }
14   #endif // CC_SelfTest




     Family “2.0”                                   TCG Published                                    Page 33
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                       October 30, 2014
Part 3: Commands                                                                    Trusted Platform Module Library


10.3     TPM2_IncrementalSelfTest

10.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.

                 The implementation may treat algorithms on the toTest list as either 'test each completely' or 'test
                 this combination.'

EXAMPLE          If the toTest list includes AES and CTR mode, it may be interpreted as a request to test only AES in
                 CTR mode. Alternatively, it may be interpreted as a request to test AES in all modes and CTR mode
                 for all symmetric algorithms.


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.

NOTE 3           An algorithm remains on the toDoList while any part of it remains untested.

EXAMPLE          A symmetric algorithm remains untested until it is tested with all its modes.

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 4           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 5           If none of the algorithms listed in toTest is in the toDoList, then no tests will be performed.

NOTE 6           The TPM cannot return TPM_RC_TESTING for this command, even when testing is not complete,
                 because response parameters can only returned with the TPM_RC_SUCCESS return code.

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

NOTE 7           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 34                                           TCG Published                                            Family “2.0”
October 30, 2014                         Copyright © TCG 2006-2014                          Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



10.3.2 Command and Response

                          Table 11 — TPM2_IncrementalSelfTest Command
Type                          Name                  Description

                                                    TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG           tag
                                                    otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                        responseSize
TPM_RC                        responseCode

TPML_ALG                      toDoList              list of algorithms that need testing




Family “2.0”                                 TCG Published                                         Page 35
Level 00 Revision 01.16             Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     10.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "IncrementalSelfTest_fp.h"
3    #ifdef TPM_CC_IncrementalSelfTest // Conditional expansion of this file


     Error Returns                 Meaning

     TPM_RC_CANCELED               the command was canceled (some tests may have completed)
     TPM_RC_VALUE                  an algorithm in the toTest list is not implemented

 4   TPM_RC
 5   TPM2_IncrementalSelfTest(
 6       IncrementalSelfTest_In        *in,                // IN: input parameter list
 7       IncrementalSelfTest_Out       *out                // OUT: output parameter list
 8       )
 9   {
10       TPM_RC                         result;
11   // Command Output
12
13       // Call incremental self test function in crypt module. If this function
14       // returns TPM_RC_VALUE, it means that an algorithm on the 'toTest' list is
15       // not implemented.
16       result = CryptIncrementalSelfTest(&in->toTest, &out->toDoList);
17       if(result == TPM_RC_VALUE)
18           return TPM_RCS_VALUE + RC_IncrementalSelfTest_toTest;
19       return result;
20   }
21   #endif // CC_IncrementalSelfTest




     Page 36                                    TCG Published                                      Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands


10.4   TPM2_GetTestResult

10.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.
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”                               TCG Published                                       Page 37
Level 00 Revision 01.16             Copyright © TCG 2006-2014                        October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



10.4.2 Command and Response

                       Table 13 — TPM2_GetTestResult Command
 Type                   Name                  Description

                                              TPM_ST_SESSIONS if an audit session is present;
 TPMI_ST_COMMAND_TAG    tag
                                              otherwise, TPM_ST_NO_SESSIONS
 UINT32                 commandSize
 TPM_CC                 commandCode           TPM_CC_GetTestResult


                       Table 14 — TPM2_GetTestResult Response
 Type                   Name                  Description

 TPMI_ST_COMMAND_TAG    tag                   see clause 6
 UINT32                 responseSize
 TPM_RC                 responseCode

                                              test result data
 TPM2B_MAX_BUFFER       outData
                                              contains manufacturer-specific information
 TPM_RC                 testResult




Page 38                                TCG Published                                       Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                                         Part 3: Commands



     10.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "GetTestResult_fp.h"
3    #ifdef TPM_CC_GetTestResult // Conditional expansion of this file

     In the reference implementation, this function is only reachable if the TPM is not in failure mode meaning
     that all tests that have been run have completed successfully. There is not test data and the test result is
     TPM_RC_SUCCESS.

 4   TPM_RC
 5   TPM2_GetTestResult(
 6       GetTestResult_Out      *out               // OUT: output parameter list
 7       )
 8   {
 9   // Command Output
10
11       // Call incremental self test function in crypt module
12       out->testResult = CryptGetTestResult(&out->outData);
13
14       return TPM_RC_SUCCESS;
15   }
16   #endif // CC_GetTestResult




     Family “2.0”                                 TCG Published                                        Page 39
     Level 00 Revision 01.16              Copyright © TCG 2006-2014                          October 30, 2014
Part 3: Commands                                                                    Trusted Platform Module Library


11     Session Commands

11.1     TPM2_StartAuthSession

11.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 TPM 2.0 Part 1) 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 of 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 th e 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                 a   free    slot   for   an   authorization     session,     it   shall   return
TPM_RC_SESSION_HANDLES.
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 TPM 2.0 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_HANDLE if the sensitive portion of tpmKey is not
loaded. 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 encoded OAEP value, or
     4) the decrypted salt value is larger than the size of the digest produced by the nameAlg of tpmKey;
        or


Page 40                                          TCG Published                                             Family “2.0”
October 30, 2014                         Copyright © TCG 2006-2014                         Level 00 Revision 01.16
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.
If bind references a transient object, then the TPM shall return TPM_RC_HANDLE if the sensitive portion
of the object is not loaded.
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 command in order to re-
                 establish the orderly state of the TPM. This is because the created cont ext 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”                                    TCG Published                                              Page 41
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                      Trusted Platform Module Library



11.1.2 Command and Response

                       Table 15 — TPM2_StartAuthSession Command
Type                      Name                  Description

                                                TPM_ST_SESSIONS if an audit, decrypt, or encrypt
TPMI_ST_COMMAND_TAG       tag                   session is present; otherwise,
                                                TPM_ST_NO_SESSIONS
UINT32                    commandSize
TPM_CC                    commandCode           TPM_CC_StartAuthSession

                                                handle of a loaded decrypt key used to encrypt salt
TPMI_DH_OBJECT+           tpmKey                may be TPM_RH_NULL
                                                Auth Index: None
                                                entity providing the authValue
TPMI_DH_ENTITY+           bind                  may be TPM_RH_NULL
                                                Auth Index: None

                                                initial nonceCaller, sets nonce size for the session
TPM2B_NONCE               nonceCaller
                                                shall be at least 16 octets
                                                value encrypted according to the type of tpmKey
TPM2B_ENCRYPTED_SECRET encryptedSalt            If tpmKey is TPM_RH_NULL, this shall be the Empty
                                                Buffer.
                                                indicates the type of the session; simple HMAC or policy
TPM_SE                    sessionType
                                                (including a trial policy)
                                                the algorithm and key size for parameter encryption
TPMT_SYM_DEF+             symmetric
                                                may select TPM_ALG_NULL
                                                hash algorithm to use for the session
TPMI_ALG_HASH             authHash              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 6
UINT32                    responseSize
TPM_RC                    responseCode

TPMI_SH_AUTH_SESSION      sessionHandle         handle for the newly created session

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




Page 42                                  TCG Published                                      Family “2.0”
October 30, 2014                 Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                Part 3: Commands



     11.1.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "StartAuthSession_fp.h"
3    #ifdef TPM_CC_StartAuthSession // Conditional expansion of this file


     Error Returns                     Meaning

     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                      secret size does not match decrypt key type; or the recovered secret
                                       is larger 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.

 4   TPM_RC
 5   TPM2_StartAuthSession(
 6       StartAuthSession_In       *in,                   // IN: input parameter buffer
 7       StartAuthSession_Out      *out                   // OUT: output parameter buffer
 8       )
 9   {
10       TPM_RC                     result = TPM_RC_SUCCESS;
11       OBJECT                    *tpmKey;                // TPM key for decrypt salt
12       SESSION                   *session;               // session internal data
13       TPM2B_DATA                 salt;
14
15   // Input Validation
16
17       // Check input nonce size. IT should be at least 16 bytes but not larger
18       // than the digest size of session hash.
19       if(    in->nonceCaller.t.size < 16
20           || in->nonceCaller.t.size > CryptGetHashDigestSize(in->authHash))
21           return TPM_RC_SIZE + RC_StartAuthSession_nonceCaller;
22
23       // If an decrypt key is passed in, check its validation
24       if(in->tpmKey != TPM_RH_NULL)
25       {
26           // secret size cannot be 0
27           if(in->encryptedSalt.t.size == 0)
28               return TPM_RC_VALUE + RC_StartAuthSession_encryptedSalt;
29
30           // Get pointer to loaded decrypt key
31           tpmKey = ObjectGet(in->tpmKey);
32
33           // Decrypting salt requires accessing the private portion of a key.
34           // Therefore, tmpKey can not be a key with only public portion loaded
35           if(tpmKey->attributes.publicOnly)
36               return TPM_RC_HANDLE + RC_StartAuthSession_tpmKey;
37
38           // HMAC session input handle check.

     Family “2.0”                                   TCG Published                                             Page 43
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library

39             // tpmKey should be a decryption key
40             if(tpmKey->publicArea.objectAttributes.decrypt != SET)
41                 return TPM_RC_ATTRIBUTES + RC_StartAuthSession_tpmKey;
42
43             // Secret Decryption. A TPM_RC_VALUE, TPM_RC_KEY or Unmarshal errors
44             // may be returned at this point
45             result = CryptSecretDecrypt(in->tpmKey, &in->nonceCaller, "SECRET",
46                                         &in->encryptedSalt, &salt);
47             if(result != TPM_RC_SUCCESS)
48                 return TPM_RC_VALUE + RC_StartAuthSession_encryptedSalt;
49
50      }
51      else
52      {
53          // secret size must be 0
54          if(in->encryptedSalt.t.size != 0)
55              return TPM_RC_VALUE + RC_StartAuthSession_encryptedSalt;
56          salt.t.size = 0;
57      }
58      // If the bind handle references a transient object, make sure that the
59      // sensitive area is loaded so that the authValue can be accessed.
60      if(     HandleGetType(in->bind) == TPM_HT_TRANSIENT
61          && ObjectGet(in->bind)->attributes.publicOnly == SET)
62          return TPM_RC_HANDLE + RC_StartAuthSession_bind;
63
64      // If 'symmetric' is a symmetric block cipher (not TPM_ALG_NULL or TPM_ALG_XOR)
65      // then the mode must be CFB.
66      if(    in->symmetric.algorithm != TPM_ALG_NULL
67          && in->symmetric.algorithm != TPM_ALG_XOR
68          && in->symmetric.mode.sym != TPM_ALG_CFB)
69          return TPM_RC_MODE + RC_StartAuthSession_symmetric;
70
71   // Internal Data Update
72
73      // Create internal session structure. TPM_RC_CONTEXT_GAP, TPM_RC_NO_HANDLES
74      // or TPM_RC_SESSION_MEMORY errors may be returned returned at this point.
75      //
76      // The detailed actions for creating the session context are not shown here
77      // as the details are implementation dependent
78      // SessionCreate sets the output handle
79      result = SessionCreate(in->sessionType, in->authHash,
80                             &in->nonceCaller, &in->symmetric,
81                             in->bind, &salt, &out->sessionHandle);
82
83      if(result != TPM_RC_SUCCESS)
84          return result;
85
86   // Command Output
87
88      // Get session pointer
89      session = SessionGet(out->sessionHandle);
90
91      // Copy nonceTPM
92      out->nonceTPM = session->nonceTPM;
93
94       return TPM_RC_SUCCESS;
95   }
96   #endif // CC_StartAuthSession




     Page 44                                  TCG Published                              Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014            Level 00 Revision 01.16
Trusted Platform Module Library                                                     Part 3: Commands


11.2   TPM2_PolicyRestart

11.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”                                TCG Published                                     Page 45
Level 00 Revision 01.16              Copyright © TCG 2006-2014                      October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library



11.2.2 Command and Response

                      Table 17 — TPM2_PolicyRestart Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG    tag
                                             otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                 responseSize
TPM_RC                 responseCode




Page 46                               TCG Published                                 Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                          Part 3: Commands



     11.2.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PolicyRestart_fp.h"
 3   #ifdef TPM_CC_PolicyRestart // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_PolicyRestart(
 6       PolicyRestart_In      *in              // IN: input parameter list
 7       )
 8   {
 9       SESSION                     *session;
10       BOOL                         wasTrialSession;
11
12   // Internal Data Update
13
14       session = SessionGet(in->sessionHandle);
15       wasTrialSession = session->attributes.isTrialPolicy == SET;
16
17       // Initialize policy session
18       SessionResetPolicyData(session);
19
20       session->attributes.isTrialPolicy = wasTrialSession;
21
22       return TPM_RC_SUCCESS;
23   }
24   #endif // CC_PolicyRestart




     Family “2.0”                               TCG Published                         Page 47
     Level 00 Revision 01.16             Copyright © TCG 2006-2014            October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


12     Object Commands

12.1    TPM2_Create

12.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 TPM 2.0 Part 1 and
“TPMA_OBJECT” in TPM 2.0 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.userAuth), 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 TPM 2.0 Part 2.
The inSensitive 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 TPM 2.0 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.sensitive.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.sensitive.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 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 inSensitive.sensitive.data is not the Empty Buffer, then the TPM shall return TPM_RC_VALUE.



Page 48                                        TCG Published                                       Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                     Level 00 Revision 01.16
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.seedValue value is created;
       otherwise, TPMT_SENSITIVE.seedValue.size is set to zero.

         NOTE 1       An Object that is not a storage key has no child Objects to encrypt, so it does not need a
                      symmetric key.

    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 2            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.sensitive.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.sensitive.data is not an Empty Buffer, the TPM will                                  copy    the
       inSensitive.sensitive.data to TPMT_SENSITIVE.sensitive,bits of the new object.

         NOTE 3            The size of inSensitive.sensitive.data is limited to be no larger than the largest value of
                           TPMT_SENSITIVE.sensitive.bits by MAX_SYM_DATA.

    3) If inSensitive.sensitive.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.bits.
    4) A TPM-generated obfuscation value that is the size of the digest produced by the nameAlg of
       inPublic is placed in TPMT_SENSITIVE.seedValue.
    5) The TPMT_PUBLIC.unique.keyedHash 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 4            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 and parameters 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.


Family “2.0”                                     TCG Published                                                 Page 49
Level 00 Revision 01.16                  Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                           Trusted Platform Module Library

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.




Page 50                                    TCG Published                                        Family “2.0”
October 30, 2014                   Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands


12.1.2 Command and Response

                                  Table 19 — TPM2_Create Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Create

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

TPM2B_SENSITIVE_CREATE        inSensitive           the sensitive data
TPM2B_PUBLIC                  inPublic              the public template
                                                    data that will be included in the creation data for this
TPM2B_DATA                    outsideInfo           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 6
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
                                                    ticket used by TPM2_CertifyCreation() to validate that
TPMT_TK_CREATION              creationTicket
                                                    the creation data was produced by the TPM




Family “2.0”                                 TCG Published                                         Page 51
Level 00 Revision 01.16             Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     12.1.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Object_spt_fp.h"
3    #include "Create_fp.h"
4    #ifdef TPM_CC_Create // Conditional expansion of this file


     Error Returns               Meaning

     TPM_RC_ASYMMETRIC           non-duplicable storage key and its parent have different public
                                 parameters
     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                the exponent value of an RSA key 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        there is no free slot for the object. This implementation does not
                                 return this error.

 5   TPM_RC
 6   TPM2_Create(
 7       Create_In        *in,            // IN: input parameter list
 8       Create_Out       *out            // OUT: output parameter list
 9       )
10   {
11       TPM_RC                  result = TPM_RC_SUCCESS;
12       TPMT_SENSITIVE          sensitive;
13       TPM2B_NAME              name;
14

     Page 52                                  TCG Published                                             Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands

15   // Input Validation
16
17       OBJECT       *parentObject;
18
19       parentObject = ObjectGet(in->parentHandle);
20
21       // Does parent have the proper attributes?
22       if(!AreAttributesForParent(parentObject))
23           return TPM_RC_TYPE + RC_Create_parentHandle;
24
25       // The sensitiveDataOrigin attribute must be consistent with the setting of
26       // the size of the data object in inSensitive.
27       if(   (in->inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin == SET)
28          != (in->inSensitive.t.sensitive.data.t.size == 0))
29           // Mismatch between the object attributes and the parameter.
30           return TPM_RC_ATTRIBUTES + RC_Create_inSensitive;
31
32       // Check attributes in input public area. TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES,
33       // TPM_RC_HASH, TPM_RC_KDF, TPM_RC_SCHEME, TPM_RC_SIZE, TPM_RC_SYMMETRIC,
34       // or TPM_RC_TYPE error may be returned at this point.
35       result = PublicAttributesValidation(FALSE, in->parentHandle,
36                                           &in->inPublic.t.publicArea);
37       if(result != TPM_RC_SUCCESS)
38           return RcSafeAddToResult(result, RC_Create_inPublic);
39
40       // Validate the sensitive area values
41       if( MemoryRemoveTrailingZeros(&in->inSensitive.t.sensitive.userAuth)
42               > CryptGetHashDigestSize(in->inPublic.t.publicArea.nameAlg))
43           return TPM_RC_SIZE + RC_Create_inSensitive;
44
45   // Command Output
46
47       // Create object crypto data
48       result = CryptCreateObject(in->parentHandle, &in->inPublic.t.publicArea,
49                                  &in->inSensitive.t.sensitive, &sensitive);
50       if(result != TPM_RC_SUCCESS)
51           return result;
52
53       // Fill in creation data
54       FillInCreationData(in->parentHandle, in->inPublic.t.publicArea.nameAlg,
55                          &in->creationPCR, &in->outsideInfo,
56                          &out->creationData, &out->creationHash);
57
58       // Copy public area from input to output
59       out->outPublic.t.publicArea = in->inPublic.t.publicArea;
60
61       // Compute name from public area
62       ObjectComputeName(&(out->outPublic.t.publicArea), &name);
63
64       // Compute creation ticket
65       TicketComputeCreation(EntityGetHierarchy(in->parentHandle), &name,
66                             &out->creationHash, &out->creationTicket);
67
68       // Prepare output private data from sensitive
69       SensitiveToPrivate(&sensitive, &name, in->parentHandle,
70                          out->outPublic.t.publicArea.nameAlg,
71                          &out->outPrivate);
72
73       return TPM_RC_SUCCESS;
74   }
75   #endif // CC_Create




     Family “2.0”                           TCG Published                                   Page 53
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
Part 3: Commands                                                                    Trusted Platform Module Library


12.2     TPM2_Load

12.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 TPM 2.0 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 on 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) o r
                  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 priv ate 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.




Page 54                                           TCG Published                                         Family “2.0”
October 30, 2014                          Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands


12.2.2 Command and Response

                                    Table 21 — TPM2_Load Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Load

                                                    TPM handle of parent key; shall not be a reserved
                                                    handle
TPMI_DH_OBJECT                @parentHandle
                                                    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 6
UINT32                        responseSize
TPM_RC                        responseCode

                                                    handle of type TPM_HT_TRANSIENT for the loaded
TPM_HANDLE                    objectHandle
                                                    object

TPM2B_NAME                    name                  Name of the loaded object




Family “2.0”                                 TCG Published                                        Page 55
Level 00 Revision 01.16              Copyright © TCG 2006-2014                          October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     12.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Load_fp.h"
3    #ifdef TPM_CC_Load // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns               Meaning

     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                decryption failure

 5   TPM_RC
 6   TPM2_Load(
 7       Load_In         *in,             // IN: input parameter list
 8       Load_Out        *out             // OUT: output parameter list
 9       )
10   {
11       TPM_RC                  result = TPM_RC_SUCCESS;
12       TPMT_SENSITIVE          sensitive;
13       TPMI_RH_HIERARCHY       hierarchy;
14       OBJECT                 *parentObject = NULL;
15       BOOL                    skipChecks = FALSE;
16
17   // Input Validation
18       if(in->inPrivate.t.size == 0)
19           return TPM_RC_SIZE + RC_Load_inPrivate;
20
21       parentObject = ObjectGet(in->parentHandle);
22       // Is the object that is being used as the parent actually a parent.
23       if(!AreAttributesForParent(parentObject))
24           return TPM_RC_TYPE + RC_Load_parentHandle;
25
26       // If the parent is fixedTPM, then the attributes of the object
27       // are either "correct by construction" or were validated
28       // when the object was imported. If they pass the integrity
29       // check, then the values are valid
30       if(parentObject->publicArea.objectAttributes.fixedTPM)
31           skipChecks = TRUE;
32       else

     Page 56                                  TCG Published                                             Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

33       {
34           // If parent doesn't have fixedTPM SET, then this can't have
35           // fixedTPM SET.
36           if(in->inPublic.t.publicArea.objectAttributes.fixedTPM == SET)
37               return TPM_RC_ATTRIBUTES + RC_Load_inPublic;
38
39           // Perform self check on input public area. A TPM_RC_SIZE, TPM_RC_SCHEME,
40           // TPM_RC_VALUE, TPM_RC_SYMMETRIC, TPM_RC_TYPE, TPM_RC_HASH,
41           // TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES or TPM_RC_KDF error may be returned
42           // at this point
43           result = PublicAttributesValidation(TRUE, in->parentHandle,
44                                               &in->inPublic.t.publicArea);
45           if(result != TPM_RC_SUCCESS)
46               return RcSafeAddToResult(result, RC_Load_inPublic);
47       }
48
49       // Compute the name of object
50       ObjectComputeName(&in->inPublic.t.publicArea, &out->name);
51
52       // Retrieve sensitive data. PrivateToSensitive() may return TPM_RC_INTEGRITY or
53       // TPM_RC_SENSITIVE
54       // errors may be returned at this point
55       result = PrivateToSensitive(&in->inPrivate, &out->name, in->parentHandle,
56                                   in->inPublic.t.publicArea.nameAlg,
57                                   &sensitive);
58       if(result != TPM_RC_SUCCESS)
59           return RcSafeAddToResult(result, RC_Load_inPrivate);
60
61   // Internal Data Update
62
63       // Get hierarchy of parent
64       hierarchy = ObjectGetHierarchy(in->parentHandle);
65
66       // Create internal object. A lot of different errors may be returned by this
67       // loading operation as it will do several validations, including the public
68       // binding check
69       result = ObjectLoad(hierarchy, &in->inPublic.t.publicArea, &sensitive,
70                           &out->name, in->parentHandle, skipChecks,
71                           &out->objectHandle);
72
73       if(result != TPM_RC_SUCCESS)
74           return result;
75
76       return TPM_RC_SUCCESS;
77   }
78   #endif // CC_Load




     Family “2.0”                            TCG Published                                 Page 57
     Level 00 Revision 01.16            Copyright © TCG 2006-2014                October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


12.3     TPM2_LoadExternal

12.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 TPM 2.0 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.




Page 58                                         TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                         Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands

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.




Family “2.0”                                 TCG Published                                           Page 59
Level 00 Revision 01.16              Copyright © TCG 2006-2014                            October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



12.3.2 Command and Response

                      Table 23 — TPM2_LoadExternal Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit, encrypt, or derypt
TPMI_ST_COMMAND_TAG    tag                   session is present; otherwise,
                                             TPM_ST_NO_SESSIONS
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 6
UINT32                 responseSize
TPM_RC                 responseCode

                                             handle of type TPM_HT_TRANSIENT for the loaded
TPM_HANDLE             objectHandle
                                             object

TPM2B_NAME             name                  name of the loaded object




Page 60                               TCG Published                                       Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                   Part 3: Commands



     12.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "LoadExternal_fp.h"
3    #ifdef TPM_CC_LoadExternal // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns                     Meaning

     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                       inPublic and inPrivate are not the same type

 5   TPM_RC
 6   TPM2_LoadExternal(
 7       LoadExternal_In       *in,                   // IN: input parameter list
 8       LoadExternal_Out      *out                   // OUT: output parameter list
 9       )
10   {
11       TPM_RC                 result;
12       TPMT_SENSITIVE        *sensitive;
13       BOOL                   skipChecks;
14
15   // Input Validation
16
17       // If the target hierarchy is turned off, the object can not be loaded.
18       if(!HierarchyIsEnabled(in->hierarchy))
19           return TPM_RC_HIERARCHY + RC_LoadExternal_hierarchy;
20
21       // the size of authPolicy is either 0 or the digest size of nameAlg
22       if(in->inPublic.t.publicArea.authPolicy.t.size != 0
23               && in->inPublic.t.publicArea.authPolicy.t.size !=
24               CryptGetHashDigestSize(in->inPublic.t.publicArea.nameAlg))
25           return TPM_RC_SIZE + RC_LoadExternal_inPublic;
26
27       // For loading an object with both public and sensitive
28       if(in->inPrivate.t.size != 0)
29       {
30           // An external object can only be loaded at TPM_RH_NULL hierarchy
31           if(in->hierarchy != TPM_RH_NULL)
32               return TPM_RC_HIERARCHY + RC_LoadExternal_hierarchy;
33           // An external object with a sensitive area must have fixedTPM == CLEAR
34           // fixedParent == CLEAR, and must have restrict CLEAR so that it does not
35           // appear to be a key that was created by this TPM.

     Family “2.0”                                    TCG Published                                                  Page 61
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                                  October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library

36             if(   in->inPublic.t.publicArea.objectAttributes.fixedTPM != CLEAR
37                || in->inPublic.t.publicArea.objectAttributes.fixedParent != CLEAR
38                || in->inPublic.t.publicArea.objectAttributes.restricted != CLEAR
39               )
40                 return TPM_RC_ATTRIBUTES + RC_LoadExternal_inPublic;
41       }
42
43       // Validate the scheme parameters
44       result = SchemeChecks(TRUE, TPM_RH_NULL, &in->inPublic.t.publicArea);
45       if(result != TPM_RC_SUCCESS)
46               return RcSafeAddToResult(result, RC_LoadExternal_inPublic);
47
48   // Internal Data Update
49       // Need the name to compute the qualified name
50       ObjectComputeName(&in->inPublic.t.publicArea, &out->name);
51       skipChecks = (in->inPublic.t.publicArea.nameAlg == TPM_ALG_NULL);
52
53       // If a sensitive area was provided, load it
54       if(in->inPrivate.t.size != 0)
55           sensitive = &in->inPrivate.t.sensitiveArea;
56       else
57           sensitive = NULL;
58
59       // Create external object. A TPM_RC_BINDING, TPM_RC_KEY, TPM_RC_OBJECT_MEMORY
60       // or TPM_RC_TYPE error may be returned by ObjectLoad()
61       result = ObjectLoad(in->hierarchy, &in->inPublic.t.publicArea,
62                           sensitive, &out->name, TPM_RH_NULL, skipChecks,
63                           &out->objectHandle);
64       return result;
65   }
66   #endif // CC_LoadExternal




     Page 62                                  TCG Published                              Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


12.4   TPM2_ReadPublic

12.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.




Family “2.0”                                   TCG Published                                              Page 63
Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library



12.4.2 Command and Response

                      Table 25 — TPM2_ReadPublic Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG    tag
                                             present; otherwise, TPM_ST_NO_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_ReadPublic

                                             TPM handle of an object
TPMI_DH_OBJECT         objectHandle
                                             Auth Index: None


                      Table 26 — TPM2_ReadPublic Response
Type                   Name                  Description

TPM_ST                 tag                   see clause 6
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




Page 64                               TCG Published                                      Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                                       Part 3: Commands



     12.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ReadPublic_fp.h"
3    #ifdef TPM_CC_ReadPublic // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_SEQUENCE                   can not read the public area of a sequence object

 4   TPM_RC
 5   TPM2_ReadPublic(
 6       ReadPublic_In     *in,                // IN: input parameter list
 7       ReadPublic_Out    *out                // OUT: output parameter list
 8       )
 9   {
10       OBJECT                    *object;
11
12   // Input Validation
13
14       // Get loaded object pointer
15       object = ObjectGet(in->objectHandle);
16
17       // Can not read public area of a sequence object
18       if(ObjectIsSequence(object))
19           return TPM_RC_SEQUENCE;
20
21   // Command Output
22
23       // Compute size of public area in canonical form
24       out->outPublic.t.size = TPMT_PUBLIC_Marshal(&object->publicArea, NULL, NULL);
25
26       // Copy public area to output
27       out->outPublic.t.publicArea = object->publicArea;
28
29       // Copy name to output
30       out->name.t.size = ObjectGetName(in->objectHandle, &out->name.t.name);
31
32       // Copy qualified name to output
33       ObjectGetQualifiedName(in->objectHandle, &out->qualifiedName);
34
35       return TPM_RC_SUCCESS;
36   }
37   #endif // CC_ReadPublic




     Family “2.0”                                  TCG Published                                   Page 65
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                       October 30, 2014
Part 3: Commands                                                           Trusted Platform Module Library


12.5   TPM2_ActivateCredential

12.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 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.




Page 66                                      TCG Published                                   Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



12.5.2 Command and Response

                          Table 27 — TPM2_ActivateCredential Command
Type                              Name               Description

TPMI_ST_COMMAND_TAG               tag                TPM_ST_SESSIONS
UINT32                            commandSize
TPM_CC                            commandCode        TPM_CC_ActivateCredential

                                                     handle of the object associated with certificate in
                                                     credentialBlob
TPMI_DH_OBJECT                    @activateHandle
                                                     Auth Index: 1
                                                     Auth Role: ADMIN
                                                     loaded key used to decrypt the TPMS_SENSITIVE in
                                                     credentialBlob
TPMI_DH_OBJECT                    @keyHandle
                                                     Auth Index: 2
                                                     Auth Role: USER

TPM2B_ID_OBJECT                   credentialBlob     the credential
                                                     keyHandle algorithm-dependent encrypted seed that
TPM2B_ENCRYPTED_SECRET            secret
                                                     protects credentialBlob


                          Table 28 — TPM2_ActivateCredential Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

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




Family “2.0”                                 TCG Published                                            Page 67
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                          October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     12.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ActivateCredential_fp.h"
3    #ifdef TPM_CC_ActivateCredential // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns                Meaning

     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                 secret is invalid (when keyHandle is an RSA key)

 5   TPM_RC
 6   TPM2_ActivateCredential(
 7       ActivateCredential_In    *in,                 // IN: input parameter list
 8       ActivateCredential_Out   *out                 // OUT: output parameter list
 9       )
10   {
11       TPM_RC                        result = TPM_RC_SUCCESS;
12       OBJECT                       *object;        // decrypt key
13       OBJECT                       *activateObject;// key associated with
14       // credential
15       TPM2B_DATA                      data;              // credential data
16
17   // Input Validation
18
19       // Get decrypt key pointer
20       object = ObjectGet(in->keyHandle);
21
22       // Get certificated object pointer
23       activateObject = ObjectGet(in->activateHandle);
24
25       // input decrypt key must be an asymmetric, restricted decryption key
26       if(   !CryptIsAsymAlgorithm(object->publicArea.type)
27          || object->publicArea.objectAttributes.decrypt == CLEAR
28          || object->publicArea.objectAttributes.restricted == CLEAR)
29           return TPM_RC_TYPE + RC_ActivateCredential_keyHandle;
30
31   // Command output
32
33       // Decrypt input credential data via asymmetric decryption. A
34       // TPM_RC_VALUE, TPM_RC_KEY or unmarshal errors may be returned at this
35       // point
36       result = CryptSecretDecrypt(in->keyHandle, NULL,
37                                   "IDENTITY", &in->secret, &data);
38       if(result != TPM_RC_SUCCESS)
39       {
40           if(result == TPM_RC_KEY)
41               return TPM_RC_FAILURE;
42           return RcSafeAddToResult(result, RC_ActivateCredential_secret);
43       }

     Page 68                                     TCG Published                                      Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                     Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

44
45       // Retrieve secret data. A TPM_RC_INTEGRITY error or unmarshal
46       // errors may be returned at this point
47       result = CredentialToSecret(&in->credentialBlob,
48                                   &activateObject->name,
49                                   (TPM2B_SEED *) &data,
50                                   in->keyHandle,
51                                   &out->certInfo);
52       if(result != TPM_RC_SUCCESS)
53           return RcSafeAddToResult(result,RC_ActivateCredential_credentialBlob);
54
55       return TPM_RC_SUCCESS;
56   }
57   #endif // CC_ActivateCredential




     Family “2.0”                           TCG Published                                Page 69
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                         Trusted Platform Module Library


12.6   TPM2_MakeCredential

12.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 TPM
2.0 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.




Page 70                                    TCG Published                                    Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                  Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands



12.6.2 Command and Response

                           Table 29 — TPM2_MakeCredential Command
Type                          Name                  Description

                                                    TPM_ST_SESSIONS if an audit, encrypt, or decrypt
TPMI_ST_COMMAND_TAG           tag                   session is present; otherwise,
                                                    TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_MakeCredential

                                                    loaded public area, used to encrypt the sensitive area
TPMI_DH_OBJECT                handle                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 6
UINT32                        responseSize
TPM_RC                        responseCode

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




Family “2.0”                                 TCG Published                                         Page 71
Level 00 Revision 01.16             Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                              Trusted Platform Module Library



     12.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "MakeCredential_fp.h"
3    #ifdef TPM_CC_MakeCredential // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns                   Meaning

     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                     handle does not reference an asymmetric decryption key

 5   TPM_RC
 6   TPM2_MakeCredential(
 7       MakeCredential_In    *in,                 // IN: input parameter list
 8       MakeCredential_Out   *out                 // OUT: output parameter list
 9       )
10   {
11       TPM_RC                    result = TPM_RC_SUCCESS;
12
13       OBJECT                    *object;
14       TPM2B_DATA                data;
15
16   // Input Validation
17
18       // Get object pointer
19       object = ObjectGet(in->handle);
20
21       // input key must be an asymmetric, restricted decryption key
22       // NOTE: Needs to be restricted to have a symmetric value.
23       if(   !CryptIsAsymAlgorithm(object->publicArea.type)
24          || object->publicArea.objectAttributes.decrypt == CLEAR
25          || object->publicArea.objectAttributes.restricted == CLEAR
26         )
27           return TPM_RC_TYPE + RC_MakeCredential_handle;
28
29       // The credential information may not be larger than the digest size used for
30       // the Name of the key associated with handle.
31       if(in->credential.t.size > CryptGetHashDigestSize(object->publicArea.nameAlg))
32           return TPM_RC_SIZE + RC_MakeCredential_credential;
33
34   // Command Output
35
36       // Make encrypt key and its associated secret structure.
37       // Even though CrypeSecretEncrypt() may return
38       out->secret.t.size = sizeof(out->secret.t.secret);
39       result = CryptSecretEncrypt(in->handle, "IDENTITY", &data, &out->secret);
40       if(result != TPM_RC_SUCCESS)
41           return result;
42
43       // Prepare output credential data from secret
44       SecretToCredential(&in->credential, &in->objectName, (TPM2B_SEED *) &data,
45                          in->handle, &out->credentialBlob);
46
47       return TPM_RC_SUCCESS;
48   }
49   #endif // CC_MakeCredential




     Page 72                                      TCG Published                                           Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands


12.7   TPM2_Unseal

12.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.

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.




Family “2.0”                                TCG Published                                        Page 73
Level 00 Revision 01.16             Copyright © TCG 2006-2014                          October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library



12.7.2 Command and Response

                        Table 31 — TPM2_Unseal Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_Unseal

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


                         Table 32 — TPM2_Unseal Response
Type                   Name                  Description

TPM_ST                 tag                   see clause 6
UINT32                 responseSize
TPM_RC                 responseCode

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




Page 74                               TCG Published                                     Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                               Part 3: Commands



     12.7.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Unseal_fp.h"
3    #ifdef TPM_CC_Unseal // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_ATTRIBUTES                 itemHandle has wrong attributes
     TPM_RC_TYPE                       itemHandle is not a KEYEDHASH data object

 4   TPM_RC
 5   TPM2_Unseal(
 6       Unseal_In         *in,
 7       Unseal_Out        *out
 8       )
 9   {
10       OBJECT                    *object;
11
12   // Input Validation
13
14       // Get pointer to loaded object
15       object = ObjectGet(in->itemHandle);
16
17       // Input handle must be a data object
18       if(object->publicArea.type != TPM_ALG_KEYEDHASH)
19           return TPM_RC_TYPE + RC_Unseal_itemHandle;
20       if(   object->publicArea.objectAttributes.decrypt == SET
21          || object->publicArea.objectAttributes.sign == SET
22          || object->publicArea.objectAttributes.restricted == SET)
23           return TPM_RC_ATTRIBUTES + RC_Unseal_itemHandle;
24
25   // Command Output
26
27       // Copy data
28       MemoryCopy2B(&out->outData.b, &object->sensitive.sensitive.bits.b,
29                    sizeof(out->outData.t.buffer));
30
31       return TPM_RC_SUCCESS;
32   }
33   #endif // CC_Unseal




     Family “2.0”                                  TCG Published                           Page 75
     Level 00 Revision 01.16               Copyright © TCG 2006-2014               October 30, 2014
Part 3: Commands                                                                Trusted Platform Module Library


12.8     TPM2_ObjectChangeAuth

12.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()).




Page 76                                       TCG Published                                              Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands


12.8.2 Command and Response

                          Table 33 — TPM2_ObjectChangeAuth Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_ObjectChangeAuth

                                                    handle of the object
TPMI_DH_OBJECT                @objectHandle         Auth Index: 1
                                                    Auth Role: ADMIN
                                                    handle of the parent
TPMI_DH_OBJECT                parentHandle
                                                    Auth Index: None

TPM2B_AUTH                    newAuth               new authorization value


                          Table 34 — TPM2_ObjectChangeAuth Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_PRIVATE                 outPrivate            private area containing the new authorization value




Family “2.0”                                 TCG Published                                         Page 77
Level 00 Revision 01.16             Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                          Trusted Platform Module Library



     12.8.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ObjectChangeAuth_fp.h"
3    #ifdef TPM_CC_ObjectChangeAuth // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns               Meaning

     TPM_RC_SIZE                 newAuth is larger than the size of the digest of the Name algorithm of
                                 objectHandle
     TPM_RC_TYPE                 the key referenced by parentHandle is not the parent of the object
                                 referenced by objectHandle; or objectHandle is a sequence object.

 5   TPM_RC
 6   TPM2_ObjectChangeAuth(
 7       ObjectChangeAuth_In    *in,                // IN: input parameter list
 8       ObjectChangeAuth_Out   *out                // OUT: output parameter list
 9       )
10   {
11       TPMT_SENSITIVE          sensitive;
12
13       OBJECT                 *object;
14       TPM2B_NAME              objectQN, QNCompare;
15       TPM2B_NAME              parentQN;
16
17   // Input Validation
18
19       // Get object pointer
20       object = ObjectGet(in->objectHandle);
21
22       // Can not change auth on sequence object
23       if(ObjectIsSequence(object))
24           return TPM_RC_TYPE + RC_ObjectChangeAuth_objectHandle;
25
26       // Make sure that the auth value is consistent with the nameAlg
27       if( MemoryRemoveTrailingZeros(&in->newAuth)
28               > CryptGetHashDigestSize(object->publicArea.nameAlg))
29           return TPM_RC_SIZE + RC_ObjectChangeAuth_newAuth;
30
31       // Check parent for object
32       // parent handle must be the parent of object handle. In this
33       // implementation we verify this by checking the QN of object. Other
34       // implementation may choose different method to verify this attribute.
35       ObjectGetQualifiedName(in->parentHandle, &parentQN);
36       ObjectComputeQualifiedName(&parentQN, object->publicArea.nameAlg,
37                                  &object->name, &QNCompare);
38
39       ObjectGetQualifiedName(in->objectHandle, &objectQN);
40       if(!Memory2BEqual(&objectQN.b, &QNCompare.b))
41           return TPM_RC_TYPE + RC_ObjectChangeAuth_parentHandle;
42
43   // Command Output
44
45       // Copy internal sensitive area
46       sensitive = object->sensitive;
47       // Copy authValue
48       sensitive.authValue = in->newAuth;
49
50       // Prepare output private data from sensitive
51       SensitiveToPrivate(&sensitive, &object->name, in->parentHandle,
52                          object->publicArea.nameAlg,

     Page 78                                  TCG Published                                           Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                     Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

53                           &out->outPrivate);
54
55       return TPM_RC_SUCCESS;
56   }
57   #endif // CC_ObjectChangeAuth




     Family “2.0”                            TCG Published                 Page 79
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                                Trusted Platform Module Library


13     Duplication Commands

13.1     TPM2_Duplicate

13.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             been     executed      as     part    of    the    policy,    the
policySession→nameHash is compared to
                       HpolicyAlg(objectHandle→Name || newParentHandle→Name)                                     (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_PolicyComman dCode(code = TPM_CC_Duplicate).

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




Page 80                                        TCG Published                                         Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands



13.1.2 Command and Response

                              Table 35 — TPM2_Duplicate Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Duplicate

                                                    loaded object to duplicate
TPMI_DH_OBJECT                @objectHandle         Auth Index: 1
                                                    Auth Role: DUP
                                                    shall reference the public area of an asymmetric key
TPMI_DH_OBJECT+               newParentHandle
                                                    Auth Index: None

                                                    optional symmetric encryption key
TPM2B_DATA                    encryptionKeyIn       The size for this key is set to zero when the TPM is to
                                                    generate the key. This parameter may be encrypted.
                                                    definition for the symmetric algorithm to be used for the
TPMT_SYM_DEF_OBJECT+          symmetricAlg          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 6
UINT32                        responseSize
TPM_RC                        responseCode

                                                    If the caller provided an encryption key or if
                                                    symmetricAlg was TPM_ALG_NULL, then this will be
TPM2B_DATA                    encryptionKeyOut      the Empty Buffer; otherwise, it shall contain the TPM-
                                                    generated, symmetric encryption key for the inner
                                                    wrapper.
                                                    private area that may be encrypted by encryptionKeyIn;
TPM2B_PRIVATE                 duplicate
                                                    and may be doubly encrypted
                                                    seed protected by the asymmetric algorithms of new
TPM2B_ENCRYPTED_SECRET outSymSeed
                                                    parent (NP)




Family “2.0”                                 TCG Published                                          Page 81
Level 00 Revision 01.16             Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     13.1.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Duplicate_fp.h"
3    #ifdef TPM_CC_Duplicate // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns                Meaning

     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                  newParentHandle is neither a storage key nor TPM_RH_NULL; or
                                  the object has a NULL nameAlg

 5   TPM_RC
 6   TPM2_Duplicate(
 7       Duplicate_In      *in,            // IN: input parameter list
 8       Duplicate_Out     *out            // OUT: output parameter list
 9       )
10   {
11       TPM_RC                   result = TPM_RC_SUCCESS;
12       TPMT_SENSITIVE           sensitive;
13
14       UINT16                   innerKeySize = 0; // encrypt key size for inner wrap
15
16       OBJECT                   *object;
17       TPM2B_DATA               data;
18
19   // Input Validation
20
21       // Get duplicate object pointer
22       object = ObjectGet(in->objectHandle);
23
24       // duplicate key must have fixParent bit CLEAR.
25       if(object->publicArea.objectAttributes.fixedParent == SET)
26           return TPM_RC_ATTRIBUTES + RC_Duplicate_objectHandle;
27
28       // Do not duplicate object with NULL nameAlg
29       if(object->publicArea.nameAlg == TPM_ALG_NULL)
30           return TPM_RC_TYPE + RC_Duplicate_objectHandle;
31
32       // new parent key must be a storage object or TPM_RH_NULL
33       if(in->newParentHandle != TPM_RH_NULL
34               && !ObjectIsStorage(in->newParentHandle))
35           return TPM_RC_TYPE + RC_Duplicate_newParentHandle;
36
37       // If the duplicates object has encryptedDuplication SET, then there must be
38       // an inner wrapper and the new parent may not be TPM_RH_NULL
39       if(object->publicArea.objectAttributes.encryptedDuplication == SET)
40       {
41           if(in->symmetricAlg.algorithm == TPM_ALG_NULL)
42               return TPM_RC_SYMMETRIC + RC_Duplicate_symmetricAlg;
43           if(in->newParentHandle == TPM_RH_NULL)

     Page 82                                   TCG Published                                       Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014                       Level 00 Revision 01.16
     Trusted Platform Module Library                                              Part 3: Commands

44                return TPM_RC_HIERARCHY + RC_Duplicate_newParentHandle;
45       }
46
47       if(in->symmetricAlg.algorithm == TPM_ALG_NULL)
48       {
49           // if algorithm is TPM_ALG_NULL, input key size must be 0
50           if(in->encryptionKeyIn.t.size != 0)
51               return TPM_RC_SIZE + RC_Duplicate_encryptionKeyIn;
52       }
53       else
54       {
55           // Get inner wrap key size
56           innerKeySize = in->symmetricAlg.keyBits.sym;
57
58           // If provided the input symmetric key must match the size of the algorithm
59           if(in->encryptionKeyIn.t.size != 0
60                   && in->encryptionKeyIn.t.size != (innerKeySize + 7) / 8)
61               return TPM_RC_SIZE + RC_Duplicate_encryptionKeyIn;
62       }
63
64   // Command Output
65
66       if(in->newParentHandle != TPM_RH_NULL)
67       {
68
69           // Make encrypt key and its associated secret structure. A TPM_RC_KEY
70           // error may be returned at this point
71           out->outSymSeed.t.size = sizeof(out->outSymSeed.t.secret);
72           result = CryptSecretEncrypt(in->newParentHandle,
73                                       "DUPLICATE", &data, &out->outSymSeed);
74           pAssert(result != TPM_RC_VALUE);
75           if(result != TPM_RC_SUCCESS)
76               return result;
77       }
78       else
79       {
80           // Do not apply outer wrapper
81           data.t.size = 0;
82           out->outSymSeed.t.size = 0;
83       }
84
85       // Copy sensitive area
86       sensitive = object->sensitive;
87
88       // Prepare output private data from sensitive
89       SensitiveToDuplicate(&sensitive, &object->name, in->newParentHandle,
90                            object->publicArea.nameAlg, (TPM2B_SEED *) &data,
91                            &in->symmetricAlg, &in->encryptionKeyIn,
92                            &out->duplicate);
93
94       out->encryptionKeyOut = in->encryptionKeyIn;
95
96       return TPM_RC_SUCCESS;
97   }
98   #endif // CC_Duplicate




     Family “2.0”                            TCG Published                                 Page 83
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                  October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


13.2   TPM2_Rewrap

13.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 TPM 2.0 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 TPM 2.0 Part 2 encryptedDuplication.




Page 84                                    TCG Published                                   Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands



13.2.2 Command and Response

                                  Table 37 — TPM2_Rewrap Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Rewrap

                                                    parent of object
TPMI_DH_OBJECT+               @oldParent            Auth Index: 1
                                                    Auth Role: User
                                                    new parent of the object
TPMI_DH_OBJECT+               newParent
                                                    Auth Index: None

                                                    an object encrypted using symmetric key derived from
TPM2B_PRIVATE                 inDuplicate
                                                    inSymSeed
TPM2B_NAME                    name                  the Name of the object being rewrapped
                                                    seed for symmetric key
TPM2B_ENCRYPTED_SECRET inSymSeed                    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 6
UINT32                        responseSize
TPM_RC                        responseCode

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




Family “2.0”                                 TCG Published                                       Page 85
Level 00 Revision 01.16              Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     13.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Rewrap_fp.h"
3    #ifdef TPM_CC_Rewrap // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns                 Meaning

     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              errors during unmarshaling the input encrypted buffer to a ECC public
                                   key, or unmarshal the private buffer to sensitive

 5   TPM_RC
 6   TPM2_Rewrap(
 7       Rewrap_In         *in,             // IN: input parameter list
 8       Rewrap_Out        *out             // OUT: output parameter list
 9       )
10   {
11       TPM_RC                   result = TPM_RC_SUCCESS;
12       OBJECT                   *oldParent;
13       TPM2B_DATA               data;               // symmetric key
14       UINT16                   hashSize = 0;
15       TPM2B_PRIVATE            privateBlob;        // A temporary private blob
16                                                    // to transit between old
17                                                    // and new wrappers
18
19   // Input Validation
20
21       if((in->inSymSeed.t.size == 0 && in->oldParent != TPM_RH_NULL)
22               || (in->inSymSeed.t.size != 0 && in->oldParent == TPM_RH_NULL))
23           return TPM_RC_HANDLE + RC_Rewrap_oldParent;
24
25       if(in->oldParent != TPM_RH_NULL)
26       {
27           // Get old parent pointer
28           oldParent = ObjectGet(in->oldParent);
29
30             // old parent key must be a storage object
31             if(!ObjectIsStorage(in->oldParent))
32                 return TPM_RC_TYPE + RC_Rewrap_oldParent;
33
34             // Decrypt input secret data via asymmetric decryption. A
35             // TPM_RC_VALUE, TPM_RC_KEY or unmarshal errors may be returned at this
36             // point
37             result = CryptSecretDecrypt(in->oldParent, NULL,
38                                         "DUPLICATE", &in->inSymSeed, &data);
39             if(result != TPM_RC_SUCCESS)
40                 return TPM_RC_VALUE + RC_Rewrap_inSymSeed;
41

     Page 86                                    TCG Published                                           Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014                       Level 00 Revision 01.16
      Trusted Platform Module Library                                             Part 3: Commands

 42           // Unwrap Outer
 43           result = UnwrapOuter(in->oldParent, &in->name,
 44                                oldParent->publicArea.nameAlg, (TPM2B_SEED *) &data,
 45                                FALSE,
 46                                in->inDuplicate.t.size, in->inDuplicate.t.buffer);
 47           if(result != TPM_RC_SUCCESS)
 48               return RcSafeAddToResult(result, RC_Rewrap_inDuplicate);
 49
 50           // Copy unwrapped data to temporary variable, remove the integrity field
 51           hashSize = sizeof(UINT16) +
 52                      CryptGetHashDigestSize(oldParent->publicArea.nameAlg);
 53           privateBlob.t.size = in->inDuplicate.t.size - hashSize;
 54           MemoryCopy(privateBlob.t.buffer, in->inDuplicate.t.buffer + hashSize,
 55                      privateBlob.t.size, sizeof(privateBlob.t.buffer));
 56       }
 57       else
 58       {
 59           // No outer wrap from input blob.   Direct copy.
 60           privateBlob = in->inDuplicate;
 61       }
 62
 63       if(in->newParent != TPM_RH_NULL)
 64       {
 65           OBJECT          *newParent;
 66           newParent = ObjectGet(in->newParent);
 67
 68           // New parent must be a storage object
 69           if(!ObjectIsStorage(in->newParent))
 70               return TPM_RC_TYPE + RC_Rewrap_newParent;
 71
 72           // Make new encrypt key and its associated secret structure. A
 73           // TPM_RC_VALUE error may be returned at this point if RSA algorithm is
 74           // enabled in TPM
 75           out->outSymSeed.t.size = sizeof(out->outSymSeed.t.secret);
 76           result = CryptSecretEncrypt(in->newParent,
 77                                       "DUPLICATE", &data, &out->outSymSeed);
 78           if(result != TPM_RC_SUCCESS) return result;
 79
 80   // Command output
 81           // Copy temporary variable to output, reserve the space for integrity
 82           hashSize = sizeof(UINT16) +
 83                      CryptGetHashDigestSize(newParent->publicArea.nameAlg);
 84           out->outDuplicate.t.size = privateBlob.t.size;
 85           MemoryCopy(out->outDuplicate.t.buffer + hashSize, privateBlob.t.buffer,
 86                      privateBlob.t.size, sizeof(out->outDuplicate.t.buffer));
 87
 88           // Produce outer wrapper for output
 89           out->outDuplicate.t.size = ProduceOuterWrap(in->newParent, &in->name,
 90                                      newParent->publicArea.nameAlg,
 91                                      (TPM2B_SEED *) &data,
 92                                      FALSE,
 93                                      out->outDuplicate.t.size,
 94                                      out->outDuplicate.t.buffer);
 95
 96       }
 97       else // New parent is a null key so there is no seed
 98       {
 99           out->outSymSeed.t.size = 0;
100
101           // Copy privateBlob directly
102           out->outDuplicate = privateBlob;
103       }
104
105       return TPM_RC_SUCCESS;
106   }
107   #endif // CC_Rewrap

      Family “2.0”                           TCG Published                                Page 87
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                      Trusted Platform Module Library


13.3     TPM2_Import

13.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).
If encryptedDuplication is SET in objectPublic, then inSymSeed and encryptionKey shall not be Empty
buffers (TPM_RC_ATTRIBUTES). Recovery of the sensitive data of the object occurs in the TPM in a
multi--step process in the following order:
a) If inSymSeed has a non-zero size:
    1) 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.

         NOTE 1       When recovering the seed from inSymSeed, L is “DUPLICATE”.

    2) The integrity value in duplicate.buffer.integrityOuter is used to verify the integrity of the inner data
       blob, which is the remainder of duplicate.buffer (TPM_RC_INTEGRITY).

         NOTE 2            The inner data blob will contain a TPMT_SENSITIVE and may contain a TPM2B_DIGEST
                           for the innerIntegrity.

    3) The symmetric key recovered in 1) (2)is used to decrypt the inner data blob.

         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.

b) If encryptionKey is not an Empty Buffer:
    1) Use encryptionKey to decrypt the inner blob.
    2) Use the TPM2B_DIGEST at the start of the inner blob to verify the integrity of the inner blob
       (TPM_RC_INTEGRITY).
c) Unmarshal the sensitive area

NOTE 4            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 protec ted 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.

After integrity checks and decryption, the TPM will create a new symmetrically encrypted private area
using the encryption key of the parent.

Page 88                                            TCG Published                                             Family “2.0”
October 30, 2014                          Copyright © TCG 2006-2014                          Level 00 Revision 01.16
Trusted Platform Module Library                                                             Part 3: Commands

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




Family “2.0”                                 TCG Published                                             Page 89
Level 00 Revision 01.16              Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


13.3.2 Command and Response

                         Table 39 — TPM2_Import Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_Import

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

                                             the optional symmetric encryption key used as the inner
                                             wrapper for duplicate
TPM2B_DATA             encryptionKey
                                             If symmetricAlg is TPM_ALG_NULL, then this
                                             parameter shall be the Empty Buffer.
                                             the public area of the object to be imported
                                             This is provided so that the integrity value for duplicate
TPM2B_PUBLIC           objectPublic          and the object attributes can be checked.
                                             NOTE        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
TPM2B_PRIVATE          duplicate
                                             contain an inner symmetric wrapper
                                             symmetric key used to encrypt duplicate
TPM2B_ENCRYPTED_SECRET inSymSeed             inSymSeed is encrypted/encoded using the algorithms
                                             of newParent.
                                             definition for the symmetric algorithm to use for the inner
                                             wrapper
TPMT_SYM_DEF_OBJECT+   symmetricAlg
                                             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 6
UINT32                 responseSize
TPM_RC                 responseCode

                                             the sensitive area encrypted with the symmetric key of
TPM2B_PRIVATE          outPrivate
                                             parentHandle




Page 90                               TCG Published                                          Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                      Level 00 Revision 01.16
    Trusted Platform Module Library                                                                Part 3: Commands



    13.3.3 Detailed Actions

1   #include "InternalRoutines.h"
2   #include "Import_fp.h"
3   #ifdef TPM_CC_Import // Conditional expansion of this file
4   #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 parameters
    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; or encrytpedDuplication is
                                      SET in objectPublic but the inner or outer wrapper is missing.

    NOTE:           if the TPM provides parameter values, the parameter number will indicate symmetricKey (missing
                    inner wrapper) or inSymSeed (missing outer wrapper).


    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 size is not consistent with the
                                      type of 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

    Family “2.0”                                   TCG Published                                               Page 91
    Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library

                                  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

 5   TPM_RC
 6   TPM2_Import(
 7       Import_In         *in,            // IN: input parameter list
 8       Import_Out        *out            // OUT: output parameter list
 9       )
10   {
11
12       TPM_RC                   result = TPM_RC_SUCCESS;
13       OBJECT                   *parentObject;
14       TPM2B_DATA               data;                   // symmetric key
15       TPMT_SENSITIVE           sensitive;
16       TPM2B_NAME               name;
17
18       UINT16                   innerKeySize = 0;             // encrypt key size for inner
19                                                              // wrapper
20
21   // Input Validation
22
23       // FixedTPM and fixedParent must be CLEAR
24       if(   in->objectPublic.t.publicArea.objectAttributes.fixedTPM == SET
25          || in->objectPublic.t.publicArea.objectAttributes.fixedParent == SET)
26           return TPM_RC_ATTRIBUTES + RC_Import_objectPublic;
27
28       // Get parent pointer
29       parentObject = ObjectGet(in->parentHandle);
30
31       if(!AreAttributesForParent(parentObject))
32           return TPM_RC_TYPE + RC_Import_parentHandle;
33
34       if(in->symmetricAlg.algorithm != TPM_ALG_NULL)
35       {
36           // Get inner wrap key size
37           innerKeySize = in->symmetricAlg.keyBits.sym;
38           // Input symmetric key must match the size of algorithm.
39           if(in->encryptionKey.t.size != (innerKeySize + 7) / 8)
40               return TPM_RC_SIZE + RC_Import_encryptionKey;
41       }
42       else
43       {
44           // If input symmetric algorithm is NULL, input symmetric key size must
45           // be 0 as well
46           if(in->encryptionKey.t.size != 0)
47               return TPM_RCS_SIZE + RC_Import_encryptionKey;
48           // If encryptedDuplication is SET, then the object must have an inner
49           // wrapper
50           if(in->objectPublic.t.publicArea.objectAttributes.encryptedDuplication)
51               return TPM_RCS_ATTRIBUTES + RC_Import_encryptionKey;
52       }
53
54       // See if there is an outer wrapper
55       if(in->inSymSeed.t.size != 0)
56       {
57           // Decrypt input secret data via asymmetric decryption. TPM_RC_ATTRIBUTES,
58           // TPM_RC_ECC_POINT, TPM_RC_INSUFFICIENT, TPM_RC_KEY, TPM_RC_NO_RESULT,
59           // TPM_RC_SIZE, TPM_RC_VALUE may be returned at this point
60           result = CryptSecretDecrypt(in->parentHandle, NULL, "DUPLICATE",
61                                       &in->inSymSeed, &data);
62           pAssert(result != TPM_RC_BINDING);


     Page 92                                   TCG Published                                         Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014                       Level 00 Revision 01.16
      Trusted Platform Module Library                                               Part 3: Commands

 63           if(result != TPM_RC_SUCCESS)
 64               return RcSafeAddToResult(result, RC_Import_inSymSeed);
 65       }
 66       else
 67       {
 68           // If encrytpedDuplication is set, then the object must have an outer
 69           // wrapper
 70           if(in->objectPublic.t.publicArea.objectAttributes.encryptedDuplication)
 71               return TPM_RCS_ATTRIBUTES + RC_Import_inSymSeed;
 72           data.t.size = 0;
 73       }
 74
 75       // Compute name of object
 76       ObjectComputeName(&(in->objectPublic.t.publicArea), &name);
 77
 78       // Retrieve sensitive from private.
 79       // TPM_RC_INSUFFICIENT, TPM_RC_INTEGRITY, TPM_RC_SIZE may be returned here.
 80       result = DuplicateToSensitive(&in->duplicate, &name, in->parentHandle,
 81                                     in->objectPublic.t.publicArea.nameAlg,
 82                                     (TPM2B_SEED *) &data, &in->symmetricAlg,
 83                                     &in->encryptionKey, &sensitive);
 84       if(result != TPM_RC_SUCCESS)
 85           return RcSafeAddToResult(result, RC_Import_duplicate);
 86
 87       // If the parent of this object has fixedTPM SET, then fully validate this
 88       // object so that validation can be skipped when it is loaded
 89       if(parentObject->publicArea.objectAttributes.fixedTPM == SET)
 90       {
 91           TPM_HANDLE       objectHandle;
 92
 93           // Perform self check on input public area. A TPM_RC_SIZE, TPM_RC_SCHEME,
 94           // TPM_RC_VALUE, TPM_RC_SYMMETRIC, TPM_RC_TYPE, TPM_RC_HASH,
 95           // TPM_RC_ASYMMETRIC, TPM_RC_ATTRIBUTES or TPM_RC_KDF error may be returned
 96           // at this point
 97           result = PublicAttributesValidation(TRUE, in->parentHandle,
 98                                               &in->objectPublic.t.publicArea);
 99           if(result != TPM_RC_SUCCESS)
100               return RcSafeAddToResult(result, RC_Import_objectPublic);
101
102           // Create internal object. A TPM_RC_KEY_SIZE, TPM_RC_KEY or
103           // TPM_RC_OBJECT_MEMORY error may be returned at this point
104           result = ObjectLoad(TPM_RH_NULL, &in->objectPublic.t.publicArea,
105                               &sensitive, NULL, in->parentHandle, FALSE,
106                               &objectHandle);
107           if(result != TPM_RC_SUCCESS)
108               return result;
109
110           // Don't need the object, just needed the checks to be performed so
111           // flush the object
112           ObjectFlush(objectHandle);
113       }
114
115   // Command output
116
117       // Prepare output private data from sensitive
118       SensitiveToPrivate(&sensitive, &name, in->parentHandle,
119                          in->objectPublic.t.publicArea.nameAlg,
120                          &out->outPrivate);
121
122       return TPM_RC_SUCCESS;
123   }
124   #endif // CC_Import




      Family “2.0”                           TCG Published                                  Page 93
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                   October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


14     Asymmetric Primitives

14.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.

14.2    TPM2_RSA_Encrypt

14.2.1 General Description

This command performs RSA encryption using the indicated padding scheme according to IETF RFC
3447. 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 public 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 IETF RFC 3447 (PKCS#1).
   The only supported mask generation is MGF1.
2) TPM_ALG_RSAES – Data is padded as described in 7.2 of IETF RFC 3447 (PKCS#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             inScheme                          padding scheme used

                              TPM_ALG_NULL                      none
 TPM_ALG_NULL                 TPM_ALG_RSAES                     RSAES
                              TPM_ALG_OAEP                      OAEP
                              TPM_ALG_NULL                      RSAES
 TPM_ALG_RSAES                TPM_ALG_RSAES                     RSAES
                              TPM_ALG_OAEP                      error (TPM_RC_SCHEME)
                              TPM_ALG_NULL                      OAEP
 TPM_ALG_OAEP                 TPM_ALG_RSAES                     error (TPM_RC_SCHEME)
                              TPM_AGL_OAEP                      OAEP

After padding, the data is RSAEP encrypted according to 5.1.1 of IETF RFC 3447 (PKCS#1).


Page 94                                       TCG Published                                        Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                                       Part 3: Commands

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, th e 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
                                          Maximum Message Length
Scheme                                    (mLen) in Octets                     Comments

TPM_ALG_OAEP                              mLen  k – 2hLen – 2
TPM_ALG_RSAES                             mLen  k – 11
TPM_ALG_NULL                              mLen  k                             The numeric value of the message must be
                                                                               less than the numeric value of the public
                                                                               modulus (n).
NOTES
1)   k ≔ the number of byes in the public modulus
2)   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”                                         TCG Published                                                Page 95
Level 00 Revision 01.16                     Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


14.2.2 Command and Response

                       Table 43 — TPM2_RSA_Encrypt Command
Type                    Name                  Description

                                              TPM_ST_SESSIONS if an audit, encrypt, or decrypt
TPMI_ST_COMMAND_TAG     tag                   session is present; otherwise,
                                              TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode           TPM_CC_RSA_Encrypt

                                              reference to public portion of RSA key to use for
TPMI_DH_OBJECT          keyHandle             encryption
                                              Auth Index: None

                                              message to be encrypted
                                              NOTE 1     The data type was chosen because it limits the
TPM2B_PUBLIC_KEY_RSA    message                          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
TPMT_RSA_DECRYPT+       inScheme
                                              keyHandle is TPM_ALG_NULL
                                              optional label L to be associated with the message
TPM2B_DATA              label                 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 6
UINT32                  responseSize
TPM_RC                  responseCode

TPM2B_PUBLIC_KEY_RSA    outData               encrypted output




Page 96                                TCG Published                                          Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     14.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "RSA_Encrypt_fp.h"
3    #ifdef TPM_CC_RSA_Encrypt // Conditional expansion of this file
4    #ifdef TPM_ALG_RSA


     Error Returns                     Meaning

     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                      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

 5   TPM_RC
 6   TPM2_RSA_Encrypt(
 7       RSA_Encrypt_In        *in,                 // IN: input parameter list
 8       RSA_Encrypt_Out       *out                 // OUT: output parameter list
 9       )
10   {
11       TPM_RC                    result;
12       OBJECT                    *rsaKey;
13       TPMT_RSA_DECRYPT          *scheme;
14       char                      *label = NULL;
15
16   // Input Validation
17
18       rsaKey = ObjectGet(in->keyHandle);
19
20       // selected key must be an RSA key
21       if(rsaKey->publicArea.type != TPM_ALG_RSA)
22           return TPM_RC_KEY + RC_RSA_Encrypt_keyHandle;
23
24       // selected key must have the decryption attribute
25       if(rsaKey->publicArea.objectAttributes.decrypt != SET)
26           return TPM_RC_ATTRIBUTES + RC_RSA_Encrypt_keyHandle;
27
28       // Is there a label?
29       if(in->label.t.size > 0)
30       {
31           // label is present, so make sure that is it NULL-terminated
32           if(in->label.t.buffer[in->label.t.size - 1] != 0)
33               return TPM_RC_VALUE + RC_RSA_Encrypt_label;
34           label = (char *)in->label.t.buffer;
35       }
36
37   // Command Output
38
39       // Select a scheme for encryption
40       scheme = CryptSelectRSAScheme(in->keyHandle, &in->inScheme);
41       if(scheme == NULL)
42           return TPM_RC_SCHEME + RC_RSA_Encrypt_inScheme;
43
44       // Encryption. TPM_RC_VALUE, or TPM_RC_SCHEME errors my be returned buy
45       // CryptEncyptRSA. Note: It can also return TPM_RC_ATTRIBUTES if the key does
46       // not have the decrypt attribute but that was checked above.
47       out->outData.t.size = sizeof(out->outData.t.buffer);
48       result = CryptEncryptRSA(&out->outData.t.size, out->outData.t.buffer, rsaKey,

     Family “2.0”                                  TCG Published                                             Page 97
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                 October 30, 2014
     Part 3: Commands                                              Trusted Platform Module Library

49                              scheme, in->message.t.size, in->message.t.buffer,
50                              label);
51       return result;
52   }
53   #endif
54   #endif // CC_RSA_Encrypt




     Page 98                              TCG Published                              Family “2.0”
     October 30, 2014              Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands


14.3     TPM2_RSA_Decrypt

14.3.1 General Description

This command performs RSA decryption using the indicated padding scheme according to IETF RFC
3447 ((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 IETF RFC 3447 (PKCS#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 during encryption, the label parameter is required
to be present in the decryption process and label is required to be the same in both cases. If label is not
the same, the decrypt operation is very likely to fail ((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 inScheme is used, and the scheme requires a hash algorithm it may not be TPM_ALG_NULL.
If the 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”                                    TCG Published                                      Page 99
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                      October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



14.3.2 Command and Response

                       Table 45 — TPM2_RSA_Decrypt Command
Type                    Name                  Description

TPMI_ST_COMMAND_TAG     tag                   TPM_ST_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode           TPM_CC_RSA_Decrypt

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

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

                                              the padding scheme to use if scheme associated with
TPMT_RSA_DECRYPT+       inScheme
                                              keyHandle is TPM_ALG_NULL
                                              label whose association with the message is to be
TPM2B_DATA              label
                                              verified


                       Table 46 — TPM2_RSA_Decrypt Response
Type                    Name                  Description

TPM_ST                  tag                   see clause 6
UINT32                  responseSize
TPM_RC                  responseCode

TPM2B_PUBLIC_KEY_RSA    message               decrypted output




Page 100                               TCG Published                                       Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                   Part 3: Commands



     14.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "RSA_Decrypt_fp.h"
3    #ifdef TPM_CC_RSA_Decrypt // Conditional expansion of this file
4    #ifdef TPM_ALG_RSA


     Error Returns                     Meaning

     TPM_RC_BINDING                    The public an private parts of the key are not properly bound
     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                      label is not a null terminated string or the value of cipherText is
                                       greater that the modulus of keyHandle

 5   TPM_RC
 6   TPM2_RSA_Decrypt(
 7       RSA_Decrypt_In        *in,                   // IN: input parameter list
 8       RSA_Decrypt_Out       *out                   // OUT: output parameter list
 9       )
10   {
11       TPM_RC                             result;
12       OBJECT                            *rsaKey;
13       TPMT_RSA_DECRYPT                  *scheme;
14       char                              *label = NULL;
15
16   // Input Validation
17
18       rsaKey = ObjectGet(in->keyHandle);
19
20       // The selected key must be an RSA key
21       if(rsaKey->publicArea.type != TPM_ALG_RSA)
22           return TPM_RC_KEY + RC_RSA_Decrypt_keyHandle;
23
24       // The selected key must be an unrestricted decryption key
25       if(   rsaKey->publicArea.objectAttributes.restricted == SET
26          || rsaKey->publicArea.objectAttributes.decrypt == CLEAR)
27           return TPM_RC_ATTRIBUTES + RC_RSA_Decrypt_keyHandle;
28
29       //   NOTE: Proper operation of this command requires that the sensitive area
30       //   of the key is loaded. This is assured because authorization is required
31       //   to use the sensitive area of the key. In order to check the authorization,
32       //   the sensitive area has to be loaded, even if authorization is with policy.
33
34       // If label is present, make sure that it is a NULL-terminated string
35       if(in->label.t.size > 0)
36       {
37           // Present, so make sure that it is NULL-terminated
38           if(in->label.t.buffer[in->label.t.size - 1] != 0)
39               return TPM_RC_VALUE + RC_RSA_Decrypt_label;
40           label = (char *)in->label.t.buffer;
41       }
42
43   // Command Output
44
45       // Select a scheme for decrypt.
46       scheme = CryptSelectRSAScheme(in->keyHandle, &in->inScheme);

     Family “2.0”                                   TCG Published                                             Page 101
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                                  October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

47      if(scheme == NULL)
48          return TPM_RC_SCHEME + RC_RSA_Decrypt_inScheme;
49
50      // Decryption. TPM_RC_VALUE, TPM_RC_SIZE, and TPM_RC_KEY error may be
51      // returned by CryptDecryptRSA.
52      // NOTE: CryptDecryptRSA can also return TPM_RC_ATTRIBUTES or TPM_RC_BINDING
53      // when the key is not a decryption key but that was checked above.
54      out->message.t.size = sizeof(out->message.t.buffer);
55      result = CryptDecryptRSA(&out->message.t.size, out->message.t.buffer, rsaKey,
56                               scheme, in->cipherText.t.size,
57                               in->cipherText.t.buffer,
58                               label);
59
60       return result;
61   }
62   #endif
63   #endif // CC_RSA_Decrypt




     Page 102                              TCG Published                                Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


14.4   TPM2_ECDH_KeyGen

14.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”                                   TCG Published                                            Page 103
Level 00 Revision 01.16                Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                 Trusted Platform Module Library



14.4.2 Command and Response

                      Table 47 — TPM2_ECDH_KeyGen Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG    tag
                                             present; otherwise, TPM_ST_NO_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_ECDH_KeyGen

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


                      Table 48 — TPM2_ECDH_KeyGen Response
Type                   Name                  Description

TPM_ST                 tag                   see clause 6
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 104                              TCG Published                                    Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                                            Part 3: Commands



     14.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ECDH_KeyGen_fp.h"
3    #ifdef TPM_CC_ECDH_KeyGen // Conditional expansion of this file
4    #ifdef TPM_ALG_ECC


     Error Returns                     Meaning

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

 5   TPM_RC
 6   TPM2_ECDH_KeyGen(
 7       ECDH_KeyGen_In        *in,                 // IN: input parameter list
 8       ECDH_KeyGen_Out       *out                 // OUT: output parameter list
 9       )
10   {
11       OBJECT                    *eccKey;
12       TPM2B_ECC_PARAMETER        sensitive;
13       TPM_RC                     result;
14
15   // Input Validation
16
17       eccKey = ObjectGet(in->keyHandle);
18
19       // Input key must be a non-restricted, decrypt ECC key
20       if(   eccKey->publicArea.type != TPM_ALG_ECC)
21           return TPM_RCS_KEY + RC_ECDH_KeyGen_keyHandle;
22
23       if(     eccKey->publicArea.objectAttributes.restricted == SET
24          ||   eccKey->publicArea.objectAttributes.decrypt != SET
25         )
26           return TPM_RC_KEY + RC_ECDH_KeyGen_keyHandle;
27
28   // Command Output
29       do
30       {
31           // Create ephemeral ECC key
32           CryptNewEccKey(eccKey->publicArea.parameters.eccDetail.curveID,
33                          &out->pubPoint.t.point, &sensitive);
34
35           out->pubPoint.t.size = TPMS_ECC_POINT_Marshal(&out->pubPoint.t.point,
36                                  NULL, NULL);
37
38           // Compute Z
39           result = CryptEccPointMultiply(&out->zPoint.t.point,
40                                      eccKey->publicArea.parameters.eccDetail.curveID,
41                                      &sensitive, &eccKey->publicArea.unique.ecc);
42           // The point in the key is not on the curve. Indicate that the key is bad.
43           if(result == TPM_RC_ECC_POINT)
44               return TPM_RC_KEY + RC_ECDH_KeyGen_keyHandle;
45           // The other possible error is TPM_RC_NO_RESULT indicating that the
46           // multiplication resulted in the point at infinity, so get a new
47           // random key and start over (hardly ever happens).
48       }
49       while(result == TPM_RC_NO_RESULT);
50
51       if(result == TPM_RC_SUCCESS)
52           // Marshal the values to generate the point.
53           out->zPoint.t.size = TPMS_ECC_POINT_Marshal(&out->zPoint.t.point,
54                                                       NULL, NULL);
55
56       return result;

     Family “2.0”                                  TCG Published                                          Page 105
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                       Trusted Platform Module Library

57   }
58   #endif
59   #endif // CC_ECDH_KeyGen




     Page 106                        TCG Published                            Family “2.0”
     October 30, 2014           Copyright © TCG 2006-2014        Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands


14.5   TPM2_ECDH_ZGen

14.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.




Family “2.0”                                 TCG Published                                       Page 107
Level 00 Revision 01.16              Copyright © TCG 2006-2014                          October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



14.5.2 Command and Response

                      Table 49 — TPM2_ECDH_ZGen Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_ECDH_ZGen

                                             handle of a loaded ECC key
TPMI_DH_OBJECT         @keyHandle            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 6
UINT32                 responseSize
TPM_RC                 responseCode

                                             X and Y coordinates of the product of the multiplication
TPM2B_ECC_POINT        outPoint
                                             Z = (xZ , yZ) ≔ [hdS]QB




Page 108                              TCG Published                                     Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                               Part 3: Commands



     14.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ECDH_ZGen_fp.h"
3    #ifdef TPM_CC_ECDH_ZGen // Conditional expansion of this file
4    #ifdef TPM_ALG_ECC


     Error Returns                     Meaning

     TPM_RC_ATTRIBUTES                 key referenced by keyA is restricted or not a decrypt key
     TPM_RC_KEY                        key referenced by keyA is not an ECC key
     TPM_RC_NO_RESULT                  multiplying inPoint resulted in a point at infinity
     TPM_RC_SCHEME                     the scheme of the key referenced by keyA is not TPM_ALG_NULL,
                                       TPM_ALG_ECDH,

 5   TPM_RC
 6   TPM2_ECDH_ZGen(
 7       ECDH_ZGen_In      *in,                  // IN: input parameter list
 8       ECDH_ZGen_Out     *out                  // OUT: output parameter list
 9       )
10   {
11       TPM_RC                     result;
12       OBJECT                    *eccKey;
13
14   // Input Validation
15
16       eccKey = ObjectGet(in->keyHandle);
17
18       // Input key must be a non-restricted, decrypt ECC key
19       if(   eccKey->publicArea.type != TPM_ALG_ECC)
20           return TPM_RCS_KEY + RC_ECDH_ZGen_keyHandle;
21
22       if(     eccKey->publicArea.objectAttributes.restricted == SET
23          ||   eccKey->publicArea.objectAttributes.decrypt != SET
24         )
25           return TPM_RC_KEY + RC_ECDH_ZGen_keyHandle;
26
27       // Make sure the scheme allows this use
28       if(     eccKey->publicArea.parameters.eccDetail.scheme.scheme != TPM_ALG_ECDH
29           && eccKey->publicArea.parameters.eccDetail.scheme.scheme != TPM_ALG_NULL)
30           return TPM_RC_SCHEME + RC_ECDH_ZGen_keyHandle;
31
32   // Command Output
33
34       // Compute Z. TPM_RC_ECC_POINT or TPM_RC_NO_RESULT may be returned here.
35       result = CryptEccPointMultiply(&out->outPoint.t.point,
36                                      eccKey->publicArea.parameters.eccDetail.curveID,
37                                      &eccKey->sensitive.sensitive.ecc,
38                                      &in->inPoint.t.point);
39       if(result != TPM_RC_SUCCESS)
40           return RcSafeAddToResult(result, RC_ECDH_ZGen_inPoint);
41
42       out->outPoint.t.size = TPMS_ECC_POINT_Marshal(&out->outPoint.t.point,
43                                                     NULL, NULL);
44
45       return TPM_RC_SUCCESS;
46   }
47   #endif
48   #endif // CC_ECDH_ZGen



     Family “2.0”                                    TCG Published                                        Page 109
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                       Trusted Platform Module Library


14.6   TPM2_ECC_Parameters

14.6.1 General Description

This command returns the parameters of an ECC curve identified by its TCG-assigned curveID.

14.6.2 Command and Response

                          Table 51 — TPM2_ECC_Parameters Command
Type                              Name                  Description

                                                        TPM_ST_SESSIONS if an audit session is
TPMI_ST_COMMAND_TAG               tag
                                                        present; otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                            responseSize
TPM_RC                            responseCode

TPMS_ALGORITHM_DETAIL_ECC         parameters            ECC parameters for the selected curve




Page 110                                    TCG Published                                   Family “2.0”
October 30, 2014                   Copyright © TCG 2006-2014                     Level 00 Revision 01.16
     Trusted Platform Module Library                                               Part 3: Commands



     14.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ECC_Parameters_fp.h"
3    #ifdef TPM_CC_ECC_Parameters // Conditional expansion of this file
4    #ifdef TPM_ALG_ECC


     Error Returns                     Meaning

     TPM_RC_VALUE                      Unsupported ECC curve ID

 5   TPM_RC
 6   TPM2_ECC_Parameters(
 7       ECC_Parameters_In     *in,                // IN: input parameter list
 8       ECC_Parameters_Out    *out                // OUT: output parameter list
 9       )
10   {
11   // Command Output
12
13       // Get ECC curve parameters
14       if(CryptEccGetParameters(in->curveID, &out->parameters))
15           return TPM_RC_SUCCESS;
16       else
17           return TPM_RC_VALUE + RC_ECC_Parameters_curveID;
18   }
19   #endif
20   #endif // CC_ECC_Parameters




     Family “2.0”                                 TCG Published                           Page 111
     Level 00 Revision 01.16               Copyright © TCG 2006-2014               October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library




14.7     TPM2_ZGen_2Phase

14.7.1    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.

NOTE 2          An unrestricted 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 just an x -coordinate.

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




Page 112                                        TCG Published                                      Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                              Part 3: Commands



14.7.2   Command and Response

                            Table 53 — TPM2_ZGen_2Phase Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           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
                                                    Auth Index: 1
                                                    Auth Role: USER

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()


                            Table 54 — TPM2_ZGen_2Phase Response
Type                          Name                  Description

TPM_ST                        tag
UINT32                        responseSize
TPM_RC                        responseCode

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




Family “2.0”                                 TCG Published                                              Page 113
Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                                               Trusted Platform Module Library



     14.7.3   Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ZGen_2Phase_fp.h"
3    #ifdef TPM_CC_ZGen_2Phase // Conditional expansion of this file

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

     Error Returns                    Meaning

     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                    the scheme of the key referenced by keyA is not TPM_ALG_NULL,
                                      TPM_ALG_ECDH, TPM_ALG_ECMQV or TPM_ALG_SM2

 4   TPM_RC
 5   TPM2_ZGen_2Phase(
 6       ZGen_2Phase_In        *in,                 // IN: input parameter list
 7       ZGen_2Phase_Out       *out                 // OUT: output parameter list
 8       )
 9   {
10       TPM_RC                    result;
11       OBJECT                   *eccKey;
12       TPM2B_ECC_PARAMETER       r;
13       TPM_ALG_ID                scheme;
14
15   // Input Validation
16
17       eccKey = ObjectGet(in->keyA);
18
19       // keyA must be an ECC key
20       if(eccKey->publicArea.type != TPM_ALG_ECC)
21           return TPM_RC_KEY + RC_ZGen_2Phase_keyA;
22
23       // keyA must not be restricted and must be a decrypt key
24       if(   eccKey->publicArea.objectAttributes.restricted == SET
25          || eccKey->publicArea.objectAttributes.decrypt != SET
26         )
27           return TPM_RC_ATTRIBUTES + RC_ZGen_2Phase_keyA;
28
29       // if the scheme of keyA is TPM_ALG_NULL, then use the input scheme; otherwise
30       // the input scheme must be the same as the scheme of keyA
31       scheme = eccKey->publicArea.parameters.asymDetail.scheme.scheme;
32       if(scheme != TPM_ALG_NULL)
33       {
34           if(scheme != in->inScheme)
35               return TPM_RC_SCHEME + RC_ZGen_2Phase_inScheme;
36       }
37       else
38           scheme = in->inScheme;
39       if(scheme == TPM_ALG_NULL)
40           return TPM_RC_SCHEME + RC_ZGen_2Phase_inScheme;
41
42       // Input points must be on the curve of keyA
43       if(!CryptEccIsPointOnCurve(eccKey->publicArea.parameters.eccDetail.curveID,
44                                  &in->inQsB.t.point))
45           return TPM_RC_ECC_POINT + RC_ZGen_2Phase_inQsB;
46
47       if(!CryptEccIsPointOnCurve(eccKey->publicArea.parameters.eccDetail.curveID,
48                                  &in->inQeB.t.point))


     Page 114                                      TCG Published                                        Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                       Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

49           return TPM_RC_ECC_POINT + RC_ZGen_2Phase_inQeB;
50
51       if(!CryptGenerateR(&r, &in->counter,
52                          eccKey->publicArea.parameters.eccDetail.curveID,
53                          NULL))
54               return TPM_RC_VALUE + RC_ZGen_2Phase_counter;
55
56   // Command Output
57
58       result = CryptEcc2PhaseKeyExchange(&out->outZ1.t.point,
59                                       &out->outZ2.t.point,
60                                       eccKey->publicArea.parameters.eccDetail.curveID,
61                                       scheme,
62                                       &eccKey->sensitive.sensitive.ecc,
63                                       &r,
64                                       &in->inQsB.t.point,
65                                       &in->inQeB.t.point);
66       if(result == TPM_RC_SCHEME)
67           return TPM_RC_SCHEME + RC_ZGen_2Phase_inScheme;
68
69       if(result == TPM_RC_SUCCESS)
70           CryptEndCommit(in->counter);
71
72       return result;
73   }
74   #endif




     Family “2.0”                           TCG Published                                   Page 115
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


15     Symmetric Primitives

15.1    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:




Page 116                                   TCG Published                                   Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                                          Part 3: Commands

                               Table 55 — Symmetric Chaining Process
Mode                 Chaining process

TPM_ALG_CTR          The TPM will increment the entire IV provided by the caller. The next count value will be
                     returned to the caller as ivOut. This can be the input value to the next encrypt or decrypt
                     operation.
                     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.




Family “2.0”                                     TCG Published                                                  Page 117
Level 00 Revision 01.16                Copyright © TCG 2006-2014                                         October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library



15.2   TPM2_EncryptDecrypt

15.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 different, mode overrides the mode of the
key.
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_CANCELED. In such case,
outData may be less than inData.




Page 118                                 TCG Published                                Family “2.0”
October 30, 2014                  Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands



15.2.2 Command and Response

                           Table 56 — TPM2_EncryptDecrypt Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_EncryptDecrypt

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

                                                    if YES, then the operation is decryption; if NO, the
TPMI_YES_NO                   decrypt
                                                    operation is encryption
                                                    symmetric mode
TPMI_ALG_SYM_MODE+            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 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_MAX_BUFFER              outData               encrypted or decrypted output
TPM2B_IV                      ivOut                 chaining value to use for IV in next round




Family “2.0”                                 TCG Published                                          Page 119
Level 00 Revision 01.16               Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                               Trusted Platform Module Library



     15.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "EncryptDecrypt_fp.h"
3    #ifdef TPM_CC_EncryptDecrypt // Conditional expansion of this file


     Error Returns                   Meaning

     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                    keyHandle is restricted and the argument mode does not match the
                                     key's mode

 4   TPM_RC
 5   TPM2_EncryptDecrypt(
 6       EncryptDecrypt_In    *in,                 // IN: input parameter list
 7       EncryptDecrypt_Out   *out                 // OUT: output parameter list
 8       )
 9   {
10       OBJECT               *symKey;
11       UINT16               keySize;
12       UINT16               blockSize;
13       BYTE                 *key;
14       TPM_ALG_ID           alg;
15
16   // Input Validation
17       symKey = ObjectGet(in->keyHandle);
18
19       // The input key should be a symmetric decrypt key.
20       if(    symKey->publicArea.type != TPM_ALG_SYMCIPHER
21          || symKey->attributes.publicOnly == SET)
22           return TPM_RC_KEY + RC_EncryptDecrypt_keyHandle;
23
24       // If the input mode is TPM_ALG_NULL, use the key's mode
25       if( in->mode == TPM_ALG_NULL)
26           in->mode = symKey->publicArea.parameters.symDetail.sym.mode.sym;
27
28       // If the key is restricted, the input symmetric mode should match the key's
29       // symmetric mode
30       if(   symKey->publicArea.objectAttributes.restricted == SET
31          && symKey->publicArea.parameters.symDetail.sym.mode.sym != in->mode)
32           return TPM_RC_VALUE + RC_EncryptDecrypt_mode;
33
34       // If the mode is null, then we have a problem.
35       // Note: Construction of a TPMT_SYM_DEF does not allow the 'mode' to be
36       // TPM_ALG_NULL so setting in->mode to the mode of the key should have
37       // produced a valid mode. However, this is suspenders.
38       if(in->mode == TPM_ALG_NULL)
39           return TPM_RC_VALUE + RC_EncryptDecrypt_mode;
40
41       // The input iv for ECB mode should be null. All the other modes should
42       // have an iv size same as encryption block size
43
44       keySize = symKey->publicArea.parameters.symDetail.sym.keyBits.sym;
45       alg = symKey->publicArea.parameters.symDetail.sym.algorithm;
46       blockSize = CryptGetSymmetricBlockSize(alg, keySize);
47       if(   (in->mode == TPM_ALG_ECB && in->ivIn.t.size != 0)
48          || (in->mode != TPM_ALG_ECB && in->ivIn.t.size != blockSize))
49           return TPM_RC_SIZE + RC_EncryptDecrypt_ivIn;

     Page 120                                     TCG Published                                           Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

50
51       // The input data size of CBC mode or ECB mode must be an even multiple of
52       // the symmetric algorithm's block size
53       if(   (in->mode == TPM_ALG_CBC || in->mode == TPM_ALG_ECB)
54          && (in->inData.t.size % blockSize) != 0)
55           return TPM_RC_SIZE + RC_EncryptDecrypt_inData;
56
57       // Copy IV
58       // Note: This is copied here so that the calls to the encrypt/decrypt functions
59       // will modify the output buffer, not the input buffer
60       out->ivOut = in->ivIn;
61
62   // Command Output
63
64       key = symKey->sensitive.sensitive.sym.t.buffer;
65       // For symmetric encryption, the cipher data size is the same as plain data
66       // size.
67       out->outData.t.size = in->inData.t.size;
68       if(in->decrypt == YES)
69       {
70           // Decrypt data to output
71           CryptSymmetricDecrypt(out->outData.t.buffer,
72                                 alg,
73                                 keySize, in->mode, key,
74                                 &(out->ivOut),
75                                 in->inData.t.size,
76                                 in->inData.t.buffer);
77       }
78       else
79       {
80           // Encrypt data to output
81           CryptSymmetricEncrypt(out->outData.t.buffer,
82                                 alg,
83                                 keySize,
84                                 in->mode, key,
85                                 &(out->ivOut),
86                                 in->inData.t.size,
87                                 in->inData.t.buffer);
88       }
89
90       return TPM_RC_SUCCESS;
91   }
92   #endif // CC_EncryptDecrypt




     Family “2.0”                           TCG Published                                  Page 121
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


15.3   TPM2_Hash

15.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.




Page 122                                       TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands



15.3.2 Command and Response

                                  Table 58 — TPM2_Hash Command
Type                          Name                  Description

                                                    TPM_ST_SESSIONS if an audit, decrypt, or encrypt
TPMI_ST_COMMAND_TAG           tag                   session is present; otherwise,
                                                    TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Hash

TPM2B_MAX_BUFFER              data                  data to be hashed
                                                    algorithm for the hash being computed – shall not be
TPMI_ALG_HASH                 hashAlg
                                                    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 6
UINT32                        responseSize
TPM_RC                        responseCode

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




Family “2.0”                                 TCG Published                                        Page 123
Level 00 Revision 01.16              Copyright © TCG 2006-2014                          October 30, 2014
     Part 3: Commands                                                   Trusted Platform Module Library



     15.3.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "Hash_fp.h"
 3   #ifdef TPM_CC_Hash // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_Hash(
 6       Hash_In         *in,            // IN: input parameter list
 7       Hash_Out        *out            // OUT: output parameter list
 8       )
 9   {
10       HASH_STATE         hashState;
11
12   // Command Output
13
14       // Output hash
15           // Start hash stack
16       out->outHash.t.size = CryptStartHash(in->hashAlg, &hashState);
17           // Adding hash data
18       CryptUpdateDigest2B(&hashState, &in->data.b);
19           // Complete hash
20       CryptCompleteHash2B(&hashState, &out->outHash.b);
21
22       // Output ticket
23       out->validation.tag = TPM_ST_HASHCHECK;
24       out->validation.hierarchy = in->hierarchy;
25
26       if(in->hierarchy == TPM_RH_NULL)
27       {
28           // Ticket is not required
29           out->validation.hierarchy = TPM_RH_NULL;
30           out->validation.digest.t.size = 0;
31       }
32       else if( in->data.t.size >= sizeof(TPM_GENERATED)
33               && !TicketIsSafe(&in->data.b))
34       {
35           // Ticket is not safe
36           out->validation.hierarchy = TPM_RH_NULL;
37           out->validation.digest.t.size = 0;
38       }
39       else
40       {
41           // Compute ticket
42           TicketComputeHashCheck(in->hierarchy, in->hashAlg,
43                                  &out->outHash, &out->validation);
44       }
45
46       return TPM_RC_SUCCESS;
47   }
48   #endif // CC_Hash




     Page 124                               TCG Published                                 Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                              Part 3: Commands


15.4   TPM2_HMAC

15.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 the key referenced by handle has the restricted attribute SET, the TPM shall return
TPM_RC_ATTRIBUTES.
If the default scheme of the key referenced by handle is not TPM_ALG_NULL, then the hashAlg
parameter is required to be either the same as the key’s default or TPM_ALG_NULL (TPM_RC_VALUE).
If the default scheme of the key is TPM_ALG_NULL, then hashAlg is required to be a valid hash and not
TPM_ALG_NULL (TPM_RC_VALUE). (See hash selection matrix in Table 66.)

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




Family “2.0”                                  TCG Published                                           Page 125
Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library


15.4.2 Command and Response

                         Table 60 — TPM2_HMAC Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_HMAC

                                             handle for the symmetric signing key providing the
                                             HMAC key
TPMI_DH_OBJECT         @handle
                                             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 6
UINT32                 responseSize
TPM_RC                 responseCode

TPM2B_DIGEST           outHMAC               the returned HMAC in a sized buffer




Page 126                              TCG Published                                    Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     15.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "HMAC_fp.h"
3    #ifdef TPM_CC_HMAC // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_ATTRIBUTES                 key referenced by handle is not a signing key or is a restricted key
     TPM_RC_TYPE                       key referenced by handle is not an HMAC key
     TPM_RC_VALUE                      hashAlg is not compatible with the hash algorithm of the scheme of
                                       the object referenced by handle

 4   TPM_RC
 5   TPM2_HMAC(
 6       HMAC_In           *in,                 // IN: input parameter list
 7       HMAC_Out          *out                 // OUT: output parameter list
 8       )
 9   {
10       HMAC_STATE                 hmacState;
11       OBJECT                    *hmacObject;
12       TPMI_ALG_HASH              hashAlg;
13       TPMT_PUBLIC               *publicArea;
14
15   // Input Validation
16
17       // Get HMAC key object and public area pointers
18       hmacObject = ObjectGet(in->handle);
19       publicArea = &hmacObject->publicArea;
20
21       // Make sure that the key is an HMAC key
22       if(publicArea->type != TPM_ALG_KEYEDHASH)
23           return TPM_RCS_TYPE + RC_HMAC_handle;
24
25       // and that it is unrestricted
26       if(publicArea->objectAttributes.restricted == SET)
27           return TPM_RCS_ATTRIBUTES + RC_HMAC_handle;
28
29       // and that it is a signing key
30       if(publicArea->objectAttributes.sign != SET)
31           return TPM_RCS_KEY + RC_HMAC_handle;
32
33       // See if the key has a default
34       if(publicArea->parameters.keyedHashDetail.scheme.scheme == TPM_ALG_NULL)
35           // it doesn't so use the input value
36           hashAlg = in->hashAlg;
37       else
38       {
39           // key has a default so use it
40           hashAlg
41               = publicArea->parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
42           // and verify that the input was either the TPM_ALG_NULL or the default
43           if(in->hashAlg != TPM_ALG_NULL && in->hashAlg != hashAlg)
44               hashAlg = TPM_ALG_NULL;
45       }
46       // if we ended up without a hash algorith then return an error
47       if(hashAlg == TPM_ALG_NULL)
48           return TPM_RCS_VALUE + RC_HMAC_hashAlg;
49
50   // Command Output
51

     Family “2.0”                                   TCG Published                                             Page 127
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                 October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

52      // Start HMAC stack
53      out->outHMAC.t.size = CryptStartHMAC2B(hashAlg,
54                                             &hmacObject->sensitive.sensitive.bits.b,
55                                             &hmacState);
56      // Adding HMAC data
57      CryptUpdateDigest2B(&hmacState, &in->buffer.b);
58
59      // Complete HMAC
60      CryptCompleteHMAC2B(&hmacState, &out->outHMAC.b);
61
62       return TPM_RC_SUCCESS;
63   }
64   #endif // CC_HMAC




     Page 128                              TCG Published                              Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands


16     Random Number Generator

16.1     TPM2_GetRandom

16.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, as long as the value of bytesRequested is not greater than the maximum digest
               size, 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 dig est 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.




Family “2.0”                                TCG Published                                          Page 129
Level 00 Revision 01.16             Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library


16.1.2 Command and Response

                      Table 62 — TPM2_GetRandom Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG    tag
                                             present; otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                 responseSize
TPM_RC                 responseCode

TPM2B_DIGEST           randomBytes           the random octets




Page 130                              TCG Published                                  Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands



     16.1.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "GetRandom_fp.h"
 3   #ifdef TPM_CC_GetRandom // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_GetRandom(
 6       GetRandom_In     *in,            // IN: input parameter list
 7       GetRandom_Out    *out            // OUT: output parameter list
 8       )
 9   {
10   // Command Output
11
12       // if the requested bytes exceed the output buffer size, generates the
13       // maximum bytes that the output buffer allows
14       if(in->bytesRequested > sizeof(TPMU_HA))
15           out->randomBytes.t.size = sizeof(TPMU_HA);
16       else
17           out->randomBytes.t.size = in->bytesRequested;
18
19       CryptGenerateRandom(out->randomBytes.t.size, out->randomBytes.t.buffer);
20
21       return TPM_RC_SUCCESS;
22   }
23   #endif // CC_GetRandom




     Family “2.0”                            TCG Published                                 Page 131
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
Part 3: Commands                                                           Trusted Platform Module Library


16.2   TPM2_StirRandom

16.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.




Page 132                                      TCG Published                                  Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands



16.2.2 Command and Response

                             Table 64 — TPM2_StirRandom Command
Type                          Name                  Description

                                                    TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG           tag
                                                    present; otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                   Page 133
Level 00 Revision 01.16             Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                 Trusted Platform Module Library



     16.2.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "StirRandom_fp.h"
 3   #ifdef TPM_CC_StirRandom // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_StirRandom(
 6       StirRandom_In   *in            // IN: input parameter list
 7       )
 8   {
 9   // Internal Data Update
10       CryptStirRandom(in->inData.t.size, in->inData.t.buffer);
11
12       return TPM_RC_SUCCESS;
13   }
14   #endif // CC_StirRandom




     Page 134                               TCG Published                               Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                                 Part 3: Commands


17     Hash/HMAC/Event Sequences

17.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 TPM 2.0 Part 1.

17.2     TPM2_HMAC_Start

17.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                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 the key referenced by handle has the restricted attribute SET, the TPM shall return
TPM_RC_ATTRIBUTES.
If the default scheme of the key referenced by handle is not TPM_ALG_NULL, then the hashAlg
parameter is required to be either the same as the key’s default or TPM_ALG_NULL (TPM_RC_VALUE).
If the default scheme of the key is TPM_ALG_NULL, then hashAlg is required to be a valid hash and not
TPM_ALG_NULL (TPM_RC_VALUE).

                                          Table 66 — Hash Selection Matrix
 handle→restricted          handle→scheme
 (key's restricted          (hash algorithm
 attribute)                 from key's scheme)          hashAlg                   hash used
                                                (1)                                       (1)
 CLEAR (unrestricted)       TPM_ALG_NULL                TPM_ALG_NULL              error         (TPM_RC_VALUE)
 CLEAR                      TPM_ALG_NULL                valid hash                hashAlg
 CLEAR                      valid hash                  TPM_ALG_NULL or same as   handle→scheme
                                                        handle→scheme
 SET (restricted)           don't care                  don't care                TPM_RC_ATTRIBUTES
 NOTES:
 1)    A hash algorithm is required for the HMAC.




Family “2.0”                                          TCG Published                                    Page 135
Level 00 Revision 01.16                      Copyright © TCG 2006-2014                          October 30, 2014
Part 3: Commands                                                 Trusted Platform Module Library



17.2.2 Command and Response

                      Table 67 — TPM2_HMAC_Start Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_HMAC_Start

                                             handle of an HMAC key
TPMI_DH_OBJECT         @handle               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 6
UINT32                 responseSize
TPM_RC                 responseCode

TPMI_DH_OBJECT         sequenceHandle        a handle to reference the sequence




Page 136                              TCG Published                                   Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                                                    Part 3: Commands



     17.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "HMAC_Start_fp.h"
3    #ifdef TPM_CC_HMAC_Start // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_ATTRIBUTES                 key referenced by handle is not a signing key or is restricted
     TPM_RC_OBJECT_MEMORY              no space to create an internal object
     TPM_RC_KEY                        key referenced by handle is not an HMAC key
     TPM_RC_VALUE                      hashAlg is not compatible with the hash algorithm of the scheme of
                                       the object referenced by handle

 4   TPM_RC
 5   TPM2_HMAC_Start(
 6       HMAC_Start_In     *in,                 // IN: input parameter list
 7       HMAC_Start_Out    *out                 // OUT: output parameter list
 8       )
 9   {
10       OBJECT                    *hmacObject;
11       TPMT_PUBLIC               *publicArea;
12       TPM_ALG_ID                 hashAlg;
13
14   // Input Validation
15
16       // Get HMAC key object and public area pointers
17       hmacObject = ObjectGet(in->handle);
18       publicArea = &hmacObject->publicArea;
19
20       // Make sure that the key is an HMAC key
21       if(publicArea->type != TPM_ALG_KEYEDHASH)
22           return TPM_RCS_TYPE + RC_HMAC_Start_handle;
23
24       // and that it is unrestricted
25       if(publicArea->objectAttributes.restricted == SET)
26           return TPM_RCS_ATTRIBUTES + RC_HMAC_Start_handle;
27
28       // and that it is a signing key
29       if(publicArea->objectAttributes.sign != SET)
30           return TPM_RCS_KEY + RC_HMAC_Start_handle;
31
32       // See if the key has a default
33       if(publicArea->parameters.keyedHashDetail.scheme.scheme == TPM_ALG_NULL)
34           // it doesn't so use the input value
35           hashAlg = in->hashAlg;
36       else
37       {
38           // key has a default so use it
39           hashAlg
40               = publicArea->parameters.keyedHashDetail.scheme.details.hmac.hashAlg;
41           // and verify that the input was either the TPM_ALG_NULL or the default
42           if(in->hashAlg != TPM_ALG_NULL && in->hashAlg != hashAlg)
43               hashAlg = TPM_ALG_NULL;
44       }
45       // if we ended up without a hash algorith then return an error
46       if(hashAlg == TPM_ALG_NULL)
47           return TPM_RCS_VALUE + RC_HMAC_Start_hashAlg;
48
49   // Internal Data Update
50

     Family “2.0”                                   TCG Published                                              Page 137
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                    October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

51      // Create a HMAC sequence object. A TPM_RC_OBJECT_MEMORY error may be
52      // returned at this point
53      return ObjectCreateHMACSequence(hashAlg,
54                                      in->handle,
55                                      &in->auth,
56                                      &out->sequenceHandle);
57   }
58   #endif // CC_HMAC_Start




     Page 138                              TCG Published                              Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands


17.3   TPM2_HashSequenceStart

17.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 context or an Event
Sequence context. Additionally, it will assign a handle to the context and set the authValue of the context
to the value in auth. A sequence context for an Event (hashAlg = TPM_ALG_NULL) contains a hash
context for each of the PCR banks implemented on the TPM.




Family “2.0”                                TCG Published                                       Page 139
Level 00 Revision 01.16              Copyright © TCG 2006-2014                         October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library



17.3.2 Command and Response

                      Table 69 — TPM2_HashSequenceStart Command
Type                      Name                  Description

                                                TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG       tag
                                                present; otherwise, TPM_ST_NO_SESSIONS
UINT32                    commandSize
TPM_CC                    commandCode           TPM_CC_HashSequenceStart

TPM2B_AUTH                auth                  authorization value for subsequent use of the sequence
                                                the hash algorithm to use for the hash sequence
TPMI_ALG_HASH+            hashAlg
                                                An Event Sequence starts if this is TPM_ALG_NULL.


                      Table 70 — TPM2_HashSequenceStart Response
Type                      Name                  Description

TPM_ST                    tag                   see clause 6
UINT32                    responseSize
TPM_RC                    responseCode

TPMI_DH_OBJECT            sequenceHandle        a handle to reference the sequence




Page 140                                 TCG Published                                   Family “2.0”
October 30, 2014                 Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                                      Part 3: Commands



     17.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "HashSequenceStart_fp.h"
3    #ifdef TPM_CC_HashSequenceStart // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_OBJECT_MEMORY              no space to create an internal object

 4   TPM_RC
 5   TPM2_HashSequenceStart(
 6       HashSequenceStart_In      *in,                   // IN: input parameter list
 7       HashSequenceStart_Out     *out                   // OUT: output parameter list
 8       )
 9   {
10   // Internal Data Update
11
12       if(in->hashAlg == TPM_ALG_NULL)
13           // Start a event sequence. A TPM_RC_OBJECT_MEMORY error may be
14           // returned at this point
15           return ObjectCreateEventSequence(&in->auth, &out->sequenceHandle);
16
17       // Start a hash sequence. A TPM_RC_OBJECT_MEMORY error may be
18       // returned at this point
19       return ObjectCreateHashSequence(in->hashAlg, &in->auth, &out->sequenceHandle);
20   }
21   #endif // CC_HashSequenceStart




     Family “2.0”                                   TCG Published                                Page 141
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                      October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


17.4     TPM2_SequenceUpdate

17.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 1          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 2          This requirement allows the TPM to validate that the first block is safe to sign without having to
                accumulate octets over multiple calls.




Page 142                                        TCG Published                                       Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands


17.4.2 Command and Response

                          Table 71 — TPM2_SequenceUpdate Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_SequenceUpdate

                                                    handle for the sequence object
TPMI_DH_OBJECT                @sequenceHandle       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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                  Page 143
Level 00 Revision 01.16                Copyright © TCG 2006-2014                     October 30, 2014
     Part 3: Commands                                                        Trusted Platform Module Library



     17.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "SequenceUpdate_fp.h"
3    #ifdef TPM_CC_SequenceUpdate // Conditional expansion of this file


     Error Returns                   Meaning

     TPM_RC_MODE                     sequenceHandle does not reference a hash or HMAC sequence
                                     object

 4   TPM_RC
 5   TPM2_SequenceUpdate(
 6       SequenceUpdate_In     *in               // IN: input parameter list
 7       )
 8   {
 9       OBJECT                      *object;
10
11   // Input Validation
12
13       // Get sequence object pointer
14       object = ObjectGet(in->sequenceHandle);
15
16       // Check that referenced object is a sequence object.
17       if(!ObjectIsSequence(object))
18           return TPM_RC_MODE + RC_SequenceUpdate_sequenceHandle;
19
20   // Internal Data Update
21
22       if(object->attributes.eventSeq == SET)
23       {
24           // Update event sequence object
25           UINT32           i;
26           HASH_OBJECT     *hashObject = (HASH_OBJECT *)object;
27           for(i = 0; i < HASH_COUNT; i++)
28           {
29               // Update sequence object
30               CryptUpdateDigest2B(&hashObject->state.hashState[i], &in->buffer.b);
31           }
32       }
33       else
34       {
35           HASH_OBJECT     *hashObject = (HASH_OBJECT *)object;
36
37           // Update hash/HMAC sequence object
38           if(hashObject->attributes.hashSeq == SET)
39           {
40               // Is this the first block of the sequence
41               if(hashObject->attributes.firstBlock == CLEAR)
42               {
43                   // If so, indicate that first block was received
44                   hashObject->attributes.firstBlock = SET;
45
46                    // Check the first block to see if the first block can contain
47                    // the TPM_GENERATED_VALUE. If it does, it is not safe for
48                    // a ticket.
49                    if(TicketIsSafe(&in->buffer.b))
50                        hashObject->attributes.ticketSafe = SET;
51                }
52                // Update sequence object hash/HMAC stack
53                CryptUpdateDigest2B(&hashObject->state.hashState[0], &in->buffer.b);
54
55           }

     Page 144                                   TCG Published                                    Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                              Part 3: Commands

56           else if(object->attributes.hmacSeq == SET)
57           {
58               HASH_OBJECT     *hashObject = (HASH_OBJECT *)object;
59
60                // Update sequence object hash/HMAC stack
61                CryptUpdateDigest2B(&hashObject->state.hmacState, &in->buffer.b);
62           }
63       }
64
65       return TPM_RC_SUCCESS;
66   }
67   #endif // CC_SequenceUpdate




     Family “2.0”                            TCG Published                               Page 145
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                  October 30, 2014
Part 3: Commands                                                                Trusted Platform Module Library


17.5     TPM2_SequenceComplete

17.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.

NOTE 3          The ticket is only required for a signing operation that uses a restricted signing key. It is always
                returned, but can be ignored if not needed.

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.




Page 146                                       TCG Published                                          Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands



17.5.2 Command and Response

                          Table 73 — TPM2_SequenceComplete Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_SequenceComplete {F}

                                                    authorization for the sequence
TPMI_DH_OBJECT                @sequenceHandle       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 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_DIGEST                  result                the returned HMAC or digest in a sized buffer
                                                    ticket indicating that the sequence of octets used to
                                                    compute outDigest did not start with
TPMT_TK_HASHCHECK             validation            TPM_GENERATED_VALUE
                                                    This is a NULL Ticket when the sequence is HMAC.




Family “2.0”                                 TCG Published                                          Page 147
Level 00 Revision 01.16                Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                    Trusted Platform Module Library



     17.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "SequenceComplete_fp.h"
3    #ifdef TPM_CC_SequenceComplete // Conditional expansion of this file
4    #include <Platform.h>


     Error Returns               Meaning

     TPM_RC_TYPE                 sequenceHandle does not reference a hash or HMAC sequence
                                 object

 5   TPM_RC
 6   TPM2_SequenceComplete(
 7       SequenceComplete_In    *in,               // IN: input parameter list
 8       SequenceComplete_Out   *out               // OUT: output parameter list
 9       )
10   {
11       OBJECT                     *object;
12
13   // Input validation
14
15       // Get hash object pointer
16       object = ObjectGet(in->sequenceHandle);
17
18       // input handle must be a hash or HMAC sequence object.
19       if(   object->attributes.hashSeq == CLEAR
20          && object->attributes.hmacSeq == CLEAR)
21           return TPM_RC_MODE + RC_SequenceComplete_sequenceHandle;
22
23   // Command Output
24
25       if(object->attributes.hashSeq == SET)           // sequence object for hash
26       {
27           // Update last piece of data
28           HASH_OBJECT     *hashObject = (HASH_OBJECT *)object;
29
30          // Get the hash algorithm before the algorithm is lost in CryptCompleteHash
31           TPM_ALG_ID       hashAlg = hashObject->state.hashState[0].state.hashAlg;
32
33           CryptUpdateDigest2B(&hashObject->state.hashState[0], &in->buffer.b);
34
35           // Complete hash
36           out->result.t.size
37               = CryptGetHashDigestSize(
38                     CryptGetContextAlg(&hashObject->state.hashState[0]));
39
40           CryptCompleteHash2B(&hashObject->state.hashState[0], &out->result.b);
41
42           // Check if the first block of the sequence has been received
43           if(hashObject->attributes.firstBlock == CLEAR)
44           {
45               // If not, then this is the first block so see if it is 'safe'
46               // to sign.
47               if(TicketIsSafe(&in->buffer.b))
48                   hashObject->attributes.ticketSafe = SET;
49           }
50
51           // Output ticket
52           out->validation.tag = TPM_ST_HASHCHECK;
53           out->validation.hierarchy = in->hierarchy;
54
55           if(in->hierarchy == TPM_RH_NULL)

     Page 148                               TCG Published                                    Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014               Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands

56           {
57                // Ticket is not required
58                out->validation.digest.t.size = 0;
59           }
60           else if(object->attributes.ticketSafe == CLEAR)
61           {
62               // Ticket is not safe to generate
63               out->validation.hierarchy = TPM_RH_NULL;
64               out->validation.digest.t.size = 0;
65           }
66           else
67           {
68               // Compute ticket
69               TicketComputeHashCheck(out->validation.hierarchy, hashAlg,
70                                      &out->result, &out->validation);
71           }
72       }
73       else
74       {
75           HASH_OBJECT       *hashObject = (HASH_OBJECT *)object;
76
77           //   Update last piece of data
78           CryptUpdateDigest2B(&hashObject->state.hmacState, &in->buffer.b);
79           // Complete hash/HMAC
80           out->result.t.size =
81               CryptGetHashDigestSize(
82                   CryptGetContextAlg(&hashObject->state.hmacState.hashState));
83           CryptCompleteHMAC2B(&(hashObject->state.hmacState), &out->result.b);
84
85           // No ticket is generated for HMAC sequence
86           out->validation.tag = TPM_ST_HASHCHECK;
87           out->validation.hierarchy = TPM_RH_NULL;
88           out->validation.digest.t.size = 0;
89       }
90
91   // Internal Data Update
92
93       // mark sequence object as evict so it will be flushed on the way out
94       object->attributes.evict = SET;
95
96       return TPM_RC_SUCCESS;
97   }
98   #endif // CC_SequenceComplete




     Family “2.0”                             TCG Published                                Page 149
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


17.6   TPM2_EventSequenceComplete

17.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.




Page 150                                   TCG Published                                   Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



17.6.2 Command and Response

                      Table 75 — TPM2_EventSequenceComplete Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_EventSequenceComplete {NV F}

                                                    PCR to be extended with the Event data
TPMI_DH_PCR+                  @ pcrHandle           Auth Index: 1
                                                    Auth Role: USER
                                                    authorization for the sequence
TPMI_DH_OBJECT                @sequenceHandle       Auth Index: 2
                                                    Auth Role: USER

TPM2B_MAX_BUFFER              buffer                data to be added to the Event


                      Table 76 — TPM2_EventSequenceComplete Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPML_DIGEST_VALUES            results               list of digests computed for the PCR




Family “2.0”                                 TCG Published                                        Page 151
Level 00 Revision 01.16                Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     17.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "EventSequenceComplete_fp.h"
3    #ifdef TPM_CC_EventSequenceComplete // Conditional expansion of this file


     Error Returns                 Meaning

     TPM_RC_LOCALITY               PCR extension is not allowed at the current locality
     TPM_RC_MODE                   input handle is not a valid event sequence object

 4   TPM_RC
 5   TPM2_EventSequenceComplete(
 6       EventSequenceComplete_In      *in,                // IN: input parameter list
 7       EventSequenceComplete_Out     *out                // OUT: output parameter list
 8       )
 9   {
10       TPM_RC              result;
11       HASH_OBJECT        *hashObject;
12       UINT32              i;
13       TPM_ALG_ID          hashAlg;
14
15   // Input validation
16
17       // get the event sequence object pointer
18       hashObject = (HASH_OBJECT *)ObjectGet(in->sequenceHandle);
19
20       // input handle must reference an event sequence object
21       if(hashObject->attributes.eventSeq != SET)
22           return TPM_RC_MODE + RC_EventSequenceComplete_sequenceHandle;
23
24       // see if a PCR extend is requested in call
25       if(in->pcrHandle != TPM_RH_NULL)
26       {
27           // see if extend of the PCR is allowed at the locality of the command,
28           if(!PCRIsExtendAllowed(in->pcrHandle))
29               return TPM_RC_LOCALITY;
30           // if an extend is going to take place, then check to see if there has
31           // been an orderly shutdown. If so, and the selected PCR is one of the
32           // state saved PCR, then the orderly state has to change. The orderly state
33           // does not change for PCR that are not preserved.
34           // NOTE: This doesn't just check for Shutdown(STATE) because the orderly
35           // state will have to change if this is a state-saved PCR regardless
36           // of the current state. This is because a subsequent Shutdown(STATE) will
37           // check to see if there was an orderly shutdown and not do anything if
38           // there was. So, this must indicate that a future Shutdown(STATE) has
39           // something to do.
40           if(gp.orderlyState != SHUTDOWN_NONE && PCRIsStateSaved(in->pcrHandle))
41           {
42               result = NvIsAvailable();
43               if(result != TPM_RC_SUCCESS) return result;
44               g_clearOrderly = TRUE;
45           }
46       }
47
48   // Command Output
49
50       out->results.count = 0;
51
52       for(i = 0; i < HASH_COUNT; i++)
53       {
54           hashAlg = CryptGetHashAlgByIndex(i);

     Page 152                                   TCG Published                                        Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                          Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

55           // Update last piece of data
56           CryptUpdateDigest2B(&hashObject->state.hashState[i], &in->buffer.b);
57           // Complete hash
58           out->results.digests[out->results.count].hashAlg = hashAlg;
59           CryptCompleteHash(&hashObject->state.hashState[i],
60                           CryptGetHashDigestSize(hashAlg),
61                           (BYTE *) &out->results.digests[out->results.count].digest);
62
63           // Extend PCR
64           if(in->pcrHandle != TPM_RH_NULL)
65               PCRExtend(in->pcrHandle, hashAlg,
66                         CryptGetHashDigestSize(hashAlg),
67                         (BYTE *) &out->results.digests[out->results.count].digest);
68           out->results.count++;
69       }
70
71   // Internal Data Update
72
73       // mark sequence object as evict so it will be flushed on the way out
74       hashObject->attributes.evict = SET;
75
76       return TPM_RC_SUCCESS;
77   }
78   #endif // CC_EventSequenceComplete




     Family “2.0”                           TCG Published                                  Page 153
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


18     Attestation Commands

18.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.
All signing commands include a parameter (typically inScheme) for the caller to specify 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 or the key handle is TPM_RH_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 or the key handle is
TPM_RH_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.
For a restricted signing key, the key's scheme cannot be TPM_ALG_NULL and cannot be overridden.
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

Page 154                                       TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                           Part 3: Commands

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




Family “2.0”                           TCG Published                              Page 155
Level 00 Revision 01.16           Copyright © TCG 2006-2014               October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library



18.2     TPM2_Certify

18.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 self-
consistent 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 18.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 mat ched sensitive area, then the public
                area may not represent a valid object and 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.

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




Page 156                                       TCG Published                                         Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



18.2.2 Command and Response

                                  Table 77 — TPM2_Certify Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Certify

                                                    handle of the object to be certified
TPMI_DH_OBJECT                @objectHandle         Auth Index: 1
                                                    Auth Role: ADMIN
                                                    handle of the key used to sign the attestation structure
TPMI_DH_OBJECT+               @signHandle           Auth Index: 2
                                                    Auth Role: USER

TPM2B_DATA                    qualifyingData        user provided qualifying data
                                                    signing scheme to use if the scheme for signHandle is
TPMT_SIG_SCHEME+              inScheme
                                                    TPM_ALG_NULL


                                  Table 78 — TPM2_Certify Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode          .

TPM2B_ATTEST                  certifyInfo           the structure that was signed
                                                    the asymmetric signature over certifyInfo using the key
TPMT_SIGNATURE                signature
                                                    referenced by signHandle




Family “2.0”                                 TCG Published                                         Page 157
Level 00 Revision 01.16             Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     18.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "Certify_fp.h"
4    #ifdef TPM_CC_Certify // Conditional expansion of this file


     Error Returns               Meaning

     TPM_RC_KEY                  key referenced by signHandle is not a signing key
     TPM_RC_SCHEME               inScheme is not compatible with signHandle
     TPM_RC_VALUE                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).

 5   TPM_RC
 6   TPM2_Certify(
 7       Certify_In      *in,             // IN: input parameter list
 8       Certify_Out     *out             // OUT: output parameter list
 9       )
10   {
11       TPM_RC                 result;
12       TPMS_ATTEST            certifyInfo;
13
14   // Command Output
15
16       // Filling in attest information
17       // Common fields
18       result = FillInAttestInfo(in->signHandle,
19                                 &in->inScheme,
20                                 &in->qualifyingData,
21                                 &certifyInfo);
22       if(result != TPM_RC_SUCCESS)
23       {
24           if(result == TPM_RC_KEY)
25               return TPM_RC_KEY + RC_Certify_signHandle;
26           else
27               return RcSafeAddToResult(result, RC_Certify_inScheme);
28       }
29       // Certify specific fields
30       // Attestation type
31       certifyInfo.type = TPM_ST_ATTEST_CERTIFY;
32       // Certified object name
33       certifyInfo.attested.certify.name.t.size =
34           ObjectGetName(in->objectHandle,
35                         &certifyInfo.attested.certify.name.t.name);
36       // Certified object qualified name
37       ObjectGetQualifiedName(in->objectHandle,
38                              &certifyInfo.attested.certify.qualifiedName);
39
40       // Sign attestation structure. A NULL signature will be returned if
41       // signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
42       // TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned
43       // by SignAttestInfo()
44       result = SignAttestInfo(in->signHandle,
45                               &in->inScheme,
46                               &certifyInfo,
47                               &in->qualifyingData,
48                               &out->certifyInfo,
49                               &out->signature);

     Page 158                                 TCG Published                                           Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

50
51       // TPM_RC_ATTRIBUTES cannot be returned here as FillInAttestInfo would already
52       // have returned TPM_RC_KEY
53       pAssert(result != TPM_RC_ATTRIBUTES);
54
55       if(result != TPM_RC_SUCCESS)
56           return result;
57
58       // orderly state should be cleared because of the reporting of clock info
59       // if signing happens
60       if(in->signHandle != TPM_RH_NULL)
61           g_clearOrderly = TRUE;
62
63       return TPM_RC_SUCCESS;
64   }
65   #endif // CC_Certify




     Family “2.0”                            TCG Published                                Page 159
     Level 00 Revision 01.16            Copyright © TCG 2006-2014                October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


18.3     TPM2_CertifyCreation

18.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 18.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().




Page 160                                       TCG Published                                        Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands



18.3.2 Command and Response

                           Table 79 — TPM2_CertifyCreation Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_CertifyCreation

                                                    handle of the key that will sign the attestation block
TPMI_DH_OBJECT+               @signHandle           Auth Index: 1
                                                    Auth Role: USER
                                                    the object associated with the creation data
TPMI_DH_OBJECT                objectHandle
                                                    Auth Index: None

TPM2B_DATA                    qualifyingData        user-provided qualifying data
                                                    hash of the creation data produced by TPM2_Create()
TPM2B_DIGEST                  creationHash
                                                    or TPM2_CreatePrimary()
                                                    signing scheme to use if the scheme for signHandle is
TPMT_SIG_SCHEME+              inScheme
                                                    TPM_ALG_NULL
                                                    ticket produced by TPM2_Create() or
TPMT_TK_CREATION              creationTicket
                                                    TPM2_CreatePrimary()


                           Table 80 — TPM2_CertifyCreation Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_ATTEST                  certifyInfo           the structure that was signed
TPMT_SIGNATURE                signature             the signature over certifyInfo




Family “2.0”                                 TCG Published                                          Page 161
Level 00 Revision 01.16             Copyright © TCG 2006-2014                             October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     18.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "CertifyCreation_fp.h"
4    #ifdef TPM_CC_CertifyCreation // Conditional expansion of this file


     Error Returns               Meaning

     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                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).

 5   TPM_RC
 6   TPM2_CertifyCreation(
 7       CertifyCreation_In     *in,                // IN: input parameter list
 8       CertifyCreation_Out    *out                // OUT: output parameter list
 9       )
10   {
11       TPM_RC                 result;
12       TPM2B_NAME             name;
13       TPMT_TK_CREATION       ticket;
14       TPMS_ATTEST            certifyInfo;
15
16   // Input Validation
17
18       // CertifyCreation specific input validation
19       // Get certified object name
20       name.t.size = ObjectGetName(in->objectHandle, &name.t.name);
21       // Re-compute ticket
22       TicketComputeCreation(in->creationTicket.hierarchy, &name,
23                             &in->creationHash, &ticket);
24       // Compare ticket
25       if(!Memory2BEqual(&ticket.digest.b, &in->creationTicket.digest.b))
26           return TPM_RC_TICKET + RC_CertifyCreation_creationTicket;
27
28   // Command Output
29       // Common fields
30       result = FillInAttestInfo(in->signHandle, &in->inScheme, &in->qualifyingData,
31                                 &certifyInfo);
32       if(result != TPM_RC_SUCCESS)
33       {
34           if(result == TPM_RC_KEY)
35               return TPM_RC_KEY + RC_CertifyCreation_signHandle;
36           else
37               return RcSafeAddToResult(result, RC_CertifyCreation_inScheme);
38       }
39
40       // CertifyCreation specific fields
41       // Attestation type
42       certifyInfo.type = TPM_ST_ATTEST_CREATION;
43       certifyInfo.attested.creation.objectName = name;
44
45       // Copy the creationHash
46       certifyInfo.attested.creation.creationHash = in->creationHash;
47
48       // Sign attestation structure.   A NULL signature will be returned if

     Page 162                                 TCG Published                                           Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                       Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

49       // signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
50       // TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
51       // this point
52       result = SignAttestInfo(in->signHandle,
53                               &in->inScheme,
54                               &certifyInfo,
55                               &in->qualifyingData,
56                               &out->certifyInfo,
57                               &out->signature);
58
59       // TPM_RC_ATTRIBUTES cannot be returned here as FillInAttestInfo would already
60       // have returned TPM_RC_KEY
61       pAssert(result != TPM_RC_ATTRIBUTES);
62
63       if(result != TPM_RC_SUCCESS)
64           return result;
65
66       // orderly state should be cleared because of the reporting of clock info
67       // if signing happens
68       if(in->signHandle != TPM_RH_NULL)
69           g_clearOrderly = TRUE;
70
71       return TPM_RC_SUCCESS;
72   }
73   #endif // CC_CertifyCreation




     Family “2.0”                            TCG Published                                Page 163
     Level 00 Revision 01.16            Copyright © TCG 2006-2014                October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


18.4     TPM2_Quote

18.4.1 General Description

This command is used to quote PCR values.

NOTE            See 18.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 TPM 2.0 Part 1, Selecting Multiple PCR.

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




Page 164                                       TCG Published                                        Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands



18.4.2 Command and Response

                                  Table 81 — TPM2_Quote Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_Quote

                                                    handle of key that will perform signature
TPMI_DH_OBJECT+               @signHandle           Auth Index: 1
                                                    Auth Role: USER

TPM2B_DATA                    qualifyingData        data supplied by the caller
                                                    signing scheme to use if the scheme for signHandle is
TPMT_SIG_SCHEME+              inScheme
                                                    TPM_ALG_NULL
TPML_PCR_SELECTION            PCRselect             PCR set to quote


                                  Table 82 — TPM2_Quote Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_ATTEST                  quoted                the quoted information
TPMT_SIGNATURE                signature             the signature over quoted




Family “2.0”                                 TCG Published                                      Page 165
Level 00 Revision 01.16             Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     18.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "Quote_fp.h"
4    #ifdef TPM_CC_Quote // Conditional expansion of this file


     Error Returns               Meaning

     TPM_RC_KEY                  signHandle does not reference a signing key;
     TPM_RC_SCHEME               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

 5   TPM_RC
 6   TPM2_Quote(
 7       Quote_In        *in,             // IN: input parameter list
 8       Quote_Out       *out             // OUT: output parameter list
 9       )
10   {
11       TPM_RC                  result;
12       TPMI_ALG_HASH           hashAlg;
13       TPMS_ATTEST             quoted;
14
15   // Command Output
16
17       // Filling in attest information
18       // Common fields
19       // FillInAttestInfo may return TPM_RC_SCHEME or TPM_RC_KEY
20       result = FillInAttestInfo(in->signHandle,
21                                 &in->inScheme,
22                                 &in->qualifyingData,
23                                 &quoted);
24       if(result != TPM_RC_SUCCESS)
25       {
26           if(result == TPM_RC_KEY)
27               return TPM_RC_KEY + RC_Quote_signHandle;
28           else
29               return RcSafeAddToResult(result, RC_Quote_inScheme);
30       }
31
32       // Quote specific fields
33       // Attestation type
34       quoted.type = TPM_ST_ATTEST_QUOTE;
35
36       // Get hash algorithm in sign scheme. This hash algorithm is used to
37       // compute PCR digest. If there is no algorithm, then the PCR cannot
38       // be digested and this command returns TPM_RC_SCHEME
39       hashAlg = in->inScheme.details.any.hashAlg;
40
41       if(hashAlg == TPM_ALG_NULL)
42           return TPM_RC_SCHEME + RC_Quote_inScheme;
43
44       // Compute PCR digest
45       PCRComputeCurrentDigest(hashAlg,
46                               &in->PCRselect,
47                               &quoted.attested.quote.pcrDigest);
48
49       // Copy PCR select. "PCRselect" is modified in PCRComputeCurrentDigest
50       // function
51       quoted.attested.quote.pcrSelect = in->PCRselect;
52

     Page 166                                 TCG Published                                        Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014                       Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

53       // Sign attestation structure. A NULL signature will be returned if
54       // signHandle is TPM_RH_NULL. TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES
55       // error may be returned by SignAttestInfo.
56       // NOTE: TPM_RC_ATTRIBUTES means that the key is not a signing key but that
57       // was checked above and TPM_RC_KEY was returned. TPM_RC_VALUE means that the
58       // value to sign is too large but that means that the digest is too big and
59       // that can't happen.
60       result = SignAttestInfo(in->signHandle,
61                               &in->inScheme,
62                               &quoted,
63                               &in->qualifyingData,
64                               &out->quoted,
65                               &out->signature);
66       if(result != TPM_RC_SUCCESS)
67           return result;
68
69       // orderly state should be cleared because of the reporting of clock info
70       // if signing happens
71       if(in->signHandle != TPM_RH_NULL)
72           g_clearOrderly = TRUE;
73
74       return TPM_RC_SUCCESS;
75   }
76   #endif // CC_Quote




     Family “2.0”                           TCG Published                                 Page 167
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


18.5     TPM2_GetSessionAuditDigest

18.5.1 General Description

This command returns a digital signature of the audit session digest.

NOTE 1          See 18.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
Endorsement Authorization) 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          If sessionHandle is used as an audit session for this command, the command is audited in the same
                manner as any other command.

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




Page 168                                       TCG Published                                        Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands



18.5.2 Command and Response

                       Table 83 — TPM2_GetSessionAuditDigest Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_GetSessionAuditDigest

                                                    handle of the privacy administrator
                                                    (TPM_RH_ENDORSEMENT)
TPMI_RH_ENDORSEMENT           @privacyAdminHandle
                                                    Auth Index: 1
                                                    Auth Role: USER
                                                    handle of the signing key
TPMI_DH_OBJECT+               @signHandle           Auth Index: 2
                                                    Auth Role: USER
                                                    handle of the audit session
TPMI_SH_HMAC                  sessionHandle
                                                    Auth Index: None

TPM2B_DATA                    qualifyingData        user-provided qualifying data – may be zero-length
                                                    signing scheme to use if the scheme for signHandle is
TPMT_SIG_SCHEME+              inScheme
                                                    TPM_ALG_NULL


                       Table 84 — TPM2_GetSessionAuditDigest Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_ATTEST                  auditInfo             the audit information that was signed
TPMT_SIGNATURE                signature             the signature over auditInfo




Family “2.0”                                 TCG Published                                       Page 169
Level 00 Revision 01.16             Copyright © TCG 2006-2014                             October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     18.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "GetSessionAuditDigest_fp.h"
4    #ifdef TPM_CC_GetSessionAuditDigest // Conditional expansion of this file


     Error Returns                 Meaning

     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 non-
                                   empty default key scheme differs from scheme
     TPM_RC_TYPE                   sessionHandle does not reference an audit session
     TPM_RC_VALUE                  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)

 5   TPM_RC
 6   TPM2_GetSessionAuditDigest(
 7       GetSessionAuditDigest_In      *in,                // IN: input parameter list
 8       GetSessionAuditDigest_Out     *out                // OUT: output parameter list
 9       )
10   {
11       TPM_RC                  result;
12       SESSION                *session;
13       TPMS_ATTEST             auditInfo;
14
15   // Input Validation
16
17       // SessionAuditDigest specific input validation
18       // Get session pointer
19       session = SessionGet(in->sessionHandle);
20
21       // session must be an audit session
22       if(session->attributes.isAudit == CLEAR)
23           return TPM_RC_TYPE + RC_GetSessionAuditDigest_sessionHandle;
24
25   // Command Output
26
27       // Filling in attest information
28       // Common fields
29       result = FillInAttestInfo(in->signHandle,
30                                 &in->inScheme,
31                                 &in->qualifyingData,
32                                 &auditInfo);
33       if(result != TPM_RC_SUCCESS)
34       {
35           if(result == TPM_RC_KEY)
36               return TPM_RC_KEY + RC_GetSessionAuditDigest_signHandle;
37           else
38               return RcSafeAddToResult(result, RC_GetSessionAuditDigest_inScheme);
39       }
40
41       // SessionAuditDigest specific fields
42       // Attestation type
43       auditInfo.type = TPM_ST_ATTEST_SESSION_AUDIT;
44
45       // Copy digest
46       auditInfo.attested.sessionAudit.sessionDigest = session->u2.auditDigest;

     Page 170                                   TCG Published                                          Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

47
48       // Exclusive audit session
49       if(g_exclusiveAuditSession == in->sessionHandle)
50           auditInfo.attested.sessionAudit.exclusiveSession = TRUE;
51       else
52           auditInfo.attested.sessionAudit.exclusiveSession = FALSE;
53
54       // Sign attestation structure. A NULL signature will be returned if
55       // signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
56       // TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
57       // this point
58       result = SignAttestInfo(in->signHandle,
59                               &in->inScheme,
60                               &auditInfo,
61                               &in->qualifyingData,
62                               &out->auditInfo,
63                               &out->signature);
64       if(result != TPM_RC_SUCCESS)
65           return result;
66
67       // orderly state should be cleared because of the reporting of clock info
68       // if signing happens
69       if(in->signHandle != TPM_RH_NULL)
70           g_clearOrderly = TRUE;
71
72       return TPM_RC_SUCCESS;
73   }
74   #endif // CC_GetSessionAuditDigest




     Family “2.0”                           TCG Published                               Page 171
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


18.6     TPM2_GetCommandAuditDigest

18.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 18.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. If signHandle is TPM_RH_NULL, signature is the Empty Buffer and the audit digest is not
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
Endorsement Authorization) as well as authorization to use the key associated with signHandle.




Page 172                                       TCG Published                                        Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



18.6.2 Command and Response

                      Table 85 — TPM2_GetCommandAuditDigest Command
 Type                         Name                   Description

 TPMI_ST_COMMAND_TAG          tag                    TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode            TPM_CC_GetCommandAuditDigest {NV}

                                                     handle of the privacy administrator
                                                     (TPM_RH_ENDORSEMENT)
 TPMI_RH_ENDORSEMENT          @privacyHandle
                                                     Auth Index: 1
                                                     Auth Role: USER
                                                     the handle of the signing key
 TPMI_DH_OBJECT+              @signHandle            Auth Index: 2
                                                     Auth Role: USER

 TPM2B_DATA                   qualifyingData         other data to associate with this audit digest
                                                     signing scheme to use if the scheme for signHandle is
 TPMT_SIG_SCHEME+             inScheme
                                                     TPM_ALG_NULL


                      Table 86 — TPM2_GetCommandAuditDigest Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_ATTEST                  auditInfo             the auditInfo that was signed
TPMT_SIGNATURE                signature             the signature over auditInfo




Family “2.0”                                 TCG Published                                            Page 173
Level 00 Revision 01.16             Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     18.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "GetCommandAuditDigest_fp.h"
4    #ifdef TPM_CC_GetCommandAuditDigest // Conditional expansion of this file


     Error Returns                 Meaning

     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 non-
                                   empty default key scheme differs from scheme
     TPM_RC_VALUE                  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)

 5   TPM_RC
 6   TPM2_GetCommandAuditDigest(
 7       GetCommandAuditDigest_In      *in,                // IN: input parameter list
 8       GetCommandAuditDigest_Out     *out                // OUT: output parameter list
 9       )
10   {
11       TPM_RC                   result;
12       TPMS_ATTEST              auditInfo;
13
14   // Command Output
15
16       // Filling in attest information
17       // Common fields
18       result = FillInAttestInfo(in->signHandle,
19                                 &in->inScheme,
20                                 &in->qualifyingData,
21                                 &auditInfo);
22       if(result != TPM_RC_SUCCESS)
23       {
24           if(result == TPM_RC_KEY)
25               return TPM_RC_KEY + RC_GetCommandAuditDigest_signHandle;
26           else
27               return RcSafeAddToResult(result, RC_GetCommandAuditDigest_inScheme);
28       }
29
30       // CommandAuditDigest specific fields
31       // Attestation type
32       auditInfo.type = TPM_ST_ATTEST_COMMAND_AUDIT;
33
34       // Copy audit hash algorithm
35       auditInfo.attested.commandAudit.digestAlg = gp.auditHashAlg;
36
37       // Copy counter value
38       auditInfo.attested.commandAudit.auditCounter = gp.auditCounter;
39
40       // Copy command audit log
41       auditInfo.attested.commandAudit.auditDigest = gr.commandAuditDigest;
42       CommandAuditGetDigest(&auditInfo.attested.commandAudit.commandDigest);
43
44       //   Sign attestation structure. A NULL signature will be returned if
45       //   signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
46       //   TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
47       //   this point

     Page 174                                   TCG Published                                          Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                                         Part 3: Commands

48       result = SignAttestInfo(in->signHandle,
49                               &in->inScheme,
50                               &auditInfo,
51                               &in->qualifyingData,
52                               &out->auditInfo,
53                               &out->signature);
54
55       if(result != TPM_RC_SUCCESS)
56           return result;
57
58   // Internal Data Update
59
60       if(in->signHandle != TPM_RH_NULL)
61       {
62           // Reset log
63           gr.commandAuditDigest.t.size = 0;
64
65           // orderly state should be cleared because of the update in
66           // commandAuditDigest, as well as the reporting of clock info
67           g_clearOrderly = TRUE;
68       }
69
70       return TPM_RC_SUCCESS;
71   }
72   #endif // CC_GetCommandAuditDigest




     Family “2.0”                            TCG Published                          Page 175
     Level 00 Revision 01.16            Copyright © TCG 2006-2014            October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


18.7     TPM2_GetTime

18.7.1 General Description

This command returns the current values of Time and Clock.

NOTE 1          See 18.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 TPMS_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. This command requires Endorsement
                Authorization.

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




Page 176                                       TCG Published                                         Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands



18.7.2 Command and Response

                                  Table 87 — TPM2_GetTime Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_GetTime

                                                    handle of the privacy administrator
                                                    (TPM_RH_ENDORSEMENT)
TPMI_RH_ENDORSEMENT           @privacyAdminHandle
                                                    Auth Index: 1
                                                    Auth Role: USER
                                                    the keyHandle identifier of a loaded key that can
                                                    perform digital signatures
TPMI_DH_OBJECT+               @signHandle
                                                    Auth Index: 2
                                                    Auth Role: USER

TPM2B_DATA                    qualifyingData        data to tick stamp
                                                    signing scheme to use if the scheme for signHandle is
TPMT_SIG_SCHEME+              inScheme
                                                    TPM_ALG_NULL


                                  Table 88 — TPM2_GetTime Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode          .

TPM2B_ATTEST                  timeInfo              standard TPM-generated attestation block
TPMT_SIGNATURE                signature             the signature over timeInfo




Family “2.0”                                 TCG Published                                        Page 177
Level 00 Revision 01.16              Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                          Trusted Platform Module Library



     18.7.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "GetTime_fp.h"
4    #ifdef TPM_CC_GetTime // Conditional expansion of this file


     Error Returns               Meaning

     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 non-
                                 empty default key scheme differs from scheme
     TPM_RC_VALUE                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)

 5   TPM_RC
 6   TPM2_GetTime(
 7       GetTime_In      *in,             // IN: input parameter list
 8       GetTime_Out     *out             // OUT: output parameter list
 9       )
10   {
11       TPM_RC                 result;
12       TPMS_ATTEST            timeInfo;
13
14   // Command Output
15
16       // Filling in attest information
17       // Common fields
18       result = FillInAttestInfo(in->signHandle,
19                                 &in->inScheme,
20                                 &in->qualifyingData,
21                                 &timeInfo);
22       if(result != TPM_RC_SUCCESS)
23       {
24           if(result == TPM_RC_KEY)
25               return TPM_RC_KEY + RC_GetTime_signHandle;
26           else
27               return RcSafeAddToResult(result, RC_GetTime_inScheme);
28       }
29
30       // GetClock specific fields
31       // Attestation type
32       timeInfo.type = TPM_ST_ATTEST_TIME;
33
34       // current clock in plain text
35       timeInfo.attested.time.time.time = g_time;
36       TimeFillInfo(&timeInfo.attested.time.time.clockInfo);
37
38       // Firmware version in plain text
39       timeInfo.attested.time.firmwareVersion
40           = ((UINT64) gp.firmwareV1) << 32;
41       timeInfo.attested.time.firmwareVersion += gp.firmwareV2;
42
43       // Sign attestation structure. A NULL signature will be returned if
44       // signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
45       // TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
46       // this point
47       result = SignAttestInfo(in->signHandle,

     Page 178                                  TCG Published                                         Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

48                               &in->inScheme,
49                               &timeInfo,
50                               &in->qualifyingData,
51                               &out->timeInfo,
52                               &out->signature);
53       if(result != TPM_RC_SUCCESS)
54           return result;
55
56       // orderly state should be cleared because of the reporting of clock info
57       // if signing happens
58       if(in->signHandle != TPM_RH_NULL)
59           g_clearOrderly = TRUE;
60
61       return TPM_RC_SUCCESS;
62   }
63   #endif // CC_GetTime




     Family “2.0”                           TCG Published                               Page 179
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


19     Ephemeral EC Keys

19.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 TPM-
generated 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
TPM 2.0 Part 1.




Page 180                                      TCG Published                                        Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



19.2   TPM2_Commit

19.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) and the signing
scheme must be anonymous (TPM_RC_SCHEME). Currently, TPM_ALG_ECDAA is the only defined
anonymous scheme.

NOTE           This command cannot be used with a sign+decrypt key because that type of key is req uired to have
               a scheme of TPM_ALG_NULL.

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.
The algorithm is specified in the TPM 2.0 Part 1 Annex for ECC, TPM2_Commit().




Family “2.0”                                 TCG Published                                          Page 181
Level 00 Revision 01.16              Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                 Trusted Platform Module Library



19.2.2 Command and Response

                        Table 89 — TPM2_Commit Command
Type                    Name                Description

TPMI_ST_COMMAND_TAG     tag                 TPM_ST_SESSIONS

UINT32                  commandSize

TPM_CC                  commandCode         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 6

UINT32                  responseSize

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 182                           TCG Published                                        Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                                                      Part 3: Commands


     19.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Commit_fp.h"
3    #ifdef TPM_CC_Commit // Conditional expansion of this file
4    #ifdef TPM_ALG_ECC


     Error Returns                     Meaning

     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                     the scheme of keyHandle is not an anonymous scheme
     TPM_RC_NO_RESULT                  K, L or E was a point at infinity; or failed to generate r value
     TPM_RC_SIZE                       s2 is empty but y2 is not or s2 provided but y2 is not

 5   TPM_RC
 6   TPM2_Commit(
 7       Commit_In         *in,                 // IN: input parameter list
 8       Commit_Out        *out                 // OUT: output parameter list
 9       )
10   {
11       OBJECT                    *eccKey;
12       TPMS_ECC_POINT             P2;
13       TPMS_ECC_POINT            *pP2 = NULL;
14       TPMS_ECC_POINT            *pP1 = NULL;
15       TPM2B_ECC_PARAMETER        r;
16       TPM2B                     *p;
17       TPM_RC                     result;
18       TPMS_ECC_PARMS            *parms;
19
20   // Input Validation
21
22       eccKey = ObjectGet(in->signHandle);
23       parms = & eccKey->publicArea.parameters.eccDetail;
24
25       // Input key must be an ECC key
26       if(eccKey->publicArea.type != TPM_ALG_ECC)
27           return TPM_RC_KEY + RC_Commit_signHandle;
28
29        // This command may only be used with a sign-only key using an anonymous
30        // scheme.
31        // NOTE: a sign + decrypt key has no scheme so it will not be an anonymous one
32        // and an unrestricted sign key might no have a signing scheme but it can't
33        // be use in Commit()
34       if(!CryptIsSchemeAnonymous(parms->scheme.scheme))
35                return TPM_RC_SCHEME + RC_Commit_signHandle;
36
37       // Make sure that both parts of P2 are present if either is present
38       if((in->s2.t.size == 0) != (in->y2.t.size == 0))
39           return TPM_RC_SIZE + RC_Commit_y2;
40
41       // Get prime modulus for the curve. This is needed later but getting this now
42       // allows confirmation that the curve exists
43       p = (TPM2B *)CryptEccGetParameter('p', parms->curveID);
44
45       // if no p, then the curve ID is bad


     Family “2.0”                                    TCG Published                                               Page 183
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                                     October 30, 2014
      Part 3: Commands                                                  Trusted Platform Module Library

 46      // NOTE: This should never occur if the input unmarshaling code is working
 47      // correctly
 48      pAssert(p != NULL);
 49
 50      // Get the random value that will be used in the point multiplications
 51      // Note: this does not commit the count.
 52      if(!CryptGenerateR(&r, NULL, parms->curveID, &eccKey->name))
 53          return TPM_RC_NO_RESULT;
 54
 55      // Set up P2 if s2 and Y2 are provided
 56      if(in->s2.t.size != 0)
 57      {
 58          pP2 = &P2;
 59
 60          // copy y2 for P2
 61          MemoryCopy2B(&P2.y.b, &in->y2.b, sizeof(P2.y.t.buffer));
 62          // Compute x2 HnameAlg(s2) mod p
 63
 64          //      do the hash operation on s2 with the size of curve 'p'
 65          P2.x.t.size = CryptHashBlock(eccKey->publicArea.nameAlg,
 66                                       in->s2.t.size,
 67                                       in->s2.t.buffer,
 68                                       p->size,
 69                                       P2.x.t.buffer);
 70
 71          // If there were error returns in the hash routine, indicate a problem
 72          // with the hash in
 73          if(P2.x.t.size == 0)
 74              return TPM_RC_HASH + RC_Commit_signHandle;
 75
 76          // set p2.x = hash(s2) mod p
 77          if(CryptDivide(&P2.x.b, p, NULL, &P2.x.b) != TPM_RC_SUCCESS)
 78              return TPM_RC_NO_RESULT;
 79
 80          if(!CryptEccIsPointOnCurve(parms->curveID, pP2))
 81              return TPM_RC_ECC_POINT + RC_Commit_s2;
 82
 83          if(eccKey->attributes.publicOnly == SET)
 84              return TPM_RC_KEY + RC_Commit_signHandle;
 85
 86      }
 87      // If there is a P1, make sure that it is on the curve
 88      // NOTE: an "empty" point has two UINT16 values which are the size values
 89      // for each of the coordinates.
 90      if(in->P1.t.size > 4)
 91      {
 92          pP1 = &in->P1.t.point;
 93          if(!CryptEccIsPointOnCurve(parms->curveID, pP1))
 94              return TPM_RC_ECC_POINT + RC_Commit_P1;
 95      }
 96
 97      // Pass the parameters to CryptCommit.
 98      // The work is not done in-line because it does several point multiplies
 99      // with the same curve. There is significant optimization by not
100      // having to reload the curve parameters multiple times.
101      result = CryptCommitCompute(&out->K.t.point,
102                                  &out->L.t.point,
103                                  &out->E.t.point,
104                                  parms->curveID,
105                                  pP1,
106                                  pP2,
107                                  &eccKey->sensitive.sensitive.ecc,
108                                  &r);
109      if(result != TPM_RC_SUCCESS)
110          return result;
111

      Page 184                              TCG Published                                 Family “2.0”
      October 30, 2014               Copyright © TCG 2006-2014                Level 00 Revision 01.16
      Trusted Platform Module Library                                             Part 3: Commands

112       out->K.t.size = TPMS_ECC_POINT_Marshal(&out->K.t.point, NULL, NULL);
113       out->L.t.size = TPMS_ECC_POINT_Marshal(&out->L.t.point, NULL, NULL);
114       out->E.t.size = TPMS_ECC_POINT_Marshal(&out->E.t.point, NULL, NULL);
115
116       // The commit computation was successful so complete the commit by setting
117       // the bit
118       out->counter = CryptCommit();
119
120       return TPM_RC_SUCCESS;
121   }
122   #endif
123   #endif // CC_Commit




      Family “2.0”                           TCG Published                               Page 185
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



19.3   TPM2_EC_Ephemeral

19.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 186                                TCG Published                                Family “2.0”
October 30, 2014                  Copyright © TCG 2006-2014              Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands



19.3.2 Command and Response

                            Table 91 — TPM2_EC_Ephemeral Command
Type                              Name                Description

                                                      TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG               tag
                                                      present; otherwise, TPM_ST_NO_SESSIONS

UINT32                            commandSize

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 6

UINT32                            responseSize

TPM_RC                            responseCode

TPM2B_ECC_POINT                   Q                   ephemeral public key Q ≔ [r]G

UINT16                            counter             least-significant 16 bits of commitCount




Family “2.0”                                 TCG Published                                         Page 187
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                     Trusted Platform Module Library


     19.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "EC_Ephemeral_fp.h"
3    #ifdef TPM_CC_EC_Ephemeral // Conditional expansion of this file
4    #ifdef TPM_ALG_ECC


     Error Returns                    Meaning

     none                             ...

 5   TPM_RC
 6   TPM2_EC_Ephemeral(
 7       EC_Ephemeral_In       *in,               // IN: input parameter list
 8       EC_Ephemeral_Out      *out               // OUT: output parameter list
 9       )
10   {
11       TPM2B_ECC_PARAMETER          r;
12
13       // Get the random value that will be used in the point multiplications
14       // Note: this does not commit the count.
15       if(!CryptGenerateR(&r,
16                          NULL,
17                          in->curveID,
18                          NULL))
19           return TPM_RC_NO_RESULT;
20
21       CryptEccPointMultiply(&out->Q.t.point, in->curveID, &r, NULL);
22
23       // commit the count value
24       out->counter = CryptCommit();
25
26       return TPM_RC_SUCCESS;
27   }
28   #endif
29   #endif // CC_EC_Ephemeral




     Page 188                                    TCG Published                               Family “2.0”
     October 30, 2014                       Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands


20     Signing and Signature Verification

20.1     TPM2_VerifySignature

20.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”                                 TCG Published                                         Page 189
Level 00 Revision 01.16              Copyright © TCG 2006-2014                            October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


20.1.2 Command and Response

                      Table 93 — TPM2_VerifySignature Command
Type                    Name                  Description

                                              TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG     tag
                                              present; otherwise, TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode           TPM_CC_VerifySignature

                                              handle of public key that will be used in the validation
TPMI_DH_OBJECT          keyHandle
                                              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 6
UINT32                  responseSize
TPM_RC                  responseCode

TPMT_TK_VERIFIED        validation




Page 190                               TCG Published                                      Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                                               Part 3: Commands



     20.1.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "VerifySignature_fp.h"
3    #ifdef TPM_CC_VerifySignature // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_ATTRIBUTES                 keyHandle does not reference a signing key
     TPM_RC_SIGNATURE                  signature is not genuine
     TPM_RC_SCHEME                     CryptVerifySignature()
     TPM_RC_HANDLE                     the input handle is references an HMAC key but the private portion is
                                       not loaded

 4   TPM_RC
 5   TPM2_VerifySignature(
 6       VerifySignature_In        *in,                   // IN: input parameter list
 7       VerifySignature_Out       *out                   // OUT: output parameter list
 8       )
 9   {
10       TPM_RC                     result;
11       TPM2B_NAME                 name;
12       OBJECT                    *signObject;
13       TPMI_RH_HIERARCHY          hierarchy;
14
15   // Input Validation
16
17       // Get sign object pointer
18       signObject = ObjectGet(in->keyHandle);
19
20       // The object to validate the signature must be a signing key.
21       if(signObject->publicArea.objectAttributes.sign != SET)
22           return TPM_RC_ATTRIBUTES + RC_VerifySignature_keyHandle;
23
24       // Validate Signature. TPM_RC_SCHEME, TPM_RC_HANDLE or TPM_RC_SIGNATURE
25       // error may be returned by CryptCVerifySignatrue()
26       result = CryptVerifySignature(in->keyHandle, &in->digest, &in->signature);
27       if(result != TPM_RC_SUCCESS)
28           return RcSafeAddToResult(result, RC_VerifySignature_signature);
29
30   // Command Output
31
32       hierarchy = ObjectGetHierarchy(in->keyHandle);
33       if(   hierarchy == TPM_RH_NULL
34          || signObject->publicArea.nameAlg == TPM_ALG_NULL)
35       {
36           // produce empty ticket if hierarchy is TPM_RH_NULL or nameAlg is
37           // TPM_ALG_NULL
38           out->validation.tag = TPM_ST_VERIFIED;
39           out->validation.hierarchy = TPM_RH_NULL;
40           out->validation.digest.t.size = 0;
41       }
42       else
43       {
44           // Get object name that verifies the signature
45           name.t.size = ObjectGetName(in->keyHandle, &name.t.name);
46           // Compute ticket
47           TicketComputeVerified(hierarchy, &in->digest, &name, &out->validation);
48       }
49
50       return TPM_RC_SUCCESS;

     Family “2.0”                                  TCG Published                                               Page 191
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
     Part 3: Commands                                           Trusted Platform Module Library

51   }
52   #endif // CC_VerifySignature




     Page 192                            TCG Published                            Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014        Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


20.2     TPM2_Sign

20.2.1 General Description

This command causes the TPM to sign an externally provided hash with the specified symmetric or
asymmetric signing key.

NOTE 1          Symmetric “signing” is done with the TPM HMAC commands.

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 uses a hash algorithm, the algorithm is defined in the qualifying data of
                the scheme. This is the same algorithm that is required to be used in producing digest. The size of
                digest must match that of the hash algorithm in 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.
If validation is provided, then the hash algorithm used in computing the digest is required to be the hash
algorithm specified in the scheme of keyHandle (TPM_RC_TICKET).
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.

NOTE 4          If keyHandle is both a sign and decrypt key, keyHandle will have an scheme of TPM_ALG_NULL. If
                validation is provided, then it must be a NULL validation ticket or the ticket validation will fail.




Family “2.0”                                   TCG Published                                            Page 193
Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library


20.2.2 Command and Response

                             Table 95 — TPM2_Sign Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_Sign

                                             Handle of key that will perform signing
TPMI_DH_OBJECT         @keyHandle            Auth Index: 1
                                             Auth Role: USER

TPM2B_DIGEST           digest                digest to be signed
                                             signing scheme to use if the scheme for keyHandle is
TPMT_SIG_SCHEME+       inScheme
                                             TPM_ALG_NULL
                                             proof that digest was created by the TPM
TPMT_TK_HASHCHECK      validation            If keyHandle is not a restricted signing key, then this
                                             may be a NULL Ticket with tag =
                                             TPM_ST_CHECKHASH.


                             Table 96 — TPM2_Sign Response
Type                   Name                  Description

TPM_ST                 tag                   see clause 6
UINT32                 responseSize
TPM_RC                 responseCode

TPMT_SIGNATURE         signature             the signature




Page 194                              TCG Published                                       Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     20.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Sign_fp.h"
3    #ifdef TPM_CC_Sign // Conditional expansion of this file
4    #include "Attest_spt_fp.h"


     Error Returns                     Meaning

     TPM_RC_BINDING                    The public and private portions of the key are not properly bound.
     TPM_RC_KEY                        signHandle does not reference a signing key;
     TPM_RC_SCHEME                     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_TICKET                     validation is not a valid ticket
     TPM_RC_VALUE                      the value to sign is larger than allowed for the type of keyHandle

 5   TPM_RC
 6   TPM2_Sign(
 7       Sign_In          *in,                   // IN: input parameter list
 8       Sign_Out         *out                   // OUT: output parameter list
 9       )
10   {
11       TPM_RC                     result;
12       TPMT_TK_HASHCHECK          ticket;
13       OBJECT                    *signKey;
14
15   // Input Validation
16       // Get sign key pointer
17       signKey = ObjectGet(in->keyHandle);
18
19       // pick a scheme for sign. If the input sign scheme is not compatible with
20       // the default scheme, return an error.
21       result = CryptSelectSignScheme(in->keyHandle, &in->inScheme);
22       if(result != TPM_RC_SUCCESS)
23       {
24           if(result == TPM_RC_KEY)
25               return TPM_RC_KEY + RC_Sign_keyHandle;
26           else
27               return RcSafeAddToResult(result, RC_Sign_inScheme);
28       }
29
30       // If validation is provided, or the key is restricted, check the ticket
31       if(   in->validation.digest.t.size != 0
32          || signKey->publicArea.objectAttributes.restricted == SET)
33       {
34           // Compute and compare ticket
35           TicketComputeHashCheck(in->validation.hierarchy,
36                                  in->inScheme.details.any.hashAlg,
37                                  &in->digest, &ticket);
38
39           if(!Memory2BEqual(&in->validation.digest.b, &ticket.digest.b))
40               return TPM_RC_TICKET + RC_Sign_validation;
41       }
42       else
43       // If we don't have a ticket, at least verify that the provided 'digest'
44       // is the size of the scheme hashAlg digest.
45       // NOTE: this does not guarantee that the 'digest' is actually produced using
46       // the indicated hash algorithm, but at least it might be.
47       {

     Family “2.0”                                    TCG Published                                           Page 195
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                                October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library

48           if(       in->digest.t.size
49                 != CryptGetHashDigestSize(in->inScheme.details.any.hashAlg))
50                 return TPM_RCS_SIZE + RC_Sign_digest;
51       }
52
53   // Command Output
54       // Sign the hash. A TPM_RC_VALUE or TPM_RC_SCHEME
55       // error may be returned at this point
56       result = CryptSign(in->keyHandle, &in->inScheme, &in->digest, &out->signature);
57
58       return result;
59   }
60   #endif // CC_Sign




     Page 196                                TCG Published                               Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014            Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands


21     Command Audit

21.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

auditAlg, the hash algorithm, is set using TPM2_SetCommandCodeAuditStatus.


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”                                TCG Published                                      Page 197
Level 00 Revision 01.16              Copyright © TCG 2006-2014                        October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library



21.2     TPM2_SetCommandCodeAuditStatus

21.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, the fact that it is in clearList 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 algorith m is the evidence that this command
                was used to change the algorithm.

The commands in setList indicate the commands 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 198                                      TCG Published                                         Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands



21.2.2 Command and Response

                   Table 97 — TPM2_SetCommandCodeAuditStatus Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_SetCommandCodeAuditStatus {NV}

                                                  TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
 TPMI_RH_PROVISION            @auth               Auth Index: 1
                                                  Auth Role: USER

                                                  hash algorithm for the audit digest; if
 TPMI_ALG_HASH+               auditAlg
                                                  TPM_ALG_NULL, then the hash is not changed
                                                  list of commands that will be added to those that will
 TPML_CC                      setList
                                                  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 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                                         Page 199
Level 00 Revision 01.16             Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library



     21.2.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "SetCommandCodeAuditStatus_fp.h"
 3   #ifdef TPM_CC_SetCommandCodeAuditStatus // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_SetCommandCodeAuditStatus(
 6       SetCommandCodeAuditStatus_In      *in             // IN: input parameter list
 7       )
 8   {
 9       TPM_RC          result;
10       UINT32          i;
11       BOOL            changed = FALSE;
12
13       // The command needs NV update. Check if NV is available.
14       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
15       // this point
16       result = NvIsAvailable();
17       if(result != TPM_RC_SUCCESS)
18           return result;
19
20   // Internal Data Update
21
22       // Update hash algorithm
23       if(   in->auditAlg != TPM_ALG_NULL
24          && in->auditAlg != gp.auditHashAlg)
25       {
26           // Can't change the algorithm and command list at the same time
27           if(in->setList.count != 0 || in->clearList.count != 0)
28               return TPM_RC_VALUE + RC_SetCommandCodeAuditStatus_auditAlg;
29
30           // Change the hash algorithm for audit
31           gp.auditHashAlg = in->auditAlg;
32
33           // Set the digest size to a unique value that indicates that the digest
34           // algorithm has been changed. The size will be cleared to zero in the
35           // command audit processing on exit.
36           gr.commandAuditDigest.t.size = 1;
37
38           // Save the change of command audit data (this sets g_updateNV so that NV
39           // will be updated on exit.)
40           NvWriteReserved(NV_AUDIT_HASH_ALG, &gp.auditHashAlg);
41
42       } else {
43
44           // Process set list
45           for(i = 0; i < in->setList.count; i++)
46
47                // If change is made in CommandAuditSet, set changed flag
48                if(CommandAuditSet(in->setList.commandCodes[i]))
49                    changed = TRUE;
50
51           // Process clear list
52           for(i = 0; i < in->clearList.count; i++)
53               // If change is made in CommandAuditClear, set changed flag
54               if(CommandAuditClear(in->clearList.commandCodes[i]))
55                   changed = TRUE;
56
57           // if change was made to command list, update NV
58           if(changed)
59               // this sets g_updateNV so that NV will be updated on exit.
60               NvWriteReserved(NV_AUDIT_COMMANDS, &gp.auditComands);
61       }
62

     Page 200                                    TCG Published                           Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014             Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

63       return TPM_RC_SUCCESS;
64   }
65   #endif // CC_SetCommandCodeAuditStatus




     Family “2.0”                             TCG Published               Page 201
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                             Trusted Platform Module Library


22     Integrity Collection (PCR)

22.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 because these PCR
                are changed at the whim of the TCB and may not represent the trust state of the platform.




Page 202                                      TCG Published                                         Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                                    Part 3: Commands


22.2     TPM2_PCR_Extend

22.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 values 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 i nto the SHA1 bank and a SHA256 digest would be Extended into
                  the 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 selector (pcrHandle)
         alg                                  the PCR algorithm selector for the digest
         data[alg].buffer                     the bank-specific data to be extended


If no digest value is specified for a bank, then the PCR in that bank is 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. This permits the caller to probe for implemented hash
algorithms as an alternative to TPM2_GetCapability.

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”                                      TCG Published                                              Page 203
Level 00 Revision 01.16                  Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library


22.2.2 Command and Response

                      Table 99 — TPM2_PCR_Extend Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_PCR_Extend {NV}

                                             handle of the PCR
TPMI_DH_PCR+           @pcrHandle            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 6
UINT32                 responseSize
TPM_RC                 responseCode          .




Page 204                              TCG Published                                        Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                               Part 3: Commands



     22.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PCR_Extend_fp.h"
3    #ifdef TPM_CC_PCR_Extend // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_LOCALITY                   current command locality is not allowed to extend the PCR
                                       referenced by pcrHandle

 4   TPM_RC
 5   TPM2_PCR_Extend(
 6       PCR_Extend_In     *in                 // IN: input parameter list
 7       )
 8   {
 9       TPM_RC                  result;
10       UINT32                  i;
11
12   // Input Validation
13
14       //   NOTE: This function assumes that the unmarshaling function for 'digests' will
15       //   have validated that all of the indicated hash algorithms are valid. If the
16       //   hash algorithms are correct, the unmarshaling code will unmarshal a digest
17       //   of the size indicated by the hash algorithm. If the overall size is not
18       //   consistent, the unmarshaling code will run out of input data or have input
19       //   data left over. In either case, it will cause an unmarshaling error and this
20       //   function will not be called.
21
22       // For NULL handle, do nothing and return success
23       if(in->pcrHandle == TPM_RH_NULL)
24           return TPM_RC_SUCCESS;
25
26       // Check if the extend operation is allowed by the current command locality
27       if(!PCRIsExtendAllowed(in->pcrHandle))
28           return TPM_RC_LOCALITY;
29
30       // If PCR is state saved and we need to update orderlyState, check NV
31       // availability
32       if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
33       {
34           result = NvIsAvailable();
35           if(result != TPM_RC_SUCCESS) return result;
36           g_clearOrderly = TRUE;
37       }
38
39   // Internal Data Update
40
41       // Iterate input digest list to extend
42       for(i = 0; i < in->digests.count; i++)
43       {
44           PCRExtend(in->pcrHandle, in->digests.digests[i].hashAlg,
45                     CryptGetHashDigestSize(in->digests.digests[i].hashAlg),
46                     (BYTE *) &in->digests.digests[i].digest);
47       }
48
49       return TPM_RC_SUCCESS;
50   }
51   #endif // CC_PCR_Extend




     Family “2.0”                                  TCG Published                                          Page 205
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                             Trusted Platform Module Library


22.3   TPM2_PCR_Event

22.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, the 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.
If pcrHandle is TPM_RH_NULL, the TPM may return either an empty list or a digest for each bank.

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 206                                      TCG Published                                       Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                  Part 3: Commands


22.3.2 Command and Response

                             Table 101 — TPM2_PCR_Event Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_PCR_Event {NV}

                                                    Handle of the PCR
TPMI_DH_PCR+                  @pcrHandle            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 6
UINT32                        responseSize
TPM_RC                        responseCode          .

TPML_DIGEST_VALUES            digests




Family “2.0”                                 TCG Published                              Page 207
Level 00 Revision 01.16             Copyright © TCG 2006-2014                    October 30, 2014
     Part 3: Commands                                                          Trusted Platform Module Library



     22.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PCR_Event_fp.h"
3    #ifdef TPM_CC_PCR_Event // Conditional expansion of this file


     Error Returns                 Meaning

     TPM_RC_LOCALITY               current command locality is not allowed to extend the PCR
                                   referenced by pcrHandle

 4   TPM_RC
 5   TPM2_PCR_Event(
 6       PCR_Event_In      *in,             // IN: input parameter list
 7       PCR_Event_Out     *out             // OUT: output parameter list
 8       )
 9   {
10       TPM_RC                result;
11       HASH_STATE            hashState;
12       UINT32                i;
13       UINT16                size;
14
15   // Input Validation
16
17       // If a PCR extend is required
18       if(in->pcrHandle != TPM_RH_NULL)
19       {
20           // If the PCR is not allow to extend, return error
21           if(!PCRIsExtendAllowed(in->pcrHandle))
22               return TPM_RC_LOCALITY;
23
24           // If PCR is state saved and we need to update orderlyState, check NV
25           // availability
26           if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
27           {
28               result = NvIsAvailable();
29               if(result != TPM_RC_SUCCESS) return result;
30               g_clearOrderly = TRUE;
31           }
32       }
33
34   // Internal Data Update
35
36       out->digests.count = HASH_COUNT;
37
38       // Iterate supported PCR bank algorithms to extend
39       for(i = 0; i < HASH_COUNT; i++)
40       {
41           TPM_ALG_ID hash = CryptGetHashAlgByIndex(i);
42           out->digests.digests[i].hashAlg = hash;
43           size = CryptStartHash(hash, &hashState);
44           CryptUpdateDigest2B(&hashState, &in->eventData.b);
45           CryptCompleteHash(&hashState, size,
46                             (BYTE *) &out->digests.digests[i].digest);
47           if(in->pcrHandle != TPM_RH_NULL)
48               PCRExtend(in->pcrHandle, hash, size,
49                         (BYTE *) &out->digests.digests[i].digest);
50       }
51
52       return TPM_RC_SUCCESS;
53   }
54   #endif // CC_PCR_Event


     Page 208                                  TCG Published                                     Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                                 Part 3: Commands


22.4   TPM2_PCR_Read

22.4.1 General Description

This command returns the values of all PCR specified in pcrSelectionIn.
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 TPM 2.0 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 pcrValues.
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”                                   TCG Published                                              Page 209
Level 00 Revision 01.16                Copyright © TCG 2006-2014                                October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library



22.4.2 Command and Response

                      Table 103 — TPM2_PCR_Read Command
Type                   Name                  Description

                                             TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG    tag
                                             otherwise, TPM_ST_NO_SESSIONS
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 6
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
                                             the contents of the PCR indicated in pcrSelect as
TPML_DIGEST            pcrValues
                                             tagged digests




Page 210                              TCG Published                                    Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                      Level 00 Revision 01.16
     Trusted Platform Module Library                                            Part 3: Commands



     22.4.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PCR_Read_fp.h"
 3   #ifdef TPM_CC_PCR_Read // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_PCR_Read(
 6       PCR_Read_In      *in,            // IN: input parameter list
 7       PCR_Read_Out     *out            // OUT: output parameter list
 8       )
 9   {
10   // Command Output
11
12       // Call PCR read function. input pcrSelectionIn parameter could be changed
13       // to reflect the actual PCR being returned
14       PCRRead(&in->pcrSelectionIn, &out->pcrValues, &out->pcrUpdateCounter);
15
16       out->pcrSelectionOut = in->pcrSelectionIn;
17
18       return TPM_RC_SUCCESS;
19   }
20   #endif // CC_PCR_Read




     Family “2.0”                            TCG Published                             Page 211
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


22.5     TPM2_PCR_Allocate

22.5.1 General Description

This command is used to set the desired PCR allocation of PCR and algorithms. This command requires
Platform Authorization.
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 this command is received multiple times before a
TPM2_Startup(TPM_SU_CLEAR), each one overwrites the previous stored allocation.
This command will only change the allocations of banks that are listed in pcrAllocation.
EXAMPLE      If a TPM supports SHA1 and SHA256, then it maintains an allocation for two banks (one of which could
             be empty). If a TPM_PCR_ALLOCATE() only has a selector for the SHA1 bank, then only the allocation
             of the SHA1 bank will be changed and the SHA256 bank will re main unchanged. To change the
             allocation of a TPM from 24 SHA1 PCR and no SHA256 PCR to 24 SHA256 PCR and no SHA1 PCR, the
             pcrAllocation would have to have two selections: one for the empty SHA1 bank and one for the SHA256
             bank with 24 PCR.


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.
When PCR are allocated, if DRTM_PCR is defined, the resulting allocation must have at least one bank
with the D-RTM PCR allocated. If HCRTM_PCR is defined, the resulting allocation must have at least
one bank with the HCRTM_PCR allocated. If not, the TPM returns TPM_RC_PCR.
The TPM may return TPM_RC_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. Alternatively, if the request fails, The TPM may return
TPM_RC_NO_RESULT.

NOTE 1          An example for this type of failure is a TPM that can only support one bank at a time and cannot
                support arbitrary distribution of PCR among banks.

After this command, TPM2_Shutdown() is only allowed to have a startupType equal to TPM_SU_CLEAR.

NOTE 2          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 implementat ion. 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 212                                      TCG Published                                        Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands


22.5.2 Command and Response

                           Table 105 — TPM2_PCR_Allocate Command
Type                          Name                   Description

TPMI_ST_COMMAND_TAG           tag                    TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PCR_Allocate {NV}

                                                     TPM_RH_PLATFORM+{PP}
TPMI_RH_PLATFORM              @authHandle            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 6
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
                                                     Number of octets available. Computed before the
UINT32                        sizeAvailable
                                                     allocation.




Family “2.0”                                  TCG Published                                        Page 213
Level 00 Revision 01.16             Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     22.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PCR_Allocate_fp.h"
3    #ifdef TPM_CC_PCR_Allocate // Conditional expansion of this file


     Error Returns                    Meaning

     TPM_RC_PCR                       the allocation did not have required PCR
     TPM_RC_NV_UNAVAILABLE            NV is not accessible
     TPM_RC_NV_RATE                   NV is in a rate-limiting mode

 4   TPM_RC
 5   TPM2_PCR_Allocate(
 6       PCR_Allocate_In       *in,                 // IN: input parameter list
 7       PCR_Allocate_Out      *out                 // OUT: output parameter list
 8       )
 9   {
10       TPM_RC      result;
11
12       // The command needs NV update. Check if NV is available.
13       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
14       // this point.
15       // Note: These codes are not listed in the return values above because it is
16       // an implementation choice to check in this routine rather than in a common
17       // function that is called before these actions are called. These return values
18       // are described in the Response Code section of Part 3.
19       result = NvIsAvailable();
20       if(result != TPM_RC_SUCCESS)
21           return result;
22
23   // Command Output
24
25       // Call PCR Allocation function.
26       result = PCRAllocate(&in->pcrAllocation, &out->maxPCR,
27                                            &out->sizeNeeded, &out->sizeAvailable);
28       if(result == TPM_RC_PCR)
29           return result;
30
31       //
32       out->allocationSuccess = (result == TPM_RC_SUCCESS);
33
34       // if re-configuration succeeds, set the flag to indicate PCR configuration is
35       // going to be changed in next boot
36       if(out->allocationSuccess == YES)
37           g_pcrReConfig = TRUE;
38
39       return TPM_RC_SUCCESS;
40   }
41   #endif // CC_PCR_Allocate




     Page 214                                      TCG Published                                   Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                               Part 3: Commands


22.6     TPM2_PCR_SetAuthPolicy

22.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”                                  TCG Published                                            Page 215
Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library


22.6.2 Command and Response

                   Table 107 — TPM2_PCR_SetAuthPolicy Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_PCR_SetAuthPolicy {NV}

                                             TPM_RH_PLATFORM+{PP}
TPMI_RH_PLATFORM       @authHandle           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 6
UINT32                 responseSize
TPM_RC                 responseCode




Page 216                              TCG Published                                      Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     22.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PCR_SetAuthPolicy_fp.h"
3    #ifdef TPM_CC_PCR_SetAuthPolicy // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_SIZE                       size of authPolicy is not the size of a digest produced by policyDigest
     TPM_RC_VALUE                      PCR referenced by pcrNum is not a member of a PCR policy group

 4   TPM_RC
 5   TPM2_PCR_SetAuthPolicy(
 6       PCR_SetAuthPolicy_In       *in                   // IN: input parameter list
 7       )
 8   {
 9       UINT32       groupIndex;
10
11       TPM_RC       result;
12
13       // The command needs NV update. Check if NV is available.
14       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
15       // this point
16       result = NvIsAvailable();
17       if(result != TPM_RC_SUCCESS) return result;
18
19   // Input Validation:
20
21       // Check the authPolicy consistent with hash algorithm
22       if(in->authPolicy.t.size != CryptGetHashDigestSize(in->hashAlg))
23           return TPM_RC_SIZE + RC_PCR_SetAuthPolicy_authPolicy;
24
25       // If PCR does not belong to a policy group, return TPM_RC_VALUE
26       if(!PCRBelongsPolicyGroup(in->pcrNum, &groupIndex))
27           return TPM_RC_VALUE + RC_PCR_SetAuthPolicy_pcrNum;
28
29   // Internal Data Update
30
31       // Set PCR policy
32       gp.pcrPolicies.hashAlg[groupIndex] = in->hashAlg;
33       gp.pcrPolicies.policy[groupIndex] = in->authPolicy;
34
35       // Save new policy to NV
36       NvWriteReserved(NV_PCR_POLICIES, &gp.pcrPolicies);
37
38       return TPM_RC_SUCCESS;
39   }
40   #endif // CC_PCR_SetAuthPolicy




     Family “2.0”                                   TCG Published                                                Page 217
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                      Trusted Platform Module Library


22.7   TPM2_PCR_SetAuthValue

22.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 218                                  TCG Published                                 Family “2.0”
October 30, 2014                   Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands



22.7.2 Command and Response

                          Table 109 — TPM2_PCR_SetAuthValue Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_PCR_SetAuthValue

                                                    handle for a PCR that may have an authorization value
                                                    set
TPMI_DH_PCR                   @pcrHandle
                                                    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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                      Page 219
Level 00 Revision 01.16              Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                       Trusted Platform Module Library



     22.7.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PCR_SetAuthValue_fp.h"
3    #ifdef TPM_CC_PCR_SetAuthValue // Conditional expansion of this file


     Error Returns                 Meaning

     TPM_RC_VALUE                  PCR referenced by pcrHandle is not a member of a PCR
                                   authorization group

 4   TPM_RC
 5   TPM2_PCR_SetAuthValue(
 6       PCR_SetAuthValue_In       *in              // IN: input parameter list
 7       )
 8   {
 9       UINT32      groupIndex;
10       TPM_RC      result;
11
12   // Input Validation:
13
14       // If PCR does not belong to an auth group, return TPM_RC_VALUE
15       if(!PCRBelongsAuthGroup(in->pcrHandle, &groupIndex))
16           return TPM_RC_VALUE;
17
18       // The command may cause the orderlyState to be cleared due to the update of
19       // state clear data. If this is the case, Check if NV is available.
20       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
21       // this point
22       if(gp.orderlyState != SHUTDOWN_NONE)
23       {
24           result = NvIsAvailable();
25           if(result != TPM_RC_SUCCESS) return result;
26           g_clearOrderly = TRUE;
27       }
28
29   // Internal Data Update
30
31       // Set PCR authValue
32       gc.pcrAuthValues.auth[groupIndex] = in->auth;
33
34       return TPM_RC_SUCCESS;
35   }
36   #endif // CC_PCR_SetAuthValue




     Page 220                                 TCG Published                                   Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                Level 00 Revision 01.16
Trusted Platform Module Library                                                             Part 3: Commands


22.8     TPM2_PCR_Reset

22.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 TPM 2.0 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”                                 TCG Published                                            Page 221
Level 00 Revision 01.16              Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                Trusted Platform Module Library


22.8.2 Command and Response

                      Table 111 — TPM2_PCR_Reset Command
Type                   Name                  Description

TPMI_ST_COMMAND_TAG    tag                   TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode           TPM_CC_PCR_Reset {NV}

                                             the PCR to reset
TPMI_DH_PCR            @pcrHandle            Auth Index: 1
                                             Auth Role: USER


                      Table 112 — TPM2_PCR_Reset Response
Type                   Name                  Description

TPM_ST                 tag                   see clause 6
UINT32                 responseSize
TPM_RC                 responseCode




Page 222                              TCG Published                               Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014               Level 00 Revision 01.16
     Trusted Platform Module Library                                                              Part 3: Commands



     22.8.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PCR_Reset_fp.h"
3    #ifdef TPM_CC_PCR_Reset // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_LOCALITY                   current command locality is not allowed to reset the PCR referenced
                                       by pcrHandle

 4   TPM_RC
 5   TPM2_PCR_Reset(
 6       PCR_Reset_In      *in                 // IN: input parameter list
 7       )
 8   {
 9       TPM_RC        result;
10
11   // Input Validation
12
13       // Check if the reset operation is allowed by the current command locality
14       if(!PCRIsResetAllowed(in->pcrHandle))
15           return TPM_RC_LOCALITY;
16
17       // If PCR is state saved and we need to update orderlyState, check NV
18       // availability
19       if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
20       {
21           result = NvIsAvailable();
22           if(result != TPM_RC_SUCCESS)
23               return result;
24           g_clearOrderly = TRUE;
25       }
26
27   // Internal Data Update
28
29       // Reset selected PCR in all banks to 0
30       PCRSetValue(in->pcrHandle, 0);
31
32       // Indicate that the PCR changed so that pcrCounter will be incremented if
33       // necessary.
34       PCRChanged(in->pcrHandle);
35
36       return TPM_RC_SUCCESS;
37   }
38   #endif // CC_PCR_Reset




     Family “2.0”                                  TCG Published                                             Page 223
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


22.9   _TPM_Hash_Start

22.9.1 Description

This indication from the TPM interface indicates the start of an H-CRTM measurement sequence. On
receipt of this indication, the TPM will initialize an H-CRTM 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 sequence context will always succeed.
A platform-specific specification may allow this indication before TPM2_Startup().

NOTE            If this indication occurs after TPM2_Startup(), i t 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 224                                        TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands


     22.9.2 Detailed Actions

1    #include "InternalRoutines.h"

     This function is called to process a _TPM_Hash_Start() indication.

 2   void
 3   _TPM_Hash_Start(
 4       void
 5       )
 6   {
 7       TPM_RC                 result;
 8       TPMI_DH_OBJECT         handle;
 9
10       // If a DRTM sequence object exists, free it up
11       if(g_DRTMHandle != TPM_RH_UNASSIGNED)
12       {
13           ObjectFlush(g_DRTMHandle);
14           g_DRTMHandle = TPM_RH_UNASSIGNED;
15       }
16
17       // Create an event sequence object and store the handle in global
18       // g_DRTMHandle. A TPM_RC_OBJECT_MEMORY error may be returned at this point
19       // The null value for the 'auth' parameter will cause the sequence structure to
20       // be allocated without being set as present. This keeps the sequence from
21       // being left behind if the sequence is terminated early.
22       result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
23
24       // If a free slot was not available, then free up a slot.
25       if(result != TPM_RC_SUCCESS)
26       {
27           // An implementation does not need to have a fixed relationship between
28           // slot numbers and handle numbers. To handle the general case, scan for
29           // a handle that is assigned and free it for the DRTM sequence.
30           // In the reference implementation, the relationship between handles and
31           // slots is fixed. So, if the call to ObjectCreateEvenSequence()
32           // failed indicating that all slots are occupied, then the first handle we
33           // are going to check (TRANSIENT_FIRST) will be occupied. It will be freed
34           // so that it can be assigned for use as the DRTM sequence object.
35           for(handle = TRANSIENT_FIRST; handle < TRANSIENT_LAST; handle++)
36           {
37               // try to flush the first object
38               if(ObjectIsPresent(handle))
39                   break;
40           }
41           // If the first call to find a slot fails but none of the slots is occupied
42           // then there's a big problem
43           pAssert(handle < TRANSIENT_LAST);
44
45            // Free the slot
46            ObjectFlush(handle);
47
48            // Try to create an event sequence object again. This time, we must
49            // succeed.
50            result = ObjectCreateEventSequence(NULL, &g_DRTMHandle);
51            pAssert(result == TPM_RC_SUCCESS);
52       }
53
54       return;
55   }




     Family “2.0”                                TCG Published                             Page 225
     Level 00 Revision 01.16              Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                      Trusted Platform Module Library


22.10 _TPM_Hash_Data

22.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 H-CRTM Event Sequence 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 H-CRTM Event Sequence context exists, this indication is discarded and no other action is
performed.




Page 226                                  TCG Published                                 Family “2.0”
October 30, 2014                   Copyright © TCG 2006-2014                Level 00 Revision 01.16
     Trusted Platform Module Library                                               Part 3: Commands



     22.10.2      Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Platform.h"
3    #include "PCR_fp.h"

     This function is called to process a _TPM_Hash_Data() indication.

 4   void
 5   _TPM_Hash_Data(
 6       UINT32             dataSize,        // IN: size of data to be extend
 7       BYTE              *data             // IN: data buffer
 8       )
 9   {
10       UINT32             i;
11       HASH_OBJECT       *hashObject;
12       TPMI_DH_PCR        pcrHandle = TPMIsStarted()
13                                     ? PCR_FIRST + DRTM_PCR : PCR_FIRST + HCRTM_PCR;
14
15       // If there is no DRTM sequence object, then _TPM_Hash_Start
16       // was not called so this function returns without doing
17       // anything.
18       if(g_DRTMHandle == TPM_RH_UNASSIGNED)
19           return;
20
21       hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
22       pAssert(hashObject->attributes.eventSeq);
23
24       // For each of the implemented hash algorithms, update the digest with the
25       // data provided.
26       for(i = 0; i < HASH_COUNT; i++)
27       {
28           // make sure that the PCR is implemented for this algorithm
29           if(PcrIsAllocated(pcrHandle,
30                               hashObject->state.hashState[i].state.hashAlg))
31               // Update sequence object
32               CryptUpdateDigest(&hashObject->state.hashState[i], dataSize, data);
33       }
34
35       return;
36   }




     Family “2.0”                               TCG Published                             Page 227
     Level 00 Revision 01.16             Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                   Trusted Platform Module Library


22.11 _TPM_Hash_End

22.11.1       Description

This indication from the TPM interface indicates the end of the H-CRTM measurement. This indication is
discarded and no other action performed if the TPM does not contain an H-CRTM Event Sequence
context.

NOTE 1              An H-CRTM Event Sequence context is created by _TPM_Hash_Start().

If the H-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 D-RTM PCR (PCR[17]).
                       PCR[17][hashAlg] ≔ HhashAlg (initial_value || HhashAlg (hash_data))                          (7)
where
          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))                               (8)

NOTE 2              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.

NOTE 3              PCR[0] does not need to be updated according to (8) until the end of TPM2_Startup().




Page 228                                          TCG Published                                            Family “2.0”
October 30, 2014                          Copyright © TCG 2006-2014                      Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands


     22.11.2       Detailed Actions

1    #include "InternalRoutines.h"

     This function is called to process a _TPM_Hash_End() indication.

 2   void
 3   _TPM_Hash_End(
 4       void
 5       )
 6   {
 7
 8       UINT32            i;
 9       TPM2B_DIGEST      digest;
10       HASH_OBJECT      *hashObject;
11       TPMI_DH_PCR       pcrHandle;
12
13       // If the DRTM handle is not being used, then either _TPM_Hash_Start has not
14       // been called, _TPM_Hash_End was previously called, or some other command
15       // was executed and the sequence was aborted.
16       if(g_DRTMHandle == TPM_RH_UNASSIGNED)
17           return;
18
19       // Get DRTM sequence object
20       hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
21
22       // Is this _TPM_Hash_End after Startup or before
23       if(TPMIsStarted())
24       {
25           // After
26
27             // Reset the DRTM PCR
28             PCRResetDynamics();
29
30             // Extend the DRTM_PCR.
31             pcrHandle = PCR_FIRST + DRTM_PCR;
32
33             // DRTM sequence increments restartCount
34             gr.restartCount++;
35       }
36       else
37       {
38           pcrHandle = PCR_FIRST + HCRTM_PCR;
39       }
40
41       // Complete hash and extend PCR, or if this is an HCRTM, complete
42       // the hash, reset the H-CRTM register (PCR[0]) to 0...04, and then
43       // extend the H-CRTM data
44       for(i = 0; i < HASH_COUNT; i++)
45       {
46           TPMI_ALG_HASH       hash = CryptGetHashAlgByIndex(i);
47           // make sure that the PCR is implemented for this algorithm
48           if(PcrIsAllocated(pcrHandle,
49                               hashObject->state.hashState[i].state.hashAlg))
50           {
51               // Complete hash
52               digest.t.size = CryptGetHashDigestSize(hash);
53               CryptCompleteHash2B(&hashObject->state.hashState[i], &digest.b);
54
55                  PcrDrtm(pcrHandle, hash, &digest);
56             }
57       }
58
59       // Flush sequence object.


     Family “2.0”                               TCG Published                              Page 229
     Level 00 Revision 01.16             Copyright © TCG 2006-2014                  October 30, 2014
     Part 3: Commands                                             Trusted Platform Module Library

60       ObjectFlush(g_DRTMHandle);
61
62       g_DRTMHandle = TPM_RH_UNASSIGNED;
63
64       g_DrtmPreStartup = TRUE;
65
66       return;
67   }




     Page 230                                TCG Published                          Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014        Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


23     Enhanced Authorization (EA) Commands

23.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 in TPM 2.0 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 set to 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”                                   TCG Published                                             Page 231
Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


23.2   Signed Authorization Actions

23.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.

23.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 it does not match
   policySession→nonceTPM, then the TPM shall return TPM_RC_VALUE. This parameter is required
   to be present if expiration is non-zero (TPM_RC_EXPIRED).
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 indicated 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.
    If policySession→timeout is greater than policySession→startTime plus the absolute value of
    expiration, then policySession→timeout is set to policySession→startTime plus the absolute value of
    expiration. That is, policySession→timeout can only be changed to a smaller value.
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 is set and 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                    if   cpHashA     is   not     the   same    size   as
       policySession→policyDigest.

        NOTE 4          policySession→policyDigest is the size of the digest produced by the hash algorithm used
                        to compute policyDigest.




Page 232                                      TCG Published                                       Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                                  Part 3: Commands


23.2.3 Policy Digest 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)
followed by
                          policyDigestnew+1 ≔ HpolicyAlg(policyDigestnew || arg3.buffer)                         (11)
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 hash operations 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. For example, arg2 = 1 2 3 and arg3 = 4 5 6 would produce the same digest
                   as arg2 = 1 2 and arg3 = 3 4 5 6. 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”                                      TCG Published                                           Page 233
Level 00 Revision 01.16                   Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library



23.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 changed 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 1            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 2           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 234                                       TCG Published                                       Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


23.2.5 Policy Ticket Creation

If, for TPM2_PolicySigned() or TPM2_PolicySecret(), the caller specified a negative value for expiration,
and the nonceTPM matches policySession->nonceTPM, then the TPM will return a ticket that includes a
value indicating when the authorization expires. If expiration is non-negative, then the TPM will return a
NULL ticket.
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                           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

         NOTE 2          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”                                   TCG Published                                             Page 235
Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library

23.3    TPM2_PolicySigned

23.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 23.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 entity 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()                           the hash associated with the auth parameter of this command

        NOTE 1            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.

        NOTE 2            This parameter must be present if expiration is non-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 3            This is not the cpHash of this TPM2_PolicySigned() command.


        policyRef                            an opaque value determined by the authorizing entity. Set to the
                                             Empty Buffer if no value is present.

EXAMPLE          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 key associated with a key whose handle is authObject. The signature and
signing parameters are combined to create the auth parameter.
The TPM will perform the parameter checks listed in 23.2.2
If the parameter checks succeed, the TPM will construct a test digest (tHash) over the provided
parameters using the same formulation as 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 236                                         TCG Published                                     Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands

When all validations have succeeded, policySession→policyDigest is updated by PolicyUpdate() (see
23.2.3).
                 PolicyUpdate(TPM_CC_PolicySigned, authObject→Name, policyRef)                       (14)
policySession is updated as described in 23.2.4. The TPM will optionally produce a ticket as described in
23.2.5.
Authorization to use authObject is not required.




Family “2.0”                                 TCG Published                                    Page 237
Level 00 Revision 01.16              Copyright © TCG 2006-2014                        October 30, 2014
Part 3: Commands                                                     Trusted Platform Module Library



23.3.2 Command and Response

                      Table 113 — TPM2_PolicySigned Command
Type                   Name                   Description

                                              TPM_ST_SESSIONS if an audit, encrypt, or decrypt
TPMI_ST_COMMAND_TAG    tag                    session is present; otherwise,
                                              TPM_ST_NO_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode            TPM_CC_PolicySigned

                                              handle for a key that will validate the signature
TPMI_DH_OBJECT         authObject
                                              Auth Index: None
                                              handle for the policy session being extended
TPMI_SH_POLICY         policySession
                                              Auth Index: None

                                              the policy nonce for the session
TPM2B_NONCE            nonceTPM
                                              This can be the Empty Buffer.
                                              digest of the command parameters to which this
                                              authorization is limited
TPM2B_DIGEST           cpHashA                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.
                                              a reference to a policy relating to the authorization –
                                              may be the Empty Buffer
TPM2B_NONCE            policyRef
                                              Size is limited to be no larger than the nonce size
                                              supported on the TPM.
                                              time when authorization will expire, measured in
                                              seconds from the time that nonceTPM was generated
INT32                  expiration
                                              If expiration is non-negative, a NULL Ticket is returned.
                                              See 23.2.5.
TPMT_SIGNATURE         auth                   signed authorization (not optional)


                      Table 114 — TPM2_PolicySigned Response
Type                   Name                   Description

TPM_ST                 tag                    see clause 6
UINT32                 responseSize
TPM_RC                 responseCode

                                              implementation-specific time value, used to indicate to
                                              the TPM when the ticket expires
TPM2B_TIMEOUT          timeout
                                              NOTE        If policyTicket is a NULL Ticket, then this shall be
                                                          the Empty Buffer.

                                              produced if the command succeeds and expiration in
TPMT_TK_AUTH           policyTicket           the command was non-zero; this ticket will use the
                                              TPMT_ST_AUTH_SIGNED structure tag. See 23.2.5




Page 238                               TCG Published                                           Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                      Level 00 Revision 01.16
     Trusted Platform Module Library                                                                  Part 3: Commands



     23.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Policy_spt_fp.h"
3    #include "PolicySigned_fp.h"
4    #ifdef TPM_CC_PolicySigned // Conditional expansion of this file


     Error Returns                     Meaning

     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                      input policyID or expiration does not match the internal data in policy
                                       session

 5   TPM_RC
 6   TPM2_PolicySigned(
 7       PolicySigned_In       *in,                  // IN: input parameter list
 8       PolicySigned_Out      *out                  // OUT: output parameter list
 9       )
10   {
11       TPM_RC                     result = TPM_RC_SUCCESS;
12       SESSION                   *session;
13       TPM2B_NAME                 entityName;
14       TPM2B_DIGEST               authHash;
15       HASH_STATE                 hashState;
16       UINT32                     expiration = (in->expiration < 0)
17                                               ? -(in->expiration) : in->expiration;
18       UINT64                     authTimeout = 0;
19
20   // Input Validation
21
22       // Set up local pointers
23       session = SessionGet(in->policySession);               // the session structure
24
25       // Only do input validation if this is not a trial policy session
26       if(session->attributes.isTrialPolicy == CLEAR)
27       {
28           if(expiration != 0)
29               authTimeout = expiration * 1000 + session->startTime;
30
31           result = PolicyParameterChecks(session, authTimeout,
32                                           &in->cpHashA, &in->nonceTPM,
33                                           RC_PolicySigned_nonceTPM,
34                                           RC_PolicySigned_cpHashA,
35                                           RC_PolicySigned_expiration);
36           if(result != TPM_RC_SUCCESS)
37               return result;
38
39           // Re-compute the digest being signed
40           /*(See part 3 specification)

     Family “2.0”                                   TCG Published                                                 Page 239
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                                October 30, 2014
      Part 3: Commands                                                Trusted Platform Module Library

 41           // The digest is computed as:
 42           //     aHash := hash ( nonceTPM | expiration | cpHashA | policyRef)
 43           // where:
 44           //      hash()      the hash associated with the signed auth
 45           //      nonceTPM    the nonceTPM value from the TPM2_StartAuthSession .
 46           //                  response If the authorization is not limited to this
 47           //                  session, the size of this value is zero.
 48           //      expiration time limit on authorization set by authorizing object.
 49           //                  This 32-bit value is set to zero if the expiration
 50           //                  time is not being set.
 51           //      cpHashA     hash of the command parameters for the command being
 52           //                  approved using the hash algorithm of the PSAP session.
 53           //                  Set to NULLauth if the authorization is not limited
 54           //                  to a specific command.
 55           //      policyRef   hash of an opaque value determined by the authorizing
 56           //                  object. Set to the NULLdigest if no hash is present.
 57           */
 58           // Start hash
 59           authHash.t.size = CryptStartHash(CryptGetSignHashAlg(&in->auth),
 60                                            &hashState);
 61
 62           // add nonceTPM
 63           CryptUpdateDigest2B(&hashState, &in->nonceTPM.b);
 64
 65           // add expiration
 66           CryptUpdateDigestInt(&hashState, sizeof(UINT32), (BYTE*) &in->expiration);
 67
 68           // add cpHashA
 69           CryptUpdateDigest2B(&hashState, &in->cpHashA.b);
 70
 71           // add policyRef
 72           CryptUpdateDigest2B(&hashState, &in->policyRef.b);
 73
 74           // Complete digest
 75           CryptCompleteHash2B(&hashState, &authHash.b);
 76
 77           // Validate Signature. A TPM_RC_SCHEME, TPM_RC_HANDLE or TPM_RC_SIGNATURE
 78           // error may be returned at this point
 79           result = CryptVerifySignature(in->authObject, &authHash, &in->auth);
 80           if(result != TPM_RC_SUCCESS)
 81               return RcSafeAddToResult(result, RC_PolicySigned_auth);
 82       }
 83   // Internal Data Update
 84       // Need the Name of the signing entity
 85       entityName.t.size = EntityGetName(in->authObject, &entityName.t.name);
 86
 87       // Update policy with input policyRef and name of auth key
 88       // These values are updated even if the session is a trial session
 89       PolicyContextUpdate(TPM_CC_PolicySigned, &entityName, &in->policyRef,
 90                           &in->cpHashA, authTimeout, session);
 91
 92   // Command Output
 93
 94       // Create ticket and timeout buffer if in->expiration < 0 and this is not
 95       // a trial session.
 96       // NOTE: PolicyParameterChecks() makes sure that nonceTPM is present
 97       // when expiration is non-zero.
 98       if(   in->expiration < 0
 99          && session->attributes.isTrialPolicy == CLEAR
100         )
101       {
102           // Generate timeout buffer. The format of output timeout buffer is
103           // TPM-specific.
104           // Note: can't do a direct copy because the output buffer is a byte
105           // array and it may not be aligned to accept a 64-bit value. The method
106           // used has the side-effect of making the returned value a big-endian,

      Page 240                               TCG Published                              Family “2.0”
      October 30, 2014                Copyright © TCG 2006-2014             Level 00 Revision 01.16
      Trusted Platform Module Library                                             Part 3: Commands

107           // 64-bit value that is byte aligned.
108           out->timeout.t.size = sizeof(UINT64);
109           UINT64_TO_BYTE_ARRAY(authTimeout, out->timeout.t.buffer);
110
111           // Compute policy ticket
112           TicketComputeAuth(TPM_ST_AUTH_SIGNED, EntityGetHierarchy(in->authObject),
113                             authTimeout, &in->cpHashA, &in->policyRef, &entityName,
114                             &out->policyTicket);
115       }
116       else
117       {
118           // Generate a null ticket.
119           // timeout buffer is null
120           out->timeout.t.size = 0;
121
122           // auth ticket is null
123           out->policyTicket.tag = TPM_ST_AUTH_SIGNED;
124           out->policyTicket.hierarchy = TPM_RH_NULL;
125           out->policyTicket.digest.t.size = 0;
126       }
127
128       return TPM_RC_SUCCESS;
129   }
130   #endif // CC_PolicySigned




      Family “2.0”                           TCG Published                                Page 241
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


23.4     TPM2_PolicySecret

23.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 the entity whose handle is authHandle, 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 this 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 23.2.2.
nonceTPM must be present if expiration is non-zero.
When all validations have succeeded, policySession→policyDigest is updated by PolicyUpdate() (see
23.2.3).
                  PolicyUpdate(TPM_CC_PolicySecret, authObject→Name, policyRef)                                   (15)
policySession is updated as described in 23.2.4. The TPM will optionally produce a ticket as described in
23.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 242                                        TCG Published                                          Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands


23.4.2 Command and Response

                            Table 115 — TPM2_PolicySecret Command
Type                          Name                   Description

TPMI_ST_COMMAND_TAG           tag                    TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicySecret

                                                     handle for an entity providing the authorization
TPMI_DH_ENTITY                @authHandle            Auth Index: 1
                                                     Auth Role: USER
                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     Auth Index: None

                                                     the policy nonce for the session
TPM2B_NONCE                   nonceTPM
                                                     This can be the Empty Buffer.
                                                     digest of the command parameters to which this
                                                     authorization is limited
TPM2B_DIGEST                  cpHashA                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.
                                                     a reference to a policy relating to the authorization –
                                                     may be the Empty Buffer
TPM2B_NONCE                   policyRef
                                                     Size is limited to be no larger than the nonce size
                                                     supported on the TPM.
                                                     time when authorization will expire, measured in
                                                     seconds from the time that nonceTPM was generated
INT32                         expiration
                                                     If expiration is non-negative, a NULL Ticket is returned.
                                                     See 23.2.5.


                            Table 116 — TPM2_PolicySecret Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

                                                     implementation-specific time value used to indicate to
TPM2B_TIMEOUT                 timeout                the TPM when the ticket expires; this ticket will use the
                                                     TPMT_ST_AUTH_SECRET structure tag
                                                     produced if the command succeeds and expiration in
TPMT_TK_AUTH                  policyTicket
                                                     the command was non-zero. See 23.2.5




Family “2.0”                                  TCG Published                                          Page 243
Level 00 Revision 01.16             Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                                             Trusted Platform Module Library



     23.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicySecret_fp.h"
3    #ifdef TPM_CC_PolicySecret // Conditional expansion of this file
4    #include "Policy_spt_fp.h"


     Error Returns                 Meaning

     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                  input policyID or expiration does not match the internal data in policy
                                   session

 5   TPM_RC
 6   TPM2_PolicySecret(
 7       PolicySecret_In    *in,                 // IN: input parameter list
 8       PolicySecret_Out   *out                 // OUT: output parameter list
 9       )
10   {
11       TPM_RC                  result;
12       SESSION                *session;
13       TPM2B_NAME              entityName;
14       UINT32                  expiration = (in->expiration < 0)
15                                            ? -(in->expiration) : in->expiration;
16       UINT64                  authTimeout = 0;
17
18   // Input Validation
19
20       // Get pointer to the session structure
21       session = SessionGet(in->policySession);
22
23       //Only do input validation if this is not a trial policy session
24       if(session->attributes.isTrialPolicy == CLEAR)
25       {
26
27           if(expiration != 0)
28               authTimeout = expiration * 1000 + session->startTime;
29
30           result = PolicyParameterChecks(session, authTimeout,
31                                           &in->cpHashA, &in->nonceTPM,
32                                           RC_PolicySecret_nonceTPM,
33                                           RC_PolicySecret_cpHashA,
34                                           RC_PolicySecret_expiration);
35           if(result != TPM_RC_SUCCESS)
36               return result;
37       }
38
39   // Internal Data Update
40       // Need the name of the authorizing entity
41       entityName.t.size = EntityGetName(in->authHandle, &entityName.t.name);
42
43       // Update policy context with input policyRef and name of auth key
44       // This value is computed even for trial sessions. Possibly update the cpHash
45       PolicyContextUpdate(TPM_CC_PolicySecret, &entityName, &in->policyRef,
46                           &in->cpHashA, authTimeout, session);

     Page 244                                   TCG Published                                           Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

47
48   // Command Output
49
50       // Create ticket and timeout buffer if in->expiration < 0 and this is not
51       // a trial session.
52       // NOTE: PolicyParameterChecks() makes sure that nonceTPM is present
53       // when expiration is non-zero.
54       if(   in->expiration < 0
55          && session->attributes.isTrialPolicy == CLEAR
56         )
57       {
58           // Generate timeout buffer. The format of output timeout buffer is
59           // TPM-specific.
60           // Note: can't do a direct copy because the output buffer is a byte
61           // array and it may not be aligned to accept a 64-bit value. The method
62           // used has the side-effect of making the returned value a big-endian,
63           // 64-bit value that is byte aligned.
64           out->timeout.t.size = sizeof(UINT64);
65           UINT64_TO_BYTE_ARRAY(authTimeout, out->timeout.t.buffer);
66
67           // Compute policy ticket
68           TicketComputeAuth(TPM_ST_AUTH_SECRET, EntityGetHierarchy(in->authHandle),
69                             authTimeout, &in->cpHashA, &in->policyRef,
70                             &entityName, &out->policyTicket);
71       }
72       else
73       {
74           // timeout buffer is null
75           out->timeout.t.size = 0;
76
77           // auth ticket is null
78           out->policyTicket.tag = TPM_ST_AUTH_SECRET;
79           out->policyTicket.hierarchy = TPM_RH_NULL;
80           out->policyTicket.digest.t.size = 0;
81       }
82
83       return TPM_RC_SUCCESS;
84   }
85   #endif // CC_PolicySecret




     Family “2.0”                           TCG Published                                Page 245
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                         Trusted Platform Module Library


23.5   TPM2_PolicyTicket

23.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 23.2.2.
If the checks succeed, the TPM uses the timeout, cpHashA, policyRef, and authName 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 23.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.
policySession is updated as described in 23.2.4.




Page 246                                    TCG Published                                    Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                  Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands



23.5.2 Command and Response

                            Table 117 — TPM2_PolicyTicket Command
Type                          Name                   Description

                                                     TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG           tag
                                                     present; otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicyTicket

                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     Auth Index: None

                                                     time when authorization will expire
TPM2B_TIMEOUT                 timeout                The contents are TPM specific. This shall be the value
                                                     returned when ticket was produced.
                                                     digest of the command parameters to which this
                                                     authorization is limited
TPM2B_DIGEST                  cpHashA
                                                     If it is not limited, the parameter will be the Empty
                                                     Buffer.
                                                     reference to a qualifier for the policy – may be the
TPM2B_NONCE                   policyRef
                                                     Empty Buffer
TPM2B_NAME                    authName               name of the object that provided the authorization
                                                     an authorization ticket returned by the TPM in response
TPMT_TK_AUTH                  ticket
                                                     to a TPM2_PolicySigned() or TPM2_PolicySecret()


                            Table 118 — TPM2_PolicyTicket Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                  TCG Published                                           Page 247
Level 00 Revision 01.16                Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                             Trusted Platform Module Library



     23.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyTicket_fp.h"
3    #ifdef TPM_CC_PolicyTicket // Conditional expansion of this file
4    #include "Policy_spt_fp.h"


     Error Returns                Meaning

     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                ticket is not valid

 5   TPM_RC
 6   TPM2_PolicyTicket(
 7       PolicyTicket_In    *in                   // IN: input parameter list
 8       )
 9   {
10       TPM_RC                    result;
11       SESSION                  *session;
12       UINT64                    timeout;
13       TPMT_TK_AUTH              ticketToCompare;
14       TPM_CC                    commandCode = TPM_CC_PolicySecret;
15
16   // Input Validation
17
18       // Get pointer to the session structure
19       session = SessionGet(in->policySession);
20
21       // NOTE: A trial policy session is not allowed to use this command.
22       // A ticket is used in place of a previously given authorization. Since
23       // a trial policy doesn't actually authenticate, the validated
24       // ticket is not necessary and, in place of using a ticket, one
25       // should use the intended authorization for which the ticket
26       // would be a substitute.
27       if(session->attributes.isTrialPolicy)
28           return TPM_RCS_ATTRIBUTES + RC_PolicyTicket_policySession;
29
30       // Restore timeout data. The format of timeout buffer is TPM-specific.
31       // In this implementation, we simply copy the value of timeout to the
32       // buffer.
33       if(in->timeout.t.size != sizeof(UINT64))
34           return TPM_RC_SIZE + RC_PolicyTicket_timeout;
35       timeout = BYTE_ARRAY_TO_UINT64(in->timeout.t.buffer);
36
37       // Do the normal checks on the cpHashA and timeout values
38       result = PolicyParameterChecks(session, timeout,
39                                      &in->cpHashA, NULL,
40                                      0,                       // no bad nonce return
41                                      RC_PolicyTicket_cpHashA,
42                                      RC_PolicyTicket_timeout);
43       if(result != TPM_RC_SUCCESS)
44           return result;
45
46       // Validate Ticket
47       // Re-generate policy ticket by input parameters
48       TicketComputeAuth(in->ticket.tag, in->ticket.hierarchy, timeout, &in->cpHashA,
49                         &in->policyRef, &in->authName, &ticketToCompare);
50
51       // Compare generated digest with input ticket digest

     Page 248                                   TCG Published                                             Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                            Part 3: Commands

52       if(!Memory2BEqual(&in->ticket.digest.b, &ticketToCompare.digest.b))
53           return TPM_RC_TICKET + RC_PolicyTicket_ticket;
54
55   // Internal Data Update
56
57       // Is this ticket to take the place of a TPM2_PolicySigned() or
58       // a TPM2_PolicySecret()?
59       if(in->ticket.tag == TPM_ST_AUTH_SIGNED)
60           commandCode = TPM_CC_PolicySigned;
61       else if(in->ticket.tag == TPM_ST_AUTH_SECRET)
62           commandCode = TPM_CC_PolicySecret;
63       else
64           // There could only be two possible tag values. Any other value should
65           // be caught by the ticket validation process.
66           pAssert(FALSE);
67
68       // Update policy context
69       PolicyContextUpdate(commandCode, &in->authName, &in->policyRef,
70                           &in->cpHashA, timeout, session);
71
72       return TPM_RC_SUCCESS;
73   }
74   #endif // CC_PolicyTicket




     Family “2.0”                           TCG Published                              Page 249
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


23.6     TPM2_PolicyOR

23.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                         (17)

    NOTE 1           The TPM will not return an error if the size of an entry is not the same as the size of the digest
                     of the policy. However, that entry cannot match policyDigest.

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)                        (18)

    NOTE 2           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 250                                        TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                         Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands


23.6.2 Command and Response

                              Table 119 — TPM2_PolicyOR Command
Type                          Name                   Description

                                                     TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG           tag
                                                     otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicyOR.

                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                  TCG Published                                         Page 251
Level 00 Revision 01.16             Copyright © TCG 2006-2014                             October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     23.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyOR_fp.h"
3    #ifdef TPM_CC_PolicyOR // Conditional expansion of this file
4    #include "Policy_spt_fp.h"


     Error Returns                 Meaning

     TPM_RC_VALUE                  no digest in pHashList matched the current value of policyDigest for
                                   policySession

 5   TPM_RC
 6   TPM2_PolicyOR(
 7       PolicyOR_In      *in               // IN: input parameter list
 8       )
 9   {
10       SESSION       *session;
11       UINT32         i;
12
13   // Input Validation and Update
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       // Compare and Update Internal Session policy if match
19       for(i = 0; i < in->pHashList.count; i++)
20       {
21           if(   session->attributes.isTrialPolicy == SET
22              || (Memory2BEqual(&session->u2.policyDigest.b,
23                                &in->pHashList.digests[i].b))
24             )
25           {
26               // Found a match
27               HASH_STATE      hashState;
28               TPM_CC          commandCode = TPM_CC_PolicyOR;
29
30                 // Start hash
31                 session->u2.policyDigest.t.size = CryptStartHash(session->authHashAlg,
32                                                                &hashState);
33                 // Set policyDigest to 0 string and add it to hash
34                 MemorySet(session->u2.policyDigest.t.buffer, 0,
35                           session->u2.policyDigest.t.size);
36                 CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
37
38                 // add command code
39                 CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
40
41                 // Add each of the hashes in the list
42                 for(i = 0; i < in->pHashList.count; i++)
43                 {
44                     // Extend policyDigest
45                     CryptUpdateDigest2B(&hashState, &in->pHashList.digests[i].b);
46                 }
47                 // Complete digest
48                 CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
49
50                 return TPM_RC_SUCCESS;
51           }
52       }
53       // None of the values in the list matched the current policyDigest
54       return TPM_RC_VALUE + RC_PolicyOR_pHashList;
55   }

     Page 252                                   TCG Published                                         Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                       Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

56   #endif // CC_PolicyOR




     Family “2.0”                           TCG Published                 Page 253
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                                   Trusted Platform Module Library


23.7     TPM2_PolicyPCR

23.7.1 General Description

This command is used to cause conditional gating of a policy based on PCR. This command together
with TPM2_PolicyOR() 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 TPM 2.0 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 incorrect 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.

NOTE 2           Since the pcrUpdateCounter is updated if any PCR is extended (except those specified not to do
                 so), this means that the command will fail even if a PCR not specified in the policy is updated. This
                 is an optimization for the purposes of conserving internal TPM memory. This would be a rare
                 occurrence. and, if this should occur, the policy could be reset using the TPM2_PolicyRestart
                 command and rerun.

If policySession→pcrUpdateCounter has not been set, then it is set to the current value of
pcrUpdateCounter.




Page 254                                         TCG Published                                            Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                         Level 00 Revision 01.16
Trusted Platform Module Library                                                              Part 3: Commands

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 3          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.

NOTE 4          Although no PCR are checked in a trial policy session, pcrDigest is expected to correspond to some
                useful PCR values. It is legal, but pointless, to have the TP M aid in calculating a policyDigest
                corresponding to PCR values that are not useful in practice.




Family “2.0”                                  TCG Published                                           Page 255
Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library


23.7.2 Command and Response

                      Table 121 — TPM2_PolicyPCR Command
Type                   Name                   Description

                                              TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG    tag
                                              present; otherwise, TPM_ST_NO_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode            TPM_CC_PolicyPCR

                                              handle for the policy session being extended
TPMI_SH_POLICY         policySession
                                              Auth Index: None

                                              expected digest value of the selected PCR using the
TPM2B_DIGEST           pcrDigest
                                              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 6
UINT32                 responseSize
TPM_RC                 responseCode




Page 256                               TCG Published                                    Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                                              Part 3: Commands



     23.7.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyPCR_fp.h"
3    #ifdef TPM_CC_PolicyPCR // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_VALUE                      if provided, pcrDigest does not match the current PCR settings
     TPM_RC_PCR_CHANGED                a previous TPM2_PolicyPCR() set pcrCounter and it has changed

 4   TPM_RC
 5   TPM2_PolicyPCR(
 6       PolicyPCR_In      *in                 // IN: input parameter list
 7       )
 8   {
 9       SESSION           *session;
10       TPM2B_DIGEST       pcrDigest;
11       BYTE               pcrs[sizeof(TPML_PCR_SELECTION)];
12       UINT32             pcrSize;
13       BYTE              *buffer;
14       TPM_CC             commandCode = TPM_CC_PolicyPCR;
15       HASH_STATE         hashState;
16
17   // Input Validation
18
19       // Get pointer to the session structure
20       session = SessionGet(in->policySession);
21
22       // Do validation for non trial session
23       if(session->attributes.isTrialPolicy == CLEAR)
24       {
25           // Make sure that this is not going to invalidate a previous PCR check
26           if(session->pcrCounter != 0 && session->pcrCounter != gr.pcrCounter)
27               return TPM_RC_PCR_CHANGED;
28
29           // Compute current PCR digest
30           PCRComputeCurrentDigest(session->authHashAlg, &in->pcrs, &pcrDigest);
31
32           // If the caller specified the PCR digest and it does not
33           // match the current PCR settings, return an error..
34           if(in->pcrDigest.t.size != 0)
35           {
36               if(!Memory2BEqual(&in->pcrDigest.b, &pcrDigest.b))
37                   return TPM_RC_VALUE + RC_PolicyPCR_pcrDigest;
38           }
39       }
40       else
41       {
42           // For trial session, just use the input PCR digest
43           pcrDigest = in->pcrDigest;
44       }
45   // Internal Data Update
46
47       // Update policy hash
48       // policyDigestnew = hash(   policyDigestold || TPM_CC_PolicyPCR
49       //                      || pcrs || pcrDigest)
50       // Start hash
51       CryptStartHash(session->authHashAlg, &hashState);
52
53       // add old digest
54       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);

     Family “2.0”                                  TCG Published                                         Page 257
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

55
56      // add commandCode
57      CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
58
59      // add PCRS
60      buffer = pcrs;
61      pcrSize = TPML_PCR_SELECTION_Marshal(&in->pcrs, &buffer, NULL);
62      CryptUpdateDigest(&hashState, pcrSize, pcrs);
63
64      // add PCR digest
65      CryptUpdateDigest2B(&hashState, &pcrDigest.b);
66
67      // complete the hash and get the results
68      CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
69
70      // update pcrCounter in session context for non trial session
71      if(session->attributes.isTrialPolicy == CLEAR)
72      {
73          session->pcrCounter = gr.pcrCounter;
74      }
75
76       return TPM_RC_SUCCESS;
77   }
78   #endif // CC_PolicyPCR




     Page 258                              TCG Published                              Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands


23.8   TPM2_PolicyLocality

23.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. When the policy session is
started, this parameter is initialized to a value that allows 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 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 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.




Family “2.0”                                  TCG Published                                        Page 259
Level 00 Revision 01.16               Copyright © TCG 2006-2014                           October 30, 2014
Part 3: Commands                                                      Trusted Platform Module Library



23.8.2 Command and Response

                      Table 123 — TPM2_PolicyLocality Command
Type                    Name                   Description

                                               TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG     tag
                                               otherwise, TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode            TPM_CC_PolicyLocality

                                               handle for the policy session being extended
TPMI_SH_POLICY          policySession
                                               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 6
UINT32                  responseSize
TPM_RC                  responseCode




Page 260                                TCG Published                                    Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                      Level 00 Revision 01.16
     Trusted Platform Module Library                                                                   Part 3: Commands



     23.8.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyLocality_fp.h"
3    #ifdef TPM_CC_PolicyLocality // Conditional expansion of this file

     Limit a policy to a specific locality

     Error Returns                       Meaning

     TPM_RC_RANGE                        all the locality values selected by locality have been disabled by
                                         previous TPM2_PolicyLocality() calls.

 4   TPM_RC
 5   TPM2_PolicyLocality(
 6        PolicyLocality_In        *in                 // IN: input parameter list
 7        )
 8   {
 9        SESSION        *session;
10        BYTE            marshalBuffer[sizeof(TPMA_LOCALITY)];
11        BYTE            prevSetting[sizeof(TPMA_LOCALITY)];
12        UINT32          marshalSize;
13        BYTE           *buffer;
14        TPM_CC          commandCode = TPM_CC_PolicyLocality;
15        HASH_STATE      hashState;
16
17   // Input Validation
18
19        // Get pointer to the session structure
20        session = SessionGet(in->policySession);
21
22        // Get new locality setting in canonical form
23        buffer = marshalBuffer;
24        marshalSize = TPMA_LOCALITY_Marshal(&in->locality, &buffer, NULL);
25
26        // Its an error if the locality parameter is zero
27        if(marshalBuffer[0] == 0)
28            return TPM_RC_RANGE + RC_PolicyLocality_locality;
29
30        // Get existing locality setting in canonical form
31        buffer = prevSetting;
32        TPMA_LOCALITY_Marshal(&session->commandLocality, &buffer, NULL);
33
34        // If the locality has previously been set
35        if(    prevSetting[0] != 0
36            // then the current locality setting and the requested have to be the same
37            // type (that is, either both normal or both extended
38            && ((prevSetting[0] < 32) != (marshalBuffer[0] < 32)))
39            return TPM_RC_RANGE + RC_PolicyLocality_locality;
40
41        // See if the input is a regular or extended locality
42        if(marshalBuffer[0] < 32)
43        {
44            // if there was no previous setting, start with all normal localities
45            // enabled
46            if(prevSetting[0] == 0)
47                prevSetting[0] = 0x1F;
48
49             // AND the new setting with the previous setting and store it in prevSetting
50             prevSetting[0] &= marshalBuffer[0];
51
52             // The result setting can not be 0
53             if(prevSetting[0] == 0)

     Family “2.0”                                     TCG Published                                           Page 261
     Level 00 Revision 01.16                 Copyright © TCG 2006-2014                                 October 30, 2014
     Part 3: Commands                                                Trusted Platform Module Library

54              return TPM_RC_RANGE + RC_PolicyLocality_locality;
55      }
56      else
57      {
58          // for extended locality
59          // if the locality has already been set, then it must match the
60          if(prevSetting[0] != 0 && prevSetting[0] != marshalBuffer[0])
61              return TPM_RC_RANGE + RC_PolicyLocality_locality;
62
63          // Setting is OK
64          prevSetting[0] = marshalBuffer[0];
65
66      }
67
68   // Internal Data Update
69
70      // Update policy hash
71      // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyLocality || locality)
72      // Start hash
73      CryptStartHash(session->authHashAlg, &hashState);
74
75      // add old digest
76      CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
77
78      // add commandCode
79      CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
80
81      // add input locality
82      CryptUpdateDigest(&hashState, marshalSize, marshalBuffer);
83
84      // complete the digest
85      CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
86
87      // update session locality by unmarshal function. The function must succeed
88      // because both input and existing locality setting have been validated.
89      buffer = prevSetting;
90      TPMA_LOCALITY_Unmarshal(&session->commandLocality, &buffer,
91                              (INT32 *) &marshalSize);
92
93       return TPM_RC_SUCCESS;
94   }
95   #endif // CC_PolicyLocality




     Page 262                              TCG Published                               Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands


23.9    TPM2_PolicyNV

23.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               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.
operandA begins at offest into the NV index contents and has a size equal to the size of operandB. The
TPM will perform the indicated arithmetic check using operandA and operandB. . 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)                       (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.




Family “2.0”                                   TCG Published                                          Page 263
Level 00 Revision 01.16                 Copyright © TCG 2006-2014                          October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library



23.9.2 Command and Response

                       Table 125 — TPM2_PolicyNV Command
Type                   Name                   Description

TPMI_ST_COMMAND_TAG    tag                    TPM_ST_SESSIONS
UINT32                 commandSize
TPM_CC                 commandCode            TPM_CC_PolicyNV

                                              handle indicating the source of the authorization value
TPMI_RH_NV_AUTH        @authHandle            Auth Index: 1
                                              Auth Role: USER
                                              the NV Index of the area to read
TPMI_RH_NV_INDEX       nvIndex
                                              Auth Index: None
                                              handle for the policy session being extended
TPMI_SH_POLICY         policySession
                                              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 6
UINT32                 responseSize
TPM_RC                 responseCode




Page 264                               TCG Published                                      Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                                                   Part 3: Commands



     23.9.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyNV_fp.h"
3    #ifdef TPM_CC_PolicyNV // Conditional expansion of this file
4    #include "Policy_spt_fp.h"
5    #include "NV_spt_fp.h"         // Include NV support routine for read access check


     Error Returns                     Meaning

     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                       the size of nvIndex data starting at offset is less than the size of
                                       operandB

 6   TPM_RC
 7   TPM2_PolicyNV(
 8       PolicyNV_In       *in                  // IN: input parameter list
 9       )
10   {
11       TPM_RC                   result;
12       SESSION                 *session;
13       NV_INDEX                 nvIndex;
14           BYTE                 nvBuffer[sizeof(in->operandB.t.buffer)];
15       TPM2B_NAME               nvName;
16       TPM_CC                   commandCode = TPM_CC_PolicyNV;
17       HASH_STATE               hashState;
18       TPM2B_DIGEST             argHash;
19
20   // Input Validation
21
22       // Get NV index information
23       NvGetIndexInfo(in->nvIndex, &nvIndex);
24
25       // Get pointer to the session structure
26       session = SessionGet(in->policySession);
27
28       //If this is a trial policy, skip all validations and the operation
29       if(session->attributes.isTrialPolicy == CLEAR)
30       {
31           // NV Read access check. NV index should be allowed for read. A
32           // TPM_RC_AUTH_TYPE or TPM_RC_NV_LOCKED error may be return at this
33           // point
34           result = NvReadAccessChecks(in->authHandle, in->nvIndex);
35           if(result != TPM_RC_SUCCESS) return result;
36
37           // Valid NV data size should not be smaller than input operandB size
38           if((nvIndex.publicArea.dataSize - in->offset) < in->operandB.t.size)
39               return TPM_RC_SIZE + RC_PolicyNV_operandB;
40
41           // Arithmetic Comparison
42
43           // Get NV data. The size of NV data equals the input operand B size
44           NvGetIndexData(in->nvIndex, &nvIndex, in->offset,
45                          in->operandB.t.size, nvBuffer);
46
47           switch(in->operation)
48           {

     Family “2.0”                                   TCG Published                                             Page 265
     Level 00 Revision 01.16                Copyright © TCG 2006-2014                                  October 30, 2014
      Part 3: Commands                                               Trusted Platform Module Library

 49              case TPM_EO_EQ:
 50                  // compare A = B
 51                  if(CryptCompare(in->operandB.t.size, nvBuffer,
 52                                  in->operandB.t.size, in->operandB.t.buffer)   != 0)
 53                      return TPM_RC_POLICY;
 54                  break;
 55              case TPM_EO_NEQ:
 56                  // compare A != B
 57                  if(CryptCompare(in->operandB.t.size, nvBuffer,
 58                                  in->operandB.t.size, in->operandB.t.buffer)   == 0)
 59                      return TPM_RC_POLICY;
 60                  break;
 61              case TPM_EO_SIGNED_GT:
 62                  // compare A > B signed
 63                  if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
 64                                  in->operandB.t.size, in->operandB.t.buffer)   <= 0)
 65                      return TPM_RC_POLICY;
 66                  break;
 67              case TPM_EO_UNSIGNED_GT:
 68                  // compare A > B unsigned
 69                  if(CryptCompare(in->operandB.t.size, nvBuffer,
 70                                  in->operandB.t.size, in->operandB.t.buffer)   <= 0)
 71                      return TPM_RC_POLICY;
 72                  break;
 73              case TPM_EO_SIGNED_LT:
 74                  // compare A < B signed
 75                  if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
 76                                  in->operandB.t.size, in->operandB.t.buffer)   >= 0)
 77                      return TPM_RC_POLICY;
 78                  break;
 79              case TPM_EO_UNSIGNED_LT:
 80                  // compare A < B unsigned
 81                  if(CryptCompare(in->operandB.t.size, nvBuffer,
 82                                  in->operandB.t.size, in->operandB.t.buffer)   >= 0)
 83                      return TPM_RC_POLICY;
 84                  break;
 85              case TPM_EO_SIGNED_GE:
 86                  // compare A >= B signed
 87                  if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
 88                                  in->operandB.t.size, in->operandB.t.buffer)   < 0)
 89                      return TPM_RC_POLICY;
 90                  break;
 91              case TPM_EO_UNSIGNED_GE:
 92                  // compare A >= B unsigned
 93                  if(CryptCompare(in->operandB.t.size, nvBuffer,
 94                                  in->operandB.t.size, in->operandB.t.buffer)   < 0)
 95                      return TPM_RC_POLICY;
 96                  break;
 97              case TPM_EO_SIGNED_LE:
 98                  // compare A <= B signed
 99                  if(CryptCompareSigned(in->operandB.t.size, nvBuffer,
100                                  in->operandB.t.size, in->operandB.t.buffer)   > 0)
101                      return TPM_RC_POLICY;
102                  break;
103              case TPM_EO_UNSIGNED_LE:
104                  // compare A <= B unsigned
105                  if(CryptCompare(in->operandB.t.size, nvBuffer,
106                                  in->operandB.t.size, in->operandB.t.buffer)   > 0)
107                      return TPM_RC_POLICY;
108                  break;
109              case TPM_EO_BITSET:
110                  // All bits SET in B are SET in A. ((A&B)=B)
111              {
112                  UINT32 i;
113                  for (i = 0; i < in->operandB.t.size; i++)
114                      if((nvBuffer[i] & in->operandB.t.buffer[i])

      Page 266                              TCG Published                                  Family “2.0”
      October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
      Trusted Platform Module Library                                          Part 3: Commands

115                                 != in->operandB.t.buffer[i])
116                             return TPM_RC_POLICY;
117                }
118                break;
119                case TPM_EO_BITCLEAR:
120                    // All bits SET in B are CLEAR in A. ((A&B)=0)
121                {
122                    UINT32 i;
123                    for (i = 0; i < in->operandB.t.size; i++)
124                        if((nvBuffer[i] & in->operandB.t.buffer[i]) != 0)
125                            return TPM_RC_POLICY;
126                }
127                break;
128                default:
129                    pAssert(FALSE);
130                    break;
131           }
132       }
133
134   // Internal Data Update
135
136       // Start argument hash
137       argHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
138
139       // add operandB
140       CryptUpdateDigest2B(&hashState, &in->operandB.b);
141
142       // add offset
143       CryptUpdateDigestInt(&hashState, sizeof(UINT16), &in->offset);
144
145       // add operation
146       CryptUpdateDigestInt(&hashState, sizeof(TPM_EO), &in->operation);
147
148       // complete argument digest
149       CryptCompleteHash2B(&hashState, &argHash.b);
150
151       // Update policyDigest
152       // Start digest
153       CryptStartHash(session->authHashAlg, &hashState);
154
155       // add old digest
156       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
157
158       // add commandCode
159       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
160
161       // add argument digest
162       CryptUpdateDigest2B(&hashState, &argHash.b);
163
164       // Adding nvName
165       nvName.t.size = EntityGetName(in->nvIndex, &nvName.t.name);
166       CryptUpdateDigest2B(&hashState, &nvName.b);
167
168       // complete the digest
169       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
170
171       return TPM_RC_SUCCESS;
172   }
173   #endif // CC_PolicyNV




      Family “2.0”                             TCG Published                          Page 267
      Level 00 Revision 01.16           Copyright © TCG 2006-2014              October 30, 2014
Part 3: Commands                                                            Trusted Platform Module Library


23.10 TPM2_PolicyCounterTimer

23.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. The indicated portion of the
TPMS_TIME_INFO structure begins at offset and has a length of operandB.size. If the octets to be
compared overflows the TPMS_TIME_INFO structure, the TPM returns TPM_RC_RANGE. The structure
is marshaled into its canonical form with no padding. The TPM does not check for alignment of the offset
with a TPMS_TIME_INFO structure member.
Magnitude comparisons assume that the octet at offset zero in the referenced location and in operandB
contain the most significant octet of the data.




Page 268                                     TCG Published                                    Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                  Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands



23.10.2    Command and Response

                        Table 127 — TPM2_PolicyCounterTimer Command
Type                          Name                   Description

                                                     TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG           tag
                                                     present; otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicyCounterTimer

                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     Auth Index: None

TPM2B_OPERAND                 operandB               the second operand
                                                     the offset in TPMS_TIME_INFO structure for the start of
UINT16                        offset
                                                     operand A
TPM_EO                        operation              the comparison to make


                        Table 128 — TPM2_PolicyCounterTimer Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                  TCG Published                                         Page 269
Level 00 Revision 01.16                Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                         Trusted Platform Module Library



     23.10.3     Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyCounterTimer_fp.h"
3    #ifdef TPM_CC_PolicyCounterTimer // Conditional expansion of this file
4    #include "Policy_spt_fp.h"


     Error Returns                  Meaning

     TPM_RC_POLICY                  the comparison of the selected portion of the TPMS_TIME_INFO with
                                    operandB failed
     TPM_RC_RANGE                   offset + size exceed size of TPMS_TIME_INFO structure

 5   TPM_RC
 6   TPM2_PolicyCounterTimer(
 7       PolicyCounterTimer_In      *in              // IN: input parameter list
 8       )
 9   {
10       TPM_RC                result;
11       SESSION              *session;
12       TIME_INFO             infoData;      // data buffer of TPMS_TIME_INFO
13       TPM_CC                commandCode = TPM_CC_PolicyCounterTimer;
14       HASH_STATE            hashState;
15       TPM2B_DIGEST          argHash;
16
17   // Input Validation
18
19       // If the command is going to use any part of the counter or timer, need
20       // to verify that time is advancing.
21       // The time and clock vales are the first two 64-bit values in the clock
22       if(in->offset < sizeof(UINT64) + sizeof(UINT64))
23       {
24           // Using Clock or Time so see if clock is running. Clock doesn't run while
25           // NV is unavailable.
26           // TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned here.
27           result = NvIsAvailable();
28           if(result != TPM_RC_SUCCESS)
29               return result;
30       }
31       // Get pointer to the session structure
32       session = SessionGet(in->policySession);
33
34       //If this is a trial policy, skip all validations and the operation
35       if(session->attributes.isTrialPolicy == CLEAR)
36       {
37           // Get time data info. The size of time info data equals the input
38           // operand B size. A TPM_RC_RANGE error may be returned at this point
39           result = TimeGetRange(in->offset, in->operandB.t.size, &infoData);
40           if(result != TPM_RC_SUCCESS) return result;
41
42             // Arithmetic Comparison
43             switch(in->operation)
44             {
45                 case TPM_EO_EQ:
46                     // compare A = B
47                     if(CryptCompare(in->operandB.t.size, infoData,
48                                     in->operandB.t.size, in->operandB.t.buffer) != 0)
49                         return TPM_RC_POLICY;
50                     break;
51                 case TPM_EO_NEQ:
52                     // compare A != B
53                     if(CryptCompare(in->operandB.t.size, infoData,

     Page 270                                   TCG Published                                     Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                 Level 00 Revision 01.16
      Trusted Platform Module Library                                                Part 3: Commands

 54                                    in->operandB.t.size, in->operandB.t.buffer)   == 0)
 55                        return TPM_RC_POLICY;
 56                    break;
 57                case TPM_EO_SIGNED_GT:
 58                    // compare A > B signed
 59                    if(CryptCompareSigned(in->operandB.t.size, infoData,
 60                                    in->operandB.t.size, in->operandB.t.buffer)   <= 0)
 61                        return TPM_RC_POLICY;
 62                    break;
 63                case TPM_EO_UNSIGNED_GT:
 64                    // compare A > B unsigned
 65                    if(CryptCompare(in->operandB.t.size, infoData,
 66                                    in->operandB.t.size, in->operandB.t.buffer)   <= 0)
 67                        return TPM_RC_POLICY;
 68                    break;
 69                case TPM_EO_SIGNED_LT:
 70                    // compare A < B signed
 71                    if(CryptCompareSigned(in->operandB.t.size, infoData,
 72                                    in->operandB.t.size, in->operandB.t.buffer)   >= 0)
 73                        return TPM_RC_POLICY;
 74                    break;
 75                case TPM_EO_UNSIGNED_LT:
 76                    // compare A < B unsigned
 77                    if(CryptCompare(in->operandB.t.size, infoData,
 78                                    in->operandB.t.size, in->operandB.t.buffer)   >= 0)
 79                        return TPM_RC_POLICY;
 80                    break;
 81                case TPM_EO_SIGNED_GE:
 82                    // compare A >= B signed
 83                    if(CryptCompareSigned(in->operandB.t.size, infoData,
 84                                    in->operandB.t.size, in->operandB.t.buffer)   < 0)
 85                        return TPM_RC_POLICY;
 86                    break;
 87                case TPM_EO_UNSIGNED_GE:
 88                    // compare A >= B unsigned
 89                    if(CryptCompare(in->operandB.t.size, infoData,
 90                                    in->operandB.t.size, in->operandB.t.buffer)   < 0)
 91                        return TPM_RC_POLICY;
 92                    break;
 93                case TPM_EO_SIGNED_LE:
 94                    // compare A <= B signed
 95                    if(CryptCompareSigned(in->operandB.t.size, infoData,
 96                                    in->operandB.t.size, in->operandB.t.buffer)   > 0)
 97                        return TPM_RC_POLICY;
 98                    break;
 99                case TPM_EO_UNSIGNED_LE:
100                    // compare A <= B unsigned
101                    if(CryptCompare(in->operandB.t.size, infoData,
102                                    in->operandB.t.size, in->operandB.t.buffer)   > 0)
103                        return TPM_RC_POLICY;
104                    break;
105                case TPM_EO_BITSET:
106                    // All bits SET in B are SET in A. ((A&B)=B)
107                {
108                    UINT32 i;
109                    for (i = 0; i < in->operandB.t.size; i++)
110                        if(   (infoData[i] & in->operandB.t.buffer[i])
111                           != in->operandB.t.buffer[i])
112                            return TPM_RC_POLICY;
113                }
114                break;
115                case TPM_EO_BITCLEAR:
116                    // All bits SET in B are CLEAR in A. ((A&B)=0)
117                {
118                    UINT32 i;
119                    for (i = 0; i < in->operandB.t.size; i++)

      Family “2.0”                            TCG Published                                  Page 271
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
      Part 3: Commands                                               Trusted Platform Module Library

120                      if((infoData[i] & in->operandB.t.buffer[i]) != 0)
121                          return TPM_RC_POLICY;
122              }
123              break;
124              default:
125                  pAssert(FALSE);
126                  break;
127          }
128      }
129
130   // Internal Data Update
131
132      // Start argument list hash
133      argHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
134      // add operandB
135      CryptUpdateDigest2B(&hashState, &in->operandB.b);
136      // add offset
137      CryptUpdateDigestInt(&hashState, sizeof(UINT16), &in->offset);
138      // add operation
139      CryptUpdateDigestInt(&hashState, sizeof(TPM_EO), &in->operation);
140      // complete argument hash
141      CryptCompleteHash2B(&hashState, &argHash.b);
142
143      // update policyDigest
144      // start hash
145      CryptStartHash(session->authHashAlg, &hashState);
146
147      // add old digest
148      CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
149
150      // add commandCode
151      CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
152
153      // add argument digest
154      CryptUpdateDigest2B(&hashState, &argHash.b);
155
156      // complete the digest
157      CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
158
159       return TPM_RC_SUCCESS;
160   }
161   #endif // CC_PolicyCounterTimer




      Page 272                               TCG Published                               Family “2.0”
      October 30, 2014                  Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                             Part 3: Commands


23.11 TPM2_PolicyCommandCode

23.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     be   executed,   TPM2_PolicyCommandCode()     with   code   set   to
                TPM_CC_Certify is required.




Family “2.0”                                  TCG Published                                          Page 273
Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


23.11.2    Command and Response

                   Table 129 — TPM2_PolicyCommandCode Command
Type                    Name                   Description

                                               TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG     tag
                                               otherwise, TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode            TPM_CC_PolicyCommandCode

                                               handle for the policy session being extended
TPMI_SH_POLICY          policySession
                                               Auth Index: None

TPM_CC                  code                   the allowed commandCode


                   Table 130 — TPM2_PolicyCommandCode Response
Type                    Name                   Description

TPM_ST                  tag                    see clause 6
UINT32                  responseSize
TPM_RC                  responseCode




Page 274                                TCG Published                                    Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                                             Part 3: Commands



     23.11.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyCommandCode_fp.h"
3    #ifdef TPM_CC_PolicyCommandCode // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_VALUE                      commandCode of policySession previously set to a different value

 4   TPM_RC
 5   TPM2_PolicyCommandCode(
 6       PolicyCommandCode_In      *in                   // IN: input parameter list
 7       )
 8   {
 9       SESSION      *session;
10       TPM_CC       commandCode = TPM_CC_PolicyCommandCode;
11       HASH_STATE   hashState;
12
13   // Input validation
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       if(session->commandCode != 0 && session->commandCode != in->code)
19           return TPM_RC_VALUE + RC_PolicyCommandCode_code;
20       if(!CommandIsImplemented(in->code))
21           return TPM_RC_POLICY_CC + RC_PolicyCommandCode_code;
22
23   // Internal Data Update
24       // Update policy hash
25       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCommandCode || code)
26       // Start hash
27       CryptStartHash(session->authHashAlg, &hashState);
28
29       // add old digest
30       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
31
32       // add commandCode
33       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
34
35       // add input commandCode
36       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &in->code);
37
38       // complete the hash and get the results
39       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
40
41       // update commandCode value in session context
42       session->commandCode = in->code;
43
44       return TPM_RC_SUCCESS;
45   }
46   #endif // CC_PolicyCommandCode




     Family “2.0”                                  TCG Published                                          Page 275
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


23.12 TPM2_PolicyPhysicalPresence

23.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)          (27)




Page 276                                   TCG Published                                   Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands



23.12.2    Command and Response

                      Table 131 — TPM2_PolicyPhysicalPresence Command
Type                          Name                   Description

                                                     TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG           tag
                                                     otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicyPhysicalPresence

                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     Auth Index: None


                      Table 132 — TPM2_PolicyPhysicalPresence Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                  TCG Published                                         Page 277
Level 00 Revision 01.16             Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                Trusted Platform Module Library



     23.12.3    Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PolicyPhysicalPresence_fp.h"
 3   #ifdef TPM_CC_PolicyPhysicalPresence // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_PolicyPhysicalPresence(
 6       PolicyPhysicalPresence_In   *in             // IN: input parameter list
 7       )
 8   {
 9       SESSION      *session;
10       TPM_CC       commandCode = TPM_CC_PolicyPhysicalPresence;
11       HASH_STATE   hashState;
12
13   // Internal Data Update
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       // Update policy hash
19       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyPhysicalPresence)
20       // Start hash
21       CryptStartHash(session->authHashAlg, &hashState);
22
23       // add old digest
24       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
25
26       // add commandCode
27       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
28
29       // complete the digest
30       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
31
32       // update session attribute
33       session->attributes.isPPRequired = SET;
34
35       return TPM_RC_SUCCESS;
36   }
37   #endif // CC_PolicyPhysicalPresence




     Page 278                                TCG Published                             Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014            Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands


23.13 TPM2_PolicyCpHash

23.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                  is   set   to     cpHashA    and
policySession→policyDigest is updated with
           policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyCpHash || cpHashA)       (28)




Family “2.0”                              TCG Published                                      Page 279
Level 00 Revision 01.16            Copyright © TCG 2006-2014                         October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



23.13.2    Command and Response

                      Table 133 — TPM2_PolicyCpHash Command
Type                    Name                   Description

                                               TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG     tag
                                               present; otherwise, TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode            TPM_CC_PolicyCpHash

                                               handle for the policy session being extended
TPMI_SH_POLICY          policySession
                                               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 6
UINT32                  responseSize
TPM_RC                  responseCode




Page 280                                TCG Published                                    Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                               Part 3: Commands



     23.13.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyCpHash_fp.h"
3    #ifdef TPM_CC_PolicyCpHash // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_CPHASH                     cpHash of policySession has previously been set to a different value
     TPM_RC_SIZE                       cpHashA is not the size of a digest produced by the hash algorithm
                                       associated with policySession

 4   TPM_RC
 5   TPM2_PolicyCpHash(
 6       PolicyCpHash_In       *in                   // IN: input parameter list
 7       )
 8   {
 9       SESSION      *session;
10       TPM_CC       commandCode = TPM_CC_PolicyCpHash;
11       HASH_STATE   hashState;
12
13   // Input Validation
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       // A new cpHash is given in input parameter, but cpHash in session context
19       // is not empty, or is not the same as the new cpHash
20       if(    in->cpHashA.t.size != 0
21           && session->u1.cpHash.t.size != 0
22           && !Memory2BEqual(&in->cpHashA.b, &session->u1.cpHash.b)
23          )
24           return TPM_RC_CPHASH;
25
26       // A valid cpHash must have the same size as session hash digest
27       if(in->cpHashA.t.size != CryptGetHashDigestSize(session->authHashAlg))
28           return TPM_RC_SIZE + RC_PolicyCpHash_cpHashA;
29
30   // Internal Data Update
31
32       // Update policy hash
33       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCpHash || cpHashA)
34       // Start hash
35       CryptStartHash(session->authHashAlg, &hashState);
36
37       // add old digest
38       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
39
40       // add commandCode
41       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
42
43       // add cpHashA
44       CryptUpdateDigest2B(&hashState, &in->cpHashA.b);
45
46       // complete the digest and get the results
47       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
48
49       // update cpHash in session context
50       session->u1.cpHash = in->cpHashA;
51       session->attributes.iscpHashDefined = SET;
52
53       return TPM_RC_SUCCESS;

     Family “2.0”                                  TCG Published                                              Page 281
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
     Part 3: Commands                                        Trusted Platform Module Library

54   }
55   #endif // CC_PolicyCpHash




     Page 282                         TCG Published                            Family “2.0”
     October 30, 2014            Copyright © TCG 2006-2014        Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands


23.14 TPM2_PolicyNameHash

23.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 han dles 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       used   to   hold   policySession→cpHash   to   be    used    for
                policySession→nameHash instead.

The policySession→policyDigest will be updated with
          policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyNameHash || nameHash)                     (29)

NOTE 2          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.




Family “2.0”                                 TCG Published                                               Page 283
Level 00 Revision 01.16               Copyright © TCG 2006-2014                            October 30, 2014
Part 3: Commands                                                     Trusted Platform Module Library


23.14.2    Command and Response

                      Table 135 — TPM2_PolicyNameHash Command
Type                     Name                   Description

                                                TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG      tag
                                                present; otherwise, TPM_ST_NO_SESSIONS
UINT32                   commandSize
TPM_CC                   commandCode            TPM_CC_PolicyNameHash

                                                handle for the policy session being extended
TPMI_SH_POLICY           policySession
                                                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 6
UINT32                   responseSize
TPM_RC                   responseCode




Page 284                                 TCG Published                                    Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                                             Part 3: Commands



     23.14.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyNameHash_fp.h"
3    #ifdef TPM_CC_PolicyNameHash // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_CPHASH                     nameHash has been previously set to a different value
     TPM_RC_SIZE                       nameHash is not the size of the digest produced by the hash
                                       algorithm associated with policySession

 4   TPM_RC
 5   TPM2_PolicyNameHash(
 6       PolicyNameHash_In     *in                  // IN: input parameter list
 7       )
 8   {
 9       SESSION               *session;
10       TPM_CC                 commandCode = TPM_CC_PolicyNameHash;
11       HASH_STATE             hashState;
12
13   // Input Validation
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       // A new nameHash is given in input parameter, but cpHash in session context
19       // is not empty
20       if(in->nameHash.t.size != 0 && session->u1.cpHash.t.size != 0)
21           return TPM_RC_CPHASH;
22
23       // A valid nameHash must have the same size as session hash digest
24       if(in->nameHash.t.size != CryptGetHashDigestSize(session->authHashAlg))
25           return TPM_RC_SIZE + RC_PolicyNameHash_nameHash;
26
27   // Internal Data Update
28
29       // Update policy hash
30       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyNameHash || nameHash)
31       // Start hash
32       CryptStartHash(session->authHashAlg, &hashState);
33
34       // add old digest
35       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
36
37       // add commandCode
38       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
39
40       // add nameHash
41       CryptUpdateDigest2B(&hashState, &in->nameHash.b);
42
43       // complete the digest
44       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
45
46       // clear iscpHashDefined bit to indicate now this field contains a nameHash
47       session->attributes.iscpHashDefined = CLEAR;
48
49       // update nameHash in session context
50       session->u1.cpHash = in->nameHash;
51
52       return TPM_RC_SUCCESS;
53   }

     Family “2.0”                                  TCG Published                                        Page 285
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
     Part 3: Commands                                          Trusted Platform Module Library

54   #endif // CC_PolicyNameHash




     Page 286                           TCG Published                            Family “2.0”
     October 30, 2014              Copyright © TCG 2006-2014        Level 00 Revision 01.16
Trusted Platform Module Library                                                                    Part 3: Commands


23.15 TPM2_PolicyDuplicationSelect

23.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, t hen 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)

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

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)                                                   (32)

NOTE 4            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, policySession→commandCode 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 on ly 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”                                      TCG Published                                              Page 287
Level 00 Revision 01.16                  Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                     Trusted Platform Module Library


23.15.2    Command and Response

                   Table 137 — TPM2_PolicyDuplicationSelect Command
Type                     Name                   Description

                                                TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG      tag
                                                present; otherwise, TPM_ST_NO_SESSIONS
UINT32                   commandSize
TPM_CC                   commandCode            TPM_CC_PolicyDuplicationSelect

                                                handle for the policy session being extended
TPMI_SH_POLICY           policySession
                                                Auth Index: None

TPM2B_NAME               objectName             the Name of the object to be duplicated
TPM2B_NAME               newParentName          the Name of the new parent
                                                if YES, the objectName will be included in the value in
TPMI_YES_NO              includeObject
                                                policySession→policyDigest


                   Table 138 — TPM2_PolicyDuplicationSelect Response
Type                     Name                   Description

TPM_ST                   tag                    see clause 6
UINT32                   responseSize
TPM_RC                   responseCode




Page 288                                 TCG Published                                     Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                     Level 00 Revision 01.16
     Trusted Platform Module Library                                                        Part 3: Commands



     23.15.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyDuplicationSelect_fp.h"
3    #ifdef TPM_CC_PolicyDuplicationSelect // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_COMMAND_CODE               commandCode of 'policySession; is not empty
     TPM_RC_CPHASH                     cpHash of policySession is not empty

 4   TPM_RC
 5   TPM2_PolicyDuplicationSelect(
 6       PolicyDuplicationSelect_In       *in                 // IN: input parameter list
 7       )
 8   {
 9       SESSION           *session;
10       HASH_STATE        hashState;
11       TPM_CC            commandCode = TPM_CC_PolicyDuplicationSelect;
12
13   // Input Validation
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       // cpHash in session context must be empty
19       if(session->u1.cpHash.t.size != 0)
20           return TPM_RC_CPHASH;
21
22       // commandCode in session context must be empty
23       if(session->commandCode != 0)
24           return TPM_RC_COMMAND_CODE;
25
26   // Internal Data Update
27
28       // Update name hash
29       session->u1.cpHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
30
31       // add objectName
32       CryptUpdateDigest2B(&hashState, &in->objectName.b);
33
34       // add new parent name
35       CryptUpdateDigest2B(&hashState, &in->newParentName.b);
36
37       // complete hash
38       CryptCompleteHash2B(&hashState, &session->u1.cpHash.b);
39
40       // update policy hash
41       // Old policyDigest size should be the same as the new policyDigest size since
42       // they are using the same hash algorithm
43       session->u2.policyDigest.t.size
44               = CryptStartHash(session->authHashAlg, &hashState);
45
46       // add old policy
47       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
48
49       // add command code
50       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
51
52       // add objectName
53       if(in->includeObject == YES)
54           CryptUpdateDigest2B(&hashState, &in->objectName.b);

     Family “2.0”                                  TCG Published                                   Page 289
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

55
56      // add new parent name
57      CryptUpdateDigest2B(&hashState, &in->newParentName.b);
58
59      // add includeObject
60      CryptUpdateDigestInt(&hashState, sizeof(TPMI_YES_NO), &in->includeObject);
61
62      // complete digest
63      CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
64
65      // clear iscpHashDefined bit to indicate now this field contains a nameHash
66      session->attributes.iscpHashDefined = CLEAR;
67
68      // set commandCode in session context
69      session->commandCode = TPM_CC_Duplicate;
70
71       return TPM_RC_SUCCESS;
72   }
73   #endif // CC_PolicyDuplicationSelect




     Page 290                               TCG Published                             Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014            Level 00 Revision 01.16
Trusted Platform Module Library                                                                  Part 3: Commands


23.16 TPM2_PolicyAuthorize

23.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))                                       (34)

NOTE 1          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 check 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
update policySession→policyDigest with PolicyUpdate() (see 23.2.3).
                      PolicyUpdate(TPM_CC_PolicyAuthorize, keySign, 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 2          The unmarshaling process requires that a proper TPMT_TK_VERIFIED be provided for checkTicket
                but it may be a NULL Ticket. A NULL ticket is useful in a trial policy, where the caller uses the TPM
                to perform policy calculations but does not have a valid authorization ticket.




Family “2.0”                                    TCG Published                                              Page 291
Level 00 Revision 01.16                Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


23.16.2    Command and Response

                      Table 139 — TPM2_PolicyAuthorize Command
Type                    Name                   Description

                                               TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG     tag
                                               present; otherwise, TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode            TPM_CC_PolicyAuthorize

                                               handle for the policy session being extended
TPMI_SH_POLICY          policySession
                                               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
                                               ticket validating that approvedPolicy and policyRef were
TPMT_TK_VERIFIED        checkTicket
                                               signed by keySign


                      Table 140 — TPM2_PolicyAuthorize Response
Type                    Name                   Description

TPM_ST                  tag                    see clause 6
UINT32                  responseSize
TPM_RC                  responseCode




Page 292                                TCG Published                                    Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                                             Part 3: Commands



     23.16.3     Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyAuthorize_fp.h"
3    #ifdef TPM_CC_PolicyAuthorize // Conditional expansion of this file
4    #include "Policy_spt_fp.h"


     Error Returns                     Meaning

     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                      the current policyDigest of policySession does not match
                                       approvedPolicy; or checkTicket doesn't match the provided values

 5   TPM_RC
 6   TPM2_PolicyAuthorize(
 7       PolicyAuthorize_In    *in                   // IN: input parameter list
 8       )
 9   {
10       SESSION                     *session;
11       TPM2B_DIGEST                 authHash;
12       HASH_STATE                   hashState;
13       TPMT_TK_VERIFIED             ticket;
14       TPM_ALG_ID                   hashAlg;
15       UINT16                       digestSize;
16
17   // Input Validation
18
19       // Get pointer to the session structure
20       session = SessionGet(in->policySession);
21
22       // Extract from the Name of the key, the algorithm used to compute it's Name
23       hashAlg = BYTE_ARRAY_TO_UINT16(in->keySign.t.name);
24
25       // 'keySign' parameter needs to use a supported hash algorithm, otherwise
26       // can't tell how large the digest should be
27       digestSize = CryptGetHashDigestSize(hashAlg);
28       if(digestSize == 0)
29           return TPM_RC_HASH + RC_PolicyAuthorize_keySign;
30
31       if(digestSize != (in->keySign.t.size - 2))
32           return TPM_RC_SIZE + RC_PolicyAuthorize_keySign;
33
34       //If this is a trial policy, skip all validations
35       if(session->attributes.isTrialPolicy == CLEAR)
36       {
37           // Check that "approvedPolicy" matches the current value of the
38           // policyDigest in policy session
39           if(!Memory2BEqual(&session->u2.policyDigest.b,
40                             &in->approvedPolicy.b))
41               return TPM_RC_VALUE + RC_PolicyAuthorize_approvedPolicy;
42
43             // Validate ticket TPMT_TK_VERIFIED
44             // Compute aHash. The authorizing object sign a digest
45             // aHash := hash(approvedPolicy || policyRef).
46             // Start hash
47             authHash.t.size = CryptStartHash(hashAlg, &hashState);
48
49             // add approvedPolicy
50             CryptUpdateDigest2B(&hashState, &in->approvedPolicy.b);
51

     Family “2.0”                                   TCG Published                                         Page 293
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

52          // add policyRef
53          CryptUpdateDigest2B(&hashState, &in->policyRef.b);
54
55          // complete hash
56          CryptCompleteHash2B(&hashState, &authHash.b);
57
58          // re-compute TPMT_TK_VERIFIED
59          TicketComputeVerified(in->checkTicket.hierarchy, &authHash,
60                                &in->keySign, &ticket);
61
62          // Compare ticket digest. If not match, return error
63          if(!Memory2BEqual(&in->checkTicket.digest.b, &ticket.digest.b))
64              return TPM_RC_VALUE+ RC_PolicyAuthorize_checkTicket;
65      }
66
67   // Internal Data Update
68
69      // Set policyDigest to zero digest
70      MemorySet(session->u2.policyDigest.t.buffer, 0,
71                session->u2.policyDigest.t.size);
72
73      // Update policyDigest
74      PolicyContextUpdate(TPM_CC_PolicyAuthorize, &in->keySign, &in->policyRef,
75                          NULL, 0, session);
76
77      return TPM_RC_SUCCESS;
78
79   }
80   #endif // CC_PolicyAuthorize




     Page 294                              TCG Published                              Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands


23.17 TPM2_PolicyAuthValue

23.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 the command
being authorized using 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)                 (36)




Family “2.0”                                 TCG Published                                        Page 295
Level 00 Revision 01.16              Copyright © TCG 2006-2014                           October 30, 2014
Part 3: Commands                                                     Trusted Platform Module Library



23.17.2    Command and Response

                      Table 141 — TPM2_PolicyAuthValue Command
Type                     Name                   Description

                                                TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG      tag
                                                otherwise, TPM_ST_NO_SESSIONS
UINT32                   commandSize
TPM_CC                   commandCode            TPM_CC_PolicyAuthValue

                                                handle for the policy session being extended
TPMI_SH_POLICY           policySession
                                                Auth Index: None


                      Table 142 — TPM2_PolicyAuthValue Response
Type                     Name                   Description

TPM_ST                   tag                    see clause 6
UINT32                   responseSize
TPM_RC                   responseCode




Page 296                                 TCG Published                                    Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                            Part 3: Commands



     23.17.3    Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PolicyAuthValue_fp.h"
 3   #ifdef TPM_CC_PolicyAuthValue // Conditional expansion of this file
 4   #include "Policy_spt_fp.h"
 5   TPM_RC
 6   TPM2_PolicyAuthValue(
 7       PolicyAuthValue_In    *in            // IN: input parameter list
 8       )
 9   {
10       SESSION               *session;
11       TPM_CC                 commandCode = TPM_CC_PolicyAuthValue;
12       HASH_STATE             hashState;
13
14   // Internal Data Update
15
16       // Get pointer to the session structure
17       session = SessionGet(in->policySession);
18
19       // Update policy hash
20       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyAuthValue)
21       //   Start hash
22       CryptStartHash(session->authHashAlg, &hashState);
23
24       // add old digest
25       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
26
27       // add commandCode
28       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
29
30       // complete the hash and get the results
31       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
32
33       // update isAuthValueNeeded bit in the session context
34       session->attributes.isAuthValueNeeded = SET;
35       session->attributes.isPasswordNeeded = CLEAR;
36
37       return TPM_RC_SUCCESS;
38   }
39   #endif // CC_PolicyAuthValue




     Family “2.0”                             TCG Published                            Page 297
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


23.18 TPM2_PolicyPassword

23.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 c ontain a password and not an
                HMAC.

If successful, policySession→policyDigest will be updated with
                policyDigestnew ≔ HpolicyAlg(policyDigestold || TPM_CC_PolicyAuthValue)                          (37)

NOTE 2          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 298                                       TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands



23.18.2    Command and Response

                          Table 143 — TPM2_PolicyPassword Command
Type                          Name                   Description

                                                     TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG           tag
                                                     otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicyPassword

                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     Auth Index: None


                          Table 144 — TPM2_PolicyPassword Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                  TCG Published                                         Page 299
Level 00 Revision 01.16             Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                   Trusted Platform Module Library



     23.18.3    Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PolicyPassword_fp.h"
 3   #ifdef TPM_CC_PolicyPassword // Conditional expansion of this file
 4   #include "Policy_spt_fp.h"
 5   TPM_RC
 6   TPM2_PolicyPassword(
 7       PolicyPassword_In     *in            // IN: input parameter list
 8       )
 9   {
10       SESSION               *session;
11       TPM_CC                 commandCode = TPM_CC_PolicyAuthValue;
12       HASH_STATE             hashState;
13
14   // Internal Data Update
15
16       // Get pointer to the session structure
17       session = SessionGet(in->policySession);
18
19       // Update policy hash
20       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyAuthValue)
21       // Start hash
22       CryptStartHash(session->authHashAlg, &hashState);
23
24       // add old digest
25       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
26
27       // add commandCode
28       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
29
30       // complete the digest
31       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
32
33       // Update isPasswordNeeded bit
34       session->attributes.isPasswordNeeded = SET;
35       session->attributes.isAuthValueNeeded = CLEAR;
36
37       return TPM_RC_SUCCESS;
38   }
39   #endif // CC_PolicyPassword




     Page 300                                 TCG Published                               Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                   Part 3: Commands


23.19 TPM2_PolicyGetDigest

23.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”                             TCG Published                                    Page 301
Level 00 Revision 01.16           Copyright © TCG 2006-2014                       October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library



23.19.2    Command and Response

                      Table 145 — TPM2_PolicyGetDigest Command
Type                    Name                   Description

                                               TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG     tag
                                               present; otherwise, TPM_ST_NO_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode            TPM_CC_PolicyGetDigest

                                               handle for the policy session
TPMI_SH_POLICY          policySession
                                               Auth Index: None


                      Table 146 — TPM2_PolicyGetDigest Response
Type                    Name                   Description

TPM_ST                  tag                    see clause 6
UINT32                  responseSize
TPM_RC                  responseCode

TPM2B_DIGEST            policyDigest           the current value of the policySession→policyDigest




Page 302                                TCG Published                                   Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands



     23.19.3    Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PolicyGetDigest_fp.h"
 3   #ifdef TPM_CC_PolicyGetDigest // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_PolicyGetDigest(
 6       PolicyGetDigest_In        *in,             // IN: input parameter list
 7       PolicyGetDigest_Out       *out             // OUT: output parameter list
 8       )
 9   {
10       SESSION      *session;
11
12   // Command Output
13
14       // Get pointer to the session structure
15       session = SessionGet(in->policySession);
16
17       out->policyDigest = session->u2.policyDigest;
18
19       return TPM_RC_SUCCESS;
20   }
21   #endif // CC_PolicyGetDigest




     Family “2.0”                              TCG Published                               Page 303
     Level 00 Revision 01.16              Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


23.20 TPM2_PolicyNvWritten

23.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 an 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 1          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.

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 304                                       TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands


23.20.2    Command and Response

                          Table 147 — TPM2_PolicyNvWritten Command
Type                          Name                   Description

                                                     TPM_ST_SESSIONS if an audit session is present;
TPMI_ST_COMMAND_TAG           tag
                                                     otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode            TPM_CC_PolicyNVWritten

                                                     handle for the policy session being extended
TPMI_SH_POLICY                policySession
                                                     Auth Index: None

                                                     YES if NV Index is required to have been written
TPMI_YES_NO                   writtenSet
                                                     NO if NV Index is required not to have been written


                          Table 148 — TPM2_PolicyNvWritten Response
Type                          Name                   Description

TPM_ST                        tag                    see clause 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                  TCG Published                                         Page 305
Level 00 Revision 01.16             Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                              Trusted Platform Module Library



     23.20.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "PolicyNvWritten_fp.h"
3    #ifdef TPM_CC_PolicyNvWritten // Conditional expansion of this file

     Make an NV Index policy dependent on the state of the TPMA_NV_WRITTEN attribute of the index.

     Error Returns                   Meaning

     TPM_RC_VALUE                    a conflicting request for the attribute has already been processed

 4   TPM_RC
 5   TPM2_PolicyNvWritten(
 6       PolicyNvWritten_In    *in                 // IN: input parameter list
 7       )
 8   {
 9       SESSION      *session;
10       TPM_CC        commandCode = TPM_CC_PolicyNvWritten;
11       HASH_STATE    hashState;
12
13   // Input Validation
14
15       // Get pointer to the session structure
16       session = SessionGet(in->policySession);
17
18       // If already set is this a duplicate (the same setting)? If it
19       // is a conflicting setting, it is an error
20       if(session->attributes.checkNvWritten == SET)
21       {
22           if((    (session->attributes.nvWrittenState == SET)
23               != (in->writtenSet == YES)))
24               return TPM_RC_VALUE + RC_PolicyNvWritten_writtenSet;
25       }
26
27   // Internal Data Update
28
29       // Set session attributes so that the NV Index needs to be checked
30       session->attributes.checkNvWritten = SET;
31       session->attributes.nvWrittenState = (in->writtenSet == YES);
32
33       // Update policy hash
34       // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyNvWritten
35       //                          || writtenSet)
36       // Start hash
37       CryptStartHash(session->authHashAlg, &hashState);
38
39       // add old digest
40       CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
41
42       // add commandCode
43       CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
44
45       // add the byte of writtenState
46       CryptUpdateDigestInt(&hashState, sizeof(TPMI_YES_NO), &in->writtenSet);
47
48       // complete the digest
49       CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
50
51       return TPM_RC_SUCCESS;
52   }
53   #endif // CC_PolicyNvWritten


     Page 306                                     TCG Published                                           Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                               Part 3: Commands




Family “2.0”                           TCG Published                 Page 307
Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                           Trusted Platform Module Library



24     Hierarchy Commands

24.1     TPM2_CreatePrimary

24.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 1:         Since the sensitive data is not returned, the key cannot be reloaded.   It can either be made
                persistent or it can be recreated.

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, decrypt, 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 TPM 2.0 Part 1 and implemented in TPM 2.0 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 2          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 308                                     TCG Published                                      Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands



24.1.2 Command and Response

                           Table 149 — TPM2_CreatePrimary Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_CreatePrimary

                                                    TPM_RH_ENDORSEMENT, TPM_RH_OWNER,
                                                    TPM_RH_PLATFORM+{PP}, or TPM_RH_NULL
TPMI_RH_HIERARCHY+            @primaryHandle
                                                    Auth Index: 1
                                                    Auth Role: USER

TPM2B_SENSITIVE_CREATE        inSensitive           the sensitive data, see TPM 2.0 Part 1 Sensitive Values
TPM2B_PUBLIC                  inPublic              the public template
                                                    data that will be included in the creation data for this
TPM2B_DATA                    outsideInfo           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 6
UINT32                        responseSize
TPM_RC                        responseCode

                                                    handle of type TPM_HT_TRANSIENT for created
TPM_HANDLE                    objectHandle
                                                    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
                                                    ticket used by TPM2_CertifyCreation() to validate that
TPMT_TK_CREATION              creationTicket
                                                    the creation data was produced by the TPM
TPM2B_NAME                    name                  the name of the created object




Family “2.0”                                 TCG Published                                        Page 309
Level 00 Revision 01.16              Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                               Trusted Platform Module Library



     24.1.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "CreatePrimary_fp.h"
3    #ifdef TPM_CC_CreatePrimary // Conditional expansion of this file
4    #include "Object_spt_fp.h"
5    #include <Platform.h>


     Error Returns                  Meaning

     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                    unknown object type;

 6   TPM_RC
 7   TPM2_CreatePrimary(
 8       CreatePrimary_In    *in,                  // IN: input parameter list
 9       CreatePrimary_Out   *out                  // OUT: output parameter list
10       )
11   {
12   // Local variables
13       TPM_RC              result = TPM_RC_SUCCESS;
14       TPMT_SENSITIVE      sensitive;
15
16   // Input Validation
17       // The sensitiveDataOrigin attribute must be consistent with the setting of
18       // the size of the data object in inSensitive.
19       if(   (in->inPublic.t.publicArea.objectAttributes.sensitiveDataOrigin == SET)
20          != (in->inSensitive.t.sensitive.data.t.size == 0 ))
21           // Mismatch between the object attributes and the parameter.
22           return TPM_RC_ATTRIBUTES + RC_CreatePrimary_inSensitive;
23
24       // Check attributes in input public area. TPM_RC_ATTRIBUTES, TPM_RC_KDF,
25       // TPM_RC_SCHEME, TPM_RC_SIZE, TPM_RC_SYMMETRIC, or TPM_RC_TYPE error may
26       // be returned at this point.
27       result = PublicAttributesValidation(FALSE, in->primaryHandle,
28                                           &in->inPublic.t.publicArea);
29       if(result != TPM_RC_SUCCESS)
30           return RcSafeAddToResult(result, RC_CreatePrimary_inPublic);
31
32       // Validate the sensitive area values
33       if( MemoryRemoveTrailingZeros(&in->inSensitive.t.sensitive.userAuth)
34               > CryptGetHashDigestSize(in->inPublic.t.publicArea.nameAlg))


     Page 310                                     TCG Published                                            Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014                         Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands

35           return TPM_RC_SIZE + RC_CreatePrimary_inSensitive;
36
37   // Command output
38
39       // Generate Primary Object
40       // The primary key generation process uses the Name of the input public
41       // template to compute the key. The keys are generated from the template
42       // before anything in the template is allowed to be changed.
43       // A TPM_RC_KDF, TPM_RC_SIZE error may be returned at this point
44       result = CryptCreateObject(in->primaryHandle, &in->inPublic.t.publicArea,
45                                  &in->inSensitive.t.sensitive,&sensitive);
46       if(result != TPM_RC_SUCCESS)
47           return result;
48
49       // Fill in creation data
50       FillInCreationData(in->primaryHandle, in->inPublic.t.publicArea.nameAlg,
51                          &in->creationPCR, &in->outsideInfo, &out->creationData,
52                          &out->creationHash);
53
54       // Copy public area
55       out->outPublic = in->inPublic;
56
57       // Fill in private area for output
58       ObjectComputeName(&(out->outPublic.t.publicArea), &out->name);
59
60       // Compute creation ticket
61       TicketComputeCreation(EntityGetHierarchy(in->primaryHandle), &out->name,
62                             &out->creationHash, &out->creationTicket);
63
64       // Create a internal object. A TPM_RC_OBJECT_MEMORY error may be returned
65       // at this point.
66       result = ObjectLoad(in->primaryHandle, &in->inPublic.t.publicArea, &sensitive,
67                           &out->name, in->primaryHandle, TRUE, &out->objectHandle);
68
69       return result;
70   }
71   #endif // CC_CreatePrimary




     Family “2.0”                           TCG Published                                  Page 311
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
Part 3: Commands                                                           Trusted Platform Module Library


24.2   TPM2_HierarchyControl

24.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                          or
ownerAuth/ownerPolicy is provided. shEnable may be SET if platformAuth/platformPolicy is provided.
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 Owner
Authorization). 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 Platform
Authorization). 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 312                                     TCG Published                                    Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands



24.2.2 Command and Response

                          Table 151 — TPM2_HierarchyControl Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS

UINT32                        commandSize

TPM_CC                        commandCode           TPM_CC_HierarchyControl {NV E}

                                                    TPM_RH_ENDORSEMENT, TPM_RH_OWNER or
                                                    TPM_RH_PLATFORM+{PP}
TPMI_RH_HIERARCHY             @authHandle
                                                    Auth Index: 1
                                                    Auth Role: USER

                                                    the enable being modified
TPMI_RH_ENABLES               enable                TPM_RH_ENDORSEMENT, TPM_RH_OWNER,
                                                    TPM_RH_PLATFORM, or TPM_RH_PLATFORM_NV
                                                    YES if the enable should be SET, NO if the enable
TPMI_YES_NO                   state
                                                    should be CLEAR


                          Table 152 — TPM2_HierarchyControl Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6

UINT32                        responseSize

TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                      Page 313
Level 00 Revision 01.16               Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     24.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "HierarchyControl_fp.h"
3    #ifdef TPM_CC_HierarchyControl // Conditional expansion of this file


     Error Returns               Meaning

     TPM_RC_AUTH_TYPE            authHandle is not applicable to hierarchy in its current state

 4   TPM_RC
 5   TPM2_HierarchyControl(
 6       HierarchyControl_In    *in                 // IN: input parameter list
 7       )
 8   {
 9       TPM_RC      result;
10       BOOL        select = (in->state == YES);
11       BOOL        *selected = NULL;
12
13   // Input Validation
14       switch(in->enable)
15       {
16           // Platform hierarchy has to be disabled by platform auth
17           // If the platform hierarchy has already been disabled, only a reboot
18           // can enable it again
19           case TPM_RH_PLATFORM:
20           case TPM_RH_PLATFORM_NV:
21               if(in->authHandle != TPM_RH_PLATFORM)
22                   return TPM_RC_AUTH_TYPE;
23               break;
24
25           // ShEnable may be disabled if PlatformAuth/PlatformPolicy or
26           // OwnerAuth/OwnerPolicy is provided. If ShEnable is disabled, then it
27           // may only be enabled if PlatformAuth/PlatformPolicy is provided.
28           case TPM_RH_OWNER:
29               if(   in->authHandle != TPM_RH_PLATFORM
30                  && in->authHandle != TPM_RH_OWNER)
31                   return TPM_RC_AUTH_TYPE;
32               if(   gc.shEnable == FALSE && in->state == YES
33                  && in->authHandle != TPM_RH_PLATFORM)
34                   return TPM_RC_AUTH_TYPE;
35               break;
36
37           // EhEnable may be disabled if either PlatformAuth/PlatformPolicy or
38           // EndosementAuth/EndorsementPolicy is provided. If EhEnable is disabled,
39           // then it may only be enabled if PlatformAuth/PlatformPolicy is
40           // provided.
41           case TPM_RH_ENDORSEMENT:
42               if(   in->authHandle != TPM_RH_PLATFORM
43                  && in->authHandle != TPM_RH_ENDORSEMENT)
44                   return TPM_RC_AUTH_TYPE;
45               if(   gc.ehEnable == FALSE && in->state == YES
46                  && in->authHandle != TPM_RH_PLATFORM)
47                   return TPM_RC_AUTH_TYPE;
48               break;
49           default:
50               pAssert(FALSE);
51               break;
52       }
53
54   // Internal Data Update
55
56       // Enable or disable the selected hierarchy

     Page 314                                 TCG Published                                       Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014                        Level 00 Revision 01.16
      Trusted Platform Module Library                                             Part 3: Commands

 57       // Note: the authorization processing for this command may keep these
 58       // command actions from being executed. For example, if phEnable is
 59       // CLEAR, then platformAuth cannot be used for authorization. This
 60       // means that would not be possible to use platformAuth to change the
 61       // state of phEnable from CLEAR to SET.
 62       // If it is decided that platformPolicy can still be used when phEnable
 63       // is CLEAR, then this code could SET phEnable when proper platform
 64       // policy is provided.
 65       switch(in->enable)
 66       {
 67           case TPM_RH_OWNER:
 68               selected = &gc.shEnable;
 69               break;
 70           case TPM_RH_ENDORSEMENT:
 71               selected = &gc.ehEnable;
 72               break;
 73           case TPM_RH_PLATFORM:
 74               selected = &g_phEnable;
 75               break;
 76           case TPM_RH_PLATFORM_NV:
 77               selected = &gc.phEnableNV;
 78               break;
 79           default:
 80               pAssert(FALSE);
 81               break;
 82       }
 83       if(selected != NULL && *selected != select)
 84       {
 85           // Before changing the internal state, make sure that NV is available.
 86           // Only need to update NV if changing the orderly state
 87           if(gp.orderlyState != SHUTDOWN_NONE)
 88           {
 89               // The command needs NV update. Check if NV is available.
 90               // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
 91               // this point
 92               result = NvIsAvailable();
 93               if(result != TPM_RC_SUCCESS)
 94                   return result;
 95           }
 96           // state is changing and NV is available so modify
 97           *selected = select;
 98           // If a hierarchy was just disabled, flush it
 99           if(select == CLEAR && in->enable != TPM_RH_PLATFORM_NV)
100           // Flush hierarchy
101               ObjectFlushHierarchy(in->enable);
102
103           // orderly state should be cleared because of the update to state clear data
104           // This gets processed in ExecuteCommand() on the way out.
105           g_clearOrderly = TRUE;
106       }
107       return TPM_RC_SUCCESS;
108   }
109   #endif // CC_HierarchyControl




      Family “2.0”                           TCG Published                                   Page 315
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


24.3   TPM2_SetPrimaryPolicy

24.3.1 General Description

This command allows setting of the authorization policy for the lockout (lockoutPolicy), 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 316                                    TCG Published                                  Family “2.0”
October 30, 2014                     Copyright © TCG 2006-2014                Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands



24.3.2 Command and Response

                          Table 153 — TPM2_SetPrimaryPolicy Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS

UINT32                        commandSize

TPM_CC                        commandCode           TPM_CC_SetPrimaryPolicy {NV}

                                                    TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT,
                                                    TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
TPMI_RH_HIERARCHY_AUTH        @authHandle
                                                    Auth Index: 1
                                                    Auth Role: USER

                                                    an authorization policy digest; may be the Empty Buffer
TPM2B_DIGEST                  authPolicy            If hashAlg is TPM_ALG_NULL, then this shall be an
                                                    Empty Buffer.
                                                    the hash algorithm to use for the policy
TPMI_ALG_HASH+                hashAlg               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 6

UINT32                        responseSize

TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                          Page 317
Level 00 Revision 01.16             Copyright © TCG 2006-2014                             October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     24.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "SetPrimaryPolicy_fp.h"
3    #ifdef TPM_CC_SetPrimaryPolicy // Conditional expansion of this file


     Error Returns               Meaning

     TPM_RC_SIZE                 size of input authPolicy is not consistent with input hash algorithm

 4   TPM_RC
 5   TPM2_SetPrimaryPolicy(
 6       SetPrimaryPolicy_In    *in                 // IN: input parameter list
 7       )
 8   {
 9       TPM_RC                  result;
10
11   // Input Validation
12
13       // Check the authPolicy consistent with hash algorithm. If the policy size is
14       // zero, then the algorithm is required to be TPM_ALG_NULL
15       if(in->authPolicy.t.size != CryptGetHashDigestSize(in->hashAlg))
16           return TPM_RC_SIZE + RC_SetPrimaryPolicy_authPolicy;
17
18       // The command need NV update for OWNER and ENDORSEMENT hierarchy, and
19       // might need orderlyState update for PLATFROM hierarchy.
20       // Check if NV is available. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE
21       // error may be returned at this point
22       result = NvIsAvailable();
23       if(result != TPM_RC_SUCCESS)
24           return result;
25
26   // Internal Data Update
27
28       // Set hierarchy policy
29       switch(in->authHandle)
30       {
31           case TPM_RH_OWNER:
32               gp.ownerAlg = in->hashAlg;
33               gp.ownerPolicy = in->authPolicy;
34               NvWriteReserved(NV_OWNER_ALG, &gp.ownerAlg);
35               NvWriteReserved(NV_OWNER_POLICY, &gp.ownerPolicy);
36               break;
37           case TPM_RH_ENDORSEMENT:
38               gp.endorsementAlg = in->hashAlg;
39               gp.endorsementPolicy = in->authPolicy;
40               NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
41               NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
42               break;
43           case TPM_RH_PLATFORM:
44               gc.platformAlg = in->hashAlg;
45               gc.platformPolicy = in->authPolicy;
46               // need to update orderly state
47               g_clearOrderly = TRUE;
48               break;
49           case TPM_RH_LOCKOUT:
50               gp.lockoutAlg = in->hashAlg;
51               gp.lockoutPolicy = in->authPolicy;
52               NvWriteReserved(NV_LOCKOUT_ALG, &gp.lockoutAlg);
53               NvWriteReserved(NV_LOCKOUT_POLICY, &gp.lockoutPolicy);
54               break;
55
56           default:

     Page 318                                 TCG Published                                             Family “2.0”
     October 30, 2014                 Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

57                pAssert(FALSE);
58                break;
59       }
60
61       return TPM_RC_SUCCESS;
62   }
63   #endif // CC_SetPrimaryPolicy




     Family “2.0”                           TCG Published                 Page 319
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


24.4     TPM2_ChangePPS

24.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          Platform Authorization is not changed.

All resident 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 Platform Authorization.




Page 320                                       TCG Published                                       Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                             Part 3: Commands



24.4.2 Command and Response

                            Table 155 — TPM2_ChangePPS Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_ChangePPS {NV E}

                                                  TPM_RH_PLATFORM+{PP}
 TPMI_RH_PLATFORM             @authHandle         Auth Index: 1
                                                  Auth Role: USER


                             Table 156 — TPM2_ChangePPS Response
 Type                         Name                Description
 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                             Page 321
Level 00 Revision 01.16             Copyright © TCG 2006-2014               October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library



     24.4.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "ChangePPS_fp.h"
 3   #ifdef TPM_CC_ChangePPS // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_ChangePPS(
 6       ChangePPS_In   *in             // IN: input parameter list
 7       )
 8   {
 9       UINT32         i;
10       TPM_RC         result;
11
12       // Check if NV is available. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE
13       // error may be returned at this point
14       result = NvIsAvailable();
15       if(result != TPM_RC_SUCCESS) return result;
16
17       // Input parameter is not reference in command action
18       in = NULL;
19
20   // Internal Data Update
21
22       // Reset platform hierarchy seed from RNG
23       CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.PPSeed.t.buffer);
24
25       // Create a new phProof value from RNG to prevent the saved platform
26       // hierarchy contexts being loaded
27       CryptGenerateRandom(PROOF_SIZE, gp.phProof.t.buffer);
28
29       // Set platform authPolicy to null
30       gc.platformAlg = TPM_ALG_NULL;
31       gc.platformPolicy.t.size = 0;
32
33       // Flush loaded object in platform hierarchy
34       ObjectFlushHierarchy(TPM_RH_PLATFORM);
35
36       // Flush platform evict object and index in NV
37       NvFlushHierarchy(TPM_RH_PLATFORM);
38
39       // Save hierarchy changes to NV
40       NvWriteReserved(NV_PP_SEED, &gp.PPSeed);
41       NvWriteReserved(NV_PH_PROOF, &gp.phProof);
42
43       // Re-initialize PCR policies
44       for(i = 0; i < NUM_POLICY_PCR_GROUP; i++)
45       {
46           gp.pcrPolicies.hashAlg[i] = TPM_ALG_NULL;
47           gp.pcrPolicies.policy[i].t.size = 0;
48       }
49       NvWriteReserved(NV_PCR_POLICIES, &gp.pcrPolicies);
50
51       // orderly state should be cleared because of the update to state clear data
52       g_clearOrderly = TRUE;
53
54       return TPM_RC_SUCCESS;
55   }
56   #endif // CC_ChangePPS




     Page 322                                 TCG Published                              Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014              Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


24.5   TPM2_ChangeEPS

24.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 resident objects (transient or persistent) 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 Platform Authorization.




Family “2.0”                                   TCG Published                                             Page 323
Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                           Trusted Platform Module Library



24.5.2 Command and Response

                       Table 157 — TPM2_ChangeEPS Command
 Type                   Name                Description

 TPMI_ST_COMMAND_TAG    tag                 TPM_ST_SESSIONS
 UINT32                 commandSize
 TPM_CC                 commandCode         TPM_CC_ChangeEPS {NV E}

                                            TPM_RH_PLATFORM+{PP}
 TPMI_RH_PLATFORM       @authHandle         Auth Handle: 1
                                            Auth Role: USER


                       Table 158 — TPM2_ChangeEPS Response
 Type                   Name                Description
 TPM_ST                 tag                 see clause 6
 UINT32                 responseSize
 TPM_RC                 responseCode




Page 324                           TCG Published                             Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014         Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands



     24.5.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "ChangeEPS_fp.h"
 3   #ifdef TPM_CC_ChangeEPS // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_ChangeEPS(
 6       ChangeEPS_In     *in              // IN: input parameter list
 7       )
 8   {
 9       TPM_RC           result;
10
11       // The command needs NV update. Check if NV is available.
12       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
13       // this point
14       result = NvIsAvailable();
15       if(result != TPM_RC_SUCCESS) return result;
16
17       // Input parameter is not reference in command action
18       in = NULL;
19
20   // Internal Data Update
21
22       // Reset endorsement hierarchy seed from RNG
23       CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.EPSeed.t.buffer);
24
25       // Create new ehProof value from RNG
26       CryptGenerateRandom(PROOF_SIZE, gp.ehProof.t.buffer);
27
28       // Enable endorsement hierarchy
29       gc.ehEnable = TRUE;
30
31       // set authValue buffer to zeros
32       MemorySet(gp.endorsementAuth.t.buffer, 0, gp.endorsementAuth.t.size);
33       // Set endorsement authValue to null
34       gp.endorsementAuth.t.size = 0;
35
36       // Set endorsement authPolicy to null
37       gp.endorsementAlg = TPM_ALG_NULL;
38       gp.endorsementPolicy.t.size = 0;
39
40       // Flush loaded object in endorsement hierarchy
41       ObjectFlushHierarchy(TPM_RH_ENDORSEMENT);
42
43       // Flush evict object of endorsement hierarchy stored in NV
44       NvFlushHierarchy(TPM_RH_ENDORSEMENT);
45
46       // Save hierarchy changes to NV
47       NvWriteReserved(NV_EP_SEED, &gp.EPSeed);
48       NvWriteReserved(NV_EH_PROOF, &gp.ehProof);
49       NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
50       NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
51       NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
52
53       // orderly state should be cleared because of the update to state clear data
54       g_clearOrderly = TRUE;
55
56       return TPM_RC_SUCCESS;
57   }
58   #endif // CC_ChangeEPS




     Family “2.0”                             TCG Published                             Page 325
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


24.6    TPM2_Clear

24.6.1 General Description

This command removes all TPM context associated with a specific Owner.
The clear operation will:
       flush resident 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, endorsementPolicy, and lockoutPolicy to the Empty Buffer;
       set Clock to zero;
       set resetCount to zero;
       set restartCount to zero; and
       set Safe to YES.
This command requires Platform Authorization or Lockout Authorization. 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.




Page 326                                       TCG Published                                       Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                             Part 3: Commands



24.6.2 Command and Response

                                  Table 159 — TPM2_Clear Command
 Type                         Name                 Description

 TPMI_ST_COMMAND_TAG          tag                  TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode          TPM_CC_Clear {NV E}

                                                   TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
 TPMI_RH_CLEAR                @authHandle          Auth Handle: 1
                                                   Auth Role: USER


                                  Table 160 — TPM2_Clear Response
 Type                         Name                 Description
 TPM_ST                       tag                  see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                            Page 327
Level 00 Revision 01.16             Copyright © TCG 2006-2014               October 30, 2014
     Part 3: Commands                                                       Trusted Platform Module Library



     24.6.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Clear_fp.h"
3    #ifdef TPM_CC_Clear // Conditional expansion of this file


     Error Returns                   Meaning

     TPM_RC_DISABLED                 Clear command has been disabled

 4   TPM_RC
 5   TPM2_Clear(
 6       Clear_In          *in                // IN: input parameter list
 7       )
 8   {
 9       TPM_RC                  result;
10
11       // Input parameter is not reference in command action
12       in = NULL;
13
14       // The command needs NV update. Check if NV is available.
15       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
16       // this point
17       result = NvIsAvailable();
18       if(result != TPM_RC_SUCCESS) return result;
19
20   // Input Validation
21
22       // If Clear command is disabled, return an error
23       if(gp.disableClear)
24           return TPM_RC_DISABLED;
25
26   // Internal Data Update
27
28       // Reset storage hierarchy seed from RNG
29       CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.SPSeed.t.buffer);
30
31       // Create new shProof and ehProof value from RNG
32       CryptGenerateRandom(PROOF_SIZE, gp.shProof.t.buffer);
33       CryptGenerateRandom(PROOF_SIZE, gp.ehProof.t.buffer);
34
35       // Enable storage and endorsement hierarchy
36       gc.shEnable = gc.ehEnable = TRUE;
37
38       // set the authValue buffers to zero
39       MemorySet(gp.ownerAuth.t.buffer, 0, gp.ownerAuth.t.size);
40       MemorySet(gp.endorsementAuth.t.buffer, 0, gp.endorsementAuth.t.size);
41       MemorySet(gp.lockoutAuth.t.buffer, 0, gp.lockoutAuth.t.size);
42       // Set storage, endorsement and lockout authValue to null
43       gp.ownerAuth.t.size = gp.endorsementAuth.t.size = gp.lockoutAuth.t.size = 0;
44
45       // Set storage, endorsement, and lockout authPolicy to null
46       gp.ownerAlg = gp.endorsementAlg = gp.lockoutAlg = TPM_ALG_NULL;
47       gp.ownerPolicy.t.size = 0;
48       gp.endorsementPolicy.t.size = 0;
49       gp.lockoutPolicy.t.size = 0;
50
51       // Flush loaded object in storage and endorsement hierarchy
52       ObjectFlushHierarchy(TPM_RH_OWNER);
53       ObjectFlushHierarchy(TPM_RH_ENDORSEMENT);
54
55       // Flush owner and endorsement object and owner index in NV
56       NvFlushHierarchy(TPM_RH_OWNER);

     Page 328                                    TCG Published                                Family “2.0”
     October 30, 2014                      Copyright © TCG 2006-2014             Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

57       NvFlushHierarchy(TPM_RH_ENDORSEMENT);
58
59       // Save hierarchy changes to NV
60       NvWriteReserved(NV_SP_SEED, &gp.SPSeed);
61       NvWriteReserved(NV_SH_PROOF, &gp.shProof);
62       NvWriteReserved(NV_EH_PROOF, &gp.ehProof);
63       NvWriteReserved(NV_OWNER_AUTH, &gp.ownerAuth);
64       NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
65       NvWriteReserved(NV_LOCKOUT_AUTH, &gp.lockoutAuth);
66       NvWriteReserved(NV_OWNER_ALG, &gp.ownerAlg);
67       NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
68       NvWriteReserved(NV_LOCKOUT_ALG, &gp.lockoutAlg);
69       NvWriteReserved(NV_OWNER_POLICY, &gp.ownerPolicy);
70       NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
71       NvWriteReserved(NV_LOCKOUT_POLICY, &gp.lockoutPolicy);
72
73       // Initialize dictionary attack parameters
74       DAPreInstall_Init();
75
76       // Reset clock
77       go.clock = 0;
78       go.clockSafe = YES;
79       // Update the DRBG state whenever writing orderly state to NV
80       CryptDrbgGetPutState(GET_STATE);
81       NvWriteReserved(NV_ORDERLY_DATA, &go);
82
83       // Reset counters
84       gp.resetCount = gr.restartCount = gr.clearCount = 0;
85       gp.auditCounter = 0;
86       NvWriteReserved(NV_RESET_COUNT, &gp.resetCount);
87       NvWriteReserved(NV_AUDIT_COUNTER, &gp.auditCounter);
88
89       // orderly state should be cleared because of the update to state clear data
90       g_clearOrderly = TRUE;
91
92       return TPM_RC_SUCCESS;
93   }
94   #endif // CC_Clear




     Family “2.0”                           TCG Published                               Page 329
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                           Trusted Platform Module Library


24.7   TPM2_ClearControl

24.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 Platform
               Authorization to CLEAR the disableClear attribute and then execute TPM2_Clear().

Lockout Authorization may be used to SET disableClear but not to CLEAR it.
Platform Authorization may be used to SET or CLEAR disableClear.




Page 330                                    TCG Published                                       Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands



24.7.2 Command and Response

                            Table 161 — TPM2_ClearControl Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_ClearControl {NV}

                                                  TPM_RH_LOCKOUT or TPM_RH_PLATFORM+{PP}
 TPMI_RH_CLEAR                @auth               Auth Handle: 1
                                                  Auth Role: USER

                                                  YES if the disableOwnerClear flag is to be SET, NO if
 TPMI_YES_NO                  disable
                                                  the flag is to be CLEAR.


                            Table 162 — TPM2_ClearControl Response
 Type                         Name                Description

 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                                        Page 331
Level 00 Revision 01.16             Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                      Trusted Platform Module Library



     24.7.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ClearControl_fp.h"
3    #ifdef TPM_CC_ClearControl // Conditional expansion of this file


     Error Returns                   Meaning

     TPM_RC_AUTH_FAIL                authorization is not properly given

 4   TPM_RC
 5   TPM2_ClearControl(
 6       ClearControl_In       *in                 // IN: input parameter list
 7       )
 8   {
 9       TPM_RC      result;
10
11       // The command needs NV update. Check if NV is available.
12       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
13       // this point
14       result = NvIsAvailable();
15       if(result != TPM_RC_SUCCESS) return result;
16
17   // Input Validation
18
19       // LockoutAuth may be used to set disableLockoutClear to TRUE but not to FALSE
20       if(in->auth == TPM_RH_LOCKOUT && in->disable == NO)
21           return TPM_RC_AUTH_FAIL;
22
23   // Internal Data Update
24
25       if(in->disable == YES)
26           gp.disableClear = TRUE;
27       else
28           gp.disableClear = FALSE;
29
30       // Record the change to NV
31       NvWriteReserved(NV_DISABLE_CLEAR, &gp.disableClear);
32
33       return TPM_RC_SUCCESS;
34   }
35   #endif // CC_ClearControl




     Page 332                                     TCG Published                              Family “2.0”
     October 30, 2014                    Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                             Part 3: Commands


24.8   TPM2_HierarchyChangeAuth

24.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 26.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.




Family “2.0”                                  TCG Published                                          Page 333
Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library


24.8.2 Command and Response

                   Table 163 — TPM2_HierarchyChangeAuth Command
Type                     Name                  Description

TPMI_ST_COMMAND_TAG      tag                   TPM_ST_SESSIONS
UINT32                   commandSize
TPM_CC                   commandCode           TPM_CC_HierarchyChangeAuth {NV}

                                               TPM_RH_LOCKOUT, TPM_RH_ENDORSEMENT,
                                               TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
TPMI_RH_HIERARCHY_AUTH   @authHandle
                                               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 6
UINT32                   responseSize
TPM_RC                   responseCode




Page 334                                TCG Published                                Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                                                Part 3: Commands



     24.8.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "HierarchyChangeAuth_fp.h"
3    #ifdef TPM_CC_HierarchyChangeAuth // Conditional expansion of this file
4    #include "Object_spt_fp.h"


     Error Returns                     Meaning

     TPM_RC_SIZE                       newAuth size is greater than that of integrity hash digest

 5   TPM_RC
 6   TPM2_HierarchyChangeAuth(
 7       HierarchyChangeAuth_In    *in                    // IN: input parameter list
 8       )
 9   {
10       TPM_RC       result;
11
12       // The command needs NV update. Check if NV is available.
13       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
14       // this point
15       result = NvIsAvailable();
16       if(result != TPM_RC_SUCCESS) return result;
17
18       // Make sure the the auth value is a reasonable size (not larger than
19       // the size of the digest produced by the integrity hash. The integrity
20       // hash is assumed to produce the longest digest of any hash implemented
21       // on the TPM.
22       if( MemoryRemoveTrailingZeros(&in->newAuth)
23               > CryptGetHashDigestSize(CONTEXT_INTEGRITY_HASH_ALG))
24           return TPM_RC_SIZE + RC_HierarchyChangeAuth_newAuth;
25
26       // Set hierarchy authValue
27       switch(in->authHandle)
28       {
29       case TPM_RH_OWNER:
30           gp.ownerAuth = in->newAuth;
31           NvWriteReserved(NV_OWNER_AUTH, &gp.ownerAuth);
32           break;
33       case TPM_RH_ENDORSEMENT:
34           gp.endorsementAuth = in->newAuth;
35           NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
36           break;
37       case TPM_RH_PLATFORM:
38           gc.platformAuth = in->newAuth;
39           // orderly state should be cleared
40           g_clearOrderly = TRUE;
41           break;
42       case TPM_RH_LOCKOUT:
43           gp.lockoutAuth = in->newAuth;
44           NvWriteReserved(NV_LOCKOUT_AUTH, &gp.lockoutAuth);
45           break;
46       default:
47           pAssert(FALSE);
48           break;
49       }
50
51       return TPM_RC_SUCCESS;
52   }
53   #endif // CC_HierarchyChangeAuth




     Family “2.0”                                   TCG Published                                          Page 335
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                October 30, 2014
Part 3: Commands                                                             Trusted Platform Module Library


25     Dictionary Attack Functions

25.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).

25.2    TPM2_DictionaryAttackLockReset

25.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 lockoutAuth authorization failure is allowed for this command during a lockoutRecovery interval
(set using TPM2_DictionaryAttackParameters().




Page 336                                     TCG Published                                        Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                 Part 3: Commands



25.2.2 Command and Response

                    Table 165 — TPM2_DictionaryAttackLockReset Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_DictionaryAttackLockReset {NV}

                                                  TPM_RH_LOCKOUT
 TPMI_RH_LOCKOUT              @lockHandle         Auth Index: 1
                                                  Auth Role: USER


                     Table 166 — TPM2_DictionaryAttackLockReset Response
 Type                         Name                Description
 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                                    Page 337
Level 00 Revision 01.16             Copyright © TCG 2006-2014                   October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library



     25.2.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "DictionaryAttackLockReset_fp.h"
 3   #ifdef TPM_CC_DictionaryAttackLockReset // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_DictionaryAttackLockReset(
 6       DictionaryAttackLockReset_In      *in             // IN: input parameter list
 7       )
 8   {
 9       TPM_RC         result;
10
11       // Input parameter is not reference in command action
12       in = NULL;
13
14       // The command needs NV update. Check if NV is available.
15       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
16       // this point
17       result = NvIsAvailable();
18       if(result != TPM_RC_SUCCESS) return result;
19
20   // Internal Data Update
21
22       // Set failed tries to 0
23       gp.failedTries = 0;
24
25       // Record the changes to NV
26       NvWriteReserved(NV_FAILED_TRIES, &gp.failedTries);
27
28       return TPM_RC_SUCCESS;
29   }
30   #endif // CC_DictionaryAttackLockReset




     Page 338                                    TCG Published                           Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014            Level 00 Revision 01.16
Trusted Platform Module Library                                                               Part 3: Commands


25.3   TPM2_DictionaryAttackParameters

25.3.1 General Description

This command changes the lockout parameters.
The command requires Lockout Authorization.
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 lockoutAuth authorization failure is allowed for this command during a lockoutRecovery interval.




Family “2.0”                                  TCG Published                                            Page 339
Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library



25.3.2 Command and Response

                   Table 167 — TPM2_DictionaryAttackParameters Command
 Type                      Name                Description

 TPMI_ST_COMMAND_TAG       tag                 TPM_ST_SESSIONS
 UINT32                    commandSize
 TPM_CC                    commandCode         TPM_CC_DictionaryAttackParameters {NV}

                                               TPM_RH_LOCKOUT
 TPMI_RH_LOCKOUT           @lockHandle         Auth Index: 1
                                               Auth Role: USER

                                               count of authorization failures before the lockout is
 UINT32                    newMaxTries
                                               imposed
                                               time in seconds before the authorization failure count
                                               is automatically decremented
 UINT32                    newRecoveryTime
                                               A value of zero indicates that DA protection is
                                               disabled.
                                               time in seconds after a lockoutAuth failure before use
 UINT32                    lockoutRecovery     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 6
 UINT32                    responseSize
 TPM_RC                    responseCode




Page 340                              TCG Published                                        Family “2.0”
October 30, 2014                 Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                              Part 3: Commands



     25.3.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "DictionaryAttackParameters_fp.h"
 3   #ifdef TPM_CC_DictionaryAttackParameters // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_DictionaryAttackParameters(
 6       DictionaryAttackParameters_In    *in             // IN: input parameter list
 7       )
 8   {
 9       TPM_RC           result;
10
11       // The command needs NV update. Check if NV is available.
12       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
13       // this point
14       result = NvIsAvailable();
15       if(result != TPM_RC_SUCCESS) return result;
16
17   // Internal Data Update
18
19       // Set dictionary attack parameters
20       gp.maxTries = in->newMaxTries;
21       gp.recoveryTime = in->newRecoveryTime;
22       gp.lockoutRecovery = in->lockoutRecovery;
23
24       // Set failed tries to 0
25       gp.failedTries = 0;
26
27       // Record the changes to NV
28       NvWriteReserved(NV_FAILED_TRIES, &gp.failedTries);
29       NvWriteReserved(NV_MAX_TRIES, &gp.maxTries);
30       NvWriteReserved(NV_RECOVERY_TIME, &gp.recoveryTime);
31       NvWriteReserved(NV_LOCKOUT_RECOVERY, &gp.lockoutRecovery);
32
33       return TPM_RC_SUCCESS;
34   }
35   #endif // CC_DictionaryAttackParameters




     Family “2.0”                               TCG Published                            Page 341
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                  October 30, 2014
Part 3: Commands                                                             Trusted Platform Module Library


26     Miscellaneous Management Functions

26.1    Introduction

This clause contains commands that do not logically group with any other commands.

26.2    TPM2_PP_Commands

26.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.




Page 342                                     TCG Published                                     Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands



26.2.2 Command and Response

                           Table 169 — TPM2_PP_Commands Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_PP_Commands {NV}

                                                  TPM_RH_PLATFORM+PP
 TPMI_RH_PLATFORM             @auth               Auth Index: 1
                                                  Auth Role: USER + Physical Presence

                                                  list of commands to be added to those that will require
 TPML_CC                      setList
                                                  that Physical Presence be asserted
                                                  list of commands that will no longer require that
 TPML_CC                      clearList
                                                  Physical Presence be asserted


                           Table 170 — TPM2_PP_Commands Response
 Type                         Name                Description

 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                                         Page 343
Level 00 Revision 01.16             Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                  Trusted Platform Module Library



     26.2.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "PP_Commands_fp.h"
 3   #ifdef TPM_CC_PP_Commands // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_PP_Commands(
 6       PP_Commands_In   *in           // IN: input parameter list
 7       )
 8   {
 9       UINT32           i;
10
11       TPM_RC      result;
12
13       // The command needs NV update. Check if NV is available.
14       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
15       // this point
16       result = NvIsAvailable();
17       if(result != TPM_RC_SUCCESS) return result;
18
19   // Internal Data Update
20
21       // Process set list
22       for(i = 0; i < in->setList.count; i++)
23           // If command is implemented, set it as PP required. If the input
24           // command is not a PP command, it will be ignored at
25           // PhysicalPresenceCommandSet().
26           if(CommandIsImplemented(in->setList.commandCodes[i]))
27               PhysicalPresenceCommandSet(in->setList.commandCodes[i]);
28
29       // Process clear list
30       for(i = 0; i < in->clearList.count; i++)
31           // If command is implemented, clear it as PP required. If the input
32           // command is not a PP command, it will be ignored at
33           // PhysicalPresenceCommandClear(). If the input command is
34           // TPM2_PP_Commands, it will be ignored as well
35           if(CommandIsImplemented(in->clearList.commandCodes[i]))
36               PhysicalPresenceCommandClear(in->clearList.commandCodes[i]);
37
38       // Save the change of PP list
39       NvWriteReserved(NV_PP_LIST, &gp.ppList);
40
41       return TPM_RC_SUCCESS;
42   }
43   #endif // CC_PP_Commands




     Page 344                               TCG Published                                Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014              Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands


26.3   TPM2_SetAlgorithmSet

26.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 would require
                modification of the unmarshaling code so that each time an algorithm is unmarshaled, it would be
                verified as being enabled.




Family “2.0”                                  TCG Published                                          Page 345
Level 00 Revision 01.16               Copyright © TCG 2006-2014                            October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


26.3.2 Command and Response

                       Table 171 — TPM2_SetAlgorithmSet Command
 Type                     Name                   Description

 TPMI_ST_COMMAND_TAG      tag                    TPM_ST_SESSIONS
 UINT32                   commandSize
 TPM_CC                   commandCode            TPM_CC_SetAlgorithmSet {NV}

                                                 TPM_RH_PLATFORM
 TPMI_RH_PLATFORM         @authHandle            Auth Index: 1
                                                 Auth Role: USER

                                                 a TPM vendor-dependent value indicating the
 UINT32                   algorithmSet
                                                 algorithm set selection


                       Table 172 — TPM2_SetAlgorithmSet Response
 Type                     Name                   Description

 TPM_ST                   tag                    see clause 6
 UINT32                   responseSize
 TPM_RC                   responseCode




Page 346                                 TCG Published                                  Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands



     26.3.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "SetAlgorithmSet_fp.h"
 3   #ifdef TPM_CC_SetAlgorithmSet // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_SetAlgorithmSet(
 6       SetAlgorithmSet_In     *in            // IN: input parameter list
 7       )
 8   {
 9       TPM_RC       result;
10
11       // The command needs NV update. Check if NV is available.
12       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
13       // this point
14       result = NvIsAvailable();
15       if(result != TPM_RC_SUCCESS) return result;
16
17   // Internal Data Update
18       gp.algorithmSet = in->algorithmSet;
19
20       // Write the algorithm set changes to NV
21       NvWriteReserved(NV_ALGORITHM_SET, &gp.algorithmSet);
22
23       return TPM_RC_SUCCESS;
24   }
25   #endif // CC_SetAlgorithmSet




     Family “2.0”                              TCG Published                            Page 347
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


27     Field Upgrade

27.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 algori thm 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.


Page 348                                         TCG Published                                           Family “2.0”
October 30, 2014                        Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                                   Part 3: Commands

NOTE 2            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 response 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, either the one specified in this clause or a vendor proprietary 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.

NOTE 4            A platform manufacturer may provide a means to change preserved data to accommodate a case
                  where a field upgrade fixes a flaw that might have compromised TPM secrets.




Family “2.0”                                     TCG Published                                              Page 349
Level 00 Revision 01.16                  Copyright © TCG 2006-2014                                October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library


27.2   TPM2_FieldUpgradeStart

27.2.1 General Description

This command uses platformPolicy and a TPM Vendor Authorization Key to authorize a Field Upgrade
Manifest.
If the signature checks        succeed,     the   authorization   is   valid   and   the   TPM     will   accept
TPM2_FieldUpgradeData().
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.




Page 350                                      TCG Published                                        Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                          Part 3: Commands


27.2.2 Command and Response

                          Table 173 — TPM2_FieldUpgradeStart Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_FieldUpgradeStart

                                                    TPM_RH_PLATFORM+{PP}
TPMI_RH_PLATFORM              @authorization        Auth Index:1
                                                    Auth Role: ADMIN
                                                    handle of a public area that contains the TPM Vendor
                                                    Authorization Key that will be used to validate
TPMI_DH_OBJECT                keyHandle             manifestSignature
                                                    Auth Index: None

TPM2B_DIGEST                  fuDigest              digest of the first block in the field upgrade sequence
                                                    signature over fuDigest using the key associated with
TPMT_SIGNATURE                manifestSignature
                                                    keyHandle (not optional)


                          Table 174 — TPM2_FieldUpgradeStart Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                         Page 351
Level 00 Revision 01.16             Copyright © TCG 2006-2014                            October 30, 2014
     Part 3: Commands                                                 Trusted Platform Module Library



     27.2.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "FieldUpgradeStart_fp.h"
 3   #ifdef TPM_CC_FieldUpgradeStart // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_FieldUpgradeStart(
 6       FieldUpgradeStart_In     *in             // IN: input parameter list
 7       )
 8   {
 9       // Not implemented
10       UNUSED_PARAMETER(in);
11       return TPM_RC_SUCCESS;
12   }
13   #endif




     Page 352                                TCG Published                              Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014            Level 00 Revision 01.16
Trusted Platform Module Library                                                     Part 3: Commands


27.3   TPM2_FieldUpgradeData

27.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.




Family “2.0”                               TCG Published                                    Page 353
Level 00 Revision 01.16            Copyright © TCG 2006-2014                        October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library



27.3.2 Command and Response

                      Table 175 — TPM2_FieldUpgradeData Command
Type                     Name                  Description

                                               TPM_ST_SESSIONS if an audit or decrypt session is
TPMI_ST_COMMAND_TAG      tag
                                               present; otherwise, TPM_ST_NO_SESSIONS
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 6
UINT32                   responseSize
TPM_RC                   responseCode

                                               tagged digest of the next block
TPMT_HA+                 nextDigest
                                               TPM_ALG_NULL if field update is complete
TPMT_HA                  firstDigest           tagged digest of the first block of the sequence




Page 354                                TCG Published                                     Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                Part 3: Commands



     27.3.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "FieldUpgradeData_fp.h"
 3   #ifdef TPM_CC_FieldUpgradeData // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_FieldUpgradeData(
 6       FieldUpgradeData_In       *in,             // IN: input parameter list
 7       FieldUpgradeData_Out      *out             // OUT: output parameter list
 8       )
 9   {
10       // Not implemented
11       UNUSED_PARAMETER(in);
12       UNUSED_PARAMETER(out);
13       return TPM_RC_SUCCESS;
14   }
15   #endif




     Family “2.0”                              TCG Published                               Page 355
     Level 00 Revision 01.16              Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


27.4     TPM2_FirmwareRead

27.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() a nd
                TPM2_FieldUpgradeData().




Page 356                                      TCG Published                                        Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands


27.4.2 Command and Response

                           Table 177 — TPM2_FirmwareRead Command
Type                          Name                  Description

                                                    TPM_ST_SESSIONS if an audit or encrypt session is
TPMI_ST_COMMAND_TAG           tag
                                                    present; otherwise, TPM_ST_NO_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_FirmwareRead

                                                    the number of previous calls to this command in this
UINT32                        sequenceNumber        sequence
                                                    set to 0 on the first call


                           Table 178 — TPM2_FirmwareRead Response
Type                          Name                  Description

TPM_ST                        tag                   see clause 6
UINT32                        responseSize
TPM_RC                        responseCode

TPM2B_MAX_BUFFER              fuData                field upgrade image data




Family “2.0”                                 TCG Published                                       Page 357
Level 00 Revision 01.16             Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library



     27.4.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "FirmwareRead_fp.h"
 3   #ifdef TPM_CC_FirmwareRead // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_FirmwareRead(
 6       FirmwareRead_In    *in,            // IN: input parameter list
 7       FirmwareRead_Out   *out            // OUT: output parameter list
 8       )
 9   {
10       // Not implemented
11       UNUSED_PARAMETER(in);
12       UNUSED_PARAMETER(out);
13       return TPM_RC_SUCCESS;
14   }
15   #endif // CC_FirmwareRead




     Page 358                              TCG Published                               Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014              Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


28     Context Management

28.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 TPM 2.0 Part 1.
The fourth command in this clause (TPM2_EvictControl()) is used to control the persistence of loadable
objects in TPM memory. Background for this command may be found in the "Owner and Platform Evict
Objects" clause in TPM 2.0 Part 1.

28.2    TPM2_ContextSave

28.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 sessions
                for audit or encryption is prohibited.

The TPM shall encrypt and integrity protect the TPM2B_CONTEXT_SENSITIVE context as described in
the "Context Protection" clause in TPM 2.0 Part 1.
See the “Context Data” clause in TPM 2.0 Part 2 for a description of the context structure in the response.




Family “2.0”                                   TCG Published                                            Page 359
Level 00 Revision 01.16                Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                 Trusted Platform Module Library



28.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

                                             handle of the resource to save
 TPMI_DH_CONTEXT        saveHandle
                                             Auth Index: None


                       Table 180 — TPM2_ContextSave Response
 Type                   Name                 Description

 TPM_ST                 tag                  see clause 6
 UINT32                 responseSize
 TPM_RC                 responseCode

 TPMS_CONTEXT           context




Page 360                             TCG Published                                 Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                Level 00 Revision 01.16
     Trusted Platform Module Library                                                           Part 3: Commands



     28.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ContextSave_fp.h"
3    #ifdef TPM_CC_ContextSave // Conditional expansion of this file
4    #include "Context_spt_fp.h"


     Error Returns                     Meaning

     TPM_RC_CONTEXT_GAP                a contextID could not be assigned for a session context save
     TPM_RC_TOO_MANY_CONTEXTS          no more contexts can be saved as the counter has maxed out

 5   TPM_RC
 6   TPM2_ContextSave(
 7       ContextSave_In        *in,              // IN: input parameter list
 8       ContextSave_Out       *out              // OUT: output parameter list
 9       )
10   {
11       TPM_RC            result;
12       UINT16            fingerprintSize;      // The size of fingerprint in context
13       // blob.
14       UINT64            contextID = 0;        // session context ID
15       TPM2B_SYM_KEY     symKey;
16       TPM2B_IV          iv;
17
18       TPM2B_DIGEST      integrity;
19       UINT16            integritySize;
20       BYTE              *buffer;
21
22       // This command may cause the orderlyState to be cleared due to
23       // the update of state reset data. If this is the case, check if NV is
24       // available first
25       if(gp.orderlyState != SHUTDOWN_NONE)
26       {
27           // The command needs NV update. Check if NV is available.
28           // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
29           // this point
30           result = NvIsAvailable();
31           if(result != TPM_RC_SUCCESS) return result;
32       }
33
34   // Internal Data Update
35
36       // Initialize output handle. At the end of command action, the output
37       // handle of an object will be replaced, while the output handle
38       // for a session will be the same as input
39       out->context.savedHandle = in->saveHandle;
40
41       // Get the size of fingerprint in context blob. The sequence value in
42       // TPMS_CONTEXT structure is used as the fingerprint
43       fingerprintSize = sizeof(out->context.sequence);
44
45       // Compute the integrity size at the beginning of context blob
46       integritySize = sizeof(integrity.t.size)
47                       + CryptGetHashDigestSize(CONTEXT_INTEGRITY_HASH_ALG);
48
49       // Perform object or session specific context save
50       switch(HandleGetType(in->saveHandle))
51       {
52       case TPM_HT_TRANSIENT:
53       {
54           OBJECT          *object = ObjectGet(in->saveHandle);

     Family “2.0”                               TCG Published                                         Page 361
     Level 00 Revision 01.16            Copyright © TCG 2006-2014                              October 30, 2014
      Part 3: Commands                                                  Trusted Platform Module Library

 55          OBJECT         *outObject =
 56                                 (OBJECT *)(out->context.contextBlob.t.buffer
 57                                             + integritySize + fingerprintSize);
 58
 59          // Set size of the context data. The contents of context blob is vendor
 60          // defined. In this implementation, the size is size of integrity
 61          // plus fingerprint plus the whole internal OBJECT structure
 62          out->context.contextBlob.t.size = integritySize +
 63                                            fingerprintSize + sizeof(OBJECT);
 64          // Make sure things fit
 65          pAssert(out->context.contextBlob.t.size
 66                  < sizeof(out->context.contextBlob.t.buffer));
 67
 68          // Copy the whole internal OBJECT structure to context blob, leave
 69          // the size for fingerprint
 70          *outObject = *object;
 71
 72          // Increment object context ID
 73          gr.objectContextID++;
 74          // If object context ID overflows, TPM should be put in failure mode
 75          if(gr.objectContextID == 0)
 76              FAIL(FATAL_ERROR_INTERNAL);
 77
 78          // Fill in other return values for an object.
 79          out->context.sequence = gr.objectContextID;
 80          // For regular object, savedHandle is 0x80000000. For sequence object,
 81          // savedHandle is 0x80000001. For object with stClear, savedHandle
 82          // is 0x80000002
 83          if(ObjectIsSequence(object))
 84          {
 85              out->context.savedHandle = 0x80000001;
 86              SequenceDataImportExport(object, outObject, EXPORT_STATE);
 87          }
 88          else if(object->attributes.stClear == SET)
 89          {
 90              out->context.savedHandle = 0x80000002;
 91          }
 92          else
 93          {
 94              out->context.savedHandle = 0x80000000;
 95          }
 96
 97          // Get object hierarchy
 98          out->context.hierarchy = ObjectDataGetHierarchy(object);
 99
100          break;
101      }
102      case TPM_HT_HMAC_SESSION:
103      case TPM_HT_POLICY_SESSION:
104      {
105          SESSION         *session = SessionGet(in->saveHandle);
106
107          // Set size of the context data. The contents of context blob is vendor
108          // defined. In this implementation, the size of context blob is the
109          // size of a internal session structure plus the size of
110          // fingerprint plus the size of integrity
111          out->context.contextBlob.t.size = integritySize +
112                                            fingerprintSize + sizeof(*session);
113
114          // Make sure things fit
115          pAssert(out->context.contextBlob.t.size
116                  < sizeof(out->context.contextBlob.t.buffer));
117
118          // Copy the whole internal SESSION structure to context blob.
119          // Save space for fingerprint at the beginning of the buffer
120          // This is done before anything else so that the actual context

      Page 362                              TCG Published                                 Family “2.0”
      October 30, 2014               Copyright © TCG 2006-2014               Level 00 Revision 01.16
      Trusted Platform Module Library                                               Part 3: Commands

121           // can be reclaimed after this call
122           MemoryCopy(out->context.contextBlob.t.buffer
123                      + integritySize + fingerprintSize,
124                      session, sizeof(*session),
125                      sizeof(out->context.contextBlob.t.buffer)
126                               - integritySize - fingerprintSize);
127
128           // Fill in the other return parameters for a session
129           // Get a context ID and set the session tracking values appropriately
130           // TPM_RC_CONTEXT_GAP is a possible error.
131           // SessionContextSave() will flush the in-memory context
132           // so no additional errors may occur after this call.
133           result = SessionContextSave(out->context.savedHandle, &contextID);
134           if(result != TPM_RC_SUCCESS) return result;
135
136           // sequence number is the current session contextID
137           out->context.sequence = contextID;
138
139           // use TPM_RH_NULL as hierarchy for session context
140           out->context.hierarchy = TPM_RH_NULL;
141
142           break;
143       }
144       default:
145           // SaveContext may only take an object handle or a session handle.
146           // All the other handle type should be filtered out at unmarshal
147           pAssert(FALSE);
148           break;
149       }
150
151       // Save fingerprint at the beginning of encrypted area of context blob.
152       // Reserve the integrity space
153       MemoryCopy(out->context.contextBlob.t.buffer + integritySize,
154                  &out->context.sequence, sizeof(out->context.sequence),
155                  sizeof(out->context.contextBlob.t.buffer) - integritySize);
156
157       // Compute context encryption key
158       ComputeContextProtectionKey(&out->context, &symKey, &iv);
159
160       // Encrypt context blob
161       CryptSymmetricEncrypt(out->context.contextBlob.t.buffer + integritySize,
162                             CONTEXT_ENCRYPT_ALG, CONTEXT_ENCRYPT_KEY_BITS,
163                             TPM_ALG_CFB, symKey.t.buffer, &iv,
164                             out->context.contextBlob.t.size - integritySize,
165                             out->context.contextBlob.t.buffer + integritySize);
166
167       // Compute integrity hash for the object
168       // In this implementation, the same routine is used for both sessions
169       // and objects.
170       ComputeContextIntegrity(&out->context, &integrity);
171
172       // add integrity at the beginning of context blob
173       buffer = out->context.contextBlob.t.buffer;
174       TPM2B_DIGEST_Marshal(&integrity, &buffer, NULL);
175
176       // orderly state should be cleared because of the update of state reset and
177       // state clear data
178       g_clearOrderly = TRUE;
179
180       return TPM_RC_SUCCESS;
181   }
182   #endif // CC_ContextSave




      Family “2.0”                           TCG Published                                 Page 363
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                   October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


28.3   TPM2_ContextLoad

28.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 28.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 objects belong to the NULL hierarchy which is
                never disabled.

See the “Context Data” clause in TPM 2.0 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 TPM 2.0 Part 1 and enter failure mode if the check fails.




Page 364                                      TCG Published                                         Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands



28.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 6
 UINT32                       responseSize
 TPM_RC                       responseCode

                                                  the handle assigned to the resource after it has been
 TPMI_DH_CONTEXT              loadedHandle
                                                  successfully loaded




Family “2.0”                             TCG Published                                         Page 365
Level 00 Revision 01.16             Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                             Trusted Platform Module Library



     28.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ContextLoad_fp.h"
3    #ifdef TPM_CC_ContextLoad // Conditional expansion of this file
4    #include "Context_spt_fp.h"


     Error Returns                 Meaning

     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                   incorrect context blob size

 5   TPM_RC
 6   TPM2_ContextLoad(
 7       ContextLoad_In     *in,                  // IN: input parameter list
 8       ContextLoad_Out    *out                  // OUT: output parameter list
 9       )
10   {
11   // Local Variables
12       TPM_RC      result = TPM_RC_SUCCESS;
13
14       TPM2B_DIGEST       integrityToCompare;
15       TPM2B_DIGEST       integrity;
16       UINT16             integritySize;
17       UINT64             fingerprint;
18       BYTE               *buffer;
19       INT32              size;
20
21       TPM_HT             handleType;
22       TPM2B_SYM_KEY      symKey;
23       TPM2B_IV           iv;
24
25   // Input Validation
26
27       // Check context blob size
28       handleType = HandleGetType(in->context.savedHandle);
29
30       // Check integrity
31       // In this implementation, the same routine is used for both sessions
32       // and objects.
33       integritySize = CryptGetHashDigestSize(CONTEXT_INTEGRITY_HASH_ALG);
34
35       // Get integrity from context blob
36       buffer = in->context.contextBlob.t.buffer;
37       size = (INT32) in->context.contextBlob.t.size;
38       result = TPM2B_DIGEST_Unmarshal(&integrity, &buffer, &size);
39       if(result != TPM_RC_SUCCESS)
40           return result;
41       if(integrity.t.size != integritySize)
42           return TPM_RC_SIZE;
43
44       integritySize += sizeof(integrity.t.size);


     Page 366                                    TCG Published                                         Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014                        Level 00 Revision 01.16
      Trusted Platform Module Library                                                Part 3: Commands

 45
 46       // Compute context integrity
 47       ComputeContextIntegrity(&in->context, &integrityToCompare);
 48
 49       // Compare integrity
 50       if(!Memory2BEqual(&integrity.b, &integrityToCompare.b))
 51           return TPM_RC_INTEGRITY + RC_ContextLoad_context;
 52
 53       // Compute context encryption key
 54       ComputeContextProtectionKey(&in->context, &symKey, &iv);
 55
 56       // Decrypt context data in place
 57       CryptSymmetricDecrypt(in->context.contextBlob.t.buffer + integritySize,
 58                             CONTEXT_ENCRYPT_ALG, CONTEXT_ENCRYPT_KEY_BITS,
 59                             TPM_ALG_CFB, symKey.t.buffer, &iv,
 60                             in->context.contextBlob.t.size - integritySize,
 61                             in->context.contextBlob.t.buffer + integritySize);
 62
 63       // Read the fingerprint value, skip the leading integrity size
 64       MemoryCopy(&fingerprint, in->context.contextBlob.t.buffer + integritySize,
 65                  sizeof(fingerprint), sizeof(fingerprint));
 66       // Check fingerprint. If the check fails, TPM should be put to failure mode
 67       if(fingerprint != in->context.sequence)
 68           FAIL(FATAL_ERROR_INTERNAL);
 69
 70       // Perform object or session specific input check
 71       switch(handleType)
 72       {
 73       case TPM_HT_TRANSIENT:
 74       {
 75           // Get a pointer to the object in the context blob
 76           OBJECT      *outObject = (OBJECT *)(in->context.contextBlob.t.buffer
 77                                   + integritySize + sizeof(fingerprint));
 78
 79           // Discard any changes to the handle that the TRM might have made
 80           in->context.savedHandle = TRANSIENT_FIRST;
 81
 82           // If hierarchy is disabled, no object context can be loaded in this
 83           // hierarchy
 84           if(!HierarchyIsEnabled(in->context.hierarchy))
 85               return TPM_RC_HIERARCHY + RC_ContextLoad_context;
 86
 87           // Restore object. A TPM_RC_OBJECT_MEMORY error may be returned at
 88           // this point
 89           result = ObjectContextLoad(outObject, &out->loadedHandle);
 90           if(result != TPM_RC_SUCCESS)
 91               return result;
 92
 93           // If this is a sequence object, the crypto library may need to
 94           // reformat the data into an internal format
 95           if(ObjectIsSequence(outObject))
 96               SequenceDataImportExport(ObjectGet(out->loadedHandle),
 97                                        outObject, IMPORT_STATE);
 98
 99           break;
100       }
101       case TPM_HT_POLICY_SESSION:
102       case TPM_HT_HMAC_SESSION:
103       {
104
105           SESSION      *session = (SESSION *)(in->context.contextBlob.t.buffer
106                                            + integritySize + sizeof(fingerprint));
107
108           // This command may cause the orderlyState to be cleared due to
109           // the update of state reset data. If this is the case, check if NV is
110           // available first

      Family “2.0”                            TCG Published                                 Page 367
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
      Part 3: Commands                                                  Trusted Platform Module Library

111          if(gp.orderlyState != SHUTDOWN_NONE)
112          {
113              // The command needs NV update. Check if NV is available.
114              // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned
115              // at this point
116              result = NvIsAvailable();
117              if(result != TPM_RC_SUCCESS)
118                  return result;
119          }
120
121          // Check if input handle points to a valid saved session
122          if(!SessionIsSaved(in->context.savedHandle))
123              return TPM_RC_HANDLE + RC_ContextLoad_context;
124
125          // Restore session. A TPM_RC_SESSION_MEMORY, TPM_RC_CONTEXT_GAP error
126          // may be returned at this point
127          result = SessionContextLoad(session, &in->context.savedHandle);
128          if(result != TPM_RC_SUCCESS)
129              return result;
130
131          out->loadedHandle = in->context.savedHandle;
132
133          // orderly state should be cleared because of the update of state
134          // reset and state clear data
135          g_clearOrderly = TRUE;
136
137          break;
138      }
139      default:
140          // Context blob may only have an object handle or a session handle.
141          // All the other handle type should be filtered out at unmarshal
142          pAssert(FALSE);
143          break;
144      }
145
146       return TPM_RC_SUCCESS;
147   }
148   #endif // CC_ContextLoad




      Page 368                              TCG Published                                 Family “2.0”
      October 30, 2014               Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                            Part 3: Commands


28.4   TPM2_FlushContext

28.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               this   command    and    tag   is    required   to   be
TPM_ST_NO_SESSIONS (see note in 28.2.1).
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. When the flushHandle is in
the parameter area, the TPM does not validate that associated context is actually in the TPM.




Family “2.0”                                TCG Published                                         Page 369
Level 00 Revision 01.16              Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                     Trusted Platform Module Library



28.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           TPM_CC_FlushContext

                                               the handle of the item to flush
 TPMI_DH_CONTEXT         flushHandle
                                               NOTE        This is a use of a handle as a parameter.


                       Table 184 — TPM2_FlushContext Response
 Type                    Name                  Description

 TPM_ST                  tag                   see clause 6
 UINT32                  responseSize
 TPM_RC                  responseCode




Page 370                               TCG Published                                         Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                    Level 00 Revision 01.16
     Trusted Platform Module Library                                                               Part 3: Commands



     28.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "FlushContext_fp.h"
3    #ifdef TPM_CC_FlushContext // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_HANDLE                     flushHandle does not reference a loaded object or session

 4   TPM_RC
 5   TPM2_FlushContext(
 6       FlushContext_In       *in                  // IN: input parameter list
 7       )
 8   {
 9   // Internal Data Update
10
11       // Call object or session specific routine to flush
12       switch(HandleGetType(in->flushHandle))
13       {
14       case TPM_HT_TRANSIENT:
15           if(!ObjectIsPresent(in->flushHandle))
16               return TPM_RC_HANDLE;
17           // Flush object
18           ObjectFlush(in->flushHandle);
19           break;
20       case TPM_HT_HMAC_SESSION:
21       case TPM_HT_POLICY_SESSION:
22           if(   !SessionIsLoaded(in->flushHandle)
23              && !SessionIsSaved(in->flushHandle)
24             )
25               return TPM_RC_HANDLE;
26
27           // If the session to be flushed is the exclusive audit session, then
28           // indicate that there is no exclusive audit session any longer.
29           if(in->flushHandle == g_exclusiveAuditSession)
30               g_exclusiveAuditSession = TPM_RH_UNASSIGNED;
31
32           // Flush session
33           SessionFlush(in->flushHandle);
34           break;
35       default:
36           // This command only take object or session handle.              Other handles
37           // should be filtered out at handle unmarshal
38           pAssert(FALSE);
39           break;
40       }
41
42       return TPM_RC_SUCCESS;
43   }
44   #endif // CC_FlushContext




     Family “2.0”                                  TCG Published                                          Page 371
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library


28.5     TPM2_EvictControl

28.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 suc h 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 m ove objects to/from TPM memory in order to ensure
                     that the objects required for command execution can be context restored.

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.

Page 372                                       TCG Published                                        Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                      Level 00 Revision 01.16
Trusted Platform Module Library                                                             Part 3: Commands

If objectHandle references a persistent object:
a) 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.
b) 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.




Family “2.0”                                  TCG Published                                          Page 373
Level 00 Revision 01.16               Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


28.5.2 Command and Response

                       Table 185 — TPM2_EvictControl Command
 Type                   Name                   Description

 TPMI_ST_COMMAND_TAG    tag                    TPM_ST_SESSIONS
 UINT32                 commandSize
 TPM_CC                 commandCode            TPM_CC_EvictControl {NV}

                                               TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
 TPMI_RH_PROVISION      @auth                  Auth Handle: 1
                                               Auth Role: USER
                                               the handle of a loaded object
 TPMI_DH_OBJECT         objectHandle
                                               Auth Index: None

                                               if objectHandle is a transient object handle, then this is
                                               the persistent handle for the object
 TPMI_DH_PERSISTENT     persistentHandle
                                               if objectHandle is a persistent object handle, then it
                                               shall be the same value as persistentHandle


                       Table 186 — TPM2_EvictControl Response
 Type                   Name                   Description

 TPM_ST                 tag                    see clause 6
 UINT32                 responseSize
 TPM_RC                 responseCode




Page 374                               TCG Published                                       Family “2.0”
October 30, 2014              Copyright © TCG 2006-2014                     Level 00 Revision 01.16
     Trusted Platform Module Library                                                                Part 3: Commands



     28.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "EvictControl_fp.h"
3    #ifdef TPM_CC_EvictControl // Conditional expansion of this file


     Error Returns                     Meaning

     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                      persistentHandle is not in the range corresponding to the hierarchy of
                                       evictObject

 4   TPM_RC
 5   TPM2_EvictControl(
 6       EvictControl_In       *in                   // IN: input parameter list
 7       )
 8   {
 9       TPM_RC       result;
10       OBJECT       *evictObject;
11
12       // The command needs NV update. Check if NV is available.
13       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
14       // this point
15       result = NvIsAvailable();
16       if(result != TPM_RC_SUCCESS) return result;
17
18   // Input Validation
19
20       // Get internal object pointer
21       evictObject = ObjectGet(in->objectHandle);
22
23       // Temporary, stClear or public only objects can not be made persistent
24       if(   evictObject->attributes.temporary == SET
25          || evictObject->attributes.stClear == SET
26          || evictObject->attributes.publicOnly == SET
27         )
28           return TPM_RC_ATTRIBUTES + RC_EvictControl_objectHandle;
29
30       // If objectHandle refers to a persistent object, it should be the same as
31       // input persistentHandle
32       if(   evictObject->attributes.evict == SET
33          && evictObject->evictHandle != in->persistentHandle
34         )
35           return TPM_RC_HANDLE + RC_EvictControl_objectHandle;
36
37       // Additional auth validation
38       if(in->auth == TPM_RH_PLATFORM)
39       {
40           // To make persistent
41           if(evictObject->attributes.evict == CLEAR)
42           {
43               // Platform auth can not set evict object in storage or endorsement
44               // hierarchy

     Family “2.0”                                   TCG Published                                               Page 375
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                October 30, 2014
     Part 3: Commands                                               Trusted Platform Module Library

45              if(evictObject->attributes.ppsHierarchy == CLEAR)
46                  return TPM_RC_HIERARCHY + RC_EvictControl_objectHandle;
47
48              // Platform cannot use a handle outside of platform persistent range.
49              if(!NvIsPlatformPersistentHandle(in->persistentHandle))
50                  return TPM_RC_RANGE + RC_EvictControl_persistentHandle;
51          }
52          // Platform auth can delete any persistent object
53      }
54      else if(in->auth == TPM_RH_OWNER)
55      {
56          // Owner auth can not set or clear evict object in platform hierarchy
57          if(evictObject->attributes.ppsHierarchy == SET)
58              return TPM_RC_HIERARCHY + RC_EvictControl_objectHandle;
59
60          // Owner cannot use a handle outside of owner persistent range.
61          if(   evictObject->attributes.evict == CLEAR
62             && !NvIsOwnerPersistentHandle(in->persistentHandle)
63            )
64              return TPM_RC_RANGE + RC_EvictControl_persistentHandle;
65      }
66      else
67      {
68          // Other auth is not allowed in this command and should be filtered out
69          // at unmarshal process
70          pAssert(FALSE);
71      }
72
73   // Internal Data Update
74
75      // Change evict state
76      if(evictObject->attributes.evict == CLEAR)
77      {
78          // Make object persistent
79          // A TPM_RC_NV_HANDLE or TPM_RC_NV_SPACE error may be returned at this
80          // point
81          result = NvAddEvictObject(in->persistentHandle, evictObject);
82          if(result != TPM_RC_SUCCESS) return result;
83      }
84      else
85      {
86          // Delete the persistent object in NV
87          NvDeleteEntity(evictObject->evictHandle);
88      }
89
90      return TPM_RC_SUCCESS;
91
92   }
93   #endif // CC_EvictControl




     Page 376                              TCG Published                                Family “2.0”
     October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
Trusted Platform Module Library                                                               Part 3: Commands


29     Clocks and Timers

29.1    TPM2_ReadClock

29.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.




Family “2.0”                                  TCG Published                                            Page 377
Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                            Trusted Platform Module Library


29.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 6
UINT32                 responseSize
TPM_RC                 responseCode

TPMS_TIME_INFO         currentTime




Page 378                              TCG Published                           Family “2.0”
October 30, 2014             Copyright © TCG 2006-2014            Level 00 Revision 01.16
     Trusted Platform Module Library                                      Part 3: Commands



     29.1.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "ReadClock_fp.h"
 3   #ifdef TPM_CC_ReadClock // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_ReadClock(
 6       ReadClock_Out    *out            // OUT: output parameter list
 7       )
 8   {
 9   // Command Output
10
11       out->currentTime.time = g_time;
12       TimeFillInfo(&out->currentTime.clockInfo);
13
14       return TPM_RC_SUCCESS;
15   }
16   #endif // CC_ReadClock




     Family “2.0”                            TCG Published                       Page 379
     Level 00 Revision 01.16           Copyright © TCG 2006-2014          October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


29.2   TPM2_ClockSet

29.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 year s 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 Platform Authorization or Owner Authorization.




Page 380                                       TCG Published                                            Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                         Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands



29.2.2 Command and Response

                              Table 189 — TPM2_ClockSet Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_ClockSet {NV}

                                                    TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
TPMI_RH_PROVISION             @auth                 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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                                     Page 381
Level 00 Revision 01.16             Copyright © TCG 2006-2014                           October 30, 2014
     Part 3: Commands                                                     Trusted Platform Module Library



     29.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "ClockSet_fp.h"
3    #ifdef TPM_CC_ClockSet // Conditional expansion of this file

     Read the current TPMS_TIMER_INFO structure settings

     Error Returns                 Meaning

     TPM_RC_VALUE                  invalid new clock

 4   TPM_RC
 5   TPM2_ClockSet(
 6       ClockSet_In       *in              // IN: input parameter list
 7       )
 8   {
 9   #define CLOCK_UPDATE_MASK    ((1ULL << NV_CLOCK_UPDATE_INTERVAL)- 1)
10       UINT64      clockNow;
11
12   // Input Validation
13
14       // new time can not be bigger than 0xFFFF000000000000 or smaller than
15       // current clock
16       if(in->newTime > 0xFFFF000000000000ULL
17               || in->newTime < go.clock)
18           return TPM_RC_VALUE + RC_ClockSet_newTime;
19
20   // Internal Data Update
21
22       // Internal Data Update
23       clockNow = go.clock;    // grab the old value
24       go.clock = in->newTime;       // set the new value
25       // Check to see if the update has caused a need for an nvClock update
26       if((in->newTime & CLOCK_UPDATE_MASK) > (clockNow & CLOCK_UPDATE_MASK))
27       {
28           CryptDrbgGetPutState(GET_STATE);
29           NvWriteReserved(NV_ORDERLY_DATA, &go);
30
31           // Now the time state is safe
32           go.clockSafe = YES;
33       }
34
35       return TPM_RC_SUCCESS;
36   }
37   #endif // CC_ClockSet




     Page 382                                  TCG Published                                Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                                Part 3: Commands


29.3   TPM2_ClockRateAdjust

29.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 make 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.




Family “2.0”                                   TCG Published                                             Page 383
Level 00 Revision 01.16                Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                   Trusted Platform Module Library



29.3.2 Command and Response

                      Table 191 — TPM2_ClockRateAdjust Command
Type                     Name                  Description

TPMI_ST_COMMAND_TAG      tag                   TPM_ST_SESSIONS
UINT32                   commandSize
TPM_CC                   commandCode           TPM_CC_ClockRateAdjust

                                               TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
TPMI_RH_PROVISION        @auth                 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 6
UINT32                   responseSize
TPM_RC                   responseCode




Page 384                                TCG Published                                    Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                  Level 00 Revision 01.16
     Trusted Platform Module Library                                        Part 3: Commands



     29.3.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "ClockRateAdjust_fp.h"
 3   #ifdef TPM_CC_ClockRateAdjust // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_ClockRateAdjust(
 6       ClockRateAdjust_In    *in            // IN: input parameter list
 7       )
 8   {
 9   // Internal Data Update
10       TimeSetAdjustRate(in->rateAdjust);
11
12       return TPM_RC_SUCCESS;
13   }
14   #endif // CC_ClockRateAdjust




     Family “2.0”                             TCG Published                        Page 385
     Level 00 Revision 01.16           Copyright © TCG 2006-2014            October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


30     Capability Commands

30.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            TPM2_TestParms()is used to determine if a TPM supports a particular combination of algorith m
                parameters


30.2     TPM2_GetCapability

30.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. O n
                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, u se 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.

NOTE 2          If the propertyCount selects an unimplemented property, the next higher implemented property is
                returned.

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 3          The moreData parameter will be YES if there are more properties even 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 m ay 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:




Page 386                                       TCG Published                                            Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                                  Part 3: Commands


         TPM_PT_MANUFACTURER
         TPM_PT_VENDOR_STRING_1
    
                                           (3)
          TPM_PT_VENDOR_STRING_2
    
                                           (3)
          TPM_PT_VENDOR_STRING_3
    
                                           (3)
          TPM_PT_VENDOR_STRING_4
         TPM_PT_VENDOR_TPM_TYPE
         TPM_PT_FIRMWARE_VERSION_1
         TPM_PT_FIRMWARE_VERSION_2

NOTE 4          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_MANUFACTURER, 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                            property                    Return Type
                                                      (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               TPML_ECC_CURVE
 TPM_CAP_VENDOR_PROPERTY               manufacturer specific       manufacturer-specific values
 NOTES:
 (1) The TPM_ALG_ID or TPM_ECC_CURVE is cast to a UINT32




Family “2.0”                                     TCG Published                                             Page 387
Level 00 Revision 01.16                Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                               Trusted Platform Module Library


      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        If the MSO of property is TPM_HT_NV_INDEX, then the TPM will return a list of NV Index
                    values.

   EXAMPLE 5        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 5           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 6           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
       256-value 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 TPM 2.0 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.
   Each item in the list is a TPMS_PCR_SELECT structure that contains a bitmap of all PCR.

   NOTE 7           A PCR index in all banks (all hash algorithms) has the same properties, so the hash algorithm is
                    not specified here.




Page 388                                      TCG Published                                          Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands


       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.




Family “2.0”                                 TCG Published                                        Page 389
Level 00 Revision 01.16               Copyright © TCG 2006-2014                          October 30, 2014
Part 3: Commands                                                     Trusted Platform Module Library



30.2.2 Command and Response

                        Table 193 — TPM2_GetCapability Command
 Type                     Name                 Description

                                               TPM_ST_SESSIONS if an audit session is present;
 TPMI_ST_COMMAND_TAG      tag
                                               otherwise, TPM_ST_NO_SESSIONS
 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 6
 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




Page 390                               TCG Published                                       Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                   Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     30.2.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "GetCapability_fp.h"
3    #ifdef TPM_CC_GetCapability // Conditional expansion of this file


     Error Returns                     Meaning

     TPM_RC_HANDLE                     value of property is in an unsupported handle range for the
                                       TPM_CAP_HANDLES capability value
     TPM_RC_VALUE                      invalid capability; or property is not 0 for the TPM_CAP_PCRS
                                       capability value

 4   TPM_RC
 5   TPM2_GetCapability(
 6       GetCapability_In      *in,                  // IN: input parameter list
 7       GetCapability_Out     *out                  // OUT: output parameter list
 8       )
 9   {
10   // Command Output
11
12       // Set output capability type the same as input type
13       out->capabilityData.capability = in->capability;
14
15       switch(in->capability)
16       {
17       case TPM_CAP_ALGS:
18           out->moreData = AlgorithmCapGetImplemented((TPM_ALG_ID) in->property,
19                           in->propertyCount, &out->capabilityData.data.algorithms);
20           break;
21       case TPM_CAP_HANDLES:
22           switch(HandleGetType((TPM_HANDLE) in->property))
23           {
24           case TPM_HT_TRANSIENT:
25               // Get list of handles of loaded transient objects
26               out->moreData = ObjectCapGetLoaded((TPM_HANDLE) in->property,
27                                                  in->propertyCount,
28                                                  &out->capabilityData.data.handles);
29               break;
30           case TPM_HT_PERSISTENT:
31               // Get list of handles of persistent objects
32               out->moreData = NvCapGetPersistent((TPM_HANDLE) in->property,
33                                                  in->propertyCount,
34                                                  &out->capabilityData.data.handles);
35               break;
36           case TPM_HT_NV_INDEX:
37               // Get list of defined NV index
38               out->moreData = NvCapGetIndex((TPM_HANDLE) in->property,
39                                             in->propertyCount,
40                                             &out->capabilityData.data.handles);
41               break;
42           case TPM_HT_LOADED_SESSION:
43               // Get list of handles of loaded sessions
44               out->moreData = SessionCapGetLoaded((TPM_HANDLE) in->property,
45                                                   in->propertyCount,
46                                                   &out->capabilityData.data.handles);
47               break;
48           case TPM_HT_ACTIVE_SESSION:
49               // Get list of handles of
50               out->moreData = SessionCapGetSaved((TPM_HANDLE) in->property,
51                                                  in->propertyCount,
52                                                  &out->capabilityData.data.handles);

     Family “2.0”                                   TCG Published                                           Page 391
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                 October 30, 2014
      Part 3: Commands                                                Trusted Platform Module Library

 53               break;
 54           case TPM_HT_PCR:
 55               // Get list of handles of PCR
 56               out->moreData = PCRCapGetHandles((TPM_HANDLE) in->property,
 57                                                in->propertyCount,
 58                                                &out->capabilityData.data.handles);
 59               break;
 60           case TPM_HT_PERMANENT:
 61               // Get list of permanent handles
 62               out->moreData = PermanentCapGetHandles(
 63                                   (TPM_HANDLE) in->property,
 64                                   in->propertyCount,
 65                                   &out->capabilityData.data.handles);
 66               break;
 67           default:
 68               // Unsupported input handle type
 69               return TPM_RC_HANDLE + RC_GetCapability_property;
 70               break;
 71           }
 72           break;
 73       case TPM_CAP_COMMANDS:
 74           out->moreData = CommandCapGetCCList((TPM_CC) in->property,
 75                                               in->propertyCount,
 76                                               &out->capabilityData.data.command);
 77           break;
 78       case TPM_CAP_PP_COMMANDS:
 79           out->moreData = PhysicalPresenceCapGetCCList((TPM_CC) in->property,
 80                           in->propertyCount, &out->capabilityData.data.ppCommands);
 81           break;
 82       case TPM_CAP_AUDIT_COMMANDS:
 83           out->moreData = CommandAuditCapGetCCList((TPM_CC) in->property,
 84                                           in->propertyCount,
 85                                           &out->capabilityData.data.auditCommands);
 86           break;
 87       case TPM_CAP_PCRS:
 88           // Input property must be 0
 89           if(in->property != 0)
 90               return TPM_RC_VALUE + RC_GetCapability_property;
 91           out->moreData = PCRCapGetAllocation(in->propertyCount,
 92                                               &out->capabilityData.data.assignedPCR);
 93           break;
 94       case TPM_CAP_PCR_PROPERTIES:
 95           out->moreData = PCRCapGetProperties((TPM_PT_PCR) in->property,
 96                                             in->propertyCount,
 97                                             &out->capabilityData.data.pcrProperties);
 98           break;
 99       case TPM_CAP_TPM_PROPERTIES:
100           out->moreData = TPMCapGetProperties((TPM_PT) in->property,
101                                             in->propertyCount,
102                                             &out->capabilityData.data.tpmProperties);
103           break;
104   #ifdef TPM_ALG_ECC
105       case TPM_CAP_ECC_CURVES:
106           out->moreData = CryptCapGetECCCurve((TPM_ECC_CURVE   ) in->property,
107                                               in->propertyCount,
108                                               &out->capabilityData.data.eccCurves);
109           break;
110   #endif // TPM_ALG_ECC
111       case TPM_CAP_VENDOR_PROPERTY:
112           // vendor property is not implemented
113       default:
114           // Unexpected TPM_CAP value
115           return TPM_RC_VALUE;
116           break;
117       }
118

      Page 392                               TCG Published                              Family “2.0”
      October 30, 2014                Copyright © TCG 2006-2014             Level 00 Revision 01.16
      Trusted Platform Module Library                               Part 3: Commands

119       return TPM_RC_SUCCESS;
120   }
121   #endif // CC_GetCapability




      Family “2.0”                           TCG Published                 Page 393
      Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


30.3   TPM2_TestParms

30.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.




Page 394                                   TCG Published                                   Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands



30.3.2 Command and Response

                             Table 195 — TPM2_TestParms Command
 Type                         Name                 Description

                                                   TPM_ST_SESSIONS if an audit session is present;
 TPMI_ST_COMMAND_TAG          tag
                                                   otherwise, TPM_ST_NO_SESSIONS
 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 6
 UINT32                       responseSize
 TPM_RC                       responseCode         TPM_RC




Family “2.0”                               TCG Published                                    Page 395
Level 00 Revision 01.16             Copyright © TCG 2006-2014                        October 30, 2014
     Part 3: Commands                                                 Trusted Platform Module Library



     30.3.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "TestParms_fp.h"
 3   #ifdef TPM_CC_TestParms // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_TestParms(
 6       TestParms_In   *in             // IN: input parameter list
 7       )
 8   {
 9       // Input parameter is not reference in command action
10       in = NULL;
11
12       // The parameters are tested at unmarshal process.   We do nothing in command
13       // action
14       return TPM_RC_SUCCESS;
15   }
16   #endif // CC_TestParms




     Page 396                               TCG Published                                Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014              Level 00 Revision 01.16
Trusted Platform Module Library                                                               Part 3: Commands


31     Non-volatile Storage

31.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.
For commands that have both authHandle and nvIndex parameters, authHandle can be an NV Index,
Platform Authorization, or Owner Authorization. If authHandle is an NV Index, it must be the same as
nvIndex (TPM_RC_NV_AUTHORIZATION).
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, Owner Authorization may not be used if shEnable is CLEAR and Platform
Authorization may not be used if phEnableNV is CLEAR.
If an Index was defined using Platform Authorization, then that Index is not accessible when phEnableNV
is CLEAR. If an Index was defined using Owner Authorization, 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 implementation-
dependent 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 Index.

Family “2.0”                                  TCG Published                                            Page 397
Level 00 Revision 01.16               Copyright © TCG 2006-2014                               October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


31.2     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 non-
volatile 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 coun ters 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 process
                (orderly or not) of the TPM.




Page 398                                       TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                                 Part 3: Commands


31.3     TPM2_NV_DefineSpace

31.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                            than   one   of     TPMA_NV_COUNTER,
TPMA_NV_BITS, or TPMA_NV_EXTEND is SET in publicInfo.

NOTE 1         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 2         The limit for the data size may vary according to the type of the index. For example, if the index has
               TPMA_NV_ORDERLY SET, then the maximum size of an ordinary 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,                                              or
TPMA_NV_POLICYREAD shall be SET or the TPM shall return TPM_RC_ATTRIBUTES.
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 Platform Authorization or the
TPM shall return TPM_RC_ATTRIBUTES.
If the implementation does not support TPM2_NV_Increment(),                            the    TPM    shall    return
TPM_RC_ATTRIBUTES if TPMA_NV_COUNTER is SET.
If the implementation does not support TPM2_NV_SetBits(),                             the     TPM    shall    return
TPM_RC_ATTRIBUTES if TPMA_NV_BITS is SET.
If the implementation does not support TPM2_NV_Extend(),                              the     TPM    shall    return
TPM_RC_ATTRIBUTES if TPMA_NV_EXTEND is SET.
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.




Family “2.0”                                    TCG Published                                            Page 399
Level 00 Revision 01.16                Copyright © TCG 2006-2014                                October 30, 2014
Part 3: Commands                                                            Trusted Platform Module Library

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).




Page 400                                      TCG Published                                     Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                      Part 3: Commands



31.3.2 Command and Response

                          Table 197 — TPM2_NV_DefineSpace Command
 Type                         Name                 Description

 TPMI_ST_COMMAND_TAG          tag                  TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode          TPM_CC_NV_DefineSpace {NV}

                                                   TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
 TPMI_RH_PROVISION            @authHandle          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 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                               TCG Published                                    Page 401
Level 00 Revision 01.16              Copyright © TCG 2006-2014                       October 30, 2014
     Part 3: Commands                                                              Trusted Platform Module Library



     31.3.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_DefineSpace_fp.h"
3    #ifdef TPM_CC_NV_DefineSpace // Conditional expansion of this file


     Error Returns                 Meaning

     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                   'auth->size' or 'publicInfo->authPolicy.size' is larger than the digest
                                   size of 'publicInfo->nameAlg', or 'publicInfo->dataSize' is not
                                   consistent with 'publicInfo->attributes'.

 4   TPM_RC
 5   TPM2_NV_DefineSpace(
 6       NV_DefineSpace_In   *in                  // IN: input parameter list
 7       )
 8   {
 9       TPM_RC          result;
10       TPMA_NV         attributes;
11       UINT16          nameSize;
12
13       nameSize = CryptGetHashDigestSize(in->publicInfo.t.nvPublic.nameAlg);
14
15       // Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
16       // TPM_RC_NV_RATE or TPM_RC_SUCCESS.
17       result = NvIsAvailable();
18       if(result != TPM_RC_SUCCESS)
19           return result;
20
21   // Input Validation
22       // If an index is being created by the owner and shEnable is
23       // clear, then we would not reach this point because ownerAuth
24       // can't be given when shEnable is CLEAR. However, if phEnable
25       // is SET but phEnableNV is CLEAR, we have to check here
26       if(in->authHandle == TPM_RH_PLATFORM && gc.phEnableNV == CLEAR)
27           return TPM_RC_HIERARCHY + RC_NV_DefineSpace_authHandle;
28
29       attributes = in->publicInfo.t.nvPublic.attributes;
30
31       //TPMS_NV_PUBLIC validation.
32       // Counters and bit fields must have a size of 8
33       if (   (attributes.TPMA_NV_COUNTER == SET || attributes.TPMA_NV_BITS == SET)
34           && (in->publicInfo.t.nvPublic.dataSize != 8))
35           return TPM_RC_SIZE + RC_NV_DefineSpace_publicInfo;
36
37       // check that the authPolicy consistent with hash algorithm
38       if(   in->publicInfo.t.nvPublic.authPolicy.t.size != 0
39          && in->publicInfo.t.nvPublic.authPolicy.t.size != nameSize)
40           return TPM_RC_SIZE + RC_NV_DefineSpace_publicInfo;
41
42       // make sure that the authValue is not too large
43       MemoryRemoveTrailingZeros(&in->auth);
44       if(in->auth.t.size > nameSize)
45           return TPM_RC_SIZE + RC_NV_DefineSpace_auth;
46

     Page 402                                   TCG Published                                                Family “2.0”
     October 30, 2014                   Copyright © TCG 2006-2014                         Level 00 Revision 01.16
      Trusted Platform Module Library                                                Part 3: Commands

 47       //TPMA_NV validation.
 48       // Locks may not be SET and written cannot be SET
 49       if(   attributes.TPMA_NV_WRITTEN == SET
 50          || attributes.TPMA_NV_WRITELOCKED == SET
 51          || attributes.TPMA_NV_READLOCKED == SET)
 52           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 53
 54       // There must be a way to read the index
 55       if(   attributes.TPMA_NV_OWNERREAD == CLEAR
 56          && attributes.TPMA_NV_PPREAD == CLEAR
 57          && attributes.TPMA_NV_AUTHREAD == CLEAR
 58          && attributes.TPMA_NV_POLICYREAD == CLEAR)
 59           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 60
 61       // There must be a way to write the index
 62       if(   attributes.TPMA_NV_OWNERWRITE == CLEAR
 63          && attributes.TPMA_NV_PPWRITE == CLEAR
 64          && attributes.TPMA_NV_AUTHWRITE == CLEAR
 65          && attributes.TPMA_NV_POLICYWRITE == CLEAR)
 66           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 67
 68       // Make sure that no attribute is used that is not supported by the proper
 69       // command
 70   #if CC_NV_Increment == NO
 71       if( attributes.TPMA_NV_COUNTER == SET)
 72           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 73   #endif
 74   #if CC_NV_SetBits == NO
 75          if( attributes.TPMA_NV_BITS == SET)
 76              return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 77   #endif
 78   #if CC_NV_Extend == NO
 79         if( attributes.TPMA_NV_EXTEND == SET)
 80             return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 81   #endif
 82   #if CC_NV_UndefineSpaceSpecial == NO
 83        if( attributes.TPMA_NV_POLICY_DELETE == SET)
 84            return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 85   #endif
 86
 87       // Can be COUNTER or BITS or EXTEND but not more than one
 88       if( attributes.TPMA_NV_COUNTER == SET
 89          && attributes.TPMA_NV_BITS == SET)
 90           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 91       if(   attributes.TPMA_NV_COUNTER == SET
 92          && attributes.TPMA_NV_EXTEND == SET)
 93           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 94       if(   attributes.TPMA_NV_BITS == SET
 95          && attributes.TPMA_NV_EXTEND == SET)
 96           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
 97
 98       // An index with TPMA_NV_CLEAR_STCLEAR can't be a counter and can't have
 99       // TPMA_NV_WRITEDEFINE SET
100       if(     attributes.TPMA_NV_CLEAR_STCLEAR == SET
101           && (    attributes.TPMA_NV_COUNTER == SET
102                || attributes.TPMA_NV_WRITEDEFINE == SET)
103          )
104           return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
105
106       // Make sure that the creator of the index can delete the index
107       if( (    in->publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE == SET
108              && in->authHandle == TPM_RH_OWNER
109             )
110          || (   in->publicInfo.t.nvPublic.attributes.TPMA_NV_PLATFORMCREATE == CLEAR
111              && in->authHandle == TPM_RH_PLATFORM
112             )

      Family “2.0”                           TCG Published                                  Page 403
      Level 00 Revision 01.16           Copyright © TCG 2006-2014                    October 30, 2014
      Part 3: Commands                                                     Trusted Platform Module Library

113         )
114             return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_authHandle;
115
116      // If TPMA_NV_POLICY_DELETE is SET, then the index must be defined by
117      // the platform
118      if(    in->publicInfo.t.nvPublic.attributes.TPMA_NV_POLICY_DELETE == SET
119         && TPM_RH_PLATFORM != in->authHandle
120        )
121          return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
122
123      // If the NV index is used as a PCR, the data size must match the digest
124      // size
125      if(   in->publicInfo.t.nvPublic.attributes.TPMA_NV_EXTEND == SET
126         && in->publicInfo.t.nvPublic.dataSize != nameSize
127        )
128          return TPM_RC_ATTRIBUTES + RC_NV_DefineSpace_publicInfo;
129
130      // See if the index is already defined.
131      if(NvIsUndefinedIndex(in->publicInfo.t.nvPublic.nvIndex))
132          return TPM_RC_NV_DEFINED;
133
134   // Internal Data Update
135       // define the space. A TPM_RC_NV_SPACE error may be returned at this point
136       result = NvDefineIndex(&in->publicInfo.t.nvPublic, &in->auth);
137       if(result != TPM_RC_SUCCESS)
138           return result;
139
140      return TPM_RC_SUCCESS;
141
142   }
143   #endif // CC_NV_DefineSpace




      Page 404                                 TCG Published                                 Family “2.0”
      October 30, 2014                  Copyright © TCG 2006-2014               Level 00 Revision 01.16
Trusted Platform Module Library                                                           Part 3: Commands


31.4   TPM2_NV_UndefineSpace

31.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_AUTHORIZATION unless Platform Authorization is provided.
If nvIndex references an Index that has its TPMA_NV_POLICY_DELETE attribute SET, the TPM shall
return TPM_RC_ATTRIBUTES.

NOTE           An Index with TPMA_NV_PLATFORMCREATE CLEAR may be deleted with Platform Authorization
               as long as shEnable is SET. If shEnable is CLEAR, indexes created using Owner Authorization are
               not accessible even for deletion by the platform .




Family “2.0”                                TCG Published                                          Page 405
Level 00 Revision 01.16             Copyright © TCG 2006-2014                             October 30, 2014
Part 3: Commands                                               Trusted Platform Module Library


31.4.2 Command and Response

                     Table 199 — TPM2_NV_UndefineSpace Command
 Type                    Name                Description

 TPMI_ST_COMMAND_TAG     tag                 TPM_ST_SESSIONS
 UINT32                  commandSize
 TPM_CC                  commandCode         TPM_CC_NV_UndefineSpace {NV}

                                             TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
 TPMI_RH_PROVISION       @authHandle         Auth Index: 1
                                             Auth Role: USER
                                             the NV Index to remove from NV space
 TPMI_RH_NV_INDEX        nvIndex
                                             Auth Index: None


                     Table 200 — TPM2_NV_UndefineSpace Response
 Type                    Name                Description

 TPM_ST                  tag                 see clause 6
 UINT32                  responseSize
 TPM_RC                  responseCode




Page 406                            TCG Published                                   Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014             Level 00 Revision 01.16
     Trusted Platform Module Library                                                              Part 3: Commands



     31.4.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_UndefineSpace_fp.h"
3    #ifdef TPM_CC_NV_UndefineSpace // Conditional expansion of this file


     Error Returns                     Meaning

     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           attempt to use ownerAuth to delete an index created by the platform

 4   TPM_RC
 5   TPM2_NV_UndefineSpace(
 6       NV_UndefineSpace_In       *in                   // IN: input parameter list
 7       )
 8   {
 9       TPM_RC            result;
10       NV_INDEX          nvIndex;
11
12       // The command needs NV update. Check if NV is available.
13       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
14       // this point
15       result = NvIsAvailable();
16       if(result != TPM_RC_SUCCESS) return result;
17
18   // Input Validation
19
20       // Get NV index info
21       NvGetIndexInfo(in->nvIndex, &nvIndex);
22
23       // This command can't be used to delete an index with TPMA_NV_POLICY_DELETE SET
24       if(SET == nvIndex.publicArea.attributes.TPMA_NV_POLICY_DELETE)
25           return TPM_RC_ATTRIBUTES + RC_NV_UndefineSpace_nvIndex;
26
27       // The owner may only delete an index that was defined with ownerAuth. The
28       // platform may delete an index that was created with either auth.
29       if(   in->authHandle == TPM_RH_OWNER
30          && nvIndex.publicArea.attributes.TPMA_NV_PLATFORMCREATE == SET)
31           return TPM_RC_NV_AUTHORIZATION;
32
33   // Internal Data Update
34
35       // Call implementation dependent internal routine to delete NV index
36       NvDeleteEntity(in->nvIndex);
37
38       return TPM_RC_SUCCESS;
39   }
40   #endif // CC_NV_UndefineSpace




     Family “2.0”                                  TCG Published                                             Page 407
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                         Trusted Platform Module Library


31.5   TPM2_NV_UndefineSpaceSpecial

31.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 undefine 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                         or
TPMA_NV_POLICY_DELETE attribute CLEAR, the TPM shall return TPM_RC_ATTRIBUTES.

NOTE           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
               Owner Authorization are not accessible even for deletion by the platform .




Page 408                                   TCG Published                                    Family “2.0”
October 30, 2014                   Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                               Part 3: Commands


31.5.2 Command and Response

                     Table 201 — TPM2_NV_UndefineSpaceSpecial Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_NV_UndefineSpaceSpecial {NV}

                                                  Index to be deleted
 TPMI_RH_NV_INDEX             @nvIndex            Auth Index: 1
                                                  Auth Role: ADMIN
                                                  TPM_RH_PLATFORM + {PP}
 TPMI_RH_PLATFORM             @platform           Auth Index: 2
                                                  Auth Role: USER


                     Table 202 — TPM2_NV_UndefineSpaceSpecial Response
 Type                         Name                Description

 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                                 Page 409
Level 00 Revision 01.16             Copyright © TCG 2006-2014                 October 30, 2014
     Part 3: Commands                                                        Trusted Platform Module Library



     31.5.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_UndefineSpaceSpecial_fp.h"
3    #ifdef TPM_CC_NV_UndefineSpaceSpecial // Conditional expansion of this file


     Error Returns                    Meaning

     TPM_RC_ATTRIBUTES                TPMA_NV_POLICY_DELETE is not SET in the Index referenced by
                                      nvIndex

 4   TPM_RC
 5   TPM2_NV_UndefineSpaceSpecial(
 6       NV_UndefineSpaceSpecial_In      *in              // IN: input parameter list
 7       )
 8   {
 9       TPM_RC            result;
10       NV_INDEX          nvIndex;
11
12       // The command needs NV update. Check if NV is available.
13       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
14       // this point
15       result = NvIsAvailable();
16       if(result != TPM_RC_SUCCESS)
17           return result;
18
19   // Input Validation
20
21       // Get NV index info
22       NvGetIndexInfo(in->nvIndex, &nvIndex);
23
24       // This operation only applies when the TPMA_NV_POLICY_DELETE attribute is SET
25       if(CLEAR == nvIndex.publicArea.attributes.TPMA_NV_POLICY_DELETE)
26           return TPM_RC_ATTRIBUTES + RC_NV_UndefineSpaceSpecial_nvIndex;
27
28   // Internal Data Update
29
30       // Call implementation dependent internal routine to delete NV index
31       NvDeleteEntity(in->nvIndex);
32
33       return TPM_RC_SUCCESS;
34   }
35   #endif // CC_NV_UndefineSpaceSpecial




     Page 410                                    TCG Published                                 Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                Level 00 Revision 01.16
Trusted Platform Module Library                                                   Part 3: Commands


31.6   TPM2_NV_ReadPublic

31.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.




Family “2.0”                             TCG Published                                    Page 411
Level 00 Revision 01.16           Copyright © TCG 2006-2014                       October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library



31.6.2 Command and Response

                       Table 203 — TPM2_NV_ReadPublic Command
 Type                     Name                Description

                                              TPM_ST_SESSIONS if an audit or encrypt session is
 TPMI_ST_COMMAND_TAG      tag
                                              present; otherwise, TPM_ST_NO_SESSIONS
 UINT32                   commandSize
 TPM_CC                   commandCode         TPM_CC_NV_ReadPublic

                                              the NV Index
 TPMI_RH_NV_INDEX         nvIndex
                                              Auth Index: None


                       Table 204 — TPM2_NV_ReadPublic Response
 Type                     Name                Description
 TPM_ST                   tag                 see clause 6
 UINT32                   responseSize
 TPM_RC                   responseCode

 TPM2B_NV_PUBLIC          nvPublic            the public area of the NV Index
 TPM2B_NAME               nvName              the Name of the nvIndex




Page 412                             TCG Published                                  Family “2.0”
October 30, 2014                Copyright © TCG 2006-2014                Level 00 Revision 01.16
     Trusted Platform Module Library                                         Part 3: Commands



     31.6.3 Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "NV_ReadPublic_fp.h"
 3   #ifdef TPM_CC_NV_ReadPublic // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_NV_ReadPublic(
 6       NV_ReadPublic_In      *in,          // IN: input parameter list
 7       NV_ReadPublic_Out     *out          // OUT: output parameter list
 8       )
 9   {
10       NV_INDEX         nvIndex;
11
12   // Command Output
13
14       // Get NV index info
15       NvGetIndexInfo(in->nvIndex, &nvIndex);
16
17       // Copy data to output
18       out->nvPublic.t.nvPublic = nvIndex.publicArea;
19
20       // Compute NV name
21       out->nvName.t.size = NvGetName(in->nvIndex, &out->nvName.t.name);
22
23       return TPM_RC_SUCCESS;
24   }
25   #endif // CC_NV_ReadPublic




     Family “2.0”                           TCG Published                           Page 413
     Level 00 Revision 01.16           Copyright © TCG 2006-2014             October 30, 2014
Part 3: Commands                                                             Trusted Platform Module Library


31.7     TPM2_NV_Write

31.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_ATTRIBUTES.
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.




Page 414                                      TCG Published                                       Family “2.0”
October 30, 2014                      Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands


31.7.2 Command and Response

                              Table 205 — TPM2_NV_Write Command
 Type                         Name                 Description

 TPMI_ST_COMMAND_TAG          tag                  TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode          TPM_CC_NV_Write {NV}

                                                   handle indicating the source of the authorization value
 TPMI_RH_NV_AUTH              @authHandle          Auth Index: 1
                                                   Auth Role: USER
                                                   the NV Index of the area to write
 TPMI_RH_NV_INDEX             nvIndex
                                                   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 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                                         Page 415
Level 00 Revision 01.16              Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                               Trusted Platform Module Library



     31.7.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_Write_fp.h"
3    #ifdef TPM_CC_NV_Write // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns                    Meaning

     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                  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

 5   TPM_RC
 6   TPM2_NV_Write(
 7       NV_Write_In       *in                 // IN: input parameter list
 8       )
 9   {
10       NV_INDEX          nvIndex;
11       TPM_RC            result;
12
13   // Input Validation
14
15       // Get NV index info
16       NvGetIndexInfo(in->nvIndex, &nvIndex);
17
18       // common access checks. NvWrtieAccessChecks() may return
19       // TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
20       result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
21       if(result != TPM_RC_SUCCESS)
22           return result;
23
24       // Bits index, extend index or counter index may not be updated by
25       // TPM2_NV_Write
26       if(   nvIndex.publicArea.attributes.TPMA_NV_COUNTER == SET
27          || nvIndex.publicArea.attributes.TPMA_NV_BITS == SET
28          || nvIndex.publicArea.attributes.TPMA_NV_EXTEND == SET)
29           return TPM_RC_ATTRIBUTES;
30
31       // Too much data
32       if((in->data.t.size + in->offset) > nvIndex.publicArea.dataSize)
33           return TPM_RC_NV_RANGE;
34
35       // If this index requires a full sized write, make sure that input range is
36       // full sized
37       if(   nvIndex.publicArea.attributes.TPMA_NV_WRITEALL == SET
38          && in->data.t.size < nvIndex.publicArea.dataSize)
39           return TPM_RC_NV_RANGE;
40
41   // Internal Data Update
42
43       // Perform the write. This called routine will SET the TPMA_NV_WRITTEN
44       // attribute if it has not already been SET. If NV isn't available, an error
45       // will be returned.
46       return NvWriteIndexData(in->nvIndex, &nvIndex, in->offset,
47                               in->data.t.size, in->data.t.buffer);

     Page 416                                      TCG Published                                          Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

48
49   }
50   #endif // CC_NV_Write




     Family “2.0”                           TCG Published                 Page 417
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                            Trusted Platform Module Library


31.8     TPM2_NV_Increment

31.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          is   not    SET   in   the   indicated   NV   Index,   the   TPM     shall   return
TPM_RC_ATTRIBUTES.
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.




Page 418                                      TCG Published                                      Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                   Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands


31.8.2 Command and Response

                           Table 207 — TPM2_NV_Increment Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_NV_Increment {NV}

                                                  handle indicating the source of the authorization value
 TPMI_RH_NV_AUTH              @authHandle         Auth Index: 1
                                                  Auth Role: USER
                                                  the NV Index to increment
 TPMI_RH_NV_INDEX             nvIndex
                                                  Auth Index: None


                           Table 208 — TPM2_NV_Increment Response
 Type                         Name                Description

 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                                         Page 419
Level 00 Revision 01.16             Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                       Trusted Platform Module Library



     31.8.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_Increment_fp.h"
3    #ifdef TPM_CC_NV_Increment // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns                   Meaning

     TPM_RC_ATTRIBUTES               NV index is not a counter
     TPM_RC_NV_AUTHORIZATION         authorization failure
     TPM_RC_NV_LOCKED                Index is write locked

 5   TPM_RC
 6   TPM2_NV_Increment(
 7       NV_Increment_In       *in                  // IN: input parameter list
 8       )
 9   {
10       TPM_RC            result;
11       NV_INDEX          nvIndex;
12       UINT64            countValue;
13
14   // Input Validation
15
16       // Common access checks, a TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
17       // error may be returned at this point
18       result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
19       if(result != TPM_RC_SUCCESS)
20           return result;
21
22       // Get NV index info
23       NvGetIndexInfo(in->nvIndex, &nvIndex);
24
25       // Make sure that this is a counter
26       if(nvIndex.publicArea.attributes.TPMA_NV_COUNTER != SET)
27           return TPM_RC_ATTRIBUTES + RC_NV_Increment_nvIndex;
28
29   // Internal Data Update
30
31       // If counter index is not been written, initialize it
32       if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
33           countValue = NvInitialCounter();
34       else
35           // Read NV data in native format for TPM CPU.
36           NvGetIntIndexData(in->nvIndex, &nvIndex, &countValue);
37
38       // Do the increment
39       countValue++;
40
41       // If this is an orderly counter that just rolled over, need to be able to
42       // write to NV to proceed. This check is done here, because NvWriteIndexData()
43       // does not see if the update is for counter rollover.
44       if(    nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == SET
45           && (countValue & MAX_ORDERLY_COUNT) == 0)
46       {
47           result = NvIsAvailable();
48           if(result != TPM_RC_SUCCESS)
49               return result;
50
51           // Need to force an NV update
52           g_updateNV = TRUE;


     Page 420                                     TCG Published                               Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014               Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

53       }
54
55       // Write NV data back. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may
56       // be returned at this point. If necessary, this function will set the
57       // TPMA_NV_WRITTEN attribute
58       return NvWriteIndexData(in->nvIndex, &nvIndex, 0, 8, &countValue);
59
60   }
61   #endif // CC_NV_Increment




     Family “2.0”                           TCG Published                               Page 421
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                              Trusted Platform Module Library


31.9     TPM2_NV_Extend

31.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, unless the
                 TPMA_NV_CLEAR_STCLEAR attribute is SET and a TPM Reset or TPM Restart occurs.

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.




Page 422                                       TCG Published                                       Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                    Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands


31.9.2 Command and Response

                             Table 209 — TPM2_NV_Extend Command
 Type                         Name                 Description

 TPMI_ST_COMMAND_TAG          tag                  TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode          TPM_CC_NV_Extend {NV}

                                                   handle indicating the source of the authorization value
 TPMI_RH_NV_AUTH              @authHandle          Auth Index: 1
                                                   Auth Role: USER
                                                   the NV Index to extend
 TPMI_RH_NV_INDEX             nvIndex
                                                   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 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                                         Page 423
Level 00 Revision 01.16              Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                          Trusted Platform Module Library



     31.9.3 Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_Extend_fp.h"
3    #ifdef TPM_CC_NV_Extend // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns               Meaning

     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            the Index referenced by nvIndex is locked for writing

 5   TPM_RC
 6   TPM2_NV_Extend(
 7       NV_Extend_In      *in            // IN: input parameter list
 8       )
 9   {
10       TPM_RC                  result;
11       NV_INDEX                nvIndex;
12
13       TPM2B_DIGEST            oldDigest;
14       TPM2B_DIGEST            newDigest;
15       HASH_STATE              hashState;
16
17   // Input Validation
18
19       // Common access checks, NvWriteAccessCheck() may return TPM_RC_NV_AUTHORIZATION
20       // or TPM_RC_NV_LOCKED
21       result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
22       if(result != TPM_RC_SUCCESS)
23           return result;
24
25       // Get NV index info
26       NvGetIndexInfo(in->nvIndex, &nvIndex);
27
28       // Make sure that this is an extend index
29       if(nvIndex.publicArea.attributes.TPMA_NV_EXTEND != SET)
30           return TPM_RC_ATTRIBUTES + RC_NV_Extend_nvIndex;
31
32       // If the Index is not-orderly, or if this is the first write, NV will
33       // need to be updated.
34       if(   nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == CLEAR
35          || nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
36       {
37           // Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
38           // TPM_RC_NV_RATE or TPM_RC_SUCCESS.
39           result = NvIsAvailable();
40           if(result != TPM_RC_SUCCESS)
41               return result;
42       }
43
44   // Internal Data Update
45
46       // Perform the write.
47       oldDigest.t.size = CryptGetHashDigestSize(nvIndex.publicArea.nameAlg);
48       pAssert(oldDigest.t.size <= sizeof(oldDigest.t.buffer));
49       if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == SET)
50       {

     Page 424                                 TCG Published                                          Family “2.0”
     October 30, 2014                Copyright © TCG 2006-2014                           Level 00 Revision 01.16
     Trusted Platform Module Library                                             Part 3: Commands

51           NvGetIndexData(in->nvIndex, &nvIndex, 0,
52                          oldDigest.t.size, oldDigest.t.buffer);
53       }
54       else
55       {
56           MemorySet(oldDigest.t.buffer, 0, oldDigest.t.size);
57       }
58       // Start hash
59       newDigest.t.size = CryptStartHash(nvIndex.publicArea.nameAlg, &hashState);
60
61       // Adding old digest
62       CryptUpdateDigest2B(&hashState, &oldDigest.b);
63
64       // Adding new data
65       CryptUpdateDigest2B(&hashState, &in->data.b);
66
67       // Complete hash
68       CryptCompleteHash2B(&hashState, &newDigest.b);
69
70       // Write extended hash back.
71       // Note, this routine will SET the TPMA_NV_WRITTEN attribute if necessary
72       return NvWriteIndexData(in->nvIndex, &nvIndex, 0,
73                               newDigest.t.size, newDigest.t.buffer);
74   }
75   #endif // CC_NV_Extend




     Family “2.0”                           TCG Published                               Page 425
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                 October 30, 2014
Part 3: Commands                                                        Trusted Platform Module Library


31.10 TPM2_NV_SetBits

31.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.
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.




Page 426                                    TCG Published                                  Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                 Level 00 Revision 01.16
Trusted Platform Module Library                                                         Part 3: Commands


31.10.2    Command and Response

                             Table 211 — TPM2_NV_SetBits Command
 Type                         Name                 Description

 TPMI_ST_COMMAND_TAG          tag                  TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode          TPM_CC_NV_SetBits {NV}

                                                   handle indicating the source of the authorization value
 TPMI_RH_NV_AUTH              @authHandle          Auth Index: 1
                                                   Auth Role: USER
                                                   NV Index of the area in which the bit is to be set
 TPMI_RH_NV_INDEX             nvIndex
                                                   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 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                              TCG Published                                          Page 427
Level 00 Revision 01.16              Copyright © TCG 2006-2014                          October 30, 2014
     Part 3: Commands                                                            Trusted Platform Module Library



     31.10.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_SetBits_fp.h"
3    #ifdef TPM_CC_NV_SetBits // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns                 Meaning

     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              the Index referenced by nvIndex is locked for writing

 5   TPM_RC
 6   TPM2_NV_SetBits(
 7       NV_SetBits_In     *in              // IN: input parameter list
 8       )
 9   {
10       TPM_RC            result;
11       NV_INDEX          nvIndex;
12       UINT64            oldValue;
13       UINT64            newValue;
14
15   // Input Validation
16
17       // Common access checks, NvWriteAccessCheck() may return TPM_RC_NV_AUTHORIZATION
18       // or TPM_RC_NV_LOCKED
19       // error may be returned at this point
20       result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
21       if(result != TPM_RC_SUCCESS)
22           return result;
23
24       // Get NV index info
25       NvGetIndexInfo(in->nvIndex, &nvIndex);
26
27       // Make sure that this is a bit field
28       if(nvIndex.publicArea.attributes.TPMA_NV_BITS != SET)
29           return TPM_RC_ATTRIBUTES + RC_NV_SetBits_nvIndex;
30
31       // If index is not been written, initialize it
32       if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
33           oldValue = 0;
34       else
35           // Read index data
36           NvGetIntIndexData(in->nvIndex, &nvIndex, &oldValue);
37
38       // Figure out what the new value is going to be
39       newValue = oldValue | in->bits;
40
41       // If the Index is not-orderly and it has changed, or if this is the first
42       // write, NV will need to be updated.
43       if(    (    nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == CLEAR
44               && newValue != oldValue)
45           || nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
46       {
47
48   // Internal Data Update
49           // Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
50           // TPM_RC_NV_RATE or TPM_RC_SUCCESS.

     Page 428                                   TCG Published                                          Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                           Level 00 Revision 01.16
     Trusted Platform Module Library                                              Part 3: Commands

51           result = NvIsAvailable();
52           if(result != TPM_RC_SUCCESS)
53               return result;
54
55           // Write index data back. If necessary, this function will SET
56           // TPMA_NV_WRITTEN.
57           result = NvWriteIndexData(in->nvIndex, &nvIndex, 0, 8, &newValue);
58       }
59       return result;
60
61   }
62   #endif // CC_NV_SetBits




     Family “2.0”                           TCG Published                                Page 429
     Level 00 Revision 01.16           Copyright © TCG 2006-2014                  October 30, 2014
Part 3: Commands                                                    Trusted Platform Module Library


31.11 TPM2_NV_WriteLock

31.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 or if TPM_NV_WRITTEN is CLEAR.




Page 430                                 TCG Published                                Family “2.0”
October 30, 2014                  Copyright © TCG 2006-2014              Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands



31.11.2    Command and Response

                           Table 213 — TPM2_NV_WriteLock Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_NV_WriteLock {NV}

                                                  handle indicating the source of the authorization value
 TPMI_RH_NV_AUTH              @authHandle         Auth Index: 1
                                                  Auth Role: USER
                                                  the NV Index of the area to lock
 TPMI_RH_NV_INDEX             nvIndex
                                                  Auth Index: None


                           Table 214 — TPM2_NV_WriteLock Response
 Type                         Name                Description

 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                                         Page 431
Level 00 Revision 01.16             Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                               Trusted Platform Module Library



     31.11.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_WriteLock_fp.h"
3    #ifdef TPM_CC_NV_WriteLock // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns                    Meaning

     TPM_RC_ATTRIBUTES                neither TPMA_NV_WRITEDEFINE nor
                                      TPMA_NV_WRITE_STCLEAR is SET in 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

 5   TPM_RC
 6   TPM2_NV_WriteLock(
 7       NV_WriteLock_In       *in                  // IN: input parameter list
 8       )
 9   {
10       TPM_RC            result;
11       NV_INDEX          nvIndex;
12
13   // Input Validation:
14
15       // Common write access checks, a TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
16       // error may be returned at this point
17       result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
18       if(result != TPM_RC_SUCCESS)
19       {
20           if(result == TPM_RC_NV_AUTHORIZATION)
21               return TPM_RC_NV_AUTHORIZATION;
22           // If write access failed because the index is already locked, then it is
23           // no error.
24           return TPM_RC_SUCCESS;
25       }
26
27       // Get NV index info
28       NvGetIndexInfo(in->nvIndex, &nvIndex);
29
30       // if neither TPMA_NV_WRITEDEFINE nor TPMA_NV_WRITE_STCLEAR is set, the index
31       // can not be write-locked
32       if(   nvIndex.publicArea.attributes.TPMA_NV_WRITEDEFINE == CLEAR
33          && nvIndex.publicArea.attributes.TPMA_NV_WRITE_STCLEAR == CLEAR)
34           return TPM_RC_ATTRIBUTES + RC_NV_WriteLock_nvIndex;
35
36   // Internal Data Update
37
38       // The command needs NV update. Check if NV is available.
39       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
40       // this point
41       result = NvIsAvailable();
42       if(result != TPM_RC_SUCCESS)
43           return result;
44
45       // Set the WRITELOCK attribute.
46       // Note: if TPMA_NV_WRITELOCKED were already SET, then the write access check
47       // above would have failed and this code isn't executed.
48       nvIndex.publicArea.attributes.TPMA_NV_WRITELOCKED = SET;
49
50       // Write index info back
51       NvWriteIndexInfo(in->nvIndex, &nvIndex);

     Page 432                                      TCG Published                                          Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

52
53       return TPM_RC_SUCCESS;
54   }
55   #endif // CC_NV_WriteLock




     Family “2.0”                           TCG Published                 Page 433
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                             Trusted Platform Module Library


31.12 TPM2_NV_GlobalWriteLock

31.12.1    General Description

The command will SET TPMA_NV_WRITELOCKED                         for   all     indexes   that   have   their
TPMA_NV_GLOBALLOCK attribute SET.
If an Index has both TPMA_NV_WRITELOCKED and TPMA_NV_WRITEDEFINE SET, then this
command will permanently lock the NV Index for writing unless TPMA_NV_WRITTEN is CLEAR.

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.




Page 434                                    TCG Published                                       Family “2.0”
October 30, 2014                    Copyright © TCG 2006-2014                     Level 00 Revision 01.16
Trusted Platform Module Library                                               Part 3: Commands



31.12.2    Command and Response

                        Table 215 — TPM2_NV_GlobalWriteLock Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_NV_GlobalWriteLock

                                                  TPM_RH_OWNER or TPM_RH_PLATFORM+{PP}
 TPMI_RH_PROVISION            @authHandle         Auth Index: 1
                                                  Auth Role: USER


                        Table 216 — TPM2_NV_GlobalWriteLock Response
 Type                         Name                Description
 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                               Page 435
Level 00 Revision 01.16             Copyright © TCG 2006-2014                 October 30, 2014
     Part 3: Commands                                                    Trusted Platform Module Library



     31.12.3      Detailed Actions

 1   #include "InternalRoutines.h"
 2   #include "NV_GlobalWriteLock_fp.h"
 3   #ifdef TPM_CC_NV_GlobalWriteLock // Conditional expansion of this file
 4   TPM_RC
 5   TPM2_NV_GlobalWriteLock(
 6       NV_GlobalWriteLock_In       *in             // IN: input parameter list
 7       )
 8   {
 9       TPM_RC           result;
10
11       // Input parameter is not reference in command action
12       in = NULL; // to silence compiler warnings.
13
14       // The command needs NV update. Check if NV is available.
15       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
16       // this point
17       result = NvIsAvailable();
18       if(result != TPM_RC_SUCCESS)
19           return result;
20
21   // Internal Data Update
22
23       // Implementation dependent method of setting the global lock
24       NvSetGlobalLock();
25
26       return TPM_RC_SUCCESS;
27   }
28   #endif // CC_NV_GlobalWriteLock




     Page 436                                   TCG Published                              Family “2.0”
     October 30, 2014                      Copyright © TCG 2006-2014           Level 00 Revision 01.16
Trusted Platform Module Library                                                               Part 3: Commands


31.13 TPM2_NV_Read

31.13.1    General Description

This command reads a            value    from    an    area    in   NV    memory      previously     defined    by
TPM2_NV_DefineSpace().
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.




Family “2.0”                                  TCG Published                                            Page 437
Level 00 Revision 01.16               Copyright © TCG 2006-2014                              October 30, 2014
Part 3: Commands                                                  Trusted Platform Module Library



31.13.2    Command and Response

                        Table 217 — TPM2_NV_Read Command
 Type                   Name                 Description

 TPMI_ST_COMMAND_TAG    tag                  TPM_ST_SESSIONS
 UINT32                 commandSize
 TPM_CC                 commandCode          TPM_CC_NV_Read

                                             the handle indicating the source of the authorization
                                             value
 TPMI_RH_NV_AUTH        @authHandle
                                             Auth Index: 1
                                             Auth Role: USER
                                             the NV Index to be read
 TPMI_RH_NV_INDEX       nvIndex
                                             Auth Index: None

 UINT16                 size                 number of octets to read
                                             octet offset into the area
 UINT16                 offset               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 6
 UINT32                 responseSize
 TPM_RC                 responseCode

 TPM2B_MAX_NV_BUFFER    data                 the data read




Page 438                            TCG Published                                       Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                 Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     31.13.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_Read_fp.h"
3    #ifdef TPM_CC_NV_Read // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns                     Meaning

     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           the Index referenced by nvIndex has not been initialized (written)

 5   TPM_RC
 6   TPM2_NV_Read(
 7       NV_Read_In        *in,                 // IN: input parameter list
 8       NV_Read_Out       *out                 // OUT: output parameter list
 9       )
10   {
11       NV_INDEX          nvIndex;
12       TPM_RC            result;
13
14   // Input Validation
15
16       // Get NV index info
17       NvGetIndexInfo(in->nvIndex, &nvIndex);
18
19       // Common read access checks. NvReadAccessChecks() returns
20       // TPM_RC_NV_AUTHORIZATION, TPM_RC_NV_LOCKED, or TPM_RC_NV_UNINITIALIZED
21       // error may be returned at this point
22       result = NvReadAccessChecks(in->authHandle, in->nvIndex);
23       if(result != TPM_RC_SUCCESS)
24           return result;
25
26       // Too much data
27       if((in->size + in->offset) > nvIndex.publicArea.dataSize)
28           return TPM_RC_NV_RANGE;
29
30   // Command Output
31
32       // Set the return size
33       out->data.t.size = in->size;
34       // Perform the read
35       NvGetIndexData(in->nvIndex, &nvIndex, in->offset, in->size, out->data.t.buffer);
36
37       return TPM_RC_SUCCESS;
38   }
39   #endif // CC_NV_Read




     Family “2.0”                                   TCG Published                                               Page 439
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                 October 30, 2014
Part 3: Commands                                                                 Trusted Platform Module Library


31.14 TPM2_NV_ReadLock

31.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_ATTRIBUTES. 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.




Page 440                                       TCG Published                                       Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                        Level 00 Revision 01.16
Trusted Platform Module Library                                                       Part 3: Commands



31.14.2    Command and Response

                           Table 219 — TPM2_NV_ReadLock Command
 Type                         Name                Description

 TPMI_ST_COMMAND_TAG          tag                 TPM_ST_SESSIONS
 UINT32                       commandSize
 TPM_CC                       commandCode         TPM_CC_NV_ReadLock

                                                  the handle indicating the source of the authorization
                                                  value
 TPMI_RH_NV_AUTH              @authHandle
                                                  Auth Index: 1
                                                  Auth Role: USER
                                                  the NV Index to be locked
 TPMI_RH_NV_INDEX             nvIndex
                                                  Auth Index: None


                           Table 220 — TPM2_NV_ReadLock Response
 Type                         Name                Description

 TPM_ST                       tag                 see clause 6
 UINT32                       responseSize
 TPM_RC                       responseCode




Family “2.0”                             TCG Published                                         Page 441
Level 00 Revision 01.16             Copyright © TCG 2006-2014                         October 30, 2014
     Part 3: Commands                                                               Trusted Platform Module Library



     31.14.3     Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_ReadLock_fp.h"
3    #ifdef TPM_CC_NV_ReadLock // Conditional expansion of this file
4    #include "NV_spt_fp.h"


     Error Returns                    Meaning

     TPM_RC_ATTRIBUTES                TPMA_NV_READ_STCLEAR is not SET so Index referenced by
                                      nvIndex may not be write locked
     TPM_RC_NV_AUTHORIZATION          the authorization was valid but the authorizing entity (authHandle) is
                                      not allowed to read from the Index referenced by nvIndex

 5   TPM_RC
 6   TPM2_NV_ReadLock(
 7       NV_ReadLock_In    *in                 // IN: input parameter list
 8       )
 9   {
10       TPM_RC            result;
11       NV_INDEX          nvIndex;
12
13       // The command needs NV update. Check if NV is available.
14       // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
15       // this point
16       result = NvIsAvailable();
17       if(result != TPM_RC_SUCCESS) return result;
18
19   // Input Validation
20
21       // Common read access checks. NvReadAccessChecks() returns
22       // TPM_RC_NV_AUTHORIZATION, TPM_RC_NV_LOCKED, or TPM_RC_NV_UNINITIALIZED
23       // error may be returned at this point
24       result = NvReadAccessChecks(in->authHandle, in->nvIndex);
25       if(result != TPM_RC_SUCCESS)
26       {
27           if(result == TPM_RC_NV_AUTHORIZATION)
28               return TPM_RC_NV_AUTHORIZATION;
29           // Index is already locked for write
30           else if(result == TPM_RC_NV_LOCKED)
31               return TPM_RC_SUCCESS;
32
33             // If NvReadAccessChecks return TPM_RC_NV_UNINITALIZED, then continue.
34             // It is not an error to read lock an uninitialized Index.
35       }
36
37       // Get NV index info
38       NvGetIndexInfo(in->nvIndex, &nvIndex);
39
40       // if TPMA_NV_READ_STCLEAR is not set, the index can not be read-locked
41       if(nvIndex.publicArea.attributes.TPMA_NV_READ_STCLEAR == CLEAR)
42           return TPM_RC_ATTRIBUTES + RC_NV_ReadLock_nvIndex;
43
44   // Internal Data Update
45
46       // Set the READLOCK attribute
47       nvIndex.publicArea.attributes.TPMA_NV_READLOCKED = SET;
48       // Write NV info back
49       NvWriteIndexInfo(in->nvIndex, &nvIndex);
50
51       return TPM_RC_SUCCESS;
52   }

     Page 442                                      TCG Published                                          Family “2.0”
     October 30, 2014                     Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                               Part 3: Commands

53   #endif // CC_NV_ReadLock




     Family “2.0”                           TCG Published                 Page 443
     Level 00 Revision 01.16           Copyright © TCG 2006-2014   October 30, 2014
Part 3: Commands                                                                  Trusted Platform Module Library


31.15 TPM2_NV_ChangeAuth

31.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 administrative 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 TPM 2.0 Part 4
ComputeResponseHMAC().




Page 444                                        TCG Published                                           Family “2.0”
October 30, 2014                       Copyright © TCG 2006-2014                         Level 00 Revision 01.16
Trusted Platform Module Library                                                 Part 3: Commands



31.15.2    Command and Response

                          Table 221 — TPM2_NV_ChangeAuth Command
Type                          Name                  Description

TPMI_ST_COMMAND_TAG           tag                   TPM_ST_SESSIONS
UINT32                        commandSize
TPM_CC                        commandCode           TPM_CC_NV_ChangeAuth {NV}

                                                    handle of the object
TPMI_RH_NV_INDEX              @nvIndex              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 6
UINT32                        responseSize
TPM_RC                        responseCode




Family “2.0”                                 TCG Published                             Page 445
Level 00 Revision 01.16             Copyright © TCG 2006-2014                   October 30, 2014
     Part 3: Commands                                                           Trusted Platform Module Library



     31.15.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "NV_ChangeAuth_fp.h"
3    #ifdef TPM_CC_NV_ChangeAuth // Conditional expansion of this file


     Error Returns                 Meaning

     TPM_RC_SIZE                   newAuth size is larger than the digest size of the Name algorithm for
                                   the Index referenced by 'nvIndex

 4   TPM_RC
 5   TPM2_NV_ChangeAuth(
 6       NV_ChangeAuth_In   *in                  // IN: input parameter list
 7       )
 8   {
 9       TPM_RC         result;
10       NV_INDEX       nvIndex;
11
12   // Input Validation
13       // Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
14       // TPM_RC_NV_RATE or TPM_RC_SUCCESS.
15       result = NvIsAvailable();
16       if(result != TPM_RC_SUCCESS) return result;
17
18       // Read index info from NV
19       NvGetIndexInfo(in->nvIndex, &nvIndex);
20
21       // Remove any trailing zeros that might have been added by the caller
22       // to obfuscate the size.
23       MemoryRemoveTrailingZeros(&(in->newAuth));
24
25       // Make sure that the authValue is no larger than the nameAlg of the Index
26       if(in->newAuth.t.size > CryptGetHashDigestSize(nvIndex.publicArea.nameAlg))
27           return TPM_RC_SIZE + RC_NV_ChangeAuth_newAuth;
28
29   // Internal Data Update
30       // Change auth
31       nvIndex.authValue = in->newAuth;
32       // Write index info back to NV
33       NvWriteIndexInfo(in->nvIndex, &nvIndex);
34
35       return TPM_RC_SUCCESS;
36   }
37   #endif // CC_NV_ChangeAuth




     Page 446                                   TCG Published                                         Family “2.0”
     October 30, 2014                  Copyright © TCG 2006-2014                       Level 00 Revision 01.16
Trusted Platform Module Library                                                        Part 3: Commands


31.16 TPM2_NV_Certify

31.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 1          See 18.1 for description of how the signing scheme is selected.

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




Family “2.0”                                   TCG Published                                    Page 447
Level 00 Revision 01.16                Copyright © TCG 2006-2014                       October 30, 2014
Part 3: Commands                                                       Trusted Platform Module Library


31.16.2    Command and Response

                       Table 223 — TPM2_NV_Certify Command
Type                    Name                  Description

TPMI_ST_COMMAND_TAG     tag                   TPM_ST_SESSIONS
UINT32                  commandSize
TPM_CC                  commandCode           TPM_CC_NV_Certify

                                              handle of the key used to sign the attestation structure
TPMI_DH_OBJECT+         @signHandle           Auth Index: 1
                                              Auth Role: USER
                                                  handle indicating the source of the authorization value
                                                  for the NV Index
 TPMI_RH_NV_AUTH        @authHandle
                                                  Auth Index: 2
                                                  Auth Role: USER
                                                  Index for the area to be certified
 TPMI_RH_NV_INDEX       nvIndex
                                                  Auth Index: None

TPM2B_DATA              qualifyingData        user-provided qualifying data
                                              signing scheme to use if the scheme for signHandle is
TPMT_SIG_SCHEME+        inScheme
                                              TPM_ALG_NULL
 UINT16                 size                      number of octets to certify
                                                  octet offset into the area
 UINT16                 offset                    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 6
UINT32                  responseSize
TPM_RC                  responseCode          .

TPM2B_ATTEST            certifyInfo           the structure that was signed
                                              the asymmetric signature over certifyInfo using the key
TPMT_SIGNATURE          signature
                                              referenced by signHandle




Page 448                               TCG Published                                         Family “2.0”
October 30, 2014               Copyright © TCG 2006-2014                        Level 00 Revision 01.16
     Trusted Platform Module Library                                                                 Part 3: Commands



     31.16.3    Detailed Actions

1    #include "InternalRoutines.h"
2    #include "Attest_spt_fp.h"
3    #include "NV_spt_fp.h"
4    #include "NV_Certify_fp.h"
5    #ifdef TPM_CC_NV_Certify // Conditional expansion of this file


     Error Returns                     Meaning

     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                     inScheme is not an allowed value for the key definition

 6   TPM_RC
 7   TPM2_NV_Certify(
 8       NV_Certify_In     *in,                 // IN: input parameter list
 9       NV_Certify_Out    *out                 // OUT: output parameter list
10       )
11   {
12       TPM_RC                    result;
13       NV_INDEX                  nvIndex;
14       TPMS_ATTEST               certifyInfo;
15
16       // Attestation command may cause the orderlyState to be cleared due to
17       // the reporting of clock info. If this is the case, check if NV is
18       // available first
19       if(gp.orderlyState != SHUTDOWN_NONE)
20       {
21           // The command needs NV update. Check if NV is available.
22           // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
23           // this point
24           result = NvIsAvailable();
25           if(result != TPM_RC_SUCCESS)
26               return result;
27       }
28
29   // Input Validation
30
31       // Get NV index info
32       NvGetIndexInfo(in->nvIndex, &nvIndex);
33
34       // Common access checks. A TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
35       // error may be returned at this point
36       result = NvReadAccessChecks(in->authHandle, in->nvIndex);
37       if(result != TPM_RC_SUCCESS)
38           return result;
39
40       // See if the range to be certified is out of the bounds of the defined
41       // Index
42       if((in->size + in->offset) > nvIndex.publicArea.dataSize)
43           return TPM_RC_NV_RANGE;
44
45   // Command Output

     Family “2.0”                                   TCG Published                                               Page 449
     Level 00 Revision 01.16               Copyright © TCG 2006-2014                                 October 30, 2014
      Part 3: Commands                                                  Trusted Platform Module Library

 46
 47      // Filling in attest information
 48      // Common fields
 49      // FillInAttestInfo can return TPM_RC_SCHEME or TPM_RC_KEY
 50      result = FillInAttestInfo(in->signHandle,
 51                                &in->inScheme,
 52                                &in->qualifyingData,
 53                                &certifyInfo);
 54      if(result != TPM_RC_SUCCESS)
 55      {
 56          if(result == TPM_RC_KEY)
 57              return TPM_RC_KEY + RC_NV_Certify_signHandle;
 58          else
 59              return RcSafeAddToResult(result, RC_NV_Certify_inScheme);
 60      }
 61      // NV certify specific fields
 62      // Attestation type
 63      certifyInfo.type = TPM_ST_ATTEST_NV;
 64
 65      // Get the name of the index
 66      certifyInfo.attested.nv.indexName.t.size =
 67          NvGetName(in->nvIndex, &certifyInfo.attested.nv.indexName.t.name);
 68
 69      // Set the return size
 70      certifyInfo.attested.nv.nvContents.t.size = in->size;
 71
 72      // Set the offset
 73      certifyInfo.attested.nv.offset = in->offset;
 74
 75      // Perform the read
 76      NvGetIndexData(in->nvIndex, &nvIndex,
 77                     in->offset, in->size,
 78                     certifyInfo.attested.nv.nvContents.t.buffer);
 79
 80      // Sign attestation structure. A NULL signature will be returned if
 81      // signHandle is TPM_RH_NULL. SignAttestInfo() may return TPM_RC_VALUE,
 82      // TPM_RC_SCHEME or TPM_RC_ATTRUBUTES.
 83      // Note: SignAttestInfo may return TPM_RC_ATTRIBUTES if the key is not a
 84      // signing key but that was checked above. TPM_RC_VALUE would mean that the
 85      // data to sign is too large but the data to sign is a digest
 86      result = SignAttestInfo(in->signHandle,
 87                              &in->inScheme,
 88                              &certifyInfo,
 89                              &in->qualifyingData,
 90                              &out->certifyInfo,
 91                              &out->signature);
 92      if(result != TPM_RC_SUCCESS)
 93          return result;
 94
 95      // orderly state should be cleared because of the reporting of clock info
 96      // if signing happens
 97      if(in->signHandle != TPM_RH_NULL)
 98          g_clearOrderly = TRUE;
 99
100       return TPM_RC_SUCCESS;
101   }
102   #endif // CC_NV_Certify




      Page 450                              TCG Published                                 Family “2.0”
      October 30, 2014               Copyright © TCG 2006-2014               Level 00 Revision 01.16

