// This file was extracted from the TCG Published
// Trusted Platform Module Library
// Part 3: Commands
// Family "2.0"
// Level 00 Revision 01.16
// October 30, 2014

#include "InternalRoutines.h"
#include "NV_Read_fp.h"
#include "NV_spt_fp.h"
//
//
//     Error Returns                     Meaning
//
//     TPM_RC_NV_AUTHORIZATION           the authorization was valid but the authorizing entity (authHandle) is
//                                       not allowed to read from the Index referenced by nvIndex
//     TPM_RC_NV_LOCKED                  the Index referenced by nvIndex is read locked
//     TPM_RC_NV_RANGE                   read range defined by size and offset is outside the range of the
//                                       Index referenced by nvIndex
//     TPM_RC_NV_UNINITIALIZED           the Index referenced by nvIndex has not been initialized (written)
//
TPM_RC
TPM2_NV_Read(
   NV_Read_In        *in,                 // IN: input parameter list
   NV_Read_Out       *out                 // OUT: output parameter list
   )
{
   NV_INDEX          nvIndex;
   TPM_RC            result;

// Input Validation

   // Get NV index info
   NvGetIndexInfo(in->nvIndex, &nvIndex);

   // Common read access checks. NvReadAccessChecks() returns
   // TPM_RC_NV_AUTHORIZATION, TPM_RC_NV_LOCKED, or TPM_RC_NV_UNINITIALIZED
   // error may be returned at this point
   result = NvReadAccessChecks(in->authHandle, in->nvIndex);
   if(result != TPM_RC_SUCCESS)
       return result;

    // Make sure the data will fit the return buffer
    if( in->size > MAX_NV_BUFFER_SIZE)
        return TPM_RC_VALUE + RC_NV_Read_size;

    // Verify that the offset is not too large
    if(in->offset > nvIndex.publicArea.dataSize)
        return TPM_RC_VALUE + RC_NV_Read_offset;

    // Make sure that the selection is within the range of the Index
    if(in->size > (nvIndex.publicArea.dataSize - in->offset))
        return TPM_RC_NV_RANGE;

// Command Output

   // Set the return size
   out->data.t.size = in->size;
   // Perform the read
   NvGetIndexData(in->nvIndex, &nvIndex, in->offset, in->size, out->data.t.buffer);

   return TPM_RC_SUCCESS;
}
