OpenSSL

加密和 SSL/TLS 工具包

provider-digest

名称

provider-digest - 散列库 <-> 提供程序函数

摘要

#include <openssl/core_dispatch.h>
#include <openssl/core_names.h>

/*
 * Digests support the following function signatures in OSSL_DISPATCH arrays.
 * (The function signatures are not actual functions).
 */

/* Context management */
void *OSSL_FUNC_digest_newctx(void *provctx);
void OSSL_FUNC_digest_freectx(void *dctx);
void *OSSL_FUNC_digest_dupctx(void *dctx);

/* Digest generation */
int OSSL_FUNC_digest_init(void *dctx, const OSSL_PARAM params[]);
int OSSL_FUNC_digest_update(void *dctx, const unsigned char *in, size_t inl);
int OSSL_FUNC_digest_final(void *dctx, unsigned char *out, size_t *outl,
                           size_t outsz);
int OSSL_FUNC_digest_digest(void *provctx, const unsigned char *in, size_t inl,
                            unsigned char *out, size_t *outl, size_t outsz);

/* Digest parameter descriptors */
const OSSL_PARAM *OSSL_FUNC_digest_gettable_params(void *provctx);

/* Digest operation parameter descriptors */
const OSSL_PARAM *OSSL_FUNC_digest_gettable_ctx_params(void *dctx,
                                                       void *provctx);
const OSSL_PARAM *OSSL_FUNC_digest_settable_ctx_params(void *dctx,
                                                       void *provctx);

/* Digest parameters */
int OSSL_FUNC_digest_get_params(OSSL_PARAM params[]);

/* Digest operation parameters */
int OSSL_FUNC_digest_set_ctx_params(void *dctx, const OSSL_PARAM params[]);
int OSSL_FUNC_digest_get_ctx_params(void *dctx, OSSL_PARAM params[]);

描述

本文档主要面向提供程序作者。有关更多信息,请参见 provider(7)

DIGEST 操作使提供程序能够实现散列算法,并通过 API 函数 EVP_DigestInit_ex(3)EVP_DigestUpdate(3)EVP_DigestFinal(3)(以及其他相关函数)使应用程序能够使用这些算法。

此处提到的所有“函数”都作为函数指针在 libcrypto 和提供程序之间传递,位于 OSSL_DISPATCH(3) 数组中,通过提供程序的 provider_query_operation() 函数返回的 OSSL_ALGORITHM(3) 数组(请参见 provider-base(7) 中的“提供程序函数”)。

所有这些“函数”都有一个相应的函数类型定义,名为 OSSL_FUNC_{name}_fn,以及一个辅助函数,用于从 OSSL_DISPATCH(3) 元素中检索函数指针,名为 OSSL_FUNC_{name}。例如,“函数”OSSL_FUNC_digest_newctx() 具有以下内容

typedef void *(OSSL_FUNC_digest_newctx_fn)(void *provctx);
static ossl_inline OSSL_FUNC_digest_newctx_fn
    OSSL_FUNC_digest_newctx(const OSSL_DISPATCH *opf);

OSSL_DISPATCH(3) 数组由数字索引,这些数字作为宏提供在 openssl-core_dispatch.h(7) 中,如下所示

OSSL_FUNC_digest_newctx               OSSL_FUNC_DIGEST_NEWCTX
OSSL_FUNC_digest_freectx              OSSL_FUNC_DIGEST_FREECTX
OSSL_FUNC_digest_dupctx               OSSL_FUNC_DIGEST_DUPCTX

OSSL_FUNC_digest_init                 OSSL_FUNC_DIGEST_INIT
OSSL_FUNC_digest_update               OSSL_FUNC_DIGEST_UPDATE
OSSL_FUNC_digest_final                OSSL_FUNC_DIGEST_FINAL
OSSL_FUNC_digest_digest               OSSL_FUNC_DIGEST_DIGEST

OSSL_FUNC_digest_get_params           OSSL_FUNC_DIGEST_GET_PARAMS
OSSL_FUNC_digest_get_ctx_params       OSSL_FUNC_DIGEST_GET_CTX_PARAMS
OSSL_FUNC_digest_set_ctx_params       OSSL_FUNC_DIGEST_SET_CTX_PARAMS

OSSL_FUNC_digest_gettable_params      OSSL_FUNC_DIGEST_GETTABLE_PARAMS
OSSL_FUNC_digest_gettable_ctx_params  OSSL_FUNC_DIGEST_GETTABLE_CTX_PARAMS
OSSL_FUNC_digest_settable_ctx_params  OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS

散列算法实现可能不会实现所有这些函数。为了可用,应实现 OSSL_FUNC_digest_newctx、OSSL_FUNC_digest_freectx、OSSL_FUNC_digest_init、OSSL_FUNC_digest_update 和 OSSL_FUNC_digest_final 的全部或都不实现。所有其他函数都是可选的。

上下文管理函数

OSSL_FUNC_digest_newctx() 应创建并返回指向提供程序端结构的指针,该结构用于在散列操作期间保存上下文信息。此上下文的指针将在许多其他散列操作函数调用中传回。参数 provctx 是在提供程序初始化期间生成的提供程序上下文(请参见 provider(7))。

OSSL_FUNC_digest_freectx() 将指向 dctx 参数中提供程序端散列上下文的指针作为参数传递。此函数应释放与该上下文关联的任何资源。

OSSL_FUNC_digest_dupctx() 应复制 dctx 参数中提供程序端散列上下文,并返回副本。

散列生成函数

OSSL_FUNC_digest_init() 初始化散列操作,给定 dctx 参数中新创建的提供程序端散列上下文。如果 params 不为 NULL,则应以类似于使用 OSSL_FUNC_digest_set_ctx_params() 的方式将其设置在上下文中。

调用 OSSL_FUNC_digest_update() 以提供要作为先前初始化的散列操作的一部分进行散列的数据。dctx 参数包含指向先前初始化的提供程序端上下文的指针。OSSL_FUNC_digest_update() 应散列 in 指向的位置处的 inl 字节数据。对于单个散列操作,可以多次调用 OSSL_FUNC_digest_update()。

OSSL_FUNC_digest_final() 生成通过先前的 OSSL_FUNC_digest_init() 和 OSSL_FUNC_digest_update() 调用启动的散列。dctx 参数包含指向提供程序端上下文的指针。散列应写入 *out,散列的长度应写入 *outl。散列不应超过 outsz 字节。

OSSL_FUNC_digest_digest() 是一个“一次性”散列函数。不使用提供程序端散列上下文。而是将提供程序初始化期间创建的提供程序上下文传递给 provctx 参数(请参见 provider(7))。in 处的 inl 字节应进行散列,结果应存储在 out 中。散列的长度应存储在 *outl 中,其不应超过 outsz 字节。

散列参数

有关这些函数使用的参数结构的更多详细信息,请参见 OSSL_PARAM(3)

OSSL_FUNC_digest_get_params() 获取算法实现的详细信息并将其存储在 params 中。

OSSL_FUNC_digest_set_ctx_params() 将提供程序端散列上下文 dctx 的散列操作参数设置为 params。任何参数设置都是对先前设置的任何参数的补充。将 NULL 传递给 params 应返回 true。

OSSL_FUNC_digest_get_ctx_params() 从给定的提供程序端散列上下文 dctx 获取散列操作详细信息,并将它们存储在 params 中。将 NULL 传递给 params 应返回 true。

OSSL_FUNC_digest_gettable_params() 返回一个常量 OSSL_PARAM(3) 数组,其中包含 OSSL_FUNC_digest_get_params() 可以处理的参数的描述符。

OSSL_FUNC_digest_gettable_ctx_params() 和 OSSL_FUNC_digest_settable_ctx_params() 都返回常量 OSSL_PARAM(3) 数组作为 OSSL_FUNC_digest_get_ctx_params() 和 OSSL_FUNC_digest_set_ctx_params() 可以分别处理的参数的描述符。如果 dctx 不为 NULL,则数组基于提供程序端上下文的当前状态,否则基于提供程序端算法 provctx

使用此函数,内置散列当前识别的参数如下所示。并非所有参数都与所有散列相关或为所有散列所理解

"blocksize" (OSSL_DIGEST_PARAM_BLOCK_SIZE) <无符号整数>

散列块大小。“blocksize”参数的长度不应超过 size_t 的长度。

"size" (OSSL_DIGEST_PARAM_SIZE) <无符号整数>

散列输出大小。“size”参数的长度不应超过 size_t 的长度。

"flags" (OSSL_DIGEST_PARAM_FLAGS) <无符号整数>

描述散列异常行为的各种标志

EVP_MD_FLAG_ONESHOT

此散列方法只能处理一个输入块。

EVP_MD_FLAG_XOF

此散列方法是可扩展输出函数 (XOF)。

EVP_MD_FLAG_DIGALGID_NULL

在设置 DigestAlgorithmIdentifier 时,此标志将默认将参数设置为 NULL。将其用于 PKCS#1。注意:如果与 EVP_MD_FLAG_DIGALGID_ABSENT 结合使用,后者将覆盖前者。

EVP_MD_FLAG_DIGALGID_ABSENT

在设置 DigestAlgorithmIdentifier 时,此标志将默认使参数保持缺失。注意:如果与 EVP_MD_FLAG_DIGALGID_NULL 结合使用,后者将覆盖前者。

EVP_MD_FLAG_DIGALGID_CUSTOM

通过 ctrl 进行自定义 DigestAlgorithmIdentifier 处理,默认值为 EVP_MD_FLAG_DIGALGID_ABSENT注意:如果与 EVP_MD_FLAG_DIGALGID_NULL 结合使用,后者将覆盖前者。 当前未使用。

"flags" 参数的长度应等于 unsigned long int 的长度。

散列上下文参数

OSSL_FUNC_digest_set_ctx_params() 将与给定的提供程序端散列上下文 dctx 关联的散列参数设置为 params。任何参数设置都是对先前设置的任何参数的补充。有关参数结构的更多详细信息,请参见 OSSL_PARAM(3)

OSSL_FUNC_digest_get_ctx_params() 获取与给定提供程序端散列上下文 dctx 关联的当前设置的参数值的详细信息,并将它们存储在 params 中。有关参数结构的更多详细信息,请参见 OSSL_PARAM(3)

返回值

OSSL_FUNC_digest_newctx() 和 OSSL_FUNC_digest_dupctx() 应返回新创建的提供程序端散列上下文,或者在失败时返回 NULL。

OSSL_FUNC_digest_init()、OSSL_FUNC_digest_update()、OSSL_FUNC_digest_final()、OSSL_FUNC_digest_digest()、OSSL_FUNC_digest_set_params() 和 OSSL_FUNC_digest_get_params() 应在成功时返回 1,在错误时返回 0。

OSSL_FUNC_digest_size() 应返回散列大小。

OSSL_FUNC_digest_block_size() 应返回底层散列算法的块大小。

错误

EVP_Q_digest()、EVP_Digest() 和 EVP_DigestFinal_ex() API 调用不期望散列大小大于 EVP_MAX_MD_SIZE。任何产生更大散列的算法都无法与这些 API 调用一起使用。

参见

provider(7)OSSL_PROVIDER-FIPS(7)OSSL_PROVIDER-default(7)OSSL_PROVIDER-legacy(7)EVP_MD-common(7)EVP_MD-BLAKE2(7)EVP_MD-MD2(7)EVP_MD-MD4(7)EVP_MD-MD5(7)EVP_MD-MD5-SHA1(7)EVP_MD-MDC2(7)EVP_MD-RIPEMD160(7)EVP_MD-SHA1(7)EVP_MD-SHA2(7)EVP_MD-SHA3(7)EVP_MD-KECCAK(7) EVP_MD-SHAKE(7)EVP_MD-SM3(7)EVP_MD-WHIRLPOOL(7)EVP_MD-NULL(7)life_cycle-digest(7)EVP_DigestInit(3)

历史

提供程序 DIGEST 接口在 OpenSSL 3.0 中引入。

版权所有 2019-2023 OpenSSL 项目作者。保留所有权利。

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