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 "PolicyCommandCode_fp.h"
     10 //
     11 //
     12 //     Error Returns                     Meaning
     13 //
     14 //     TPM_RC_VALUE                      commandCode of policySession previously set to a different value
     15 //
     16 TPM_RC
     17 TPM2_PolicyCommandCode(
     18    PolicyCommandCode_In      *in                   // IN: input parameter list
     19    )
     20 {
     21    SESSION      *session;
     22    TPM_CC       commandCode = TPM_CC_PolicyCommandCode;
     23    HASH_STATE   hashState;
     24 
     25 // Input validation
     26 
     27    // Get pointer to the session structure
     28    session = SessionGet(in->policySession);
     29 
     30    if(session->commandCode != 0 && session->commandCode != in->code)
     31        return TPM_RC_VALUE + RC_PolicyCommandCode_code;
     32    if(!CommandIsImplemented(in->code))
     33        return TPM_RC_POLICY_CC + RC_PolicyCommandCode_code;
     34 
     35 // Internal Data Update
     36    // Update policy hash
     37    // policyDigestnew = hash(policyDigestold || TPM_CC_PolicyCommandCode || code)
     38    // Start hash
     39    CryptStartHash(session->authHashAlg, &hashState);
     40 
     41    // add old digest
     42    CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
     43 
     44    // add commandCode
     45    CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
     46 
     47    // add input commandCode
     48    CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &in->code);
     49 
     50    // complete the hash and get the results
     51    CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
     52 
     53    // update commandCode value in session context
     54    session->commandCode = in->code;
     55 
     56    return TPM_RC_SUCCESS;
     57 }
     58