]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c
SecurityPkg: Remove mZeroGuid definition in DxeTpmMeasureBootLib
[mirror_edk2.git] / SecurityPkg / Library / HashLibBaseCryptoRouter / HashLibBaseCryptoRouterPei.c
CommitLineData
c1d93242
JY
1/** @file\r
2 Ihis library is BaseCrypto router. It will redirect hash request to each individual\r
3 hash handler registerd, such as SHA1, SHA256.\r
4 Platform can use PcdTpm2HashMask to mask some hash engines.\r
5\r
33985e3b 6Copyright (c) 2013 - 2014, 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/HobLib.h>\r
25#include <Library/HashLib.h>\r
26\r
27#include "HashLibBaseCryptoRouterCommon.h"\r
28\r
29#define HASH_LIB_PEI_ROUTER_GUID \\r
30 { 0x84681c08, 0x6873, 0x46f3, { 0x8b, 0xb7, 0xab, 0x66, 0x18, 0x95, 0xa1, 0xb3 } }\r
31\r
32EFI_GUID mHashLibPeiRouterGuid = HASH_LIB_PEI_ROUTER_GUID;\r
33\r
34typedef struct {\r
35 UINTN HashInterfaceCount;\r
36 HASH_INTERFACE HashInterface[HASH_COUNT];\r
37} HASH_INTERFACE_HOB;\r
38\r
39/**\r
40 This function get hash interface.\r
41\r
42 @retval hash interface.\r
43**/\r
44HASH_INTERFACE_HOB *\r
45InternalGetHashInterface (\r
46 VOID\r
47 )\r
48{\r
49 EFI_HOB_GUID_TYPE *Hob;\r
50\r
51 Hob = GetFirstGuidHob (&mHashLibPeiRouterGuid);\r
52 if (Hob == NULL) {\r
53 return NULL;\r
54 }\r
55 return (HASH_INTERFACE_HOB *)(Hob + 1);\r
56}\r
57\r
58/**\r
59 Start hash sequence.\r
60\r
61 @param HashHandle Hash handle.\r
62\r
63 @retval EFI_SUCCESS Hash sequence start and HandleHandle returned.\r
64 @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.\r
65**/\r
66EFI_STATUS\r
67EFIAPI\r
68HashStart (\r
69 OUT HASH_HANDLE *HashHandle\r
70 )\r
71{\r
72 HASH_INTERFACE_HOB *HashInterfaceHob;\r
73 HASH_HANDLE *HashCtx;\r
74 UINTN Index;\r
75\r
76 HashInterfaceHob = InternalGetHashInterface ();\r
77 if (HashInterfaceHob == NULL) {\r
78 return EFI_UNSUPPORTED;\r
79 }\r
80\r
81 if (HashInterfaceHob->HashInterfaceCount == 0) {\r
82 return EFI_UNSUPPORTED;\r
83 }\r
84\r
85 HashCtx = AllocatePool (sizeof(*HashCtx) * HashInterfaceHob->HashInterfaceCount);\r
86 ASSERT (HashCtx != NULL);\r
87\r
88 for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {\r
89 HashInterfaceHob->HashInterface[Index].HashInit (&HashCtx[Index]);\r
90 }\r
91\r
92 *HashHandle = (HASH_HANDLE)HashCtx;\r
93\r
94 return EFI_SUCCESS;\r
95}\r
96\r
97/**\r
98 Update hash sequence data.\r
99\r
100 @param HashHandle Hash handle.\r
101 @param DataToHash Data to be hashed.\r
102 @param DataToHashLen Data size.\r
103\r
104 @retval EFI_SUCCESS Hash sequence updated.\r
105**/\r
106EFI_STATUS\r
107EFIAPI\r
108HashUpdate (\r
109 IN HASH_HANDLE HashHandle,\r
110 IN VOID *DataToHash,\r
111 IN UINTN DataToHashLen\r
112 )\r
113{\r
114 HASH_INTERFACE_HOB *HashInterfaceHob;\r
115 HASH_HANDLE *HashCtx;\r
116 UINTN Index;\r
117\r
118 HashInterfaceHob = InternalGetHashInterface ();\r
119 if (HashInterfaceHob == NULL) {\r
120 return EFI_UNSUPPORTED;\r
121 }\r
122\r
123 if (HashInterfaceHob->HashInterfaceCount == 0) {\r
124 return EFI_UNSUPPORTED;\r
125 }\r
126\r
127 HashCtx = (HASH_HANDLE *)HashHandle;\r
128\r
129 for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {\r
130 HashInterfaceHob->HashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, DataToHashLen);\r
131 }\r
132\r
133 return EFI_SUCCESS;\r
134}\r
135\r
136/**\r
137 Hash sequence complete and extend to PCR.\r
138\r
139 @param HashHandle Hash handle.\r
140 @param PcrIndex PCR to be extended.\r
141 @param DataToHash Data to be hashed.\r
142 @param DataToHashLen Data size.\r
143 @param DigestList Digest list.\r
144\r
145 @retval EFI_SUCCESS Hash sequence complete and DigestList is returned.\r
146**/\r
147EFI_STATUS\r
148EFIAPI\r
149HashCompleteAndExtend (\r
150 IN HASH_HANDLE HashHandle,\r
151 IN TPMI_DH_PCR PcrIndex,\r
152 IN VOID *DataToHash,\r
153 IN UINTN DataToHashLen,\r
154 OUT TPML_DIGEST_VALUES *DigestList\r
155 )\r
156{\r
157 TPML_DIGEST_VALUES Digest;\r
158 HASH_INTERFACE_HOB *HashInterfaceHob;\r
159 HASH_HANDLE *HashCtx;\r
160 UINTN Index;\r
161 EFI_STATUS Status;\r
162\r
163 HashInterfaceHob = InternalGetHashInterface ();\r
164 if (HashInterfaceHob == NULL) {\r
165 return EFI_UNSUPPORTED;\r
166 }\r
167\r
168 if (HashInterfaceHob->HashInterfaceCount == 0) {\r
169 return EFI_UNSUPPORTED;\r
170 }\r
171\r
172 HashCtx = (HASH_HANDLE *)HashHandle;\r
173 ZeroMem (DigestList, sizeof(*DigestList));\r
174\r
175 for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {\r
176 HashInterfaceHob->HashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, DataToHashLen);\r
177 HashInterfaceHob->HashInterface[Index].HashFinal (HashCtx[Index], &Digest);\r
178 Tpm2SetHashToDigestList (DigestList, &Digest);\r
179 }\r
180\r
181 FreePool (HashCtx);\r
182\r
183 Status = Tpm2PcrExtend (\r
184 PcrIndex,\r
185 DigestList\r
186 );\r
187 return Status;\r
188}\r
189\r
190/**\r
191 Hash data and extend to PCR.\r
192\r
193 @param PcrIndex PCR to be extended.\r
194 @param DataToHash Data to be hashed.\r
195 @param DataToHashLen Data size.\r
196 @param DigestList Digest list.\r
197\r
198 @retval EFI_SUCCESS Hash data and DigestList is returned.\r
199**/\r
200EFI_STATUS\r
201EFIAPI\r
202HashAndExtend (\r
203 IN TPMI_DH_PCR PcrIndex,\r
204 IN VOID *DataToHash,\r
205 IN UINTN DataToHashLen,\r
206 OUT TPML_DIGEST_VALUES *DigestList\r
207 )\r
208{\r
209 HASH_INTERFACE_HOB *HashInterfaceHob;\r
210 HASH_HANDLE HashHandle;\r
211 EFI_STATUS Status;\r
212\r
213 HashInterfaceHob = InternalGetHashInterface ();\r
214 if (HashInterfaceHob == NULL) {\r
215 return EFI_UNSUPPORTED;\r
216 }\r
217\r
218 if (HashInterfaceHob->HashInterfaceCount == 0) {\r
219 return EFI_UNSUPPORTED;\r
220 }\r
221\r
222 HashStart (&HashHandle);\r
223 HashUpdate (HashHandle, DataToHash, DataToHashLen);\r
224 Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList);\r
225\r
226 return Status;\r
227}\r
228\r
229/**\r
230 This service register Hash.\r
231\r
232 @param HashInterface Hash interface\r
233\r
234 @retval EFI_SUCCESS This hash interface is registered successfully.\r
235 @retval EFI_UNSUPPORTED System does not support register this interface.\r
236 @retval EFI_ALREADY_STARTED System already register this interface.\r
237**/\r
238EFI_STATUS\r
239EFIAPI\r
240RegisterHashInterfaceLib (\r
241 IN HASH_INTERFACE *HashInterface\r
242 )\r
243{\r
244 UINTN Index;\r
245 HASH_INTERFACE_HOB *HashInterfaceHob;\r
246 HASH_INTERFACE_HOB LocalHashInterfaceHob;\r
247 UINT32 HashMask;\r
248\r
249 //\r
250 // Check allow\r
251 //\r
252 HashMask = Tpm2GetHashMaskFromAlgo (&HashInterface->HashGuid);\r
253 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) == 0) {\r
254 return EFI_UNSUPPORTED;\r
255 }\r
256\r
257 HashInterfaceHob = InternalGetHashInterface ();\r
258 if (HashInterfaceHob == NULL) {\r
259 ZeroMem (&LocalHashInterfaceHob, sizeof(LocalHashInterfaceHob));\r
260 HashInterfaceHob = BuildGuidDataHob (&mHashLibPeiRouterGuid, &LocalHashInterfaceHob, sizeof(LocalHashInterfaceHob));\r
261 if (HashInterfaceHob == NULL) {\r
262 return EFI_OUT_OF_RESOURCES;\r
263 }\r
264 }\r
265\r
266 if (HashInterfaceHob->HashInterfaceCount >= HASH_COUNT) {\r
267 return EFI_OUT_OF_RESOURCES;\r
268 }\r
269\r
270 //\r
271 // Check duplication\r
272 //\r
273 for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) {\r
274 if (CompareGuid (&HashInterfaceHob->HashInterface[Index].HashGuid, &HashInterface->HashGuid)) {\r
275 //\r
276 // In PEI phase, there will be shadow driver dispatched again.\r
277 //\r
33985e3b 278 DEBUG ((EFI_D_INFO, "RegisterHashInterfaceLib - Override\n"));\r
c1d93242
JY
279 CopyMem (&HashInterfaceHob->HashInterface[Index], HashInterface, sizeof(*HashInterface));\r
280 return EFI_SUCCESS;\r
281 }\r
282 }\r
283\r
284 CopyMem (&HashInterfaceHob->HashInterface[HashInterfaceHob->HashInterfaceCount], HashInterface, sizeof(*HashInterface));\r
285 HashInterfaceHob->HashInterfaceCount ++;\r
286 \r
287 return EFI_SUCCESS;\r
288}