blob: cb6bfbc01d8860da9d48670b39c8874c84f851bf [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// 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 "SetCommandCodeAuditStatus_fp.h"
10TPM_RC
11TPM2_SetCommandCodeAuditStatus(
12 SetCommandCodeAuditStatus_In *in // IN: input parameter list
13 )
14{
15 TPM_RC result;
16 UINT32 i;
17 BOOL changed = FALSE;
18
19 // The command needs NV update. Check if NV is available.
20 // A TPM_RC_NV_UNAVAILABLE or TPM_RC_NV_RATE error may be returned at
21 // this point
22 result = NvIsAvailable();
23 if(result != TPM_RC_SUCCESS)
24 return result;
25
26// Internal Data Update
27
28 // Update hash algorithm
29 if( in->auditAlg != TPM_ALG_NULL
30 && in->auditAlg != gp.auditHashAlg)
31 {
32 // Can't change the algorithm and command list at the same time
33 if(in->setList.count != 0 || in->clearList.count != 0)
34 return TPM_RC_VALUE + RC_SetCommandCodeAuditStatus_auditAlg;
35
36 // Change the hash algorithm for audit
37 gp.auditHashAlg = in->auditAlg;
38
39 // Set the digest size to a unique value that indicates that the digest
40 // algorithm has been changed. The size will be cleared to zero in the
41 // command audit processing on exit.
42 gr.commandAuditDigest.t.size = 1;
43
44 // Save the change of command audit data (this sets g_updateNV so that NV
45 // will be updated on exit.)
46 NvWriteReserved(NV_AUDIT_HASH_ALG, &gp.auditHashAlg);
47
48 } else {
49
50 // Process set list
51 for(i = 0; i < in->setList.count; i++)
52
53 // If change is made in CommandAuditSet, set changed flag
54 if(CommandAuditSet(in->setList.commandCodes[i]))
55 changed = TRUE;
56
57 // Process clear list
58 for(i = 0; i < in->clearList.count; i++)
59 // If change is made in CommandAuditClear, set changed flag
60 if(CommandAuditClear(in->clearList.commandCodes[i]))
61 changed = TRUE;
62
63 // if change was made to command list, update NV
64 if(changed)
65 // this sets g_updateNV so that NV will be updated on exit.
66 NvWriteReserved(NV_AUDIT_COMMANDS, &gp.auditComands);
67 }
68
69 return TPM_RC_SUCCESS;
70}