diff options
author | joshua <> | 2024-03-25 06:20:16 +0000 |
---|---|---|
committer | joshua <> | 2024-03-25 06:20:16 +0000 |
commit | 656bda5a1cf11b36c07317e2a50c9b772aa6ebf1 (patch) | |
tree | 806fe47b898e0768679fbd66e0fb1dc885079774 | |
parent | 0fccccc84cb35d749b5b97460fb382d25cf524ab (diff) | |
download | openbsd-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.c | 41 |
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 | ||
144 | static int | ||
145 | evp_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 | |||
144 | int | 170 | int |
145 | EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen) | 171 | EVP_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) |