1 // This file was extracted from the TCG Published
2 // Trusted Platform Module Library
3 // Part 3: Commands
4 // Family "2.0"
5 // Level 00 Revision 01.16
6 // October 30, 2014
7 
8 #include "InternalRoutines.h"
9 #include "NV_ChangeAuth_fp.h"
10 //
11 //
12 //     Error Returns                 Meaning
13 //
14 //     TPM_RC_SIZE                   newAuth size is larger than the digest size of the Name algorithm for
15 //                                   the Index referenced by 'nvIndex
16 //
17 TPM_RC
TPM2_NV_ChangeAuth(NV_ChangeAuth_In * in)18 TPM2_NV_ChangeAuth(
19    NV_ChangeAuth_In   *in                  // IN: input parameter list
20    )
21 {
22    TPM_RC         result;
23    NV_INDEX       nvIndex;
24 
25 // Input Validation
26    // Check if NV is available. NvIsAvailable may return TPM_RC_NV_UNAVAILABLE
27    // TPM_RC_NV_RATE or TPM_RC_SUCCESS.
28    result = NvIsAvailable();
29    if(result != TPM_RC_SUCCESS) return result;
30 
31    // Read index info from NV
32    NvGetIndexInfo(in->nvIndex, &nvIndex);
33 
34    // Remove any trailing zeros that might have been added by the caller
35    // to obfuscate the size.
36    MemoryRemoveTrailingZeros(&(in->newAuth));
37 
38    // Make sure that the authValue is no larger than the nameAlg of the Index
39    if(in->newAuth.t.size > CryptGetHashDigestSize(nvIndex.publicArea.nameAlg))
40        return TPM_RC_SIZE + RC_NV_ChangeAuth_newAuth;
41 
42 // Internal Data Update
43    // Change auth
44    nvIndex.authValue = in->newAuth;
45    // Write index info back to NV
46    NvWriteIndexInfo(in->nvIndex, &nvIndex);
47 
48    return TPM_RC_SUCCESS;
49 }
50