OpenSSL

密码学和 SSL/TLS 工具包

EVP_MD_fetch

NAME

EVP_MD_fetch、EVP_MD_up_ref、EVP_MD_free、EVP_MD_get_params、EVP_MD_gettable_params、EVP_MD_CTX_new、EVP_MD_CTX_reset、EVP_MD_CTX_free、EVP_MD_CTX_copy、EVP_MD_CTX_copy_ex、EVP_MD_CTX_ctrl、EVP_MD_CTX_set_params、EV P_MD_CTX_get_params、EVP_MD_settable_ctx_params、EVP_MD_gettable_ctx_params、EVP_MD_CTX_settable_params、EVP_MD_CTX_gettable_params、EVP_MD_CTX_set_flags、EVP_MD_CTX_clear_flags、EVP_MD_CTX_test_flags、EVP_Q_digest、EVP_Digest、EVP _DigestInit_ex2,EVP_DigestInit_ex,EVP_DigestInit, EVP_DigestUpdate、EVP_DigestFinal_ex、EVP_DigestFinalXOF、EVP_DigestFinal、EVP_MD_is_a、EVP_MD_get0_name、EVP_MD_get0_description、EVP_MD_names_do_all、EVP_MD_get0_provider、EVP_MD_get_type、EVP_MD_get_pkey_type、EVP_MD_get_size、EVP_ MD_get_block_size、EVP_MD_get_flags、EVP_MD_CTX_get0_name、EVP_MD_CTX_md、EVP_MD_CTX_get0_md、EVP_MD_CTX_get1_md、EVP_MD_CTX_get_type、EVP_MD_CTX_get_size、EVP_MD_CTX_get_block_size、EVP_MD_CTX_get0_md_data 、EVP_MD_CTX_update_fn、EVP_MD_CTX_set_update_fn、EVP_md_null、 EVP_get_digestbyname、EVP_get_digestbynid、EVP_get_digestbyobj、EVP_MD_CTX_get_pkey_ctx、EVP_MD_CTX_set_pkey_ctx、EVP_MD_do_all_provided、EVP_MD_type、EVP_MD_nid、EVP_MD_name、EVP_MD_pkey_type、EVP_MD_size、EVP_MD_block_ size、EVP_MD_flags、EVP_MD_CTX_size、EVP_MD_CTX_block_size、EVP_MD_CTX_type、EVP_MD_CTX_pkey_ctx、EVP_MD_CTX_md_data - EVP 摘要例程

SYNOPSIS

 #include <openssl/evp.h>

EVP_MD *EVP_MD_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
                     const char *properties);
int EVP_MD_up_ref(EVP_MD *md);
void EVP_MD_free(EVP_MD *md);
int EVP_MD_get_params(const EVP_MD *digest, OSSL_PARAM params[]);
const OSSL_PARAM *EVP_MD_gettable_params(const EVP_MD *digest);
EVP_MD_CTX *EVP_MD_CTX_new(void);
int EVP_MD_CTX_reset(EVP_MD_CTX *ctx);
void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
void EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void* p2);
int EVP_MD_CTX_get_params(EVP_MD_CTX *ctx, OSSL_PARAM params[]);
int EVP_MD_CTX_set_params(EVP_MD_CTX *ctx, const OSSL_PARAM params[]);
const OSSL_PARAM *EVP_MD_settable_ctx_params(const EVP_MD *md);
const OSSL_PARAM *EVP_MD_gettable_ctx_params(const EVP_MD *md);
const OSSL_PARAM *EVP_MD_CTX_settable_params(EVP_MD_CTX *ctx);
const OSSL_PARAM *EVP_MD_CTX_gettable_params(EVP_MD_CTX *ctx);
void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags);

int EVP_Q_digest(OSSL_LIB_CTX *libctx, const char *name, const char *propq,
                 const void *data, size_t datalen,
                 unsigned char *md, size_t *mdlen);
int EVP_Digest(const void *data, size_t count, unsigned char *md,
               unsigned int *size, const EVP_MD *type, ENGINE *impl);
int EVP_DigestInit_ex2(EVP_MD_CTX *ctx, const EVP_MD *type,
                       const OSSL_PARAM params[]);
int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);
int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t len);

int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in);

int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);

int EVP_MD_CTX_copy(EVP_MD_CTX *out, EVP_MD_CTX *in);

const char *EVP_MD_get0_name(const EVP_MD *md);
const char *EVP_MD_get0_description(const EVP_MD *md);
int EVP_MD_is_a(const EVP_MD *md, const char *name);
int EVP_MD_names_do_all(const EVP_MD *md,
                        void (*fn)(const char *name, void *data),
                        void *data);
const OSSL_PROVIDER *EVP_MD_get0_provider(const EVP_MD *md);
int EVP_MD_get_type(const EVP_MD *md);
int EVP_MD_get_pkey_type(const EVP_MD *md);
int EVP_MD_get_size(const EVP_MD *md);
int EVP_MD_get_block_size(const EVP_MD *md);
unsigned long EVP_MD_get_flags(const EVP_MD *md);

const EVP_MD *EVP_MD_CTX_get0_md(const EVP_MD_CTX *ctx);
EVP_MD *EVP_MD_CTX_get1_md(EVP_MD_CTX *ctx);
const char *EVP_MD_CTX_get0_name(const EVP_MD_CTX *ctx);
int EVP_MD_CTX_get_size(const EVP_MD_CTX *ctx);
int EVP_MD_CTX_get_block_size(const EVP_MD_CTX *ctx);
int EVP_MD_CTX_get_type(const EVP_MD_CTX *ctx);
void *EVP_MD_CTX_get0_md_data(const EVP_MD_CTX *ctx);

const EVP_MD *EVP_md_null(void);

const EVP_MD *EVP_get_digestbyname(const char *name);
const EVP_MD *EVP_get_digestbynid(int type);
const EVP_MD *EVP_get_digestbyobj(const ASN1_OBJECT *o);

EVP_PKEY_CTX *EVP_MD_CTX_get_pkey_ctx(const EVP_MD_CTX *ctx);
void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx);

void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx,
                            void (*fn)(EVP_MD *mac, void *arg),
                            void *arg);

#define EVP_MD_type EVP_MD_get_type
#define EVP_MD_nid EVP_MD_get_type
#define EVP_MD_name EVP_MD_get0_name
#define EVP_MD_pkey_type EVP_MD_get_pkey_type
#define EVP_MD_size EVP_MD_get_size
#define EVP_MD_block_size EVP_MD_get_block_size
#define EVP_MD_flags EVP_MD_get_flags
#define EVP_MD_CTX_size EVP_MD_CTX_get_size
#define EVP_MD_CTX_block_size EVP_MD_CTX_get_block_size
#define EVP_MD_CTX_type EVP_MD_CTX_get_type
#define EVP_MD_CTX_pkey_ctx EVP_MD_CTX_get_pkey_ctx
#define EVP_MD_CTX_md_data EVP_MD_CTX_get0_md_data

自 OpenSSL 3.0 起,以下函数已被弃用,并且可以通过使用合适的版本值定义OPENSSL_API_COMPAT 来完全隐藏,请参阅openssl_user_macros(7)

 const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx);

int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx,
                                             const void *data, size_t count);

void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx,
                              int (*update)(EVP_MD_CTX *ctx,
                                            const void *data, size_t count));

DESCRIPTION

EVP 摘要例程是消息摘要的高级接口,应该用来代替特定于摘要的函数。

EVP_MD类型是用于摘要方法实现结构。

EVP_MD_fetch()

在属性给定的标准内,从提供给定算法的任何提供者获取给定算法 的摘要实现。有关更多信息,请参阅crypto(7) 中的“算法获取”

返回的值最终必须使用 EVP_MD_free() 释放。

获取的EVP_MD结构进行引用计数。

EVP_MD_up_ref()

增加EVP_MD结构 的引用计数。

EVP_MD_free()

减少所获取的EVP_MD结构 的引用计数。如果引用计数降至 0,则该结构将被释放。

EVP_MD_CTX_new()

分配并返回摘要上下文。

EVP_MD_CTX_reset()

重置摘要上下文ctx。这可以用来重用已经存在的上下文。

EVP_MD_CTX_free()

清理摘要上下文ctx并释放分配给它的空间。

EVP_MD_CTX_ctrl()

这是一个遗留方法。EVP_MD_CTX_set_params() 和 EVP_MD_CTX_get_params() 是用于设置和获取提供程序使用的参数的机制。

对上下文ctx执行特定于摘要的控制操作。控制命令在cmd中指示,任何附加参数在p1p2中指示。EVP_MD_CTX_ctrl() 必须在 EVP_DigestInit_ex2() 之后调用。其他限制可能适用,具体取决于控制类型和摘要实现。

如果此函数恰好与获取的EVP_MD 一起使用,它将把 OpenSSL 已知的控件转换为具有OpenSSL 定义的键的OSSL_PARAM(3)参数,并根据每个控制命令的情况调用 EVP_MD_CTX_get_params() 或 EVP_MD_CTX_set_params() 。

请参阅下面的“控制”以获取更多信息,包括正在进行的翻译。

EVP_MD_get_params()

从 MD md检索请求的参数 列表。请参阅下面的“参数”了解更多信息。

EVP_MD_CTX_get_params()

从 MD 上下文ctx检索请求的参数 列表。请参阅下面的“参数”了解更多信息。

EVP_MD_CTX_set_params()

将参数 列表设置到 MD 上下文ctx中。请参阅下面的“参数”了解更多信息。

EVP_MD_gettable_params()

获取一个常量OSSL_PARAM(3)数组,该数组描述可与 EVP_MD_get_params() 一起使用的可检索参数。

EVP_MD_gettable_ctx_params(), EVP_MD_CTX_gettable_params()

获取一个常量OSSL_PARAM(3)数组,该数组描述可与 EVP_MD_CTX_get_params() 一起使用的可检索参数。EVP_MD_gettable_ctx_params() 返回可以从算法中检索的参数,而 EVP_MD_CTX_gettable_params() 返回可以在上下文的当前状态下检索的参数。

EVP_MD_settable_ctx_params(), EVP_MD_CTX_settable_params()

获取一个常量OSSL_PARAM(3)数组,该数组描述可与 EVP_MD_CTX_set_params() 一起使用的可设置参数。EVP_MD_settable_ctx_params() 返回可以通过算法设置的参数,而 EVP_MD_CTX_settable_params() 返回可以在上下文的当前状态下设置的参数。

EVP_MD_CTX_set_flags(), EVP_MD_CTX_clear_flags(), EVP_MD_CTX_test_flags()

设置、清除和测试ctx标志。有关详细信息, 请参阅下面的“标志” 。

EVP_Q_digest() is a quick one-shot digest function.

它使用摘要算法name对data处的datalen字节数据进行哈希处理,该摘要算法是使用可选的libctxpropq参数获取的。如果指针不为 NULL,则摘要值放置在md中,其长度写入mdlen中。最多将写入 EVP_MAX_MD_SIZE字节。

EVP_Digest()

Digest Init_ex、Update 和 Final_ex 函数的包装器。使用ENGINE impl中的摘要类型对data处的数据字节进行哈希计数。摘要值放入md中,如果指针不为 NULL,则将其长度写入size 。最多将写入EVP_MAX_MD_SIZE字节。如果impl为 NULL,则使用 摘要类型的默认实现。

EVP_DigestInit_ex2()

设置摘要上下文ctx以使用摘要类型类型通常由 EVP_sha1() 等函数提供,或使用 EVP_MD_fetch() 显式获取的值。

参数params在初始化后在上下文中设置。

如果ctx已通过另一个 EVP_DigestInit_ex() 调用初始化并且尚未通过 EVP_MD_CTX_reset() 重置,则 类型 参数可以为 NULL 。

EVP_DigestInit_ex()

设置摘要上下文ctx以使用摘要类型类型通常由 EVP_sha1() 等函数提供,或使用 EVP_MD_fetch() 显式获取的值。

如果impl为非 NULL,则如果有,则使用 其摘要类型的实现;如果没有,则使用默认实现。

如果ctx已通过另一个 EVP_DigestInit_ex() 调用初始化并且尚未通过 EVP_MD_CTX_reset() 重置,则 类型 参数可以为 NULL 。

EVP_DigestUpdate()

将d处的cnt字节数据 散列到摘要上下文ctx中。可以在同一个ctx上多次调用此函数以散列附加数据。

EVP_DigestFinal_ex()

从ctx 中检索摘要值并将其放入md中。如果s参数不为 NULL,则写入数据的字节数(即摘要的长度)将写入s处的整数,最多写入EVP_MAX_MD_SIZE字节。调用 EVP_DigestFinal_ex() 后,无法再调用 EVP_DigestUpdate(),但可以调用 EVP_DigestInit_ex2() 来初始化新的摘要操作。

EVP_DigestFinalXOF()

与可扩展输出函数、XOF(例如 SHAKE128 和 SHAKE256)的接口。它从ctx检索摘要值并将其放入len大小的md中。调用此函数后,无法再调用 EVP_DigestUpdate(),但可以调用 EVP_DigestInit_ex2() 来初始化新操作。

EVP_MD_CTX_copy_ex()

可用于将消息摘要状态从in复制到out。如果要对仅最后几个字节不同的大量数据进行散列,这非常有用。

EVP_DigestInit()

其行为方式与 EVP_DigestInit_ex2() 相同,但它不设置任何参数并调用 EVP_MD_CTX_reset(),因此不能与NULL类型一起使用。

EVP_DigestFinal()

与 EVP_DigestFinal_ex() 类似,只不过在计算摘要之后,摘要上下文ctx会使用 EVP_MD_CTX_reset() 自动清理。

EVP_MD_CTX_copy()

与 EVP_MD_CTX_copy_ex() 类似,但目的地输出不必初始化。

EVP_MD_is_a()

如果md是可通过name识别的算法的实现,则返回 1,否则返回 0。

如果md是旧摘要(它是 EVP_sha256() 等的返回值,而不是 EVP_MD_fetch() 的结果),则仅考虑使用默认库上下文注册的密码名称(请参阅 OSSL_LIB_CTX(3) )

EVP_MD_get0_name(), EVP_MD_CTX_get0_name()

返回给定消息摘要的名称。对于获取的具有多个名称的消息摘要,仅返回其中一个;建议使用 EVP_MD_names_do_all() 代替。

EVP_MD_names_do_all()

遍历md的所有名称,并使用每个名称和数据调用fn这仅对获取的EVP_MD有用。

EVP_MD_get0_description()

返回摘要的描述,用于显示和人类消费。该描述由摘要实现自行决定。

EVP_MD_get0_provider()

返回一个OSSL_PROVIDER指针,指向实现给定EVP_MD的提供者。

EVP_MD_get_size(), EVP_MD_CTX_get_size()

当传递EVP_MDEVP_MD_CTX结构时, 返回消息摘要的大小,即哈希的大小。

EVP_MD_get_block_size(), EVP_MD_CTX_get_block_size()

当传递EVP_MDEVP_MD_CTX结构 时,返回消息摘要的块大小。

EVP_MD_get_type(), EVP_MD_CTX_get_type()

当传递EVP_MD结构 时,返回表示给定消息摘要的对象标识符的 NID 。例如,EVP_MD_get_type(EVP_sha1())返回NID_sha1。该函数通常在设置 ASN1 OID 时使用。

EVP_MD_CTX_get0_md_data()

返回传递的EVP_MD_CTX 的摘要方法私有数据。该空间由 OpenSSL 分配,其大小最初是通过 EVP_MD_meth_set_app_datasize() 设置的。

EVP_MD_CTX_get0_md(), EVP_MD_CTX_get1_md()

EVP_MD_CTX_get0_md() 返回与传递的EVP_MD_CTX对应的EVP_MD结构。这将与首次初始化 EVP_MD_CTX 时最初传递给 EVP_DigestInit_ex2() (或其他类似函数)的EVP_MD对象相同。请注意,在使用显式获取的情况下(请参阅EVP_MD_fetch(3)),从此函数返回的值不会增加其引用计数,因此在释放 EVP_MD_CTX 后不应使用它。EVP_MD_CTX_get1_md() 是相同的,除了所有权传递给调用者并且来自传递的EVP_MD_CTX

EVP_MD_CTX_set_update_fn()

设置ctx 更新函数update 。这是 EVP_DigestUpdate() 调用的函数。如果未设置,则使用初始化时指定的 EVP_MD类型的更新函数。

EVP_MD_CTX_update_fn()

返回ctx 的更新函数。

EVP_MD_get_flags()

返回md标志。请注意,这些与EVP_MD_CTX不同。有关详细信息, 请参阅EVP_MD_meth_set_flags(3) 。

EVP_MD_get_pkey_type()

返回与此摘要关联的公钥签名算法的 NID。例如 EVP_sha1() 与 RSA 关联,因此这将返回NID_sha1WithRSAEncryption。由于摘要和签名算法不再链接,因此仅出于兼容性原因保留此功能。

EVP_md_null()

不执行任何操作的“空”消息摘要:即它返回的哈希长度为零。

EVP_get_digestbyname(), EVP_get_digestbynid(), EVP_get_digestbyobj()

当分别传递摘要名称、摘要NIDASN1_OBJECT结构 时, 返回EVP_MD结构。

EVP_get_digestbyname() 函数的存在是为了向后兼容版本 3 之前的 OpenSSL,并且与 EVP_MD_fetch() 函数不同,因为它不会尝试“获取”密码的实现。此外,它只知道 OpenSSL 内置的并且具有关联 NID 的摘要。类似地,EVP_get_digestbynid() 和 EVP_get_digestbyobj() 也返回没有关联实现的对象。

当使用这些函数返回的摘要对象时(例如在调用 EVP_DigestInit_ex() 中),将从加载的提供程序中隐式获取摘要的实现。如果没有合适的实现可用,则此获取可能会失败。使用 EVP_MD_fetch() 来显式从提供者获取算法和关联的实现。

有关获取的更多信息, 请参阅crypto(7) 中的“算法获取” 。

从这些函数返回的摘要对象不需要使用 EVP_MD_free() 释放。

EVP_MD_CTX_get_pkey_ctx()

返回分配给ctx 的EVP_PKEY_CTX。返回的指针不应被调用者释放。

EVP_MD_CTX_set_pkey_ctx()

将EVP_PKEY_CTX 分配给EVP_MD_CTX。这通常用于向EVP_DigestSignInit(3)EVP_DigestVerifyInit(3)提供定制的EVP_PKEY_CTX传递给该函数的 pctx应由调用者释放。还允许NULL pctx指针清除分配给ctx 的EVP_PKEY_CTX。在这种情况下,是否释放已清除的EVP_PKEY_CTX取决于EVP_PKEY_CTX是如何创建的。

EVP_MD_do_all_provided()

遍历给定库上下文libctx 中所有激活的提供程序实现的所有消息摘要,并且对于每个实现,使用实现方法和给定arg作为参数 调用给定函数fn 。

PARAMETERS

有关传递参数的信息,请参阅OSSL_PARAM(3)

EVP_MD_CTX_set_params() 可与以下 OSSL_PARAM 键一起使用:

“xoflen” (OSSL_DIGEST_PARAM_XOFLEN) <unsigned integer>

设置可扩展输出函数的摘要长度。它由 SHAKE 算法使用,不应超过使用size_t给出的值。

“pad-type” (OSSL_DIGEST_PARAM_PAD_TYPE) <unsigned integer>

设置填充类型。它由 MDC2 算法使用。

EVP_MD_CTX_get_params() 可与以下 OSSL_PARAM 键一起使用:

“micalg” (OSSL_PARAM_DIGEST_KEY_MICALG) <UTF8 string>.

获取摘要消息完整性检查算法字符串。这在创建 S/MIME 多部分/签名消息时使用,如 RFC 3851 中所指定。它可由外部引擎或提供商使用。

CONTROLS

EVP_MD_CTX_ctrl() 可用于发送以下标准控件:

EVP_MD_CTRL_MICALG

获取摘要消息完整性检查算法字符串。这在创建 S/MIME 多部分/签名消息时使用,如 RFC 3851 中所指定。字符串值写入p2

当与获取的EVP_MD一起使用时,EVP_MD_CTX_get_params() 会通过带有键“micalg”( OSSL_DIGEST_PARAM_MICALG ) 的OSSL_PARAM(3)项进行调用。

EVP_MD_CTRL_XOF_LEN

该控制将可扩展输出函数的摘要长度设置为p1。不需要直接发送此控件,最好使用 EVP_DigestFinalXOF()。目前由 SHAKE 使用。

当与获取的EVP_MD一起使用时,EVP_MD_CTX_get_params() 会通过带有键“xoflen”( OSSL_DIGEST_PARAM_XOFLEN ) 的OSSL_PARAM(3)项进行调用。

FLAGS

EVP_MD_CTX_set_flags()、EVP_MD_CTX_clear_flags() 和 EVP_MD_CTX_test_flags() 可用于操作和测试这些EVP_MD_CTX标志:

EVP_MD_CTX_FLAG_ONESHOT

如果可能,该标志指示摘要仅针对一次更新进行优化。

EVP_MD_CTX_FLAG_NO_INIT

该标志指示 EVP_DigestInit() 和类似的方法不要初始化特定于实现的数据。

EVP_MD_CTX_FLAG_FINALISE

某些函数(例如 EVP_DigestSign)仅最终确定内部上下文的副本,因此可以在最终确定调用后包含其他数据。如果不需要此功能,则效率很低,并且可以使用此标志禁用。

RETURN VALUES

EVP_MD_fetch()

如果成功,则返回指向EVP_MD 的 指针;如果失败,则返回 NULL。

EVP_MD_up_ref()

成功返回 1,失败返回 0。

EVP_Q_digest(), EVP_Digest(), EVP_DigestInit_ex2(), EVP_DigestInit_ex(), EVP_DigestInit(), EVP_DigestUpdate(), EVP_DigestFinal_ex(), EVP_DigestFinalXOF(), and EVP_DigestFinal()

成功返回 1,失败返回 0。

EVP_MD_CTX_ctrl()

如果成功则返回 1,如果失败则返回 0。

EVP_MD_CTX_set_params(), EVP_MD_CTX_get_params()

如果成功则返回 1,如果失败则返回 0。

EVP_MD_CTX_settable_params(), EVP_MD_CTX_gettable_params()

返回常量OSSL_PARAM(3) 数组,如果没有可获取的数组,则返回 NULL。

EVP_MD_CTX_copy_ex()

如果成功则返回 1,如果失败则返回 0。

EVP_MD_get_type(), EVP_MD_get_pkey_type()

返回相应对象标识符的 NID,如果不存在则返回 NID_undef。

EVP_MD_get_size(), EVP_MD_get_block_size(), EVP_MD_CTX_get_size(), EVP_MD_CTX_get_block_size()

返回摘要或块大小(以字节为单位),如果失败则返回 -1。

EVP_md_null()

返回指向“null”消息摘要的 EVP_MD结构的 指针。

EVP_get_digestbyname(), EVP_get_digestbynid(), EVP_get_digestbyobj()

如果发生错误, 则返回EVP_MD结构或 NULL。

EVP_MD_CTX_set_pkey_ctx()

该函数没有返回值。

EVP_MD_names_do_all()

如果为所有名称调用回调,则返回 1。返回值 0 表示未针对任何名称调用回调。

NOTES

消息摘要的EVP 接口几乎应始终优先于低级接口使用。这是因为代码对于所使用的摘要变得透明并且更加灵活。

新应用程序应使用 SHA-2(例如EVP_sha256(3))或 SHA-3 摘要算法(例如EVP_sha3_512(3))。其他摘要算法仍然常用。

对于大多数应用程序, EVP_DigestInit_ex() 的impl参数将设置为 NULL 以使用默认的摘要实现。

忽略 EVP_DigestInit_ex()、EVP_DigestInit_ex2() 或 EVP_DigestInit() 的失败返回可能会导致更新或最终确定EVP_MD_CTX(例如 EVP_DigestUpdate() 或 EVP_DigestFinal() 函数)的 后续调用出现未定义的行为。初始化失败时, EVP_MD_CTX上唯一有效的调用是尝试再次初始化上下文或释放上下文的调用。

函数 EVP_DigestInit()、EVP_DigestFinal() 和 EVP_MD_CTX_copy() 已过时,但保留以保持与现有代码的兼容性。新应用程序应使用 EVP_DigestInit_ex()、EVP_DigestFinal_ex() 和 EVP_MD_CTX_copy_ex(),因为它们可以有效地重用摘要上下文,而不是在每次调用时初始化和清理它,并允许指定摘要的非默认实现。

如果摘要上下文在使用后没有清理,就会发生内存泄漏。

EVP_MD_CTX_get0_name()、EVP_MD_CTX_get_size()、EVP_MD_CTX_get_block_size()、EVP_MD_CTX_get_type()、EVP_get_digestbynid() 和 EVP_get_digestbyobj() 定义为宏。

EVP_MD_CTX_ctrl() 向消息摘要发送命令以进行附加配置或控制。

EXAMPLES

此示例使用命令行上传递的摘要名称来摘要数据“Test Message”和“Hello World”。

 #include <stdio.h>
#include <string.h>
#include <openssl/evp.h>

int main(int argc, char *argv[])
{
    EVP_MD_CTX *mdctx;
    const EVP_MD *md;
    char mess1[] = "Test Message\n";
    char mess2[] = "Hello World\n";
    unsigned char md_value[EVP_MAX_MD_SIZE];
    unsigned int md_len, i;

    if (argv[1] == NULL) {
        printf("Usage: mdtest digestname\n");
        exit(1);
    }

    md = EVP_get_digestbyname(argv[1]);
    if (md == NULL) {
        printf("Unknown message digest %s\n", argv[1]);
        exit(1);
    }

    mdctx = EVP_MD_CTX_new();
    if (!EVP_DigestInit_ex2(mdctx, md, NULL)) {
        printf("Message digest initialization failed.\n");
        EVP_MD_CTX_free(mdctx);
        exit(1);
    }
    if (!EVP_DigestUpdate(mdctx, mess1, strlen(mess1))) {
        printf("Message digest update failed.\n");
        EVP_MD_CTX_free(mdctx);
        exit(1);
    }
    if (!EVP_DigestUpdate(mdctx, mess2, strlen(mess2))) {
        printf("Message digest update failed.\n");
        EVP_MD_CTX_free(mdctx);
        exit(1);
    }
    if (!EVP_DigestFinal_ex(mdctx, md_value, &md_len)) {
        printf("Message digest finalization failed.\n");
        EVP_MD_CTX_free(mdctx);
        exit(1);
    }
    EVP_MD_CTX_free(mdctx);

    printf("Digest is: ");
    for (i = 0; i < md_len; i++)
        printf("%02x", md_value[i]);
    printf("\n");

    exit(0);
}

SEE ALSO

EVP_MD_meth_new(3)openssl-dgst(1)evp(7)OSSL_PROVIDER(3)OSSL_PARAM(3)property(7)、crypto(7)provider - digest(7)life_cycle 中的“算法获取” -摘要(7)

下面提供了摘要算法的完整列表。

EVP_blake2b512(3)EVP_md2(3)EVP_md4(3)EVP_md5(3)EVP_mdc2 (3) 、EVP_ripemd160(3)EVP_sha1(3)EVP_sha224 (3) 、EVP_sha3_224(3)EVP_sm3(3)EVP_漩涡(3)

HISTORY

在 OpenSSL 1.1.0 中,EVP_MD_CTX_create() 和 EVP_MD_CTX_destroy() 函数分别重命名为 EVP_MD_CTX_new() 和 EVP_MD_CTX_free()。

摘要和签名算法之间的链接在 OpenSSL 1.0 及更高版本中已修复,因此现在 EVP_sha1() 可以与 RSA 和 DSA 一起使用。

OpenSSL 1.1.0 中删除了 EVP_dss1() 函数。

OpenSSL 1.1.1 中添加了 EVP_MD_CTX_set_pkey_ctx() 函数。

EVP_Q_digest()、EVP_DigestInit_ex2()、EVP_MD_fetch()、EVP_MD_free()、EVP_MD_up_ref()、EVP_MD_get_params()、EVP_MD_CTX_set_params()、EVP_MD_CTX_get_params()、EVP_MD_gettable_params()、EVP_MD_gettable_ctx_params( )、EVP_MD_settable_ctx_params()、EVP_MD_CTX_settable_params() 和 EVP_MD_CTX_gettable_params OpenSSL 3.0 中添加了 () 函数。

EVP_MD_type()、EVP_MD_nid()、EVP_MD_name()、EVP_MD_pkey_type()、EVP_MD_size()、EVP_MD_block_size()、EVP_MD_flags()、EVP_MD_CTX_size()、EVP_MD_CTX_block_size()、EVP_MD_CTX_type() 和 EVP_MD_CTX_md_data () 函数被重命名为包括getget0分别以 OpenSSL 3.0 中的名称命名。旧名称保留为未弃用的别名宏。

EVP_MD_CTX_md() 函数在 OpenSSL 3.0 中已弃用;请改用 EVP_MD_CTX_get0_md()。OpenSSL 3.0 中已弃用 EVP_MD_CTX_update_fn() 和 EVP_MD_CTX_set_update_fn()。

版权所有 2000-2023 OpenSSL 项目作者。版权所有。

根据 Apache License 2.0(“许可证”)获得许可。除非遵守许可证,否则您不得使用此文件。您可以在源代码分发版或/source/license.html的 LICENSE 文件中获取副本。