OpenSSL

密码学和 SSL/TLS 工具包

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 中获得一份副本。