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