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