blob: 81d8a2e5c2e504a0b3307eaff4dcea9be927190f [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 *
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02008 * Copyright (C) 2006-2014, Brainspark B.V.
Paul Bakker17373852011-01-06 14:20:01 +00009 *
10 * This file is part of PolarSSL (http://www.polarssl.org)
11 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
12 *
13 * All rights reserved.
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License along
26 * with this program; if not, write to the Free Software Foundation, Inc.,
27 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 */
Paul Bakker17373852011-01-06 14:20:01 +000029#ifndef POLARSSL_MD_H
30#define POLARSSL_MD_H
31
Paul Bakker23986e52011-04-24 08:57:21 +000032#include <string.h>
33
Paul Bakker09b1ec62011-07-27 16:28:54 +000034#if defined(_MSC_VER) && !defined(inline)
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000035#define inline _inline
Paul Bakker569df2c2011-06-21 07:48:07 +000036#else
Paul Bakker09b1ec62011-07-27 16:28:54 +000037#if defined(__ARMCC_VERSION) && !defined(inline)
Paul Bakker569df2c2011-06-21 07:48:07 +000038#define inline __inline
Paul Bakker74fb74e2011-06-21 13:36:18 +000039#endif /* __ARMCC_VERSION */
Paul Bakker569df2c2011-06-21 07:48:07 +000040#endif /*_MSC_VER */
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000041
Paul Bakker9d781402011-05-09 16:17:09 +000042#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */
Paul Bakker9c021ad2011-06-09 15:55:11 +000043#define POLARSSL_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */
44#define POLARSSL_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */
Paul Bakker8913f822012-01-14 18:07:41 +000045#define POLARSSL_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */
Paul Bakker335db3f2011-04-25 15:28:35 +000046
Paul Bakker407a0da2013-06-27 14:29:21 +020047#ifdef __cplusplus
48extern "C" {
49#endif
50
Paul Bakker17373852011-01-06 14:20:01 +000051typedef enum {
Paul Bakker562535d2011-01-20 16:42:01 +000052 POLARSSL_MD_NONE=0,
53 POLARSSL_MD_MD2,
Paul Bakker17373852011-01-06 14:20:01 +000054 POLARSSL_MD_MD4,
55 POLARSSL_MD_MD5,
56 POLARSSL_MD_SHA1,
57 POLARSSL_MD_SHA224,
58 POLARSSL_MD_SHA256,
59 POLARSSL_MD_SHA384,
60 POLARSSL_MD_SHA512,
Paul Bakker61b699e2014-01-22 13:35:29 +010061 POLARSSL_MD_RIPEMD160,
Paul Bakker17373852011-01-06 14:20:01 +000062} md_type_t;
63
Paul Bakker7db01092013-09-10 11:10:57 +020064#if defined(POLARSSL_SHA512_C)
Paul Bakker1b57b062011-01-06 15:48:19 +000065#define POLARSSL_MD_MAX_SIZE 64 /* longest known is SHA512 */
Paul Bakker7db01092013-09-10 11:10:57 +020066#else
67#define POLARSSL_MD_MAX_SIZE 32 /* longest known is SHA256 or less */
68#endif
Paul Bakker1b57b062011-01-06 15:48:19 +000069
Paul Bakker17373852011-01-06 14:20:01 +000070/**
71 * Message digest information. Allows message digest functions to be called
72 * in a generic way.
73 */
74typedef struct {
75 /** Digest identifier */
76 md_type_t type;
77
78 /** Name of the message digest */
79 const char * name;
80
81 /** Output length of the digest function */
82 int size;
83
84 /** Digest initialisation function */
85 void (*starts_func)( void *ctx );
86
87 /** Digest update function */
Paul Bakker23986e52011-04-24 08:57:21 +000088 void (*update_func)( void *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +000089
90 /** Digest finalisation function */
91 void (*finish_func)( void *ctx, unsigned char *output );
92
93 /** Generic digest function */
Paul Bakker23986e52011-04-24 08:57:21 +000094 void (*digest_func)( const unsigned char *input, size_t ilen,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +020095 unsigned char *output );
Paul Bakker17373852011-01-06 14:20:01 +000096
97 /** Generic file digest function */
98 int (*file_func)( const char *path, unsigned char *output );
99
100 /** HMAC Initialisation function */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200101 void (*hmac_starts_func)( void *ctx, const unsigned char *key,
102 size_t keylen );
Paul Bakker17373852011-01-06 14:20:01 +0000103
104 /** HMAC update function */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200105 void (*hmac_update_func)( void *ctx, const unsigned char *input,
106 size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000107
108 /** HMAC finalisation function */
109 void (*hmac_finish_func)( void *ctx, unsigned char *output);
110
111 /** HMAC context reset function */
112 void (*hmac_reset_func)( void *ctx );
113
114 /** Generic HMAC function */
Paul Bakker23986e52011-04-24 08:57:21 +0000115 void (*hmac_func)( const unsigned char *key, size_t keylen,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200116 const unsigned char *input, size_t ilen,
117 unsigned char *output );
Paul Bakker17373852011-01-06 14:20:01 +0000118
119 /** Allocate a new context */
120 void * (*ctx_alloc_func)( void );
121
122 /** Free the given context */
123 void (*ctx_free_func)( void *ctx );
124
Paul Bakker1bd3ae82013-03-13 10:26:44 +0100125 /** Internal use only */
126 void (*process_func)( void *ctx, const unsigned char *input );
Paul Bakker17373852011-01-06 14:20:01 +0000127} md_info_t;
128
129/**
130 * Generic message digest context.
131 */
132typedef struct {
133 /** Information about the associated message digest */
134 const md_info_t *md_info;
135
136 /** Digest-specific context */
137 void *md_ctx;
138} md_context_t;
139
140#define MD_CONTEXT_T_INIT { \
141 NULL, /* md_info */ \
142 NULL, /* md_ctx */ \
143}
144
Paul Bakker17373852011-01-06 14:20:01 +0000145/**
Paul Bakker72f62662011-01-16 21:27:44 +0000146 * \brief Returns the list of digests supported by the generic digest module.
147 *
148 * \return a statically allocated array of digests, the last entry
149 * is 0.
150 */
151const int *md_list( void );
152
153/**
Paul Bakker17373852011-01-06 14:20:01 +0000154 * \brief Returns the message digest information associated with the
155 * given digest name.
156 *
Paul Bakker23986e52011-04-24 08:57:21 +0000157 * \param md_name Name of the digest to search for.
Paul Bakker17373852011-01-06 14:20:01 +0000158 *
159 * \return The message digest information associated with md_name or
160 * NULL if not found.
161 */
162const md_info_t *md_info_from_string( const char *md_name );
163
164/**
165 * \brief Returns the message digest information associated with the
166 * given digest type.
167 *
168 * \param md_type type of digest to search for.
169 *
170 * \return The message digest information associated with md_type or
171 * NULL if not found.
172 */
173const md_info_t *md_info_from_type( md_type_t md_type );
174
175/**
Paul Bakker84bbeb52014-07-01 14:53:22 +0200176 * \brief Initialize a md_context (as NONE)
177 */
178void md_init( md_context_t *ctx );
179
180/**
181 * \brief Free and clear the message-specific context of ctx.
182 * Freeing ctx itself remains the responsibility of the
183 * caller.
184 */
185void md_free( md_context_t *ctx );
186
187/**
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200188 * \brief Initialises and fills the message digest context structure
189 * with the appropriate values.
Paul Bakker562535d2011-01-20 16:42:01 +0000190 *
Paul Bakker84bbeb52014-07-01 14:53:22 +0200191 * \note Currently also clears structure. In future versions you
192 * will be required to call md_init() on the structure
193 * first.
194 *
Paul Bakker562535d2011-01-20 16:42:01 +0000195 * \param ctx context to initialise. May not be NULL. The
196 * digest-specific context (ctx->md_ctx) must be NULL. It will
197 * be allocated, and must be freed using md_free_ctx() later.
198 * \param md_info message digest to use.
199 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000200 * \returns \c 0 on success, \c POLARSSL_ERR_MD_BAD_INPUT_DATA on
201 * parameter failure, \c POLARSSL_ERR_MD_ALLOC_FAILED if
Paul Bakker20281562011-11-11 10:34:04 +0000202 * allocation of the digest-specific context failed.
Paul Bakker562535d2011-01-20 16:42:01 +0000203 */
204int md_init_ctx( md_context_t *ctx, const md_info_t *md_info );
205
206/**
207 * \brief Free the message-specific context of ctx. Freeing ctx itself
208 * remains the responsibility of the caller.
209 *
Paul Bakker84bbeb52014-07-01 14:53:22 +0200210 * \note Deprecated: Redirects to md_free()
211 *
Paul Bakkerf3b86c12011-01-27 15:24:17 +0000212 * \param ctx Free the message-specific context
Paul Bakker562535d2011-01-20 16:42:01 +0000213 *
Paul Bakker84bbeb52014-07-01 14:53:22 +0200214 * \returns 0
Paul Bakker562535d2011-01-20 16:42:01 +0000215 */
216int md_free_ctx( md_context_t *ctx );
217
218/**
Paul Bakker17373852011-01-06 14:20:01 +0000219 * \brief Returns the size of the message digest output.
220 *
221 * \param md_info message digest info
222 *
223 * \return size of the message digest output.
224 */
Paul Bakker23986e52011-04-24 08:57:21 +0000225static inline unsigned char md_get_size( const md_info_t *md_info )
Paul Bakker17373852011-01-06 14:20:01 +0000226{
Paul Bakkerc295b832013-04-02 11:13:39 +0200227 if( md_info == NULL )
228 return( 0 );
229
Paul Bakker17373852011-01-06 14:20:01 +0000230 return md_info->size;
231}
232
233/**
234 * \brief Returns the type of the message digest output.
235 *
236 * \param md_info message digest info
237 *
238 * \return type of the message digest output.
239 */
Paul Bakker23986e52011-04-24 08:57:21 +0000240static inline md_type_t md_get_type( const md_info_t *md_info )
Paul Bakker17373852011-01-06 14:20:01 +0000241{
Paul Bakkerc295b832013-04-02 11:13:39 +0200242 if( md_info == NULL )
243 return( POLARSSL_MD_NONE );
244
Paul Bakker17373852011-01-06 14:20:01 +0000245 return md_info->type;
246}
247
248/**
249 * \brief Returns the name of the message digest output.
250 *
251 * \param md_info message digest info
252 *
253 * \return name of the message digest output.
254 */
Paul Bakker23986e52011-04-24 08:57:21 +0000255static inline const char *md_get_name( const md_info_t *md_info )
Paul Bakker17373852011-01-06 14:20:01 +0000256{
Paul Bakkerc295b832013-04-02 11:13:39 +0200257 if( md_info == NULL )
258 return( NULL );
259
Paul Bakker17373852011-01-06 14:20:01 +0000260 return md_info->name;
261}
262
263/**
Paul Bakker562535d2011-01-20 16:42:01 +0000264 * \brief Set-up the given context for a new message digest
Paul Bakker17373852011-01-06 14:20:01 +0000265 *
Paul Bakker562535d2011-01-20 16:42:01 +0000266 * \param ctx generic message digest context.
Paul Bakker17373852011-01-06 14:20:01 +0000267 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000268 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
269 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000270 */
Paul Bakker562535d2011-01-20 16:42:01 +0000271int md_starts( md_context_t *ctx );
Paul Bakker17373852011-01-06 14:20:01 +0000272
273/**
274 * \brief Generic message digest process buffer
275 *
276 * \param ctx Generic message digest context
277 * \param input buffer holding the datal
278 * \param ilen length of the input data
279 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000280 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
281 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000282 */
Paul Bakker23986e52011-04-24 08:57:21 +0000283int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000284
285/**
286 * \brief Generic message digest final digest
287 *
288 * \param ctx Generic message digest context
289 * \param output Generic message digest checksum result
290 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000291 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
292 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000293 */
294int md_finish( md_context_t *ctx, unsigned char *output );
295
296/**
Paul Bakker17373852011-01-06 14:20:01 +0000297 * \brief Output = message_digest( input buffer )
298 *
299 * \param md_info message digest info
300 * \param input buffer holding the data
301 * \param ilen length of the input data
302 * \param output Generic message digest checksum result
303 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000304 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
305 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000306 */
Paul Bakker23986e52011-04-24 08:57:21 +0000307int md( const md_info_t *md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000308 unsigned char *output );
309
310/**
311 * \brief Output = message_digest( file contents )
312 *
313 * \param md_info message digest info
314 * \param path input file name
315 * \param output generic message digest checksum result
316 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000317 * \return 0 if successful, POLARSSL_ERR_MD_FILE_OPEN_FAILED if fopen
318 * failed, POLARSSL_ERR_MD_FILE_READ_FAILED if fread failed,
319 * POLARSSL_ERR_MD_BAD_INPUT_DATA if md_info was NULL.
Paul Bakker17373852011-01-06 14:20:01 +0000320 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200321int md_file( const md_info_t *md_info, const char *path,
322 unsigned char *output );
Paul Bakker17373852011-01-06 14:20:01 +0000323
324/**
325 * \brief Generic HMAC context setup
326 *
Paul Bakker17373852011-01-06 14:20:01 +0000327 * \param ctx HMAC context to be initialized
328 * \param key HMAC secret key
329 * \param keylen length of the HMAC key
330 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000331 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
332 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000333 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200334int md_hmac_starts( md_context_t *ctx, const unsigned char *key,
335 size_t keylen );
Paul Bakker17373852011-01-06 14:20:01 +0000336
337/**
338 * \brief Generic HMAC process buffer
339 *
340 * \param ctx HMAC context
341 * \param input buffer holding the data
342 * \param ilen length of the input data
343 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000344 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
345 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000346 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200347int md_hmac_update( md_context_t *ctx, const unsigned char *input,
348 size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000349
350/**
351 * \brief Generic HMAC final digest
352 *
353 * \param ctx HMAC context
354 * \param output Generic HMAC checksum result
355 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000356 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
357 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000358 */
359int md_hmac_finish( md_context_t *ctx, unsigned char *output);
360
361/**
362 * \brief Generic HMAC context reset
363 *
364 * \param ctx HMAC context to be reset
365 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000366 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
367 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000368 */
369int md_hmac_reset( md_context_t *ctx );
370
371/**
372 * \brief Output = Generic_HMAC( hmac key, input buffer )
373 *
374 * \param md_info message digest info
375 * \param key HMAC secret key
376 * \param keylen length of the HMAC key
377 * \param input buffer holding the data
378 * \param ilen length of the input data
379 * \param output Generic HMAC-result
380 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000381 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
382 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000383 */
Paul Bakker23986e52011-04-24 08:57:21 +0000384int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen,
385 const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000386 unsigned char *output );
387
Paul Bakker1bd3ae82013-03-13 10:26:44 +0100388/* Internal use */
389int md_process( md_context_t *ctx, const unsigned char *data );
390
Paul Bakker17373852011-01-06 14:20:01 +0000391#ifdef __cplusplus
392}
393#endif
394
395#endif /* POLARSSL_MD_H */