Home | History | Annotate | Download | only in tpm2
      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 "PolicyOR_fp.h"
     10 #include "Policy_spt_fp.h"
     11 //
     12 //
     13 //     Error Returns                 Meaning
     14 //
     15 //     TPM_RC_VALUE                  no digest in pHashList matched the current value of policyDigest for
     16 //                                   policySession
     17 //
     18 TPM_RC
     19 TPM2_PolicyOR(
     20    PolicyOR_In      *in               // IN: input parameter list
     21    )
     22 {
     23    SESSION       *session;
     24    UINT32         i;
     25 
     26 // Input Validation and Update
     27 
     28    // Get pointer to the session structure
     29    session = SessionGet(in->policySession);
     30 
     31    // Compare and Update Internal Session policy if match
     32    for(i = 0; i < in->pHashList.count; i++)
     33    {
     34        if(   session->attributes.isTrialPolicy == SET
     35           || (Memory2BEqual(&session->u2.policyDigest.b,
     36                             &in->pHashList.digests[i].b))
     37          )
     38        {
     39            // Found a match
     40            HASH_STATE      hashState;
     41            TPM_CC          commandCode = TPM_CC_PolicyOR;
     42 
     43              // Start hash
     44              session->u2.policyDigest.t.size = CryptStartHash(session->authHashAlg,
     45                                                             &hashState);
     46              // Set policyDigest to 0 string and add it to hash
     47              MemorySet(session->u2.policyDigest.t.buffer, 0,
     48                        session->u2.policyDigest.t.size);
     49              CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
     50 
     51              // add command code
     52              CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
     53 
     54              // Add each of the hashes in the list
     55              for(i = 0; i < in->pHashList.count; i++)
     56              {
     57                  // Extend policyDigest
     58                  CryptUpdateDigest2B(&hashState, &in->pHashList.digests[i].b);
     59              }
     60              // Complete digest
     61              CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
     62 
     63              return TPM_RC_SUCCESS;
     64        }
     65    }
     66    // None of the values in the list matched the current policyDigest
     67    return TPM_RC_VALUE + RC_PolicyOR_pHashList;
     68 }
     69