Vadim Bendebury | 5679752 | 2015-05-20 10:32:25 -0700 | [diff] [blame] | 1 | // This file was extracted from the TCG Published |
| 2 | // Trusted Platform Module Library |
| 3 | // Part 3: Commands |
| 4 | // Family "2.0" |
| 5 | // Level 00 Revision 01.16 |
| 6 | // October 30, 2014 |
| 7 | |
| 8 | #include "InternalRoutines.h" |
| 9 | #include "Clear_fp.h" |
| 10 | // |
| 11 | // |
| 12 | // Error Returns Meaning |
| 13 | // |
| 14 | // TPM_RC_DISABLED Clear command has been disabled |
| 15 | // |
| 16 | TPM_RC |
| 17 | TPM2_Clear( |
| 18 | Clear_In *in // IN: input parameter list |
| 19 | ) |
| 20 | { |
| 21 | TPM_RC result; |
| 22 | |
| 23 | // Input parameter is not reference in command action |
| 24 | in = NULL; |
| 25 | |
| 26 | // The command needs NV update. Check if NV is available. |
| 27 | // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at |
| 28 | // this point |
| 29 | result = NvIsAvailable(); |
| 30 | if(result != TPM_RC_SUCCESS) return result; |
| 31 | |
| 32 | // Input Validation |
| 33 | |
| 34 | // If Clear command is disabled, return an error |
| 35 | if(gp.disableClear) |
| 36 | return TPM_RC_DISABLED; |
| 37 | |
| 38 | // Internal Data Update |
| 39 | |
| 40 | // Reset storage hierarchy seed from RNG |
| 41 | CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.SPSeed.t.buffer); |
| 42 | |
| 43 | // Create new shProof and ehProof value from RNG |
| 44 | CryptGenerateRandom(PROOF_SIZE, gp.shProof.t.buffer); |
| 45 | CryptGenerateRandom(PROOF_SIZE, gp.ehProof.t.buffer); |
| 46 | |
| 47 | // Enable storage and endorsement hierarchy |
| 48 | gc.shEnable = gc.ehEnable = TRUE; |
| 49 | |
| 50 | // set the authValue buffers to zero |
| 51 | MemorySet(gp.ownerAuth.t.buffer, 0, gp.ownerAuth.t.size); |
| 52 | MemorySet(gp.endorsementAuth.t.buffer, 0, gp.endorsementAuth.t.size); |
| 53 | MemorySet(gp.lockoutAuth.t.buffer, 0, gp.lockoutAuth.t.size); |
| 54 | // Set storage, endorsement and lockout authValue to null |
| 55 | gp.ownerAuth.t.size = gp.endorsementAuth.t.size = gp.lockoutAuth.t.size = 0; |
| 56 | |
| 57 | // Set storage, endorsement, and lockout authPolicy to null |
| 58 | gp.ownerAlg = gp.endorsementAlg = gp.lockoutAlg = TPM_ALG_NULL; |
| 59 | gp.ownerPolicy.t.size = 0; |
| 60 | gp.endorsementPolicy.t.size = 0; |
| 61 | gp.lockoutPolicy.t.size = 0; |
| 62 | |
| 63 | // Flush loaded object in storage and endorsement hierarchy |
| 64 | ObjectFlushHierarchy(TPM_RH_OWNER); |
| 65 | ObjectFlushHierarchy(TPM_RH_ENDORSEMENT); |
| 66 | |
| 67 | // Flush owner and endorsement object and owner index in NV |
| 68 | NvFlushHierarchy(TPM_RH_OWNER); |
| 69 | NvFlushHierarchy(TPM_RH_ENDORSEMENT); |
| 70 | |
| 71 | // Save hierarchy changes to NV |
| 72 | NvWriteReserved(NV_SP_SEED, &gp.SPSeed); |
| 73 | NvWriteReserved(NV_SH_PROOF, &gp.shProof); |
| 74 | NvWriteReserved(NV_EH_PROOF, &gp.ehProof); |
| 75 | NvWriteReserved(NV_OWNER_AUTH, &gp.ownerAuth); |
| 76 | NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth); |
| 77 | NvWriteReserved(NV_LOCKOUT_AUTH, &gp.lockoutAuth); |
| 78 | NvWriteReserved(NV_OWNER_ALG, &gp.ownerAlg); |
| 79 | NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg); |
| 80 | NvWriteReserved(NV_LOCKOUT_ALG, &gp.lockoutAlg); |
| 81 | NvWriteReserved(NV_OWNER_POLICY, &gp.ownerPolicy); |
| 82 | NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy); |
| 83 | NvWriteReserved(NV_LOCKOUT_POLICY, &gp.lockoutPolicy); |
| 84 | |
| 85 | // Initialize dictionary attack parameters |
| 86 | DAPreInstall_Init(); |
| 87 | |
| 88 | // Reset clock |
| 89 | go.clock = 0; |
| 90 | go.clockSafe = YES; |
| 91 | // Update the DRBG state whenever writing orderly state to NV |
| 92 | CryptDrbgGetPutState(GET_STATE); |
| 93 | NvWriteReserved(NV_ORDERLY_DATA, &go); |
| 94 | |
| 95 | // Reset counters |
| 96 | gp.resetCount = gr.restartCount = gr.clearCount = 0; |
| 97 | gp.auditCounter = 0; |
| 98 | NvWriteReserved(NV_RESET_COUNT, &gp.resetCount); |
| 99 | NvWriteReserved(NV_AUDIT_COUNTER, &gp.auditCounter); |
| 100 | |
| 101 | // orderly state should be cleared because of the update to state clear data |
| 102 | g_clearOrderly = TRUE; |
| 103 | |
| 104 | return TPM_RC_SUCCESS; |
| 105 | } |