diff --git a/crypto/evp/m_sigver.c b/crypto/evp/m_sigver.c
index 7e2731f..634465a 100644
--- a/crypto/evp/m_sigver.c
+++ b/crypto/evp/m_sigver.c
@@ -116,12 +116,52 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
 	return 1;
 	}
 
+
+static int do_sigver_re_init(EVP_MD_CTX *ctx, EVP_PKEY *pkey, int ver)
+	{
+	if (ctx->pctx == NULL)
+		ctx->pctx = EVP_PKEY_CTX_new(pkey, NULL);
+	if (ctx->pctx == NULL)
+		return 0;
+
+	if (ver)
+		{
+		if (ctx->pctx->pmeth->verifyctx_init)
+			{
+			if (ctx->pctx->pmeth->verifyctx_init(ctx->pctx, ctx) <=0)
+				return 0;
+			ctx->pctx->operation = EVP_PKEY_OP_VERIFYCTX;
+			}
+		else if (EVP_PKEY_verify_init(ctx->pctx) <= 0)
+			return 0;
+		}
+	else
+		{
+		if (ctx->pctx->pmeth->signctx_init)
+			{
+			if (ctx->pctx->pmeth->signctx_init(ctx->pctx, ctx) <= 0)
+				return 0;
+			ctx->pctx->operation = EVP_PKEY_OP_SIGNCTX;
+			}
+		else if (EVP_PKEY_sign_init(ctx->pctx) <= 0)
+			return 0;
+		}
+	if (!EVP_DigestReInit_ex(ctx))
+		return 0;
+	return 1;
+	}
+
 int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
 			const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey)
 	{
 	return do_sigver_init(ctx, pctx, type, e, pkey, 0);
 	}
 
+int EVP_DigestSignReInit(EVP_MD_CTX *ctx, EVP_PKEY *pkey)
+	{
+	return do_sigver_re_init(ctx, pkey, 0);
+	}
+
 int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
 			const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey)
 	{
@@ -171,6 +211,45 @@ int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen)
 	return 1;
 	}
 
+int EVP_DigestSignFinalNoCopy(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen)
+	{
+	int sctx, r = 0;
+	if (ctx->pctx->pmeth->signctx)
+		sctx = 1;
+	else
+		sctx = 0;
+	if (sigret)
+		{
+		unsigned char md[EVP_MAX_MD_SIZE];
+		unsigned int mdlen;
+		if (sctx)
+			r = ctx->pctx->pmeth->signctx(ctx->pctx,
+					sigret, siglen, ctx);
+		else
+			r = EVP_DigestFinal_ex(ctx,md,&mdlen);
+		if (sctx || !r)
+			return r;
+		if (EVP_PKEY_sign(ctx->pctx, sigret, siglen, md, mdlen) <= 0)
+			return 0;
+		}
+	else
+		{
+		if (sctx)
+			{
+			if (ctx->pctx->pmeth->signctx(ctx->pctx, sigret, siglen, ctx) <= 0)
+				return 0;
+			}
+		else
+			{
+			int s = EVP_MD_size(ctx->digest);
+			if (s < 0 || EVP_PKEY_sign(ctx->pctx, sigret, siglen, NULL, s) <= 0)
+				return 0;
+			}
+		}
+	return 1;
+	}
+
+
 int EVP_DigestVerifyFinal(EVP_MD_CTX *ctx, unsigned char *sig, size_t siglen)
 	{
 	EVP_MD_CTX tmp_ctx;
diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c
index 3c43173..79cb98c 100644
--- a/ssl/t1_enc.c
+++ b/ssl/t1_enc.c
@@ -170,9 +170,9 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
 	OPENSSL_assert(chunk >= 0);
 
 	EVP_MD_CTX_init(&ctx);
-	EVP_MD_CTX_init(&ctx_tmp);
+    EVP_MD_CTX_init(&ctx_tmp);
 	EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-	EVP_MD_CTX_set_flags(&ctx_tmp, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
+    EVP_MD_CTX_set_flags(&ctx_tmp, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
 	mac_key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
 	if (!mac_key)
 		goto err;
@@ -190,15 +190,15 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
 		goto err;
 	if (seed5 && !EVP_DigestSignUpdate(&ctx,seed5,seed5_len))
 		goto err;
-	if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
+	if (!EVP_DigestSignFinalNoCopy(&ctx,A1,&A1_len))
 		goto err;
 
 	for (;;)
 		{
 		/* Reinit mac contexts */
-		if (!EVP_DigestSignInit(&ctx,NULL,md, NULL, mac_key))
+		if (!EVP_DigestSignReInit(&ctx, mac_key))
 			goto err;
-		if (!EVP_DigestSignInit(&ctx_tmp,NULL,md, NULL, mac_key))
+		if (!EVP_DigestSignReInit(&ctx_tmp, mac_key))
 			goto err;
 		if (!EVP_DigestSignUpdate(&ctx,A1,A1_len))
 			goto err;
@@ -217,17 +217,17 @@ static int tls1_P_hash(const EVP_MD *md, const unsigned char *sec,
 
 		if (olen > chunk)
 			{
-			if (!EVP_DigestSignFinal(&ctx,out,&j))
+			if (!EVP_DigestSignFinalNoCopy(&ctx,out,&j))
 				goto err;
 			out+=j;
 			olen-=j;
 			/* calc the next A1 value */
-			if (!EVP_DigestSignFinal(&ctx_tmp,A1,&A1_len))
+			if (!EVP_DigestSignFinalNoCopy(&ctx_tmp,A1,&A1_len))
 				goto err;
 			}
 		else	/* last one */
 			{
-			if (!EVP_DigestSignFinal(&ctx,A1,&A1_len))
+			if (!EVP_DigestSignFinalNoCopy(&ctx,A1,&A1_len))
 				goto err;
 			memcpy(out,A1,olen);
 			break;
