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