]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
SecurityPkg: Clean up source files
[mirror_edk2.git] / SecurityPkg / Library / HashLibBaseCryptoRouter / HashLibBaseCryptoRouterDxe.c
CommitLineData
c1d93242 1/** @file\r
07309c3d 2 This library is BaseCrypto router. It will redirect hash request to each individual\r
c1d93242
JY
3 hash handler registerd, such as SHA1, SHA256.\r
4 Platform can use PcdTpm2HashMask to mask some hash engines.\r
5\r
b3548d32 6Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved. <BR>\r
c1d93242
JY
7This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include <PiPei.h>\r
18#include <Library/BaseLib.h>\r
19#include <Library/BaseMemoryLib.h>\r
20#include <Library/Tpm2CommandLib.h>\r
21#include <Library/DebugLib.h>\r
22#include <Library/MemoryAllocationLib.h>\r
23#include <Library/PcdLib.h>\r
24#include <Library/HashLib.h>\r
25\r
26#include "HashLibBaseCryptoRouterCommon.h"\r
27\r
859b0db4 28HASH_INTERFACE mHashInterface[HASH_COUNT] = {{{0}, NULL, NULL, NULL}};\r
c1d93242
JY
29UINTN mHashInterfaceCount = 0;\r
30\r
9fe9cf9a
SZ
31UINT32 mSupportedHashMaskLast = 0;\r
32UINT32 mSupportedHashMaskCurrent = 0;\r
33\r
34/**\r
35 Check mismatch of supported HashMask between modules\r
36 that may link different HashInstanceLib instances.\r
37\r
38**/\r
39VOID\r
40CheckSupportedHashMaskMismatch (\r
41 VOID\r
42 )\r
43{\r
44 if (mSupportedHashMaskCurrent != mSupportedHashMaskLast) {\r
45 DEBUG ((\r
46 DEBUG_WARN,\r
47 "WARNING: There is mismatch of supported HashMask (0x%x - 0x%x) between modules\n",\r
48 mSupportedHashMaskCurrent,\r
49 mSupportedHashMaskLast\r
50 ));\r
51 DEBUG ((DEBUG_WARN, "that are linking different HashInstanceLib instances!\n"));\r
52 }\r
53}\r
54\r
c1d93242
JY
55/**\r
56 Start hash sequence.\r
57\r
58 @param HashHandle Hash handle.\r
59\r
60 @retval EFI_SUCCESS Hash sequence start and HandleHandle returned.\r
61 @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.\r
62**/\r
63EFI_STATUS\r
64EFIAPI\r
65HashStart (\r
66 OUT HASH_HANDLE *HashHandle\r
67 )\r
68{\r
69 HASH_HANDLE *HashCtx;\r
70 UINTN Index;\r
1abfa4ce 71 UINT32 HashMask;\r
c1d93242
JY
72\r
73 if (mHashInterfaceCount == 0) {\r
74 return EFI_UNSUPPORTED;\r
75 }\r
76\r
9fe9cf9a
SZ
77 CheckSupportedHashMaskMismatch ();\r
78\r
c1d93242
JY
79 HashCtx = AllocatePool (sizeof(*HashCtx) * mHashInterfaceCount);\r
80 ASSERT (HashCtx != NULL);\r
81\r
82 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
1abfa4ce
JY
83 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
84 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
85 mHashInterface[Index].HashInit (&HashCtx[Index]);\r
86 }\r
c1d93242
JY
87 }\r
88\r
89 *HashHandle = (HASH_HANDLE)HashCtx;\r
90\r
91 return EFI_SUCCESS;\r
92}\r
93\r
94/**\r
95 Update hash sequence data.\r
96\r
97 @param HashHandle Hash handle.\r
98 @param DataToHash Data to be hashed.\r
99 @param DataToHashLen Data size.\r
100\r
101 @retval EFI_SUCCESS Hash sequence updated.\r
102**/\r
103EFI_STATUS\r
104EFIAPI\r
105HashUpdate (\r
106 IN HASH_HANDLE HashHandle,\r
107 IN VOID *DataToHash,\r
108 IN UINTN DataToHashLen\r
109 )\r
110{\r
111 HASH_HANDLE *HashCtx;\r
112 UINTN Index;\r
1abfa4ce 113 UINT32 HashMask;\r
c1d93242
JY
114\r
115 if (mHashInterfaceCount == 0) {\r
116 return EFI_UNSUPPORTED;\r
117 }\r
118\r
9fe9cf9a
SZ
119 CheckSupportedHashMaskMismatch ();\r
120\r
c1d93242
JY
121 HashCtx = (HASH_HANDLE *)HashHandle;\r
122\r
123 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
1abfa4ce
JY
124 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
125 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
126 mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, DataToHashLen);\r
127 }\r
c1d93242
JY
128 }\r
129\r
130 return EFI_SUCCESS;\r
131}\r
132\r
133/**\r
134 Hash sequence complete and extend to PCR.\r
135\r
136 @param HashHandle Hash handle.\r
137 @param PcrIndex PCR to be extended.\r
138 @param DataToHash Data to be hashed.\r
139 @param DataToHashLen Data size.\r
140 @param DigestList Digest list.\r
141\r
142 @retval EFI_SUCCESS Hash sequence complete and DigestList is returned.\r
143**/\r
144EFI_STATUS\r
145EFIAPI\r
146HashCompleteAndExtend (\r
147 IN HASH_HANDLE HashHandle,\r
148 IN TPMI_DH_PCR PcrIndex,\r
149 IN VOID *DataToHash,\r
150 IN UINTN DataToHashLen,\r
151 OUT TPML_DIGEST_VALUES *DigestList\r
152 )\r
153{\r
154 TPML_DIGEST_VALUES Digest;\r
155 HASH_HANDLE *HashCtx;\r
156 UINTN Index;\r
157 EFI_STATUS Status;\r
1abfa4ce 158 UINT32 HashMask;\r
c1d93242
JY
159\r
160 if (mHashInterfaceCount == 0) {\r
161 return EFI_UNSUPPORTED;\r
162 }\r
163\r
9fe9cf9a
SZ
164 CheckSupportedHashMaskMismatch ();\r
165\r
c1d93242
JY
166 HashCtx = (HASH_HANDLE *)HashHandle;\r
167 ZeroMem (DigestList, sizeof(*DigestList));\r
168\r
169 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
1abfa4ce
JY
170 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
171 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
172 mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, DataToHashLen);\r
173 mHashInterface[Index].HashFinal (HashCtx[Index], &Digest);\r
174 Tpm2SetHashToDigestList (DigestList, &Digest);\r
175 }\r
c1d93242
JY
176 }\r
177\r
178 FreePool (HashCtx);\r
179\r
180 Status = Tpm2PcrExtend (\r
181 PcrIndex,\r
182 DigestList\r
183 );\r
184 return Status;\r
185}\r
186\r
187/**\r
188 Hash data and extend to PCR.\r
189\r
190 @param PcrIndex PCR to be extended.\r
191 @param DataToHash Data to be hashed.\r
192 @param DataToHashLen Data size.\r
193 @param DigestList Digest list.\r
194\r
195 @retval EFI_SUCCESS Hash data and DigestList is returned.\r
196**/\r
197EFI_STATUS\r
198EFIAPI\r
199HashAndExtend (\r
200 IN TPMI_DH_PCR PcrIndex,\r
201 IN VOID *DataToHash,\r
202 IN UINTN DataToHashLen,\r
203 OUT TPML_DIGEST_VALUES *DigestList\r
204 )\r
205{\r
206 HASH_HANDLE HashHandle;\r
207 EFI_STATUS Status;\r
208\r
209 if (mHashInterfaceCount == 0) {\r
210 return EFI_UNSUPPORTED;\r
211 }\r
212\r
9fe9cf9a
SZ
213 CheckSupportedHashMaskMismatch ();\r
214\r
c1d93242
JY
215 HashStart (&HashHandle);\r
216 HashUpdate (HashHandle, DataToHash, DataToHashLen);\r
217 Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList);\r
218\r
219 return Status;\r
220}\r
221\r
222/**\r
223 This service register Hash.\r
224\r
225 @param HashInterface Hash interface\r
226\r
227 @retval EFI_SUCCESS This hash interface is registered successfully.\r
228 @retval EFI_UNSUPPORTED System does not support register this interface.\r
229 @retval EFI_ALREADY_STARTED System already register this interface.\r
230**/\r
231EFI_STATUS\r
232EFIAPI\r
233RegisterHashInterfaceLib (\r
234 IN HASH_INTERFACE *HashInterface\r
235 )\r
236{\r
237 UINTN Index;\r
238 UINT32 HashMask;\r
fe3ca12d 239 EFI_STATUS Status;\r
c1d93242
JY
240\r
241 //\r
242 // Check allow\r
243 //\r
244 HashMask = Tpm2GetHashMaskFromAlgo (&HashInterface->HashGuid);\r
245 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) == 0) {\r
246 return EFI_UNSUPPORTED;\r
247 }\r
248\r
249 if (mHashInterfaceCount >= sizeof(mHashInterface)/sizeof(mHashInterface[0])) {\r
250 return EFI_OUT_OF_RESOURCES;\r
251 }\r
252\r
253 //\r
254 // Check duplication\r
255 //\r
256 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
257 if (CompareGuid (&mHashInterface[Index].HashGuid, &HashInterface->HashGuid)) {\r
9fe9cf9a 258 DEBUG ((DEBUG_ERROR, "Hash Interface (%g) has been registered\n", &HashInterface->HashGuid));\r
c1d93242
JY
259 return EFI_ALREADY_STARTED;\r
260 }\r
261 }\r
262\r
9fe9cf9a
SZ
263 //\r
264 // Record hash algorithm bitmap of CURRENT module which consumes HashLib.\r
265 //\r
266 mSupportedHashMaskCurrent = PcdGet32 (PcdTcg2HashAlgorithmBitmap) | HashMask;\r
267 Status = PcdSet32S (PcdTcg2HashAlgorithmBitmap, mSupportedHashMaskCurrent);\r
268 ASSERT_EFI_ERROR (Status);\r
269\r
c1d93242
JY
270 CopyMem (&mHashInterface[mHashInterfaceCount], HashInterface, sizeof(*HashInterface));\r
271 mHashInterfaceCount ++;\r
b3548d32 272\r
c1d93242 273 return EFI_SUCCESS;\r
9fe9cf9a
SZ
274}\r
275\r
276/**\r
277 The constructor function of HashLibBaseCryptoRouterDxe.\r
b3548d32 278\r
9fe9cf9a
SZ
279 @param ImageHandle The firmware allocated handle for the EFI image.\r
280 @param SystemTable A pointer to the EFI System Table.\r
b3548d32 281\r
9fe9cf9a
SZ
282 @retval EFI_SUCCESS The constructor executed correctly.\r
283\r
284**/\r
285EFI_STATUS\r
286EFIAPI\r
287HashLibBaseCryptoRouterDxeConstructor (\r
288 IN EFI_HANDLE ImageHandle,\r
289 IN EFI_SYSTEM_TABLE *SystemTable\r
290 )\r
291{\r
292 EFI_STATUS Status;\r
293\r
294 //\r
295 // Record hash algorithm bitmap of LAST module which also consumes HashLib.\r
296 //\r
297 mSupportedHashMaskLast = PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
298\r
299 //\r
300 // Set PcdTcg2HashAlgorithmBitmap to 0 in CONSTRUCTOR for CURRENT module.\r
301 //\r
302 Status = PcdSet32S (PcdTcg2HashAlgorithmBitmap, 0);\r
303 ASSERT_EFI_ERROR (Status);\r
304\r
305 return EFI_SUCCESS;\r
306}\r