1817466cbSJens Wiklander /** 27901324dSJerome Forissier * \file md.c 3817466cbSJens Wiklander * 4*b0563631STom Van Eyck * \brief Generic message digest wrapper for Mbed TLS 5817466cbSJens Wiklander * 6817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com> 7817466cbSJens Wiklander * 87901324dSJerome Forissier * Copyright The Mbed TLS Contributors 9*b0563631STom Van Eyck * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 10817466cbSJens Wiklander */ 11817466cbSJens Wiklander 127901324dSJerome Forissier #include "common.h" 13817466cbSJens Wiklander 1432b31808SJens Wiklander /* 1532b31808SJens Wiklander * Availability of functions in this module is controlled by two 1632b31808SJens Wiklander * feature macros: 1732b31808SJens Wiklander * - MBEDTLS_MD_C enables the whole module; 1832b31808SJens Wiklander * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing 1932b31808SJens Wiklander * most hash metadata (everything except string names); is it 2032b31808SJens Wiklander * automatically set whenever MBEDTLS_MD_C is defined. 2132b31808SJens Wiklander * 2232b31808SJens Wiklander * In this file, functions from MD_LIGHT are at the top, MD_C at the end. 2332b31808SJens Wiklander * 2432b31808SJens Wiklander * In the future we may want to change the contract of some functions 2532b31808SJens Wiklander * (behaviour with NULL arguments) depending on whether MD_C is defined or 2632b31808SJens Wiklander * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary. 2732b31808SJens Wiklander * 2832b31808SJens Wiklander * For these reasons, we're keeping MD_LIGHT internal for now. 2932b31808SJens Wiklander */ 3032b31808SJens Wiklander #if defined(MBEDTLS_MD_LIGHT) 31817466cbSJens Wiklander 32817466cbSJens Wiklander #include "mbedtls/md.h" 3332b31808SJens Wiklander #include "md_wrap.h" 343d3b0591SJens Wiklander #include "mbedtls/platform_util.h" 3511fa71b9SJerome Forissier #include "mbedtls/error.h" 3611fa71b9SJerome Forissier 3711fa71b9SJerome Forissier #include "mbedtls/md5.h" 3811fa71b9SJerome Forissier #include "mbedtls/ripemd160.h" 3911fa71b9SJerome Forissier #include "mbedtls/sha1.h" 4011fa71b9SJerome Forissier #include "mbedtls/sha256.h" 4111fa71b9SJerome Forissier #include "mbedtls/sha512.h" 42*b0563631STom Van Eyck #include "mbedtls/sha3.h" 43*b0563631STom Van Eyck 44*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_C) 45*b0563631STom Van Eyck #include <psa/crypto.h> 46*b0563631STom Van Eyck #include "md_psa.h" 47*b0563631STom Van Eyck #include "psa_util_internal.h" 48*b0563631STom Van Eyck #endif 49817466cbSJens Wiklander 5032b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 5132b31808SJens Wiklander #include "psa_crypto_core.h" 52817466cbSJens Wiklander #endif 53817466cbSJens Wiklander 5432b31808SJens Wiklander #include "mbedtls/platform.h" 5532b31808SJens Wiklander 56817466cbSJens Wiklander #include <string.h> 57817466cbSJens Wiklander 58817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 59817466cbSJens Wiklander #include <stdio.h> 60817466cbSJens Wiklander #endif 61817466cbSJens Wiklander 62*b0563631STom Van Eyck /* See comment above MBEDTLS_MD_MAX_SIZE in md.h */ 63*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE 64*b0563631STom Van Eyck #error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE" 65*b0563631STom Van Eyck #endif 66*b0563631STom Van Eyck 67*b0563631STom Van Eyck #if defined(MBEDTLS_MD_C) 68*b0563631STom Van Eyck #define MD_INFO(type, out_size, block_size) type, out_size, block_size, 69*b0563631STom Van Eyck #else 70*b0563631STom Van Eyck #define MD_INFO(type, out_size, block_size) type, out_size, 71*b0563631STom Van Eyck #endif 72*b0563631STom Van Eyck 7332b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_MD5) 74*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_md5_info = { 75*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_MD5, 16, 64) 7611fa71b9SJerome Forissier }; 7711fa71b9SJerome Forissier #endif 7811fa71b9SJerome Forissier 7932b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_RIPEMD160) 80*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_ripemd160_info = { 81*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64) 8211fa71b9SJerome Forissier }; 8311fa71b9SJerome Forissier #endif 8411fa71b9SJerome Forissier 8532b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA1) 86*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha1_info = { 87*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA1, 20, 64) 8811fa71b9SJerome Forissier }; 8911fa71b9SJerome Forissier #endif 9011fa71b9SJerome Forissier 9132b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA224) 92*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha224_info = { 93*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA224, 28, 64) 9411fa71b9SJerome Forissier }; 9532b31808SJens Wiklander #endif 9611fa71b9SJerome Forissier 9732b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA256) 98*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha256_info = { 99*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA256, 32, 64) 10011fa71b9SJerome Forissier }; 10111fa71b9SJerome Forissier #endif 10211fa71b9SJerome Forissier 10332b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA384) 104*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha384_info = { 105*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA384, 48, 128) 10611fa71b9SJerome Forissier }; 10711fa71b9SJerome Forissier #endif 10811fa71b9SJerome Forissier 10932b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512) 110*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha512_info = { 111*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA512, 64, 128) 112*b0563631STom Van Eyck }; 113*b0563631STom Van Eyck #endif 114*b0563631STom Van Eyck 115*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224) 116*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_224_info = { 117*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144) 118*b0563631STom Van Eyck }; 119*b0563631STom Van Eyck #endif 120*b0563631STom Van Eyck 121*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256) 122*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_256_info = { 123*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136) 124*b0563631STom Van Eyck }; 125*b0563631STom Van Eyck #endif 126*b0563631STom Van Eyck 127*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384) 128*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_384_info = { 129*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104) 130*b0563631STom Van Eyck }; 131*b0563631STom Van Eyck #endif 132*b0563631STom Van Eyck 133*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512) 134*b0563631STom Van Eyck static const mbedtls_md_info_t mbedtls_sha3_512_info = { 135*b0563631STom Van Eyck MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72) 13611fa71b9SJerome Forissier }; 13711fa71b9SJerome Forissier #endif 13811fa71b9SJerome Forissier 139817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type) 140817466cbSJens Wiklander { 14132b31808SJens Wiklander switch (md_type) { 14232b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_MD5) 143817466cbSJens Wiklander case MBEDTLS_MD_MD5: 14432b31808SJens Wiklander return &mbedtls_md5_info; 145817466cbSJens Wiklander #endif 14632b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_RIPEMD160) 147817466cbSJens Wiklander case MBEDTLS_MD_RIPEMD160: 14832b31808SJens Wiklander return &mbedtls_ripemd160_info; 149817466cbSJens Wiklander #endif 15032b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA1) 151817466cbSJens Wiklander case MBEDTLS_MD_SHA1: 15232b31808SJens Wiklander return &mbedtls_sha1_info; 153817466cbSJens Wiklander #endif 15432b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA224) 155817466cbSJens Wiklander case MBEDTLS_MD_SHA224: 15632b31808SJens Wiklander return &mbedtls_sha224_info; 15732b31808SJens Wiklander #endif 15832b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA256) 159817466cbSJens Wiklander case MBEDTLS_MD_SHA256: 16032b31808SJens Wiklander return &mbedtls_sha256_info; 161817466cbSJens Wiklander #endif 16232b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA384) 163817466cbSJens Wiklander case MBEDTLS_MD_SHA384: 16432b31808SJens Wiklander return &mbedtls_sha384_info; 16511fa71b9SJerome Forissier #endif 16632b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512) 167817466cbSJens Wiklander case MBEDTLS_MD_SHA512: 16832b31808SJens Wiklander return &mbedtls_sha512_info; 169817466cbSJens Wiklander #endif 170*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224) 171*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 172*b0563631STom Van Eyck return &mbedtls_sha3_224_info; 173*b0563631STom Van Eyck #endif 174*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256) 175*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 176*b0563631STom Van Eyck return &mbedtls_sha3_256_info; 177*b0563631STom Van Eyck #endif 178*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384) 179*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 180*b0563631STom Van Eyck return &mbedtls_sha3_384_info; 181*b0563631STom Van Eyck #endif 182*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512) 183*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 184*b0563631STom Van Eyck return &mbedtls_sha3_512_info; 185*b0563631STom Van Eyck #endif 186817466cbSJens Wiklander default: 18732b31808SJens Wiklander return NULL; 188817466cbSJens Wiklander } 189817466cbSJens Wiklander } 190817466cbSJens Wiklander 19132b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 19232b31808SJens Wiklander static psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info) 19332b31808SJens Wiklander { 19432b31808SJens Wiklander switch (info->type) { 19532b31808SJens Wiklander #if defined(MBEDTLS_MD_MD5_VIA_PSA) 19632b31808SJens Wiklander case MBEDTLS_MD_MD5: 19732b31808SJens Wiklander return PSA_ALG_MD5; 19832b31808SJens Wiklander #endif 19932b31808SJens Wiklander #if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA) 20032b31808SJens Wiklander case MBEDTLS_MD_RIPEMD160: 20132b31808SJens Wiklander return PSA_ALG_RIPEMD160; 20232b31808SJens Wiklander #endif 20332b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA1_VIA_PSA) 20432b31808SJens Wiklander case MBEDTLS_MD_SHA1: 20532b31808SJens Wiklander return PSA_ALG_SHA_1; 20632b31808SJens Wiklander #endif 20732b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA224_VIA_PSA) 20832b31808SJens Wiklander case MBEDTLS_MD_SHA224: 20932b31808SJens Wiklander return PSA_ALG_SHA_224; 21032b31808SJens Wiklander #endif 21132b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA256_VIA_PSA) 21232b31808SJens Wiklander case MBEDTLS_MD_SHA256: 21332b31808SJens Wiklander return PSA_ALG_SHA_256; 21432b31808SJens Wiklander #endif 21532b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA384_VIA_PSA) 21632b31808SJens Wiklander case MBEDTLS_MD_SHA384: 21732b31808SJens Wiklander return PSA_ALG_SHA_384; 21832b31808SJens Wiklander #endif 21932b31808SJens Wiklander #if defined(MBEDTLS_MD_SHA512_VIA_PSA) 22032b31808SJens Wiklander case MBEDTLS_MD_SHA512: 22132b31808SJens Wiklander return PSA_ALG_SHA_512; 22232b31808SJens Wiklander #endif 223*b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_224_VIA_PSA) 224*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 225*b0563631STom Van Eyck return PSA_ALG_SHA3_224; 226*b0563631STom Van Eyck #endif 227*b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_256_VIA_PSA) 228*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 229*b0563631STom Van Eyck return PSA_ALG_SHA3_256; 230*b0563631STom Van Eyck #endif 231*b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_384_VIA_PSA) 232*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 233*b0563631STom Van Eyck return PSA_ALG_SHA3_384; 234*b0563631STom Van Eyck #endif 235*b0563631STom Van Eyck #if defined(MBEDTLS_MD_SHA3_512_VIA_PSA) 236*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 237*b0563631STom Van Eyck return PSA_ALG_SHA3_512; 238*b0563631STom Van Eyck #endif 23932b31808SJens Wiklander default: 24032b31808SJens Wiklander return PSA_ALG_NONE; 24132b31808SJens Wiklander } 24232b31808SJens Wiklander } 24332b31808SJens Wiklander 24432b31808SJens Wiklander static int md_can_use_psa(const mbedtls_md_info_t *info) 24532b31808SJens Wiklander { 24632b31808SJens Wiklander psa_algorithm_t alg = psa_alg_of_md(info); 24732b31808SJens Wiklander if (alg == PSA_ALG_NONE) { 24832b31808SJens Wiklander return 0; 24932b31808SJens Wiklander } 25032b31808SJens Wiklander 25132b31808SJens Wiklander return psa_can_do_hash(alg); 25232b31808SJens Wiklander } 25332b31808SJens Wiklander #endif /* MBEDTLS_MD_SOME_PSA */ 25432b31808SJens Wiklander 255817466cbSJens Wiklander void mbedtls_md_init(mbedtls_md_context_t *ctx) 256817466cbSJens Wiklander { 25732b31808SJens Wiklander /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */ 258817466cbSJens Wiklander memset(ctx, 0, sizeof(mbedtls_md_context_t)); 259817466cbSJens Wiklander } 260817466cbSJens Wiklander 261817466cbSJens Wiklander void mbedtls_md_free(mbedtls_md_context_t *ctx) 262817466cbSJens Wiklander { 26332b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) { 264817466cbSJens Wiklander return; 26532b31808SJens Wiklander } 266817466cbSJens Wiklander 26732b31808SJens Wiklander if (ctx->md_ctx != NULL) { 26832b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 26932b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) { 27032b31808SJens Wiklander psa_hash_abort(ctx->md_ctx); 27132b31808SJens Wiklander } else 27211fa71b9SJerome Forissier #endif 27332b31808SJens Wiklander switch (ctx->md_info->type) { 27411fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 27511fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 27611fa71b9SJerome Forissier mbedtls_md5_free(ctx->md_ctx); 27711fa71b9SJerome Forissier break; 27811fa71b9SJerome Forissier #endif 27911fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 28011fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 28111fa71b9SJerome Forissier mbedtls_ripemd160_free(ctx->md_ctx); 28211fa71b9SJerome Forissier break; 28311fa71b9SJerome Forissier #endif 28411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 28511fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 28611fa71b9SJerome Forissier mbedtls_sha1_free(ctx->md_ctx); 28711fa71b9SJerome Forissier break; 28811fa71b9SJerome Forissier #endif 28932b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 29011fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 29132b31808SJens Wiklander mbedtls_sha256_free(ctx->md_ctx); 29232b31808SJens Wiklander break; 29332b31808SJens Wiklander #endif 29432b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C) 29511fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 29611fa71b9SJerome Forissier mbedtls_sha256_free(ctx->md_ctx); 29711fa71b9SJerome Forissier break; 29811fa71b9SJerome Forissier #endif 29932b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 30011fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 30132b31808SJens Wiklander mbedtls_sha512_free(ctx->md_ctx); 30232b31808SJens Wiklander break; 30311fa71b9SJerome Forissier #endif 30432b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C) 30511fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 30611fa71b9SJerome Forissier mbedtls_sha512_free(ctx->md_ctx); 30711fa71b9SJerome Forissier break; 30811fa71b9SJerome Forissier #endif 309*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 310*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 311*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 312*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 313*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 314*b0563631STom Van Eyck mbedtls_sha3_free(ctx->md_ctx); 315*b0563631STom Van Eyck break; 316*b0563631STom Van Eyck #endif 31711fa71b9SJerome Forissier default: 31811fa71b9SJerome Forissier /* Shouldn't happen */ 31911fa71b9SJerome Forissier break; 32011fa71b9SJerome Forissier } 32111fa71b9SJerome Forissier mbedtls_free(ctx->md_ctx); 32211fa71b9SJerome Forissier } 323817466cbSJens Wiklander 32432b31808SJens Wiklander #if defined(MBEDTLS_MD_C) 32532b31808SJens Wiklander if (ctx->hmac_ctx != NULL) { 326*b0563631STom Van Eyck mbedtls_zeroize_and_free(ctx->hmac_ctx, 3273d3b0591SJens Wiklander 2 * ctx->md_info->block_size); 328817466cbSJens Wiklander } 32932b31808SJens Wiklander #endif 330817466cbSJens Wiklander 3313d3b0591SJens Wiklander mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t)); 332817466cbSJens Wiklander } 333817466cbSJens Wiklander 334817466cbSJens Wiklander int mbedtls_md_clone(mbedtls_md_context_t *dst, 335817466cbSJens Wiklander const mbedtls_md_context_t *src) 336817466cbSJens Wiklander { 337817466cbSJens Wiklander if (dst == NULL || dst->md_info == NULL || 338817466cbSJens Wiklander src == NULL || src->md_info == NULL || 33932b31808SJens Wiklander dst->md_info != src->md_info) { 34032b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 341817466cbSJens Wiklander } 342817466cbSJens Wiklander 34332b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 34432b31808SJens Wiklander if (src->engine != dst->engine) { 34532b31808SJens Wiklander /* This can happen with src set to legacy because PSA wasn't ready 34632b31808SJens Wiklander * yet, and dst to PSA because it became ready in the meantime. 34732b31808SJens Wiklander * We currently don't support that case (we'd need to re-allocate 34832b31808SJens Wiklander * md_ctx to the size of the appropriate MD context). */ 34932b31808SJens Wiklander return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE; 35032b31808SJens Wiklander } 35132b31808SJens Wiklander 35232b31808SJens Wiklander if (src->engine == MBEDTLS_MD_ENGINE_PSA) { 35332b31808SJens Wiklander psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx); 35432b31808SJens Wiklander return mbedtls_md_error_from_psa(status); 35532b31808SJens Wiklander } 35611fa71b9SJerome Forissier #endif 35732b31808SJens Wiklander 35832b31808SJens Wiklander switch (src->md_info->type) { 35911fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 36011fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 36111fa71b9SJerome Forissier mbedtls_md5_clone(dst->md_ctx, src->md_ctx); 36211fa71b9SJerome Forissier break; 36311fa71b9SJerome Forissier #endif 36411fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 36511fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 36611fa71b9SJerome Forissier mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx); 36711fa71b9SJerome Forissier break; 36811fa71b9SJerome Forissier #endif 36911fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 37011fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 37111fa71b9SJerome Forissier mbedtls_sha1_clone(dst->md_ctx, src->md_ctx); 37211fa71b9SJerome Forissier break; 37311fa71b9SJerome Forissier #endif 37432b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 37511fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 37632b31808SJens Wiklander mbedtls_sha256_clone(dst->md_ctx, src->md_ctx); 37732b31808SJens Wiklander break; 37832b31808SJens Wiklander #endif 37932b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C) 38011fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 38111fa71b9SJerome Forissier mbedtls_sha256_clone(dst->md_ctx, src->md_ctx); 38211fa71b9SJerome Forissier break; 38311fa71b9SJerome Forissier #endif 38432b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 38511fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 38632b31808SJens Wiklander mbedtls_sha512_clone(dst->md_ctx, src->md_ctx); 38732b31808SJens Wiklander break; 38811fa71b9SJerome Forissier #endif 38932b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C) 39011fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 39111fa71b9SJerome Forissier mbedtls_sha512_clone(dst->md_ctx, src->md_ctx); 39211fa71b9SJerome Forissier break; 39311fa71b9SJerome Forissier #endif 394*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 395*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 396*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 397*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 398*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 399*b0563631STom Van Eyck mbedtls_sha3_clone(dst->md_ctx, src->md_ctx); 400*b0563631STom Van Eyck break; 401*b0563631STom Van Eyck #endif 40211fa71b9SJerome Forissier default: 40332b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 40411fa71b9SJerome Forissier } 405817466cbSJens Wiklander 40612484fc7SEdison Ai if (dst->hmac_ctx != NULL && src->hmac_ctx != NULL) 40712484fc7SEdison Ai memcpy(dst->hmac_ctx, src->hmac_ctx, 2 * src->md_info->block_size); 40812484fc7SEdison Ai 40932b31808SJens Wiklander return 0; 410817466cbSJens Wiklander } 411817466cbSJens Wiklander 41211fa71b9SJerome Forissier #define ALLOC(type) \ 41311fa71b9SJerome Forissier do { \ 41411fa71b9SJerome Forissier ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \ 41511fa71b9SJerome Forissier if (ctx->md_ctx == NULL) \ 41632b31808SJens Wiklander return MBEDTLS_ERR_MD_ALLOC_FAILED; \ 41711fa71b9SJerome Forissier mbedtls_##type##_init(ctx->md_ctx); \ 41811fa71b9SJerome Forissier } \ 41911fa71b9SJerome Forissier while (0) 42011fa71b9SJerome Forissier 421817466cbSJens Wiklander int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac) 422817466cbSJens Wiklander { 423*b0563631STom Van Eyck #if defined(MBEDTLS_MD_C) 424*b0563631STom Van Eyck if (ctx == NULL) { 425*b0563631STom Van Eyck return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 426*b0563631STom Van Eyck } 427*b0563631STom Van Eyck #endif 428*b0563631STom Van Eyck if (md_info == NULL) { 42932b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 43032b31808SJens Wiklander } 431817466cbSJens Wiklander 4327901324dSJerome Forissier ctx->md_info = md_info; 4337901324dSJerome Forissier ctx->md_ctx = NULL; 43432b31808SJens Wiklander #if defined(MBEDTLS_MD_C) 4357901324dSJerome Forissier ctx->hmac_ctx = NULL; 43632b31808SJens Wiklander #else 43732b31808SJens Wiklander if (hmac != 0) { 43832b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 43932b31808SJens Wiklander } 44032b31808SJens Wiklander #endif 4417901324dSJerome Forissier 44232b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 44332b31808SJens Wiklander if (md_can_use_psa(ctx->md_info)) { 44432b31808SJens Wiklander ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t)); 44532b31808SJens Wiklander if (ctx->md_ctx == NULL) { 44632b31808SJens Wiklander return MBEDTLS_ERR_MD_ALLOC_FAILED; 44732b31808SJens Wiklander } 44832b31808SJens Wiklander ctx->engine = MBEDTLS_MD_ENGINE_PSA; 44932b31808SJens Wiklander } else 45011fa71b9SJerome Forissier #endif 45132b31808SJens Wiklander switch (md_info->type) { 45211fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 45311fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 45411fa71b9SJerome Forissier ALLOC(md5); 45511fa71b9SJerome Forissier break; 45611fa71b9SJerome Forissier #endif 45711fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 45811fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 45911fa71b9SJerome Forissier ALLOC(ripemd160); 46011fa71b9SJerome Forissier break; 46111fa71b9SJerome Forissier #endif 46211fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 46311fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 46411fa71b9SJerome Forissier ALLOC(sha1); 46511fa71b9SJerome Forissier break; 46611fa71b9SJerome Forissier #endif 46732b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 46811fa71b9SJerome Forissier case MBEDTLS_MD_SHA224: 46932b31808SJens Wiklander ALLOC(sha256); 47032b31808SJens Wiklander break; 47132b31808SJens Wiklander #endif 47232b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C) 47311fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 47411fa71b9SJerome Forissier ALLOC(sha256); 47511fa71b9SJerome Forissier break; 47611fa71b9SJerome Forissier #endif 47732b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 47811fa71b9SJerome Forissier case MBEDTLS_MD_SHA384: 47932b31808SJens Wiklander ALLOC(sha512); 48032b31808SJens Wiklander break; 48111fa71b9SJerome Forissier #endif 48232b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C) 48311fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 48411fa71b9SJerome Forissier ALLOC(sha512); 48511fa71b9SJerome Forissier break; 48611fa71b9SJerome Forissier #endif 487*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 488*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 489*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 490*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 491*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 492*b0563631STom Van Eyck ALLOC(sha3); 493*b0563631STom Van Eyck break; 494*b0563631STom Van Eyck #endif 49511fa71b9SJerome Forissier default: 49632b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 49711fa71b9SJerome Forissier } 498817466cbSJens Wiklander 49932b31808SJens Wiklander #if defined(MBEDTLS_MD_C) 50032b31808SJens Wiklander if (hmac != 0) { 501817466cbSJens Wiklander ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size); 50232b31808SJens Wiklander if (ctx->hmac_ctx == NULL) { 50311fa71b9SJerome Forissier mbedtls_md_free(ctx); 50432b31808SJens Wiklander return MBEDTLS_ERR_MD_ALLOC_FAILED; 505817466cbSJens Wiklander } 506817466cbSJens Wiklander } 50732b31808SJens Wiklander #endif 508817466cbSJens Wiklander 50932b31808SJens Wiklander return 0; 510817466cbSJens Wiklander } 51111fa71b9SJerome Forissier #undef ALLOC 512817466cbSJens Wiklander 513817466cbSJens Wiklander int mbedtls_md_starts(mbedtls_md_context_t *ctx) 514817466cbSJens Wiklander { 515*b0563631STom Van Eyck #if defined(MBEDTLS_MD_C) 51632b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) { 51732b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 51832b31808SJens Wiklander } 519*b0563631STom Van Eyck #endif 520817466cbSJens Wiklander 52132b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 52232b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) { 52332b31808SJens Wiklander psa_algorithm_t alg = psa_alg_of_md(ctx->md_info); 52432b31808SJens Wiklander psa_hash_abort(ctx->md_ctx); 52532b31808SJens Wiklander psa_status_t status = psa_hash_setup(ctx->md_ctx, alg); 52632b31808SJens Wiklander return mbedtls_md_error_from_psa(status); 52732b31808SJens Wiklander } 52811fa71b9SJerome Forissier #endif 52932b31808SJens Wiklander 53032b31808SJens Wiklander switch (ctx->md_info->type) { 53111fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 53211fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 53332b31808SJens Wiklander return mbedtls_md5_starts(ctx->md_ctx); 53411fa71b9SJerome Forissier #endif 53511fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 53611fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 53732b31808SJens Wiklander return mbedtls_ripemd160_starts(ctx->md_ctx); 53811fa71b9SJerome Forissier #endif 53911fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 54011fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 54132b31808SJens Wiklander return mbedtls_sha1_starts(ctx->md_ctx); 54232b31808SJens Wiklander #endif 54332b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 54432b31808SJens Wiklander case MBEDTLS_MD_SHA224: 54532b31808SJens Wiklander return mbedtls_sha256_starts(ctx->md_ctx, 1); 54611fa71b9SJerome Forissier #endif 54711fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 54811fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 54932b31808SJens Wiklander return mbedtls_sha256_starts(ctx->md_ctx, 0); 55032b31808SJens Wiklander #endif 55132b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 55232b31808SJens Wiklander case MBEDTLS_MD_SHA384: 55332b31808SJens Wiklander return mbedtls_sha512_starts(ctx->md_ctx, 1); 55411fa71b9SJerome Forissier #endif 55511fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 55611fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 55732b31808SJens Wiklander return mbedtls_sha512_starts(ctx->md_ctx, 0); 55811fa71b9SJerome Forissier #endif 559*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 560*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 561*b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224); 562*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 563*b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256); 564*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 565*b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384); 566*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 567*b0563631STom Van Eyck return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512); 568*b0563631STom Van Eyck #endif 56911fa71b9SJerome Forissier default: 57032b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 57111fa71b9SJerome Forissier } 572817466cbSJens Wiklander } 573817466cbSJens Wiklander 574817466cbSJens Wiklander int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen) 575817466cbSJens Wiklander { 576*b0563631STom Van Eyck #if defined(MBEDTLS_MD_C) 57732b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) { 57832b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 57932b31808SJens Wiklander } 580*b0563631STom Van Eyck #endif 581817466cbSJens Wiklander 58232b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 58332b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) { 58432b31808SJens Wiklander psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen); 58532b31808SJens Wiklander return mbedtls_md_error_from_psa(status); 58632b31808SJens Wiklander } 58711fa71b9SJerome Forissier #endif 58832b31808SJens Wiklander 58932b31808SJens Wiklander switch (ctx->md_info->type) { 59011fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 59111fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 59232b31808SJens Wiklander return mbedtls_md5_update(ctx->md_ctx, input, ilen); 59311fa71b9SJerome Forissier #endif 59411fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 59511fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 59632b31808SJens Wiklander return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen); 59711fa71b9SJerome Forissier #endif 59811fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 59911fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 60032b31808SJens Wiklander return mbedtls_sha1_update(ctx->md_ctx, input, ilen); 60132b31808SJens Wiklander #endif 60232b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 60332b31808SJens Wiklander case MBEDTLS_MD_SHA224: 60432b31808SJens Wiklander return mbedtls_sha256_update(ctx->md_ctx, input, ilen); 60511fa71b9SJerome Forissier #endif 60611fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 60711fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 60832b31808SJens Wiklander return mbedtls_sha256_update(ctx->md_ctx, input, ilen); 60932b31808SJens Wiklander #endif 61032b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 61132b31808SJens Wiklander case MBEDTLS_MD_SHA384: 61232b31808SJens Wiklander return mbedtls_sha512_update(ctx->md_ctx, input, ilen); 61311fa71b9SJerome Forissier #endif 61411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 61511fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 61632b31808SJens Wiklander return mbedtls_sha512_update(ctx->md_ctx, input, ilen); 61711fa71b9SJerome Forissier #endif 618*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 619*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 620*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 621*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 622*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 623*b0563631STom Van Eyck return mbedtls_sha3_update(ctx->md_ctx, input, ilen); 624*b0563631STom Van Eyck #endif 62511fa71b9SJerome Forissier default: 62632b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 62711fa71b9SJerome Forissier } 628817466cbSJens Wiklander } 629817466cbSJens Wiklander 630817466cbSJens Wiklander int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output) 631817466cbSJens Wiklander { 632*b0563631STom Van Eyck #if defined(MBEDTLS_MD_C) 63332b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL) { 63432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 63532b31808SJens Wiklander } 636*b0563631STom Van Eyck #endif 637817466cbSJens Wiklander 63832b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 63932b31808SJens Wiklander if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) { 64032b31808SJens Wiklander size_t size = ctx->md_info->size; 64132b31808SJens Wiklander psa_status_t status = psa_hash_finish(ctx->md_ctx, 64232b31808SJens Wiklander output, size, &size); 64332b31808SJens Wiklander return mbedtls_md_error_from_psa(status); 64432b31808SJens Wiklander } 64511fa71b9SJerome Forissier #endif 64632b31808SJens Wiklander 64732b31808SJens Wiklander switch (ctx->md_info->type) { 64811fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 64911fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 65032b31808SJens Wiklander return mbedtls_md5_finish(ctx->md_ctx, output); 65111fa71b9SJerome Forissier #endif 65211fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 65311fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 65432b31808SJens Wiklander return mbedtls_ripemd160_finish(ctx->md_ctx, output); 65511fa71b9SJerome Forissier #endif 65611fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 65711fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 65832b31808SJens Wiklander return mbedtls_sha1_finish(ctx->md_ctx, output); 65932b31808SJens Wiklander #endif 66032b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 66132b31808SJens Wiklander case MBEDTLS_MD_SHA224: 66232b31808SJens Wiklander return mbedtls_sha256_finish(ctx->md_ctx, output); 66311fa71b9SJerome Forissier #endif 66411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 66511fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 66632b31808SJens Wiklander return mbedtls_sha256_finish(ctx->md_ctx, output); 66732b31808SJens Wiklander #endif 66832b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 66932b31808SJens Wiklander case MBEDTLS_MD_SHA384: 67032b31808SJens Wiklander return mbedtls_sha512_finish(ctx->md_ctx, output); 67111fa71b9SJerome Forissier #endif 67211fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 67311fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 67432b31808SJens Wiklander return mbedtls_sha512_finish(ctx->md_ctx, output); 67511fa71b9SJerome Forissier #endif 676*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 677*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 678*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 679*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 680*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 681*b0563631STom Van Eyck return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size); 682*b0563631STom Van Eyck #endif 68311fa71b9SJerome Forissier default: 68432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 68511fa71b9SJerome Forissier } 686817466cbSJens Wiklander } 687817466cbSJens Wiklander 688817466cbSJens Wiklander int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 689817466cbSJens Wiklander unsigned char *output) 690817466cbSJens Wiklander { 69132b31808SJens Wiklander if (md_info == NULL) { 69232b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 69332b31808SJens Wiklander } 694817466cbSJens Wiklander 69532b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 69632b31808SJens Wiklander if (md_can_use_psa(md_info)) { 69732b31808SJens Wiklander size_t size = md_info->size; 69832b31808SJens Wiklander psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info), 69932b31808SJens Wiklander input, ilen, 70032b31808SJens Wiklander output, size, &size); 70132b31808SJens Wiklander return mbedtls_md_error_from_psa(status); 70232b31808SJens Wiklander } 70311fa71b9SJerome Forissier #endif 70432b31808SJens Wiklander 70532b31808SJens Wiklander switch (md_info->type) { 70611fa71b9SJerome Forissier #if defined(MBEDTLS_MD5_C) 70711fa71b9SJerome Forissier case MBEDTLS_MD_MD5: 70832b31808SJens Wiklander return mbedtls_md5(input, ilen, output); 70911fa71b9SJerome Forissier #endif 71011fa71b9SJerome Forissier #if defined(MBEDTLS_RIPEMD160_C) 71111fa71b9SJerome Forissier case MBEDTLS_MD_RIPEMD160: 71232b31808SJens Wiklander return mbedtls_ripemd160(input, ilen, output); 71311fa71b9SJerome Forissier #endif 71411fa71b9SJerome Forissier #if defined(MBEDTLS_SHA1_C) 71511fa71b9SJerome Forissier case MBEDTLS_MD_SHA1: 71632b31808SJens Wiklander return mbedtls_sha1(input, ilen, output); 71732b31808SJens Wiklander #endif 71832b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 71932b31808SJens Wiklander case MBEDTLS_MD_SHA224: 72032b31808SJens Wiklander return mbedtls_sha256(input, ilen, output, 1); 72111fa71b9SJerome Forissier #endif 72211fa71b9SJerome Forissier #if defined(MBEDTLS_SHA256_C) 72311fa71b9SJerome Forissier case MBEDTLS_MD_SHA256: 72432b31808SJens Wiklander return mbedtls_sha256(input, ilen, output, 0); 72532b31808SJens Wiklander #endif 72632b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 72732b31808SJens Wiklander case MBEDTLS_MD_SHA384: 72832b31808SJens Wiklander return mbedtls_sha512(input, ilen, output, 1); 72911fa71b9SJerome Forissier #endif 73011fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 73111fa71b9SJerome Forissier case MBEDTLS_MD_SHA512: 73232b31808SJens Wiklander return mbedtls_sha512(input, ilen, output, 0); 73311fa71b9SJerome Forissier #endif 734*b0563631STom Van Eyck #if defined(MBEDTLS_SHA3_C) 735*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_224: 736*b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size); 737*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_256: 738*b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size); 739*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_384: 740*b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size); 741*b0563631STom Van Eyck case MBEDTLS_MD_SHA3_512: 742*b0563631STom Van Eyck return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size); 743*b0563631STom Van Eyck #endif 74411fa71b9SJerome Forissier default: 74532b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 74611fa71b9SJerome Forissier } 747817466cbSJens Wiklander } 748817466cbSJens Wiklander 74932b31808SJens Wiklander unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info) 75032b31808SJens Wiklander { 75132b31808SJens Wiklander if (md_info == NULL) { 75232b31808SJens Wiklander return 0; 75332b31808SJens Wiklander } 75432b31808SJens Wiklander 75532b31808SJens Wiklander return md_info->size; 75632b31808SJens Wiklander } 75732b31808SJens Wiklander 75832b31808SJens Wiklander mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info) 75932b31808SJens Wiklander { 76032b31808SJens Wiklander if (md_info == NULL) { 76132b31808SJens Wiklander return MBEDTLS_MD_NONE; 76232b31808SJens Wiklander } 76332b31808SJens Wiklander 76432b31808SJens Wiklander return md_info->type; 76532b31808SJens Wiklander } 76632b31808SJens Wiklander 767*b0563631STom Van Eyck #if defined(MBEDTLS_PSA_CRYPTO_C) 768*b0563631STom Van Eyck int mbedtls_md_error_from_psa(psa_status_t status) 769*b0563631STom Van Eyck { 770*b0563631STom Van Eyck return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors, 771*b0563631STom Van Eyck psa_generic_status_to_mbedtls); 772*b0563631STom Van Eyck } 773*b0563631STom Van Eyck #endif /* MBEDTLS_PSA_CRYPTO_C */ 774*b0563631STom Van Eyck 775*b0563631STom Van Eyck 77632b31808SJens Wiklander /************************************************************************ 77732b31808SJens Wiklander * Functions above this separator are part of MBEDTLS_MD_LIGHT, * 77832b31808SJens Wiklander * functions below are only available when MBEDTLS_MD_C is set. * 77932b31808SJens Wiklander ************************************************************************/ 78032b31808SJens Wiklander #if defined(MBEDTLS_MD_C) 78132b31808SJens Wiklander 78232b31808SJens Wiklander /* 78332b31808SJens Wiklander * Reminder: update profiles in x509_crt.c when adding a new hash! 78432b31808SJens Wiklander */ 78532b31808SJens Wiklander static const int supported_digests[] = { 78632b31808SJens Wiklander 78732b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512) 78832b31808SJens Wiklander MBEDTLS_MD_SHA512, 78932b31808SJens Wiklander #endif 79032b31808SJens Wiklander 79132b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA384) 79232b31808SJens Wiklander MBEDTLS_MD_SHA384, 79332b31808SJens Wiklander #endif 79432b31808SJens Wiklander 79532b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA256) 79632b31808SJens Wiklander MBEDTLS_MD_SHA256, 79732b31808SJens Wiklander #endif 79832b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA224) 79932b31808SJens Wiklander MBEDTLS_MD_SHA224, 80032b31808SJens Wiklander #endif 80132b31808SJens Wiklander 80232b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA1) 80332b31808SJens Wiklander MBEDTLS_MD_SHA1, 80432b31808SJens Wiklander #endif 80532b31808SJens Wiklander 80632b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_RIPEMD160) 80732b31808SJens Wiklander MBEDTLS_MD_RIPEMD160, 80832b31808SJens Wiklander #endif 80932b31808SJens Wiklander 81032b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_MD5) 81132b31808SJens Wiklander MBEDTLS_MD_MD5, 81232b31808SJens Wiklander #endif 81332b31808SJens Wiklander 814*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224) 815*b0563631STom Van Eyck MBEDTLS_MD_SHA3_224, 816*b0563631STom Van Eyck #endif 817*b0563631STom Van Eyck 818*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256) 819*b0563631STom Van Eyck MBEDTLS_MD_SHA3_256, 820*b0563631STom Van Eyck #endif 821*b0563631STom Van Eyck 822*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384) 823*b0563631STom Van Eyck MBEDTLS_MD_SHA3_384, 824*b0563631STom Van Eyck #endif 825*b0563631STom Van Eyck 826*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512) 827*b0563631STom Van Eyck MBEDTLS_MD_SHA3_512, 828*b0563631STom Van Eyck #endif 829*b0563631STom Van Eyck 83032b31808SJens Wiklander MBEDTLS_MD_NONE 83132b31808SJens Wiklander }; 83232b31808SJens Wiklander 83332b31808SJens Wiklander const int *mbedtls_md_list(void) 83432b31808SJens Wiklander { 83532b31808SJens Wiklander return supported_digests; 83632b31808SJens Wiklander } 83732b31808SJens Wiklander 838*b0563631STom Van Eyck typedef struct { 839*b0563631STom Van Eyck const char *md_name; 840*b0563631STom Van Eyck mbedtls_md_type_t md_type; 841*b0563631STom Van Eyck } md_name_entry; 842*b0563631STom Van Eyck 843*b0563631STom Van Eyck static const md_name_entry md_names[] = { 844*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_MD5) 845*b0563631STom Van Eyck { "MD5", MBEDTLS_MD_MD5 }, 846*b0563631STom Van Eyck #endif 847*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_RIPEMD160) 848*b0563631STom Van Eyck { "RIPEMD160", MBEDTLS_MD_RIPEMD160 }, 849*b0563631STom Van Eyck #endif 850*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA1) 851*b0563631STom Van Eyck { "SHA1", MBEDTLS_MD_SHA1 }, 852*b0563631STom Van Eyck { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback 853*b0563631STom Van Eyck #endif 854*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA224) 855*b0563631STom Van Eyck { "SHA224", MBEDTLS_MD_SHA224 }, 856*b0563631STom Van Eyck #endif 857*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256) 858*b0563631STom Van Eyck { "SHA256", MBEDTLS_MD_SHA256 }, 859*b0563631STom Van Eyck #endif 860*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384) 861*b0563631STom Van Eyck { "SHA384", MBEDTLS_MD_SHA384 }, 862*b0563631STom Van Eyck #endif 863*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA512) 864*b0563631STom Van Eyck { "SHA512", MBEDTLS_MD_SHA512 }, 865*b0563631STom Van Eyck #endif 866*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_224) 867*b0563631STom Van Eyck { "SHA3-224", MBEDTLS_MD_SHA3_224 }, 868*b0563631STom Van Eyck #endif 869*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_256) 870*b0563631STom Van Eyck { "SHA3-256", MBEDTLS_MD_SHA3_256 }, 871*b0563631STom Van Eyck #endif 872*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_384) 873*b0563631STom Van Eyck { "SHA3-384", MBEDTLS_MD_SHA3_384 }, 874*b0563631STom Van Eyck #endif 875*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA3_512) 876*b0563631STom Van Eyck { "SHA3-512", MBEDTLS_MD_SHA3_512 }, 877*b0563631STom Van Eyck #endif 878*b0563631STom Van Eyck { NULL, MBEDTLS_MD_NONE }, 879*b0563631STom Van Eyck }; 880*b0563631STom Van Eyck 88132b31808SJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name) 88232b31808SJens Wiklander { 88332b31808SJens Wiklander if (NULL == md_name) { 88432b31808SJens Wiklander return NULL; 88532b31808SJens Wiklander } 88632b31808SJens Wiklander 887*b0563631STom Van Eyck const md_name_entry *entry = md_names; 888*b0563631STom Van Eyck while (entry->md_name != NULL && 889*b0563631STom Van Eyck strcmp(entry->md_name, md_name) != 0) { 890*b0563631STom Van Eyck ++entry; 89132b31808SJens Wiklander } 892*b0563631STom Van Eyck 893*b0563631STom Van Eyck return mbedtls_md_info_from_type(entry->md_type); 89432b31808SJens Wiklander } 895*b0563631STom Van Eyck 896*b0563631STom Van Eyck const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info) 897*b0563631STom Van Eyck { 898*b0563631STom Van Eyck if (md_info == NULL) { 89932b31808SJens Wiklander return NULL; 90032b31808SJens Wiklander } 90132b31808SJens Wiklander 902*b0563631STom Van Eyck const md_name_entry *entry = md_names; 903*b0563631STom Van Eyck while (entry->md_type != MBEDTLS_MD_NONE && 904*b0563631STom Van Eyck entry->md_type != md_info->type) { 905*b0563631STom Van Eyck ++entry; 906*b0563631STom Van Eyck } 907*b0563631STom Van Eyck 908*b0563631STom Van Eyck return entry->md_name; 909*b0563631STom Van Eyck } 910*b0563631STom Van Eyck 91132b31808SJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_ctx( 91232b31808SJens Wiklander const mbedtls_md_context_t *ctx) 91332b31808SJens Wiklander { 91432b31808SJens Wiklander if (ctx == NULL) { 91532b31808SJens Wiklander return NULL; 91632b31808SJens Wiklander } 91732b31808SJens Wiklander 91832b31808SJens Wiklander return ctx->MBEDTLS_PRIVATE(md_info); 91932b31808SJens Wiklander } 92032b31808SJens Wiklander 921817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 922817466cbSJens Wiklander int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output) 923817466cbSJens Wiklander { 92411fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 925817466cbSJens Wiklander FILE *f; 926817466cbSJens Wiklander size_t n; 927817466cbSJens Wiklander mbedtls_md_context_t ctx; 928817466cbSJens Wiklander unsigned char buf[1024]; 929817466cbSJens Wiklander 93032b31808SJens Wiklander if (md_info == NULL) { 93132b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 93232b31808SJens Wiklander } 933817466cbSJens Wiklander 93432b31808SJens Wiklander if ((f = fopen(path, "rb")) == NULL) { 93532b31808SJens Wiklander return MBEDTLS_ERR_MD_FILE_IO_ERROR; 93632b31808SJens Wiklander } 93732b31808SJens Wiklander 93832b31808SJens Wiklander /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */ 93932b31808SJens Wiklander mbedtls_setbuf(f, NULL); 940817466cbSJens Wiklander 941817466cbSJens Wiklander mbedtls_md_init(&ctx); 942817466cbSJens Wiklander 94332b31808SJens Wiklander if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) { 944817466cbSJens Wiklander goto cleanup; 94532b31808SJens Wiklander } 946817466cbSJens Wiklander 94732b31808SJens Wiklander if ((ret = mbedtls_md_starts(&ctx)) != 0) { 9483d3b0591SJens Wiklander goto cleanup; 94932b31808SJens Wiklander } 950817466cbSJens Wiklander 95132b31808SJens Wiklander while ((n = fread(buf, 1, sizeof(buf), f)) > 0) { 95232b31808SJens Wiklander if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) { 9533d3b0591SJens Wiklander goto cleanup; 95432b31808SJens Wiklander } 95532b31808SJens Wiklander } 956817466cbSJens Wiklander 95732b31808SJens Wiklander if (ferror(f) != 0) { 958817466cbSJens Wiklander ret = MBEDTLS_ERR_MD_FILE_IO_ERROR; 95932b31808SJens Wiklander } else { 96011fa71b9SJerome Forissier ret = mbedtls_md_finish(&ctx, output); 96132b31808SJens Wiklander } 962817466cbSJens Wiklander 963817466cbSJens Wiklander cleanup: 9643d3b0591SJens Wiklander mbedtls_platform_zeroize(buf, sizeof(buf)); 965817466cbSJens Wiklander fclose(f); 966817466cbSJens Wiklander mbedtls_md_free(&ctx); 967817466cbSJens Wiklander 96832b31808SJens Wiklander return ret; 969817466cbSJens Wiklander } 970817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */ 971817466cbSJens Wiklander 972817466cbSJens Wiklander int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen) 973817466cbSJens Wiklander { 97411fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 975817466cbSJens Wiklander unsigned char sum[MBEDTLS_MD_MAX_SIZE]; 976817466cbSJens Wiklander unsigned char *ipad, *opad; 977817466cbSJens Wiklander 97832b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { 97932b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 98032b31808SJens Wiklander } 981817466cbSJens Wiklander 98232b31808SJens Wiklander if (keylen > (size_t) ctx->md_info->block_size) { 98332b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) { 9843d3b0591SJens Wiklander goto cleanup; 98532b31808SJens Wiklander } 98632b31808SJens Wiklander if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) { 9873d3b0591SJens Wiklander goto cleanup; 98832b31808SJens Wiklander } 98932b31808SJens Wiklander if ((ret = mbedtls_md_finish(ctx, sum)) != 0) { 9903d3b0591SJens Wiklander goto cleanup; 99132b31808SJens Wiklander } 992817466cbSJens Wiklander 993817466cbSJens Wiklander keylen = ctx->md_info->size; 994817466cbSJens Wiklander key = sum; 995817466cbSJens Wiklander } 996817466cbSJens Wiklander 997817466cbSJens Wiklander ipad = (unsigned char *) ctx->hmac_ctx; 998817466cbSJens Wiklander opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; 999817466cbSJens Wiklander 1000817466cbSJens Wiklander memset(ipad, 0x36, ctx->md_info->block_size); 1001817466cbSJens Wiklander memset(opad, 0x5C, ctx->md_info->block_size); 1002817466cbSJens Wiklander 100332b31808SJens Wiklander mbedtls_xor(ipad, ipad, key, keylen); 100432b31808SJens Wiklander mbedtls_xor(opad, opad, key, keylen); 1005817466cbSJens Wiklander 100632b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) { 10073d3b0591SJens Wiklander goto cleanup; 100832b31808SJens Wiklander } 100911fa71b9SJerome Forissier if ((ret = mbedtls_md_update(ctx, ipad, 101032b31808SJens Wiklander ctx->md_info->block_size)) != 0) { 10113d3b0591SJens Wiklander goto cleanup; 101232b31808SJens Wiklander } 1013817466cbSJens Wiklander 10143d3b0591SJens Wiklander cleanup: 10153d3b0591SJens Wiklander mbedtls_platform_zeroize(sum, sizeof(sum)); 1016817466cbSJens Wiklander 101732b31808SJens Wiklander return ret; 1018817466cbSJens Wiklander } 1019817466cbSJens Wiklander 1020817466cbSJens Wiklander int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen) 1021817466cbSJens Wiklander { 102232b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { 102332b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 102432b31808SJens Wiklander } 1025817466cbSJens Wiklander 102632b31808SJens Wiklander return mbedtls_md_update(ctx, input, ilen); 1027817466cbSJens Wiklander } 1028817466cbSJens Wiklander 1029817466cbSJens Wiklander int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output) 1030817466cbSJens Wiklander { 103111fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1032817466cbSJens Wiklander unsigned char tmp[MBEDTLS_MD_MAX_SIZE]; 1033817466cbSJens Wiklander unsigned char *opad; 1034817466cbSJens Wiklander 103532b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { 103632b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 103732b31808SJens Wiklander } 1038817466cbSJens Wiklander 1039817466cbSJens Wiklander opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; 1040817466cbSJens Wiklander 104132b31808SJens Wiklander if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) { 104232b31808SJens Wiklander return ret; 104332b31808SJens Wiklander } 104432b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) { 104532b31808SJens Wiklander return ret; 104632b31808SJens Wiklander } 104711fa71b9SJerome Forissier if ((ret = mbedtls_md_update(ctx, opad, 104832b31808SJens Wiklander ctx->md_info->block_size)) != 0) { 104932b31808SJens Wiklander return ret; 105032b31808SJens Wiklander } 105111fa71b9SJerome Forissier if ((ret = mbedtls_md_update(ctx, tmp, 105232b31808SJens Wiklander ctx->md_info->size)) != 0) { 105332b31808SJens Wiklander return ret; 105432b31808SJens Wiklander } 105532b31808SJens Wiklander return mbedtls_md_finish(ctx, output); 1056817466cbSJens Wiklander } 1057817466cbSJens Wiklander 1058817466cbSJens Wiklander int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx) 1059817466cbSJens Wiklander { 106011fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1061817466cbSJens Wiklander unsigned char *ipad; 1062817466cbSJens Wiklander 106332b31808SJens Wiklander if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) { 106432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 106532b31808SJens Wiklander } 1066817466cbSJens Wiklander 1067817466cbSJens Wiklander ipad = (unsigned char *) ctx->hmac_ctx; 1068817466cbSJens Wiklander 106932b31808SJens Wiklander if ((ret = mbedtls_md_starts(ctx)) != 0) { 107032b31808SJens Wiklander return ret; 107132b31808SJens Wiklander } 107232b31808SJens Wiklander return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size); 1073817466cbSJens Wiklander } 1074817466cbSJens Wiklander 10753d3b0591SJens Wiklander int mbedtls_md_hmac(const mbedtls_md_info_t *md_info, 10763d3b0591SJens Wiklander const unsigned char *key, size_t keylen, 1077817466cbSJens Wiklander const unsigned char *input, size_t ilen, 1078817466cbSJens Wiklander unsigned char *output) 1079817466cbSJens Wiklander { 1080817466cbSJens Wiklander mbedtls_md_context_t ctx; 108111fa71b9SJerome Forissier int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; 1082817466cbSJens Wiklander 108332b31808SJens Wiklander if (md_info == NULL) { 108432b31808SJens Wiklander return MBEDTLS_ERR_MD_BAD_INPUT_DATA; 108532b31808SJens Wiklander } 1086817466cbSJens Wiklander 1087817466cbSJens Wiklander mbedtls_md_init(&ctx); 1088817466cbSJens Wiklander 108932b31808SJens Wiklander if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) { 10903d3b0591SJens Wiklander goto cleanup; 109132b31808SJens Wiklander } 1092817466cbSJens Wiklander 109332b31808SJens Wiklander if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) { 10943d3b0591SJens Wiklander goto cleanup; 109532b31808SJens Wiklander } 109632b31808SJens Wiklander if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) { 10973d3b0591SJens Wiklander goto cleanup; 109832b31808SJens Wiklander } 109932b31808SJens Wiklander if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) { 11003d3b0591SJens Wiklander goto cleanup; 110132b31808SJens Wiklander } 1102817466cbSJens Wiklander 11033d3b0591SJens Wiklander cleanup: 1104817466cbSJens Wiklander mbedtls_md_free(&ctx); 1105817466cbSJens Wiklander 110632b31808SJens Wiklander return ret; 1107817466cbSJens Wiklander } 1108817466cbSJens Wiklander 1109817466cbSJens Wiklander #endif /* MBEDTLS_MD_C */ 111032b31808SJens Wiklander 111132b31808SJens Wiklander #endif /* MBEDTLS_MD_LIGHT */ 1112