Home | History | Annotate | Download | only in tpm2
      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 }
    106