X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fhmac%2Fhm_pmeth.c;h=0daa44511d242a007eda4a96772f4e3478c7a967;hb=244ed51a0dad5f52233b46be716defcfe7bc77ff;hp=27a5c8ea572ce87b8752d34448a9e43595373c1c;hpb=7b8b7973750f65ecce161af012f004b9c7be45f9;p=oweals%2Fopenssl.git diff --git a/crypto/hmac/hm_pmeth.c b/crypto/hmac/hm_pmeth.c index 27a5c8ea57..0daa44511d 100644 --- a/crypto/hmac/hm_pmeth.c +++ b/crypto/hmac/hm_pmeth.c @@ -1,4 +1,4 @@ -/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2007. */ /* ==================================================================== @@ -100,7 +100,8 @@ static int pkey_hmac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) dctx = dst->data; dctx->md = sctx->md; HMAC_CTX_init(&dctx->ctx); - HMAC_CTX_copy(&dctx->ctx, &sctx->ctx); + if (!HMAC_CTX_copy(&dctx->ctx, &sctx->ctx)) + return 0; if (sctx->ktmp.data) { if (!ASN1_OCTET_STRING_set(&dctx->ktmp, @@ -116,7 +117,8 @@ static void pkey_hmac_cleanup(EVP_PKEY_CTX *ctx) HMAC_CTX_cleanup(&hctx->ctx); if (hctx->ktmp.data) { - OPENSSL_cleanse(hctx->ktmp.data, hctx->ktmp.length); + if (hctx->ktmp.length) + OPENSSL_cleanse(hctx->ktmp.data, hctx->ktmp.length); OPENSSL_free(hctx->ktmp.data); hctx->ktmp.data = NULL; } @@ -140,12 +142,15 @@ static int pkey_hmac_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) static int int_update(EVP_MD_CTX *ctx,const void *data,size_t count) { HMAC_PKEY_CTX *hctx = ctx->pctx->data; - HMAC_Update(&hctx->ctx, data, count); + if (!HMAC_Update(&hctx->ctx, data, count)) + return 0; return 1; } static int hmac_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) { + HMAC_PKEY_CTX *hctx = ctx->data; + HMAC_CTX_set_flags(&hctx->ctx, mctx->flags & ~EVP_MD_CTX_FLAG_NO_INIT); EVP_MD_CTX_set_flags(mctx, EVP_MD_CTX_FLAG_NO_INIT); mctx->update = int_update; return 1; @@ -156,11 +161,16 @@ static int hmac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, { unsigned int hlen; HMAC_PKEY_CTX *hctx = ctx->data; - *siglen = EVP_MD_CTX_size(mctx); + int l = EVP_MD_CTX_size(mctx); + + if (l < 0) + return 0; + *siglen = l; if (!sig) return 1; - HMAC_Final(&hctx->ctx, sig, &hlen); + if (!HMAC_Final(&hctx->ctx, sig, &hlen)) + return 0; *siglen = (size_t)hlen; return 1; } @@ -185,8 +195,9 @@ static int pkey_hmac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) case EVP_PKEY_CTRL_DIGESTINIT: key = (ASN1_OCTET_STRING *)ctx->pkey->pkey.ptr; - HMAC_Init_ex(&hctx->ctx, key->data, key->length, hctx->md, - ctx->engine); + if (!HMAC_Init_ex(&hctx->ctx, key->data, key->length, hctx->md, + ctx->engine)) + return 0; break; default: @@ -205,8 +216,9 @@ static int pkey_hmac_ctrl_str(EVP_PKEY_CTX *ctx, } if (!strcmp(type, "key")) { + void *p = (void *)value; return pkey_hmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, - -1, (void *)value); + -1, p); } if (!strcmp(type, "hexkey")) {