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, 25 insertions, 19 deletions
diff --git a/src/lib/libcrypto/evp/p_verify.c b/src/lib/libcrypto/evp/p_verify.c index 2d46dffe7e..8db46412f3 100644 --- a/src/lib/libcrypto/evp/p_verify.c +++ b/src/lib/libcrypto/evp/p_verify.c | |||
@@ -70,6 +70,28 @@ 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 | |||
73 | for (i=0; i<4; i++) | 95 | for (i=0; i<4; i++) |
74 | { | 96 | { |
75 | v=ctx->digest->required_pkey_type[i]; | 97 | v=ctx->digest->required_pkey_type[i]; |
@@ -85,29 +107,13 @@ int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, | |||
85 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); | 107 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_WRONG_PUBLIC_KEY_TYPE); |
86 | return(-1); | 108 | return(-1); |
87 | } | 109 | } |
88 | if (ctx->digest->verify == NULL) | 110 | if (ctx->digest->verify == NULL) |
89 | { | 111 | { |
90 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_NO_VERIFY_FUNCTION_CONFIGURED); | 112 | EVPerr(EVP_F_EVP_VERIFYFINAL,EVP_R_NO_VERIFY_FUNCTION_CONFIGURED); |
91 | return(0); | 113 | return(0); |
92 | } | 114 | } |
93 | 115 | ||
94 | EVP_MD_CTX_init(&tmp_ctx); | 116 | return(ctx->digest->verify(ctx->digest->type,m,m_len, |
95 | EVP_MD_CTX_copy_ex(&tmp_ctx,ctx); | 117 | sigbuf,siglen,pkey->pkey.ptr)); |
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; | ||
112 | } | 118 | } |
113 | 119 | ||