C++程序  |  56行  |  1.79 KB

// 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;

   // Too much data
   if((in->size + in->offset) > nvIndex.publicArea.dataSize)
       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;
}