diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
index 467e6b5..aae226f 100644
--- a/crypto/evp/digest.c
+++ b/crypto/evp/digest.c
@@ -242,6 +242,35 @@ skip_to_init:
 	return ctx->digest->init(ctx);
 	}
 
+
+int	EVP_DigestReInit_ex(EVP_MD_CTX *ctx)
+	{
+	EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
+
+	if (ctx->pctx)
+		{
+		int r;
+		r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
+					EVP_PKEY_CTRL_DIGEST_REINIT, 0, ctx);
+		if (r <= 0 && (r != -2))
+			return 0;
+		}
+	if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
+		return 1;
+#ifdef OPENSSL_FIPS
+	if (FIPS_mode())
+		{
+		if (FIPS_digestinit(ctx, type))
+			return 1;
+		OPENSSL_free(ctx->md_data);
+		ctx->md_data = NULL;
+		return 0;
+		}
+#endif
+	return ctx->digest->init(ctx);
+	}
+
+
 int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
 	{
 #ifdef OPENSSL_FIPS
diff --git a/crypto/evp/evp.h b/crypto/evp/evp.h
index f69d318..d6916a4 100644
--- a/crypto/evp/evp.h
+++ b/crypto/evp/evp.h
@@ -555,6 +555,7 @@ void	EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
 void	EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
 int 	EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx,int flags);
 int	EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
+int	EVP_DigestReInit_ex(EVP_MD_CTX *ctx);
 int	EVP_DigestUpdate(EVP_MD_CTX *ctx,const void *d,
 			 size_t cnt);
 int	EVP_DigestFinal_ex(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s);
@@ -615,6 +616,8 @@ int	EVP_VerifyFinal(EVP_MD_CTX *ctx,const unsigned char *sigbuf,
 
 int	EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
 			const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey);
+int	EVP_DigestSignReInit(EVP_MD_CTX *ctx, EVP_PKEY *pkey);
+
 int	EVP_DigestSignFinal(EVP_MD_CTX *ctx,
 			unsigned char *sigret, size_t *siglen);
 int	EVP_DigestSignFinalNoCopy(EVP_MD_CTX *ctx,
@@ -1095,6 +1098,7 @@ void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth,
 #define EVP_PKEY_CTRL_SET_MAC_KEY	6
 
 #define EVP_PKEY_CTRL_DIGESTINIT	7
+#define EVP_PKEY_CTRL_DIGEST_REINIT	14
 
 /* Used by GOST key encryption in TLS */
 #define EVP_PKEY_CTRL_SET_IV 		8
diff --git a/crypto/hmac/hm_pmeth.c b/crypto/hmac/hm_pmeth.c
index 0daa445..c3fa38a 100644
--- a/crypto/hmac/hm_pmeth.c
+++ b/crypto/hmac/hm_pmeth.c
@@ -195,9 +195,18 @@ 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;
-		if (!HMAC_Init_ex(&hctx->ctx, key->data, key->length, hctx->md,
+        if (!HMAC_Init_ex(&hctx->ctx, key->data, key->length, hctx->md,
 				ctx->engine))
+            {
 			return 0;
+            }
+		break;
+        
+		case EVP_PKEY_CTRL_DIGEST_REINIT:
+        if (!HMAC_Init_ex(&hctx->ctx, NULL, 0, NULL, NULL))
+            {
+			return 0;
+            }
 		break;
 
 		default:
