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 "PCR_Event_fp.h"
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Error Returns                 Meaning
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     TPM_RC_LOCALITY               current command locality is not allowed to extend the PCR
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//                                   referenced by pcrHandle
165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
175679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM_RC
185679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM2_PCR_Event(
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   PCR_Event_In      *in,             // IN: input parameter list
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   PCR_Event_Out     *out             // OUT: output parameter list
215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   TPM_RC                result;
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   HASH_STATE            hashState;
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   UINT32                i;
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   UINT16                size;
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Input Validation
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // If a PCR extend is required
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(in->pcrHandle != TPM_RH_NULL)
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   {
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       // If the PCR is not allow to extend, return error
345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       if(!PCRIsExtendAllowed(in->pcrHandle))
355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           return TPM_RC_LOCALITY;
365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       // If PCR is state saved and we need to update orderlyState, check NV
385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       // availability
395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       {
415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           result = NvIsAvailable();
425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           if(result != TPM_RC_SUCCESS) return result;
435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           g_clearOrderly = TRUE;
445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       }
455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Internal Data Update
485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   out->digests.count = HASH_COUNT;
505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Iterate supported PCR bank algorithms to extend
525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   for(i = 0; i < HASH_COUNT; i++)
535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   {
545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       TPM_ALG_ID hash = CryptGetHashAlgByIndex(i);
55a4ed3aa64664a1241ea982d685db744caaae3ffaJocelyn Bohr       out->digests.digests[i].hashAlg = hash;
565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       size = CryptStartHash(hash, &hashState);
575679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       CryptUpdateDigest2B(&hashState, &in->eventData.b);
585679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       CryptCompleteHash(&hashState, size,
59a4ed3aa64664a1241ea982d685db744caaae3ffaJocelyn Bohr                         (BYTE *) &out->digests.digests[i].digest);
605679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       if(in->pcrHandle != TPM_RH_NULL)
615679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           PCRExtend(in->pcrHandle, hash, size,
62a4ed3aa64664a1241ea982d685db744caaae3ffaJocelyn Bohr                     (BYTE *) &out->digests.digests[i].digest);
635679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
645679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
655679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return TPM_RC_SUCCESS;
665679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
67