]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.c
CryptoPkg/BaseHashApiLib: Implement Unified Hash Calculation API
[mirror_edk2.git] / CryptoPkg / Library / BaseHashApiLib / BaseHashApiLib.c
CommitLineData
3feea54e
AS
1/** @file\r
2 Unified Hash API Implementation\r
3\r
4 This file implements the Unified Hash API.\r
5\r
6 This API, when called, will calculate the Hash using the\r
7 hashing algorithm specified by PcdHashApiLibPolicy.\r
8\r
9 Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
10 SPDX-License-Identifier: BSD-2-Clause-Patent\r
11\r
12**/\r
13\r
14#include <Base.h>\r
15#include <Library/BaseLib.h>\r
16#include <Library/BaseMemoryLib.h>\r
17#include <Library/MemoryAllocationLib.h>\r
18#include <Library/BaseCryptLib.h>\r
19#include <Library/DebugLib.h>\r
20#include <Library/PcdLib.h>\r
21#include <Library/HashApiLib.h>\r
22\r
23/**\r
24 Retrieves the size, in bytes, of the context buffer required for hash operations.\r
25\r
26 @return The size, in bytes, of the context buffer required for hash operations.\r
27**/\r
28UINTN\r
29EFIAPI\r
30HashApiGetContextSize (\r
31 VOID\r
32 )\r
33{\r
34 switch (PcdGet8 (PcdHashApiLibPolicy)) {\r
35 case HASH_API_ALGO_MD4:\r
36 return Md4GetContextSize ();\r
37 break;\r
38\r
39 case HASH_API_ALGO_MD5:\r
40 return Md5GetContextSize ();\r
41 break;\r
42\r
43 case HASH_API_ALGO_SHA1:\r
44 return Sha1GetContextSize ();\r
45 break;\r
46\r
47 case HASH_API_ALGO_SHA256:\r
48 return Sha256GetContextSize ();\r
49 break;\r
50\r
51 case HASH_API_ALGO_SHA384:\r
52 return Sha384GetContextSize ();\r
53 break;\r
54\r
55 case HASH_API_ALGO_SHA512:\r
56 return Sha512GetContextSize ();\r
57 break;\r
58\r
59 case HASH_API_ALGO_SM3_256:\r
60 return Sm3GetContextSize ();\r
61 break;\r
62\r
63 default:\r
64 ASSERT (FALSE);\r
65 return 0;\r
66 break;\r
67 }\r
68}\r
69\r
70/**\r
71 Init hash sequence.\r
72\r
73 @param[out] HashContext Hash context.\r
74\r
75 @retval TRUE Hash start and HashHandle returned.\r
76 @retval FALSE Hash Init unsuccessful.\r
77**/\r
78BOOLEAN\r
79EFIAPI\r
80HashApiInit (\r
81 OUT HASH_API_CONTEXT HashContext\r
82 )\r
83{\r
84 switch (PcdGet8 (PcdHashApiLibPolicy)) {\r
85 case HASH_API_ALGO_MD4:\r
86 return Md4Init (HashContext);\r
87 break;\r
88\r
89 case HASH_API_ALGO_MD5:\r
90 return Md5Init (HashContext);\r
91 break;\r
92\r
93 case HASH_API_ALGO_SHA1:\r
94 return Sha1Init (HashContext);\r
95 break;\r
96\r
97 case HASH_API_ALGO_SHA256:\r
98 return Sha256Init (HashContext);\r
99 break;\r
100\r
101 case HASH_API_ALGO_SHA384:\r
102 return Sha384Init (HashContext);\r
103 break;\r
104\r
105 case HASH_API_ALGO_SHA512:\r
106 return Sha512Init (HashContext);\r
107 break;\r
108\r
109 case HASH_API_ALGO_SM3_256:\r
110 return Sm3Init (HashContext);\r
111 break;\r
112\r
113 default:\r
114 ASSERT (FALSE);\r
115 return FALSE;\r
116 break;\r
117 }\r
118}\r
119\r
120/**\r
121 Makes a copy of an existing hash context.\r
122\r
123 @param[in] HashContext Hash context.\r
124 @param[out] NewHashContext New copy of hash context.\r
125\r
126 @retval TRUE Hash context copy succeeded.\r
127 @retval FALSE Hash context copy failed.\r
128**/\r
129BOOLEAN\r
130EFIAPI\r
131HashApiDuplicate (\r
132 IN HASH_API_CONTEXT HashContext,\r
133 OUT HASH_API_CONTEXT NewHashContext\r
134 )\r
135{\r
136 switch (PcdGet8 (PcdHashApiLibPolicy)) {\r
137 case HASH_API_ALGO_MD4:\r
138 return Md4Duplicate (HashContext, NewHashContext);\r
139 break;\r
140\r
141 case HASH_API_ALGO_MD5:\r
142 return Md5Duplicate (HashContext, NewHashContext);\r
143 break;\r
144\r
145 case HASH_API_ALGO_SHA1:\r
146 return Sha1Duplicate (HashContext, NewHashContext);\r
147 break;\r
148\r
149 case HASH_API_ALGO_SHA256:\r
150 return Sha256Duplicate (HashContext, NewHashContext);\r
151 break;\r
152\r
153 case HASH_API_ALGO_SHA384:\r
154 return Sha384Duplicate (HashContext, NewHashContext);\r
155 break;\r
156\r
157 case HASH_API_ALGO_SHA512:\r
158 return Sha512Duplicate (HashContext, NewHashContext);\r
159 break;\r
160\r
161 case HASH_API_ALGO_SM3_256:\r
162 return Sm3Duplicate (HashContext, NewHashContext);\r
163 break;\r
164\r
165 default:\r
166 ASSERT (FALSE);\r
167 return FALSE;\r
168 break;\r
169 }\r
170}\r
171\r
172/**\r
173 Update hash data.\r
174\r
175 @param[in] HashContext Hash context.\r
176 @param[in] DataToHash Data to be hashed.\r
177 @param[in] DataToHashLen Data size.\r
178\r
179 @retval TRUE Hash updated.\r
180 @retval FALSE Hash updated unsuccessful.\r
181**/\r
182BOOLEAN\r
183EFIAPI\r
184HashApiUpdate (\r
185 IN HASH_API_CONTEXT HashContext,\r
186 IN VOID *DataToHash,\r
187 IN UINTN DataToHashLen\r
188 )\r
189{\r
190 switch (PcdGet8 (PcdHashApiLibPolicy)) {\r
191 case HASH_API_ALGO_MD4:\r
192 return Md4Update (HashContext, DataToHash, DataToHashLen);\r
193 break;\r
194\r
195 case HASH_API_ALGO_MD5:\r
196 return Md5Update (HashContext, DataToHash, DataToHashLen);\r
197 break;\r
198\r
199 case HASH_API_ALGO_SHA1:\r
200 return Sha1Update (HashContext, DataToHash, DataToHashLen);\r
201 break;\r
202\r
203 case HASH_API_ALGO_SHA256:\r
204 return Sha256Update (HashContext, DataToHash, DataToHashLen);\r
205 break;\r
206\r
207 case HASH_API_ALGO_SHA384:\r
208 return Sha384Update (HashContext, DataToHash, DataToHashLen);\r
209 break;\r
210\r
211 case HASH_API_ALGO_SHA512:\r
212 return Sha512Update (HashContext, DataToHash, DataToHashLen);\r
213 break;\r
214\r
215 case HASH_API_ALGO_SM3_256:\r
216 return Sm3Update (HashContext, DataToHash, DataToHashLen);\r
217 break;\r
218\r
219 default:\r
220 ASSERT (FALSE);\r
221 return FALSE;\r
222 break;\r
223 }\r
224}\r
225\r
226/**\r
227 Hash complete.\r
228\r
229 @param[in] HashContext Hash context.\r
230 @param[out] Digest Hash Digest.\r
231\r
232 @retval TRUE Hash complete and Digest is returned.\r
233 @retval FALSE Hash complete unsuccessful.\r
234**/\r
235BOOLEAN\r
236EFIAPI\r
237HashApiFinal (\r
238 IN HASH_API_CONTEXT HashContext,\r
239 OUT UINT8 *Digest\r
240 )\r
241{\r
242 switch (PcdGet8 (PcdHashApiLibPolicy)) {\r
243 case HASH_API_ALGO_MD4:\r
244 return Md4Final (HashContext, Digest);\r
245 break;\r
246\r
247 case HASH_API_ALGO_MD5:\r
248 return Md5Final (HashContext, Digest);\r
249 break;\r
250\r
251 case HASH_API_ALGO_SHA1:\r
252 return Sha1Final (HashContext, Digest);\r
253 break;\r
254\r
255 case HASH_API_ALGO_SHA256:\r
256 return Sha256Final (HashContext, Digest);\r
257 break;\r
258\r
259 case HASH_API_ALGO_SHA384:\r
260 return Sha384Final (HashContext, Digest);\r
261 break;\r
262\r
263 case HASH_API_ALGO_SHA512:\r
264 return Sha512Final (HashContext, Digest);\r
265 break;\r
266\r
267 case HASH_API_ALGO_SM3_256:\r
268 return Sm3Final (HashContext, Digest);\r
269 break;\r
270\r
271 default:\r
272 ASSERT (FALSE);\r
273 return FALSE;\r
274 break;\r
275 }\r
276}\r
277\r
278/**\r
279 Computes hash message digest of a input data buffer.\r
280\r
281 @param[in] DataToHash Data to be hashed.\r
282 @param[in] DataToHashLen Data size.\r
283 @param[out] Digest Hash Digest.\r
284\r
285 @retval TRUE Hash digest computation succeeded.\r
286 @retval FALSE Hash digest computation failed.\r
287**/\r
288BOOLEAN\r
289EFIAPI\r
290HashApiHashAll (\r
291 IN CONST VOID *DataToHash,\r
292 IN UINTN DataToHashLen,\r
293 OUT UINT8 *Digest\r
294 )\r
295{\r
296 switch (PcdGet8 (PcdHashApiLibPolicy)) {\r
297 case HASH_API_ALGO_MD4:\r
298 return Md4HashAll (DataToHash, DataToHashLen, Digest);\r
299 break;\r
300\r
301 case HASH_API_ALGO_MD5:\r
302 return Md5HashAll (DataToHash, DataToHashLen, Digest);\r
303 break;\r
304\r
305 case HASH_API_ALGO_SHA1:\r
306 return Sha1HashAll (DataToHash, DataToHashLen, Digest);\r
307 break;\r
308\r
309 case HASH_API_ALGO_SHA256:\r
310 return Sha256HashAll (DataToHash, DataToHashLen, Digest);\r
311 break;\r
312\r
313 case HASH_API_ALGO_SHA384:\r
314 return Sha384HashAll (DataToHash, DataToHashLen, Digest);\r
315 break;\r
316\r
317 case HASH_API_ALGO_SHA512:\r
318 return Sha512HashAll (DataToHash, DataToHashLen, Digest);\r
319 break;\r
320\r
321 case HASH_API_ALGO_SM3_256:\r
322 return Sm3HashAll (DataToHash, DataToHashLen, Digest);\r
323 break;\r
324\r
325 default:\r
326 ASSERT (FALSE);\r
327 return FALSE;\r
328 break;\r
329 }\r
330}\r