X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fhmac%2Fhmac.c;h=9504aada943bd337f7fef851c5de82f7325f2626;hp=6d1aaf845f54d3a690577ed6bad0aeb4c5cc4b76;hb=b7b8e948014d93e1eb6d954d0799ae68ab0e068b;hpb=32fd54a9a36c172cf4e5fe4b7af2ae1f1ce1bc0a diff --git a/crypto/hmac/hmac.c b/crypto/hmac/hmac.c index 6d1aaf845f..9504aada94 100644 --- a/crypto/hmac/hmac.c +++ b/crypto/hmac/hmac.c @@ -1,4 +1,3 @@ -/* crypto/hmac/hmac.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -61,6 +60,7 @@ #include #include "internal/cryptlib.h" #include +#include #include "hmac_lcl.h" int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, @@ -127,11 +127,11 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, return 0; } -#ifndef OPENSSL_NO_DEPRECATED +#if OPENSSL_API_COMPAT < 0x10100000L int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md) { if (key && md) - HMAC_CTX_init(ctx); + HMAC_CTX_reset(ctx); return HMAC_Init_ex(ctx, key, len, md, NULL); } #endif @@ -171,20 +171,22 @@ size_t HMAC_size(HMAC_CTX *ctx) HMAC_CTX *HMAC_CTX_new(void) { - HMAC_CTX *ctx = (HMAC_CTX *)OPENSSL_zalloc(sizeof(HMAC_CTX)); - if (ctx) - if (!HMAC_CTX_init(ctx)) { + HMAC_CTX *ctx = OPENSSL_zalloc(sizeof(HMAC_CTX)); + + if (ctx != NULL) { + if (!HMAC_CTX_reset(ctx)) { HMAC_CTX_free(ctx); - ctx = NULL; + return NULL; } + } return ctx; } static void hmac_ctx_cleanup(HMAC_CTX *ctx) { - EVP_MD_CTX_init(ctx->i_ctx); - EVP_MD_CTX_init(ctx->o_ctx); - EVP_MD_CTX_init(ctx->md_ctx); + EVP_MD_CTX_reset(ctx->i_ctx); + EVP_MD_CTX_reset(ctx->o_ctx); + EVP_MD_CTX_reset(ctx->md_ctx); ctx->md = NULL; ctx->key_length = 0; memset(ctx->key, 0, sizeof(HMAC_MAX_MD_CBLOCK)); @@ -194,26 +196,26 @@ void HMAC_CTX_free(HMAC_CTX *ctx) { if (ctx != NULL) { hmac_ctx_cleanup(ctx); - EVP_MD_CTX_destroy(ctx->i_ctx); - EVP_MD_CTX_destroy(ctx->o_ctx); - EVP_MD_CTX_destroy(ctx->md_ctx); + EVP_MD_CTX_free(ctx->i_ctx); + EVP_MD_CTX_free(ctx->o_ctx); + EVP_MD_CTX_free(ctx->md_ctx); OPENSSL_free(ctx); } } -int HMAC_CTX_init(HMAC_CTX *ctx) +int HMAC_CTX_reset(HMAC_CTX *ctx) { hmac_ctx_cleanup(ctx); if (ctx->i_ctx == NULL) - ctx->i_ctx = EVP_MD_CTX_create(); + ctx->i_ctx = EVP_MD_CTX_new(); if (ctx->i_ctx == NULL) goto err; if (ctx->o_ctx == NULL) - ctx->o_ctx = EVP_MD_CTX_create(); + ctx->o_ctx = EVP_MD_CTX_new(); if (ctx->o_ctx == NULL) goto err; if (ctx->md_ctx == NULL) - ctx->md_ctx = EVP_MD_CTX_create(); + ctx->md_ctx = EVP_MD_CTX_new(); if (ctx->md_ctx == NULL) goto err; ctx->md = NULL; @@ -225,7 +227,7 @@ int HMAC_CTX_init(HMAC_CTX *ctx) int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx) { - if (!HMAC_CTX_init(dctx)) + if (!HMAC_CTX_reset(dctx)) goto err; if (!EVP_MD_CTX_copy_ex(dctx->i_ctx, sctx->i_ctx)) goto err; @@ -248,11 +250,18 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, { HMAC_CTX *c = NULL; static unsigned char m[EVP_MAX_MD_SIZE]; + static const unsigned char dummy_key[1] = {'\0'}; if (md == NULL) md = m; if ((c = HMAC_CTX_new()) == NULL) goto err; + + /* For HMAC_Init_ex, NULL key signals reuse. */ + if (key == NULL && key_len == 0) { + key = dummy_key; + } + if (!HMAC_Init_ex(c, key, key_len, evp_md, NULL)) goto err; if (!HMAC_Update(c, d, n))