1817466cbSJens Wiklander /** 2817466cbSJens Wiklander * \file md.h 3817466cbSJens Wiklander * 4*32b31808SJens Wiklander * \brief This file contains the generic functions for message-digest 5*32b31808SJens Wiklander * (hashing) and HMAC. 6817466cbSJens Wiklander * 7817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com> 83d3b0591SJens Wiklander */ 93d3b0591SJens Wiklander /* 107901324dSJerome Forissier * Copyright The Mbed TLS Contributors 117901324dSJerome Forissier * SPDX-License-Identifier: Apache-2.0 12817466cbSJens Wiklander * 13817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 14817466cbSJens Wiklander * not use this file except in compliance with the License. 15817466cbSJens Wiklander * You may obtain a copy of the License at 16817466cbSJens Wiklander * 17817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 18817466cbSJens Wiklander * 19817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 20817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 21817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22817466cbSJens Wiklander * See the License for the specific language governing permissions and 23817466cbSJens Wiklander * limitations under the License. 24817466cbSJens Wiklander */ 253d3b0591SJens Wiklander 26817466cbSJens Wiklander #ifndef MBEDTLS_MD_H 27817466cbSJens Wiklander #define MBEDTLS_MD_H 28*32b31808SJens Wiklander #include "mbedtls/private_access.h" 29817466cbSJens Wiklander 30817466cbSJens Wiklander #include <stddef.h> 31817466cbSJens Wiklander 32*32b31808SJens Wiklander #include "mbedtls/build_info.h" 33039e02dfSJerome Forissier #include "mbedtls/platform_util.h" 343d3b0591SJens Wiklander 35*32b31808SJens Wiklander #if defined(MBEDTLS_MD_LIGHT) 36*32b31808SJens Wiklander 37*32b31808SJens Wiklander /* 38*32b31808SJens Wiklander * - MBEDTLS_MD_CAN_xxx is defined if the md module can perform xxx. 39*32b31808SJens Wiklander * - MBEDTLS_MD_xxx_VIA_PSA is defined if the md module may perform xxx via PSA 40*32b31808SJens Wiklander * (see below). 41*32b31808SJens Wiklander * - MBEDTLS_MD_SOME_PSA is defined if at least one algorithm may be performed 42*32b31808SJens Wiklander * via PSA (see below). 43*32b31808SJens Wiklander * - MBEDTLS_MD_SOME_LEGACY is defined if at least one algorithm may be performed 44*32b31808SJens Wiklander * via a direct legacy call (see below). 45*32b31808SJens Wiklander * 46*32b31808SJens Wiklander * The md module performs an algorithm via PSA if there is a PSA hash 47*32b31808SJens Wiklander * accelerator and the PSA driver subsytem is initialized at the time the 48*32b31808SJens Wiklander * operation is started, and makes a direct legacy call otherwise. 49*32b31808SJens Wiklander */ 50*32b31808SJens Wiklander 51*32b31808SJens Wiklander /* PSA accelerated implementations */ 52*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_CRYPTO_C) 53*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_MD5) 54*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_MD5 55*32b31808SJens Wiklander #define MBEDTLS_MD_MD5_VIA_PSA 56*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 57*32b31808SJens Wiklander #endif 58*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) 59*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA1 60*32b31808SJens Wiklander #define MBEDTLS_MD_SHA1_VIA_PSA 61*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 62*32b31808SJens Wiklander #endif 63*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) 64*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA224 65*32b31808SJens Wiklander #define MBEDTLS_MD_SHA224_VIA_PSA 66*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 67*32b31808SJens Wiklander #endif 68*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) 69*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA256 70*32b31808SJens Wiklander #define MBEDTLS_MD_SHA256_VIA_PSA 71*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 72*32b31808SJens Wiklander #endif 73*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) 74*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA384 75*32b31808SJens Wiklander #define MBEDTLS_MD_SHA384_VIA_PSA 76*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 77*32b31808SJens Wiklander #endif 78*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512) 79*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA512 80*32b31808SJens Wiklander #define MBEDTLS_MD_SHA512_VIA_PSA 81*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 82*32b31808SJens Wiklander #endif 83*32b31808SJens Wiklander #if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) 84*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_RIPEMD160 85*32b31808SJens Wiklander #define MBEDTLS_MD_RIPEMD160_VIA_PSA 86*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_PSA 87*32b31808SJens Wiklander #endif 88*32b31808SJens Wiklander #endif /* MBEDTLS_PSA_CRYPTO_C */ 89*32b31808SJens Wiklander 90*32b31808SJens Wiklander /* Built-in implementations */ 91*32b31808SJens Wiklander #if defined(MBEDTLS_MD5_C) 92*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_MD5 93*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 94*32b31808SJens Wiklander #endif 95*32b31808SJens Wiklander #if defined(MBEDTLS_SHA1_C) 96*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA1 97*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 98*32b31808SJens Wiklander #endif 99*32b31808SJens Wiklander #if defined(MBEDTLS_SHA224_C) 100*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA224 101*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 102*32b31808SJens Wiklander #endif 103*32b31808SJens Wiklander #if defined(MBEDTLS_SHA256_C) 104*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA256 105*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 106*32b31808SJens Wiklander #endif 107*32b31808SJens Wiklander #if defined(MBEDTLS_SHA384_C) 108*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA384 109*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 110*32b31808SJens Wiklander #endif 111*32b31808SJens Wiklander #if defined(MBEDTLS_SHA512_C) 112*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_SHA512 113*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 114*32b31808SJens Wiklander #endif 115*32b31808SJens Wiklander #if defined(MBEDTLS_RIPEMD160_C) 116*32b31808SJens Wiklander #define MBEDTLS_MD_CAN_RIPEMD160 117*32b31808SJens Wiklander #define MBEDTLS_MD_SOME_LEGACY 118*32b31808SJens Wiklander #endif 119*32b31808SJens Wiklander 120*32b31808SJens Wiklander #endif /* MBEDTLS_MD_LIGHT */ 121*32b31808SJens Wiklander 122039e02dfSJerome Forissier /** The selected feature is not available. */ 123039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 124039e02dfSJerome Forissier /** Bad input parameters to function. */ 125039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 126039e02dfSJerome Forissier /** Failed to allocate memory. */ 127039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 128039e02dfSJerome Forissier /** Opening or reading of file failed. */ 129039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 130817466cbSJens Wiklander 131817466cbSJens Wiklander #ifdef __cplusplus 132817466cbSJens Wiklander extern "C" { 133817466cbSJens Wiklander #endif 134817466cbSJens Wiklander 1353d3b0591SJens Wiklander /** 1363d3b0591SJens Wiklander * \brief Supported message digests. 1373d3b0591SJens Wiklander * 138*32b31808SJens Wiklander * \warning MD5 and SHA-1 are considered weak message digests and 1393d3b0591SJens Wiklander * their use constitutes a security risk. We recommend considering 1403d3b0591SJens Wiklander * stronger message digests instead. 1413d3b0591SJens Wiklander * 1423d3b0591SJens Wiklander */ 143817466cbSJens Wiklander typedef enum { 1443d3b0591SJens Wiklander MBEDTLS_MD_NONE=0, /**< None. */ 1453d3b0591SJens Wiklander MBEDTLS_MD_MD5, /**< The MD5 message digest. */ 1463d3b0591SJens Wiklander MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ 1473d3b0591SJens Wiklander MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ 1483d3b0591SJens Wiklander MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ 1493d3b0591SJens Wiklander MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ 1503d3b0591SJens Wiklander MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ 1513d3b0591SJens Wiklander MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ 152817466cbSJens Wiklander } mbedtls_md_type_t; 153817466cbSJens Wiklander 154*32b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512) 155817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ 156*32b31808SJens Wiklander #elif defined(MBEDTLS_MD_CAN_SHA384) 157*32b31808SJens Wiklander #define MBEDTLS_MD_MAX_SIZE 48 /* longest known is SHA384 */ 158*32b31808SJens Wiklander #elif defined(MBEDTLS_MD_CAN_SHA256) 159*32b31808SJens Wiklander #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 */ 160*32b31808SJens Wiklander #elif defined(MBEDTLS_MD_CAN_SHA224) 161*32b31808SJens Wiklander #define MBEDTLS_MD_MAX_SIZE 28 /* longest known is SHA224 */ 162817466cbSJens Wiklander #else 163*32b31808SJens Wiklander #define MBEDTLS_MD_MAX_SIZE 20 /* longest known is SHA1 or RIPE MD-160 164*32b31808SJens Wiklander or smaller (MD5 and earlier) */ 165817466cbSJens Wiklander #endif 166817466cbSJens Wiklander 167*32b31808SJens Wiklander #if defined(MBEDTLS_MD_CAN_SHA512) 16811fa71b9SJerome Forissier #define MBEDTLS_MD_MAX_BLOCK_SIZE 128 16911fa71b9SJerome Forissier #else 17011fa71b9SJerome Forissier #define MBEDTLS_MD_MAX_BLOCK_SIZE 64 17111fa71b9SJerome Forissier #endif 17211fa71b9SJerome Forissier 173817466cbSJens Wiklander /** 174*32b31808SJens Wiklander * Opaque struct. 175*32b31808SJens Wiklander * 176*32b31808SJens Wiklander * Constructed using either #mbedtls_md_info_from_string or 177*32b31808SJens Wiklander * #mbedtls_md_info_from_type. 178*32b31808SJens Wiklander * 179*32b31808SJens Wiklander * Fields can be accessed with #mbedtls_md_get_size, 180*32b31808SJens Wiklander * #mbedtls_md_get_type and #mbedtls_md_get_name. 181817466cbSJens Wiklander */ 182*32b31808SJens Wiklander /* Defined internally in library/md_wrap.h. */ 183817466cbSJens Wiklander typedef struct mbedtls_md_info_t mbedtls_md_info_t; 184817466cbSJens Wiklander 185817466cbSJens Wiklander /** 186*32b31808SJens Wiklander * Used internally to indicate whether a context uses legacy or PSA. 187*32b31808SJens Wiklander * 188*32b31808SJens Wiklander * Internal use only. 189*32b31808SJens Wiklander */ 190*32b31808SJens Wiklander typedef enum { 191*32b31808SJens Wiklander MBEDTLS_MD_ENGINE_LEGACY = 0, 192*32b31808SJens Wiklander MBEDTLS_MD_ENGINE_PSA, 193*32b31808SJens Wiklander } mbedtls_md_engine_t; 194*32b31808SJens Wiklander 195*32b31808SJens Wiklander /** 1963d3b0591SJens Wiklander * The generic message-digest context. 197817466cbSJens Wiklander */ 198*32b31808SJens Wiklander typedef struct mbedtls_md_context_t { 1993d3b0591SJens Wiklander /** Information about the associated message digest. */ 200*32b31808SJens Wiklander const mbedtls_md_info_t *MBEDTLS_PRIVATE(md_info); 201817466cbSJens Wiklander 202*32b31808SJens Wiklander #if defined(MBEDTLS_MD_SOME_PSA) 203*32b31808SJens Wiklander /** Are hash operations dispatched to PSA or legacy? */ 204*32b31808SJens Wiklander mbedtls_md_engine_t MBEDTLS_PRIVATE(engine); 205*32b31808SJens Wiklander #endif 206817466cbSJens Wiklander 207*32b31808SJens Wiklander /** The digest-specific context (legacy) or the PSA operation. */ 208*32b31808SJens Wiklander void *MBEDTLS_PRIVATE(md_ctx); 209*32b31808SJens Wiklander 210*32b31808SJens Wiklander #if defined(MBEDTLS_MD_C) 2113d3b0591SJens Wiklander /** The HMAC part of the context. */ 212*32b31808SJens Wiklander void *MBEDTLS_PRIVATE(hmac_ctx); 213*32b31808SJens Wiklander #endif 214817466cbSJens Wiklander } mbedtls_md_context_t; 215817466cbSJens Wiklander 216817466cbSJens Wiklander /** 2173d3b0591SJens Wiklander * \brief This function returns the message-digest information 2183d3b0591SJens Wiklander * associated with the given digest type. 219817466cbSJens Wiklander * 2203d3b0591SJens Wiklander * \param md_type The type of digest to search for. 221817466cbSJens Wiklander * 2223d3b0591SJens Wiklander * \return The message-digest information associated with \p md_type. 2233d3b0591SJens Wiklander * \return NULL if the associated message-digest information is not found. 224817466cbSJens Wiklander */ 225817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type); 226817466cbSJens Wiklander 227817466cbSJens Wiklander /** 2283d3b0591SJens Wiklander * \brief This function initializes a message-digest context without 2293d3b0591SJens Wiklander * binding it to a particular message-digest algorithm. 2303d3b0591SJens Wiklander * 2313d3b0591SJens Wiklander * This function should always be called first. It prepares the 2323d3b0591SJens Wiklander * context for mbedtls_md_setup() for binding it to a 2333d3b0591SJens Wiklander * message-digest algorithm. 234817466cbSJens Wiklander */ 235817466cbSJens Wiklander void mbedtls_md_init(mbedtls_md_context_t *ctx); 236817466cbSJens Wiklander 237817466cbSJens Wiklander /** 2383d3b0591SJens Wiklander * \brief This function clears the internal structure of \p ctx and 2393d3b0591SJens Wiklander * frees any embedded internal structure, but does not free 2403d3b0591SJens Wiklander * \p ctx itself. 2413d3b0591SJens Wiklander * 2423d3b0591SJens Wiklander * If you have called mbedtls_md_setup() on \p ctx, you must 2433d3b0591SJens Wiklander * call mbedtls_md_free() when you are no longer using the 2443d3b0591SJens Wiklander * context. 2453d3b0591SJens Wiklander * Calling this function if you have previously 2463d3b0591SJens Wiklander * called mbedtls_md_init() and nothing else is optional. 2473d3b0591SJens Wiklander * You must not call this function if you have not called 2483d3b0591SJens Wiklander * mbedtls_md_init(). 249817466cbSJens Wiklander */ 250817466cbSJens Wiklander void mbedtls_md_free(mbedtls_md_context_t *ctx); 251817466cbSJens Wiklander 252817466cbSJens Wiklander 253817466cbSJens Wiklander /** 2543d3b0591SJens Wiklander * \brief This function selects the message digest algorithm to use, 2553d3b0591SJens Wiklander * and allocates internal structures. 256817466cbSJens Wiklander * 2573d3b0591SJens Wiklander * It should be called after mbedtls_md_init() or 2583d3b0591SJens Wiklander * mbedtls_md_free(). Makes it necessary to call 2593d3b0591SJens Wiklander * mbedtls_md_free() later. 260817466cbSJens Wiklander * 2613d3b0591SJens Wiklander * \param ctx The context to set up. 2623d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 2633d3b0591SJens Wiklander * to use. 2643d3b0591SJens Wiklander * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), 2653d3b0591SJens Wiklander * or non-zero: HMAC is used with this context. 2663d3b0591SJens Wiklander * 2673d3b0591SJens Wiklander * \return \c 0 on success. 2683d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 2693d3b0591SJens Wiklander * failure. 2703d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. 271817466cbSJens Wiklander */ 272039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 273817466cbSJens Wiklander int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac); 274817466cbSJens Wiklander 275817466cbSJens Wiklander /** 276*32b31808SJens Wiklander * \brief This function clones the state of a message-digest 2773d3b0591SJens Wiklander * context. 278817466cbSJens Wiklander * 2793d3b0591SJens Wiklander * \note You must call mbedtls_md_setup() on \c dst before calling 2803d3b0591SJens Wiklander * this function. 281817466cbSJens Wiklander * 2823d3b0591SJens Wiklander * \note The two contexts must have the same type, 2833d3b0591SJens Wiklander * for example, both are SHA-256. 284817466cbSJens Wiklander * 2853d3b0591SJens Wiklander * \warning This function clones the message-digest state, not the 2863d3b0591SJens Wiklander * HMAC state. 287817466cbSJens Wiklander * 2883d3b0591SJens Wiklander * \param dst The destination context. 2893d3b0591SJens Wiklander * \param src The context to be cloned. 2903d3b0591SJens Wiklander * 2913d3b0591SJens Wiklander * \return \c 0 on success. 2923d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. 293*32b31808SJens Wiklander * \return #MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE if both contexts are 294*32b31808SJens Wiklander * not using the same engine. This can be avoided by moving 295*32b31808SJens Wiklander * the call to psa_crypto_init() before the first call to 296*32b31808SJens Wiklander * mbedtls_md_setup(). 297817466cbSJens Wiklander */ 298039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 299817466cbSJens Wiklander int mbedtls_md_clone(mbedtls_md_context_t *dst, 300817466cbSJens Wiklander const mbedtls_md_context_t *src); 301817466cbSJens Wiklander 302817466cbSJens Wiklander /** 3033d3b0591SJens Wiklander * \brief This function extracts the message-digest size from the 3043d3b0591SJens Wiklander * message-digest information structure. 305817466cbSJens Wiklander * 3063d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 3073d3b0591SJens Wiklander * to use. 308817466cbSJens Wiklander * 3093d3b0591SJens Wiklander * \return The size of the message-digest output in Bytes. 310817466cbSJens Wiklander */ 311817466cbSJens Wiklander unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info); 312817466cbSJens Wiklander 313817466cbSJens Wiklander /** 3143d3b0591SJens Wiklander * \brief This function extracts the message-digest type from the 3153d3b0591SJens Wiklander * message-digest information structure. 316817466cbSJens Wiklander * 3173d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 3183d3b0591SJens Wiklander * to use. 319817466cbSJens Wiklander * 3203d3b0591SJens Wiklander * \return The type of the message digest. 321817466cbSJens Wiklander */ 322817466cbSJens Wiklander mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info); 323817466cbSJens Wiklander 324817466cbSJens Wiklander /** 3253d3b0591SJens Wiklander * \brief This function starts a message-digest computation. 326817466cbSJens Wiklander * 3273d3b0591SJens Wiklander * You must call this function after setting up the context 3283d3b0591SJens Wiklander * with mbedtls_md_setup(), and before passing data with 3293d3b0591SJens Wiklander * mbedtls_md_update(). 330817466cbSJens Wiklander * 3313d3b0591SJens Wiklander * \param ctx The generic message-digest context. 3323d3b0591SJens Wiklander * 3333d3b0591SJens Wiklander * \return \c 0 on success. 3343d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3353d3b0591SJens Wiklander * failure. 336817466cbSJens Wiklander */ 337039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 338817466cbSJens Wiklander int mbedtls_md_starts(mbedtls_md_context_t *ctx); 339817466cbSJens Wiklander 340817466cbSJens Wiklander /** 3413d3b0591SJens Wiklander * \brief This function feeds an input buffer into an ongoing 3423d3b0591SJens Wiklander * message-digest computation. 343817466cbSJens Wiklander * 3443d3b0591SJens Wiklander * You must call mbedtls_md_starts() before calling this 3453d3b0591SJens Wiklander * function. You may call this function multiple times. 3463d3b0591SJens Wiklander * Afterwards, call mbedtls_md_finish(). 347817466cbSJens Wiklander * 3483d3b0591SJens Wiklander * \param ctx The generic message-digest context. 3493d3b0591SJens Wiklander * \param input The buffer holding the input data. 3503d3b0591SJens Wiklander * \param ilen The length of the input data. 3513d3b0591SJens Wiklander * 3523d3b0591SJens Wiklander * \return \c 0 on success. 3533d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3543d3b0591SJens Wiklander * failure. 355817466cbSJens Wiklander */ 356039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 357817466cbSJens Wiklander int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen); 358817466cbSJens Wiklander 359817466cbSJens Wiklander /** 3603d3b0591SJens Wiklander * \brief This function finishes the digest operation, 3613d3b0591SJens Wiklander * and writes the result to the output buffer. 362817466cbSJens Wiklander * 3633d3b0591SJens Wiklander * Call this function after a call to mbedtls_md_starts(), 3643d3b0591SJens Wiklander * followed by any number of calls to mbedtls_md_update(). 3653d3b0591SJens Wiklander * Afterwards, you may either clear the context with 3663d3b0591SJens Wiklander * mbedtls_md_free(), or call mbedtls_md_starts() to reuse 3673d3b0591SJens Wiklander * the context for another digest operation with the same 3683d3b0591SJens Wiklander * algorithm. 369817466cbSJens Wiklander * 3703d3b0591SJens Wiklander * \param ctx The generic message-digest context. 3713d3b0591SJens Wiklander * \param output The buffer for the generic message-digest checksum result. 3723d3b0591SJens Wiklander * 3733d3b0591SJens Wiklander * \return \c 0 on success. 3743d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3753d3b0591SJens Wiklander * failure. 376817466cbSJens Wiklander */ 377039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 378817466cbSJens Wiklander int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output); 379817466cbSJens Wiklander 380817466cbSJens Wiklander /** 3813d3b0591SJens Wiklander * \brief This function calculates the message-digest of a buffer, 3823d3b0591SJens Wiklander * with respect to a configurable message-digest algorithm 3833d3b0591SJens Wiklander * in a single call. 384817466cbSJens Wiklander * 3853d3b0591SJens Wiklander * The result is calculated as 3863d3b0591SJens Wiklander * Output = message_digest(input buffer). 387817466cbSJens Wiklander * 3883d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 3893d3b0591SJens Wiklander * to use. 3903d3b0591SJens Wiklander * \param input The buffer holding the data. 3913d3b0591SJens Wiklander * \param ilen The length of the input data. 3923d3b0591SJens Wiklander * \param output The generic message-digest checksum result. 3933d3b0591SJens Wiklander * 3943d3b0591SJens Wiklander * \return \c 0 on success. 3953d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3963d3b0591SJens Wiklander * failure. 397817466cbSJens Wiklander */ 398039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 399817466cbSJens Wiklander int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 400817466cbSJens Wiklander unsigned char *output); 401817466cbSJens Wiklander 402*32b31808SJens Wiklander /** 403*32b31808SJens Wiklander * \brief This function returns the list of digests supported by the 404*32b31808SJens Wiklander * generic digest module. 405*32b31808SJens Wiklander * 406*32b31808SJens Wiklander * \note The list starts with the strongest available hashes. 407*32b31808SJens Wiklander * 408*32b31808SJens Wiklander * \return A statically allocated array of digests. Each element 409*32b31808SJens Wiklander * in the returned list is an integer belonging to the 410*32b31808SJens Wiklander * message-digest enumeration #mbedtls_md_type_t. 411*32b31808SJens Wiklander * The last entry is 0. 412*32b31808SJens Wiklander */ 413*32b31808SJens Wiklander const int *mbedtls_md_list(void); 414*32b31808SJens Wiklander 415*32b31808SJens Wiklander /** 416*32b31808SJens Wiklander * \brief This function returns the message-digest information 417*32b31808SJens Wiklander * associated with the given digest name. 418*32b31808SJens Wiklander * 419*32b31808SJens Wiklander * \param md_name The name of the digest to search for. 420*32b31808SJens Wiklander * 421*32b31808SJens Wiklander * \return The message-digest information associated with \p md_name. 422*32b31808SJens Wiklander * \return NULL if the associated message-digest information is not found. 423*32b31808SJens Wiklander */ 424*32b31808SJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name); 425*32b31808SJens Wiklander 426*32b31808SJens Wiklander /** 427*32b31808SJens Wiklander * \brief This function extracts the message-digest name from the 428*32b31808SJens Wiklander * message-digest information structure. 429*32b31808SJens Wiklander * 430*32b31808SJens Wiklander * \param md_info The information structure of the message-digest algorithm 431*32b31808SJens Wiklander * to use. 432*32b31808SJens Wiklander * 433*32b31808SJens Wiklander * \return The name of the message digest. 434*32b31808SJens Wiklander */ 435*32b31808SJens Wiklander const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info); 436*32b31808SJens Wiklander 437*32b31808SJens Wiklander /** 438*32b31808SJens Wiklander * \brief This function returns the message-digest information 439*32b31808SJens Wiklander * from the given context. 440*32b31808SJens Wiklander * 441*32b31808SJens Wiklander * \param ctx The context from which to extract the information. 442*32b31808SJens Wiklander * This must be initialized (or \c NULL). 443*32b31808SJens Wiklander * 444*32b31808SJens Wiklander * \return The message-digest information associated with \p ctx. 445*32b31808SJens Wiklander * \return \c NULL if \p ctx is \c NULL. 446*32b31808SJens Wiklander */ 447*32b31808SJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_ctx( 448*32b31808SJens Wiklander const mbedtls_md_context_t *ctx); 449*32b31808SJens Wiklander 450817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 451817466cbSJens Wiklander /** 4523d3b0591SJens Wiklander * \brief This function calculates the message-digest checksum 4533d3b0591SJens Wiklander * result of the contents of the provided file. 454817466cbSJens Wiklander * 4553d3b0591SJens Wiklander * The result is calculated as 4563d3b0591SJens Wiklander * Output = message_digest(file contents). 457817466cbSJens Wiklander * 4583d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 4593d3b0591SJens Wiklander * to use. 4603d3b0591SJens Wiklander * \param path The input file name. 4613d3b0591SJens Wiklander * \param output The generic message-digest checksum result. 4623d3b0591SJens Wiklander * 4633d3b0591SJens Wiklander * \return \c 0 on success. 4643d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing 4653d3b0591SJens Wiklander * the file pointed by \p path. 4663d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. 467817466cbSJens Wiklander */ 468039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 469817466cbSJens Wiklander int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, 470817466cbSJens Wiklander unsigned char *output); 471817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */ 472817466cbSJens Wiklander 473817466cbSJens Wiklander /** 4743d3b0591SJens Wiklander * \brief This function sets the HMAC key and prepares to 4753d3b0591SJens Wiklander * authenticate a new message. 476817466cbSJens Wiklander * 4773d3b0591SJens Wiklander * Call this function after mbedtls_md_setup(), to use 4783d3b0591SJens Wiklander * the MD context for an HMAC calculation, then call 4793d3b0591SJens Wiklander * mbedtls_md_hmac_update() to provide the input data, and 4803d3b0591SJens Wiklander * mbedtls_md_hmac_finish() to get the HMAC value. 481817466cbSJens Wiklander * 4823d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 4833d3b0591SJens Wiklander * context. 4843d3b0591SJens Wiklander * \param key The HMAC secret key. 4853d3b0591SJens Wiklander * \param keylen The length of the HMAC key in Bytes. 4863d3b0591SJens Wiklander * 4873d3b0591SJens Wiklander * \return \c 0 on success. 4883d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 4893d3b0591SJens Wiklander * failure. 490817466cbSJens Wiklander */ 491039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 492817466cbSJens Wiklander int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, 493817466cbSJens Wiklander size_t keylen); 494817466cbSJens Wiklander 495817466cbSJens Wiklander /** 4963d3b0591SJens Wiklander * \brief This function feeds an input buffer into an ongoing HMAC 4973d3b0591SJens Wiklander * computation. 498817466cbSJens Wiklander * 4993d3b0591SJens Wiklander * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() 5003d3b0591SJens Wiklander * before calling this function. 5013d3b0591SJens Wiklander * You may call this function multiple times to pass the 5023d3b0591SJens Wiklander * input piecewise. 5033d3b0591SJens Wiklander * Afterwards, call mbedtls_md_hmac_finish(). 504817466cbSJens Wiklander * 5053d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 5063d3b0591SJens Wiklander * context. 5073d3b0591SJens Wiklander * \param input The buffer holding the input data. 5083d3b0591SJens Wiklander * \param ilen The length of the input data. 5093d3b0591SJens Wiklander * 5103d3b0591SJens Wiklander * \return \c 0 on success. 5113d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 5123d3b0591SJens Wiklander * failure. 513817466cbSJens Wiklander */ 514039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 515817466cbSJens Wiklander int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, 516817466cbSJens Wiklander size_t ilen); 517817466cbSJens Wiklander 518817466cbSJens Wiklander /** 5193d3b0591SJens Wiklander * \brief This function finishes the HMAC operation, and writes 5203d3b0591SJens Wiklander * the result to the output buffer. 521817466cbSJens Wiklander * 5223d3b0591SJens Wiklander * Call this function after mbedtls_md_hmac_starts() and 5233d3b0591SJens Wiklander * mbedtls_md_hmac_update() to get the HMAC value. Afterwards 5243d3b0591SJens Wiklander * you may either call mbedtls_md_free() to clear the context, 5253d3b0591SJens Wiklander * or call mbedtls_md_hmac_reset() to reuse the context with 5263d3b0591SJens Wiklander * the same HMAC key. 527817466cbSJens Wiklander * 5283d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 5293d3b0591SJens Wiklander * context. 5303d3b0591SJens Wiklander * \param output The generic HMAC checksum result. 5313d3b0591SJens Wiklander * 5323d3b0591SJens Wiklander * \return \c 0 on success. 5333d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 5343d3b0591SJens Wiklander * failure. 535817466cbSJens Wiklander */ 536039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 537817466cbSJens Wiklander int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output); 538817466cbSJens Wiklander 539817466cbSJens Wiklander /** 5403d3b0591SJens Wiklander * \brief This function prepares to authenticate a new message with 5413d3b0591SJens Wiklander * the same key as the previous HMAC operation. 542817466cbSJens Wiklander * 5433d3b0591SJens Wiklander * You may call this function after mbedtls_md_hmac_finish(). 5443d3b0591SJens Wiklander * Afterwards call mbedtls_md_hmac_update() to pass the new 5453d3b0591SJens Wiklander * input. 546817466cbSJens Wiklander * 5473d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 5483d3b0591SJens Wiklander * context. 5493d3b0591SJens Wiklander * 5503d3b0591SJens Wiklander * \return \c 0 on success. 5513d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 5523d3b0591SJens Wiklander * failure. 553817466cbSJens Wiklander */ 554039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 555817466cbSJens Wiklander int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx); 556817466cbSJens Wiklander 557817466cbSJens Wiklander /** 5583d3b0591SJens Wiklander * \brief This function calculates the full generic HMAC 5593d3b0591SJens Wiklander * on the input buffer with the provided key. 560817466cbSJens Wiklander * 5613d3b0591SJens Wiklander * The function allocates the context, performs the 5623d3b0591SJens Wiklander * calculation, and frees the context. 563817466cbSJens Wiklander * 5643d3b0591SJens Wiklander * The HMAC result is calculated as 5653d3b0591SJens Wiklander * output = generic HMAC(hmac key, input buffer). 5663d3b0591SJens Wiklander * 5673d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 5683d3b0591SJens Wiklander * to use. 5693d3b0591SJens Wiklander * \param key The HMAC secret key. 5703d3b0591SJens Wiklander * \param keylen The length of the HMAC secret key in Bytes. 5713d3b0591SJens Wiklander * \param input The buffer holding the input data. 5723d3b0591SJens Wiklander * \param ilen The length of the input data. 5733d3b0591SJens Wiklander * \param output The generic HMAC result. 5743d3b0591SJens Wiklander * 5753d3b0591SJens Wiklander * \return \c 0 on success. 5763d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 5773d3b0591SJens Wiklander * failure. 578817466cbSJens Wiklander */ 579039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 580817466cbSJens Wiklander int mbedtls_md_hmac(const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, 581817466cbSJens Wiklander const unsigned char *input, size_t ilen, 582817466cbSJens Wiklander unsigned char *output); 583817466cbSJens Wiklander 584817466cbSJens Wiklander #ifdef __cplusplus 585817466cbSJens Wiklander } 586817466cbSJens Wiklander #endif 587817466cbSJens Wiklander 588817466cbSJens Wiklander #endif /* MBEDTLS_MD_H */ 589