provider
名称
provider - OpenSSL 操作实现提供者
概要
#include <openssl/provider.h>
描述
一般
此页面包含对提供者作者有用的信息。
在 OpenSSL 术语中,提供者是指提供一个或多个实现以执行各种算法操作的代码单元。
操作是想要执行的操作,例如加密和解密、密钥派生、MAC 计算、签名和验证等。
算法是执行操作的命名方法。通常,算法围绕着密码学操作,但也可能围绕着其他类型的操作,例如管理某些类型的对象。
有关更多详细信息,请参见 crypto(7)。
提供者
提供者提供初始化函数,作为一组基础函数,形式为 OSSL_DISPATCH(3) 数组,并扩展为一组 OSSL_ALGORITHM(3)(参见 openssl-core.h(7))。它可以是动态加载的模块,也可以是内置在 OpenSSL 库或应用程序中的模块。如果是动态加载的模块,初始化函数必须命名为 OSSL_provider_init
并且必须导出。如果是内置的,初始化函数可以具有任何名称。
初始化函数必须具有以下签名
int NAME(const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in, const OSSL_DISPATCH **out,
void **provctx);
handle 是提供者的 OpenSSL 库对象,用作 OpenSSL 库需要了解的提供者的所有内容的句柄。对于提供者本身,它被传递给分派数组 in 中的某些函数。
in 是 OpenSSL 库提供的基础函数的分派数组,可用函数在 provider-base(7) 中有进一步的描述。
*out 必须分配一个提供者提供给 OpenSSL 库的基础函数的分派数组。可提供的函数在 provider-base(7) 中有进一步的描述,它们是 OpenSSL 库和提供者之间通信的主要手段。
*provctx 应分配一个提供者特定的上下文,以允许提供者多次同时使用。此指针将传递给提供者提供的各种操作函数。
请注意,在初始化函数完成并成功返回之前,提供者不会对应用程序可用。
提供者提供给 OpenSSL 库的函数之一是 OpenSSL 库获取各种算法操作实现的中心机制。它被称为数字 OSSL_FUNC_PROVIDER_QUERY_OPERATION,具有以下签名
const OSSL_ALGORITHM *provider_query_operation(void *provctx,
int operation_id,
const int *no_store);
provctx 是初始化函数返回的提供者特定上下文。
operation_id 是操作标识(参见下文 "操作")。
no_store 是传递回 OpenSSL 库的标志,当不为零时,表示 OpenSSL 库不会在其内部实现存储中存储对返回数据的引用。
返回的 OSSL_ALGORITHM(3) 是任何使用提供者作为其实现的 OpenSSL 库 API 的基础,最常见的是在获取类型的函数中(参见 "crypto(7) 中的 ALGORITHM FETCHING")。
操作
操作用数字引用,通过以 OSSL_OP_
开头的名称的宏。
每个操作都有一组定义的函数类型,提供者可以根据需要提供或不提供。
当前可用的操作是
- 摘要
-
在 OpenSSL 库中,相应的 method 对象是 EVP_MD。此操作的数字是 OSSL_OP_DIGEST。提供者可以提供的函数在 provider-digest(7) 中描述。
- 对称密码
-
在 OpenSSL 库中,相应的 method 对象是 EVP_CIPHER。此操作的数字是 OSSL_OP_CIPHER。提供者可以提供的函数在 provider-cipher(7) 中描述。
- 消息认证码 (MAC)
-
在 OpenSSL 库中,相应的 method 对象是 EVP_MAC。此操作的数字是 OSSL_OP_MAC。提供者可以提供的函数在 provider-mac(7) 中描述。
- 密钥派生函数 (KDF)
-
在 OpenSSL 库中,相应的 method 对象是 EVP_KDF。此操作的数字是 OSSL_OP_KDF。提供者可以提供的函数在 provider-kdf(7) 中描述。
- 密钥交换
-
在 OpenSSL 库中,相应的 method 对象是 EVP_KEYEXCH。此操作的数字是 OSSL_OP_KEYEXCH。提供者可以提供的函数在 provider-keyexch(7) 中描述。
- 非对称密码
-
在 OpenSSL 库中,相应的 method 对象是 EVP_ASYM_CIPHER。此操作的数字是 OSSL_OP_ASYM_CIPHER。提供者可以提供的函数在 provider-asym_cipher(7) 中描述。
- 非对称密钥封装
-
在 OpenSSL 库中,相应的 method 对象是 EVP_KEM。此操作的数字是 OSSL_OP_KEM。提供者可以提供的函数在 provider-kem(7) 中描述。
- 编码
-
在 OpenSSL 库中,相应的 method 对象是 OSSL_ENCODER。此操作的数字是 OSSL_OP_ENCODER。提供者可以提供的函数在 provider-encoder(7) 中描述。
- 解码
-
在 OpenSSL 库中,相应的 method 对象是 OSSL_DECODER。此操作的数字是 OSSL_OP_DECODER。提供者可以提供的函数在 provider-decoder(7) 中描述。
- 随机数生成
-
此操作的数字是 OSSL_OP_RAND。提供者可以提供的随机数生成函数在 provider-rand(7) 中描述。
- 密钥管理
-
此操作的数字是 OSSL_OP_KEYMGMT。提供者可以提供的密钥管理函数在 provider-keymgmt(7) 中描述。
- 签名和签名验证
-
此操作的数字是 OSSL_OP_SIGNATURE。提供者可以提供的数字签名函数在 provider-signature(7) 中描述。
- 存储管理
-
此操作的数字是 OSSL_OP_STORE。提供者可以提供的存储管理函数在 provider-storemgmt(7) 中描述。
算法命名
算法名称不区分大小写。任何特定算法都可以有多个别名与其关联。规范的 OpenSSL 命名方案遵循以下格式
ALGNAME[VERSION?][-SUBNAME[VERSION?]?][-SIZE?][-MODE?]
只有在算法有多个版本(例如 MD2、MD4、MD5)时才会出现 VERSION。如果只有一个版本,可以省略它。
当将多个算法组合在一起时,可能会出现 SUBNAME,例如 MD5-SHA1。
只有在算法有多个具有不同大小的版本(例如 AES-128-CBC、AES-256-CBC)时才会出现 SIZE。
MODE 仅在适用时出现。
可能存在其他别名,例如,当标准机构或通用实践使用 OpenSSL 历史上使用的替代名称或名称时。
OPENSSL 提供者
OpenSSL 提供了许多自己的提供者。这些是默认、基础、fips、legacy 和 null 提供者。有关这些提供者的概述,请参见 crypto(7)。
参见
EVP_DigestInit_ex(3),EVP_EncryptInit_ex(3),OSSL_LIB_CTX(3),EVP_set_default_properties(3),EVP_MD_fetch(3),EVP_CIPHER_fetch(3),EVP_KEYMGMT_fetch(3),openssl-core.h(7),provider-base(7),provider-digest(7),provider-cipher(7),provider-keyexch(7)
历史
提供者及其周围的一切概念是在 OpenSSL 3.0 中引入的。
版权
版权所有 2019-2022 The OpenSSL Project Authors。保留所有权利。
根据 Apache 许可证 2.0(“许可证”)授权。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获得一份副本。