文章目录
🌺概要
#include <openssl/core_dispatch.h>
/*
* None of these are actual functions, but are displayed like this for
* the function signatures for functions that are offered as function
* pointers in OSSL_DISPATCH arrays.
*/
void *OSSL_FUNC_store_open(void *provctx, const char *uri);
void *OSSL_FUNC_store_attach(void *provctx, OSSL_CORE_BIO *bio);
const OSSL_PARAM *store_settable_ctx_params(void *provctx);
int OSSL_FUNC_store_set_ctx_params(void *loaderctx, const OSSL_PARAM[]);
int OSSL_FUNC_store_load(void *loaderctx,
OSSL_CALLBACK *object_cb, void *object_cbarg,
OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg);
int OSSL_FUNC_store_eof(void *loaderctx);
int OSSL_FUNC_store_close(void *loaderctx);
int OSSL_FUNC_store_export_object
(void *loaderctx, const void *objref, size_t objref_sz,
OSSL_CALLBACK *export_cb, void *export_cbarg);
🌻描述
STORE 操作是 ossl_store API 的提供程序端。
STORE 操作的主要职责是从 URI 指示的容器中加载各种对象。这些对象以提供程序-本机对象抽象形式提供给 OpenSSL 库(参见提供程序-对象)。然后,OpenSSL 库负责将该抽象传递给合适的提供函数。
OpenSSL 库可以传递抽象以包含 OSSL_FUNC_keymgmt_load() (提供程序-keymgmt)、OSSL_FUNC_store_export_object() (以参数化形式导出对象) 的函数示例。
这里提到的所有"函数"都作为函数指针在libcrypto和OSSL_DISPATCH数组中的提供程序之间传递,通过由提供程序的**provider_query_operation()**函数返回的OSSL_ALGORITHM数组(参见提供程序-base中的"提供程序函数")。
所有这些"函数"都有一个名为 OSSL_FUNC_{name}_fn 的相应函数类型定义,以及一个帮助器函数,用于从名为 OSSL_get_{name} OSSL_DISPATCH元素中检索函数指针。例如,"函数"OSSL_FUNC_store_load() 具有以下功能:
typedef void *(OSSL_OSSL_FUNC_store_load_fn)(void *provctx,
const OSSL_PARAM params[]);
static ossl_inline OSSL_OSSL_FUNC_store_load_fn
OSSL_OSSL_FUNC_store_load(const OSSL_DISPATCH *opf);
OSSL_DISPATCH数组由 openssl-core_dispatch.h 中作为宏提供的数字编制索引,如下所示:
OSSL_FUNC_store_open OSSL_FUNC_STORE_OPEN
OSSL_FUNC_store_attach OSSL_FUNC_STORE_ATTACH
OSSL_FUNC_store_settable_ctx_params OSSL_FUNC_STORE_SETTABLE_CTX_PARAMS
OSSL_FUNC_store_set_ctx_params OSSL_FUNC_STORE_SET_CTX_PARAMS
OSSL_FUNC_store_load OSSL_FUNC_STORE_LOAD
OSSL_FUNC_store_eof OSSL_FUNC_STORE_EOF
OSSL_FUNC_store_close OSSL_FUNC_STORE_CLOSE
OSSL_FUNC_store_export_object OSSL_FUNC_STORE_EXPORT_OBJECT
🌹函数
OSSL_FUNC_store_open() 应使用基于输入 uri 的数据创建提供程序端上下文。实现完全负责 URI 的解释。
OSSL_FUNC_store_attach() 应创建一个附加了核心 BIO BIO 的提供者端上下文。这是使用 URI 查找存储的替代方法,支持 OSSL_STORE_attach。
OSSL_FUNC_store_settable_ctx_params() 应返回描述符OSSL_PARAM的常量数组,用于OSSL_FUNC_store_set_ctx_params() 可以处理的参数。
OSSL_FUNC_store_set_ctx_params() 应设置其他参数,例如预期的数据类型、搜索条件等。下面将在"加载参数"中详细介绍这些内容。无法识别的参数是错误还是被忽略,由实现自行决定。为参数传递 NULL 应返回 true。
OSSL_FUNC_store_load() 从 OSSL_FUNC_store_open() 打开的 URI 加载下一个对象,为其创建对象抽象(参见 提供程序-object),并用它来调用object_cb以及object_cbarg。然后,object_cb将解释对象抽象,并尽其所能将其包装或解码为OpenSSL结构。如果需要提示密码来解锁对象,则应调用pw_cb。
OSSL_FUNC_store_eof() 指示是否已到达 URI 中对象集的末尾。当这种情况发生时,尝试进行任何进一步的加载是没有意义的。
OSSL_FUNC_store_close() 释放提供程序端上下文 ctx。
🌷加载参数
-
“expect” (OSSL_STORE_PARAM_EXPECT) < integer >
是 OpenSSL 库希望获得的数据类型的提示。这仅对优化有用,因为库也会检查对象类型是否符合预期。
可以通过此参数给出的数字可以在 <openssl/store.h> 中找到,宏的名称以 开头。这些在OSSL_STORE_INFO的"支持的对象"中进行了进一步描述。 -
“subject” (OSSL_STORE_PARAM_SUBJECT) < octet string >
指示调用方要搜索与给定主题关联的对象。这可用于按使用者选择特定证书。
八位字节字符串的内容应为 DER 形式。 -
“issuer” (OSSL_STORE_PARAM_ISSUER) < octet string >
指示调用方想要搜索与给定颁发者关联的对象。这可用于按颁发者选择特定证书。
八位字节字符串的内容应为 DER 形式。 -
“serial” (OSSL_STORE_PARAM_SERIAL) < integer >
指示调用方要搜索具有关联给定序列号的对象。 -
“digest” (OSSL_STORE_PARAM_DIGEST) < UTF8 string >
“fingerprint” (OSSL_STORE_PARAM_FINGERPRINT) < octet string >
指示调用方要使用给定的指纹搜索对象,该指纹是使用给定摘要计算的。 -
“alias” (OSSL_STORE_PARAM_ALIAS) < UTF8 string >
指示调用方想要搜索具有给定别名的对象(有人称其为"友好名称")。 -
“properties” (OSSL_STORE_PARAM_PROPERTIES) < utf8 string >
查询算法(如OSSL_DECODER解码器实现)时要使用的属性字符串。 -
“input-type” (OSSL_STORE_PARAM_INPUT_TYPE) < utf8 string >
键入输入格式作为解码存储中的对象时要使用的提示。
其中几个搜索条件可以组合在一起。例如,要按issuer+serial搜索证书,将同时给出"issuer"和"serial"参数。