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