// This file was extracted from the TCG Published
// Trusted Platform Module Library
// Part 3: Commands
// Family "2.0"
// Level 00 Revision 01.16
// October 30, 2014
#include "InternalRoutines.h"
#include "ChangeEPS_fp.h"
TPM_RC
TPM2_ChangeEPS(
ChangeEPS_In *in // IN: input parameter list
)
{
TPM_RC result;
// The command needs NV update. Check if NV is available.
// A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
// this point
result = NvIsAvailable();
if(result != TPM_RC_SUCCESS) return result;
// Input parameter is not reference in command action
in = NULL;
// Internal Data Update
// Reset endorsement hierarchy seed from RNG
CryptGenerateRandom(PRIMARY_SEED_SIZE, gp.EPSeed.t.buffer);
// Create new ehProof value from RNG
CryptGenerateRandom(PROOF_SIZE, gp.ehProof.t.buffer);
// Enable endorsement hierarchy
gc.ehEnable = TRUE;
// set authValue buffer to zeros
MemorySet(gp.endorsementAuth.t.buffer, 0, gp.endorsementAuth.t.size);
// Set endorsement authValue to null
gp.endorsementAuth.t.size = 0;
// Set endorsement authPolicy to null
gp.endorsementAlg = TPM_ALG_NULL;
gp.endorsementPolicy.t.size = 0;
// Flush loaded object in endorsement hierarchy
ObjectFlushHierarchy(TPM_RH_ENDORSEMENT);
// Flush evict object of endorsement hierarchy stored in NV
NvFlushHierarchy(TPM_RH_ENDORSEMENT);
// Save hierarchy changes to NV
NvWriteReserved(NV_EP_SEED, &gp.EPSeed);
NvWriteReserved(NV_EH_PROOF, &gp.ehProof);
NvWriteReserved(NV_ENDORSEMENT_AUTH, &gp.endorsementAuth);
NvWriteReserved(NV_ENDORSEMENT_ALG, &gp.endorsementAlg);
NvWriteReserved(NV_ENDORSEMENT_POLICY, &gp.endorsementPolicy);
// orderly state should be cleared because of the update to state clear data
g_clearOrderly = TRUE;
return TPM_RC_SUCCESS;
}