Line | Count | Source (jump to first uncovered line) |
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 |
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 | 0 | { |
133 | 0 | TPMI_YES_NO more = NO; |
134 | 0 | UINT32 i; |
135 | 0 | UINT32 algNum; |
136 | | // initialize output algorithm list |
137 | 0 | algList->count = 0; |
138 | | // The maximum count of algorithms we may return is MAX_CAP_ALGS. |
139 | 0 | if(count > MAX_CAP_ALGS) |
140 | 0 | count = MAX_CAP_ALGS; |
141 | | // Compute how many algorithms are defined in s_algorithms array. |
142 | 0 | algNum = sizeof(s_algorithms) / sizeof(s_algorithms[0]); |
143 | | // Scan the implemented algorithm list to see if there is a match to 'algID'. |
144 | 0 | for(i = 0; i < algNum; i++) |
145 | 0 | { |
146 | | // If algID is less than the starting algorithm ID, skip it |
147 | 0 | if(s_algorithms[i].algID < algID) |
148 | 0 | continue; |
149 | 0 | if(algList->count < count) |
150 | 0 | { |
151 | | // If we have not filled up the return list, add more algorithms |
152 | | // to it |
153 | 0 | algList->algProperties[algList->count].alg = s_algorithms[i].algID; |
154 | 0 | algList->algProperties[algList->count].algProperties = |
155 | 0 | s_algorithms[i].attributes; |
156 | 0 | algList->count++; |
157 | 0 | } |
158 | 0 | else |
159 | 0 | { |
160 | | // If the return list is full but we still have algorithms |
161 | | // available, report this and stop scanning. |
162 | 0 | more = YES; |
163 | 0 | break; |
164 | 0 | } |
165 | 0 | } |
166 | 0 | return more; |
167 | 0 | } |
168 | | LIB_EXPORT |
169 | | void |
170 | | AlgorithmGetImplementedVector( |
171 | | ALGORITHM_VECTOR *implemented // OUT: the implemented bits are SET |
172 | | ) |
173 | 444 | { |
174 | 444 | int index; |
175 | | // Nothing implemented until we say it is |
176 | 444 | MemorySet(implemented, 0, sizeof(ALGORITHM_VECTOR)); |
177 | 444 | for(index = (sizeof(s_algorithms) / sizeof(s_algorithms[0])) - 1; |
178 | 12.4k | index >= 0; |
179 | 11.9k | index--) |
180 | 11.9k | SET_BIT(s_algorithms[index].algID, *implemented); |
181 | 444 | return; |
182 | 444 | } |