1*c6672fdcSEdison Ai /* SPDX-License-Identifier: Apache-2.0 */ 2817466cbSJens Wiklander /** 3817466cbSJens Wiklander * \file md.h 4817466cbSJens Wiklander * 5817466cbSJens Wiklander * \brief Generic message digest wrapper 6817466cbSJens Wiklander * 7817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com> 8817466cbSJens Wiklander * 9817466cbSJens Wiklander * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 10817466cbSJens Wiklander * 11817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 12817466cbSJens Wiklander * not use this file except in compliance with the License. 13817466cbSJens Wiklander * You may obtain a copy of the License at 14817466cbSJens Wiklander * 15817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 16817466cbSJens Wiklander * 17817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 18817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 19817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20817466cbSJens Wiklander * See the License for the specific language governing permissions and 21817466cbSJens Wiklander * limitations under the License. 22817466cbSJens Wiklander * 23817466cbSJens Wiklander * This file is part of mbed TLS (https://tls.mbed.org) 24817466cbSJens Wiklander */ 25817466cbSJens Wiklander #ifndef MBEDTLS_MD_H 26817466cbSJens Wiklander #define MBEDTLS_MD_H 27817466cbSJens Wiklander 28817466cbSJens Wiklander #include <stddef.h> 29817466cbSJens Wiklander 30817466cbSJens Wiklander #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ 31817466cbSJens Wiklander #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ 32817466cbSJens Wiklander #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ 33817466cbSJens Wiklander #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ 34817466cbSJens Wiklander 35817466cbSJens Wiklander #ifdef __cplusplus 36817466cbSJens Wiklander extern "C" { 37817466cbSJens Wiklander #endif 38817466cbSJens Wiklander 39817466cbSJens Wiklander typedef enum { 40817466cbSJens Wiklander MBEDTLS_MD_NONE=0, 41817466cbSJens Wiklander MBEDTLS_MD_MD2, 42817466cbSJens Wiklander MBEDTLS_MD_MD4, 43817466cbSJens Wiklander MBEDTLS_MD_MD5, 44817466cbSJens Wiklander MBEDTLS_MD_SHA1, 45817466cbSJens Wiklander MBEDTLS_MD_SHA224, 46817466cbSJens Wiklander MBEDTLS_MD_SHA256, 47817466cbSJens Wiklander MBEDTLS_MD_SHA384, 48817466cbSJens Wiklander MBEDTLS_MD_SHA512, 49817466cbSJens Wiklander MBEDTLS_MD_RIPEMD160, 50817466cbSJens Wiklander } mbedtls_md_type_t; 51817466cbSJens Wiklander 52817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C) 53817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ 54817466cbSJens Wiklander #else 55817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ 56817466cbSJens Wiklander #endif 57817466cbSJens Wiklander 58817466cbSJens Wiklander /** 59817466cbSJens Wiklander * Opaque struct defined in md_internal.h 60817466cbSJens Wiklander */ 61817466cbSJens Wiklander typedef struct mbedtls_md_info_t mbedtls_md_info_t; 62817466cbSJens Wiklander 63817466cbSJens Wiklander /** 64817466cbSJens Wiklander * Generic message digest context. 65817466cbSJens Wiklander */ 66817466cbSJens Wiklander typedef struct { 67817466cbSJens Wiklander /** Information about the associated message digest */ 68817466cbSJens Wiklander const mbedtls_md_info_t *md_info; 69817466cbSJens Wiklander 70817466cbSJens Wiklander /** Digest-specific context */ 71817466cbSJens Wiklander void *md_ctx; 72817466cbSJens Wiklander 73817466cbSJens Wiklander /** HMAC part of the context */ 74817466cbSJens Wiklander void *hmac_ctx; 75817466cbSJens Wiklander } mbedtls_md_context_t; 76817466cbSJens Wiklander 77817466cbSJens Wiklander /** 78817466cbSJens Wiklander * \brief Returns the list of digests supported by the generic digest module. 79817466cbSJens Wiklander * 80817466cbSJens Wiklander * \return a statically allocated array of digests, the last entry 81817466cbSJens Wiklander * is 0. 82817466cbSJens Wiklander */ 83817466cbSJens Wiklander const int *mbedtls_md_list( void ); 84817466cbSJens Wiklander 85817466cbSJens Wiklander /** 86817466cbSJens Wiklander * \brief Returns the message digest information associated with the 87817466cbSJens Wiklander * given digest name. 88817466cbSJens Wiklander * 89817466cbSJens Wiklander * \param md_name Name of the digest to search for. 90817466cbSJens Wiklander * 91817466cbSJens Wiklander * \return The message digest information associated with md_name or 92817466cbSJens Wiklander * NULL if not found. 93817466cbSJens Wiklander */ 94817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); 95817466cbSJens Wiklander 96817466cbSJens Wiklander /** 97817466cbSJens Wiklander * \brief Returns the message digest information associated with the 98817466cbSJens Wiklander * given digest type. 99817466cbSJens Wiklander * 100817466cbSJens Wiklander * \param md_type type of digest to search for. 101817466cbSJens Wiklander * 102817466cbSJens Wiklander * \return The message digest information associated with md_type or 103817466cbSJens Wiklander * NULL if not found. 104817466cbSJens Wiklander */ 105817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); 106817466cbSJens Wiklander 107817466cbSJens Wiklander /** 108817466cbSJens Wiklander * \brief Initialize a md_context (as NONE) 109817466cbSJens Wiklander * This should always be called first. 110817466cbSJens Wiklander * Prepares the context for mbedtls_md_setup() or mbedtls_md_free(). 111817466cbSJens Wiklander */ 112817466cbSJens Wiklander void mbedtls_md_init( mbedtls_md_context_t *ctx ); 113817466cbSJens Wiklander 114817466cbSJens Wiklander /** 115817466cbSJens Wiklander * \brief Free and clear the internal structures of ctx. 116817466cbSJens Wiklander * Can be called at any time after mbedtls_md_init(). 117817466cbSJens Wiklander * Mandatory once mbedtls_md_setup() has been called. 118817466cbSJens Wiklander */ 119817466cbSJens Wiklander void mbedtls_md_free( mbedtls_md_context_t *ctx ); 120817466cbSJens Wiklander 121817466cbSJens Wiklander #if ! defined(MBEDTLS_DEPRECATED_REMOVED) 122817466cbSJens Wiklander #if defined(MBEDTLS_DEPRECATED_WARNING) 123817466cbSJens Wiklander #define MBEDTLS_DEPRECATED __attribute__((deprecated)) 124817466cbSJens Wiklander #else 125817466cbSJens Wiklander #define MBEDTLS_DEPRECATED 126817466cbSJens Wiklander #endif 127817466cbSJens Wiklander /** 128817466cbSJens Wiklander * \brief Select MD to use and allocate internal structures. 129817466cbSJens Wiklander * Should be called after mbedtls_md_init() or mbedtls_md_free(). 130817466cbSJens Wiklander * Makes it necessary to call mbedtls_md_free() later. 131817466cbSJens Wiklander * 132817466cbSJens Wiklander * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 133817466cbSJens Wiklander * 134817466cbSJens Wiklander * \param ctx Context to set up. 135817466cbSJens Wiklander * \param md_info Message digest to use. 136817466cbSJens Wiklander * 137817466cbSJens Wiklander * \returns \c 0 on success, 138817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, 139817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. 140817466cbSJens Wiklander */ 141817466cbSJens Wiklander int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; 142817466cbSJens Wiklander #undef MBEDTLS_DEPRECATED 143817466cbSJens Wiklander #endif /* MBEDTLS_DEPRECATED_REMOVED */ 144817466cbSJens Wiklander 145817466cbSJens Wiklander /** 146817466cbSJens Wiklander * \brief Select MD to use and allocate internal structures. 147817466cbSJens Wiklander * Should be called after mbedtls_md_init() or mbedtls_md_free(). 148817466cbSJens Wiklander * Makes it necessary to call mbedtls_md_free() later. 149817466cbSJens Wiklander * 150817466cbSJens Wiklander * \param ctx Context to set up. 151817466cbSJens Wiklander * \param md_info Message digest to use. 152817466cbSJens Wiklander * \param hmac 0 to save some memory if HMAC will not be used, 153817466cbSJens Wiklander * non-zero is HMAC is going to be used with this context. 154817466cbSJens Wiklander * 155817466cbSJens Wiklander * \returns \c 0 on success, 156817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, 157817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. 158817466cbSJens Wiklander */ 159817466cbSJens Wiklander int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); 160817466cbSJens Wiklander 161817466cbSJens Wiklander /** 162817466cbSJens Wiklander * \brief Clone the state of an MD context 163817466cbSJens Wiklander * 164817466cbSJens Wiklander * \note The two contexts must have been setup to the same type 165817466cbSJens Wiklander * (cloning from SHA-256 to SHA-512 make no sense). 166817466cbSJens Wiklander * 167817466cbSJens Wiklander * \warning Only clones the MD state, not the HMAC state! (for now) 168817466cbSJens Wiklander * 169817466cbSJens Wiklander * \param dst The destination context 170817466cbSJens Wiklander * \param src The context to be cloned 171817466cbSJens Wiklander * 172817466cbSJens Wiklander * \return \c 0 on success, 173817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure. 174817466cbSJens Wiklander */ 175817466cbSJens Wiklander int mbedtls_md_clone( mbedtls_md_context_t *dst, 176817466cbSJens Wiklander const mbedtls_md_context_t *src ); 177817466cbSJens Wiklander 178817466cbSJens Wiklander /** 179817466cbSJens Wiklander * \brief Returns the size of the message digest output. 180817466cbSJens Wiklander * 181817466cbSJens Wiklander * \param md_info message digest info 182817466cbSJens Wiklander * 183817466cbSJens Wiklander * \return size of the message digest output in bytes. 184817466cbSJens Wiklander */ 185817466cbSJens Wiklander unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); 186817466cbSJens Wiklander 187817466cbSJens Wiklander /** 188817466cbSJens Wiklander * \brief Returns the type of the message digest output. 189817466cbSJens Wiklander * 190817466cbSJens Wiklander * \param md_info message digest info 191817466cbSJens Wiklander * 192817466cbSJens Wiklander * \return type of the message digest output. 193817466cbSJens Wiklander */ 194817466cbSJens Wiklander mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); 195817466cbSJens Wiklander 196817466cbSJens Wiklander /** 197817466cbSJens Wiklander * \brief Returns the name of the message digest output. 198817466cbSJens Wiklander * 199817466cbSJens Wiklander * \param md_info message digest info 200817466cbSJens Wiklander * 201817466cbSJens Wiklander * \return name of the message digest output. 202817466cbSJens Wiklander */ 203817466cbSJens Wiklander const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); 204817466cbSJens Wiklander 205817466cbSJens Wiklander /** 206817466cbSJens Wiklander * \brief Prepare the context to digest a new message. 207817466cbSJens Wiklander * Generally called after mbedtls_md_setup() or mbedtls_md_finish(). 208817466cbSJens Wiklander * Followed by mbedtls_md_update(). 209817466cbSJens Wiklander * 210817466cbSJens Wiklander * \param ctx generic message digest context. 211817466cbSJens Wiklander * 212817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 213817466cbSJens Wiklander * verification fails. 214817466cbSJens Wiklander */ 215817466cbSJens Wiklander int mbedtls_md_starts( mbedtls_md_context_t *ctx ); 216817466cbSJens Wiklander 217817466cbSJens Wiklander /** 218817466cbSJens Wiklander * \brief Generic message digest process buffer 219817466cbSJens Wiklander * Called between mbedtls_md_starts() and mbedtls_md_finish(). 220817466cbSJens Wiklander * May be called repeatedly. 221817466cbSJens Wiklander * 222817466cbSJens Wiklander * \param ctx Generic message digest context 223817466cbSJens Wiklander * \param input buffer holding the datal 224817466cbSJens Wiklander * \param ilen length of the input data 225817466cbSJens Wiklander * 226817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 227817466cbSJens Wiklander * verification fails. 228817466cbSJens Wiklander */ 229817466cbSJens Wiklander int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); 230817466cbSJens Wiklander 231817466cbSJens Wiklander /** 232817466cbSJens Wiklander * \brief Generic message digest final digest 233817466cbSJens Wiklander * Called after mbedtls_md_update(). 234817466cbSJens Wiklander * Usually followed by mbedtls_md_free() or mbedtls_md_starts(). 235817466cbSJens Wiklander * 236817466cbSJens Wiklander * \param ctx Generic message digest context 237817466cbSJens Wiklander * \param output Generic message digest checksum result 238817466cbSJens Wiklander * 239817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 240817466cbSJens Wiklander * verification fails. 241817466cbSJens Wiklander */ 242817466cbSJens Wiklander int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); 243817466cbSJens Wiklander 244817466cbSJens Wiklander /** 245817466cbSJens Wiklander * \brief Output = message_digest( input buffer ) 246817466cbSJens Wiklander * 247817466cbSJens Wiklander * \param md_info message digest info 248817466cbSJens Wiklander * \param input buffer holding the data 249817466cbSJens Wiklander * \param ilen length of the input data 250817466cbSJens Wiklander * \param output Generic message digest checksum result 251817466cbSJens Wiklander * 252817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 253817466cbSJens Wiklander * verification fails. 254817466cbSJens Wiklander */ 255817466cbSJens Wiklander int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 256817466cbSJens Wiklander unsigned char *output ); 257817466cbSJens Wiklander 258817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 259817466cbSJens Wiklander /** 260817466cbSJens Wiklander * \brief Output = message_digest( file contents ) 261817466cbSJens Wiklander * 262817466cbSJens Wiklander * \param md_info message digest info 263817466cbSJens Wiklander * \param path input file name 264817466cbSJens Wiklander * \param output generic message digest checksum result 265817466cbSJens Wiklander * 266817466cbSJens Wiklander * \return 0 if successful, 267817466cbSJens Wiklander * MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed, 268817466cbSJens Wiklander * MBEDTLS_ERR_MD_BAD_INPUT_DATA if md_info was NULL. 269817466cbSJens Wiklander */ 270817466cbSJens Wiklander int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, 271817466cbSJens Wiklander unsigned char *output ); 272817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */ 273817466cbSJens Wiklander 274817466cbSJens Wiklander /** 275817466cbSJens Wiklander * \brief Set HMAC key and prepare to authenticate a new message. 276817466cbSJens Wiklander * Usually called after mbedtls_md_setup() or mbedtls_md_hmac_finish(). 277817466cbSJens Wiklander * 278817466cbSJens Wiklander * \param ctx HMAC context 279817466cbSJens Wiklander * \param key HMAC secret key 280817466cbSJens Wiklander * \param keylen length of the HMAC key in bytes 281817466cbSJens Wiklander * 282817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 283817466cbSJens Wiklander * verification fails. 284817466cbSJens Wiklander */ 285817466cbSJens Wiklander int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, 286817466cbSJens Wiklander size_t keylen ); 287817466cbSJens Wiklander 288817466cbSJens Wiklander /** 289817466cbSJens Wiklander * \brief Generic HMAC process buffer. 290817466cbSJens Wiklander * Called between mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() 291817466cbSJens Wiklander * and mbedtls_md_hmac_finish(). 292817466cbSJens Wiklander * May be called repeatedly. 293817466cbSJens Wiklander * 294817466cbSJens Wiklander * \param ctx HMAC context 295817466cbSJens Wiklander * \param input buffer holding the data 296817466cbSJens Wiklander * \param ilen length of the input data 297817466cbSJens Wiklander * 298817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 299817466cbSJens Wiklander * verification fails. 300817466cbSJens Wiklander */ 301817466cbSJens Wiklander int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, 302817466cbSJens Wiklander size_t ilen ); 303817466cbSJens Wiklander 304817466cbSJens Wiklander /** 305817466cbSJens Wiklander * \brief Output HMAC. 306817466cbSJens Wiklander * Called after mbedtls_md_hmac_update(). 307817466cbSJens Wiklander * Usually followed by mbedtls_md_hmac_reset(), 308817466cbSJens Wiklander * mbedtls_md_hmac_starts(), or mbedtls_md_free(). 309817466cbSJens Wiklander * 310817466cbSJens Wiklander * \param ctx HMAC context 311817466cbSJens Wiklander * \param output Generic HMAC checksum result 312817466cbSJens Wiklander * 313817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 314817466cbSJens Wiklander * verification fails. 315817466cbSJens Wiklander */ 316817466cbSJens Wiklander int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); 317817466cbSJens Wiklander 318817466cbSJens Wiklander /** 319817466cbSJens Wiklander * \brief Prepare to authenticate a new message with the same key. 320817466cbSJens Wiklander * Called after mbedtls_md_hmac_finish() and before 321817466cbSJens Wiklander * mbedtls_md_hmac_update(). 322817466cbSJens Wiklander * 323817466cbSJens Wiklander * \param ctx HMAC context to be reset 324817466cbSJens Wiklander * 325817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 326817466cbSJens Wiklander * verification fails. 327817466cbSJens Wiklander */ 328817466cbSJens Wiklander int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); 329817466cbSJens Wiklander 330817466cbSJens Wiklander /** 331817466cbSJens Wiklander * \brief Output = Generic_HMAC( hmac key, input buffer ) 332817466cbSJens Wiklander * 333817466cbSJens Wiklander * \param md_info message digest info 334817466cbSJens Wiklander * \param key HMAC secret key 335817466cbSJens Wiklander * \param keylen length of the HMAC key in bytes 336817466cbSJens Wiklander * \param input buffer holding the data 337817466cbSJens Wiklander * \param ilen length of the input data 338817466cbSJens Wiklander * \param output Generic HMAC-result 339817466cbSJens Wiklander * 340817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 341817466cbSJens Wiklander * verification fails. 342817466cbSJens Wiklander */ 343817466cbSJens Wiklander int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, 344817466cbSJens Wiklander const unsigned char *input, size_t ilen, 345817466cbSJens Wiklander unsigned char *output ); 346817466cbSJens Wiklander 347817466cbSJens Wiklander /* Internal use */ 348817466cbSJens Wiklander int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); 349817466cbSJens Wiklander 350817466cbSJens Wiklander #ifdef __cplusplus 351817466cbSJens Wiklander } 352817466cbSJens Wiklander #endif 353817466cbSJens Wiklander 354817466cbSJens Wiklander #endif /* MBEDTLS_MD_H */ 355