/* Microsoft Reference Implementation for TPM 2.0 | |
* | |
* The copyright in this software is being made available under the BSD License, | |
* included below. This software may be subject to other third party and | |
* contributor rights, including patent rights, and no such rights are granted | |
* under this license. | |
* | |
* Copyright (c) Microsoft Corporation | |
* | |
* All rights reserved. | |
* | |
* BSD License | |
* | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* | |
* Redistributions of source code must retain the above copyright notice, this list | |
* of conditions and the following disclaimer. | |
* | |
* Redistributions in binary form must reproduce the above copyright notice, this | |
* list of conditions and the following disclaimer in the documentation and/or | |
* other materials provided with the distribution. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
//** Description | |
// This file contains the functions that return the type of a handle. | |
//** Includes | |
#include "Tpm.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: | |
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 until 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 | |
// Each of the implemented ACT | |
#define ACT_IMPLEMENTED_CASE(N) \ | |
case TPM_RH_ACT_##N: | |
FOR_EACH_ACT(ACT_IMPLEMENTED_CASE) | |
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 Type: TPMI_YES_NO | |
// 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 handles | |
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; | |
} | |
//*** PermanentHandleGetPolicy() | |
// 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 Type: TPMI_YES_NO | |
// YES if there are more handles available | |
// NO all the available handles has been returned | |
TPMI_YES_NO | |
PermanentHandleGetPolicy( | |
TPM_HANDLE handle, // IN: start handle | |
UINT32 count, // IN: max count of returned handles | |
TPML_TAGGED_POLICY *policyList // OUT: list of handle | |
) | |
{ | |
TPMI_YES_NO more = NO; | |
pAssert(HandleGetType(handle) == TPM_HT_PERMANENT); | |
// Initialize output handle list | |
policyList->count = 0; | |
// The maximum count of policies we may return is MAX_TAGGED_POLICIES | |
if(count > MAX_TAGGED_POLICIES) | |
count = MAX_TAGGED_POLICIES; | |
// Iterate permanent handle range | |
for(handle = NextPermanentHandle(handle); | |
handle != 0; | |
handle = NextPermanentHandle(handle + 1)) | |
{ | |
TPM2B_DIGEST policyDigest; | |
TPM_ALG_ID policyAlg; | |
// Check to see if this permanent handle has a policy | |
policyAlg = EntityGetAuthPolicy(handle, &policyDigest); | |
if(policyAlg == TPM_ALG_ERROR) | |
continue; | |
if(policyList->count < count) | |
{ | |
// If we have not filled up the return list, add this | |
// policy to the list; | |
policyList->policies[policyList->count].handle = handle; | |
policyList->policies[policyList->count].policyHash.hashAlg = policyAlg; | |
MemoryCopy(&policyList->policies[policyList->count].policyHash.digest, | |
policyDigest.t.buffer, policyDigest.t.size); | |
policyList->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; | |
} |