Commit 992368ec46 for openssl.org
commit 992368ec46285cbe625ff7273ce7721ae241e43e
Author: Matt Caswell <matt@openssl.org>
Date: Wed Dec 10 10:56:49 2025 +0000
Remove support for custom MD methods
Custom MD methods are considered legacy and have been deprecated
since 3.0. With the removal of ENGINEs they become a lot less useful
and add significant complexity to the code. We should therefore remove
them in 4.0.
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/29366)
diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c
index 61c9b49c50..7cd1fb2b24 100644
--- a/crypto/evp/digest.c
+++ b/crypto/evp/digest.c
@@ -178,27 +178,8 @@ static int evp_md_init_internal(EVP_MD_CTX *ctx, const EVP_MD *type,
type = ctx->digest;
}
- /*
- * If there is EVP_MD_CTX_FLAG_NO_INIT set then we
- * should use legacy handling for now.
- */
- if ((ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) != 0
- || (type != NULL && type->origin == EVP_ORIG_METH)
- || (type == NULL && ctx->digest != NULL
- && ctx->digest->origin == EVP_ORIG_METH)) {
- /* If we were using provided hash before, cleanup algctx */
- if (!evp_md_ctx_free_algctx(ctx))
- return 0;
- if (ctx->digest == ctx->fetched_digest)
- ctx->digest = NULL;
- EVP_MD_free(ctx->fetched_digest);
- ctx->fetched_digest = NULL;
- goto legacy;
- }
-
cleanup_old_md_data(ctx, 1);
- /* Start of non-legacy code below */
if (ossl_likely(ctx->digest == type)) {
if (ossl_unlikely(!ossl_assert(type->prov != NULL))) {
ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
@@ -254,35 +235,6 @@ static int evp_md_init_internal(EVP_MD_CTX *ctx, const EVP_MD *type,
}
return ctx->digest->dinit(ctx->algctx, params);
-
- /* Code below to be removed when legacy support is dropped. */
-legacy:
-
- if (ctx->digest != type) {
- cleanup_old_md_data(ctx, 1);
-
- ctx->digest = type;
- if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) {
- ctx->update = type->update;
- ctx->md_data = OPENSSL_zalloc(type->ctx_size);
- if (ctx->md_data == NULL)
- return 0;
- }
- }
-#ifndef FIPS_MODULE
- if (ctx->pctx != NULL
- && (!EVP_PKEY_CTX_IS_SIGNATURE_OP(ctx->pctx)
- || ctx->pctx->op.sig.signature == NULL)) {
- int r;
- r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
- EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);
- if (r <= 0 && (r != -2))
- return 0;
- }
-#endif
- if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
- return 1;
- return ctx->digest->init(ctx);
}
int EVP_DigestInit_ex2(EVP_MD_CTX *ctx, const EVP_MD *type,
@@ -335,20 +287,16 @@ int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
return 0;
}
- if (ctx->digest == NULL
- || ctx->digest->prov == NULL
- || ossl_unlikely((ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) != 0))
- goto legacy;
+ if (ctx->digest == NULL || ctx->digest->prov == NULL) {
+ ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR);
+ return 0;
+ }
if (ossl_unlikely(ctx->digest->dupdate == NULL)) {
ERR_raise(ERR_LIB_EVP, EVP_R_UPDATE_ERROR);
return 0;
}
return ctx->digest->dupdate(ctx->algctx, data, count);
-
- /* Code below to be removed when legacy support is dropped. */
-legacy:
- return ctx->update != NULL ? ctx->update(ctx, data, count) : 0;
}
/* The caller can assume that this removes any secret data from the context */
@@ -565,7 +513,6 @@ int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
{
int digest_change = 0;
- unsigned char *tmp_buf;
if (in == NULL) {
ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
@@ -581,11 +528,7 @@ int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
goto clone_pkey;
}
- if (in->digest->prov == NULL
- || (in->flags & EVP_MD_CTX_FLAG_NO_INIT) != 0)
- goto legacy;
-
- if (in->digest->dupctx == NULL) {
+ if (in->digest->prov == NULL || in->digest->dupctx == NULL) {
ERR_raise(ERR_LIB_EVP, EVP_R_NOT_ABLE_TO_COPY_CTX);
return 0;
}
@@ -638,55 +581,6 @@ clone_pkey:
#endif
return 1;
-
- /* Code below to be removed when legacy support is dropped. */
-legacy:
-
- if (out->digest == in->digest) {
- tmp_buf = out->md_data;
- EVP_MD_CTX_set_flags(out, EVP_MD_CTX_FLAG_REUSE);
- } else
- tmp_buf = NULL;
- EVP_MD_CTX_reset(out);
- memcpy(out, in, sizeof(*out));
-
- /* copied EVP_MD_CTX should free the copied EVP_PKEY_CTX */
- EVP_MD_CTX_clear_flags(out, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
-
- /* Null these variables, since they are getting fixed up
- * properly below. Anything else may cause a memleak and/or
- * double free if any of the memory allocations below fail
- */
- out->md_data = NULL;
- out->pctx = NULL;
-
- if (in->md_data && out->digest->ctx_size) {
- if (tmp_buf)
- out->md_data = tmp_buf;
- else {
- out->md_data = OPENSSL_malloc(out->digest->ctx_size);
- if (out->md_data == NULL)
- return 0;
- }
- memcpy(out->md_data, in->md_data, out->digest->ctx_size);
- }
-
- out->update = in->update;
-
-#ifndef FIPS_MODULE
- if (in->pctx) {
- out->pctx = EVP_PKEY_CTX_dup(in->pctx);
- if (!out->pctx) {
- EVP_MD_CTX_reset(out);
- return 0;
- }
- }
-#endif
-
- if (out->digest->copy)
- return out->digest->copy(out, in);
-
- return 1;
}
int EVP_Digest(const void *data, size_t count,
@@ -1162,7 +1056,11 @@ void EVP_MD_free(EVP_MD *md)
CRYPTO_DOWN_REF(&md->refcnt, &i);
if (i > 0)
return;
- evp_md_free_int(md);
+
+ OPENSSL_free(md->type_name);
+ ossl_provider_free(md->prov);
+ CRYPTO_FREE_REF(&md->refcnt);
+ OPENSSL_free(md);
}
void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx,
diff --git a/crypto/evp/evp_lib.c b/crypto/evp/evp_lib.c
index f6c3c92b7f..9eae1d421c 100644
--- a/crypto/evp/evp_lib.c
+++ b/crypto/evp/evp_lib.c
@@ -826,182 +826,6 @@ unsigned long EVP_MD_get_flags(const EVP_MD *md)
return md->flags;
}
-EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type)
-{
- EVP_MD *md = evp_md_new();
-
- if (md != NULL) {
- md->type = md_type;
- md->pkey_type = pkey_type;
- md->origin = EVP_ORIG_METH;
- }
- return md;
-}
-
-EVP_MD *EVP_MD_meth_dup(const EVP_MD *md)
-{
- EVP_MD *to = NULL;
-
- /*
- * Non-legacy EVP_MDs can't be duplicated like this.
- * Use EVP_MD_up_ref() instead.
- */
- if (md->prov != NULL)
- return NULL;
-
- if ((to = EVP_MD_meth_new(md->type, md->pkey_type)) != NULL) {
- CRYPTO_REF_COUNT refcnt = to->refcnt;
-
- memcpy(to, md, sizeof(*to));
- to->refcnt = refcnt;
- to->origin = EVP_ORIG_METH;
- }
- return to;
-}
-
-void evp_md_free_int(EVP_MD *md)
-{
- OPENSSL_free(md->type_name);
- ossl_provider_free(md->prov);
- CRYPTO_FREE_REF(&md->refcnt);
- OPENSSL_free(md);
-}
-
-void EVP_MD_meth_free(EVP_MD *md)
-{
- if (md == NULL || md->origin != EVP_ORIG_METH)
- return;
-
- evp_md_free_int(md);
-}
-
-int EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize)
-{
- if (md->block_size != 0)
- return 0;
-
- md->block_size = blocksize;
- return 1;
-}
-int EVP_MD_meth_set_result_size(EVP_MD *md, int resultsize)
-{
- if (md->md_size != 0)
- return 0;
-
- md->md_size = resultsize;
- return 1;
-}
-int EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize)
-{
- if (md->ctx_size != 0)
- return 0;
-
- md->ctx_size = datasize;
- return 1;
-}
-int EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags)
-{
- if (md->flags != 0)
- return 0;
-
- md->flags = flags;
- return 1;
-}
-int EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx))
-{
- if (md->init != NULL)
- return 0;
-
- md->init = init;
- return 1;
-}
-int EVP_MD_meth_set_update(EVP_MD *md, int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count))
-{
- if (md->update != NULL)
- return 0;
-
- md->update = update;
- return 1;
-}
-int EVP_MD_meth_set_final(EVP_MD *md, int (*final)(EVP_MD_CTX *ctx, unsigned char *md))
-{
- if (md->final != NULL)
- return 0;
-
- md->final = final;
- return 1;
-}
-int EVP_MD_meth_set_copy(EVP_MD *md, int (*copy)(EVP_MD_CTX *to, const EVP_MD_CTX *from))
-{
- if (md->copy != NULL)
- return 0;
-
- md->copy = copy;
- return 1;
-}
-int EVP_MD_meth_set_cleanup(EVP_MD *md, int (*cleanup)(EVP_MD_CTX *ctx))
-{
- if (md->cleanup != NULL)
- return 0;
-
- md->cleanup = cleanup;
- return 1;
-}
-int EVP_MD_meth_set_ctrl(EVP_MD *md, int (*ctrl)(EVP_MD_CTX *ctx, int cmd, int p1, void *p2))
-{
- if (md->md_ctrl != NULL)
- return 0;
-
- md->md_ctrl = ctrl;
- return 1;
-}
-
-int EVP_MD_meth_get_input_blocksize(const EVP_MD *md)
-{
- return md->block_size;
-}
-int EVP_MD_meth_get_result_size(const EVP_MD *md)
-{
- return md->md_size;
-}
-int EVP_MD_meth_get_app_datasize(const EVP_MD *md)
-{
- return md->ctx_size;
-}
-unsigned long EVP_MD_meth_get_flags(const EVP_MD *md)
-{
- return md->flags;
-}
-int (*EVP_MD_meth_get_init(const EVP_MD *md))(EVP_MD_CTX *ctx)
-{
- return md->init;
-}
-int (*EVP_MD_meth_get_update(const EVP_MD *md))(EVP_MD_CTX *ctx,
- const void *data,
- size_t count)
-{
- return md->update;
-}
-int (*EVP_MD_meth_get_final(const EVP_MD *md))(EVP_MD_CTX *ctx,
- unsigned char *md)
-{
- return md->final;
-}
-int (*EVP_MD_meth_get_copy(const EVP_MD *md))(EVP_MD_CTX *to,
- const EVP_MD_CTX *from)
-{
- return md->copy;
-}
-int (*EVP_MD_meth_get_cleanup(const EVP_MD *md))(EVP_MD_CTX *ctx)
-{
- return md->cleanup;
-}
-int (*EVP_MD_meth_get_ctrl(const EVP_MD *md))(EVP_MD_CTX *ctx, int cmd,
- int p1, void *p2)
-{
- return md->md_ctrl;
-}
-
#ifndef OPENSSL_NO_DEPRECATED_3_0
const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
{
diff --git a/crypto/evp/evp_local.h b/crypto/evp/evp_local.h
index b3f9bafe23..1eb9e46a8f 100644
--- a/crypto/evp/evp_local.h
+++ b/crypto/evp/evp_local.h
@@ -401,7 +401,6 @@ OSSL_PARAM *evp_pkey_to_param(EVP_PKEY *pkey, size_t *sz);
void evp_pkey_ctx_free_old_ops(EVP_PKEY_CTX *ctx);
void evp_cipher_free_int(EVP_CIPHER *md);
-void evp_md_free_int(EVP_MD *md);
/* OSSL_PROVIDER * is only used to get the library context */
int evp_is_a(OSSL_PROVIDER *prov, int number,
diff --git a/include/crypto/evp.h b/include/crypto/evp.h
index 30de8b272f..7d1c28b675 100644
--- a/include/crypto/evp.h
+++ b/include/crypto/evp.h
@@ -251,7 +251,6 @@ struct evp_kdf_st {
#define EVP_ORIG_DYNAMIC 0
#define EVP_ORIG_GLOBAL 1
-#define EVP_ORIG_METH 2
struct evp_md_st {
/* nid */
diff --git a/include/openssl/evp.h b/include/openssl/evp.h
index e96dae3355..0114e1bafe 100644
--- a/include/openssl/evp.h
+++ b/include/openssl/evp.h
@@ -127,51 +127,6 @@ int EVP_default_properties_enable_fips(OSSL_LIB_CTX *libctx, int enable);
#define EVP_PKEY_MO_DECRYPT 0x0008
#ifndef EVP_MD
-#ifndef OPENSSL_NO_DEPRECATED_3_0
-OSSL_DEPRECATEDIN_3_0 EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type);
-OSSL_DEPRECATEDIN_3_0 EVP_MD *EVP_MD_meth_dup(const EVP_MD *md);
-OSSL_DEPRECATEDIN_3_0 void EVP_MD_meth_free(EVP_MD *md);
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_input_blocksize(EVP_MD *md, int blocksize);
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_result_size(EVP_MD *md, int resultsize);
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_app_datasize(EVP_MD *md, int datasize);
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_flags(EVP_MD *md, unsigned long flags);
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_init(EVP_MD *md, int (*init)(EVP_MD_CTX *ctx));
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_update(EVP_MD *md, int (*update)(EVP_MD_CTX *ctx, const void *data, size_t count));
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_final(EVP_MD *md, int (*final)(EVP_MD_CTX *ctx, unsigned char *md));
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_copy(EVP_MD *md, int (*copy)(EVP_MD_CTX *to, const EVP_MD_CTX *from));
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_cleanup(EVP_MD *md, int (*cleanup)(EVP_MD_CTX *ctx));
-OSSL_DEPRECATEDIN_3_0
-int EVP_MD_meth_set_ctrl(EVP_MD *md, int (*ctrl)(EVP_MD_CTX *ctx, int cmd, int p1, void *p2));
-OSSL_DEPRECATEDIN_3_0 int EVP_MD_meth_get_input_blocksize(const EVP_MD *md);
-OSSL_DEPRECATEDIN_3_0 int EVP_MD_meth_get_result_size(const EVP_MD *md);
-OSSL_DEPRECATEDIN_3_0 int EVP_MD_meth_get_app_datasize(const EVP_MD *md);
-OSSL_DEPRECATEDIN_3_0 unsigned long EVP_MD_meth_get_flags(const EVP_MD *md);
-OSSL_DEPRECATEDIN_3_0
-int (*EVP_MD_meth_get_init(const EVP_MD *md))(EVP_MD_CTX *ctx);
-OSSL_DEPRECATEDIN_3_0
-int (*EVP_MD_meth_get_update(const EVP_MD *md))(EVP_MD_CTX *ctx,
- const void *data, size_t count);
-OSSL_DEPRECATEDIN_3_0
-int (*EVP_MD_meth_get_final(const EVP_MD *md))(EVP_MD_CTX *ctx,
- unsigned char *md);
-OSSL_DEPRECATEDIN_3_0
-int (*EVP_MD_meth_get_copy(const EVP_MD *md))(EVP_MD_CTX *to,
- const EVP_MD_CTX *from);
-OSSL_DEPRECATEDIN_3_0
-int (*EVP_MD_meth_get_cleanup(const EVP_MD *md))(EVP_MD_CTX *ctx);
-OSSL_DEPRECATEDIN_3_0
-int (*EVP_MD_meth_get_ctrl(const EVP_MD *md))(EVP_MD_CTX *ctx, int cmd,
- int p1, void *p2);
-#endif
/* digest can only handle a single block */
#define EVP_MD_FLAG_ONESHOT 0x0001
diff --git a/test/evp_extra_test.c b/test/evp_extra_test.c
index 176587bcd2..870bc80cb7 100644
--- a/test/evp_extra_test.c
+++ b/test/evp_extra_test.c
@@ -5989,123 +5989,6 @@ err:
custom_pmeth = NULL;
return testresult;
}
-
-static int test_evp_md_meth(void)
-{
- EVP_MD *md = EVP_MD_meth_dup(EVP_sha256());
- int testresult = 0;
-
- if (!TEST_ptr(md))
- goto err;
-
- testresult = 1;
-
-err:
- EVP_MD_meth_free(md);
-
- return testresult;
-}
-
-typedef struct {
- int data;
-} custom_dgst_ctx;
-
-static int custom_md_init_called = 0;
-static int custom_md_cleanup_called = 0;
-
-static int custom_md_init(EVP_MD_CTX *ctx)
-{
- custom_dgst_ctx *p = EVP_MD_CTX_md_data(ctx);
-
- if (p == NULL)
- return 0;
-
- custom_md_init_called++;
- return 1;
-}
-
-static int custom_md_cleanup(EVP_MD_CTX *ctx)
-{
- custom_dgst_ctx *p = EVP_MD_CTX_md_data(ctx);
-
- if (p == NULL)
- /* Nothing to do */
- return 1;
-
- custom_md_cleanup_called++;
- return 1;
-}
-
-static int test_custom_md_meth(void)
-{
- ASN1_OBJECT *o = NULL;
- EVP_MD_CTX *mdctx = NULL;
- EVP_MD *tmp = NULL;
- char mess[] = "Test Message\n";
- unsigned char md_value[EVP_MAX_MD_SIZE];
- unsigned int md_len;
- int testresult = 0;
- int nid;
-
- /*
- * We are testing deprecated functions. We don't support a non-default
- * library context in this test.
- */
- if (testctx != NULL)
- return TEST_skip("Non-default libctx");
-
- custom_md_init_called = custom_md_cleanup_called = 0;
-
- nid = OBJ_create("1.3.6.1.4.1.16604.998866.1", "custom-md", "custom-md");
- if (!TEST_int_ne(nid, NID_undef))
- goto err;
- if (!TEST_int_eq(OBJ_txt2nid("1.3.6.1.4.1.16604.998866.1"), nid))
- goto err;
- tmp = EVP_MD_meth_new(nid, NID_undef);
- if (!TEST_ptr(tmp))
- goto err;
-
- if (!TEST_true(EVP_MD_meth_set_init(tmp, custom_md_init))
- || !TEST_true(EVP_MD_meth_set_cleanup(tmp, custom_md_cleanup))
- || !TEST_true(EVP_MD_meth_set_app_datasize(tmp,
- sizeof(custom_dgst_ctx))))
- goto err;
-
- mdctx = EVP_MD_CTX_new();
- if (!TEST_ptr(mdctx)
- /*
- * Initing our custom md and then initing another md should
- * result in the init and cleanup functions of the custom md
- * being called.
- */
- || !TEST_true(EVP_DigestInit_ex(mdctx, tmp, NULL))
- || !TEST_true(EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
- || !TEST_true(EVP_DigestUpdate(mdctx, mess, strlen(mess)))
- || !TEST_true(EVP_DigestFinal_ex(mdctx, md_value, &md_len))
- || !TEST_int_eq(custom_md_init_called, 1)
- || !TEST_int_eq(custom_md_cleanup_called, 1))
- goto err;
-
- if (!TEST_int_eq(OBJ_create("1.3.6.1.4.1.16604.998866.1",
- "custom-md", "custom-md"),
- NID_undef)
- || !TEST_int_eq(ERR_GET_LIB(ERR_peek_error()), ERR_LIB_OBJ)
- || !TEST_int_eq(ERR_GET_REASON(ERR_get_error()), OBJ_R_OID_EXISTS))
- goto err;
-
- o = ASN1_OBJECT_create(nid, (unsigned char *)"\53\6\1\4\1\201\201\134\274\373\122\1", 12,
- "custom-md", "custom-md");
- if (!TEST_int_eq(OBJ_add_object(o), nid))
- goto err;
-
- testresult = 1;
-err:
- ASN1_OBJECT_free(o);
- EVP_MD_CTX_free(mdctx);
- EVP_MD_meth_free(tmp);
- return testresult;
-}
-
#endif /* OPENSSL_NO_DEPRECATED_3_0 */
#ifndef OPENSSL_NO_ECX
@@ -6928,8 +6811,6 @@ int setup_tests(void)
#ifndef OPENSSL_NO_DEPRECATED_3_0
ADD_ALL_TESTS(test_custom_pmeth, 12);
- ADD_TEST(test_evp_md_meth);
- ADD_TEST(test_custom_md_meth);
#endif
#ifndef OPENSSL_NO_ECX
diff --git a/util/libcrypto.num b/util/libcrypto.num
index 2494abdc36..4cc9795ed0 100644
--- a/util/libcrypto.num
+++ b/util/libcrypto.num
@@ -827,29 +827,6 @@ EVP_set_default_properties ? 4_0_0 EXIST::FUNCTION:
EVP_get1_default_properties ? 4_0_0 EXIST::FUNCTION:
EVP_default_properties_is_fips_enabled ? 4_0_0 EXIST::FUNCTION:
EVP_default_properties_enable_fips ? 4_0_0 EXIST::FUNCTION:
-EVP_MD_meth_new ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_dup ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_free ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_input_blocksize ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_result_size ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_app_datasize ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_flags ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_init ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_update ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_final ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_copy ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_cleanup ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_set_ctrl ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_input_blocksize ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_result_size ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_app_datasize ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_flags ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_init ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_update ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_final ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_copy ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_cleanup ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
-EVP_MD_meth_get_ctrl ? 4_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0
EVP_MD_get_type ? 4_0_0 EXIST::FUNCTION:
EVP_MD_get0_name ? 4_0_0 EXIST::FUNCTION:
EVP_MD_get0_description ? 4_0_0 EXIST::FUNCTION: