1817466cbSJens Wiklander /** 2817466cbSJens Wiklander * \file md.h 3817466cbSJens Wiklander * 43d3b0591SJens Wiklander * \brief This file contains the generic message-digest wrapper. 5817466cbSJens Wiklander * 6817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com> 73d3b0591SJens Wiklander */ 83d3b0591SJens Wiklander /* 97901324dSJerome Forissier * Copyright The Mbed TLS Contributors 107901324dSJerome Forissier * SPDX-License-Identifier: Apache-2.0 11817466cbSJens Wiklander * 12817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 13817466cbSJens Wiklander * not use this file except in compliance with the License. 14817466cbSJens Wiklander * You may obtain a copy of the License at 15817466cbSJens Wiklander * 16817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 17817466cbSJens Wiklander * 18817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 19817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 20817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21817466cbSJens Wiklander * See the License for the specific language governing permissions and 22817466cbSJens Wiklander * limitations under the License. 23817466cbSJens Wiklander */ 243d3b0591SJens Wiklander 25817466cbSJens Wiklander #ifndef MBEDTLS_MD_H 26817466cbSJens Wiklander #define MBEDTLS_MD_H 27817466cbSJens Wiklander 28817466cbSJens Wiklander #include <stddef.h> 29817466cbSJens Wiklander 303d3b0591SJens Wiklander #if !defined(MBEDTLS_CONFIG_FILE) 3111fa71b9SJerome Forissier #include "mbedtls/config.h" 323d3b0591SJens Wiklander #else 333d3b0591SJens Wiklander #include MBEDTLS_CONFIG_FILE 343d3b0591SJens Wiklander #endif 35*039e02dfSJerome Forissier #include "mbedtls/platform_util.h" 363d3b0591SJens Wiklander 37*039e02dfSJerome Forissier /** The selected feature is not available. */ 38*039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 39*039e02dfSJerome Forissier /** Bad input parameters to function. */ 40*039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 41*039e02dfSJerome Forissier /** Failed to allocate memory. */ 42*039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 43*039e02dfSJerome Forissier /** Opening or reading of file failed. */ 44*039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 45817466cbSJens Wiklander 463d3b0591SJens Wiklander /* MBEDTLS_ERR_MD_HW_ACCEL_FAILED is deprecated and should not be used. */ 47*039e02dfSJerome Forissier /** MD hardware accelerator failed. */ 48*039e02dfSJerome Forissier #define MBEDTLS_ERR_MD_HW_ACCEL_FAILED -0x5280 493d3b0591SJens Wiklander 50817466cbSJens Wiklander #ifdef __cplusplus 51817466cbSJens Wiklander extern "C" { 52817466cbSJens Wiklander #endif 53817466cbSJens Wiklander 543d3b0591SJens Wiklander /** 553d3b0591SJens Wiklander * \brief Supported message digests. 563d3b0591SJens Wiklander * 573d3b0591SJens Wiklander * \warning MD2, MD4, MD5 and SHA-1 are considered weak message digests and 583d3b0591SJens Wiklander * their use constitutes a security risk. We recommend considering 593d3b0591SJens Wiklander * stronger message digests instead. 603d3b0591SJens Wiklander * 613d3b0591SJens Wiklander */ 62817466cbSJens Wiklander typedef enum { 633d3b0591SJens Wiklander MBEDTLS_MD_NONE=0, /**< None. */ 643d3b0591SJens Wiklander MBEDTLS_MD_MD2, /**< The MD2 message digest. */ 653d3b0591SJens Wiklander MBEDTLS_MD_MD4, /**< The MD4 message digest. */ 663d3b0591SJens Wiklander MBEDTLS_MD_MD5, /**< The MD5 message digest. */ 673d3b0591SJens Wiklander MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ 683d3b0591SJens Wiklander MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ 693d3b0591SJens Wiklander MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ 703d3b0591SJens Wiklander MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ 713d3b0591SJens Wiklander MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ 723d3b0591SJens Wiklander MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ 73817466cbSJens Wiklander } mbedtls_md_type_t; 74817466cbSJens Wiklander 75817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C) 76817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ 77817466cbSJens Wiklander #else 78817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ 79817466cbSJens Wiklander #endif 80817466cbSJens Wiklander 8111fa71b9SJerome Forissier #if defined(MBEDTLS_SHA512_C) 8211fa71b9SJerome Forissier #define MBEDTLS_MD_MAX_BLOCK_SIZE 128 8311fa71b9SJerome Forissier #else 8411fa71b9SJerome Forissier #define MBEDTLS_MD_MAX_BLOCK_SIZE 64 8511fa71b9SJerome Forissier #endif 8611fa71b9SJerome Forissier 87817466cbSJens Wiklander /** 883d3b0591SJens Wiklander * Opaque struct defined in md_internal.h. 89817466cbSJens Wiklander */ 90817466cbSJens Wiklander typedef struct mbedtls_md_info_t mbedtls_md_info_t; 91817466cbSJens Wiklander 92817466cbSJens Wiklander /** 933d3b0591SJens Wiklander * The generic message-digest context. 94817466cbSJens Wiklander */ 953d3b0591SJens Wiklander typedef struct mbedtls_md_context_t 963d3b0591SJens Wiklander { 973d3b0591SJens Wiklander /** Information about the associated message digest. */ 98817466cbSJens Wiklander const mbedtls_md_info_t *md_info; 99817466cbSJens Wiklander 1003d3b0591SJens Wiklander /** The digest-specific context. */ 101817466cbSJens Wiklander void *md_ctx; 102817466cbSJens Wiklander 1033d3b0591SJens Wiklander /** The HMAC part of the context. */ 104817466cbSJens Wiklander void *hmac_ctx; 105817466cbSJens Wiklander } mbedtls_md_context_t; 106817466cbSJens Wiklander 107817466cbSJens Wiklander /** 1083d3b0591SJens Wiklander * \brief This function returns the list of digests supported by the 1093d3b0591SJens Wiklander * generic digest module. 110817466cbSJens Wiklander * 1117901324dSJerome Forissier * \note The list starts with the strongest available hashes. 1127901324dSJerome Forissier * 1133d3b0591SJens Wiklander * \return A statically allocated array of digests. Each element 1143d3b0591SJens Wiklander * in the returned list is an integer belonging to the 1153d3b0591SJens Wiklander * message-digest enumeration #mbedtls_md_type_t. 1163d3b0591SJens Wiklander * The last entry is 0. 117817466cbSJens Wiklander */ 118817466cbSJens Wiklander const int *mbedtls_md_list( void ); 119817466cbSJens Wiklander 120817466cbSJens Wiklander /** 1213d3b0591SJens Wiklander * \brief This function returns the message-digest information 1223d3b0591SJens Wiklander * associated with the given digest name. 123817466cbSJens Wiklander * 1243d3b0591SJens Wiklander * \param md_name The name of the digest to search for. 125817466cbSJens Wiklander * 1263d3b0591SJens Wiklander * \return The message-digest information associated with \p md_name. 1273d3b0591SJens Wiklander * \return NULL if the associated message-digest information is not found. 128817466cbSJens Wiklander */ 129817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); 130817466cbSJens Wiklander 131817466cbSJens Wiklander /** 1323d3b0591SJens Wiklander * \brief This function returns the message-digest information 1333d3b0591SJens Wiklander * associated with the given digest type. 134817466cbSJens Wiklander * 1353d3b0591SJens Wiklander * \param md_type The type of digest to search for. 136817466cbSJens Wiklander * 1373d3b0591SJens Wiklander * \return The message-digest information associated with \p md_type. 1383d3b0591SJens Wiklander * \return NULL if the associated message-digest information is not found. 139817466cbSJens Wiklander */ 140817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); 141817466cbSJens Wiklander 142817466cbSJens Wiklander /** 1433d3b0591SJens Wiklander * \brief This function initializes a message-digest context without 1443d3b0591SJens Wiklander * binding it to a particular message-digest algorithm. 1453d3b0591SJens Wiklander * 1463d3b0591SJens Wiklander * This function should always be called first. It prepares the 1473d3b0591SJens Wiklander * context for mbedtls_md_setup() for binding it to a 1483d3b0591SJens Wiklander * message-digest algorithm. 149817466cbSJens Wiklander */ 150817466cbSJens Wiklander void mbedtls_md_init( mbedtls_md_context_t *ctx ); 151817466cbSJens Wiklander 152817466cbSJens Wiklander /** 1533d3b0591SJens Wiklander * \brief This function clears the internal structure of \p ctx and 1543d3b0591SJens Wiklander * frees any embedded internal structure, but does not free 1553d3b0591SJens Wiklander * \p ctx itself. 1563d3b0591SJens Wiklander * 1573d3b0591SJens Wiklander * If you have called mbedtls_md_setup() on \p ctx, you must 1583d3b0591SJens Wiklander * call mbedtls_md_free() when you are no longer using the 1593d3b0591SJens Wiklander * context. 1603d3b0591SJens Wiklander * Calling this function if you have previously 1613d3b0591SJens Wiklander * called mbedtls_md_init() and nothing else is optional. 1623d3b0591SJens Wiklander * You must not call this function if you have not called 1633d3b0591SJens Wiklander * mbedtls_md_init(). 164817466cbSJens Wiklander */ 165817466cbSJens Wiklander void mbedtls_md_free( mbedtls_md_context_t *ctx ); 166817466cbSJens Wiklander 167817466cbSJens Wiklander #if ! defined(MBEDTLS_DEPRECATED_REMOVED) 168817466cbSJens Wiklander #if defined(MBEDTLS_DEPRECATED_WARNING) 169817466cbSJens Wiklander #define MBEDTLS_DEPRECATED __attribute__((deprecated)) 170817466cbSJens Wiklander #else 171817466cbSJens Wiklander #define MBEDTLS_DEPRECATED 172817466cbSJens Wiklander #endif 173817466cbSJens Wiklander /** 1743d3b0591SJens Wiklander * \brief This function selects the message digest algorithm to use, 1753d3b0591SJens Wiklander * and allocates internal structures. 1763d3b0591SJens Wiklander * 1773d3b0591SJens Wiklander * It should be called after mbedtls_md_init() or mbedtls_md_free(). 178817466cbSJens Wiklander * Makes it necessary to call mbedtls_md_free() later. 179817466cbSJens Wiklander * 180817466cbSJens Wiklander * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 181817466cbSJens Wiklander * 1823d3b0591SJens Wiklander * \param ctx The context to set up. 1833d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 1843d3b0591SJens Wiklander * to use. 185817466cbSJens Wiklander * 1863d3b0591SJens Wiklander * \return \c 0 on success. 1873d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 1883d3b0591SJens Wiklander * failure. 1893d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. 190817466cbSJens Wiklander */ 191817466cbSJens Wiklander int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; 192817466cbSJens Wiklander #undef MBEDTLS_DEPRECATED 193817466cbSJens Wiklander #endif /* MBEDTLS_DEPRECATED_REMOVED */ 194817466cbSJens Wiklander 195817466cbSJens Wiklander /** 1963d3b0591SJens Wiklander * \brief This function selects the message digest algorithm to use, 1973d3b0591SJens Wiklander * and allocates internal structures. 198817466cbSJens Wiklander * 1993d3b0591SJens Wiklander * It should be called after mbedtls_md_init() or 2003d3b0591SJens Wiklander * mbedtls_md_free(). Makes it necessary to call 2013d3b0591SJens Wiklander * mbedtls_md_free() later. 202817466cbSJens Wiklander * 2033d3b0591SJens Wiklander * \param ctx The context to set up. 2043d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 2053d3b0591SJens Wiklander * to use. 2063d3b0591SJens Wiklander * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), 2073d3b0591SJens Wiklander * or non-zero: HMAC is used with this context. 2083d3b0591SJens Wiklander * 2093d3b0591SJens Wiklander * \return \c 0 on success. 2103d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 2113d3b0591SJens Wiklander * failure. 2123d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. 213817466cbSJens Wiklander */ 214*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 215817466cbSJens Wiklander int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); 216817466cbSJens Wiklander 217817466cbSJens Wiklander /** 2183d3b0591SJens Wiklander * \brief This function clones the state of an message-digest 2193d3b0591SJens Wiklander * context. 220817466cbSJens Wiklander * 2213d3b0591SJens Wiklander * \note You must call mbedtls_md_setup() on \c dst before calling 2223d3b0591SJens Wiklander * this function. 223817466cbSJens Wiklander * 2243d3b0591SJens Wiklander * \note The two contexts must have the same type, 2253d3b0591SJens Wiklander * for example, both are SHA-256. 226817466cbSJens Wiklander * 2273d3b0591SJens Wiklander * \warning This function clones the message-digest state, not the 2283d3b0591SJens Wiklander * HMAC state. 229817466cbSJens Wiklander * 2303d3b0591SJens Wiklander * \param dst The destination context. 2313d3b0591SJens Wiklander * \param src The context to be cloned. 2323d3b0591SJens Wiklander * 2333d3b0591SJens Wiklander * \return \c 0 on success. 2343d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. 235817466cbSJens Wiklander */ 236*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 237817466cbSJens Wiklander int mbedtls_md_clone( mbedtls_md_context_t *dst, 238817466cbSJens Wiklander const mbedtls_md_context_t *src ); 239817466cbSJens Wiklander 240817466cbSJens Wiklander /** 2413d3b0591SJens Wiklander * \brief This function extracts the message-digest size from the 2423d3b0591SJens Wiklander * message-digest information structure. 243817466cbSJens Wiklander * 2443d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 2453d3b0591SJens Wiklander * to use. 246817466cbSJens Wiklander * 2473d3b0591SJens Wiklander * \return The size of the message-digest output in Bytes. 248817466cbSJens Wiklander */ 249817466cbSJens Wiklander unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); 250817466cbSJens Wiklander 251817466cbSJens Wiklander /** 2523d3b0591SJens Wiklander * \brief This function extracts the message-digest type from the 2533d3b0591SJens Wiklander * message-digest information structure. 254817466cbSJens Wiklander * 2553d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 2563d3b0591SJens Wiklander * to use. 257817466cbSJens Wiklander * 2583d3b0591SJens Wiklander * \return The type of the message digest. 259817466cbSJens Wiklander */ 260817466cbSJens Wiklander mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); 261817466cbSJens Wiklander 262817466cbSJens Wiklander /** 2633d3b0591SJens Wiklander * \brief This function extracts the message-digest name from the 2643d3b0591SJens Wiklander * message-digest information structure. 265817466cbSJens Wiklander * 2663d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 2673d3b0591SJens Wiklander * to use. 268817466cbSJens Wiklander * 2693d3b0591SJens Wiklander * \return The name of the message digest. 270817466cbSJens Wiklander */ 271817466cbSJens Wiklander const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); 272817466cbSJens Wiklander 273817466cbSJens Wiklander /** 2743d3b0591SJens Wiklander * \brief This function starts a message-digest computation. 275817466cbSJens Wiklander * 2763d3b0591SJens Wiklander * You must call this function after setting up the context 2773d3b0591SJens Wiklander * with mbedtls_md_setup(), and before passing data with 2783d3b0591SJens Wiklander * mbedtls_md_update(). 279817466cbSJens Wiklander * 2803d3b0591SJens Wiklander * \param ctx The generic message-digest context. 2813d3b0591SJens Wiklander * 2823d3b0591SJens Wiklander * \return \c 0 on success. 2833d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 2843d3b0591SJens Wiklander * failure. 285817466cbSJens Wiklander */ 286*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 287817466cbSJens Wiklander int mbedtls_md_starts( mbedtls_md_context_t *ctx ); 288817466cbSJens Wiklander 289817466cbSJens Wiklander /** 2903d3b0591SJens Wiklander * \brief This function feeds an input buffer into an ongoing 2913d3b0591SJens Wiklander * message-digest computation. 292817466cbSJens Wiklander * 2933d3b0591SJens Wiklander * You must call mbedtls_md_starts() before calling this 2943d3b0591SJens Wiklander * function. You may call this function multiple times. 2953d3b0591SJens Wiklander * Afterwards, call mbedtls_md_finish(). 296817466cbSJens Wiklander * 2973d3b0591SJens Wiklander * \param ctx The generic message-digest context. 2983d3b0591SJens Wiklander * \param input The buffer holding the input data. 2993d3b0591SJens Wiklander * \param ilen The length of the input data. 3003d3b0591SJens Wiklander * 3013d3b0591SJens Wiklander * \return \c 0 on success. 3023d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3033d3b0591SJens Wiklander * failure. 304817466cbSJens Wiklander */ 305*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 306817466cbSJens Wiklander int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); 307817466cbSJens Wiklander 308817466cbSJens Wiklander /** 3093d3b0591SJens Wiklander * \brief This function finishes the digest operation, 3103d3b0591SJens Wiklander * and writes the result to the output buffer. 311817466cbSJens Wiklander * 3123d3b0591SJens Wiklander * Call this function after a call to mbedtls_md_starts(), 3133d3b0591SJens Wiklander * followed by any number of calls to mbedtls_md_update(). 3143d3b0591SJens Wiklander * Afterwards, you may either clear the context with 3153d3b0591SJens Wiklander * mbedtls_md_free(), or call mbedtls_md_starts() to reuse 3163d3b0591SJens Wiklander * the context for another digest operation with the same 3173d3b0591SJens Wiklander * algorithm. 318817466cbSJens Wiklander * 3193d3b0591SJens Wiklander * \param ctx The generic message-digest context. 3203d3b0591SJens Wiklander * \param output The buffer for the generic message-digest checksum result. 3213d3b0591SJens Wiklander * 3223d3b0591SJens Wiklander * \return \c 0 on success. 3233d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3243d3b0591SJens Wiklander * failure. 325817466cbSJens Wiklander */ 326*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 327817466cbSJens Wiklander int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); 328817466cbSJens Wiklander 329817466cbSJens Wiklander /** 3303d3b0591SJens Wiklander * \brief This function calculates the message-digest of a buffer, 3313d3b0591SJens Wiklander * with respect to a configurable message-digest algorithm 3323d3b0591SJens Wiklander * in a single call. 333817466cbSJens Wiklander * 3343d3b0591SJens Wiklander * The result is calculated as 3353d3b0591SJens Wiklander * Output = message_digest(input buffer). 336817466cbSJens Wiklander * 3373d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 3383d3b0591SJens Wiklander * to use. 3393d3b0591SJens Wiklander * \param input The buffer holding the data. 3403d3b0591SJens Wiklander * \param ilen The length of the input data. 3413d3b0591SJens Wiklander * \param output The generic message-digest checksum result. 3423d3b0591SJens Wiklander * 3433d3b0591SJens Wiklander * \return \c 0 on success. 3443d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3453d3b0591SJens Wiklander * failure. 346817466cbSJens Wiklander */ 347*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 348817466cbSJens Wiklander int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 349817466cbSJens Wiklander unsigned char *output ); 350817466cbSJens Wiklander 351817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 352817466cbSJens Wiklander /** 3533d3b0591SJens Wiklander * \brief This function calculates the message-digest checksum 3543d3b0591SJens Wiklander * result of the contents of the provided file. 355817466cbSJens Wiklander * 3563d3b0591SJens Wiklander * The result is calculated as 3573d3b0591SJens Wiklander * Output = message_digest(file contents). 358817466cbSJens Wiklander * 3593d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 3603d3b0591SJens Wiklander * to use. 3613d3b0591SJens Wiklander * \param path The input file name. 3623d3b0591SJens Wiklander * \param output The generic message-digest checksum result. 3633d3b0591SJens Wiklander * 3643d3b0591SJens Wiklander * \return \c 0 on success. 3653d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing 3663d3b0591SJens Wiklander * the file pointed by \p path. 3673d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. 368817466cbSJens Wiklander */ 369*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 370817466cbSJens Wiklander int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, 371817466cbSJens Wiklander unsigned char *output ); 372817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */ 373817466cbSJens Wiklander 374817466cbSJens Wiklander /** 3753d3b0591SJens Wiklander * \brief This function sets the HMAC key and prepares to 3763d3b0591SJens Wiklander * authenticate a new message. 377817466cbSJens Wiklander * 3783d3b0591SJens Wiklander * Call this function after mbedtls_md_setup(), to use 3793d3b0591SJens Wiklander * the MD context for an HMAC calculation, then call 3803d3b0591SJens Wiklander * mbedtls_md_hmac_update() to provide the input data, and 3813d3b0591SJens Wiklander * mbedtls_md_hmac_finish() to get the HMAC value. 382817466cbSJens Wiklander * 3833d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 3843d3b0591SJens Wiklander * context. 3853d3b0591SJens Wiklander * \param key The HMAC secret key. 3863d3b0591SJens Wiklander * \param keylen The length of the HMAC key in Bytes. 3873d3b0591SJens Wiklander * 3883d3b0591SJens Wiklander * \return \c 0 on success. 3893d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 3903d3b0591SJens Wiklander * failure. 391817466cbSJens Wiklander */ 392*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 393817466cbSJens Wiklander int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, 394817466cbSJens Wiklander size_t keylen ); 395817466cbSJens Wiklander 396817466cbSJens Wiklander /** 3973d3b0591SJens Wiklander * \brief This function feeds an input buffer into an ongoing HMAC 3983d3b0591SJens Wiklander * computation. 399817466cbSJens Wiklander * 4003d3b0591SJens Wiklander * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() 4013d3b0591SJens Wiklander * before calling this function. 4023d3b0591SJens Wiklander * You may call this function multiple times to pass the 4033d3b0591SJens Wiklander * input piecewise. 4043d3b0591SJens Wiklander * Afterwards, call mbedtls_md_hmac_finish(). 405817466cbSJens Wiklander * 4063d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 4073d3b0591SJens Wiklander * context. 4083d3b0591SJens Wiklander * \param input The buffer holding the input data. 4093d3b0591SJens Wiklander * \param ilen The length of the input data. 4103d3b0591SJens Wiklander * 4113d3b0591SJens Wiklander * \return \c 0 on success. 4123d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 4133d3b0591SJens Wiklander * failure. 414817466cbSJens Wiklander */ 415*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 416817466cbSJens Wiklander int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, 417817466cbSJens Wiklander size_t ilen ); 418817466cbSJens Wiklander 419817466cbSJens Wiklander /** 4203d3b0591SJens Wiklander * \brief This function finishes the HMAC operation, and writes 4213d3b0591SJens Wiklander * the result to the output buffer. 422817466cbSJens Wiklander * 4233d3b0591SJens Wiklander * Call this function after mbedtls_md_hmac_starts() and 4243d3b0591SJens Wiklander * mbedtls_md_hmac_update() to get the HMAC value. Afterwards 4253d3b0591SJens Wiklander * you may either call mbedtls_md_free() to clear the context, 4263d3b0591SJens Wiklander * or call mbedtls_md_hmac_reset() to reuse the context with 4273d3b0591SJens Wiklander * the same HMAC key. 428817466cbSJens Wiklander * 4293d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 4303d3b0591SJens Wiklander * context. 4313d3b0591SJens Wiklander * \param output The generic HMAC checksum result. 4323d3b0591SJens Wiklander * 4333d3b0591SJens Wiklander * \return \c 0 on success. 4343d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 4353d3b0591SJens Wiklander * failure. 436817466cbSJens Wiklander */ 437*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 438817466cbSJens Wiklander int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); 439817466cbSJens Wiklander 440817466cbSJens Wiklander /** 4413d3b0591SJens Wiklander * \brief This function prepares to authenticate a new message with 4423d3b0591SJens Wiklander * the same key as the previous HMAC operation. 443817466cbSJens Wiklander * 4443d3b0591SJens Wiklander * You may call this function after mbedtls_md_hmac_finish(). 4453d3b0591SJens Wiklander * Afterwards call mbedtls_md_hmac_update() to pass the new 4463d3b0591SJens Wiklander * input. 447817466cbSJens Wiklander * 4483d3b0591SJens Wiklander * \param ctx The message digest context containing an embedded HMAC 4493d3b0591SJens Wiklander * context. 4503d3b0591SJens Wiklander * 4513d3b0591SJens Wiklander * \return \c 0 on success. 4523d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 4533d3b0591SJens Wiklander * failure. 454817466cbSJens Wiklander */ 455*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 456817466cbSJens Wiklander int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); 457817466cbSJens Wiklander 458817466cbSJens Wiklander /** 4593d3b0591SJens Wiklander * \brief This function calculates the full generic HMAC 4603d3b0591SJens Wiklander * on the input buffer with the provided key. 461817466cbSJens Wiklander * 4623d3b0591SJens Wiklander * The function allocates the context, performs the 4633d3b0591SJens Wiklander * calculation, and frees the context. 464817466cbSJens Wiklander * 4653d3b0591SJens Wiklander * The HMAC result is calculated as 4663d3b0591SJens Wiklander * output = generic HMAC(hmac key, input buffer). 4673d3b0591SJens Wiklander * 4683d3b0591SJens Wiklander * \param md_info The information structure of the message-digest algorithm 4693d3b0591SJens Wiklander * to use. 4703d3b0591SJens Wiklander * \param key The HMAC secret key. 4713d3b0591SJens Wiklander * \param keylen The length of the HMAC secret key in Bytes. 4723d3b0591SJens Wiklander * \param input The buffer holding the input data. 4733d3b0591SJens Wiklander * \param ilen The length of the input data. 4743d3b0591SJens Wiklander * \param output The generic HMAC result. 4753d3b0591SJens Wiklander * 4763d3b0591SJens Wiklander * \return \c 0 on success. 4773d3b0591SJens Wiklander * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 4783d3b0591SJens Wiklander * failure. 479817466cbSJens Wiklander */ 480*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 481817466cbSJens Wiklander int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, 482817466cbSJens Wiklander const unsigned char *input, size_t ilen, 483817466cbSJens Wiklander unsigned char *output ); 484817466cbSJens Wiklander 485817466cbSJens Wiklander /* Internal use */ 486*039e02dfSJerome Forissier MBEDTLS_CHECK_RETURN_TYPICAL 487817466cbSJens Wiklander int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); 488817466cbSJens Wiklander 489817466cbSJens Wiklander #ifdef __cplusplus 490817466cbSJens Wiklander } 491817466cbSJens Wiklander #endif 492817466cbSJens Wiklander 493817466cbSJens Wiklander #endif /* MBEDTLS_MD_H */ 494