You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.5 KiB
115 lines
3.5 KiB
// 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; |
|
}
|
|
|