OpenSSL 提供商密钥对象
OpenSSL provider key object
我是一名初学者,试图通过浏览代码库来了解 OpenSSL 3.0 的基础知识。我开始使用“openssl pkeyutl”应用程序探索 RSA 签名的工作原理。
因此,如果我正确理解 OpenSSL 3.0 设计,就会有一个提供程序执行实际的加密功能。提供程序可以是作为 OpenSSL 包一部分的默认提供程序,甚至可以是支持硬件加速的第 3 方库。
根据文档here,需要在签名之前调用签名初始化函数。
OSSL_FUNC_signature_sign_init() initialises a context for signing given a provider side signature context in the ctx parameter, and a pointer to a provider key object in the provkey parameter. The params, if not NULL, should be set on the context in a manner similar to using OSSL_FUNC_signature_set_ctx_params(). The key object should have been previously generated, loaded or imported into the provider using the key management (OSSL_OP_KEYMGMT) operation (see provider-keymgmt(7)>.
int OSSL_FUNC_signature_sign_init(void *ctx, void *provkey,
const OSSL_PARAM params[]);
对于默认提供程序,OSSL_FUNC_signature_sign_init() 调用 rsa_sig.c 中的 rsa_signverify_init()。
static int rsa_signverify_init(void *vprsactx, void *vrsa,
const OSSL_PARAM params[], int operation)
{
PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
if (!ossl_prov_is_running())
return 0;
if (prsactx == NULL || vrsa == NULL)
return 0;
if (!ossl_rsa_check_key(prsactx->libctx, vrsa, operation))
return 0;
if (!RSA_up_ref(vrsa))
return 0;
RSA_free(prsactx->rsa);
prsactx->rsa = vrsa;
prsactx->operation = operation;
上述函数中prsactx->rsa设置为vrsa,即上层传过来的provkey。 rsa 结构包含执行实际 RSA 相关加密函数的函数指针列表。
我很困惑为什么上层要向提供者提供功能?实现这些功能不就是provider的全部工作吗?
“上层”只是传递密钥的“void *”句柄——这是从提供商自己的密钥管理功能中获得的。提供者自己负责构造密钥对象。
对于默认提供程序中的 RSA,您可以在此处查看执行此操作的代码:
https://github.com/openssl/openssl/blob/master/providers/implementations/keymgmt/rsa_kmgmt.c
提供商密钥管理功能记录在此处:
https://www.openssl.org/docs/man3.0/man7/provider-keymgmt.html
我是一名初学者,试图通过浏览代码库来了解 OpenSSL 3.0 的基础知识。我开始使用“openssl pkeyutl”应用程序探索 RSA 签名的工作原理。
因此,如果我正确理解 OpenSSL 3.0 设计,就会有一个提供程序执行实际的加密功能。提供程序可以是作为 OpenSSL 包一部分的默认提供程序,甚至可以是支持硬件加速的第 3 方库。
根据文档here,需要在签名之前调用签名初始化函数。
OSSL_FUNC_signature_sign_init() initialises a context for signing given a provider side signature context in the ctx parameter, and a pointer to a provider key object in the provkey parameter. The params, if not NULL, should be set on the context in a manner similar to using OSSL_FUNC_signature_set_ctx_params(). The key object should have been previously generated, loaded or imported into the provider using the key management (OSSL_OP_KEYMGMT) operation (see provider-keymgmt(7)>.
int OSSL_FUNC_signature_sign_init(void *ctx, void *provkey,
const OSSL_PARAM params[]);
对于默认提供程序,OSSL_FUNC_signature_sign_init() 调用 rsa_sig.c 中的 rsa_signverify_init()。
static int rsa_signverify_init(void *vprsactx, void *vrsa,
const OSSL_PARAM params[], int operation)
{
PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
if (!ossl_prov_is_running())
return 0;
if (prsactx == NULL || vrsa == NULL)
return 0;
if (!ossl_rsa_check_key(prsactx->libctx, vrsa, operation))
return 0;
if (!RSA_up_ref(vrsa))
return 0;
RSA_free(prsactx->rsa);
prsactx->rsa = vrsa;
prsactx->operation = operation;
上述函数中prsactx->rsa设置为vrsa,即上层传过来的provkey。 rsa 结构包含执行实际 RSA 相关加密函数的函数指针列表。
我很困惑为什么上层要向提供者提供功能?实现这些功能不就是provider的全部工作吗?
“上层”只是传递密钥的“void *”句柄——这是从提供商自己的密钥管理功能中获得的。提供者自己负责构造密钥对象。
对于默认提供程序中的 RSA,您可以在此处查看执行此操作的代码:
https://github.com/openssl/openssl/blob/master/providers/implementations/keymgmt/rsa_kmgmt.c
提供商密钥管理功能记录在此处:
https://www.openssl.org/docs/man3.0/man7/provider-keymgmt.html