Index: openssl/crypto/evp/p_sign.c |
=================================================================== |
--- openssl/crypto/evp/p_sign.c (revision 105093) |
+++ openssl/crypto/evp/p_sign.c (working copy) |
@@ -81,9 +81,35 @@ |
unsigned char m[EVP_MAX_MD_SIZE]; |
unsigned int m_len; |
int i,ok=0,v; |
- MS_STATIC EVP_MD_CTX tmp_ctx; |
+ EVP_MD_CTX tmp_ctx; |
*siglen=0; |
+ EVP_MD_CTX_init(&tmp_ctx); |
+ EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); |
+ EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); |
+ EVP_MD_CTX_cleanup(&tmp_ctx); |
+ |
+ if (ctx->digest->flags & EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) |
+ { |
+ EVP_PKEY_CTX *pkctx = NULL; |
+ size_t sltmp = (size_t)EVP_PKEY_size(pkey); |
+ i = 0; |
+ pkctx = EVP_PKEY_CTX_new(pkey, NULL); |
+ if (!pkctx) |
+ goto err; |
+ if (EVP_PKEY_sign_init(pkctx) <= 0) |
+ goto err; |
+ if (EVP_PKEY_CTX_set_signature_md(pkctx, ctx->digest) <= 0) |
+ goto err; |
+ if (EVP_PKEY_sign(pkctx, sigret, &sltmp, m, m_len) <= 0) |
+ goto err; |
+ *siglen = sltmp; |
+ i = 1; |
+ err: |
+ EVP_PKEY_CTX_free(pkctx); |
+ return i; |
+ } |
+ |
for (i=0; i<4; i++) |
{ |
v=ctx->digest->required_pkey_type[i]; |
@@ -99,28 +125,13 @@ |
EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); |
return(0); |
} |
+ |
if (ctx->digest->sign == NULL) |
{ |
EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_NO_SIGN_FUNCTION_CONFIGURED); |
return(0); |
} |
- EVP_MD_CTX_init(&tmp_ctx); |
- EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); |
- if (ctx->digest->flags & EVP_MD_FLAG_SVCTX) |
- { |
- EVP_MD_SVCTX sctmp; |
- sctmp.mctx = &tmp_ctx; |
- sctmp.key = pkey->pkey.ptr; |
- i = ctx->digest->sign(ctx->digest->type, |
- NULL, -1, sigret, siglen, &sctmp); |
- } |
- else |
- { |
- EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); |
- i = ctx->digest->sign(ctx->digest->type,m,m_len,sigret,siglen, |
- pkey->pkey.ptr); |
- } |
- EVP_MD_CTX_cleanup(&tmp_ctx); |
- return i; |
+ return(ctx->digest->sign(ctx->digest->type,m,m_len,sigret,siglen, |
+ pkey->pkey.ptr)); |
} |