// 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"
//
// This function is called to process a _TPM_Hash_End() indication.
//
void
_TPM_Hash_End(
void
)
{
UINT32 i;
TPM2B_DIGEST digest;
HASH_OBJECT *hashObject;
TPMI_DH_PCR pcrHandle;
// If the DRTM handle is not being used, then either _TPM_Hash_Start has not
// been called, _TPM_Hash_End was previously called, or some other command
// was executed and the sequence was aborted.
if(g_DRTMHandle == TPM_RH_UNASSIGNED)
return;
// Get DRTM sequence object
hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
// Is this _TPM_Hash_End after Startup or before
if(TPMIsStarted())
{
// After
// Reset the DRTM PCR
PCRResetDynamics();
// Extend the DRTM_PCR.
pcrHandle = PCR_FIRST + DRTM_PCR;
// DRTM sequence increments restartCount
gr.restartCount++;
}
else
{
pcrHandle = PCR_FIRST + HCRTM_PCR;
}
// Complete hash and extend PCR, or if this is an HCRTM, complete
// the hash, reset the H-CRTM register (PCR[0]) to 0...04, and then
// extend the H-CRTM data
for(i = 0; i < HASH_COUNT; i++)
{
TPMI_ALG_HASH hash = CryptGetHashAlgByIndex(i);
// make sure that the PCR is implemented for this algorithm
if(PcrIsAllocated(pcrHandle,
hashObject->state.hashState[i].state.hashAlg))
{
// Complete hash
digest.t.size = CryptGetHashDigestSize(hash);
CryptCompleteHash2B(&hashObject->state.hashState[i], &digest.b);
PcrDrtm(pcrHandle, hash, &digest);
}
}
// Flush sequence object.
//
ObjectFlush(g_DRTMHandle);
g_DRTMHandle = TPM_RH_UNASSIGNED;
g_DrtmPreStartup = TRUE;
return;
}