1// 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 "PolicyNameHash_fp.h" 10// 11// 12// Error Returns Meaning 13// 14// TPM_RC_CPHASH nameHash has been previously set to a different value 15// TPM_RC_SIZE nameHash is not the size of the digest produced by the hash 16// algorithm associated with policySession 17// 18TPM_RC 19TPM2_PolicyNameHash( 20 PolicyNameHash_In *in // IN: input parameter list 21 ) 22{ 23 SESSION *session; 24 TPM_CC commandCode = TPM_CC_PolicyNameHash; 25 HASH_STATE hashState; 26 27// Input Validation 28 29 // Get pointer to the session structure 30 session = SessionGet(in->policySession); 31 32 // A new nameHash is given in input parameter, but cpHash in session context 33 // is not empty 34 if(in->nameHash.t.size != 0 && session->u1.cpHash.t.size != 0) 35 return TPM_RC_CPHASH; 36 37 // A valid nameHash must have the same size as session hash digest 38 if(in->nameHash.t.size != CryptGetHashDigestSize(session->authHashAlg)) 39 return TPM_RC_SIZE + RC_PolicyNameHash_nameHash; 40 41// Internal Data Update 42 43 // Update policy hash 44 // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyNameHash || nameHash) 45 // Start hash 46 CryptStartHash(session->authHashAlg, &hashState); 47 48 // add old digest 49 CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b); 50 51 // add commandCode 52 CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode); 53 54 // add nameHash 55 CryptUpdateDigest2B(&hashState, &in->nameHash.b); 56 57 // complete the digest 58 CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b); 59 60 // clear iscpHashDefined bit to indicate now this field contains a nameHash 61 session->attributes.iscpHashDefined = CLEAR; 62 63 // update nameHash in session context 64 session->u1.cpHash = in->nameHash; 65 66 return TPM_RC_SUCCESS; 67} 68