/* 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; }