// 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_UndefineSpace_fp.h"
//
//
//     Error Returns                     Meaning
//
//     TPM_RC_ATTRIBUTES                 TPMA_NV_POLICY_DELETE is SET in the Index referenced by
//                                       nvIndex so this command may not be used to delete this Index (see
//                                       TPM2_NV_UndefineSpaceSpecial())
//     TPM_RC_NV_AUTHORIZATION           attempt to use ownerAuth to delete an index created by the platform
//
TPM_RC
TPM2_NV_UndefineSpace(
   NV_UndefineSpace_In       *in                   // IN: input parameter list
   )
{
   TPM_RC            result;
   NV_INDEX          nvIndex;

   // The command needs NV update. Check if NV is available.
   // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
   // this point
   result = NvIsAvailable();
   if(result != TPM_RC_SUCCESS) return result;

   // Indexes in the virtual range cannot be undefined.
   if (_plat__NvGetHandleVirtualOffset(in->nvIndex))
       return TPM_RC_NV_AUTHORIZATION;

// Input Validation

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

   // This command can't be used to delete an index with TPMA_NV_POLICY_DELETE SET
   if(SET == nvIndex.publicArea.attributes.TPMA_NV_POLICY_DELETE)
       return TPM_RC_ATTRIBUTES + RC_NV_UndefineSpace_nvIndex;

   // The owner may only delete an index that was defined with ownerAuth. The
   // platform may delete an index that was created with either auth.
   if(   in->authHandle == TPM_RH_OWNER
      && nvIndex.publicArea.attributes.TPMA_NV_PLATFORMCREATE == SET)
       return TPM_RC_NV_AUTHORIZATION;

// Internal Data Update

   // Call implementation dependent internal routine to delete NV index
   NvDeleteEntity(in->nvIndex);

   return TPM_RC_SUCCESS;
}
