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 "PCR_Event_fp.h"
10 //
11 //
12 // Error Returns Meaning
13 //
14 // TPM_RC_LOCALITY current command locality is not allowed to extend the PCR
15 // referenced by pcrHandle
16 //
17 TPM_RC
TPM2_PCR_Event(PCR_Event_In * in,PCR_Event_Out * out)18 TPM2_PCR_Event(
19 PCR_Event_In *in, // IN: input parameter list
20 PCR_Event_Out *out // OUT: output parameter list
21 )
22 {
23 TPM_RC result;
24 HASH_STATE hashState;
25 UINT32 i;
26 UINT16 size;
27
28 // Input Validation
29
30 // If a PCR extend is required
31 if(in->pcrHandle != TPM_RH_NULL)
32 {
33 // If the PCR is not allow to extend, return error
34 if(!PCRIsExtendAllowed(in->pcrHandle))
35 return TPM_RC_LOCALITY;
36
37 // If PCR is state saved and we need to update orderlyState, check NV
38 // availability
39 if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE)
40 {
41 result = NvIsAvailable();
42 if(result != TPM_RC_SUCCESS) return result;
43 g_clearOrderly = TRUE;
44 }
45 }
46
47 // Internal Data Update
48
49 out->digests.count = HASH_COUNT;
50
51 // Iterate supported PCR bank algorithms to extend
52 for(i = 0; i < HASH_COUNT; i++)
53 {
54 TPM_ALG_ID hash = CryptGetHashAlgByIndex(i);
55 out->digests.digests[i].hashAlg = hash;
56 size = CryptStartHash(hash, &hashState);
57 CryptUpdateDigest2B(&hashState, &in->eventData.b);
58 CryptCompleteHash(&hashState, size,
59 (BYTE *) &out->digests.digests[i].digest);
60 if(in->pcrHandle != TPM_RH_NULL)
61 PCRExtend(in->pcrHandle, hash, size,
62 (BYTE *) &out->digests.digests[i].digest);
63 }
64
65 return TPM_RC_SUCCESS;
66 }
67