blob: 06a8f700544244db7856428e017093818ffef8f5 [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 "ClockSet_fp.h"
10//
11// Read the current TPMS_TIMER_INFO structure settings
12//
13// Error Returns Meaning
14//
15// TPM_RC_VALUE invalid new clock
16//
17TPM_RC
18TPM2_ClockSet(
19 ClockSet_In *in // IN: input parameter list
20 )
21{
22#define CLOCK_UPDATE_MASK ((1ULL << NV_CLOCK_UPDATE_INTERVAL)- 1)
23 UINT64 clockNow;
24
25// Input Validation
26
27 // new time can not be bigger than 0xFFFF000000000000 or smaller than
28 // current clock
29 if(in->newTime > 0xFFFF000000000000ULL
30 || in->newTime < go.clock)
31 return TPM_RC_VALUE + RC_ClockSet_newTime;
32
33// Internal Data Update
34
35 // Internal Data Update
36 clockNow = go.clock; // grab the old value
37 go.clock = in->newTime; // set the new value
38 // Check to see if the update has caused a need for an nvClock update
39 if((in->newTime & CLOCK_UPDATE_MASK) > (clockNow & CLOCK_UPDATE_MASK))
40 {
41 CryptDrbgGetPutState(GET_STATE);
42 NvWriteReserved(NV_ORDERLY_DATA, &go);
43
44 // Now the time state is safe
45 go.clockSafe = YES;
46 }
47
48 return TPM_RC_SUCCESS;
49}