blob: f62ef2038955c6a2044bfcffdca19fac20f1de7b [file] [log] [blame]
Paul Bakker17373852011-01-06 14:20:01 +00001/**
2 * \file md.h
3 *
4 * \brief Generic message digest wrapper
5 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Paul Bakker20281562011-11-11 10:34:04 +00008 * Copyright (C) 2006-2011, 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. */
45#define POLARSSL_ERR_MD_FILE_OPEN_FAILED -0x5200 /**< Opening of file failed. */
46#define POLARSSL_ERR_MD_FILE_READ_FAILED -0x5280 /**< Failure when reading from file. */
Paul Bakker335db3f2011-04-25 15:28:35 +000047
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,
58} md_type_t;
59
Paul Bakker1b57b062011-01-06 15:48:19 +000060#define POLARSSL_MD_MAX_SIZE 64 /* longest known is SHA512 */
61
Paul Bakker17373852011-01-06 14:20:01 +000062/**
63 * Message digest information. Allows message digest functions to be called
64 * in a generic way.
65 */
66typedef struct {
67 /** Digest identifier */
68 md_type_t type;
69
70 /** Name of the message digest */
71 const char * name;
72
73 /** Output length of the digest function */
74 int size;
75
76 /** Digest initialisation function */
77 void (*starts_func)( void *ctx );
78
79 /** Digest update function */
Paul Bakker23986e52011-04-24 08:57:21 +000080 void (*update_func)( void *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +000081
82 /** Digest finalisation function */
83 void (*finish_func)( void *ctx, unsigned char *output );
84
85 /** Generic digest function */
Paul Bakker23986e52011-04-24 08:57:21 +000086 void (*digest_func)( const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +000087 unsigned char *output );
88
89 /** Generic file digest function */
90 int (*file_func)( const char *path, unsigned char *output );
91
92 /** HMAC Initialisation function */
Paul Bakker23986e52011-04-24 08:57:21 +000093 void (*hmac_starts_func)( void *ctx, const unsigned char *key, size_t keylen );
Paul Bakker17373852011-01-06 14:20:01 +000094
95 /** HMAC update function */
Paul Bakker23986e52011-04-24 08:57:21 +000096 void (*hmac_update_func)( void *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +000097
98 /** HMAC finalisation function */
99 void (*hmac_finish_func)( void *ctx, unsigned char *output);
100
101 /** HMAC context reset function */
102 void (*hmac_reset_func)( void *ctx );
103
104 /** Generic HMAC function */
Paul Bakker23986e52011-04-24 08:57:21 +0000105 void (*hmac_func)( const unsigned char *key, size_t keylen,
106 const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000107 unsigned char *output );
108
109 /** Allocate a new context */
110 void * (*ctx_alloc_func)( void );
111
112 /** Free the given context */
113 void (*ctx_free_func)( void *ctx );
114
115} md_info_t;
116
117/**
118 * Generic message digest context.
119 */
120typedef struct {
121 /** Information about the associated message digest */
122 const md_info_t *md_info;
123
124 /** Digest-specific context */
125 void *md_ctx;
126} md_context_t;
127
128#define MD_CONTEXT_T_INIT { \
129 NULL, /* md_info */ \
130 NULL, /* md_ctx */ \
131}
132
133#ifdef __cplusplus
134extern "C" {
135#endif
136
137/**
Paul Bakker72f62662011-01-16 21:27:44 +0000138 * \brief Returns the list of digests supported by the generic digest module.
139 *
140 * \return a statically allocated array of digests, the last entry
141 * is 0.
142 */
143const int *md_list( void );
144
145/**
Paul Bakker17373852011-01-06 14:20:01 +0000146 * \brief Returns the message digest information associated with the
147 * given digest name.
148 *
Paul Bakker23986e52011-04-24 08:57:21 +0000149 * \param md_name Name of the digest to search for.
Paul Bakker17373852011-01-06 14:20:01 +0000150 *
151 * \return The message digest information associated with md_name or
152 * NULL if not found.
153 */
154const md_info_t *md_info_from_string( const char *md_name );
155
156/**
157 * \brief Returns the message digest information associated with the
158 * given digest type.
159 *
160 * \param md_type type of digest to search for.
161 *
162 * \return The message digest information associated with md_type or
163 * NULL if not found.
164 */
165const md_info_t *md_info_from_type( md_type_t md_type );
166
167/**
Paul Bakker562535d2011-01-20 16:42:01 +0000168 * \brief Initialises and fills the message digest context structure with
169 * the appropriate values.
170 *
171 * \param ctx context to initialise. May not be NULL. The
172 * digest-specific context (ctx->md_ctx) must be NULL. It will
173 * be allocated, and must be freed using md_free_ctx() later.
174 * \param md_info message digest to use.
175 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000176 * \returns \c 0 on success, \c POLARSSL_ERR_MD_BAD_INPUT_DATA on
177 * parameter failure, \c POLARSSL_ERR_MD_ALLOC_FAILED if
Paul Bakker20281562011-11-11 10:34:04 +0000178 * allocation of the digest-specific context failed.
Paul Bakker562535d2011-01-20 16:42:01 +0000179 */
180int md_init_ctx( md_context_t *ctx, const md_info_t *md_info );
181
182/**
183 * \brief Free the message-specific context of ctx. Freeing ctx itself
184 * remains the responsibility of the caller.
185 *
Paul Bakkerf3b86c12011-01-27 15:24:17 +0000186 * \param ctx Free the message-specific context
Paul Bakker562535d2011-01-20 16:42:01 +0000187 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000188 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
189 * verification fails.
Paul Bakker562535d2011-01-20 16:42:01 +0000190 */
191int md_free_ctx( md_context_t *ctx );
192
193/**
Paul Bakker17373852011-01-06 14:20:01 +0000194 * \brief Returns the size of the message digest output.
195 *
196 * \param md_info message digest info
197 *
198 * \return size of the message digest output.
199 */
Paul Bakker23986e52011-04-24 08:57:21 +0000200static inline unsigned char md_get_size( const md_info_t *md_info )
Paul Bakker17373852011-01-06 14:20:01 +0000201{
202 return md_info->size;
203}
204
205/**
206 * \brief Returns the type of the message digest output.
207 *
208 * \param md_info message digest info
209 *
210 * \return type of the message digest output.
211 */
Paul Bakker23986e52011-04-24 08:57:21 +0000212static inline md_type_t md_get_type( const md_info_t *md_info )
Paul Bakker17373852011-01-06 14:20:01 +0000213{
214 return md_info->type;
215}
216
217/**
218 * \brief Returns the name of the message digest output.
219 *
220 * \param md_info message digest info
221 *
222 * \return name of the message digest output.
223 */
Paul Bakker23986e52011-04-24 08:57:21 +0000224static inline const char *md_get_name( const md_info_t *md_info )
Paul Bakker17373852011-01-06 14:20:01 +0000225{
226 return md_info->name;
227}
228
229/**
Paul Bakker562535d2011-01-20 16:42:01 +0000230 * \brief Set-up the given context for a new message digest
Paul Bakker17373852011-01-06 14:20:01 +0000231 *
Paul Bakker562535d2011-01-20 16:42:01 +0000232 * \param ctx generic message digest context.
Paul Bakker17373852011-01-06 14:20:01 +0000233 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000234 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
235 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000236 */
Paul Bakker562535d2011-01-20 16:42:01 +0000237int md_starts( md_context_t *ctx );
Paul Bakker17373852011-01-06 14:20:01 +0000238
239/**
240 * \brief Generic message digest process buffer
241 *
242 * \param ctx Generic message digest context
243 * \param input buffer holding the datal
244 * \param ilen length of the input data
245 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000246 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
247 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000248 */
Paul Bakker23986e52011-04-24 08:57:21 +0000249int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000250
251/**
252 * \brief Generic message digest final digest
253 *
254 * \param ctx Generic message digest context
255 * \param output Generic message digest checksum result
256 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000257 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
258 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000259 */
260int md_finish( md_context_t *ctx, unsigned char *output );
261
262/**
Paul Bakker17373852011-01-06 14:20:01 +0000263 * \brief Output = message_digest( input buffer )
264 *
265 * \param md_info message digest info
266 * \param input buffer holding the data
267 * \param ilen length of the input data
268 * \param output Generic message digest checksum result
269 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000270 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
271 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000272 */
Paul Bakker23986e52011-04-24 08:57:21 +0000273int md( const md_info_t *md_info, const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000274 unsigned char *output );
275
276/**
277 * \brief Output = message_digest( file contents )
278 *
279 * \param md_info message digest info
280 * \param path input file name
281 * \param output generic message digest checksum result
282 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000283 * \return 0 if successful, POLARSSL_ERR_MD_FILE_OPEN_FAILED if fopen
284 * failed, POLARSSL_ERR_MD_FILE_READ_FAILED if fread failed,
285 * POLARSSL_ERR_MD_BAD_INPUT_DATA if md_info was NULL.
Paul Bakker17373852011-01-06 14:20:01 +0000286 */
287int md_file( const md_info_t *md_info, const char *path, unsigned char *output );
288
289/**
290 * \brief Generic HMAC context setup
291 *
Paul Bakker17373852011-01-06 14:20:01 +0000292 * \param ctx HMAC context to be initialized
293 * \param key HMAC secret key
294 * \param keylen length of the HMAC key
295 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000296 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
297 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000298 */
Paul Bakker23986e52011-04-24 08:57:21 +0000299int md_hmac_starts( md_context_t *ctx, const unsigned char *key, size_t keylen );
Paul Bakker17373852011-01-06 14:20:01 +0000300
301/**
302 * \brief Generic HMAC process buffer
303 *
304 * \param ctx HMAC context
305 * \param input buffer holding the data
306 * \param ilen length of the input data
307 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000308 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
309 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000310 */
Paul Bakker23986e52011-04-24 08:57:21 +0000311int md_hmac_update( md_context_t *ctx, const unsigned char *input, size_t ilen );
Paul Bakker17373852011-01-06 14:20:01 +0000312
313/**
314 * \brief Generic HMAC final digest
315 *
316 * \param ctx HMAC context
317 * \param output Generic HMAC checksum result
318 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000319 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
320 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000321 */
322int md_hmac_finish( md_context_t *ctx, unsigned char *output);
323
324/**
325 * \brief Generic HMAC context reset
326 *
327 * \param ctx HMAC context to be reset
328 *
Paul Bakker9c021ad2011-06-09 15:55:11 +0000329 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter
330 * verification fails.
Paul Bakker17373852011-01-06 14:20:01 +0000331 */
332int md_hmac_reset( md_context_t *ctx );
333
334/**
335 * \brief Output = Generic_HMAC( hmac key, input buffer )
336 *
337 * \param md_info message digest info
338 * \param key HMAC secret key
339 * \param keylen length of the HMAC key
340 * \param input buffer holding the data
341 * \param ilen length of the input data
342 * \param output Generic HMAC-result
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 Bakker23986e52011-04-24 08:57:21 +0000347int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen,
348 const unsigned char *input, size_t ilen,
Paul Bakker17373852011-01-06 14:20:01 +0000349 unsigned char *output );
350
351#ifdef __cplusplus
352}
353#endif
354
355#endif /* POLARSSL_MD_H */