78 lines
1.9 KiB
C
78 lines
1.9 KiB
C
// 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;
|
|
}
|