1*817466cbSJens Wiklander /** 2*817466cbSJens Wiklander * \file md.h 3*817466cbSJens Wiklander * 4*817466cbSJens Wiklander * \brief Generic message digest wrapper 5*817466cbSJens Wiklander * 6*817466cbSJens Wiklander * \author Adriaan de Jong <dejong@fox-it.com> 7*817466cbSJens Wiklander * 8*817466cbSJens Wiklander * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 9*817466cbSJens Wiklander * SPDX-License-Identifier: Apache-2.0 10*817466cbSJens Wiklander * 11*817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 12*817466cbSJens Wiklander * not use this file except in compliance with the License. 13*817466cbSJens Wiklander * You may obtain a copy of the License at 14*817466cbSJens Wiklander * 15*817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 16*817466cbSJens Wiklander * 17*817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 18*817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 19*817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20*817466cbSJens Wiklander * See the License for the specific language governing permissions and 21*817466cbSJens Wiklander * limitations under the License. 22*817466cbSJens Wiklander * 23*817466cbSJens Wiklander * This file is part of mbed TLS (https://tls.mbed.org) 24*817466cbSJens Wiklander */ 25*817466cbSJens Wiklander #ifndef MBEDTLS_MD_H 26*817466cbSJens Wiklander #define MBEDTLS_MD_H 27*817466cbSJens Wiklander 28*817466cbSJens Wiklander #include <stddef.h> 29*817466cbSJens Wiklander 30*817466cbSJens Wiklander #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ 31*817466cbSJens Wiklander #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ 32*817466cbSJens Wiklander #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ 33*817466cbSJens Wiklander #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ 34*817466cbSJens Wiklander 35*817466cbSJens Wiklander #ifdef __cplusplus 36*817466cbSJens Wiklander extern "C" { 37*817466cbSJens Wiklander #endif 38*817466cbSJens Wiklander 39*817466cbSJens Wiklander typedef enum { 40*817466cbSJens Wiklander MBEDTLS_MD_NONE=0, 41*817466cbSJens Wiklander MBEDTLS_MD_MD2, 42*817466cbSJens Wiklander MBEDTLS_MD_MD4, 43*817466cbSJens Wiklander MBEDTLS_MD_MD5, 44*817466cbSJens Wiklander MBEDTLS_MD_SHA1, 45*817466cbSJens Wiklander MBEDTLS_MD_SHA224, 46*817466cbSJens Wiklander MBEDTLS_MD_SHA256, 47*817466cbSJens Wiklander MBEDTLS_MD_SHA384, 48*817466cbSJens Wiklander MBEDTLS_MD_SHA512, 49*817466cbSJens Wiklander MBEDTLS_MD_RIPEMD160, 50*817466cbSJens Wiklander } mbedtls_md_type_t; 51*817466cbSJens Wiklander 52*817466cbSJens Wiklander #if defined(MBEDTLS_SHA512_C) 53*817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ 54*817466cbSJens Wiklander #else 55*817466cbSJens Wiklander #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ 56*817466cbSJens Wiklander #endif 57*817466cbSJens Wiklander 58*817466cbSJens Wiklander /** 59*817466cbSJens Wiklander * Opaque struct defined in md_internal.h 60*817466cbSJens Wiklander */ 61*817466cbSJens Wiklander typedef struct mbedtls_md_info_t mbedtls_md_info_t; 62*817466cbSJens Wiklander 63*817466cbSJens Wiklander /** 64*817466cbSJens Wiklander * Generic message digest context. 65*817466cbSJens Wiklander */ 66*817466cbSJens Wiklander typedef struct { 67*817466cbSJens Wiklander /** Information about the associated message digest */ 68*817466cbSJens Wiklander const mbedtls_md_info_t *md_info; 69*817466cbSJens Wiklander 70*817466cbSJens Wiklander /** Digest-specific context */ 71*817466cbSJens Wiklander void *md_ctx; 72*817466cbSJens Wiklander 73*817466cbSJens Wiklander /** HMAC part of the context */ 74*817466cbSJens Wiklander void *hmac_ctx; 75*817466cbSJens Wiklander } mbedtls_md_context_t; 76*817466cbSJens Wiklander 77*817466cbSJens Wiklander /** 78*817466cbSJens Wiklander * \brief Returns the list of digests supported by the generic digest module. 79*817466cbSJens Wiklander * 80*817466cbSJens Wiklander * \return a statically allocated array of digests, the last entry 81*817466cbSJens Wiklander * is 0. 82*817466cbSJens Wiklander */ 83*817466cbSJens Wiklander const int *mbedtls_md_list( void ); 84*817466cbSJens Wiklander 85*817466cbSJens Wiklander /** 86*817466cbSJens Wiklander * \brief Returns the message digest information associated with the 87*817466cbSJens Wiklander * given digest name. 88*817466cbSJens Wiklander * 89*817466cbSJens Wiklander * \param md_name Name of the digest to search for. 90*817466cbSJens Wiklander * 91*817466cbSJens Wiklander * \return The message digest information associated with md_name or 92*817466cbSJens Wiklander * NULL if not found. 93*817466cbSJens Wiklander */ 94*817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); 95*817466cbSJens Wiklander 96*817466cbSJens Wiklander /** 97*817466cbSJens Wiklander * \brief Returns the message digest information associated with the 98*817466cbSJens Wiklander * given digest type. 99*817466cbSJens Wiklander * 100*817466cbSJens Wiklander * \param md_type type of digest to search for. 101*817466cbSJens Wiklander * 102*817466cbSJens Wiklander * \return The message digest information associated with md_type or 103*817466cbSJens Wiklander * NULL if not found. 104*817466cbSJens Wiklander */ 105*817466cbSJens Wiklander const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); 106*817466cbSJens Wiklander 107*817466cbSJens Wiklander /** 108*817466cbSJens Wiklander * \brief Initialize a md_context (as NONE) 109*817466cbSJens Wiklander * This should always be called first. 110*817466cbSJens Wiklander * Prepares the context for mbedtls_md_setup() or mbedtls_md_free(). 111*817466cbSJens Wiklander */ 112*817466cbSJens Wiklander void mbedtls_md_init( mbedtls_md_context_t *ctx ); 113*817466cbSJens Wiklander 114*817466cbSJens Wiklander /** 115*817466cbSJens Wiklander * \brief Free and clear the internal structures of ctx. 116*817466cbSJens Wiklander * Can be called at any time after mbedtls_md_init(). 117*817466cbSJens Wiklander * Mandatory once mbedtls_md_setup() has been called. 118*817466cbSJens Wiklander */ 119*817466cbSJens Wiklander void mbedtls_md_free( mbedtls_md_context_t *ctx ); 120*817466cbSJens Wiklander 121*817466cbSJens Wiklander #if ! defined(MBEDTLS_DEPRECATED_REMOVED) 122*817466cbSJens Wiklander #if defined(MBEDTLS_DEPRECATED_WARNING) 123*817466cbSJens Wiklander #define MBEDTLS_DEPRECATED __attribute__((deprecated)) 124*817466cbSJens Wiklander #else 125*817466cbSJens Wiklander #define MBEDTLS_DEPRECATED 126*817466cbSJens Wiklander #endif 127*817466cbSJens Wiklander /** 128*817466cbSJens Wiklander * \brief Select MD to use and allocate internal structures. 129*817466cbSJens Wiklander * Should be called after mbedtls_md_init() or mbedtls_md_free(). 130*817466cbSJens Wiklander * Makes it necessary to call mbedtls_md_free() later. 131*817466cbSJens Wiklander * 132*817466cbSJens Wiklander * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 133*817466cbSJens Wiklander * 134*817466cbSJens Wiklander * \param ctx Context to set up. 135*817466cbSJens Wiklander * \param md_info Message digest to use. 136*817466cbSJens Wiklander * 137*817466cbSJens Wiklander * \returns \c 0 on success, 138*817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, 139*817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. 140*817466cbSJens Wiklander */ 141*817466cbSJens Wiklander int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; 142*817466cbSJens Wiklander #undef MBEDTLS_DEPRECATED 143*817466cbSJens Wiklander #endif /* MBEDTLS_DEPRECATED_REMOVED */ 144*817466cbSJens Wiklander 145*817466cbSJens Wiklander /** 146*817466cbSJens Wiklander * \brief Select MD to use and allocate internal structures. 147*817466cbSJens Wiklander * Should be called after mbedtls_md_init() or mbedtls_md_free(). 148*817466cbSJens Wiklander * Makes it necessary to call mbedtls_md_free() later. 149*817466cbSJens Wiklander * 150*817466cbSJens Wiklander * \param ctx Context to set up. 151*817466cbSJens Wiklander * \param md_info Message digest to use. 152*817466cbSJens Wiklander * \param hmac 0 to save some memory if HMAC will not be used, 153*817466cbSJens Wiklander * non-zero is HMAC is going to be used with this context. 154*817466cbSJens Wiklander * 155*817466cbSJens Wiklander * \returns \c 0 on success, 156*817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, 157*817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. 158*817466cbSJens Wiklander */ 159*817466cbSJens Wiklander int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); 160*817466cbSJens Wiklander 161*817466cbSJens Wiklander /** 162*817466cbSJens Wiklander * \brief Clone the state of an MD context 163*817466cbSJens Wiklander * 164*817466cbSJens Wiklander * \note The two contexts must have been setup to the same type 165*817466cbSJens Wiklander * (cloning from SHA-256 to SHA-512 make no sense). 166*817466cbSJens Wiklander * 167*817466cbSJens Wiklander * \warning Only clones the MD state, not the HMAC state! (for now) 168*817466cbSJens Wiklander * 169*817466cbSJens Wiklander * \param dst The destination context 170*817466cbSJens Wiklander * \param src The context to be cloned 171*817466cbSJens Wiklander * 172*817466cbSJens Wiklander * \return \c 0 on success, 173*817466cbSJens Wiklander * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure. 174*817466cbSJens Wiklander */ 175*817466cbSJens Wiklander int mbedtls_md_clone( mbedtls_md_context_t *dst, 176*817466cbSJens Wiklander const mbedtls_md_context_t *src ); 177*817466cbSJens Wiklander 178*817466cbSJens Wiklander /** 179*817466cbSJens Wiklander * \brief Returns the size of the message digest output. 180*817466cbSJens Wiklander * 181*817466cbSJens Wiklander * \param md_info message digest info 182*817466cbSJens Wiklander * 183*817466cbSJens Wiklander * \return size of the message digest output in bytes. 184*817466cbSJens Wiklander */ 185*817466cbSJens Wiklander unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); 186*817466cbSJens Wiklander 187*817466cbSJens Wiklander /** 188*817466cbSJens Wiklander * \brief Returns the type of the message digest output. 189*817466cbSJens Wiklander * 190*817466cbSJens Wiklander * \param md_info message digest info 191*817466cbSJens Wiklander * 192*817466cbSJens Wiklander * \return type of the message digest output. 193*817466cbSJens Wiklander */ 194*817466cbSJens Wiklander mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); 195*817466cbSJens Wiklander 196*817466cbSJens Wiklander /** 197*817466cbSJens Wiklander * \brief Returns the name of the message digest output. 198*817466cbSJens Wiklander * 199*817466cbSJens Wiklander * \param md_info message digest info 200*817466cbSJens Wiklander * 201*817466cbSJens Wiklander * \return name of the message digest output. 202*817466cbSJens Wiklander */ 203*817466cbSJens Wiklander const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); 204*817466cbSJens Wiklander 205*817466cbSJens Wiklander /** 206*817466cbSJens Wiklander * \brief Prepare the context to digest a new message. 207*817466cbSJens Wiklander * Generally called after mbedtls_md_setup() or mbedtls_md_finish(). 208*817466cbSJens Wiklander * Followed by mbedtls_md_update(). 209*817466cbSJens Wiklander * 210*817466cbSJens Wiklander * \param ctx generic message digest context. 211*817466cbSJens Wiklander * 212*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 213*817466cbSJens Wiklander * verification fails. 214*817466cbSJens Wiklander */ 215*817466cbSJens Wiklander int mbedtls_md_starts( mbedtls_md_context_t *ctx ); 216*817466cbSJens Wiklander 217*817466cbSJens Wiklander /** 218*817466cbSJens Wiklander * \brief Generic message digest process buffer 219*817466cbSJens Wiklander * Called between mbedtls_md_starts() and mbedtls_md_finish(). 220*817466cbSJens Wiklander * May be called repeatedly. 221*817466cbSJens Wiklander * 222*817466cbSJens Wiklander * \param ctx Generic message digest context 223*817466cbSJens Wiklander * \param input buffer holding the datal 224*817466cbSJens Wiklander * \param ilen length of the input data 225*817466cbSJens Wiklander * 226*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 227*817466cbSJens Wiklander * verification fails. 228*817466cbSJens Wiklander */ 229*817466cbSJens Wiklander int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); 230*817466cbSJens Wiklander 231*817466cbSJens Wiklander /** 232*817466cbSJens Wiklander * \brief Generic message digest final digest 233*817466cbSJens Wiklander * Called after mbedtls_md_update(). 234*817466cbSJens Wiklander * Usually followed by mbedtls_md_free() or mbedtls_md_starts(). 235*817466cbSJens Wiklander * 236*817466cbSJens Wiklander * \param ctx Generic message digest context 237*817466cbSJens Wiklander * \param output Generic message digest checksum result 238*817466cbSJens Wiklander * 239*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 240*817466cbSJens Wiklander * verification fails. 241*817466cbSJens Wiklander */ 242*817466cbSJens Wiklander int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); 243*817466cbSJens Wiklander 244*817466cbSJens Wiklander /** 245*817466cbSJens Wiklander * \brief Output = message_digest( input buffer ) 246*817466cbSJens Wiklander * 247*817466cbSJens Wiklander * \param md_info message digest info 248*817466cbSJens Wiklander * \param input buffer holding the data 249*817466cbSJens Wiklander * \param ilen length of the input data 250*817466cbSJens Wiklander * \param output Generic message digest checksum result 251*817466cbSJens Wiklander * 252*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 253*817466cbSJens Wiklander * verification fails. 254*817466cbSJens Wiklander */ 255*817466cbSJens Wiklander int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 256*817466cbSJens Wiklander unsigned char *output ); 257*817466cbSJens Wiklander 258*817466cbSJens Wiklander #if defined(MBEDTLS_FS_IO) 259*817466cbSJens Wiklander /** 260*817466cbSJens Wiklander * \brief Output = message_digest( file contents ) 261*817466cbSJens Wiklander * 262*817466cbSJens Wiklander * \param md_info message digest info 263*817466cbSJens Wiklander * \param path input file name 264*817466cbSJens Wiklander * \param output generic message digest checksum result 265*817466cbSJens Wiklander * 266*817466cbSJens Wiklander * \return 0 if successful, 267*817466cbSJens Wiklander * MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed, 268*817466cbSJens Wiklander * MBEDTLS_ERR_MD_BAD_INPUT_DATA if md_info was NULL. 269*817466cbSJens Wiklander */ 270*817466cbSJens Wiklander int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, 271*817466cbSJens Wiklander unsigned char *output ); 272*817466cbSJens Wiklander #endif /* MBEDTLS_FS_IO */ 273*817466cbSJens Wiklander 274*817466cbSJens Wiklander /** 275*817466cbSJens Wiklander * \brief Set HMAC key and prepare to authenticate a new message. 276*817466cbSJens Wiklander * Usually called after mbedtls_md_setup() or mbedtls_md_hmac_finish(). 277*817466cbSJens Wiklander * 278*817466cbSJens Wiklander * \param ctx HMAC context 279*817466cbSJens Wiklander * \param key HMAC secret key 280*817466cbSJens Wiklander * \param keylen length of the HMAC key in bytes 281*817466cbSJens Wiklander * 282*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 283*817466cbSJens Wiklander * verification fails. 284*817466cbSJens Wiklander */ 285*817466cbSJens Wiklander int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, 286*817466cbSJens Wiklander size_t keylen ); 287*817466cbSJens Wiklander 288*817466cbSJens Wiklander /** 289*817466cbSJens Wiklander * \brief Generic HMAC process buffer. 290*817466cbSJens Wiklander * Called between mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() 291*817466cbSJens Wiklander * and mbedtls_md_hmac_finish(). 292*817466cbSJens Wiklander * May be called repeatedly. 293*817466cbSJens Wiklander * 294*817466cbSJens Wiklander * \param ctx HMAC context 295*817466cbSJens Wiklander * \param input buffer holding the data 296*817466cbSJens Wiklander * \param ilen length of the input data 297*817466cbSJens Wiklander * 298*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 299*817466cbSJens Wiklander * verification fails. 300*817466cbSJens Wiklander */ 301*817466cbSJens Wiklander int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, 302*817466cbSJens Wiklander size_t ilen ); 303*817466cbSJens Wiklander 304*817466cbSJens Wiklander /** 305*817466cbSJens Wiklander * \brief Output HMAC. 306*817466cbSJens Wiklander * Called after mbedtls_md_hmac_update(). 307*817466cbSJens Wiklander * Usually followed by mbedtls_md_hmac_reset(), 308*817466cbSJens Wiklander * mbedtls_md_hmac_starts(), or mbedtls_md_free(). 309*817466cbSJens Wiklander * 310*817466cbSJens Wiklander * \param ctx HMAC context 311*817466cbSJens Wiklander * \param output Generic HMAC checksum result 312*817466cbSJens Wiklander * 313*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 314*817466cbSJens Wiklander * verification fails. 315*817466cbSJens Wiklander */ 316*817466cbSJens Wiklander int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); 317*817466cbSJens Wiklander 318*817466cbSJens Wiklander /** 319*817466cbSJens Wiklander * \brief Prepare to authenticate a new message with the same key. 320*817466cbSJens Wiklander * Called after mbedtls_md_hmac_finish() and before 321*817466cbSJens Wiklander * mbedtls_md_hmac_update(). 322*817466cbSJens Wiklander * 323*817466cbSJens Wiklander * \param ctx HMAC context to be reset 324*817466cbSJens Wiklander * 325*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 326*817466cbSJens Wiklander * verification fails. 327*817466cbSJens Wiklander */ 328*817466cbSJens Wiklander int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); 329*817466cbSJens Wiklander 330*817466cbSJens Wiklander /** 331*817466cbSJens Wiklander * \brief Output = Generic_HMAC( hmac key, input buffer ) 332*817466cbSJens Wiklander * 333*817466cbSJens Wiklander * \param md_info message digest info 334*817466cbSJens Wiklander * \param key HMAC secret key 335*817466cbSJens Wiklander * \param keylen length of the HMAC key in bytes 336*817466cbSJens Wiklander * \param input buffer holding the data 337*817466cbSJens Wiklander * \param ilen length of the input data 338*817466cbSJens Wiklander * \param output Generic HMAC-result 339*817466cbSJens Wiklander * 340*817466cbSJens Wiklander * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter 341*817466cbSJens Wiklander * verification fails. 342*817466cbSJens Wiklander */ 343*817466cbSJens Wiklander int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, 344*817466cbSJens Wiklander const unsigned char *input, size_t ilen, 345*817466cbSJens Wiklander unsigned char *output ); 346*817466cbSJens Wiklander 347*817466cbSJens Wiklander /* Internal use */ 348*817466cbSJens Wiklander int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); 349*817466cbSJens Wiklander 350*817466cbSJens Wiklander #ifdef __cplusplus 351*817466cbSJens Wiklander } 352*817466cbSJens Wiklander #endif 353*817466cbSJens Wiklander 354*817466cbSJens Wiklander #endif /* MBEDTLS_MD_H */ 355