15679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// This file was extracted from the TCG Published
25679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Trusted Platform Module Library
35679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Part 3: Commands
45679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Family "2.0"
55679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Level 00 Revision 01.16
65679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// October 30, 2014
75679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
85679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "InternalRoutines.h"
95679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "NV_UndefineSpaceSpecial_fp.h"
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Error Returns                    Meaning
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     TPM_RC_ATTRIBUTES                TPMA_NV_POLICY_DELETE is not SET in the Index referenced by
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//                                      nvIndex
165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
175679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM_RC
185679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM2_NV_UndefineSpaceSpecial(
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   NV_UndefineSpaceSpecial_In      *in              // IN: input parameter list
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   TPM_RC            result;
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   NV_INDEX          nvIndex;
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // The command needs NV update. Check if NV is available.
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // this point
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   result = NvIsAvailable();
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(result != TPM_RC_SUCCESS)
305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       return result;
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Input Validation
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Get NV index info
355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   NvGetIndexInfo(in->nvIndex, &nvIndex);
365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // This operation only applies when the TPMA_NV_POLICY_DELETE attribute is SET
385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(CLEAR == nvIndex.publicArea.attributes.TPMA_NV_POLICY_DELETE)
395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       return TPM_RC_ATTRIBUTES + RC_NV_UndefineSpaceSpecial_nvIndex;
405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Internal Data Update
425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Call implementation dependent internal routine to delete NV index
445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   NvDeleteEntity(in->nvIndex);
455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return TPM_RC_SUCCESS;
475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
48