diff options
Diffstat (limited to 'src/lib/libcrypto/evp/p_sign.c')
-rw-r--r-- | src/lib/libcrypto/evp/p_sign.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/src/lib/libcrypto/evp/p_sign.c b/src/lib/libcrypto/evp/p_sign.c index bf41a0db68..8df6d48a7e 100644 --- a/src/lib/libcrypto/evp/p_sign.c +++ b/src/lib/libcrypto/evp/p_sign.c | |||
@@ -84,6 +84,32 @@ int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, unsigned int *siglen, | |||
84 | MS_STATIC EVP_MD_CTX tmp_ctx; | 84 | MS_STATIC EVP_MD_CTX tmp_ctx; |
85 | 85 | ||
86 | *siglen=0; | 86 | *siglen=0; |
87 | EVP_MD_CTX_init(&tmp_ctx); | ||
88 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); | ||
89 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
90 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
91 | |||
92 | if (ctx->digest->flags & EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) | ||
93 | { | ||
94 | EVP_PKEY_CTX *pkctx = NULL; | ||
95 | size_t sltmp = (size_t)EVP_PKEY_size(pkey); | ||
96 | i = 0; | ||
97 | pkctx = EVP_PKEY_CTX_new(pkey, NULL); | ||
98 | if (!pkctx) | ||
99 | goto err; | ||
100 | if (EVP_PKEY_sign_init(pkctx) <= 0) | ||
101 | goto err; | ||
102 | if (EVP_PKEY_CTX_set_signature_md(pkctx, ctx->digest) <= 0) | ||
103 | goto err; | ||
104 | if (EVP_PKEY_sign(pkctx, sigret, &sltmp, m, m_len) <= 0) | ||
105 | goto err; | ||
106 | *siglen = sltmp; | ||
107 | i = 1; | ||
108 | err: | ||
109 | EVP_PKEY_CTX_free(pkctx); | ||
110 | return i; | ||
111 | } | ||
112 | |||
87 | for (i=0; i<4; i++) | 113 | for (i=0; i<4; i++) |
88 | { | 114 | { |
89 | v=ctx->digest->required_pkey_type[i]; | 115 | v=ctx->digest->required_pkey_type[i]; |
@@ -99,28 +125,13 @@ int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, unsigned int *siglen, | |||
99 | EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); | 125 | EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); |
100 | return(0); | 126 | return(0); |
101 | } | 127 | } |
128 | |||
102 | if (ctx->digest->sign == NULL) | 129 | if (ctx->digest->sign == NULL) |
103 | { | 130 | { |
104 | EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_NO_SIGN_FUNCTION_CONFIGURED); | 131 | EVPerr(EVP_F_EVP_SIGNFINAL,EVP_R_NO_SIGN_FUNCTION_CONFIGURED); |
105 | return(0); | 132 | return(0); |
106 | } | 133 | } |
107 | EVP_MD_CTX_init(&tmp_ctx); | 134 | return(ctx->digest->sign(ctx->digest->type,m,m_len,sigret,siglen, |
108 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); | 135 | pkey->pkey.ptr)); |
109 | if (ctx->digest->flags & EVP_MD_FLAG_SVCTX) | ||
110 | { | ||
111 | EVP_MD_SVCTX sctmp; | ||
112 | sctmp.mctx = &tmp_ctx; | ||
113 | sctmp.key = pkey->pkey.ptr; | ||
114 | i = ctx->digest->sign(ctx->digest->type, | ||
115 | NULL, -1, sigret, siglen, &sctmp); | ||
116 | } | ||
117 | else | ||
118 | { | ||
119 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
120 | i = ctx->digest->sign(ctx->digest->type,m,m_len,sigret,siglen, | ||
121 | pkey->pkey.ptr); | ||
122 | } | ||
123 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
124 | return i; | ||
125 | } | 136 | } |
126 | 137 | ||