Home | History | Annotate | Download | only in tpm2
      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