// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 3: Commands // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "InternalRoutines.h" #include "PCR_Extend_fp.h" // // // Error Returns Meaning // // TPM_RC_LOCALITY current command locality is not allowed to extend the PCR // referenced by pcrHandle // TPM_RC TPM2_PCR_Extend( PCR_Extend_In *in // IN: input parameter list ) { TPM_RC result; UINT32 i; // Input Validation // NOTE: This function assumes that the unmarshaling function for 'digests' will // have validated that all of the indicated hash algorithms are valid. If the // hash algorithms are correct, the unmarshaling code will unmarshal a digest // of the size indicated by the hash algorithm. If the overall size is not // consistent, the unmarshaling code will run out of input data or have input // data left over. In either case, it will cause an unmarshaling error and this // function will not be called. // For NULL handle, do nothing and return success if(in->pcrHandle == TPM_RH_NULL) return TPM_RC_SUCCESS; // Check if the extend operation is allowed by the current command locality if(!PCRIsExtendAllowed(in->pcrHandle)) return TPM_RC_LOCALITY; // If PCR is state saved and we need to update orderlyState, check NV // availability if(PCRIsStateSaved(in->pcrHandle) && gp.orderlyState != SHUTDOWN_NONE) { result = NvIsAvailable(); if(result != TPM_RC_SUCCESS) return result; g_clearOrderly = TRUE; } // Internal Data Update // Iterate input digest list to extend for(i = 0; i < in->digests.count; i++) { PCRExtend(in->pcrHandle, in->digests.digests[i].hashAlg, CryptGetHashDigestSize(in->digests.digests[i].hashAlg), (BYTE *) &in->digests.digests[i].digest); } return TPM_RC_SUCCESS; }