blob: 46cf7c9a11b789557e9ef2484f5ae993ed2b8638 [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 "PolicyNvWritten_fp.h"
10//
11// Make an NV Index policy dependent on the state of the TPMA_NV_WRITTEN attribute of the index.
12//
13// Error Returns Meaning
14//
15// TPM_RC_VALUE a conflicting request for the attribute has already been processed
16//
17TPM_RC
18TPM2_PolicyNvWritten(
19 PolicyNvWritten_In *in // IN: input parameter list
20 )
21{
22 SESSION *session;
23 TPM_CC commandCode = TPM_CC_PolicyNvWritten;
24 HASH_STATE hashState;
25
26// Input Validation
27
28 // Get pointer to the session structure
29 session = SessionGet(in->policySession);
30
31 // If already set is this a duplicate (the same setting)? If it
32 // is a conflicting setting, it is an error
33 if(session->attributes.checkNvWritten == SET)
34 {
35 if(( (session->attributes.nvWrittenState == SET)
36 != (in->writtenSet == YES)))
37 return TPM_RC_VALUE + RC_PolicyNvWritten_writtenSet;
38 }
39
40// Internal Data Update
41
42 // Set session attributes so that the NV Index needs to be checked
43 session->attributes.checkNvWritten = SET;
44 session->attributes.nvWrittenState = (in->writtenSet == YES);
45
46 // Update policy hash
47 // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyNvWritten
48 // || writtenSet)
49 // Start hash
50 CryptStartHash(session->authHashAlg, &hashState);
51
52 // add old digest
53 CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
54
55 // add commandCode
56 CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
57
58 // add the byte of writtenState
59 CryptUpdateDigestInt(&hashState, sizeof(TPMI_YES_NO), &in->writtenSet);
60
61 // complete the digest
62 CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
63
64 return TPM_RC_SUCCESS;
65}