Commit e2095c65 authored by Matt Caswell's avatar Matt Caswell
Browse files

Ensure that both the MD and key have been initialised before attempting to


create an HMAC

Inspired by BoringSSL commit 2fe7f2d0d9a6fcc75b4e594eeec306cc55acd594

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
parent 2cfbdd71
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -71,8 +71,14 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
    if (md != NULL) {
        reset = 1;
        ctx->md = md;
    } else
    } else if(ctx->md) {
        md = ctx->md;
    } else {
        return 0;
    }

    if(!ctx->key_init && key == NULL)
        return 0;

    if (key != NULL) {
        reset = 1;
@@ -94,6 +100,7 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
        if (ctx->key_length != HMAC_MAX_MD_CBLOCK)
            memset(&ctx->key[ctx->key_length], 0,
                   HMAC_MAX_MD_CBLOCK - ctx->key_length);
        ctx->key_init = 1;
    }

    if (reset) {
@@ -129,6 +136,8 @@ int HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md)

int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len)
{
    if(!ctx->key_init)
        return 0;
    return EVP_DigestUpdate(&ctx->md_ctx, data, len);
}

@@ -137,6 +146,9 @@ int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len)
    unsigned int i;
    unsigned char buf[EVP_MAX_MD_SIZE];

    if(!ctx->key_init)
        goto err;

    if (!EVP_DigestFinal_ex(&ctx->md_ctx, buf, &i))
        goto err;
    if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx, &ctx->o_ctx))
@@ -155,6 +167,8 @@ void HMAC_CTX_init(HMAC_CTX *ctx)
    EVP_MD_CTX_init(&ctx->i_ctx);
    EVP_MD_CTX_init(&ctx->o_ctx);
    EVP_MD_CTX_init(&ctx->md_ctx);
    ctx->key_init = 0;
    ctx->md = NULL;
}

int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx)
@@ -166,8 +180,11 @@ int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx)
        goto err;
    if (!EVP_MD_CTX_copy_ex(&dctx->md_ctx, &sctx->md_ctx))
        goto err;
    dctx->key_init = sctx->key_init;
    if(sctx->key_init) {
        memcpy(dctx->key, sctx->key, HMAC_MAX_MD_CBLOCK);
        dctx->key_length = sctx->key_length;
    }
    dctx->md = sctx->md;
    return 1;
 err:
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ typedef struct hmac_ctx_st {
    EVP_MD_CTX o_ctx;
    unsigned int key_length;
    unsigned char key[HMAC_MAX_MD_CBLOCK];
    int key_init;
} HMAC_CTX;

# define HMAC_size(e)    (EVP_MD_size((e)->md))