]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.c
CryptoPkg/BaseHashApiLib: Align BaseHashApiLib with TPM 2.0 Implementation
[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
c70bdf9d 15#include <IndustryStandard/Tpm20.h>\r
3feea54e
AS
16#include <Library/BaseLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/MemoryAllocationLib.h>\r
19#include <Library/BaseCryptLib.h>\r
20#include <Library/DebugLib.h>\r
21#include <Library/PcdLib.h>\r
22#include <Library/HashApiLib.h>\r
23\r
24/**\r
25 Retrieves the size, in bytes, of the context buffer required for hash operations.\r
26\r
27 @return The size, in bytes, of the context buffer required for hash operations.\r
28**/\r
29UINTN\r
30EFIAPI\r
31HashApiGetContextSize (\r
32 VOID\r
33 )\r
34{\r
c70bdf9d
AS
35 switch (PcdGet32 (PcdHashApiLibPolicy)) {\r
36 case HASH_ALG_SHA1:\r
3feea54e
AS
37 return Sha1GetContextSize ();\r
38 break;\r
39\r
c70bdf9d 40 case HASH_ALG_SHA256:\r
3feea54e
AS
41 return Sha256GetContextSize ();\r
42 break;\r
43\r
c70bdf9d 44 case HASH_ALG_SHA384:\r
3feea54e
AS
45 return Sha384GetContextSize ();\r
46 break;\r
47\r
c70bdf9d 48 case HASH_ALG_SHA512:\r
3feea54e
AS
49 return Sha512GetContextSize ();\r
50 break;\r
51\r
c70bdf9d 52 case HASH_ALG_SM3_256:\r
3feea54e
AS
53 return Sm3GetContextSize ();\r
54 break;\r
55\r
56 default:\r
57 ASSERT (FALSE);\r
58 return 0;\r
59 break;\r
60 }\r
61}\r
62\r
63/**\r
64 Init hash sequence.\r
65\r
66 @param[out] HashContext Hash context.\r
67\r
68 @retval TRUE Hash start and HashHandle returned.\r
69 @retval FALSE Hash Init unsuccessful.\r
70**/\r
71BOOLEAN\r
72EFIAPI\r
73HashApiInit (\r
74 OUT HASH_API_CONTEXT HashContext\r
75 )\r
76{\r
c70bdf9d
AS
77 switch (PcdGet32 (PcdHashApiLibPolicy)) {\r
78 case HASH_ALG_SHA1:\r
3feea54e
AS
79 return Sha1Init (HashContext);\r
80 break;\r
81\r
c70bdf9d 82 case HASH_ALG_SHA256:\r
3feea54e
AS
83 return Sha256Init (HashContext);\r
84 break;\r
85\r
c70bdf9d 86 case HASH_ALG_SHA384:\r
3feea54e
AS
87 return Sha384Init (HashContext);\r
88 break;\r
89\r
c70bdf9d 90 case HASH_ALG_SHA512:\r
3feea54e
AS
91 return Sha512Init (HashContext);\r
92 break;\r
93\r
c70bdf9d 94 case HASH_ALG_SM3_256:\r
3feea54e
AS
95 return Sm3Init (HashContext);\r
96 break;\r
97\r
98 default:\r
99 ASSERT (FALSE);\r
100 return FALSE;\r
101 break;\r
102 }\r
103}\r
104\r
105/**\r
106 Makes a copy of an existing hash context.\r
107\r
108 @param[in] HashContext Hash context.\r
109 @param[out] NewHashContext New copy of hash context.\r
110\r
111 @retval TRUE Hash context copy succeeded.\r
112 @retval FALSE Hash context copy failed.\r
113**/\r
114BOOLEAN\r
115EFIAPI\r
116HashApiDuplicate (\r
117 IN HASH_API_CONTEXT HashContext,\r
118 OUT HASH_API_CONTEXT NewHashContext\r
119 )\r
120{\r
c70bdf9d
AS
121 switch (PcdGet32 (PcdHashApiLibPolicy)) {\r
122 case HASH_ALG_SHA1:\r
3feea54e
AS
123 return Sha1Duplicate (HashContext, NewHashContext);\r
124 break;\r
125\r
c70bdf9d 126 case HASH_ALG_SHA256:\r
3feea54e
AS
127 return Sha256Duplicate (HashContext, NewHashContext);\r
128 break;\r
129\r
c70bdf9d 130 case HASH_ALG_SHA384:\r
3feea54e
AS
131 return Sha384Duplicate (HashContext, NewHashContext);\r
132 break;\r
133\r
c70bdf9d 134 case HASH_ALG_SHA512:\r
3feea54e
AS
135 return Sha512Duplicate (HashContext, NewHashContext);\r
136 break;\r
137\r
c70bdf9d 138 case HASH_ALG_SM3_256:\r
3feea54e
AS
139 return Sm3Duplicate (HashContext, NewHashContext);\r
140 break;\r
141\r
142 default:\r
143 ASSERT (FALSE);\r
144 return FALSE;\r
145 break;\r
146 }\r
147}\r
148\r
149/**\r
150 Update hash data.\r
151\r
152 @param[in] HashContext Hash context.\r
153 @param[in] DataToHash Data to be hashed.\r
154 @param[in] DataToHashLen Data size.\r
155\r
156 @retval TRUE Hash updated.\r
157 @retval FALSE Hash updated unsuccessful.\r
158**/\r
159BOOLEAN\r
160EFIAPI\r
161HashApiUpdate (\r
162 IN HASH_API_CONTEXT HashContext,\r
163 IN VOID *DataToHash,\r
164 IN UINTN DataToHashLen\r
165 )\r
166{\r
c70bdf9d
AS
167 switch (PcdGet32 (PcdHashApiLibPolicy)) {\r
168 case HASH_ALG_SHA1:\r
3feea54e
AS
169 return Sha1Update (HashContext, DataToHash, DataToHashLen);\r
170 break;\r
171\r
c70bdf9d 172 case HASH_ALG_SHA256:\r
3feea54e
AS
173 return Sha256Update (HashContext, DataToHash, DataToHashLen);\r
174 break;\r
175\r
c70bdf9d 176 case HASH_ALG_SHA384:\r
3feea54e
AS
177 return Sha384Update (HashContext, DataToHash, DataToHashLen);\r
178 break;\r
179\r
c70bdf9d 180 case HASH_ALG_SHA512:\r
3feea54e
AS
181 return Sha512Update (HashContext, DataToHash, DataToHashLen);\r
182 break;\r
183\r
c70bdf9d 184 case HASH_ALG_SM3_256:\r
3feea54e
AS
185 return Sm3Update (HashContext, DataToHash, DataToHashLen);\r
186 break;\r
187\r
188 default:\r
189 ASSERT (FALSE);\r
190 return FALSE;\r
191 break;\r
192 }\r
193}\r
194\r
195/**\r
196 Hash complete.\r
197\r
198 @param[in] HashContext Hash context.\r
199 @param[out] Digest Hash Digest.\r
200\r
201 @retval TRUE Hash complete and Digest is returned.\r
202 @retval FALSE Hash complete unsuccessful.\r
203**/\r
204BOOLEAN\r
205EFIAPI\r
206HashApiFinal (\r
207 IN HASH_API_CONTEXT HashContext,\r
208 OUT UINT8 *Digest\r
209 )\r
210{\r
c70bdf9d
AS
211 switch (PcdGet32 (PcdHashApiLibPolicy)) {\r
212 case HASH_ALG_SHA1:\r
3feea54e
AS
213 return Sha1Final (HashContext, Digest);\r
214 break;\r
215\r
c70bdf9d 216 case HASH_ALG_SHA256:\r
3feea54e
AS
217 return Sha256Final (HashContext, Digest);\r
218 break;\r
219\r
c70bdf9d 220 case HASH_ALG_SHA384:\r
3feea54e
AS
221 return Sha384Final (HashContext, Digest);\r
222 break;\r
223\r
c70bdf9d 224 case HASH_ALG_SHA512:\r
3feea54e
AS
225 return Sha512Final (HashContext, Digest);\r
226 break;\r
227\r
c70bdf9d 228 case HASH_ALG_SM3_256:\r
3feea54e
AS
229 return Sm3Final (HashContext, Digest);\r
230 break;\r
231\r
232 default:\r
233 ASSERT (FALSE);\r
234 return FALSE;\r
235 break;\r
236 }\r
237}\r
238\r
239/**\r
240 Computes hash message digest of a input data buffer.\r
241\r
242 @param[in] DataToHash Data to be hashed.\r
243 @param[in] DataToHashLen Data size.\r
244 @param[out] Digest Hash Digest.\r
245\r
246 @retval TRUE Hash digest computation succeeded.\r
247 @retval FALSE Hash digest computation failed.\r
248**/\r
249BOOLEAN\r
250EFIAPI\r
251HashApiHashAll (\r
252 IN CONST VOID *DataToHash,\r
253 IN UINTN DataToHashLen,\r
254 OUT UINT8 *Digest\r
255 )\r
256{\r
c70bdf9d
AS
257 switch (PcdGet32 (PcdHashApiLibPolicy)) {\r
258 case HASH_ALG_SHA1:\r
3feea54e
AS
259 return Sha1HashAll (DataToHash, DataToHashLen, Digest);\r
260 break;\r
261\r
c70bdf9d 262 case HASH_ALG_SHA256:\r
3feea54e
AS
263 return Sha256HashAll (DataToHash, DataToHashLen, Digest);\r
264 break;\r
265\r
c70bdf9d 266 case HASH_ALG_SHA384:\r
3feea54e
AS
267 return Sha384HashAll (DataToHash, DataToHashLen, Digest);\r
268 break;\r
269\r
c70bdf9d 270 case HASH_ALG_SHA512:\r
3feea54e
AS
271 return Sha512HashAll (DataToHash, DataToHashLen, Digest);\r
272 break;\r
273\r
c70bdf9d 274 case HASH_ALG_SM3_256:\r
3feea54e
AS
275 return Sm3HashAll (DataToHash, DataToHashLen, Digest);\r
276 break;\r
277\r
278 default:\r
279 ASSERT (FALSE);\r
280 return FALSE;\r
281 break;\r
282 }\r
283}\r