md.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /**
  2. * \file md.c
  3. *
  4. * \brief Generic message digest wrapper for PolarSSL
  5. *
  6. * \author Adriaan de Jong <dejong@fox-it.com>
  7. *
  8. * Copyright (C) 2006-2010, Brainspark B.V.
  9. *
  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. */
  29. #include "config.h"
  30. #if defined(POLARSSL_MD_C)
  31. #include "polarssl/md.h"
  32. #include "polarssl/md_wrap.h"
  33. #include <stdlib.h>
  34. #include <stdlib.h>
  35. #if defined ( __GNUC__ )
  36. #include <my_strings.h>
  37. #endif
  38. #if defined _MSC_VER && !defined strcasecmp
  39. #define strcasecmp _stricmp
  40. #endif
  41. static const int supported_digests[] = {
  42. #if defined(POLARSSL_MD2_C)
  43. POLARSSL_MD_MD2,
  44. #endif
  45. #if defined(POLARSSL_MD4_C)
  46. POLARSSL_MD_MD4,
  47. #endif
  48. #if defined(POLARSSL_MD5_C)
  49. POLARSSL_MD_MD5,
  50. #endif
  51. #if defined(POLARSSL_SHA1_C)
  52. POLARSSL_MD_SHA1,
  53. #endif
  54. #if defined(POLARSSL_SHA2_C)
  55. POLARSSL_MD_SHA224,
  56. POLARSSL_MD_SHA256,
  57. #endif
  58. #if defined(POLARSSL_SHA4_C)
  59. POLARSSL_MD_SHA384,
  60. POLARSSL_MD_SHA512,
  61. #endif
  62. 0
  63. };
  64. const int *md_list( void )
  65. {
  66. return supported_digests;
  67. }
  68. const md_info_t *md_info_from_string( const char *md_name )
  69. {
  70. if( NULL == md_name )
  71. return NULL;
  72. /* Get the appropriate digest information */
  73. #if defined(POLARSSL_MD2_C)
  74. if( !strcasecmp( "MD2", md_name ) )
  75. return md_info_from_type( POLARSSL_MD_MD2 );
  76. #endif
  77. #if defined(POLARSSL_MD4_C)
  78. if( !strcasecmp( "MD4", md_name ) )
  79. return md_info_from_type( POLARSSL_MD_MD4 );
  80. #endif
  81. #if defined(POLARSSL_MD5_C)
  82. if( !strcasecmp( "MD5", md_name ) )
  83. return md_info_from_type( POLARSSL_MD_MD5 );
  84. #endif
  85. #if defined(POLARSSL_SHA1_C)
  86. if( !strcasecmp( "SHA1", md_name ) || !strcasecmp( "SHA", md_name ) )
  87. return md_info_from_type( POLARSSL_MD_SHA1 );
  88. #endif
  89. #if defined(POLARSSL_SHA2_C)
  90. if( !strcasecmp( "SHA224", md_name ) )
  91. return md_info_from_type( POLARSSL_MD_SHA224 );
  92. if( !strcasecmp( "SHA256", md_name ) )
  93. return md_info_from_type( POLARSSL_MD_SHA256 );
  94. #endif
  95. #if defined(POLARSSL_SHA4_C)
  96. if( !strcasecmp( "SHA384", md_name ) )
  97. return md_info_from_type( POLARSSL_MD_SHA384 );
  98. if( !strcasecmp( "SHA512", md_name ) )
  99. return md_info_from_type( POLARSSL_MD_SHA512 );
  100. #endif
  101. return NULL;
  102. }
  103. const md_info_t *md_info_from_type( md_type_t md_type )
  104. {
  105. switch( md_type )
  106. {
  107. #if defined(POLARSSL_MD2_C)
  108. case POLARSSL_MD_MD2:
  109. return &md2_info;
  110. #endif
  111. #if defined(POLARSSL_MD4_C)
  112. case POLARSSL_MD_MD4:
  113. return &md4_info;
  114. #endif
  115. #if defined(POLARSSL_MD5_C)
  116. case POLARSSL_MD_MD5:
  117. return &md5_info;
  118. #endif
  119. #if defined(POLARSSL_SHA1_C)
  120. case POLARSSL_MD_SHA1:
  121. return &sha1_info;
  122. #endif
  123. #if defined(POLARSSL_SHA2_C)
  124. case POLARSSL_MD_SHA224:
  125. return &sha224_info;
  126. case POLARSSL_MD_SHA256:
  127. return &sha256_info;
  128. #endif
  129. #if defined(POLARSSL_SHA4_C)
  130. case POLARSSL_MD_SHA384:
  131. return &sha384_info;
  132. case POLARSSL_MD_SHA512:
  133. return &sha512_info;
  134. #endif
  135. default:
  136. return NULL;
  137. }
  138. }
  139. int md_init_ctx( md_context_t *ctx, const md_info_t *md_info )
  140. {
  141. if( md_info == NULL )
  142. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  143. if( ctx == NULL || ctx->md_ctx != NULL )
  144. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  145. if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )
  146. return POLARSSL_ERR_MD_ALLOC_FAILED;
  147. ctx->md_info = md_info;
  148. md_info->starts_func( ctx->md_ctx );
  149. return 0;
  150. }
  151. int md_free_ctx( md_context_t *ctx )
  152. {
  153. if( ctx == NULL || ctx->md_info == NULL )
  154. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  155. ctx->md_info->ctx_free_func( ctx->md_ctx );
  156. ctx->md_ctx = NULL;
  157. return 0;
  158. }
  159. int md_starts( md_context_t *ctx )
  160. {
  161. if( ctx == NULL || ctx->md_info == NULL )
  162. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  163. ctx->md_info->starts_func( ctx->md_ctx );
  164. return 0;
  165. }
  166. int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen )
  167. {
  168. if( ctx == NULL || ctx->md_info == NULL )
  169. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  170. ctx->md_info->update_func( ctx->md_ctx, input, ilen );
  171. return 0;
  172. }
  173. int md_finish( md_context_t *ctx, unsigned char *output )
  174. {
  175. if( ctx == NULL || ctx->md_info == NULL )
  176. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  177. ctx->md_info->finish_func( ctx->md_ctx, output );
  178. return 0;
  179. }
  180. int md( const md_info_t *md_info, const unsigned char *input, size_t ilen,
  181. unsigned char *output )
  182. {
  183. if ( md_info == NULL )
  184. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  185. md_info->digest_func( input, ilen, output );
  186. return 0;
  187. }
  188. int md_file( const md_info_t *md_info, const char *path, unsigned char *output )
  189. {
  190. int ret;
  191. if( md_info == NULL )
  192. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  193. #if defined(POLARSSL_FS_IO)
  194. ret = md_info->file_func( path, output );
  195. if( ret == 2 )
  196. return POLARSSL_ERR_MD_FILE_OPEN_FAILED;
  197. if( ret == 3 )
  198. return POLARSSL_ERR_MD_FILE_READ_FAILED;
  199. return ret;
  200. #else
  201. ((void) path);
  202. ((void) output);
  203. return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE;
  204. #endif
  205. }
  206. int md_hmac_starts( md_context_t *ctx, const unsigned char *key, size_t keylen )
  207. {
  208. if( ctx == NULL || ctx->md_info == NULL )
  209. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  210. ctx->md_info->hmac_starts_func( ctx->md_ctx, key, keylen);
  211. return 0;
  212. }
  213. int md_hmac_update( md_context_t *ctx, const unsigned char *input, size_t ilen )
  214. {
  215. if( ctx == NULL || ctx->md_info == NULL )
  216. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  217. ctx->md_info->hmac_update_func( ctx->md_ctx, input, ilen );
  218. return 0;
  219. }
  220. int md_hmac_finish( md_context_t *ctx, unsigned char *output)
  221. {
  222. if( ctx == NULL || ctx->md_info == NULL )
  223. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  224. ctx->md_info->hmac_finish_func( ctx->md_ctx, output);
  225. return 0;
  226. }
  227. int md_hmac_reset( md_context_t *ctx )
  228. {
  229. if( ctx == NULL || ctx->md_info == NULL )
  230. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  231. ctx->md_info->hmac_reset_func( ctx->md_ctx);
  232. return 0;
  233. }
  234. int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen,
  235. const unsigned char *input, size_t ilen,
  236. unsigned char *output )
  237. {
  238. if( md_info == NULL )
  239. return POLARSSL_ERR_MD_BAD_INPUT_DATA;
  240. md_info->hmac_func( key, keylen, input, ilen, output );
  241. return 0;
  242. }
  243. #endif