/* 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 algorithm property definitions for the algorithms and the | |
// code for the TPM2_GetCapability() to return the algorithm properties. | |
//** Includes and Defines | |
#include "Tpm.h" | |
typedef struct | |
{ | |
TPM_ALG_ID algID; | |
TPMA_ALGORITHM attributes; | |
} ALGORITHM; | |
static const ALGORITHM s_algorithms[] = | |
{ | |
// The entries in this table need to be in ascending order but the table doesn't | |
// need to be full (gaps are allowed). One day, a tool might exist to fill in the | |
// table from the TPM_ALG description | |
#if ALG_RSA | |
{TPM_ALG_RSA, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 1, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_TDES | |
{TPM_ALG_TDES, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_SHA1 | |
{TPM_ALG_SHA1, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
{TPM_ALG_HMAC, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 1, 0, 0, 0)}, | |
#if ALG_AES | |
{TPM_ALG_AES, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_MGF1 | |
{TPM_ALG_MGF1, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)}, | |
#endif | |
{TPM_ALG_KEYEDHASH, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 1, 0, 1, 1, 0, 0)}, | |
#if ALG_XOR | |
{TPM_ALG_XOR, TPMA_ALGORITHM_INITIALIZER(0, 1, 1, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_SHA256 | |
{TPM_ALG_SHA256, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_SHA384 | |
{TPM_ALG_SHA384, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_SHA512 | |
{TPM_ALG_SHA512, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_SM3_256 | |
{TPM_ALG_SM3_256, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_SM4 | |
{TPM_ALG_SM4, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_RSASSA | |
{TPM_ALG_RSASSA, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)}, | |
#endif | |
#if ALG_RSAES | |
{TPM_ALG_RSAES, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
#if ALG_RSAPSS | |
{TPM_ALG_RSAPSS, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)}, | |
#endif | |
#if ALG_OAEP | |
{TPM_ALG_OAEP, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
#if ALG_ECDSA | |
{TPM_ALG_ECDSA, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)}, | |
#endif | |
#if ALG_ECDH | |
{TPM_ALG_ECDH, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 0, 1, 0)}, | |
#endif | |
#if ALG_ECDAA | |
{TPM_ALG_ECDAA, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)}, | |
#endif | |
#if ALG_SM2 | |
{TPM_ALG_SM2, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 1, 0)}, | |
#endif | |
#if ALG_ECSCHNORR | |
{TPM_ALG_ECSCHNORR, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)}, | |
#endif | |
#if ALG_ECMQV | |
{TPM_ALG_ECMQV, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 0, 1, 0)}, | |
#endif | |
#if ALG_KDF1_SP800_56A | |
{TPM_ALG_KDF1_SP800_56A, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)}, | |
#endif | |
#if ALG_KDF2 | |
{TPM_ALG_KDF2, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)}, | |
#endif | |
#if ALG_KDF1_SP800_108 | |
{TPM_ALG_KDF1_SP800_108, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)}, | |
#endif | |
#if ALG_ECC | |
{TPM_ALG_ECC, TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 1, 0, 0, 0, 0, 0)}, | |
#endif | |
{TPM_ALG_SYMCIPHER, TPMA_ALGORITHM_INITIALIZER(0, 0, 0, 1, 0, 0, 0, 0, 0)}, | |
#if ALG_CAMELLIA | |
{TPM_ALG_CAMELLIA, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)}, | |
#endif | |
#if ALG_CMAC | |
{TPM_ALG_CMAC, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 1, 0, 0, 0)}, | |
#endif | |
#if ALG_CTR | |
{TPM_ALG_CTR, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
#if ALG_OFB | |
{TPM_ALG_OFB, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
#if ALG_CBC | |
{TPM_ALG_CBC, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
#if ALG_CFB | |
{TPM_ALG_CFB, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
#if ALG_ECB | |
{TPM_ALG_ECB, TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)}, | |
#endif | |
}; | |
//** AlgorithmCapGetImplemented() | |
// This function is used by TPM2_GetCapability() to return a list of the | |
// implemented algorithms. | |
// | |
// Return Type: TPMI_YES_NO | |
// YES more algorithms to report | |
// NO no more algorithms to report | |
TPMI_YES_NO | |
AlgorithmCapGetImplemented( | |
TPM_ALG_ID algID, // IN: the starting algorithm ID | |
UINT32 count, // IN: count of returned algorithms | |
TPML_ALG_PROPERTY *algList // OUT: algorithm list | |
) | |
{ | |
TPMI_YES_NO more = NO; | |
UINT32 i; | |
UINT32 algNum; | |
// initialize output algorithm list | |
algList->count = 0; | |
// The maximum count of algorithms we may return is MAX_CAP_ALGS. | |
if(count > MAX_CAP_ALGS) | |
count = MAX_CAP_ALGS; | |
// Compute how many algorithms are defined in s_algorithms array. | |
algNum = sizeof(s_algorithms) / sizeof(s_algorithms[0]); | |
// Scan the implemented algorithm list to see if there is a match to 'algID'. | |
for(i = 0; i < algNum; i++) | |
{ | |
// If algID is less than the starting algorithm ID, skip it | |
if(s_algorithms[i].algID < algID) | |
continue; | |
if(algList->count < count) | |
{ | |
// If we have not filled up the return list, add more algorithms | |
// to it | |
algList->algProperties[algList->count].alg = s_algorithms[i].algID; | |
algList->algProperties[algList->count].algProperties = | |
s_algorithms[i].attributes; | |
algList->count++; | |
} | |
else | |
{ | |
// If the return list is full but we still have algorithms | |
// available, report this and stop scanning. | |
more = YES; | |
break; | |
} | |
} | |
return more; | |
} | |
//** AlgorithmGetImplementedVector() | |
// This function returns the bit vector of the implemented algorithms. | |
LIB_EXPORT | |
void | |
AlgorithmGetImplementedVector( | |
ALGORITHM_VECTOR *implemented // OUT: the implemented bits are SET | |
) | |
{ | |
int index; | |
// Nothing implemented until we say it is | |
MemorySet(implemented, 0, sizeof(ALGORITHM_VECTOR)); | |
// Go through the list of implemented algorithms and SET the corresponding bit in | |
// in the implemented vector | |
for(index = (sizeof(s_algorithms) / sizeof(s_algorithms[0])) - 1; | |
index >= 0; index--) | |
SET_BIT(s_algorithms[index].algID, *implemented); | |
return; | |
} |