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