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 "ClockSet_fp.h"
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Read the current TPMS_TIMER_INFO structure settings
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Error Returns                 Meaning
145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     TPM_RC_VALUE                  invalid new clock
165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
175679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM_RC
185679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM2_ClockSet(
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   ClockSet_In       *in              // IN: input parameter list
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   )
215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define CLOCK_UPDATE_MASK    ((1ULL << NV_CLOCK_UPDATE_INTERVAL)- 1)
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   UINT64      clockNow;
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Input Validation
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // new time can not be bigger than 0xFFFF000000000000 or smaller than
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // current clock
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if(in->newTime > 0xFFFF000000000000ULL
305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury           || in->newTime < go.clock)
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       return TPM_RC_VALUE + RC_ClockSet_newTime;
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Internal Data Update
345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Internal Data Update
365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   clockNow = go.clock;    // grab the old value
375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   go.clock = in->newTime;       // set the new value
385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   // Check to see if the update has caused a need for an nvClock update
395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   if((in->newTime & CLOCK_UPDATE_MASK) > (clockNow & CLOCK_UPDATE_MASK))
405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   {
415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       CryptDrbgGetPutState(GET_STATE);
425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       NvWriteReserved(NV_ORDERLY_DATA, &go);
435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       // Now the time state is safe
455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury       go.clockSafe = YES;
465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   }
475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury   return TPM_RC_SUCCESS;
495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury}
50