#undef X509_EXTENSIONS to avoid conflict with CryptoAPI.
[oweals/openssl.git] / crypto / hmac / hmac.c
index 50765e227bf2ef0a3a0c134537dc390c7bff4d23..5c99f03e267e1ae55b7f278e2bf5aab52e2b0a37 100644 (file)
@@ -58,8 +58,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <openssl/hmac.h>
 #include "cryptlib.h"
+#include <openssl/hmac.h>
 
 void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
                  const EVP_MD *md, ENGINE *impl)
@@ -89,7 +89,7 @@ void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
                        }
                else
                        {
-                       OPENSSL_assert(len <= (int)sizeof(ctx->key));
+                       OPENSSL_assert(len>=0 && len<=(int)sizeof(ctx->key));
                        memcpy(ctx->key,key,len);
                        ctx->key_length=len;
                        }
@@ -147,6 +147,16 @@ void HMAC_CTX_init(HMAC_CTX *ctx)
        EVP_MD_CTX_init(&ctx->md_ctx);
        }
 
+void HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx)
+       {
+       EVP_MD_CTX_copy(&dctx->i_ctx, &sctx->i_ctx);
+       EVP_MD_CTX_copy(&dctx->o_ctx, &sctx->o_ctx);
+       EVP_MD_CTX_copy(&dctx->md_ctx, &sctx->md_ctx);
+       memcpy(dctx->key, sctx->key, HMAC_MAX_MD_CBLOCK);
+       dctx->key_length = sctx->key_length;
+       dctx->md = sctx->md;
+       }
+
 void HMAC_CTX_cleanup(HMAC_CTX *ctx)
        {
        EVP_MD_CTX_cleanup(&ctx->i_ctx);