blob: 7dee3a32e54ad88dfecbdb05f01c9d39636c899f [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// 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 "PolicyCpHash_fp.h"
10//
11//
12// Error Returns Meaning
13//
14// TPM_RC_CPHASH cpHash of policySession has previously been set to a different value
15// TPM_RC_SIZE cpHashA is not the size of a digest produced by the hash algorithm
16// associated with policySession
17//
18TPM_RC
19TPM2_PolicyCpHash(
20 PolicyCpHash_In *in // IN: input parameter list
21 )
22{
23 SESSION *session;
24 TPM_CC commandCode = TPM_CC_PolicyCpHash;
25 HASH_STATE hashState;
26
27// Input Validation
28
29 // Get pointer to the session structure
30 session = SessionGet(in->policySession);
31
32 // A new cpHash is given in input parameter, but cpHash in session context
33 // is not empty, or is not the same as the new cpHash
34 if( in->cpHashA.t.size != 0
35 && session->u1.cpHash.t.size != 0
36 && !Memory2BEqual(&in->cpHashA.b, &session->u1.cpHash.b)
37 )
38 return TPM_RC_CPHASH;
39
40 // A valid cpHash must have the same size as session hash digest
41 if(in->cpHashA.t.size != CryptGetHashDigestSize(session->authHashAlg))
42 return TPM_RC_SIZE + RC_PolicyCpHash_cpHashA;
43
44// Internal Data Update
45
46 // Update policy hash
47 // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCpHash || cpHashA)
48 // Start hash
49 CryptStartHash(session->authHashAlg, &hashState);
50
51 // add old digest
52 CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
53
54 // add commandCode
55 CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
56
57 // add cpHashA
58 CryptUpdateDigest2B(&hashState, &in->cpHashA.b);
59
60 // complete the digest and get the results
61 CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
62
63 // update cpHash in session context
64 session->u1.cpHash = in->cpHashA;
65 session->attributes.iscpHashDefined = SET;
66
67 return TPM_RC_SUCCESS;
68}