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