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 "Platform.h"
10 #include "PCR_fp.h"
11 //
12 //     This function is called to process a _TPM_Hash_Data() indication.
13 //
14 void
_TPM_Hash_Data(UINT32 dataSize,BYTE * data)15 _TPM_Hash_Data(
16    UINT32             dataSize,        // IN: size of data to be extend
17    BYTE              *data             // IN: data buffer
18    )
19 {
20    UINT32             i;
21    HASH_OBJECT       *hashObject;
22    TPMI_DH_PCR        pcrHandle = TPMIsStarted()
23                                  ? PCR_FIRST + DRTM_PCR : PCR_FIRST + HCRTM_PCR;
24 
25    // If there is no DRTM sequence object, then _TPM_Hash_Start
26    // was not called so this function returns without doing
27    // anything.
28    if(g_DRTMHandle == TPM_RH_UNASSIGNED)
29        return;
30 
31    hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
32    pAssert(hashObject->attributes.eventSeq);
33 
34    // For each of the implemented hash algorithms, update the digest with the
35    // data provided.
36    for(i = 0; i < HASH_COUNT; i++)
37    {
38        // make sure that the PCR is implemented for this algorithm
39        if(PcrIsAllocated(pcrHandle,
40                            hashObject->state.hashState[i].state.hashAlg))
41            // Update sequence object
42            CryptUpdateDigest(&hashObject->state.hashState[i], dataSize, data);
43    }
44 
45    return;
46 }
47