Extend HMAC_MAX_MD_CBLOCK to accomodate SHA-512.
[openssl.git] / crypto / hmac / hmac.c
index a2a49d986a21d7fe60b66943103d337fc837c33b..50765e227bf2ef0a3a0c134537dc390c7bff4d23 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <openssl/hmac.h>
+#include "cryptlib.h"
 
-void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
-              const EVP_MD *md)
+void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
+                 const EVP_MD *md, ENGINE *impl)
        {
        int i,j,reset=0;
        unsigned char pad[HMAC_MAX_MD_CBLOCK];
@@ -78,15 +79,17 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
                {
                reset=1;
                j=EVP_MD_block_size(md);
+               OPENSSL_assert(j <= (int)sizeof(ctx->key));
                if (j < len)
                        {
-                       EVP_DigestInit_ex(&ctx->md_ctx,md, NULL);
+                       EVP_DigestInit_ex(&ctx->md_ctx,md, impl);
                        EVP_DigestUpdate(&ctx->md_ctx,key,len);
                        EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key,
                                &ctx->key_length);
                        }
                else
                        {
+                       OPENSSL_assert(len <= (int)sizeof(ctx->key));
                        memcpy(ctx->key,key,len);
                        ctx->key_length=len;
                        }
@@ -99,18 +102,26 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
                {
                for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)
                        pad[i]=0x36^ctx->key[i];
-               EVP_DigestInit_ex(&ctx->i_ctx,md, NULL);
+               EVP_DigestInit_ex(&ctx->i_ctx,md, impl);
                EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md));
 
                for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)
                        pad[i]=0x5c^ctx->key[i];
-               EVP_DigestInit_ex(&ctx->o_ctx,md, NULL);
+               EVP_DigestInit_ex(&ctx->o_ctx,md, impl);
                EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md));
                }
        EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx);
        }
 
-void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len)
+void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
+              const EVP_MD *md)
+       {
+       if(key && md)
+           HMAC_CTX_init(ctx);
+       HMAC_Init_ex(ctx,key,len,md, NULL);
+       }
+
+void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len)
        {
        EVP_DigestUpdate(&ctx->md_ctx,data,len);
        }
@@ -145,7 +156,7 @@ void HMAC_CTX_cleanup(HMAC_CTX *ctx)
        }
 
 unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
-                   const unsigned char *d, int n, unsigned char *md,
+                   const unsigned char *d, size_t n, unsigned char *md,
                    unsigned int *md_len)
        {
        HMAC_CTX c;