1 // 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"
9 typedef struct
10 {
11 TPM_ALG_ID algID;
12 TPMA_ALGORITHM attributes;
13 } ALGORITHM;
14 static 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
83 #ifdef TPM_ALG_KDF1_SP800_56A
84 {TPM_ALG_KDF1_SP800_56A,{0, 0, 1, 0, 0, 0, 0, 1, 0}},
85 #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 //
126 TPMI_YES_NO
AlgorithmCapGetImplemented(TPM_ALG_ID algID,UINT32 count,TPML_ALG_PROPERTY * algList)127 AlgorithmCapGetImplemented(
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 }
168 LIB_EXPORT
169 void
AlgorithmGetImplementedVector(ALGORITHM_VECTOR * implemented)170 AlgorithmGetImplementedVector(
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 }
183