1 /** 2 * \file md.h 3 * 4 * \brief This file contains the generic functions for message-digest 5 * (hashing) and HMAC. 6 * 7 * \author Adriaan de Jong <dejong@fox-it.com> 8 */ 9 /* 10 * Copyright The Mbed TLS Contributors 11 * SPDX-License-Identifier: Apache-2.0 12 * 13 * Licensed under the Apache License, Version 2.0 (the "License"); you may 14 * not use this file except in compliance with the License. 15 * You may obtain a copy of the License at 16 * 17 * http://www.apache.org/licenses/LICENSE-2.0 18 * 19 * Unless required by applicable law or agreed to in writing, software 20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22 * See the License for the specific language governing permissions and 23 * limitations under the License. 24 */ 25 26 #ifndef MBEDTLS_MD_H 27 #define MBEDTLS_MD_H 28 #include "mbedtls/private_access.h" 29 30 #include <stddef.h> 31 32 #include "mbedtls/build_info.h" 33 #include "mbedtls/platform_util.h" 34 35 #if defined(MBEDTLS_MD_LIGHT) 36 37 /* 38 * - MBEDTLS_MD_CAN_xxx is defined if the md module can perform xxx. 39 * - MBEDTLS_MD_xxx_VIA_PSA is defined if the md module may perform xxx via PSA 40 * (see below). 41 * - MBEDTLS_MD_SOME_PSA is defined if at least one algorithm may be performed 42 * via PSA (see below). 43 * - MBEDTLS_MD_SOME_LEGACY is defined if at least one algorithm may be performed 44 * via a direct legacy call (see below). 45 * 46 * The md module performs an algorithm via PSA if there is a PSA hash 47 * accelerator and the PSA driver subsytem is initialized at the time the 48 * operation is started, and makes a direct legacy call otherwise. 49 */ 50 51 /* PSA accelerated implementations */ 52 #if defined(MBEDTLS_PSA_CRYPTO_C) 53 #if defined(MBEDTLS_PSA_ACCEL_ALG_MD5) 54 #define MBEDTLS_MD_CAN_MD5 55 #define MBEDTLS_MD_MD5_VIA_PSA 56 #define MBEDTLS_MD_SOME_PSA 57 #endif 58 #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) 59 #define MBEDTLS_MD_CAN_SHA1 60 #define MBEDTLS_MD_SHA1_VIA_PSA 61 #define MBEDTLS_MD_SOME_PSA 62 #endif 63 #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) 64 #define MBEDTLS_MD_CAN_SHA224 65 #define MBEDTLS_MD_SHA224_VIA_PSA 66 #define MBEDTLS_MD_SOME_PSA 67 #endif 68 #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) 69 #define MBEDTLS_MD_CAN_SHA256 70 #define MBEDTLS_MD_SHA256_VIA_PSA 71 #define MBEDTLS_MD_SOME_PSA 72 #endif 73 #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) 74 #define MBEDTLS_MD_CAN_SHA384 75 #define MBEDTLS_MD_SHA384_VIA_PSA 76 #define MBEDTLS_MD_SOME_PSA 77 #endif 78 #if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512) 79 #define MBEDTLS_MD_CAN_SHA512 80 #define MBEDTLS_MD_SHA512_VIA_PSA 81 #define MBEDTLS_MD_SOME_PSA 82 #endif 83 #if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) 84 #define MBEDTLS_MD_CAN_RIPEMD160 85 #define MBEDTLS_MD_RIPEMD160_VIA_PSA 86 #define MBEDTLS_MD_SOME_PSA 87 #endif 88 #endif /* MBEDTLS_PSA_CRYPTO_C */ 89 90 /* Built-in implementations */ 91 #if defined(MBEDTLS_MD5_C) 92 #define MBEDTLS_MD_CAN_MD5 93 #define MBEDTLS_MD_SOME_LEGACY 94 #endif 95 #if defined(MBEDTLS_SHA1_C) 96 #define MBEDTLS_MD_CAN_SHA1 97 #define MBEDTLS_MD_SOME_LEGACY 98 #endif 99 #if defined(MBEDTLS_SHA224_C) 100 #define MBEDTLS_MD_CAN_SHA224 101 #define MBEDTLS_MD_SOME_LEGACY 102 #endif 103 #if defined(MBEDTLS_SHA256_C) 104 #define MBEDTLS_MD_CAN_SHA256 105 #define MBEDTLS_MD_SOME_LEGACY 106 #endif 107 #if defined(MBEDTLS_SHA384_C) 108 #define MBEDTLS_MD_CAN_SHA384 109 #define MBEDTLS_MD_SOME_LEGACY 110 #endif 111 #if defined(MBEDTLS_SHA512_C) 112 #define MBEDTLS_MD_CAN_SHA512 113 #define MBEDTLS_MD_SOME_LEGACY 114 #endif 115 #if defined(MBEDTLS_RIPEMD160_C) 116 #define MBEDTLS_MD_CAN_RIPEMD160 117 #define MBEDTLS_MD_SOME_LEGACY 118 #endif 119 120 #endif /* MBEDTLS_MD_LIGHT */ 121 122 /** The selected feature is not available. */ 123 #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 124 /** Bad input parameters to function. */ 125 #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 126 /** Failed to allocate memory. */ 127 #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 128 /** Opening or reading of file failed. */ 129 #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 130 131 #ifdef __cplusplus 132 extern "C" { 133 #endif 134 135 /** 136 * \brief Supported message digests. 137 * 138 * \warning MD5 and SHA-1 are considered weak message digests and 139 * their use constitutes a security risk. We recommend considering 140 * stronger message digests instead. 141 * 142 */ 143 typedef enum { 144 MBEDTLS_MD_NONE=0, /**< None. */ 145 MBEDTLS_MD_MD5, /**< The MD5 message digest. */ 146 MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ 147 MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ 148 MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ 149 MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ 150 MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ 151 MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ 152 } mbedtls_md_type_t; 153 154 #if defined(MBEDTLS_MD_CAN_SHA512) 155 #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ 156 #elif defined(MBEDTLS_MD_CAN_SHA384) 157 #define MBEDTLS_MD_MAX_SIZE 48 /* longest known is SHA384 */ 158 #elif defined(MBEDTLS_MD_CAN_SHA256) 159 #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 */ 160 #elif defined(MBEDTLS_MD_CAN_SHA224) 161 #define MBEDTLS_MD_MAX_SIZE 28 /* longest known is SHA224 */ 162 #else 163 #define MBEDTLS_MD_MAX_SIZE 20 /* longest known is SHA1 or RIPE MD-160 164 or smaller (MD5 and earlier) */ 165 #endif 166 167 #if defined(MBEDTLS_MD_CAN_SHA512) 168 #define MBEDTLS_MD_MAX_BLOCK_SIZE 128 169 #else 170 #define MBEDTLS_MD_MAX_BLOCK_SIZE 64 171 #endif 172 173 /** 174 * Opaque struct. 175 * 176 * Constructed using either #mbedtls_md_info_from_string or 177 * #mbedtls_md_info_from_type. 178 * 179 * Fields can be accessed with #mbedtls_md_get_size, 180 * #mbedtls_md_get_type and #mbedtls_md_get_name. 181 */ 182 /* Defined internally in library/md_wrap.h. */ 183 typedef struct mbedtls_md_info_t mbedtls_md_info_t; 184 185 /** 186 * Used internally to indicate whether a context uses legacy or PSA. 187 * 188 * Internal use only. 189 */ 190 typedef enum { 191 MBEDTLS_MD_ENGINE_LEGACY = 0, 192 MBEDTLS_MD_ENGINE_PSA, 193 } mbedtls_md_engine_t; 194 195 /** 196 * The generic message-digest context. 197 */ 198 typedef struct mbedtls_md_context_t { 199 /** Information about the associated message digest. */ 200 const mbedtls_md_info_t *MBEDTLS_PRIVATE(md_info); 201 202 #if defined(MBEDTLS_MD_SOME_PSA) 203 /** Are hash operations dispatched to PSA or legacy? */ 204 mbedtls_md_engine_t MBEDTLS_PRIVATE(engine); 205 #endif 206 207 /** The digest-specific context (legacy) or the PSA operation. */ 208 void *MBEDTLS_PRIVATE(md_ctx); 209 210 #if defined(MBEDTLS_MD_C) 211 /** The HMAC part of the context. */ 212 void *MBEDTLS_PRIVATE(hmac_ctx); 213 #endif 214 } mbedtls_md_context_t; 215 216 /** 217 * \brief This function returns the message-digest information 218 * associated with the given digest type. 219 * 220 * \param md_type The type of digest to search for. 221 * 222 * \return The message-digest information associated with \p md_type. 223 * \return NULL if the associated message-digest information is not found. 224 */ 225 const mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type); 226 227 /** 228 * \brief This function initializes a message-digest context without 229 * binding it to a particular message-digest algorithm. 230 * 231 * This function should always be called first. It prepares the 232 * context for mbedtls_md_setup() for binding it to a 233 * message-digest algorithm. 234 */ 235 void mbedtls_md_init(mbedtls_md_context_t *ctx); 236 237 /** 238 * \brief This function clears the internal structure of \p ctx and 239 * frees any embedded internal structure, but does not free 240 * \p ctx itself. 241 * 242 * If you have called mbedtls_md_setup() on \p ctx, you must 243 * call mbedtls_md_free() when you are no longer using the 244 * context. 245 * Calling this function if you have previously 246 * called mbedtls_md_init() and nothing else is optional. 247 * You must not call this function if you have not called 248 * mbedtls_md_init(). 249 */ 250 void mbedtls_md_free(mbedtls_md_context_t *ctx); 251 252 253 /** 254 * \brief This function selects the message digest algorithm to use, 255 * and allocates internal structures. 256 * 257 * It should be called after mbedtls_md_init() or 258 * mbedtls_md_free(). Makes it necessary to call 259 * mbedtls_md_free() later. 260 * 261 * \param ctx The context to set up. 262 * \param md_info The information structure of the message-digest algorithm 263 * to use. 264 * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), 265 * or non-zero: HMAC is used with this context. 266 * 267 * \return \c 0 on success. 268 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 269 * failure. 270 * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. 271 */ 272 MBEDTLS_CHECK_RETURN_TYPICAL 273 int mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac); 274 275 /** 276 * \brief This function clones the state of a message-digest 277 * context. 278 * 279 * \note You must call mbedtls_md_setup() on \c dst before calling 280 * this function. 281 * 282 * \note The two contexts must have the same type, 283 * for example, both are SHA-256. 284 * 285 * \warning This function clones the message-digest state, not the 286 * HMAC state. 287 * 288 * \param dst The destination context. 289 * \param src The context to be cloned. 290 * 291 * \return \c 0 on success. 292 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. 293 * \return #MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE if both contexts are 294 * not using the same engine. This can be avoided by moving 295 * the call to psa_crypto_init() before the first call to 296 * mbedtls_md_setup(). 297 */ 298 MBEDTLS_CHECK_RETURN_TYPICAL 299 int mbedtls_md_clone(mbedtls_md_context_t *dst, 300 const mbedtls_md_context_t *src); 301 302 /** 303 * \brief This function extracts the message-digest size from the 304 * message-digest information structure. 305 * 306 * \param md_info The information structure of the message-digest algorithm 307 * to use. 308 * 309 * \return The size of the message-digest output in Bytes. 310 */ 311 unsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info); 312 313 /** 314 * \brief This function extracts the message-digest type from the 315 * message-digest information structure. 316 * 317 * \param md_info The information structure of the message-digest algorithm 318 * to use. 319 * 320 * \return The type of the message digest. 321 */ 322 mbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info); 323 324 /** 325 * \brief This function starts a message-digest computation. 326 * 327 * You must call this function after setting up the context 328 * with mbedtls_md_setup(), and before passing data with 329 * mbedtls_md_update(). 330 * 331 * \param ctx The generic message-digest context. 332 * 333 * \return \c 0 on success. 334 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 335 * failure. 336 */ 337 MBEDTLS_CHECK_RETURN_TYPICAL 338 int mbedtls_md_starts(mbedtls_md_context_t *ctx); 339 340 /** 341 * \brief This function feeds an input buffer into an ongoing 342 * message-digest computation. 343 * 344 * You must call mbedtls_md_starts() before calling this 345 * function. You may call this function multiple times. 346 * Afterwards, call mbedtls_md_finish(). 347 * 348 * \param ctx The generic message-digest context. 349 * \param input The buffer holding the input data. 350 * \param ilen The length of the input data. 351 * 352 * \return \c 0 on success. 353 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 354 * failure. 355 */ 356 MBEDTLS_CHECK_RETURN_TYPICAL 357 int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen); 358 359 /** 360 * \brief This function finishes the digest operation, 361 * and writes the result to the output buffer. 362 * 363 * Call this function after a call to mbedtls_md_starts(), 364 * followed by any number of calls to mbedtls_md_update(). 365 * Afterwards, you may either clear the context with 366 * mbedtls_md_free(), or call mbedtls_md_starts() to reuse 367 * the context for another digest operation with the same 368 * algorithm. 369 * 370 * \param ctx The generic message-digest context. 371 * \param output The buffer for the generic message-digest checksum result. 372 * 373 * \return \c 0 on success. 374 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 375 * failure. 376 */ 377 MBEDTLS_CHECK_RETURN_TYPICAL 378 int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output); 379 380 /** 381 * \brief This function calculates the message-digest of a buffer, 382 * with respect to a configurable message-digest algorithm 383 * in a single call. 384 * 385 * The result is calculated as 386 * Output = message_digest(input buffer). 387 * 388 * \param md_info The information structure of the message-digest algorithm 389 * to use. 390 * \param input The buffer holding the data. 391 * \param ilen The length of the input data. 392 * \param output The generic message-digest checksum result. 393 * 394 * \return \c 0 on success. 395 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 396 * failure. 397 */ 398 MBEDTLS_CHECK_RETURN_TYPICAL 399 int mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, 400 unsigned char *output); 401 402 /** 403 * \brief This function returns the list of digests supported by the 404 * generic digest module. 405 * 406 * \note The list starts with the strongest available hashes. 407 * 408 * \return A statically allocated array of digests. Each element 409 * in the returned list is an integer belonging to the 410 * message-digest enumeration #mbedtls_md_type_t. 411 * The last entry is 0. 412 */ 413 const int *mbedtls_md_list(void); 414 415 /** 416 * \brief This function returns the message-digest information 417 * associated with the given digest name. 418 * 419 * \param md_name The name of the digest to search for. 420 * 421 * \return The message-digest information associated with \p md_name. 422 * \return NULL if the associated message-digest information is not found. 423 */ 424 const mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name); 425 426 /** 427 * \brief This function extracts the message-digest name from the 428 * message-digest information structure. 429 * 430 * \param md_info The information structure of the message-digest algorithm 431 * to use. 432 * 433 * \return The name of the message digest. 434 */ 435 const char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info); 436 437 /** 438 * \brief This function returns the message-digest information 439 * from the given context. 440 * 441 * \param ctx The context from which to extract the information. 442 * This must be initialized (or \c NULL). 443 * 444 * \return The message-digest information associated with \p ctx. 445 * \return \c NULL if \p ctx is \c NULL. 446 */ 447 const mbedtls_md_info_t *mbedtls_md_info_from_ctx( 448 const mbedtls_md_context_t *ctx); 449 450 #if defined(MBEDTLS_FS_IO) 451 /** 452 * \brief This function calculates the message-digest checksum 453 * result of the contents of the provided file. 454 * 455 * The result is calculated as 456 * Output = message_digest(file contents). 457 * 458 * \param md_info The information structure of the message-digest algorithm 459 * to use. 460 * \param path The input file name. 461 * \param output The generic message-digest checksum result. 462 * 463 * \return \c 0 on success. 464 * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing 465 * the file pointed by \p path. 466 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. 467 */ 468 MBEDTLS_CHECK_RETURN_TYPICAL 469 int mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, 470 unsigned char *output); 471 #endif /* MBEDTLS_FS_IO */ 472 473 /** 474 * \brief This function sets the HMAC key and prepares to 475 * authenticate a new message. 476 * 477 * Call this function after mbedtls_md_setup(), to use 478 * the MD context for an HMAC calculation, then call 479 * mbedtls_md_hmac_update() to provide the input data, and 480 * mbedtls_md_hmac_finish() to get the HMAC value. 481 * 482 * \param ctx The message digest context containing an embedded HMAC 483 * context. 484 * \param key The HMAC secret key. 485 * \param keylen The length of the HMAC key in Bytes. 486 * 487 * \return \c 0 on success. 488 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 489 * failure. 490 */ 491 MBEDTLS_CHECK_RETURN_TYPICAL 492 int mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, 493 size_t keylen); 494 495 /** 496 * \brief This function feeds an input buffer into an ongoing HMAC 497 * computation. 498 * 499 * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() 500 * before calling this function. 501 * You may call this function multiple times to pass the 502 * input piecewise. 503 * Afterwards, call mbedtls_md_hmac_finish(). 504 * 505 * \param ctx The message digest context containing an embedded HMAC 506 * context. 507 * \param input The buffer holding the input data. 508 * \param ilen The length of the input data. 509 * 510 * \return \c 0 on success. 511 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 512 * failure. 513 */ 514 MBEDTLS_CHECK_RETURN_TYPICAL 515 int mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, 516 size_t ilen); 517 518 /** 519 * \brief This function finishes the HMAC operation, and writes 520 * the result to the output buffer. 521 * 522 * Call this function after mbedtls_md_hmac_starts() and 523 * mbedtls_md_hmac_update() to get the HMAC value. Afterwards 524 * you may either call mbedtls_md_free() to clear the context, 525 * or call mbedtls_md_hmac_reset() to reuse the context with 526 * the same HMAC key. 527 * 528 * \param ctx The message digest context containing an embedded HMAC 529 * context. 530 * \param output The generic HMAC checksum result. 531 * 532 * \return \c 0 on success. 533 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 534 * failure. 535 */ 536 MBEDTLS_CHECK_RETURN_TYPICAL 537 int mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output); 538 539 /** 540 * \brief This function prepares to authenticate a new message with 541 * the same key as the previous HMAC operation. 542 * 543 * You may call this function after mbedtls_md_hmac_finish(). 544 * Afterwards call mbedtls_md_hmac_update() to pass the new 545 * input. 546 * 547 * \param ctx The message digest context containing an embedded HMAC 548 * context. 549 * 550 * \return \c 0 on success. 551 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 552 * failure. 553 */ 554 MBEDTLS_CHECK_RETURN_TYPICAL 555 int mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx); 556 557 /** 558 * \brief This function calculates the full generic HMAC 559 * on the input buffer with the provided key. 560 * 561 * The function allocates the context, performs the 562 * calculation, and frees the context. 563 * 564 * The HMAC result is calculated as 565 * output = generic HMAC(hmac key, input buffer). 566 * 567 * \param md_info The information structure of the message-digest algorithm 568 * to use. 569 * \param key The HMAC secret key. 570 * \param keylen The length of the HMAC secret key in Bytes. 571 * \param input The buffer holding the input data. 572 * \param ilen The length of the input data. 573 * \param output The generic HMAC result. 574 * 575 * \return \c 0 on success. 576 * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification 577 * failure. 578 */ 579 MBEDTLS_CHECK_RETURN_TYPICAL 580 int mbedtls_md_hmac(const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, 581 const unsigned char *input, size_t ilen, 582 unsigned char *output); 583 584 #ifdef __cplusplus 585 } 586 #endif 587 588 #endif /* MBEDTLS_MD_H */ 589