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 "PolicyCommandCode_fp.h" 105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Error Returns Meaning 135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// TPM_RC_VALUE commandCode of policySession previously set to a different value 155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 165679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM_RC 175679752bf24c21135884e987c4077e2f7184897Vadim BendeburyTPM2_PolicyCommandCode( 185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury PolicyCommandCode_In *in // IN: input parameter list 195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury ) 205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury{ 215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury SESSION *session; 225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury TPM_CC commandCode = TPM_CC_PolicyCommandCode; 235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury HASH_STATE hashState; 245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Input validation 265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // Get pointer to the session structure 285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury session = SessionGet(in->policySession); 295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury if(session->commandCode != 0 && session->commandCode != in->code) 315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury return TPM_RC_VALUE + RC_PolicyCommandCode_code; 325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury if(!CommandIsImplemented(in->code)) 335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury return TPM_RC_POLICY_CC + RC_PolicyCommandCode_code; 345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Internal Data Update 365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // Update policy hash 375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCommandCode || code) 385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // Start hash 395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury CryptStartHash(session->authHashAlg, &hashState); 405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // add old digest 425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b); 435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // add commandCode 455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode); 465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // add input commandCode 485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &in->code); 495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // complete the hash and get the results 515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b); 525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury // update commandCode value in session context 545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury session->commandCode = in->code; 555679752bf24c21135884e987c4077e2f7184897Vadim Bendebury 565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury return TPM_RC_SUCCESS; 575679752bf24c21135884e987c4077e2f7184897Vadim Bendebury} 58