diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/curl_md5.h | 29 | ||||
| -rw-r--r-- | lib/md5.c | 50 | 
2 files changed, 79 insertions, 0 deletions
diff --git a/lib/curl_md5.h b/lib/curl_md5.h index ddc61e3e5..b445500fc 100644 --- a/lib/curl_md5.h +++ b/lib/curl_md5.h @@ -25,10 +25,39 @@  #ifndef CURL_DISABLE_CRYPTO_AUTH  #include "curl_hmac.h" +#define MD5_DIGEST_LEN  16 + +typedef void (* Curl_MD5_init_func)(void *context); +typedef void (* Curl_MD5_update_func)(void *context, +                                      const unsigned char *data, +                                      unsigned int len); +typedef void (* Curl_MD5_final_func)(unsigned char *result, void *context); + +typedef struct { +  Curl_MD5_init_func     md5_init;      /* Initialize context procedure */ +  Curl_MD5_update_func   md5_update;    /* Update context with data */ +  Curl_MD5_final_func    md5_final;     /* Get final result procedure */ +  unsigned int           md5_ctxtsize;  /* Context structure size */ +  unsigned int           md5_resultlen; /* Result length (bytes) */ +} MD5_params; + +typedef struct { +  const MD5_params      *md5_hash;      /* Hash function definition */ +  void                  *md5_hashctx;   /* Hash function context */ +} MD5_context; + +extern const MD5_params Curl_DIGEST_MD5[1];  extern const HMAC_params Curl_HMAC_MD5[1];  void Curl_md5it(unsigned char *output,                  const unsigned char *input); + +MD5_context * Curl_MD5_init(const MD5_params *md5params); +int Curl_MD5_update(MD5_context *context, +                    const unsigned char *data, +                    unsigned int len); +int Curl_MD5_final(MD5_context *context, unsigned char *result); +  #endif  #endif /* HEADER_CURL_MD5_H */ @@ -407,6 +407,15 @@ const HMAC_params Curl_HMAC_MD5[] = {    }  }; +const MD5_params Curl_DIGEST_MD5[] = { +  { +    (Curl_MD5_init_func) MD5_Init,      /* Digest initialization function */ +    (Curl_MD5_update_func) MD5_Update,  /* Digest update function */ +    (Curl_MD5_final_func) MD5_Final,    /* Digest computation end function */ +    sizeof(MD5_CTX),                    /* Size of digest context struct */ +    16                                  /* Result size */ +  } +};  void Curl_md5it(unsigned char *outbuffer, /* 16 bytes */                  const unsigned char *input) @@ -417,4 +426,45 @@ void Curl_md5it(unsigned char *outbuffer, /* 16 bytes */    MD5_Final(outbuffer, &ctx);  } +MD5_context * Curl_MD5_init(const MD5_params *md5params) +{ +  MD5_context* ctxt; + +  /* Create MD5 context */ +  ctxt = malloc(sizeof *ctxt); + +  if(!ctxt) +    return ctxt; + +  ctxt->md5_hashctx = malloc(md5params->md5_ctxtsize); + +  if(!ctxt->md5_hashctx) +    return ctxt->md5_hashctx; + +  ctxt->md5_hash = md5params; + +  (*md5params->md5_init)(ctxt->md5_hashctx); + +  return ctxt; +} + +int Curl_MD5_update(MD5_context *context, +                    const unsigned char *data, +                    unsigned int len) +{ +  (*context->md5_hash->md5_update)(context->md5_hashctx, data, len); + +  return 0; +} + +int Curl_MD5_final(MD5_context *context, unsigned char *result) +{ +  (*context->md5_hash->md5_final)(result, context->md5_hashctx); + +  free(context->md5_hashctx); +  free(context); + +  return 0; +} +  #endif /* CURL_DISABLE_CRYPTO_AUTH */  | 
