summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoshua <>2024-03-25 06:20:16 +0000
committerjoshua <>2024-03-25 06:20:16 +0000
commit656bda5a1cf11b36c07317e2a50c9b772aa6ebf1 (patch)
tree806fe47b898e0768679fbd66e0fb1dc885079774
parent0fccccc84cb35d749b5b97460fb382d25cf524ab (diff)
downloadopenbsd-656bda5a1cf11b36c07317e2a50c9b772aa6ebf1.tar.gz
openbsd-656bda5a1cf11b36c07317e2a50c9b772aa6ebf1.tar.bz2
openbsd-656bda5a1cf11b36c07317e2a50c9b772aa6ebf1.zip
Move custom sigctx handling out of EVP_DigestSignFinal
ok tb@
-rw-r--r--src/lib/libcrypto/evp/m_sigver.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/lib/libcrypto/evp/m_sigver.c b/src/lib/libcrypto/evp/m_sigver.c
index a72671ed92..98afd02509 100644
--- a/src/lib/libcrypto/evp/m_sigver.c
+++ b/src/lib/libcrypto/evp/m_sigver.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: m_sigver.c,v 1.15 2024/02/18 15:45:42 tb Exp $ */ 1/* $OpenBSD: m_sigver.c,v 1.16 2024/03/25 06:20:16 joshua Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006. 3 * project 2006.
4 */ 4 */
@@ -141,6 +141,32 @@ EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type,
141 return do_sigver_init(ctx, pctx, type, pkey, 1); 141 return do_sigver_init(ctx, pctx, type, pkey, 1);
142} 142}
143 143
144static int
145evp_digestsignfinal_sigctx_custom(EVP_MD_CTX *ctx, unsigned char *sigret,
146 size_t *siglen)
147{
148 EVP_PKEY_CTX *pctx = ctx->pctx;
149 EVP_PKEY_CTX *dctx = NULL;
150 int ret = 0;
151
152 if (sigret == NULL)
153 return pctx->pmeth->signctx(pctx, sigret, siglen, ctx);
154
155 /* XXX - support EVP_MD_CTX_FLAG_FINALISE? */
156 if ((dctx = EVP_PKEY_CTX_dup(pctx)) == NULL)
157 goto err;
158
159 if (!dctx->pmeth->signctx(dctx, sigret, siglen, ctx))
160 goto err;
161
162 ret = 1;
163
164 err:
165 EVP_PKEY_CTX_free(dctx);
166
167 return ret;
168}
169
144int 170int
145EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen) 171EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen)
146{ 172{
@@ -149,18 +175,7 @@ EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen)
149 int r = 0; 175 int r = 0;
150 176
151 if (pctx->pmeth->flags & EVP_PKEY_FLAG_SIGCTX_CUSTOM) { 177 if (pctx->pmeth->flags & EVP_PKEY_FLAG_SIGCTX_CUSTOM) {
152 EVP_PKEY_CTX *dctx; 178 return evp_digestsignfinal_sigctx_custom(ctx, sigret, siglen);
153
154 if (sigret == NULL)
155 return pctx->pmeth->signctx(pctx, sigret, siglen, ctx);
156
157 /* XXX - support EVP_MD_CTX_FLAG_FINALISE? */
158 if ((dctx = EVP_PKEY_CTX_dup(ctx->pctx)) == NULL)
159 return 0;
160 r = dctx->pmeth->signctx(dctx, sigret, siglen, ctx);
161 EVP_PKEY_CTX_free(dctx);
162
163 return r;
164 } 179 }
165 180
166 if (ctx->pctx->pmeth->signctx) 181 if (ctx->pctx->pmeth->signctx)