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 "PolicyDuplicationSelect_fp.h"
     10 //
     11 //
     12 //     Error Returns                     Meaning
     13 //
     14 //     TPM_RC_COMMAND_CODE               commandCode of 'policySession; is not empty
     15 //     TPM_RC_CPHASH                     cpHash of policySession is not empty
     16 //
     17 TPM_RC
     18 TPM2_PolicyDuplicationSelect(
     19    PolicyDuplicationSelect_In       *in                 // IN: input parameter list
     20    )
     21 {
     22    SESSION           *session;
     23    HASH_STATE        hashState;
     24    TPM_CC            commandCode = TPM_CC_PolicyDuplicationSelect;
     25 
     26 // Input Validation
     27 
     28    // Get pointer to the session structure
     29    session = SessionGet(in->policySession);
     30 
     31    // cpHash in session context must be empty
     32    if(session->u1.cpHash.t.size != 0)
     33        return TPM_RC_CPHASH;
     34 
     35    // commandCode in session context must be empty
     36    if(session->commandCode != 0)
     37        return TPM_RC_COMMAND_CODE;
     38 
     39 // Internal Data Update
     40 
     41    // Update name hash
     42    session->u1.cpHash.t.size = CryptStartHash(session->authHashAlg, &hashState);
     43 
     44    // add objectName
     45    CryptUpdateDigest2B(&hashState, &in->objectName.b);
     46 
     47    // add new parent name
     48    CryptUpdateDigest2B(&hashState, &in->newParentName.b);
     49 
     50    // complete hash
     51    CryptCompleteHash2B(&hashState, &session->u1.cpHash.b);
     52 
     53    // update policy hash
     54    // Old policyDigest size should be the same as the new policyDigest size since
     55    // they are using the same hash algorithm
     56    session->u2.policyDigest.t.size
     57            = CryptStartHash(session->authHashAlg, &hashState);
     58 
     59    // add old policy
     60    CryptUpdateDigest2B(&hashState, &session->u2.policyDigest.b);
     61 
     62    // add command code
     63    CryptUpdateDigestInt(&hashState, sizeof(TPM_CC), &commandCode);
     64 
     65    // add objectName
     66    if(in->includeObject == YES)
     67        CryptUpdateDigest2B(&hashState, &in->objectName.b);
     68 
     69   // add new parent name
     70   CryptUpdateDigest2B(&hashState, &in->newParentName.b);
     71 
     72   // add includeObject
     73   CryptUpdateDigestInt(&hashState, sizeof(TPMI_YES_NO), &in->includeObject);
     74 
     75   // complete digest
     76   CryptCompleteHash2B(&hashState, &session->u2.policyDigest.b);
     77 
     78   // clear iscpHashDefined bit to indicate now this field contains a nameHash
     79   session->attributes.iscpHashDefined = CLEAR;
     80 
     81   // set commandCode in session context
     82   session->commandCode = TPM_CC_Duplicate;
     83 
     84    return TPM_RC_SUCCESS;
     85 }
     86