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