xref: /optee_os/lib/libmbedtls/mbedtls/include/mbedtls/md.h (revision 817466cb476de705a8e3dabe1ef165fe27a18c2f)
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