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 "NV_Read_fp.h"
10 #include "NV_spt_fp.h"
11 //
12 //
13 // Error Returns Meaning
14 //
15 // TPM_RC_NV_AUTHORIZATION the authorization was valid but the authorizing entity (authHandle) is
16 // not allowed to read from the Index referenced by nvIndex
17 // TPM_RC_NV_LOCKED the Index referenced by nvIndex is read locked
18 // TPM_RC_NV_RANGE read range defined by size and offset is outside the range of the
19 // Index referenced by nvIndex
20 // TPM_RC_NV_UNINITIALIZED the Index referenced by nvIndex has not been initialized (written)
21 //
22 TPM_RC
TPM2_NV_Read(NV_Read_In * in,NV_Read_Out * out)23 TPM2_NV_Read(
24 NV_Read_In *in, // IN: input parameter list
25 NV_Read_Out *out // OUT: output parameter list
26 )
27 {
28 NV_INDEX nvIndex;
29 TPM_RC result;
30
31 // Input Validation
32
33 // Get NV index info
34 NvGetIndexInfo(in->nvIndex, &nvIndex);
35
36 // Common read access checks. NvReadAccessChecks() returns
37 // TPM_RC_NV_AUTHORIZATION, TPM_RC_NV_LOCKED, or TPM_RC_NV_UNINITIALIZED
38 // error may be returned at this point
39 result = NvReadAccessChecks(in->authHandle, in->nvIndex);
40 if(result != TPM_RC_SUCCESS)
41 return result;
42
43 // Too much data
44 if((in->size + in->offset) > nvIndex.publicArea.dataSize)
45 return TPM_RC_NV_RANGE;
46
47 // Command Output
48
49 // Set the return size
50 out->data.t.size = in->size;
51 // Perform the read
52 NvGetIndexData(in->nvIndex, &nvIndex, in->offset, in->size, out->data.t.buffer);
53
54 return TPM_RC_SUCCESS;
55 }
56