1 // This file was extracted from the TCG Published 2 // Trusted Platform Module Library 3 // Part 4: Supporting Routines 4 // Family "2.0" 5 // Level 00 Revision 01.16 6 // October 30, 2014 7 8 #include "Tpm.h" 9 #include "InternalRoutines.h" 10 // 11 // 12 // Functions 13 // 14 // HandleGetType() 15 // 16 // This function returns the type of a handle which is the MSO of the handle. 17 // 18 TPM_HT 19 HandleGetType( 20 TPM_HANDLE handle // IN: a handle to be checked 21 ) 22 { 23 // return the upper bytes of input data 24 return (TPM_HT) ((handle & HR_RANGE_MASK) >> HR_SHIFT); 25 } 26 // 27 // 28 // NextPermanentHandle() 29 // 30 // This function returns the permanent handle that is equal to the input value or is the next higher value. If 31 // there is no handle with the input value and there is no next higher value, it returns 0: 32 // 33 // Return Value Meaning 34 // 35 TPM_HANDLE 36 NextPermanentHandle( 37 TPM_HANDLE inHandle // IN: the handle to check 38 ) 39 { 40 // If inHandle is below the start of the range of permanent handles 41 // set it to the start and scan from there 42 if(inHandle < TPM_RH_FIRST) 43 inHandle = TPM_RH_FIRST; 44 // scan from input value untill we find an implemented permanent handle 45 // or go out of range 46 for(; inHandle <= TPM_RH_LAST; inHandle++) 47 { 48 switch (inHandle) 49 { 50 case TPM_RH_OWNER: 51 case TPM_RH_NULL: 52 case TPM_RS_PW: 53 case TPM_RH_LOCKOUT: 54 case TPM_RH_ENDORSEMENT: 55 case TPM_RH_PLATFORM: 56 case TPM_RH_PLATFORM_NV: 57 #ifdef VENDOR_PERMANENT 58 case VENDOR_PERMANENT: 59 #endif 60 return inHandle; 61 break; 62 default: 63 break; 64 } 65 } 66 // Out of range on the top 67 return 0; 68 } 69 // 70 // 71 // PermanentCapGetHandles() 72 // 73 // This function returns a list of the permanent handles of PCR, started from handle. If handle is larger than 74 // the largest permanent handle, an empty list will be returned with more set to NO. 75 // 76 // Return Value Meaning 77 // 78 // YES if there are more handles available 79 // NO all the available handles has been returned 80 // 81 TPMI_YES_NO 82 PermanentCapGetHandles( 83 TPM_HANDLE handle, // IN: start handle 84 UINT32 count, // IN: count of returned handle 85 TPML_HANDLE *handleList // OUT: list of handle 86 ) 87 { 88 TPMI_YES_NO more = NO; 89 UINT32 i; 90 pAssert(HandleGetType(handle) == TPM_HT_PERMANENT); 91 // Initialize output handle list 92 handleList->count = 0; 93 // The maximum count of handles we may return is MAX_CAP_HANDLES 94 if(count > MAX_CAP_HANDLES) count = MAX_CAP_HANDLES; 95 // Iterate permanent handle range 96 for(i = NextPermanentHandle(handle); 97 i != 0; i = NextPermanentHandle(i+1)) 98 { 99 if(handleList->count < count) 100 { 101 // If we have not filled up the return list, add this permanent 102 // handle to it 103 handleList->handle[handleList->count] = i; 104 handleList->count++; 105 } 106 else 107 { 108 // If the return list is full but we still have permanent handle 109 // available, report this and stop iterating 110 more = YES; 111 break; 112 } 113 } 114 return more; 115 } 116