]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
SecurityPkg: Fix typo 'Ihis' with 'This' in codes
[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
07309c3d 6Copyright (c) 2013 - 2016, 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
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
1abfa4ce 47 UINT32 HashMask;\r
c1d93242
JY
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
1abfa4ce
JY
57 HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid);\r
58 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) {\r
59 mHashInterface[Index].HashInit (&HashCtx[Index]);\r
60 }\r
c1d93242
JY
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
1abfa4ce 87 UINT32 HashMask;\r
c1d93242
JY
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
1abfa4ce
JY
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
c1d93242
JY
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
1abfa4ce 130 UINT32 HashMask;\r
c1d93242
JY
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
1abfa4ce
JY
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
c1d93242
JY
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
1abfa4ce 207 UINT32 BiosSupportedHashMask;\r
fe3ca12d 208 EFI_STATUS Status;\r
c1d93242
JY
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
1abfa4ce 221 BiosSupportedHashMask = PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
fe3ca12d
SZ
222 Status = PcdSet32S (PcdTcg2HashAlgorithmBitmap, BiosSupportedHashMask | HashMask);\r
223 ASSERT_EFI_ERROR (Status);\r
c1d93242
JY
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}