• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Microsoft Reference Implementation for TPM 2.0
2  *
3  *  The copyright in this software is being made available under the BSD License,
4  *  included below. This software may be subject to other third party and
5  *  contributor rights, including patent rights, and no such rights are granted
6  *  under this license.
7  *
8  *  Copyright (c) Microsoft Corporation
9  *
10  *  All rights reserved.
11  *
12  *  BSD License
13  *
14  *  Redistribution and use in source and binary forms, with or without modification,
15  *  are permitted provided that the following conditions are met:
16  *
17  *  Redistributions of source code must retain the above copyright notice, this list
18  *  of conditions and the following disclaimer.
19  *
20  *  Redistributions in binary form must reproduce the above copyright notice, this
21  *  list of conditions and the following disclaimer in the documentation and/or
22  *  other materials provided with the distribution.
23  *
24  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
25  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
28  *  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29  *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31  *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 //** Description
36 // This file contains the algorithm property definitions for the algorithms and the
37 // code for the TPM2_GetCapability() to return the algorithm properties.
38 
39 //** Includes and Defines
40 
41 #include "Tpm.h"
42 
43 typedef struct
44 {
45     TPM_ALG_ID          algID;
46     TPMA_ALGORITHM      attributes;
47 } ALGORITHM;
48 
49 static const ALGORITHM    s_algorithms[] =
50 {
51 // The entries in this table need to be in ascending order but the table doesn't
52 // need to be full (gaps are allowed). One day, a tool might exist to fill in the
53 // table from the TPM_ALG description
54 #if ALG_RSA
55     {TPM_ALG_RSA,           TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 1, 0, 0, 0, 0, 0)},
56 #endif
57 #if ALG_TDES
58     {TPM_ALG_TDES,          TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)},
59 #endif
60 #if ALG_SHA1
61     {TPM_ALG_SHA1,          TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)},
62 #endif
63 
64     {TPM_ALG_HMAC,          TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 1, 0, 0, 0)},
65 
66 #if ALG_AES
67     {TPM_ALG_AES,           TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)},
68 #endif
69 #if ALG_MGF1
70     {TPM_ALG_MGF1,          TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)},
71 #endif
72 
73     {TPM_ALG_KEYEDHASH,     TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 1, 0, 1, 1, 0, 0)},
74 
75 #if ALG_XOR
76     {TPM_ALG_XOR,           TPMA_ALGORITHM_INITIALIZER(0, 1, 1, 0, 0, 0, 0, 0, 0)},
77 #endif
78 
79 #if ALG_SHA256
80     {TPM_ALG_SHA256,        TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)},
81 #endif
82 #if ALG_SHA384
83     {TPM_ALG_SHA384,        TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)},
84 #endif
85 #if ALG_SHA512
86     {TPM_ALG_SHA512,        TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)},
87 #endif
88 #if ALG_SM3_256
89     {TPM_ALG_SM3_256,       TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 0, 0)},
90 #endif
91 #if ALG_SM4
92     {TPM_ALG_SM4,           TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)},
93 #endif
94 #if ALG_RSASSA
95     {TPM_ALG_RSASSA,        TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)},
96 #endif
97 #if ALG_RSAES
98     {TPM_ALG_RSAES,         TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 1, 0, 0)},
99 #endif
100 #if ALG_RSAPSS
101     {TPM_ALG_RSAPSS,        TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)},
102 #endif
103 #if ALG_OAEP
104     {TPM_ALG_OAEP,          TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 1, 0, 0)},
105 #endif
106 #if ALG_ECDSA
107     {TPM_ALG_ECDSA,         TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)},
108 #endif
109 #if ALG_ECDH
110     {TPM_ALG_ECDH,          TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 0, 1, 0)},
111 #endif
112 #if ALG_ECDAA
113     {TPM_ALG_ECDAA,         TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)},
114 #endif
115 #if ALG_SM2
116     {TPM_ALG_SM2,           TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 1, 0)},
117 #endif
118 #if ALG_ECSCHNORR
119     {TPM_ALG_ECSCHNORR,      TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 1, 0, 0, 0)},
120 #endif
121 #if ALG_ECMQV
122     {TPM_ALG_ECMQV,          TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 0, 0, 0, 0, 1, 0)},
123 #endif
124 #if ALG_KDF1_SP800_56A
125     {TPM_ALG_KDF1_SP800_56A, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)},
126 #endif
127 #if ALG_KDF2
128     {TPM_ALG_KDF2,           TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)},
129 #endif
130 #if ALG_KDF1_SP800_108
131     {TPM_ALG_KDF1_SP800_108, TPMA_ALGORITHM_INITIALIZER(0, 0, 1, 0, 0, 0, 0, 1, 0)},
132 #endif
133 #if ALG_ECC
134     {TPM_ALG_ECC,            TPMA_ALGORITHM_INITIALIZER(1, 0, 0, 1, 0, 0, 0, 0, 0)},
135 #endif
136 
137     {TPM_ALG_SYMCIPHER,      TPMA_ALGORITHM_INITIALIZER(0, 0, 0, 1, 0, 0, 0, 0, 0)},
138 
139 #if ALG_CAMELLIA
140     {TPM_ALG_CAMELLIA,       TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 0, 0, 0)},
141 #endif
142 #if ALG_CMAC
143     {TPM_ALG_CMAC,           TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 1, 0, 0, 0)},
144 #endif
145 #if ALG_CTR
146     {TPM_ALG_CTR,            TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)},
147 #endif
148 #if ALG_OFB
149     {TPM_ALG_OFB,            TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)},
150 #endif
151 #if ALG_CBC
152     {TPM_ALG_CBC,            TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)},
153 #endif
154 #if ALG_CFB
155     {TPM_ALG_CFB,            TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)},
156 #endif
157 #if ALG_ECB
158     {TPM_ALG_ECB,            TPMA_ALGORITHM_INITIALIZER(0, 1, 0, 0, 0, 0, 1, 0, 0)},
159 #endif
160 };
161 
162 //** AlgorithmCapGetImplemented()
163 // This function is used by TPM2_GetCapability() to return a list of the
164 // implemented algorithms.
165 //
166 //  Return Type: TPMI_YES_NO
167 //  YES        more algorithms to report
168 //  NO         no more algorithms to report
169 TPMI_YES_NO
AlgorithmCapGetImplemented(TPM_ALG_ID algID,UINT32 count,TPML_ALG_PROPERTY * algList)170 AlgorithmCapGetImplemented(
171     TPM_ALG_ID                   algID,     // IN: the starting algorithm ID
172     UINT32                       count,     // IN: count of returned algorithms
173     TPML_ALG_PROPERTY           *algList    // OUT: algorithm list
174     )
175 {
176     TPMI_YES_NO     more = NO;
177     UINT32          i;
178     UINT32          algNum;
179 
180     // initialize output algorithm list
181     algList->count = 0;
182 
183     // The maximum count of algorithms we may return is MAX_CAP_ALGS.
184     if(count > MAX_CAP_ALGS)
185         count = MAX_CAP_ALGS;
186 
187     // Compute how many algorithms are defined in s_algorithms array.
188     algNum = sizeof(s_algorithms) / sizeof(s_algorithms[0]);
189 
190     // Scan the implemented algorithm list to see if there is a match to 'algID'.
191     for(i = 0; i < algNum; i++)
192     {
193         // If algID is less than the starting algorithm ID, skip it
194         if(s_algorithms[i].algID < algID)
195             continue;
196         if(algList->count < count)
197         {
198             // If we have not filled up the return list, add more algorithms
199             // to it
200             algList->algProperties[algList->count].alg = s_algorithms[i].algID;
201             algList->algProperties[algList->count].algProperties =
202                 s_algorithms[i].attributes;
203             algList->count++;
204         }
205         else
206         {
207             // If the return list is full but we still have algorithms
208             // available, report this and stop scanning.
209             more = YES;
210             break;
211         }
212     }
213 
214     return more;
215 }
216 
217 //** AlgorithmGetImplementedVector()
218 // This function returns the bit vector of the implemented algorithms.
219 LIB_EXPORT
220 void
AlgorithmGetImplementedVector(ALGORITHM_VECTOR * implemented)221 AlgorithmGetImplementedVector(
222     ALGORITHM_VECTOR    *implemented    // OUT: the implemented bits are SET
223     )
224 {
225     int                      index;
226 
227     // Nothing implemented until we say it is
228     MemorySet(implemented, 0, sizeof(ALGORITHM_VECTOR));
229     // Go through the list of implemented algorithms and SET the corresponding bit in
230     // in the implemented vector
231     for(index = (sizeof(s_algorithms) / sizeof(s_algorithms[0])) - 1;
232         index >= 0; index--)
233         SET_BIT(s_algorithms[index].algID, *implemented);
234     return;
235 }