blob: 16485b84a172d508f401437cbde3b9c864202c0b [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 "PolicyCommandCode_fp.h"
10//
11//
12// Error Returns Meaning
13//
14// TPM_RC_VALUE commandCode of policySession previously set to a different value
15//
16TPM_RC
17TPM2_PolicyCommandCode(
18 PolicyCommandCode_In *in // IN: input parameter list
19 )
20{
21 SESSION *session;
22 TPM_CC commandCode = TPM_CC_PolicyCommandCode;
23 HASH_STATE hashState;
24
25// Input validation
26
27 // Get pointer to the session structure
28 session = SessionGet(in->policySession);
29
30 if(session->commandCode != 0 && session->commandCode != in->code)
31 return TPM_RC_VALUE + RC_PolicyCommandCode_code;
32 if(!CommandIsImplemented(in->code))
33 return TPM_RC_POLICY_CC + RC_PolicyCommandCode_code;
34
35// Internal Data Update
36 // Update policy hash
37 // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCommandCode || code)
38 // Start hash
39 CryptStartHash(session->authHashAlg, &hashState);
40
41 // add old digest
42 CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
43
44 // add commandCode
45 CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
46
47 // add input commandCode
48 CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &in->code);
49
50 // complete the hash and get the results
51 CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
52
53 // update commandCode value in session context
54 session->commandCode = in->code;
55
56 return TPM_RC_SUCCESS;
57}