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