]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c
Add TPM2 support defined in trusted computing group.
[mirror_edk2.git] / SecurityPkg / Library / HashLibBaseCryptoRouter / HashLibBaseCryptoRouterDxe.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
1abfa4ce 6Copyright (c) 2013 - 2015, 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
c1d93242
JY
208\r
209 //\r
210 // Check allow\r
211 //\r
212 HashMask = Tpm2GetHashMaskFromAlgo (&HashInterface->HashGuid);\r
213 if ((HashMask & PcdGet32 (PcdTpm2HashMask)) == 0) {\r
214 return EFI_UNSUPPORTED;\r
215 }\r
216\r
217 if (mHashInterfaceCount >= sizeof(mHashInterface)/sizeof(mHashInterface[0])) {\r
218 return EFI_OUT_OF_RESOURCES;\r
219 }\r
1abfa4ce
JY
220 BiosSupportedHashMask = PcdGet32 (PcdTcg2HashAlgorithmBitmap);\r
221 PcdSet32 (PcdTcg2HashAlgorithmBitmap, BiosSupportedHashMask | HashMask);\r
c1d93242
JY
222\r
223 //\r
224 // Check duplication\r
225 //\r
226 for (Index = 0; Index < mHashInterfaceCount; Index++) {\r
227 if (CompareGuid (&mHashInterface[Index].HashGuid, &HashInterface->HashGuid)) {\r
228 return EFI_ALREADY_STARTED;\r
229 }\r
230 }\r
231\r
232 CopyMem (&mHashInterface[mHashInterfaceCount], HashInterface, sizeof(*HashInterface));\r
233 mHashInterfaceCount ++;\r
234 \r
235 return EFI_SUCCESS;\r
236}