blob: 3d30beaa037c5affbc609025710635cedbe87e74 [file] [log] [blame]
Paul Bakker17373852011-01-06 14:20:01 +00001/**
2 * \file md.h
Paul Bakker9af723c2014-05-01 13:03:14 +02003 *
Paul Bakker17373852011-01-06 14:20:01 +00004 * \brief Generic message digest wrapper
5 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +01008 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Paul Bakker17373852011-01-06 14:20:01 +00009 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000010 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker17373852011-01-06 14:20:01 +000011 *
Paul Bakker17373852011-01-06 14:20:01 +000012 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 */
Paul Bakker17373852011-01-06 14:20:01 +000026#ifndef POLARSSL_MD_H
27#define POLARSSL_MD_H
28
Rich Evans00ab4702015-02-06 13:43:58 +000029#include <stddef.h>
Paul Bakker23986e52011-04-24 08:57:21 +000030
Paul Bakker09b1ec62011-07-27 16:28:54 +000031#if defined(_MSC_VER) && !defined(inline)
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000032#define inline _inline
Paul Bakker569df2c2011-06-21 07:48:07 +000033#else
Paul Bakker09b1ec62011-07-27 16:28:54 +000034#if defined(__ARMCC_VERSION) && !defined(inline)
Paul Bakker569df2c2011-06-21 07:48:07 +000035#define inline __inline
Paul Bakker74fb74e2011-06-21 13:36:18 +000036#endif /* __ARMCC_VERSION */
Paul Bakker569df2c2011-06-21 07:48:07 +000037#endif /*_MSC_VER */
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000038
Paul Bakker9d781402011-05-09 16:17:09 +000039#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */
Paul Bakker9c021ad2011-06-09 15:55:11 +000040#define POLARSSL_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */
41#define POLARSSL_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */
Paul Bakker8913f822012-01-14 18:07:41 +000042#define POLARSSL_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */
Paul Bakker335db3f2011-04-25 15:28:35 +000043
Paul Bakker407a0da2013-06-27 14:29:21 +020044#ifdef __cplusplus
45extern "C" {
46#endif
47
Paul Bakker17373852011-01-06 14:20:01 +000048typedef enum {
Paul Bakker562535d2011-01-20 16:42:01 +000049 POLARSSL_MD_NONE=0,
50 POLARSSL_MD_MD2,
Paul Bakker17373852011-01-06 14:20:01 +000051 POLARSSL_MD_MD4,
52 POLARSSL_MD_MD5,
53 POLARSSL_MD_SHA1,
54 POLARSSL_MD_SHA224,
55 POLARSSL_MD_SHA256,
56 POLARSSL_MD_SHA384,
57 POLARSSL_MD_SHA512,
Paul Bakker61b699e2014-01-22 13:35:29 +010058 POLARSSL_MD_RIPEMD160,
Paul Bakker17373852011-01-06 14:20:01 +000059} md_type_t;
60
Paul Bakker7db01092013-09-10 11:10:57 +020061#if defined(POLARSSL_SHA512_C)
Paul Bakker1b57b062011-01-06 15:48:19 +000062#define POLARSSL_MD_MAX_SIZE 64 /* longest known is SHA512 */
Paul Bakker7db01092013-09-10 11:10:57 +020063#else
64#define POLARSSL_MD_MAX_SIZE 32 /* longest known is SHA256 or less */
65#endif
Paul Bakker1b57b062011-01-06 15:48:19 +000066
Paul Bakker17373852011-01-06 14:20:01 +000067/**
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +010068 * Opaque struct defined in md_wrap.h
Paul Bakker17373852011-01-06 14:20:01 +000069 */
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +010070typedef struct _md_info_t md_info_t;
Paul Bakker17373852011-01-06 14:20:01 +000071
72/**
73 * Generic message digest context.
74 */
75typedef struct {
76 /** Information about the associated message digest */
77 const md_info_t *md_info;
78
79 /** Digest-specific context */
80 void *md_ctx;
Manuel Pégourié-Gonnard8379a822015-03-24 16:48:22 +010081
Manuel Pégourié-Gonnarddfb3dc82015-03-25 11:49:07 +010082 /** HMAC part of the context */
83 void *hmac_ctx;
Paul Bakker17373852011-01-06 14:20:01 +000084} md_context_t;
85
86#define MD_CONTEXT_T_INIT { \
87 NULL, /* md_info */ \
88 NULL, /* md_ctx */ \
89}
90
Paul Bakker17373852011-01-06 14:20:01 +000091/**
Paul Bakker72f62662011-01-16 21:27:44 +000092 * \brief Returns the list of digests supported by the generic digest module.
93 *
94 * \return a statically allocated array of digests, the last entry
95 * is 0.
96 */
97const int *md_list( void );
98
99/**
Paul Bakker17373852011-01-06 14:20:01 +0000100 * \brief Returns the message digest information associated with the
101 * given digest name.
102 *
Paul Bakker23986e52011-04-24 08:57:21 +0000103 * \param md_name Name of the digest to search for.
Paul Bakker17373852011-01-06 14:20:01 +0000104 *
105 * \return The message digest information associated with md_name or
106 * NULL if not found.
107 */
108const md_info_t *md_info_from_string( const char *md_name );
109
110/**
111 * \brief Returns the message digest information associated with the
112 * given digest type.
113 *
114 * \param md_type type of digest to search for.
115 *
116 * \return The message digest information associated with md_type or
117 * NULL if not found.
118 */
119const md_info_t *md_info_from_type( md_type_t md_type );
120
121/**
Paul Bakker84bbeb52014-07-01 14:53:22 +0200122 * \brief Initialize a md_context (as NONE)
123 */
124void md_init( md_context_t *ctx );
125
126/**
127 * \brief Free and clear the message-specific context of ctx.
128 * Freeing ctx itself remains the responsibility of the
129 * caller.
130 */
131void md_free( md_context_t *ctx );
132
133/**
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200134 * \brief Initialises and fills the message digest context structure
135 * with the appropriate values.
Paul Bakker562535d2011-01-20 16:42:01 +0000136 *
Paul Bakker84bbeb52014-07-01 14:53:22 +0200137 * \note Currently also clears structure. In future versions you
138 * will be required to call md_init() on the structure
139 * first.
140 *
Paul Bakker562535d2011-01-20 16:42:01 +0000141 * \param ctx context to initialise. May not be NULL. The
142 * digest-specific context (ctx->md_ctx) must be NULL. It will
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100143 * be allocated, and must be freed using md_free() later.
Paul Bakker562535d2011-01-20 16:42:01 +0000144 * \param md_info message digest to use.
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +0100145 * \param hmac non-zero if you want to use this context for hmac too,
146 * zero otherwise (saves some memory).
Paul Bakker562535d2011-01-20 16:42:01 +0000147 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000148 * \returns \c 0 on success, \c POLARSSL_ERR_MD_BAD_INPUT_DATA on
149 * parameter failure, \c POLARSSL_ERR_MD_ALLOC_FAILED if
Paul Bakker20281562011-11-11 10:34:04 +0000150 * allocation of the digest-specific context failed.
Paul Bakker562535d2011-01-20 16:42:01 +0000151 */
Manuel Pégourié-Gonnard4063ceb2015-03-25 16:08:53 +0100152int md_init_ctx( md_context_t *ctx, const md_info_t *md_info, int hmac );
Paul Bakker562535d2011-01-20 16:42:01 +0000153
154/**
Paul Bakker17373852011-01-06 14:20:01 +0000155 * \brief Returns the size of the message digest output.
156 *
157 * \param md_info message digest info
158 *
159 * \return size of the message digest output.
160 */
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100161unsigned char md_get_size( const md_info_t *md_info );
Paul Bakker17373852011-01-06 14:20:01 +0000162
163/**
164 * \brief Returns the type of the message digest output.
165 *
166 * \param md_info message digest info
167 *
168 * \return type of the message digest output.
169 */
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100170md_type_t md_get_type( const md_info_t *md_info );
Paul Bakker17373852011-01-06 14:20:01 +0000171
172/**
173 * \brief Returns the name of the message digest output.
174 *
175 * \param md_info message digest info
176 *
177 * \return name of the message digest output.
178 */
Manuel Pégourié-Gonnardca878db2015-03-24 12:13:30 +0100179const char *md_get_name( const md_info_t *md_info );
Paul Bakker17373852011-01-06 14:20:01 +0000180
181/**
Paul Bakker562535d2011-01-20 16:42:01 +0000182 * \brief Set-up the given context for a new message digest
Paul Bakker17373852011-01-06 14:20:01 +0000183 *
Paul Bakker562535d2011-01-20 16:42:01 +0000184 * \param ctx generic message digest context.
Paul Bakker17373852011-01-06 14:20:01 +0000185 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000186 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
187 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000188 */
Paul Bakker562535d2011-01-20 16:42:01 +0000189int md_starts( md_context_t *ctx );
Paul Bakker17373852011-01-06 14:20:01 +0000190
191/**
192 * \brief Generic message digest process buffer
193 *
194 * \param ctx Generic message digest context
195 * \param input buffer holding the datal
196 * \param ilen length of the input data
197 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000198 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
199 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000200 */
Paul Bakker23986e52011-04-24 08:57:21 +0000201int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000202
203/**
204 * \brief Generic message digest final digest
205 *
206 * \param ctx Generic message digest context
207 * \param output Generic message digest checksum result
208 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000209 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
210 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000211 */
212int md_finish( md_context_t *ctx, unsigned char *output );
213
214/**
Paul Bakker17373852011-01-06 14:20:01 +0000215 * \brief Output = message_digest( input buffer )
216 *
217 * \param md_info message digest info
218 * \param input buffer holding the data
219 * \param ilen length of the input data
220 * \param output Generic message digest checksum result
221 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000222 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
223 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000224 */
Paul Bakker23986e52011-04-24 08:57:21 +0000225int md( const md_info_t *md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000226 unsigned char *output );
227
228/**
229 * \brief Output = message_digest( file contents )
230 *
231 * \param md_info message digest info
232 * \param path input file name
233 * \param output generic message digest checksum result
234 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000235 * \return 0 if successful, POLARSSL_ERR_MD_FILE_OPEN_FAILED if fopen
236 * failed, POLARSSL_ERR_MD_FILE_READ_FAILED if fread failed,
237 * POLARSSL_ERR_MD_BAD_INPUT_DATA if md_info was NULL.
Paul Bakker17373852011-01-06 14:20:01 +0000238 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200239int md_file( const md_info_t *md_info, const char *path,
240 unsigned char *output );
Paul Bakker17373852011-01-06 14:20:01 +0000241
242/**
243 * \brief Generic HMAC context setup
244 *
Paul Bakker17373852011-01-06 14:20:01 +0000245 * \param ctx HMAC context to be initialized
246 * \param key HMAC secret key
247 * \param keylen length of the HMAC key
248 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000249 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
250 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000251 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200252int md_hmac_starts( md_context_t *ctx, const unsigned char *key,
253 size_t keylen );
Paul Bakker17373852011-01-06 14:20:01 +0000254
255/**
256 * \brief Generic HMAC process buffer
257 *
258 * \param ctx HMAC context
259 * \param input buffer holding the data
260 * \param ilen length of the input data
261 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000262 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
263 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000264 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200265int md_hmac_update( md_context_t *ctx, const unsigned char *input,
266 size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000267
268/**
269 * \brief Generic HMAC final digest
270 *
271 * \param ctx HMAC context
272 * \param output Generic HMAC checksum result
273 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000274 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
275 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000276 */
277int md_hmac_finish( md_context_t *ctx, unsigned char *output);
278
279/**
280 * \brief Generic HMAC context reset
281 *
282 * \param ctx HMAC context to be reset
283 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000284 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
285 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000286 */
287int md_hmac_reset( md_context_t *ctx );
288
289/**
290 * \brief Output = Generic_HMAC( hmac key, input buffer )
291 *
292 * \param md_info message digest info
293 * \param key HMAC secret key
294 * \param keylen length of the HMAC key
295 * \param input buffer holding the data
296 * \param ilen length of the input data
297 * \param output Generic HMAC-result
298 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000299 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
300 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000301 */
Paul Bakker23986e52011-04-24 08:57:21 +0000302int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen,
303 const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000304 unsigned char *output );
305
Paul Bakker1bd3ae82013-03-13 10:26:44 +0100306/* Internal use */
307int md_process( md_context_t *ctx, const unsigned char *data );
308
Paul Bakker17373852011-01-06 14:20:01 +0000309#ifdef __cplusplus
310}
311#endif
312
313#endif /* POLARSSL_MD_H */