]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
MdeModulePkg/UefiBootManagerLib: Initialize Handle before using it
[mirror_edk2.git] / SecurityPkg / Library / HashLibBaseCryptoRouter / HashLibBaseCryptoRouterDxe.c
... / ...
CommitLineData
1/** @file\r
2 This 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
6Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>\r
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
28HASH_INTERFACE mHashInterface[HASH_COUNT] = {{{0}, NULL, NULL, NULL}};\r
29UINTN mHashInterfaceCount = 0;\r
30\r
31/**\r
32 Start hash sequence.\r
33\r
34 @param HashHandle Hash handle.\r
35\r
36 @retval EFI_SUCCESS Hash sequence start and HandleHandle returned.\r
37 @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.\r
38**/\r
39EFI_STATUS\r
40EFIAPI\r
41HashStart (\r
42 OUT HASH_HANDLE *HashHandle\r
43 )\r
44{\r
45 HASH_HANDLE *HashCtx;\r
46 UINTN Index;\r
47 UINT32 HashMask;\r
48\r
49 if (mHashInterfaceCount == 0) {\r
50 return EFI_UNSUPPORTED;\r
51 }\r
52\r
53 HashCtx = AllocatePool (sizeof(*HashCtx) * mHashInterfaceCount);\r
54 ASSERT (HashCtx != NULL);\r
55\r
56 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
57 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
58 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
59 mHashInterface[Index].HashInit (&HashCtx[Index]);\r
60 }\r
61 }\r
62\r
63 *HashHandle = (HASH_HANDLE)HashCtx;\r
64\r
65 return EFI_SUCCESS;\r
66}\r
67\r
68/**\r
69 Update hash sequence data.\r
70\r
71 @param HashHandle Hash handle.\r
72 @param DataToHash Data to be hashed.\r
73 @param DataToHashLen Data size.\r
74\r
75 @retval EFI_SUCCESS Hash sequence updated.\r
76**/\r
77EFI_STATUS\r
78EFIAPI\r
79HashUpdate (\r
80 IN HASH_HANDLE HashHandle,\r
81 IN VOID *DataToHash,\r
82 IN UINTN DataToHashLen\r
83 )\r
84{\r
85 HASH_HANDLE *HashCtx;\r
86 UINTN Index;\r
87 UINT32 HashMask;\r
88\r
89 if (mHashInterfaceCount == 0) {\r
90 return EFI_UNSUPPORTED;\r
91 }\r
92\r
93 HashCtx = (HASH_HANDLE *)HashHandle;\r
94\r
95 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
96 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
97 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
98 mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, DataToHashLen);\r
99 }\r
100 }\r
101\r
102 return EFI_SUCCESS;\r
103}\r
104\r
105/**\r
106 Hash sequence complete and extend to PCR.\r
107\r
108 @param HashHandle Hash handle.\r
109 @param PcrIndex PCR to be extended.\r
110 @param DataToHash Data to be hashed.\r
111 @param DataToHashLen Data size.\r
112 @param DigestList Digest list.\r
113\r
114 @retval EFI_SUCCESS Hash sequence complete and DigestList is returned.\r
115**/\r
116EFI_STATUS\r
117EFIAPI\r
118HashCompleteAndExtend (\r
119 IN HASH_HANDLE HashHandle,\r
120 IN TPMI_DH_PCR PcrIndex,\r
121 IN VOID *DataToHash,\r
122 IN UINTN DataToHashLen,\r
123 OUT TPML_DIGEST_VALUES *DigestList\r
124 )\r
125{\r
126 TPML_DIGEST_VALUES Digest;\r
127 HASH_HANDLE *HashCtx;\r
128 UINTN Index;\r
129 EFI_STATUS Status;\r
130 UINT32 HashMask;\r
131\r
132 if (mHashInterfaceCount == 0) {\r
133 return EFI_UNSUPPORTED;\r
134 }\r
135\r
136 HashCtx = (HASH_HANDLE *)HashHandle;\r
137 ZeroMem (DigestList, sizeof(*DigestList));\r
138\r
139 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
140 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
141 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
142 mHashInterface[Index].HashUpdate (HashCtx[Index], DataToHash, DataToHashLen);\r
143 mHashInterface[Index].HashFinal (HashCtx[Index], &Digest);\r
144 Tpm2SetHashToDigestList (DigestList, &Digest);\r
145 }\r
146 }\r
147\r
148 FreePool (HashCtx);\r
149\r
150 Status = Tpm2PcrExtend (\r
151 PcrIndex,\r
152 DigestList\r
153 );\r
154 return Status;\r
155}\r
156\r
157/**\r
158 Hash data and extend to PCR.\r
159\r
160 @param PcrIndex PCR to be extended.\r
161 @param DataToHash Data to be hashed.\r
162 @param DataToHashLen Data size.\r
163 @param DigestList Digest list.\r
164\r
165 @retval EFI_SUCCESS Hash data and DigestList is returned.\r
166**/\r
167EFI_STATUS\r
168EFIAPI\r
169HashAndExtend (\r
170 IN TPMI_DH_PCR PcrIndex,\r
171 IN VOID *DataToHash,\r
172 IN UINTN DataToHashLen,\r
173 OUT TPML_DIGEST_VALUES *DigestList\r
174 )\r
175{\r
176 HASH_HANDLE HashHandle;\r
177 EFI_STATUS Status;\r
178\r
179 if (mHashInterfaceCount == 0) {\r
180 return EFI_UNSUPPORTED;\r
181 }\r
182\r
183 HashStart (&HashHandle);\r
184 HashUpdate (HashHandle, DataToHash, DataToHashLen);\r
185 Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList);\r
186\r
187 return Status;\r
188}\r
189\r
190/**\r
191 This service register Hash.\r
192\r
193 @param HashInterface Hash interface\r
194\r
195 @retval EFI_SUCCESS This hash interface is registered successfully.\r
196 @retval EFI_UNSUPPORTED System does not support register this interface.\r
197 @retval EFI_ALREADY_STARTED System already register this interface.\r
198**/\r
199EFI_STATUS\r
200EFIAPI\r
201RegisterHashInterfaceLib (\r
202 IN HASH_INTERFACE *HashInterface\r
203 )\r
204{\r
205 UINTN Index;\r
206 UINT32 HashMask;\r
207 UINT32 BiosSupportedHashMask;\r
208 EFI_STATUS Status;\r
209\r
210 //\r
211 // Check allow\r
212 //\r
213 HashMask = Tpm2GetHashMaskFromAlgo (&HashInterface->HashGuid);\r
214 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) == 0) {\r
215 return EFI_UNSUPPORTED;\r
216 }\r
217\r
218 if (mHashInterfaceCount >= sizeof(mHashInterface)/sizeof(mHashInterface[0])) {\r
219 return EFI_OUT_OF_RESOURCES;\r
220 }\r
221 BiosSupportedHashMask = PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
222 Status = PcdSet32S (PcdTcg2HashAlgorithmBitmap, BiosSupportedHashMask | HashMask);\r
223 ASSERT_EFI_ERROR (Status);\r
224\r
225 //\r
226 // Check duplication\r
227 //\r
228 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
229 if (CompareGuid (&mHashInterface[Index].HashGuid, &HashInterface->HashGuid)) {\r
230 return EFI_ALREADY_STARTED;\r
231 }\r
232 }\r
233\r
234 CopyMem (&mHashInterface[mHashInterfaceCount], HashInterface, sizeof(*HashInterface));\r
235 mHashInterfaceCount ++;\r
236 \r
237 return EFI_SUCCESS;\r
238}