00001
00030 #include "polarssl/config.h"
00031
00032 #if defined(POLARSSL_MD_C)
00033
00034 #include "polarssl/md.h"
00035 #include "polarssl/md_wrap.h"
00036
00037 #include <stdlib.h>
00038
00039 #if defined(_MSC_VER) && !defined strcasecmp && !defined(EFIX64) && \
00040 !defined(EFI32)
00041 #define strcasecmp _stricmp
00042 #endif
00043
00044 static const int supported_digests[] = {
00045
00046 #if defined(POLARSSL_MD2_C)
00047 POLARSSL_MD_MD2,
00048 #endif
00049
00050 #if defined(POLARSSL_MD4_C)
00051 POLARSSL_MD_MD4,
00052 #endif
00053
00054 #if defined(POLARSSL_MD5_C)
00055 POLARSSL_MD_MD5,
00056 #endif
00057
00058 #if defined(POLARSSL_SHA1_C)
00059 POLARSSL_MD_SHA1,
00060 #endif
00061
00062 #if defined(POLARSSL_SHA256_C)
00063 POLARSSL_MD_SHA224,
00064 POLARSSL_MD_SHA256,
00065 #endif
00066
00067 #if defined(POLARSSL_SHA512_C)
00068 POLARSSL_MD_SHA384,
00069 POLARSSL_MD_SHA512,
00070 #endif
00071
00072 0
00073 };
00074
00075 const int *md_list( void )
00076 {
00077 return supported_digests;
00078 }
00079
00080 const md_info_t *md_info_from_string( const char *md_name )
00081 {
00082 if( NULL == md_name )
00083 return NULL;
00084
00085
00086 #if defined(POLARSSL_MD2_C)
00087 if( !strcasecmp( "MD2", md_name ) )
00088 return md_info_from_type( POLARSSL_MD_MD2 );
00089 #endif
00090 #if defined(POLARSSL_MD4_C)
00091 if( !strcasecmp( "MD4", md_name ) )
00092 return md_info_from_type( POLARSSL_MD_MD4 );
00093 #endif
00094 #if defined(POLARSSL_MD5_C)
00095 if( !strcasecmp( "MD5", md_name ) )
00096 return md_info_from_type( POLARSSL_MD_MD5 );
00097 #endif
00098 #if defined(POLARSSL_SHA1_C)
00099 if( !strcasecmp( "SHA1", md_name ) || !strcasecmp( "SHA", md_name ) )
00100 return md_info_from_type( POLARSSL_MD_SHA1 );
00101 #endif
00102 #if defined(POLARSSL_SHA256_C)
00103 if( !strcasecmp( "SHA224", md_name ) )
00104 return md_info_from_type( POLARSSL_MD_SHA224 );
00105 if( !strcasecmp( "SHA256", md_name ) )
00106 return md_info_from_type( POLARSSL_MD_SHA256 );
00107 #endif
00108 #if defined(POLARSSL_SHA512_C)
00109 if( !strcasecmp( "SHA384", md_name ) )
00110 return md_info_from_type( POLARSSL_MD_SHA384 );
00111 if( !strcasecmp( "SHA512", md_name ) )
00112 return md_info_from_type( POLARSSL_MD_SHA512 );
00113 #endif
00114 return NULL;
00115 }
00116
00117 const md_info_t *md_info_from_type( md_type_t md_type )
00118 {
00119 switch( md_type )
00120 {
00121 #if defined(POLARSSL_MD2_C)
00122 case POLARSSL_MD_MD2:
00123 return &md2_info;
00124 #endif
00125 #if defined(POLARSSL_MD4_C)
00126 case POLARSSL_MD_MD4:
00127 return &md4_info;
00128 #endif
00129 #if defined(POLARSSL_MD5_C)
00130 case POLARSSL_MD_MD5:
00131 return &md5_info;
00132 #endif
00133 #if defined(POLARSSL_SHA1_C)
00134 case POLARSSL_MD_SHA1:
00135 return &sha1_info;
00136 #endif
00137 #if defined(POLARSSL_SHA256_C)
00138 case POLARSSL_MD_SHA224:
00139 return &sha224_info;
00140 case POLARSSL_MD_SHA256:
00141 return &sha256_info;
00142 #endif
00143 #if defined(POLARSSL_SHA512_C)
00144 case POLARSSL_MD_SHA384:
00145 return &sha384_info;
00146 case POLARSSL_MD_SHA512:
00147 return &sha512_info;
00148 #endif
00149 default:
00150 return NULL;
00151 }
00152 }
00153
00154 int md_init_ctx( md_context_t *ctx, const md_info_t *md_info )
00155 {
00156 if( md_info == NULL || ctx == NULL )
00157 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00158
00159 memset( ctx, 0, sizeof( md_context_t ) );
00160
00161 if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )
00162 return POLARSSL_ERR_MD_ALLOC_FAILED;
00163
00164 ctx->md_info = md_info;
00165
00166 md_info->starts_func( ctx->md_ctx );
00167
00168 return 0;
00169 }
00170
00171 int md_free_ctx( md_context_t *ctx )
00172 {
00173 if( ctx == NULL || ctx->md_info == NULL )
00174 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00175
00176 ctx->md_info->ctx_free_func( ctx->md_ctx );
00177 ctx->md_ctx = NULL;
00178
00179 return 0;
00180 }
00181
00182 int md_starts( md_context_t *ctx )
00183 {
00184 if( ctx == NULL || ctx->md_info == NULL )
00185 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00186
00187 ctx->md_info->starts_func( ctx->md_ctx );
00188
00189 return 0;
00190 }
00191
00192 int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen )
00193 {
00194 if( ctx == NULL || ctx->md_info == NULL )
00195 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00196
00197 ctx->md_info->update_func( ctx->md_ctx, input, ilen );
00198
00199 return 0;
00200 }
00201
00202 int md_finish( md_context_t *ctx, unsigned char *output )
00203 {
00204 if( ctx == NULL || ctx->md_info == NULL )
00205 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00206
00207 ctx->md_info->finish_func( ctx->md_ctx, output );
00208
00209 return 0;
00210 }
00211
00212 int md( const md_info_t *md_info, const unsigned char *input, size_t ilen,
00213 unsigned char *output )
00214 {
00215 if ( md_info == NULL )
00216 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00217
00218 md_info->digest_func( input, ilen, output );
00219
00220 return 0;
00221 }
00222
00223 int md_file( const md_info_t *md_info, const char *path, unsigned char *output )
00224 {
00225 #if defined(POLARSSL_FS_IO)
00226 int ret;
00227 #endif
00228
00229 if( md_info == NULL )
00230 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00231
00232 #if defined(POLARSSL_FS_IO)
00233 ret = md_info->file_func( path, output );
00234 if( ret != 0 )
00235 return( POLARSSL_ERR_MD_FILE_IO_ERROR + ret );
00236
00237 return( ret );
00238 #else
00239 ((void) path);
00240 ((void) output);
00241
00242 return POLARSSL_ERR_MD_FEATURE_UNAVAILABLE;
00243 #endif
00244 }
00245
00246 int md_hmac_starts( md_context_t *ctx, const unsigned char *key, size_t keylen )
00247 {
00248 if( ctx == NULL || ctx->md_info == NULL )
00249 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00250
00251 ctx->md_info->hmac_starts_func( ctx->md_ctx, key, keylen);
00252
00253 return 0;
00254 }
00255
00256 int md_hmac_update( md_context_t *ctx, const unsigned char *input, size_t ilen )
00257 {
00258 if( ctx == NULL || ctx->md_info == NULL )
00259 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00260
00261 ctx->md_info->hmac_update_func( ctx->md_ctx, input, ilen );
00262
00263 return 0;
00264 }
00265
00266 int md_hmac_finish( md_context_t *ctx, unsigned char *output)
00267 {
00268 if( ctx == NULL || ctx->md_info == NULL )
00269 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00270
00271 ctx->md_info->hmac_finish_func( ctx->md_ctx, output);
00272
00273 return 0;
00274 }
00275
00276 int md_hmac_reset( md_context_t *ctx )
00277 {
00278 if( ctx == NULL || ctx->md_info == NULL )
00279 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00280
00281 ctx->md_info->hmac_reset_func( ctx->md_ctx);
00282
00283 return 0;
00284 }
00285
00286 int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen,
00287 const unsigned char *input, size_t ilen,
00288 unsigned char *output )
00289 {
00290 if( md_info == NULL )
00291 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00292
00293 md_info->hmac_func( key, keylen, input, ilen, output );
00294
00295 return 0;
00296 }
00297
00298 int md_process( md_context_t *ctx, const unsigned char *data )
00299 {
00300 if( ctx == NULL || ctx->md_info == NULL )
00301 return POLARSSL_ERR_MD_BAD_INPUT_DATA;
00302
00303 ctx->md_info->process_func( ctx->md_ctx, data );
00304
00305 return 0;
00306 }
00307
00308 #endif