if (count == 0)
return 1;
+ if (ctx->pctx != NULL
+ && EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx->pctx)
+ && ctx->pctx->op.sig.sigprovctx != NULL) {
+ /*
+ * Prior to OpenSSL 3.0 EVP_DigestSignUpdate() and
+ * EVP_DigestVerifyUpdate() were just macros for EVP_DigestUpdate().
+ * Some code calls EVP_DigestUpdate() directly even when initialised
+ * with EVP_DigestSignInit_ex() or EVP_DigestVerifyInit_ex(), so we
+ * detect that and redirect to the correct EVP_Digest*Update() function
+ */
+ if (ctx->pctx->operation == EVP_PKEY_OP_SIGNCTX)
+ return EVP_DigestSignUpdate(ctx, data, count);
+ if (ctx->pctx->operation == EVP_PKEY_OP_VERIFYCTX)
+ return EVP_DigestVerifyUpdate(ctx, data, count);
+ EVPerr(EVP_F_EVP_DIGESTUPDATE, EVP_R_UPDATE_ERROR);
+ return 0;
+ }
+
if (ctx->digest == NULL || ctx->digest->prov == NULL)
goto legacy;
params[0] = OSSL_PARAM_construct_utf8_string(OSSL_DIGEST_PARAM_MICALG,
p2, p1 ? p1 : 9999);
break;
+ case EVP_CTRL_SSL3_MASTER_SECRET:
+ params[0] = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
+ p2, p1);
+ break;
default:
- return EVP_CTRL_RET_UNSUPPORTED;
+ goto conclude;
}
if (set_params)
static void *evp_md_from_dispatch(int name_id,
const OSSL_DISPATCH *fns,
- OSSL_PROVIDER *prov, void *unused)
+ OSSL_PROVIDER *prov)
{
EVP_MD *md = NULL;
int fncnt = 0;
#ifndef FIPS_MODE
/* TODO(3.x) get rid of the need for legacy NIDs */
md->type = NID_undef;
- evp_doall_names(prov, name_id, set_legacy_nid, &md->type);
+ evp_names_do_all(prov, name_id, set_legacy_nid, &md->type);
if (md->type == -1) {
ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
EVP_MD_free(md);
{
EVP_MD *md =
evp_generic_fetch(ctx, OSSL_OP_DIGEST, algorithm, properties,
- evp_md_from_dispatch, NULL, evp_md_up_ref,
- evp_md_free);
+ evp_md_from_dispatch, evp_md_up_ref, evp_md_free);
return md;
}
OPENSSL_free(md);
}
-void EVP_MD_do_all_ex(OPENSSL_CTX *libctx,
- void (*fn)(EVP_MD *mac, void *arg),
- void *arg)
+void EVP_MD_do_all_provided(OPENSSL_CTX *libctx,
+ void (*fn)(EVP_MD *mac, void *arg),
+ void *arg)
{
evp_generic_do_all(libctx, OSSL_OP_DIGEST,
(void (*)(void *, void *))fn, arg,
- evp_md_from_dispatch, NULL, evp_md_free);
+ evp_md_from_dispatch, evp_md_free);
}