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 "ClearControl_fp.h"
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Error Returns                   Meaning
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     TPM_RC_AUTH_FAIL                authorization is not properly given
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
165679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM_RC
175679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM2_ClearControl(
185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   ClearControl_In       *in                 // IN: input parameter list
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   TPM_RC      result;
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // The command needs NV update. Check if NV is available.
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // this point
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   result = NvIsAvailable();
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(result != TPM_RC_SUCCESS) return result;
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Input Validation
305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // LockoutAuth may be used to set disableLockoutClear to TRUE but not to FALSE
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(in->auth == TPM_RH_LOCKOUT && in->disable == NO)
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       return TPM_RC_AUTH_FAIL;
345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Internal Data Update
365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(in->disable == YES)
385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       gp.disableClear = TRUE;
395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   else
405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       gp.disableClear = FALSE;
415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Record the change to NV
435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   NvWriteReserved(NV_DISABLE_CLEAR, &gp.disableClear);
445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return TPM_RC_SUCCESS;
465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
47