BaseHashApiLib.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /** @file
  2. Unified Hash API Implementation
  3. This file implements the Unified Hash API.
  4. This API, when called, will calculate the Hash using the
  5. hashing algorithm specified by PcdHashApiLibPolicy.
  6. Copyright (c) 2020-2022, Intel Corporation. All rights reserved.<BR>
  7. SPDX-License-Identifier: BSD-2-Clause-Patent
  8. **/
  9. #include <Base.h>
  10. #include <IndustryStandard/Tpm20.h>
  11. #include <Library/BaseLib.h>
  12. #include <Library/BaseMemoryLib.h>
  13. #include <Library/MemoryAllocationLib.h>
  14. #include <Library/BaseCryptLib.h>
  15. #include <Library/DebugLib.h>
  16. #include <Library/PcdLib.h>
  17. #include <Library/HashApiLib.h>
  18. /**
  19. Retrieves the size, in bytes, of the context buffer required for hash operations.
  20. @return The size, in bytes, of the context buffer required for hash operations.
  21. **/
  22. UINTN
  23. EFIAPI
  24. HashApiGetContextSize (
  25. VOID
  26. )
  27. {
  28. switch (PcdGet32 (PcdHashApiLibPolicy)) {
  29. #ifndef DISABLE_SHA1_DEPRECATED_INTERFACES
  30. case HASH_ALG_SHA1:
  31. return Sha1GetContextSize ();
  32. break;
  33. #endif
  34. case HASH_ALG_SHA256:
  35. return Sha256GetContextSize ();
  36. break;
  37. case HASH_ALG_SHA384:
  38. return Sha384GetContextSize ();
  39. break;
  40. case HASH_ALG_SHA512:
  41. return Sha512GetContextSize ();
  42. break;
  43. case HASH_ALG_SM3_256:
  44. return Sm3GetContextSize ();
  45. break;
  46. default:
  47. ASSERT (FALSE);
  48. return 0;
  49. break;
  50. }
  51. }
  52. /**
  53. Init hash sequence.
  54. @param[out] HashContext Hash context.
  55. @retval TRUE Hash start and HashHandle returned.
  56. @retval FALSE Hash Init unsuccessful.
  57. **/
  58. BOOLEAN
  59. EFIAPI
  60. HashApiInit (
  61. OUT HASH_API_CONTEXT HashContext
  62. )
  63. {
  64. switch (PcdGet32 (PcdHashApiLibPolicy)) {
  65. #ifndef DISABLE_SHA1_DEPRECATED_INTERFACES
  66. case HASH_ALG_SHA1:
  67. return Sha1Init (HashContext);
  68. break;
  69. #endif
  70. case HASH_ALG_SHA256:
  71. return Sha256Init (HashContext);
  72. break;
  73. case HASH_ALG_SHA384:
  74. return Sha384Init (HashContext);
  75. break;
  76. case HASH_ALG_SHA512:
  77. return Sha512Init (HashContext);
  78. break;
  79. case HASH_ALG_SM3_256:
  80. return Sm3Init (HashContext);
  81. break;
  82. default:
  83. ASSERT (FALSE);
  84. return FALSE;
  85. break;
  86. }
  87. }
  88. /**
  89. Makes a copy of an existing hash context.
  90. @param[in] HashContext Hash context.
  91. @param[out] NewHashContext New copy of hash context.
  92. @retval TRUE Hash context copy succeeded.
  93. @retval FALSE Hash context copy failed.
  94. **/
  95. BOOLEAN
  96. EFIAPI
  97. HashApiDuplicate (
  98. IN HASH_API_CONTEXT HashContext,
  99. OUT HASH_API_CONTEXT NewHashContext
  100. )
  101. {
  102. switch (PcdGet32 (PcdHashApiLibPolicy)) {
  103. #ifndef DISABLE_SHA1_DEPRECATED_INTERFACES
  104. case HASH_ALG_SHA1:
  105. return Sha1Duplicate (HashContext, NewHashContext);
  106. break;
  107. #endif
  108. case HASH_ALG_SHA256:
  109. return Sha256Duplicate (HashContext, NewHashContext);
  110. break;
  111. case HASH_ALG_SHA384:
  112. return Sha384Duplicate (HashContext, NewHashContext);
  113. break;
  114. case HASH_ALG_SHA512:
  115. return Sha512Duplicate (HashContext, NewHashContext);
  116. break;
  117. case HASH_ALG_SM3_256:
  118. return Sm3Duplicate (HashContext, NewHashContext);
  119. break;
  120. default:
  121. ASSERT (FALSE);
  122. return FALSE;
  123. break;
  124. }
  125. }
  126. /**
  127. Update hash data.
  128. @param[in] HashContext Hash context.
  129. @param[in] DataToHash Data to be hashed.
  130. @param[in] DataToHashLen Data size.
  131. @retval TRUE Hash updated.
  132. @retval FALSE Hash updated unsuccessful.
  133. **/
  134. BOOLEAN
  135. EFIAPI
  136. HashApiUpdate (
  137. IN HASH_API_CONTEXT HashContext,
  138. IN VOID *DataToHash,
  139. IN UINTN DataToHashLen
  140. )
  141. {
  142. switch (PcdGet32 (PcdHashApiLibPolicy)) {
  143. #ifndef DISABLE_SHA1_DEPRECATED_INTERFACES
  144. case HASH_ALG_SHA1:
  145. return Sha1Update (HashContext, DataToHash, DataToHashLen);
  146. break;
  147. #endif
  148. case HASH_ALG_SHA256:
  149. return Sha256Update (HashContext, DataToHash, DataToHashLen);
  150. break;
  151. case HASH_ALG_SHA384:
  152. return Sha384Update (HashContext, DataToHash, DataToHashLen);
  153. break;
  154. case HASH_ALG_SHA512:
  155. return Sha512Update (HashContext, DataToHash, DataToHashLen);
  156. break;
  157. case HASH_ALG_SM3_256:
  158. return Sm3Update (HashContext, DataToHash, DataToHashLen);
  159. break;
  160. default:
  161. ASSERT (FALSE);
  162. return FALSE;
  163. break;
  164. }
  165. }
  166. /**
  167. Hash complete.
  168. @param[in] HashContext Hash context.
  169. @param[out] Digest Hash Digest.
  170. @retval TRUE Hash complete and Digest is returned.
  171. @retval FALSE Hash complete unsuccessful.
  172. **/
  173. BOOLEAN
  174. EFIAPI
  175. HashApiFinal (
  176. IN HASH_API_CONTEXT HashContext,
  177. OUT UINT8 *Digest
  178. )
  179. {
  180. switch (PcdGet32 (PcdHashApiLibPolicy)) {
  181. #ifndef DISABLE_SHA1_DEPRECATED_INTERFACES
  182. case HASH_ALG_SHA1:
  183. return Sha1Final (HashContext, Digest);
  184. break;
  185. #endif
  186. case HASH_ALG_SHA256:
  187. return Sha256Final (HashContext, Digest);
  188. break;
  189. case HASH_ALG_SHA384:
  190. return Sha384Final (HashContext, Digest);
  191. break;
  192. case HASH_ALG_SHA512:
  193. return Sha512Final (HashContext, Digest);
  194. break;
  195. case HASH_ALG_SM3_256:
  196. return Sm3Final (HashContext, Digest);
  197. break;
  198. default:
  199. ASSERT (FALSE);
  200. return FALSE;
  201. break;
  202. }
  203. }
  204. /**
  205. Computes hash message digest of a input data buffer.
  206. @param[in] DataToHash Data to be hashed.
  207. @param[in] DataToHashLen Data size.
  208. @param[out] Digest Hash Digest.
  209. @retval TRUE Hash digest computation succeeded.
  210. @retval FALSE Hash digest computation failed.
  211. **/
  212. BOOLEAN
  213. EFIAPI
  214. HashApiHashAll (
  215. IN CONST VOID *DataToHash,
  216. IN UINTN DataToHashLen,
  217. OUT UINT8 *Digest
  218. )
  219. {
  220. switch (PcdGet32 (PcdHashApiLibPolicy)) {
  221. #ifndef DISABLE_SHA1_DEPRECATED_INTERFACES
  222. case HASH_ALG_SHA1:
  223. return Sha1HashAll (DataToHash, DataToHashLen, Digest);
  224. break;
  225. #endif
  226. case HASH_ALG_SHA256:
  227. return Sha256HashAll (DataToHash, DataToHashLen, Digest);
  228. break;
  229. case HASH_ALG_SHA384:
  230. return Sha384HashAll (DataToHash, DataToHashLen, Digest);
  231. break;
  232. case HASH_ALG_SHA512:
  233. return Sha512HashAll (DataToHash, DataToHashLen, Digest);
  234. break;
  235. case HASH_ALG_SM3_256:
  236. return Sm3HashAll (DataToHash, DataToHashLen, Digest);
  237. break;
  238. default:
  239. ASSERT (FALSE);
  240. return FALSE;
  241. break;
  242. }
  243. }