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