blob: f2a3974062e9065519f54a32f8d116199e05da5a [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// 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 "InternalRoutines.h"
9typedef struct
10{
11 TPM_ALG_ID algID;
12 TPMA_ALGORITHM attributes;
13} ALGORITHM;
14static const ALGORITHM s_algorithms[] =
15{
16#ifdef TPM_ALG_RSA
17 {TPM_ALG_RSA, {1, 0, 0, 1, 0, 0, 0, 0, 0}},
18#endif
19#ifdef TPM_ALG_DES
20 {TPM_ALG_DES, {0, 1, 0, 0, 0, 0, 0, 0, 0}},
21#endif
22#ifdef TPM_ALG_3DES
23 {TPM_ALG__3DES, {0, 1, 0, 0, 0, 0, 0, 0, 0}},
24#endif
25#ifdef TPM_ALG_SHA1
26 {TPM_ALG_SHA1, {0, 0, 1, 0, 0, 0, 0, 0, 0}},
27#endif
28#ifdef TPM_ALG_HMAC
29 {TPM_ALG_HMAC, {0, 0, 1, 0, 0, 1, 0, 0, 0}},
30#endif
31#ifdef TPM_ALG_AES
32 {TPM_ALG_AES, {0, 1, 0, 0, 0, 0, 0, 0, 0}},
33#endif
34#ifdef TPM_ALG_MGF1
35 {TPM_ALG_MGF1, {0, 0, 1, 0, 0, 0, 0, 1, 0}},
36#endif
37 {TPM_ALG_KEYEDHASH, {0, 0, 1, 1, 0, 1, 1, 0, 0}},
38#ifdef TPM_ALG_XOR
39 {TPM_ALG_XOR, {0, 1, 1, 0, 0, 0, 0, 0, 0}},
40#endif
41#ifdef TPM_ALG_SHA256
42 {TPM_ALG_SHA256, {0, 0, 1, 0, 0, 0, 0, 0, 0}},
43#endif
44#ifdef TPM_ALG_SHA384
45 {TPM_ALG_SHA384, {0, 0, 1, 0, 0, 0, 0, 0, 0}},
46#endif
47#ifdef TPM_ALG_SHA512
48 {TPM_ALG_SHA512, {0, 0, 1, 0, 0, 0, 0, 0, 0}},
49#endif
50#ifdef TPM_ALG_WHIRLPOOL512
51 {TPM_ALG_WHIRLPOOL512, {0, 0, 1, 0, 0, 0, 0, 0, 0}},
52#endif
53#ifdef TPM_ALG_SM3_256
54 {TPM_ALG_SM3_256, {0, 0, 1, 0, 0, 0, 0, 0, 0}},
55#endif
56#ifdef TPM_ALG_SM4
57 {TPM_ALG_SM4, {0, 1, 0, 0, 0, 0, 0, 0, 0}},
58#endif
59#ifdef TPM_ALG_RSASSA
60 {TPM_ALG_RSASSA, {1, 0, 0, 0, 0, 1, 0, 0, 0}},
61#endif
62#ifdef TPM_ALG_RSAES
63 {TPM_ALG_RSAES, {1, 0, 0, 0, 0, 0, 1, 0, 0}},
64#endif
65#ifdef TPM_ALG_RSAPSS
66 {TPM_ALG_RSAPSS, {1, 0, 0, 0, 0, 1, 0, 0, 0}},
67#endif
68#ifdef TPM_ALG_OAEP
69 {TPM_ALG_OAEP, {1, 0, 0, 0, 0, 0, 1, 0, 0}},
70#endif
71#ifdef TPM_ALG_ECDSA
72 {TPM_ALG_ECDSA, {1, 0, 0, 0, 0, 1, 0, 1, 0}},
73#endif
74#ifdef TPM_ALG_ECDH
75 {TPM_ALG_ECDH, {1, 0, 0, 0, 0, 0, 0, 1, 0}},
76#endif
77#ifdef TPM_ALG_ECDAA
78 {TPM_ALG_ECDAA, {1, 0, 0, 0, 0, 1, 0, 0, 0}},
79#endif
80#ifdef TPM_ALG_ECSCHNORR
81 {TPM_ALG_ECSCHNORR, {1, 0, 0, 0, 0, 1, 0, 0, 0}},
82#endif
Vadim Bendebury0343d5b2015-10-08 17:31:34 -070083#ifdef TPM_ALG_KDF1_SP800_56A
84 {TPM_ALG_KDF1_SP800_56A,{0, 0, 1, 0, 0, 0, 0, 1, 0}},
Vadim Bendebury56797522015-05-20 10:32:25 -070085#endif
86#ifdef TPM_ALG_KDF2
87 {TPM_ALG_KDF2, {0, 0, 1, 0, 0, 0, 0, 1, 0}},
88#endif
89#ifdef TPM_ALG_KDF1_SP800_108
90 {TPM_ALG_KDF1_SP800_108,{0, 0, 1, 0, 0, 0, 0, 1, 0}},
91#endif
92#ifdef TPM_ALG_ECC
93 {TPM_ALG_ECC, {1, 0, 0, 1, 0, 0, 0, 0, 0}},
94#endif
95 {TPM_ALG_SYMCIPHER, {0, 0, 0, 1, 0, 0, 0, 0, 0}},
96#ifdef TPM_ALG_CTR
97 {TPM_ALG_CTR, {0, 1, 0, 0, 0, 0, 1, 0, 0}},
98#endif
99#ifdef TPM_ALG_OFB
100 {TPM_ALG_OFB, {0, 1, 0, 0, 0, 0, 1, 0, 0}},
101#endif
102#ifdef TPM_ALG_CBC
103 {TPM_ALG_CBC, {0, 1, 0, 0, 0, 0, 1, 0, 0}},
104#endif
105#ifdef TPM_ALG_CFB
106 {TPM_ALG_CFB, {0, 1, 0, 0, 0, 0, 1, 0, 0}},
107#endif
108#ifdef TPM_ALG_ECB
109 {TPM_ALG_ECB, {0, 1, 0, 0, 0, 0, 1, 0, 0}},
110#endif
111};
112//
113//
114// AlgorithmCapGetImplemented()
115//
116// This function is used by TPM2_GetCapability() to return a list of the implemented algorithms.
117//
118//
119//
120//
121// Return Value Meaning
122//
123// YES more algorithms to report
124// NO no more algorithms to report
125//
126TPMI_YES_NO
127AlgorithmCapGetImplemented(
128 TPM_ALG_ID algID, // IN: the starting algorithm ID
129 UINT32 count, // IN: count of returned algorithms
130 TPML_ALG_PROPERTY *algList // OUT: algorithm list
131)
132{
133 TPMI_YES_NO more = NO;
134 UINT32 i;
135 UINT32 algNum;
136 // initialize output algorithm list
137 algList->count = 0;
138 // The maximum count of algorithms we may return is MAX_CAP_ALGS.
139 if(count > MAX_CAP_ALGS)
140 count = MAX_CAP_ALGS;
141 // Compute how many algorithms are defined in s_algorithms array.
142 algNum = sizeof(s_algorithms) / sizeof(s_algorithms[0]);
143 // Scan the implemented algorithm list to see if there is a match to 'algID'.
144 for(i = 0; i < algNum; i++)
145 {
146 // If algID is less than the starting algorithm ID, skip it
147 if(s_algorithms[i].algID < algID)
148 continue;
149 if(algList->count < count)
150 {
151 // If we have not filled up the return list, add more algorithms
152 // to it
153 algList->algProperties[algList->count].alg = s_algorithms[i].algID;
154 algList->algProperties[algList->count].algProperties =
155 s_algorithms[i].attributes;
156 algList->count++;
157 }
158 else
159 {
160 // If the return list is full but we still have algorithms
161 // available, report this and stop scanning.
162 more = YES;
163 break;
164 }
165 }
166 return more;
167}
168LIB_EXPORT
169void
170AlgorithmGetImplementedVector(
171 ALGORITHM_VECTOR *implemented // OUT: the implemented bits are SET
172 )
173{
174 int index;
175 // Nothing implemented until we say it is
176 MemorySet(implemented, 0, sizeof(ALGORITHM_VECTOR));
177 for(index = (sizeof(s_algorithms) / sizeof(s_algorithms[0])) - 1;
178 index >= 0;
179 index--)
180 SET_BIT(s_algorithms[index].algID, *implemented);
181 return;
182}