// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 3: Commands // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "InternalRoutines.h" #include "PolicyOR_fp.h" #include "Policy_spt_fp.h" // // // Error Returns Meaning // // TPM_RC_VALUE no digest in pHashList matched the current value of policyDigest for // policySession // TPM_RC TPM2_PolicyOR( PolicyOR_In *in // IN: input parameter list ) { SESSION *session; UINT32 i; // Input Validation and Update // Get pointer to the session structure session = SessionGet(in->policySession); // Compare and Update Internal Session policy if match for(i = 0; i < in->pHashList.count; i++) { if( session->attributes.isTrialPolicy == SET || (Memory2BEqual(&session->u2.policyDigest.b, &in->pHashList.digests[i].b)) ) { // Found a match HASH_STATE hashState; TPM_CC commandCode = TPM_CC_PolicyOR; // Start hash session->u2.policyDigest.t.size = CryptStartHash(session->authHashAlg, &hashState); // Set policyDigest to 0 string and add it to hash MemorySet(session->u2.policyDigest.t.buffer, 0, session->u2.policyDigest.t.size); CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b); // add command code CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode); // Add each of the hashes in the list for(i = 0; i < in->pHashList.count; i++) { // Extend policyDigest CryptUpdateDigest2B(&hashState, &in->pHashList.digests[i].b); } // Complete digest CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b); return TPM_RC_SUCCESS; } } // None of the values in the list matched the current policyDigest return TPM_RC_VALUE + RC_PolicyOR_pHashList; }