// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 4: Supporting Routines // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #include "Tpm.h" #include "InternalRoutines.h" // // // Functions // // HandleGetType() // // This function returns the type of a handle which is the MSO of the handle. // TPM_HT HandleGetType( TPM_HANDLE handle // IN: a handle to be checked ) { // return the upper bytes of input data return (TPM_HT) ((handle & HR_RANGE_MASK) >> HR_SHIFT); } // // // NextPermanentHandle() // // This function returns the permanent handle that is equal to the input value or is the next higher value. If // there is no handle with the input value and there is no next higher value, it returns 0: // // Return Value Meaning // TPM_HANDLE NextPermanentHandle( TPM_HANDLE inHandle // IN: the handle to check ) { // If inHandle is below the start of the range of permanent handles // set it to the start and scan from there if(inHandle < TPM_RH_FIRST) inHandle = TPM_RH_FIRST; // scan from input value untill we find an implemented permanent handle // or go out of range for(; inHandle <= TPM_RH_LAST; inHandle++) { switch (inHandle) { case TPM_RH_OWNER: case TPM_RH_NULL: case TPM_RS_PW: case TPM_RH_LOCKOUT: case TPM_RH_ENDORSEMENT: case TPM_RH_PLATFORM: case TPM_RH_PLATFORM_NV: #ifdef VENDOR_PERMANENT case VENDOR_PERMANENT: #endif return inHandle; break; default: break; } } // Out of range on the top return 0; } // // // PermanentCapGetHandles() // // This function returns a list of the permanent handles of PCR, started from handle. If handle is larger than // the largest permanent handle, an empty list will be returned with more set to NO. // // Return Value Meaning // // YES if there are more handles available // NO all the available handles has been returned // TPMI_YES_NO PermanentCapGetHandles( TPM_HANDLE handle, // IN: start handle UINT32 count, // IN: count of returned handle TPML_HANDLE *handleList // OUT: list of handle ) { TPMI_YES_NO more = NO; UINT32 i; pAssert(HandleGetType(handle) == TPM_HT_PERMANENT); // Initialize output handle list handleList->count = 0; // The maximum count of handles we may return is MAX_CAP_HANDLES if(count > MAX_CAP_HANDLES) count = MAX_CAP_HANDLES; // Iterate permanent handle range for(i = NextPermanentHandle(handle); i != 0; i = NextPermanentHandle(i+1)) { if(handleList->count < count) { // If we have not filled up the return list, add this permanent // handle to it handleList->handle[handleList->count] = i; handleList->count++; } else { // If the return list is full but we still have permanent handle // available, report this and stop iterating more = YES; break; } } return more; }