15679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// This file was extracted from the TCG Published
25679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Trusted Platform Module Library
35679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Part 3: Commands
45679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Family "2.0"
55679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Level 00 Revision 01.16
65679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// October 30, 2014
75679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
85679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "InternalRoutines.h"
95679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "Platform.h"
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "PCR_fp.h"
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     This function is called to process a _TPM_Hash_Data() indication.
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
145679752bf24c21135884e987c4077e2f7184897Vadim Bendeburyvoid
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury_TPM_Hash_Data(
165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   UINT32             dataSize,        // IN: size of data to be extend
175679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   BYTE              *data             // IN: data buffer
185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   UINT32             i;
215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   HASH_OBJECT       *hashObject;
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   TPMI_DH_PCR        pcrHandle = TPMIsStarted()
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                 ? PCR_FIRST + DRTM_PCR : PCR_FIRST + HCRTM_PCR;
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If there is no DRTM sequence object, then _TPM_Hash_Start
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // was not called so this function returns without doing
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // anything.
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(g_DRTMHandle == TPM_RH_UNASSIGNED)
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       return;
305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   hashObject = (HASH_OBJECT *)ObjectGet(g_DRTMHandle);
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   pAssert(hashObject->attributes.eventSeq);
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // For each of the implemented hash algorithms, update the digest with the
355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // data provided.
365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   for(i = 0; i < HASH_COUNT; i++)
375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   {
385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       // make sure that the PCR is implemented for this algorithm
395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       if(PcrIsAllocated(pcrHandle,
405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                           hashObject->state.hashState[i].state.hashAlg))
415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           // Update sequence object
425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           CryptUpdateDigest(&hashObject->state.hashState[i], dataSize, data);
435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return;
465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
47