blob: d1f841561412991709ee66ca09f8f5225ffc9a21 [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 "NV_Increment_fp.h"
10#include "NV_spt_fp.h"
11//
12//
13// Error Returns Meaning
14//
15// TPM_RC_ATTRIBUTES NV index is not a counter
16// TPM_RC_NV_AUTHORIZATION authorization failure
17// TPM_RC_NV_LOCKED Index is write locked
18//
19TPM_RC
20TPM2_NV_Increment(
21 NV_Increment_In *in // IN: input parameter list
22 )
23{
24 TPM_RC result;
25 NV_INDEX nvIndex;
26 UINT64 countValue;
27
28// Input Validation
29
30 // Common access checks, a TPM_RC_NV_AUTHORIZATION or TPM_RC_NV_LOCKED
31 // error may be returned at this point
32 result = NvWriteAccessChecks(in->authHandle, in->nvIndex);
33 if(result != TPM_RC_SUCCESS)
34 return result;
35
36 // Get NV index info
37 NvGetIndexInfo(in->nvIndex, &nvIndex);
38
39 // Make sure that this is a counter
40 if(nvIndex.publicArea.attributes.TPMA_NV_COUNTER != SET)
41 return TPM_RC_ATTRIBUTES + RC_NV_Increment_nvIndex;
42
43// Internal Data Update
44
45 // If counter index is not been written, initialize it
46 if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
47 countValue = NvInitialCounter();
48 else
49 // Read NV data in native format for TPM CPU.
50 NvGetIntIndexData(in->nvIndex, &nvIndex, &countValue);
51
52 // Do the increment
53 countValue++;
54
55 // If this is an orderly counter that just rolled over, need to be able to
56 // write to NV to proceed. This check is done here, because NvWriteIndexData()
57 // does not see if the update is for counter rollover.
58 if( nvIndex.publicArea.attributes.TPMA_NV_ORDERLY == SET
59 && (countValue & MAX_ORDERLY_COUNT) == 0)
60 {
61 result = NvIsAvailable();
62 if(result != TPM_RC_SUCCESS)
63 return result;
64
65 // Need to force an NV update
66 g_updateNV = TRUE;
67//
68 }
69
70 // Write NV data back. A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may
71 // be returned at this point. If necessary, this function will set the
72 // TPMA_NV_WRITTEN attribute
73 return NvWriteIndexData(in->nvIndex, &nvIndex, 0, 8, &countValue);
74
75}