// This file was extracted from the TCG Published
// Trusted Platform Module Library
// Part 4: Supporting Routines
// Family "2.0"
// Level 00 Revision 01.16
// October 30, 2014
#include "InternalRoutines.h"
#include "NV_spt_fp.h"
//
//
// Fuctions
//
// NvReadAccessChecks()
//
// Common routine for validating a read Used by TPM2_NV_Read(), TPM2_NV_ReadLock() and
// TPM2_PolicyNV()
//
// Error Returns Meaning
//
// TPM_RC_NV_AUTHORIZATION autHandle is not allowed to authorize read of the index
// TPM_RC_NV_LOCKED Read locked
// TPM_RC_NV_UNINITIALIZED Try to read an uninitialized index
//
TPM_RC
NvReadAccessChecks(
TPM_HANDLE authHandle, // IN: the handle that provided the
// authorization
TPM_HANDLE nvHandle // IN: the handle of the NV index to be written
)
{
NV_INDEX nvIndex;
// Get NV index info
NvGetIndexInfo(nvHandle, &nvIndex);
// This check may be done before doing authorization checks as is done in this
// version of the reference code. If not done there, then uncomment the next
// three lines.
// // If data is read locked, returns an error
// if(nvIndex.publicArea.attributes.TPMA_NV_READLOCKED == SET)
// return TPM_RC_NV_LOCKED;
// If the authorization was provided by the owner or platform, then check
// that the attributes allow the read. If the authorization handle
// is the same as the index, then the checks were made when the authorization
// was checked..
if(authHandle == TPM_RH_OWNER)
{
// If Owner provided auth then ONWERWRITE must be SET
if(! nvIndex.publicArea.attributes.TPMA_NV_OWNERREAD)
return TPM_RC_NV_AUTHORIZATION;
}
else if(authHandle == TPM_RH_PLATFORM)
{
// If Platform provided auth then PPWRITE must be SET
if(!nvIndex.publicArea.attributes.TPMA_NV_PPREAD)
return TPM_RC_NV_AUTHORIZATION;
}
// If neither Owner nor Platform provided auth, make sure that it was
// provided by this index.
else if(authHandle != nvHandle)
return TPM_RC_NV_AUTHORIZATION;
// If the index has not been written, then the value cannot be read
// NOTE: This has to come after other access checks to make sure that
// the proper authorization is given to TPM2_NV_ReadLock()
if(nvIndex.publicArea.attributes.TPMA_NV_WRITTEN == CLEAR)
return TPM_RC_NV_UNINITIALIZED;
return TPM_RC_SUCCESS;
}
//
//
// NvWriteAccessChecks()
//
// Common routine for validating a write Used by TPM2_NV_Write(), TPM2_NV_Increment(),
// TPM2_SetBits(), and TPM2_NV_WriteLock()
//
//
//
//
// Error Returns Meaning
//
// TPM_RC_NV_AUTHORIZATION Authorization fails
// TPM_RC_NV_LOCKED Write locked
//
TPM_RC
NvWriteAccessChecks(
TPM_HANDLE authHandle, // IN: the handle that provided the
// authorization
TPM_HANDLE nvHandle // IN: the handle of the NV index to be written
)
{
NV_INDEX nvIndex;
// Get NV index info
NvGetIndexInfo(nvHandle, &nvIndex);
// This check may be done before doing authorization checks as is done in this
// version of the reference code. If not done there, then uncomment the next
// three lines.
// // If data is write locked, returns an error
// if(nvIndex.publicArea.attributes.TPMA_NV_WRITELOCKED == SET)
// return TPM_RC_NV_LOCKED;
// If the authorization was provided by the owner or platform, then check
// that the attributes allow the write. If the authorization handle
// is the same as the index, then the checks were made when the authorization
// was checked..
if(authHandle == TPM_RH_OWNER)
{
// If Owner provided auth then ONWERWRITE must be SET
if(! nvIndex.publicArea.attributes.TPMA_NV_OWNERWRITE)
return TPM_RC_NV_AUTHORIZATION;
}
else if(authHandle == TPM_RH_PLATFORM)
{
// If Platform provided auth then PPWRITE must be SET
if(!nvIndex.publicArea.attributes.TPMA_NV_PPWRITE)
return TPM_RC_NV_AUTHORIZATION;
}
// If neither Owner nor Platform provided auth, make sure that it was
// provided by this index.
else if(authHandle != nvHandle)
return TPM_RC_NV_AUTHORIZATION;
return TPM_RC_SUCCESS;
}