OpenSSL

密码学和 SSL/TLS 工具包

provider-object

名称

provider-object - 提供者原生对象抽象的规范

概要

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

描述

提供者原生对象抽象是一组 OSSL_PARAM(3) 键值对,可用于将提供者原生对象传递给 OpenSSL 库代码,或在不同提供者操作实现之间进行传递,并借助 OpenSSL 库代码。

其目的是,某些提供者原生操作可以传递任何属于其他操作或 OpenSSL 库代码的对象。

对象可以通过以下方式传递

  1. 按值传递

    这意味着对象数据作为字节字符串或 UTF8 字符串传递,其他提供者实现可以使用不同的方式处理这些数据。对象的编码取决于其使用环境;例如,OSSL_DECODER(3) 允许多种编码,具体取决于现有的解码器。如果核心 OpenSSL 库功能要直接处理数据,则数据必须以 DER 格式编码,所有对象类型均如此,但 OSSL_OBJECT_NAME 除外(请参见下面的 "参数参考"),它被认为是纯 UTF8 字符串。

  2. 按引用传递

    这意味着对象数据不会直接传递,而是传递一个对象引用。这是一个只有对应提供者才能正确理解的字节字符串。

按值传递的对象可以被任何处理 DER 编码对象的实体使用。

按引用传递的对象需要来自对象抽象来源实现(我们称之为 X)及其目标实现(我们称之为 Y)的更高层级的协作。

  1. 目标实现中的对象加载函数

    目标实现(Y)可能有一个函数可以接收对象引用。这只有在目标实现与产生该对象抽象的提供者相同(X)时才可以使用。

    要使用的确切目标实现由对象类型以及可能的对象数据类型决定。例如,当 OpenSSL 库接收到一个对象类型OSSL_OBJECT_PKEY 的对象抽象时,它将使用对象数据类型作为其键类型获取一个 provider-keymgmt(7)EVP_KEYMGMT_fetch(3) 中的第二个参数)。

  2. 源实现中的对象导出器

    源实现(X)可能有一个导出器函数。此导出器函数可用于以 OSSL_PARAM(3) 格式导出对象,然后目标实现的导入函数可以导入该对象。

    当无法从同一个提供者获取目标实现(Y)时,可以使用此方法。

参数参考

提供者原生对象抽象是一个 OSSL_PARAM(3),它包含以下参数中的部分:

"data" (OSSL_OBJECT_PARAM_DATA) <octet string> 或 <UTF8 string>

按值传递的对象数据。

"reference" (OSSL_OBJECT_PARAM_REFERENCE) <octet string>

按引用传递的对象数据。

"type" (OSSL_OBJECT_PARAM_TYPE) <integer>

对象类型,一个可以取以下任意值的数字(所有这些值都在 <openssl/core_object.h> 中定义)

OSSL_OBJECT_NAME

对象数据只能按值传递,并且应该是 UTF8 字符串。

这在 provider-storemgmt(7) 中很有用,当 URI 加载导致新的 URI 时。

OSSL_OBJECT_PKEY

对象数据适合用作提供者原生 EVP_PKEY 密钥数据。对象数据可以按值传递或按引用传递。

OSSL_OBJECT_CERT

对象数据适合用作 X509 数据。此对象类型对象数据只能按值传递,并且应该是字节字符串。

由于没有提供者原生 X.509 对象,因此接收此对象抽象的 OpenSSL 库应该使用 d2i_X509() 将数据转换为 X509 对象。

OSSL_OBJECT_CRL

对象数据适合用作 X509_CRL 数据。对象数据只能按值传递,并且应该是字节字符串。

由于没有提供者原生 X.509 CRL 对象,因此接收此对象抽象的 OpenSSL 库应该使用 d2i_X509_CRL() 将数据转换为 X509_CRL 对象。

"data-type" (OSSL_OBJECT_PARAM_DATA_TYPE) <UTF8 string>

对象内容的具体类型。合法值取决于对象类型;如果是 OSSL_OBJECT_PKEY,则数据类型应该是一个适合获取可以处理该数据的 provider-keymgmt(7) 的键类型。

"data-structure" (OSSL_OBJECT_PARAM_DATA_STRUCTURE) <UTF8 string>

对象内容的最外层结构。合法值取决于对象类型。

"desc" (OSSL_OBJECT_PARAM_DESC) <UTF8 string>

一个描述对象额外细节的人类可读文本。

使用提供者原生对象抽象时,它必须至少包含一种形式的对象数据(按值传递的对象数据,即 "data" 项目,或按引用传递的对象数据,即 "reference" 项目)。这两个项目可以同时存在,在这种情况下,接收此对象的 OpenSSL 库代码将使用最优变体。

对于对象类型为 OSSL_OBJECT_NAME 的对象,必须提供该对象类型。

参见

provider(7), OSSL_DECODER(3)

历史

提供者及其周围的一切概念是在 OpenSSL 3.0 中引入的。

Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.

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