md.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108
  1. /**
  2. * \file md.c
  3. *
  4. * \brief Generic message digest wrapper for Mbed TLS
  5. *
  6. * \author Adriaan de Jong <[email protected]>
  7. *
  8. * Copyright The Mbed TLS Contributors
  9. * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
  10. */
  11. #include "common.h"
  12. /*
  13. * Availability of functions in this module is controlled by two
  14. * feature macros:
  15. * - MBEDTLS_MD_C enables the whole module;
  16. * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
  17. * most hash metadata (everything except string names); is it
  18. * automatically set whenever MBEDTLS_MD_C is defined.
  19. *
  20. * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
  21. *
  22. * In the future we may want to change the contract of some functions
  23. * (behaviour with NULL arguments) depending on whether MD_C is defined or
  24. * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
  25. *
  26. * For these reasons, we're keeping MD_LIGHT internal for now.
  27. */
  28. #if defined(MBEDTLS_MD_LIGHT)
  29. #include "mbedtls/md.h"
  30. #include "md_wrap.h"
  31. #include "mbedtls/platform_util.h"
  32. #include "mbedtls/error.h"
  33. #include "mbedtls/md5.h"
  34. #include "mbedtls/ripemd160.h"
  35. #include "mbedtls/sha1.h"
  36. #include "mbedtls/sha256.h"
  37. #include "mbedtls/sha512.h"
  38. #include "mbedtls/sha3.h"
  39. #if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
  40. #include <psa/crypto.h>
  41. #include "md_psa.h"
  42. #include "psa_util_internal.h"
  43. #endif
  44. #if defined(MBEDTLS_MD_SOME_PSA)
  45. #include "psa_crypto_core.h"
  46. #endif
  47. #include "mbedtls/platform.h"
  48. #include <string.h>
  49. #if defined(MBEDTLS_FS_IO)
  50. #include <stdio.h>
  51. #endif
  52. /* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
  53. #if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
  54. #error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
  55. #endif
  56. #if defined(MBEDTLS_MD_C)
  57. #define MD_INFO(type, out_size, block_size) type, out_size, block_size,
  58. #else
  59. #define MD_INFO(type, out_size, block_size) type, out_size,
  60. #endif
  61. #if defined(MBEDTLS_MD_CAN_MD5)
  62. static const mbedtls_md_info_t mbedtls_md5_info = {
  63. MD_INFO(MBEDTLS_MD_MD5, 16, 64)
  64. };
  65. #endif
  66. #if defined(MBEDTLS_MD_CAN_RIPEMD160)
  67. static const mbedtls_md_info_t mbedtls_ripemd160_info = {
  68. MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
  69. };
  70. #endif
  71. #if defined(MBEDTLS_MD_CAN_SHA1)
  72. static const mbedtls_md_info_t mbedtls_sha1_info = {
  73. MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
  74. };
  75. #endif
  76. #if defined(MBEDTLS_MD_CAN_SHA224)
  77. static const mbedtls_md_info_t mbedtls_sha224_info = {
  78. MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
  79. };
  80. #endif
  81. #if defined(MBEDTLS_MD_CAN_SHA256)
  82. static const mbedtls_md_info_t mbedtls_sha256_info = {
  83. MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
  84. };
  85. #endif
  86. #if defined(MBEDTLS_MD_CAN_SHA384)
  87. static const mbedtls_md_info_t mbedtls_sha384_info = {
  88. MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
  89. };
  90. #endif
  91. #if defined(MBEDTLS_MD_CAN_SHA512)
  92. static const mbedtls_md_info_t mbedtls_sha512_info = {
  93. MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
  94. };
  95. #endif
  96. #if defined(MBEDTLS_MD_CAN_SHA3_224)
  97. static const mbedtls_md_info_t mbedtls_sha3_224_info = {
  98. MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
  99. };
  100. #endif
  101. #if defined(MBEDTLS_MD_CAN_SHA3_256)
  102. static const mbedtls_md_info_t mbedtls_sha3_256_info = {
  103. MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
  104. };
  105. #endif
  106. #if defined(MBEDTLS_MD_CAN_SHA3_384)
  107. static const mbedtls_md_info_t mbedtls_sha3_384_info = {
  108. MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
  109. };
  110. #endif
  111. #if defined(MBEDTLS_MD_CAN_SHA3_512)
  112. static const mbedtls_md_info_t mbedtls_sha3_512_info = {
  113. MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
  114. };
  115. #endif
  116. const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
  117. {
  118. switch (md_type) {
  119. #if defined(MBEDTLS_MD_CAN_MD5)
  120. case MBEDTLS_MD_MD5:
  121. return &mbedtls_md5_info;
  122. #endif
  123. #if defined(MBEDTLS_MD_CAN_RIPEMD160)
  124. case MBEDTLS_MD_RIPEMD160:
  125. return &mbedtls_ripemd160_info;
  126. #endif
  127. #if defined(MBEDTLS_MD_CAN_SHA1)
  128. case MBEDTLS_MD_SHA1:
  129. return &mbedtls_sha1_info;
  130. #endif
  131. #if defined(MBEDTLS_MD_CAN_SHA224)
  132. case MBEDTLS_MD_SHA224:
  133. return &mbedtls_sha224_info;
  134. #endif
  135. #if defined(MBEDTLS_MD_CAN_SHA256)
  136. case MBEDTLS_MD_SHA256:
  137. return &mbedtls_sha256_info;
  138. #endif
  139. #if defined(MBEDTLS_MD_CAN_SHA384)
  140. case MBEDTLS_MD_SHA384:
  141. return &mbedtls_sha384_info;
  142. #endif
  143. #if defined(MBEDTLS_MD_CAN_SHA512)
  144. case MBEDTLS_MD_SHA512:
  145. return &mbedtls_sha512_info;
  146. #endif
  147. #if defined(MBEDTLS_MD_CAN_SHA3_224)
  148. case MBEDTLS_MD_SHA3_224:
  149. return &mbedtls_sha3_224_info;
  150. #endif
  151. #if defined(MBEDTLS_MD_CAN_SHA3_256)
  152. case MBEDTLS_MD_SHA3_256:
  153. return &mbedtls_sha3_256_info;
  154. #endif
  155. #if defined(MBEDTLS_MD_CAN_SHA3_384)
  156. case MBEDTLS_MD_SHA3_384:
  157. return &mbedtls_sha3_384_info;
  158. #endif
  159. #if defined(MBEDTLS_MD_CAN_SHA3_512)
  160. case MBEDTLS_MD_SHA3_512:
  161. return &mbedtls_sha3_512_info;
  162. #endif
  163. default:
  164. return NULL;
  165. }
  166. }
  167. #if defined(MBEDTLS_MD_SOME_PSA)
  168. static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
  169. {
  170. switch (info->type) {
  171. #if defined(MBEDTLS_MD_MD5_VIA_PSA)
  172. case MBEDTLS_MD_MD5:
  173. return PSA_ALG_MD5;
  174. #endif
  175. #if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
  176. case MBEDTLS_MD_RIPEMD160:
  177. return PSA_ALG_RIPEMD160;
  178. #endif
  179. #if defined(MBEDTLS_MD_SHA1_VIA_PSA)
  180. case MBEDTLS_MD_SHA1:
  181. return PSA_ALG_SHA_1;
  182. #endif
  183. #if defined(MBEDTLS_MD_SHA224_VIA_PSA)
  184. case MBEDTLS_MD_SHA224:
  185. return PSA_ALG_SHA_224;
  186. #endif
  187. #if defined(MBEDTLS_MD_SHA256_VIA_PSA)
  188. case MBEDTLS_MD_SHA256:
  189. return PSA_ALG_SHA_256;
  190. #endif
  191. #if defined(MBEDTLS_MD_SHA384_VIA_PSA)
  192. case MBEDTLS_MD_SHA384:
  193. return PSA_ALG_SHA_384;
  194. #endif
  195. #if defined(MBEDTLS_MD_SHA512_VIA_PSA)
  196. case MBEDTLS_MD_SHA512:
  197. return PSA_ALG_SHA_512;
  198. #endif
  199. #if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
  200. case MBEDTLS_MD_SHA3_224:
  201. return PSA_ALG_SHA3_224;
  202. #endif
  203. #if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
  204. case MBEDTLS_MD_SHA3_256:
  205. return PSA_ALG_SHA3_256;
  206. #endif
  207. #if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
  208. case MBEDTLS_MD_SHA3_384:
  209. return PSA_ALG_SHA3_384;
  210. #endif
  211. #if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
  212. case MBEDTLS_MD_SHA3_512:
  213. return PSA_ALG_SHA3_512;
  214. #endif
  215. default:
  216. return PSA_ALG_NONE;
  217. }
  218. }
  219. static int md_can_use_psa(const mbedtls_md_info_t *info)
  220. {
  221. psa_algorithm_t alg = psa_alg_of_md(info);
  222. if (alg == PSA_ALG_NONE) {
  223. return 0;
  224. }
  225. return psa_can_do_hash(alg);
  226. }
  227. #endif /* MBEDTLS_MD_SOME_PSA */
  228. void mbedtls_md_init(mbedtls_md_context_t *ctx)
  229. {
  230. /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
  231. memset(ctx, 0, sizeof(mbedtls_md_context_t));
  232. }
  233. void mbedtls_md_free(mbedtls_md_context_t *ctx)
  234. {
  235. if (ctx == NULL || ctx->md_info == NULL) {
  236. return;
  237. }
  238. if (ctx->md_ctx != NULL) {
  239. #if defined(MBEDTLS_MD_SOME_PSA)
  240. if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
  241. psa_hash_abort(ctx->md_ctx);
  242. } else
  243. #endif
  244. switch (ctx->md_info->type) {
  245. #if defined(MBEDTLS_MD5_C)
  246. case MBEDTLS_MD_MD5:
  247. mbedtls_md5_free(ctx->md_ctx);
  248. break;
  249. #endif
  250. #if defined(MBEDTLS_RIPEMD160_C)
  251. case MBEDTLS_MD_RIPEMD160:
  252. mbedtls_ripemd160_free(ctx->md_ctx);
  253. break;
  254. #endif
  255. #if defined(MBEDTLS_SHA1_C)
  256. case MBEDTLS_MD_SHA1:
  257. mbedtls_sha1_free(ctx->md_ctx);
  258. break;
  259. #endif
  260. #if defined(MBEDTLS_SHA224_C)
  261. case MBEDTLS_MD_SHA224:
  262. mbedtls_sha256_free(ctx->md_ctx);
  263. break;
  264. #endif
  265. #if defined(MBEDTLS_SHA256_C)
  266. case MBEDTLS_MD_SHA256:
  267. mbedtls_sha256_free(ctx->md_ctx);
  268. break;
  269. #endif
  270. #if defined(MBEDTLS_SHA384_C)
  271. case MBEDTLS_MD_SHA384:
  272. mbedtls_sha512_free(ctx->md_ctx);
  273. break;
  274. #endif
  275. #if defined(MBEDTLS_SHA512_C)
  276. case MBEDTLS_MD_SHA512:
  277. mbedtls_sha512_free(ctx->md_ctx);
  278. break;
  279. #endif
  280. #if defined(MBEDTLS_SHA3_C)
  281. case MBEDTLS_MD_SHA3_224:
  282. case MBEDTLS_MD_SHA3_256:
  283. case MBEDTLS_MD_SHA3_384:
  284. case MBEDTLS_MD_SHA3_512:
  285. mbedtls_sha3_free(ctx->md_ctx);
  286. break;
  287. #endif
  288. default:
  289. /* Shouldn't happen */
  290. break;
  291. }
  292. mbedtls_free(ctx->md_ctx);
  293. }
  294. #if defined(MBEDTLS_MD_C)
  295. if (ctx->hmac_ctx != NULL) {
  296. mbedtls_zeroize_and_free(ctx->hmac_ctx,
  297. 2 * ctx->md_info->block_size);
  298. }
  299. #endif
  300. mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
  301. }
  302. int mbedtls_md_clone(mbedtls_md_context_t *dst,
  303. const mbedtls_md_context_t *src)
  304. {
  305. if (dst == NULL || dst->md_info == NULL ||
  306. src == NULL || src->md_info == NULL ||
  307. dst->md_info != src->md_info) {
  308. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  309. }
  310. #if defined(MBEDTLS_MD_SOME_PSA)
  311. if (src->engine != dst->engine) {
  312. /* This can happen with src set to legacy because PSA wasn't ready
  313. * yet, and dst to PSA because it became ready in the meantime.
  314. * We currently don't support that case (we'd need to re-allocate
  315. * md_ctx to the size of the appropriate MD context). */
  316. return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
  317. }
  318. if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
  319. psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
  320. return mbedtls_md_error_from_psa(status);
  321. }
  322. #endif
  323. switch (src->md_info->type) {
  324. #if defined(MBEDTLS_MD5_C)
  325. case MBEDTLS_MD_MD5:
  326. mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
  327. break;
  328. #endif
  329. #if defined(MBEDTLS_RIPEMD160_C)
  330. case MBEDTLS_MD_RIPEMD160:
  331. mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
  332. break;
  333. #endif
  334. #if defined(MBEDTLS_SHA1_C)
  335. case MBEDTLS_MD_SHA1:
  336. mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
  337. break;
  338. #endif
  339. #if defined(MBEDTLS_SHA224_C)
  340. case MBEDTLS_MD_SHA224:
  341. mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
  342. break;
  343. #endif
  344. #if defined(MBEDTLS_SHA256_C)
  345. case MBEDTLS_MD_SHA256:
  346. mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
  347. break;
  348. #endif
  349. #if defined(MBEDTLS_SHA384_C)
  350. case MBEDTLS_MD_SHA384:
  351. mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
  352. break;
  353. #endif
  354. #if defined(MBEDTLS_SHA512_C)
  355. case MBEDTLS_MD_SHA512:
  356. mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
  357. break;
  358. #endif
  359. #if defined(MBEDTLS_SHA3_C)
  360. case MBEDTLS_MD_SHA3_224:
  361. case MBEDTLS_MD_SHA3_256:
  362. case MBEDTLS_MD_SHA3_384:
  363. case MBEDTLS_MD_SHA3_512:
  364. mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
  365. break;
  366. #endif
  367. default:
  368. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  369. }
  370. return 0;
  371. }
  372. #define ALLOC(type) \
  373. do { \
  374. ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
  375. if (ctx->md_ctx == NULL) \
  376. return MBEDTLS_ERR_MD_ALLOC_FAILED; \
  377. mbedtls_##type##_init(ctx->md_ctx); \
  378. } \
  379. while (0)
  380. int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
  381. {
  382. #if defined(MBEDTLS_MD_C)
  383. if (ctx == NULL) {
  384. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  385. }
  386. #endif
  387. if (md_info == NULL) {
  388. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  389. }
  390. ctx->md_info = md_info;
  391. ctx->md_ctx = NULL;
  392. #if defined(MBEDTLS_MD_C)
  393. ctx->hmac_ctx = NULL;
  394. #else
  395. if (hmac != 0) {
  396. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  397. }
  398. #endif
  399. #if defined(MBEDTLS_MD_SOME_PSA)
  400. if (md_can_use_psa(ctx->md_info)) {
  401. ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
  402. if (ctx->md_ctx == NULL) {
  403. return MBEDTLS_ERR_MD_ALLOC_FAILED;
  404. }
  405. ctx->engine = MBEDTLS_MD_ENGINE_PSA;
  406. } else
  407. #endif
  408. switch (md_info->type) {
  409. #if defined(MBEDTLS_MD5_C)
  410. case MBEDTLS_MD_MD5:
  411. ALLOC(md5);
  412. break;
  413. #endif
  414. #if defined(MBEDTLS_RIPEMD160_C)
  415. case MBEDTLS_MD_RIPEMD160:
  416. ALLOC(ripemd160);
  417. break;
  418. #endif
  419. #if defined(MBEDTLS_SHA1_C)
  420. case MBEDTLS_MD_SHA1:
  421. ALLOC(sha1);
  422. break;
  423. #endif
  424. #if defined(MBEDTLS_SHA224_C)
  425. case MBEDTLS_MD_SHA224:
  426. ALLOC(sha256);
  427. break;
  428. #endif
  429. #if defined(MBEDTLS_SHA256_C)
  430. case MBEDTLS_MD_SHA256:
  431. ALLOC(sha256);
  432. break;
  433. #endif
  434. #if defined(MBEDTLS_SHA384_C)
  435. case MBEDTLS_MD_SHA384:
  436. ALLOC(sha512);
  437. break;
  438. #endif
  439. #if defined(MBEDTLS_SHA512_C)
  440. case MBEDTLS_MD_SHA512:
  441. ALLOC(sha512);
  442. break;
  443. #endif
  444. #if defined(MBEDTLS_SHA3_C)
  445. case MBEDTLS_MD_SHA3_224:
  446. case MBEDTLS_MD_SHA3_256:
  447. case MBEDTLS_MD_SHA3_384:
  448. case MBEDTLS_MD_SHA3_512:
  449. ALLOC(sha3);
  450. break;
  451. #endif
  452. default:
  453. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  454. }
  455. #if defined(MBEDTLS_MD_C)
  456. if (hmac != 0) {
  457. ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
  458. if (ctx->hmac_ctx == NULL) {
  459. mbedtls_md_free(ctx);
  460. return MBEDTLS_ERR_MD_ALLOC_FAILED;
  461. }
  462. }
  463. #endif
  464. return 0;
  465. }
  466. #undef ALLOC
  467. int mbedtls_md_starts(mbedtls_md_context_t *ctx)
  468. {
  469. #if defined(MBEDTLS_MD_C)
  470. if (ctx == NULL || ctx->md_info == NULL) {
  471. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  472. }
  473. #endif
  474. #if defined(MBEDTLS_MD_SOME_PSA)
  475. if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
  476. psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
  477. psa_hash_abort(ctx->md_ctx);
  478. psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
  479. return mbedtls_md_error_from_psa(status);
  480. }
  481. #endif
  482. switch (ctx->md_info->type) {
  483. #if defined(MBEDTLS_MD5_C)
  484. case MBEDTLS_MD_MD5:
  485. return mbedtls_md5_starts(ctx->md_ctx);
  486. #endif
  487. #if defined(MBEDTLS_RIPEMD160_C)
  488. case MBEDTLS_MD_RIPEMD160:
  489. return mbedtls_ripemd160_starts(ctx->md_ctx);
  490. #endif
  491. #if defined(MBEDTLS_SHA1_C)
  492. case MBEDTLS_MD_SHA1:
  493. return mbedtls_sha1_starts(ctx->md_ctx);
  494. #endif
  495. #if defined(MBEDTLS_SHA224_C)
  496. case MBEDTLS_MD_SHA224:
  497. return mbedtls_sha256_starts(ctx->md_ctx, 1);
  498. #endif
  499. #if defined(MBEDTLS_SHA256_C)
  500. case MBEDTLS_MD_SHA256:
  501. return mbedtls_sha256_starts(ctx->md_ctx, 0);
  502. #endif
  503. #if defined(MBEDTLS_SHA384_C)
  504. case MBEDTLS_MD_SHA384:
  505. return mbedtls_sha512_starts(ctx->md_ctx, 1);
  506. #endif
  507. #if defined(MBEDTLS_SHA512_C)
  508. case MBEDTLS_MD_SHA512:
  509. return mbedtls_sha512_starts(ctx->md_ctx, 0);
  510. #endif
  511. #if defined(MBEDTLS_SHA3_C)
  512. case MBEDTLS_MD_SHA3_224:
  513. return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
  514. case MBEDTLS_MD_SHA3_256:
  515. return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
  516. case MBEDTLS_MD_SHA3_384:
  517. return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
  518. case MBEDTLS_MD_SHA3_512:
  519. return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
  520. #endif
  521. default:
  522. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  523. }
  524. }
  525. int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
  526. {
  527. #if defined(MBEDTLS_MD_C)
  528. if (ctx == NULL || ctx->md_info == NULL) {
  529. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  530. }
  531. #endif
  532. #if defined(MBEDTLS_MD_SOME_PSA)
  533. if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
  534. psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
  535. return mbedtls_md_error_from_psa(status);
  536. }
  537. #endif
  538. switch (ctx->md_info->type) {
  539. #if defined(MBEDTLS_MD5_C)
  540. case MBEDTLS_MD_MD5:
  541. return mbedtls_md5_update(ctx->md_ctx, input, ilen);
  542. #endif
  543. #if defined(MBEDTLS_RIPEMD160_C)
  544. case MBEDTLS_MD_RIPEMD160:
  545. return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
  546. #endif
  547. #if defined(MBEDTLS_SHA1_C)
  548. case MBEDTLS_MD_SHA1:
  549. return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
  550. #endif
  551. #if defined(MBEDTLS_SHA224_C)
  552. case MBEDTLS_MD_SHA224:
  553. return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
  554. #endif
  555. #if defined(MBEDTLS_SHA256_C)
  556. case MBEDTLS_MD_SHA256:
  557. return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
  558. #endif
  559. #if defined(MBEDTLS_SHA384_C)
  560. case MBEDTLS_MD_SHA384:
  561. return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
  562. #endif
  563. #if defined(MBEDTLS_SHA512_C)
  564. case MBEDTLS_MD_SHA512:
  565. return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
  566. #endif
  567. #if defined(MBEDTLS_SHA3_C)
  568. case MBEDTLS_MD_SHA3_224:
  569. case MBEDTLS_MD_SHA3_256:
  570. case MBEDTLS_MD_SHA3_384:
  571. case MBEDTLS_MD_SHA3_512:
  572. return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
  573. #endif
  574. default:
  575. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  576. }
  577. }
  578. int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
  579. {
  580. #if defined(MBEDTLS_MD_C)
  581. if (ctx == NULL || ctx->md_info == NULL) {
  582. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  583. }
  584. #endif
  585. #if defined(MBEDTLS_MD_SOME_PSA)
  586. if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
  587. size_t size = ctx->md_info->size;
  588. psa_status_t status = psa_hash_finish(ctx->md_ctx,
  589. output, size, &size);
  590. return mbedtls_md_error_from_psa(status);
  591. }
  592. #endif
  593. switch (ctx->md_info->type) {
  594. #if defined(MBEDTLS_MD5_C)
  595. case MBEDTLS_MD_MD5:
  596. return mbedtls_md5_finish(ctx->md_ctx, output);
  597. #endif
  598. #if defined(MBEDTLS_RIPEMD160_C)
  599. case MBEDTLS_MD_RIPEMD160:
  600. return mbedtls_ripemd160_finish(ctx->md_ctx, output);
  601. #endif
  602. #if defined(MBEDTLS_SHA1_C)
  603. case MBEDTLS_MD_SHA1:
  604. return mbedtls_sha1_finish(ctx->md_ctx, output);
  605. #endif
  606. #if defined(MBEDTLS_SHA224_C)
  607. case MBEDTLS_MD_SHA224:
  608. return mbedtls_sha256_finish(ctx->md_ctx, output);
  609. #endif
  610. #if defined(MBEDTLS_SHA256_C)
  611. case MBEDTLS_MD_SHA256:
  612. return mbedtls_sha256_finish(ctx->md_ctx, output);
  613. #endif
  614. #if defined(MBEDTLS_SHA384_C)
  615. case MBEDTLS_MD_SHA384:
  616. return mbedtls_sha512_finish(ctx->md_ctx, output);
  617. #endif
  618. #if defined(MBEDTLS_SHA512_C)
  619. case MBEDTLS_MD_SHA512:
  620. return mbedtls_sha512_finish(ctx->md_ctx, output);
  621. #endif
  622. #if defined(MBEDTLS_SHA3_C)
  623. case MBEDTLS_MD_SHA3_224:
  624. case MBEDTLS_MD_SHA3_256:
  625. case MBEDTLS_MD_SHA3_384:
  626. case MBEDTLS_MD_SHA3_512:
  627. return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
  628. #endif
  629. default:
  630. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  631. }
  632. }
  633. int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
  634. unsigned char *output)
  635. {
  636. if (md_info == NULL) {
  637. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  638. }
  639. #if defined(MBEDTLS_MD_SOME_PSA)
  640. if (md_can_use_psa(md_info)) {
  641. size_t size = md_info->size;
  642. psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
  643. input, ilen,
  644. output, size, &size);
  645. return mbedtls_md_error_from_psa(status);
  646. }
  647. #endif
  648. switch (md_info->type) {
  649. #if defined(MBEDTLS_MD5_C)
  650. case MBEDTLS_MD_MD5:
  651. return mbedtls_md5(input, ilen, output);
  652. #endif
  653. #if defined(MBEDTLS_RIPEMD160_C)
  654. case MBEDTLS_MD_RIPEMD160:
  655. return mbedtls_ripemd160(input, ilen, output);
  656. #endif
  657. #if defined(MBEDTLS_SHA1_C)
  658. case MBEDTLS_MD_SHA1:
  659. return mbedtls_sha1(input, ilen, output);
  660. #endif
  661. #if defined(MBEDTLS_SHA224_C)
  662. case MBEDTLS_MD_SHA224:
  663. return mbedtls_sha256(input, ilen, output, 1);
  664. #endif
  665. #if defined(MBEDTLS_SHA256_C)
  666. case MBEDTLS_MD_SHA256:
  667. return mbedtls_sha256(input, ilen, output, 0);
  668. #endif
  669. #if defined(MBEDTLS_SHA384_C)
  670. case MBEDTLS_MD_SHA384:
  671. return mbedtls_sha512(input, ilen, output, 1);
  672. #endif
  673. #if defined(MBEDTLS_SHA512_C)
  674. case MBEDTLS_MD_SHA512:
  675. return mbedtls_sha512(input, ilen, output, 0);
  676. #endif
  677. #if defined(MBEDTLS_SHA3_C)
  678. case MBEDTLS_MD_SHA3_224:
  679. return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
  680. case MBEDTLS_MD_SHA3_256:
  681. return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
  682. case MBEDTLS_MD_SHA3_384:
  683. return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
  684. case MBEDTLS_MD_SHA3_512:
  685. return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
  686. #endif
  687. default:
  688. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  689. }
  690. }
  691. unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
  692. {
  693. if (md_info == NULL) {
  694. return 0;
  695. }
  696. return md_info->size;
  697. }
  698. mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
  699. {
  700. if (md_info == NULL) {
  701. return MBEDTLS_MD_NONE;
  702. }
  703. return md_info->type;
  704. }
  705. #if defined(MBEDTLS_PSA_CRYPTO_CLIENT)
  706. int mbedtls_md_error_from_psa(psa_status_t status)
  707. {
  708. return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
  709. psa_generic_status_to_mbedtls);
  710. }
  711. #endif /* MBEDTLS_PSA_CRYPTO_CLIENT */
  712. /************************************************************************
  713. * Functions above this separator are part of MBEDTLS_MD_LIGHT, *
  714. * functions below are only available when MBEDTLS_MD_C is set. *
  715. ************************************************************************/
  716. #if defined(MBEDTLS_MD_C)
  717. /*
  718. * Reminder: update profiles in x509_crt.c when adding a new hash!
  719. */
  720. static const int supported_digests[] = {
  721. #if defined(MBEDTLS_MD_CAN_SHA512)
  722. MBEDTLS_MD_SHA512,
  723. #endif
  724. #if defined(MBEDTLS_MD_CAN_SHA384)
  725. MBEDTLS_MD_SHA384,
  726. #endif
  727. #if defined(MBEDTLS_MD_CAN_SHA256)
  728. MBEDTLS_MD_SHA256,
  729. #endif
  730. #if defined(MBEDTLS_MD_CAN_SHA224)
  731. MBEDTLS_MD_SHA224,
  732. #endif
  733. #if defined(MBEDTLS_MD_CAN_SHA1)
  734. MBEDTLS_MD_SHA1,
  735. #endif
  736. #if defined(MBEDTLS_MD_CAN_RIPEMD160)
  737. MBEDTLS_MD_RIPEMD160,
  738. #endif
  739. #if defined(MBEDTLS_MD_CAN_MD5)
  740. MBEDTLS_MD_MD5,
  741. #endif
  742. #if defined(MBEDTLS_MD_CAN_SHA3_224)
  743. MBEDTLS_MD_SHA3_224,
  744. #endif
  745. #if defined(MBEDTLS_MD_CAN_SHA3_256)
  746. MBEDTLS_MD_SHA3_256,
  747. #endif
  748. #if defined(MBEDTLS_MD_CAN_SHA3_384)
  749. MBEDTLS_MD_SHA3_384,
  750. #endif
  751. #if defined(MBEDTLS_MD_CAN_SHA3_512)
  752. MBEDTLS_MD_SHA3_512,
  753. #endif
  754. MBEDTLS_MD_NONE
  755. };
  756. const int *mbedtls_md_list(void)
  757. {
  758. return supported_digests;
  759. }
  760. typedef struct {
  761. const char *md_name;
  762. mbedtls_md_type_t md_type;
  763. } md_name_entry;
  764. static const md_name_entry md_names[] = {
  765. #if defined(MBEDTLS_MD_CAN_MD5)
  766. { "MD5", MBEDTLS_MD_MD5 },
  767. #endif
  768. #if defined(MBEDTLS_MD_CAN_RIPEMD160)
  769. { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
  770. #endif
  771. #if defined(MBEDTLS_MD_CAN_SHA1)
  772. { "SHA1", MBEDTLS_MD_SHA1 },
  773. { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
  774. #endif
  775. #if defined(MBEDTLS_MD_CAN_SHA224)
  776. { "SHA224", MBEDTLS_MD_SHA224 },
  777. #endif
  778. #if defined(MBEDTLS_MD_CAN_SHA256)
  779. { "SHA256", MBEDTLS_MD_SHA256 },
  780. #endif
  781. #if defined(MBEDTLS_MD_CAN_SHA384)
  782. { "SHA384", MBEDTLS_MD_SHA384 },
  783. #endif
  784. #if defined(MBEDTLS_MD_CAN_SHA512)
  785. { "SHA512", MBEDTLS_MD_SHA512 },
  786. #endif
  787. #if defined(MBEDTLS_MD_CAN_SHA3_224)
  788. { "SHA3-224", MBEDTLS_MD_SHA3_224 },
  789. #endif
  790. #if defined(MBEDTLS_MD_CAN_SHA3_256)
  791. { "SHA3-256", MBEDTLS_MD_SHA3_256 },
  792. #endif
  793. #if defined(MBEDTLS_MD_CAN_SHA3_384)
  794. { "SHA3-384", MBEDTLS_MD_SHA3_384 },
  795. #endif
  796. #if defined(MBEDTLS_MD_CAN_SHA3_512)
  797. { "SHA3-512", MBEDTLS_MD_SHA3_512 },
  798. #endif
  799. { NULL, MBEDTLS_MD_NONE },
  800. };
  801. const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
  802. {
  803. if (NULL == md_name) {
  804. return NULL;
  805. }
  806. const md_name_entry *entry = md_names;
  807. while (entry->md_name != NULL &&
  808. strcmp(entry->md_name, md_name) != 0) {
  809. ++entry;
  810. }
  811. return mbedtls_md_info_from_type(entry->md_type);
  812. }
  813. const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
  814. {
  815. if (md_info == NULL) {
  816. return NULL;
  817. }
  818. const md_name_entry *entry = md_names;
  819. while (entry->md_type != MBEDTLS_MD_NONE &&
  820. entry->md_type != md_info->type) {
  821. ++entry;
  822. }
  823. return entry->md_name;
  824. }
  825. const mbedtls_md_info_t *mbedtls_md_info_from_ctx(
  826. const mbedtls_md_context_t *ctx)
  827. {
  828. if (ctx == NULL) {
  829. return NULL;
  830. }
  831. return ctx->MBEDTLS_PRIVATE(md_info);
  832. }
  833. #if defined(MBEDTLS_FS_IO)
  834. int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
  835. {
  836. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  837. FILE *f;
  838. size_t n;
  839. mbedtls_md_context_t ctx;
  840. unsigned char buf[1024];
  841. if (md_info == NULL) {
  842. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  843. }
  844. if ((f = fopen(path, "rb")) == NULL) {
  845. return MBEDTLS_ERR_MD_FILE_IO_ERROR;
  846. }
  847. /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
  848. mbedtls_setbuf(f, NULL);
  849. mbedtls_md_init(&ctx);
  850. if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
  851. goto cleanup;
  852. }
  853. if ((ret = mbedtls_md_starts(&ctx)) != 0) {
  854. goto cleanup;
  855. }
  856. while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
  857. if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
  858. goto cleanup;
  859. }
  860. }
  861. if (ferror(f) != 0) {
  862. ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
  863. } else {
  864. ret = mbedtls_md_finish(&ctx, output);
  865. }
  866. cleanup:
  867. mbedtls_platform_zeroize(buf, sizeof(buf));
  868. fclose(f);
  869. mbedtls_md_free(&ctx);
  870. return ret;
  871. }
  872. #endif /* MBEDTLS_FS_IO */
  873. int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
  874. {
  875. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  876. unsigned char sum[MBEDTLS_MD_MAX_SIZE];
  877. unsigned char *ipad, *opad;
  878. if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
  879. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  880. }
  881. if (keylen > (size_t) ctx->md_info->block_size) {
  882. if ((ret = mbedtls_md_starts(ctx)) != 0) {
  883. goto cleanup;
  884. }
  885. if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
  886. goto cleanup;
  887. }
  888. if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
  889. goto cleanup;
  890. }
  891. keylen = ctx->md_info->size;
  892. key = sum;
  893. }
  894. ipad = (unsigned char *) ctx->hmac_ctx;
  895. opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
  896. memset(ipad, 0x36, ctx->md_info->block_size);
  897. memset(opad, 0x5C, ctx->md_info->block_size);
  898. mbedtls_xor(ipad, ipad, key, keylen);
  899. mbedtls_xor(opad, opad, key, keylen);
  900. if ((ret = mbedtls_md_starts(ctx)) != 0) {
  901. goto cleanup;
  902. }
  903. if ((ret = mbedtls_md_update(ctx, ipad,
  904. ctx->md_info->block_size)) != 0) {
  905. goto cleanup;
  906. }
  907. cleanup:
  908. mbedtls_platform_zeroize(sum, sizeof(sum));
  909. return ret;
  910. }
  911. int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
  912. {
  913. if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
  914. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  915. }
  916. return mbedtls_md_update(ctx, input, ilen);
  917. }
  918. int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
  919. {
  920. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  921. unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
  922. unsigned char *opad;
  923. if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
  924. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  925. }
  926. opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
  927. if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
  928. return ret;
  929. }
  930. if ((ret = mbedtls_md_starts(ctx)) != 0) {
  931. return ret;
  932. }
  933. if ((ret = mbedtls_md_update(ctx, opad,
  934. ctx->md_info->block_size)) != 0) {
  935. return ret;
  936. }
  937. if ((ret = mbedtls_md_update(ctx, tmp,
  938. ctx->md_info->size)) != 0) {
  939. return ret;
  940. }
  941. return mbedtls_md_finish(ctx, output);
  942. }
  943. int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
  944. {
  945. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  946. unsigned char *ipad;
  947. if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
  948. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  949. }
  950. ipad = (unsigned char *) ctx->hmac_ctx;
  951. if ((ret = mbedtls_md_starts(ctx)) != 0) {
  952. return ret;
  953. }
  954. return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
  955. }
  956. int mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
  957. const unsigned char *key, size_t keylen,
  958. const unsigned char *input, size_t ilen,
  959. unsigned char *output)
  960. {
  961. mbedtls_md_context_t ctx;
  962. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  963. if (md_info == NULL) {
  964. return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
  965. }
  966. mbedtls_md_init(&ctx);
  967. if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
  968. goto cleanup;
  969. }
  970. if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
  971. goto cleanup;
  972. }
  973. if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
  974. goto cleanup;
  975. }
  976. if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
  977. goto cleanup;
  978. }
  979. cleanup:
  980. mbedtls_md_free(&ctx);
  981. return ret;
  982. }
  983. #endif /* MBEDTLS_MD_C */
  984. #endif /* MBEDTLS_MD_LIGHT */