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 "PolicyCpHash_fp.h"
     10 //
     11 //
     12 //     Error Returns                     Meaning
     13 //
     14 //     TPM_RC_CPHASH                     cpHash of policySession has previously been set to a different value
     15 //     TPM_RC_SIZE                       cpHashA is not the size of a digest produced by the hash algorithm
     16 //                                       associated with policySession
     17 //
     18 TPM_RC
     19 TPM2_PolicyCpHash(
     20    PolicyCpHash_In       *in                   // IN: input parameter list
     21    )
     22 {
     23    SESSION      *session;
     24    TPM_CC       commandCode = TPM_CC_PolicyCpHash;
     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 cpHash is given in input parameter, but cpHash in session context
     33    // is not empty, or is not the same as the new cpHash
     34    if(    in->cpHashA.t.size != 0
     35        && session->u1.cpHash.t.size != 0
     36        && !Memory2BEqual(&in->cpHashA.b, &session->u1.cpHash.b)
     37       )
     38        return TPM_RC_CPHASH;
     39 
     40    // A valid cpHash must have the same size as session hash digest
     41    if(in->cpHashA.t.size != CryptGetHashDigestSize(session->authHashAlg))
     42        return TPM_RC_SIZE + RC_PolicyCpHash_cpHashA;
     43 
     44 // Internal Data Update
     45 
     46    // Update policy hash
     47    // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCpHash || cpHashA)
     48    // Start hash
     49    CryptStartHash(session->authHashAlg, &hashState);
     50 
     51    // add old digest
     52    CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
     53 
     54    // add commandCode
     55    CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
     56 
     57    // add cpHashA
     58    CryptUpdateDigest2B(&hashState, &in->cpHashA.b);
     59 
     60    // complete the digest and get the results
     61    CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
     62 
     63    // update cpHash in session context
     64    session->u1.cpHash = in->cpHashA;
     65    session->attributes.iscpHashDefined = SET;
     66 
     67    return TPM_RC_SUCCESS;
     68 }
     69