diff options
Diffstat (limited to 'src/lib/libcrypto/evp/p_verify.c')
-rw-r--r-- | src/lib/libcrypto/evp/p_verify.c | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/src/lib/libcrypto/evp/p_verify.c b/src/lib/libcrypto/evp/p_verify.c index 8db46412f3..2d46dffe7e 100644 --- a/src/lib/libcrypto/evp/p_verify.c +++ b/src/lib/libcrypto/evp/p_verify.c | |||
@@ -70,28 +70,6 @@ int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, | |||
70 | int i,ok=0,v; | 70 | int i,ok=0,v; |
71 | MS_STATIC EVP_MD_CTX tmp_ctx; | 71 | MS_STATIC EVP_MD_CTX tmp_ctx; |
72 | 72 | ||
73 | EVP_MD_CTX_init(&tmp_ctx); | ||
74 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); | ||
75 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
76 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
77 | |||
78 | if (ctx->digest->flags & EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) | ||
79 | { | ||
80 | EVP_PKEY_CTX *pkctx = NULL; | ||
81 | i = -1; | ||
82 | pkctx = EVP_PKEY_CTX_new(pkey, NULL); | ||
83 | if (!pkctx) | ||
84 | goto err; | ||
85 | if (EVP_PKEY_verify_init(pkctx) <= 0) | ||
86 | goto err; | ||
87 | if (EVP_PKEY_CTX_set_signature_md(pkctx, ctx->digest) <= 0) | ||
88 | goto err; | ||
89 | i = EVP_PKEY_verify(pkctx, sigbuf, siglen, m, m_len); | ||
90 | err: | ||
91 | EVP_PKEY_CTX_free(pkctx); | ||
92 | return i; | ||
93 | } | ||
94 | |||
95 | for (i=0; i<4; i++) | 73 | for (i=0; i<4; i++) |
96 | { | 74 | { |
97 | v=ctx->digest->required_pkey_type[i]; | 75 | v=ctx->digest->required_pkey_type[i]; |
@@ -107,13 +85,29 @@ int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, | |||
107 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); | 85 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); |
108 | return(-1); | 86 | return(-1); |
109 | } | 87 | } |
110 | if (ctx->digest->verify == NULL) | 88 | if (ctx->digest->verify == NULL) |
111 | { | 89 | { |
112 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_NO_VERIFY_FUNCTION_CONFIGURED); | 90 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_NO_VERIFY_FUNCTION_CONFIGURED); |
113 | return(0); | 91 | return(0); |
114 | } | 92 | } |
115 | 93 | ||
116 | return(ctx->digest->verify(ctx->digest->type,m,m_len, | 94 | EVP_MD_CTX_init(&tmp_ctx); |
117 | sigbuf,siglen,pkey->pkey.ptr)); | 95 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); |
96 | if (ctx->digest->flags & EVP_MD_FLAG_SVCTX) | ||
97 | { | ||
98 | EVP_MD_SVCTX sctmp; | ||
99 | sctmp.mctx = &tmp_ctx; | ||
100 | sctmp.key = pkey->pkey.ptr; | ||
101 | i = ctx->digest->verify(ctx->digest->type, | ||
102 | NULL, -1, sigbuf, siglen, &sctmp); | ||
103 | } | ||
104 | else | ||
105 | { | ||
106 | EVP_DigestFinal_ex(&tmp_ctx,&(m[0]),&m_len); | ||
107 | i = ctx->digest->verify(ctx->digest->type,m,m_len, | ||
108 | sigbuf,siglen,pkey->pkey.ptr); | ||
109 | } | ||
110 | EVP_MD_CTX_cleanup(&tmp_ctx); | ||
111 | return i; | ||
118 | } | 112 | } |
119 | 113 | ||