c - 验证公钥与私钥签名匹配

标签 c openssl x509 hsm

我是 openssl API 的新手。

我的目标是验证我的公钥是否与我隐藏的私钥“相关”。

使用 openssl cli 的解决方案:

我有一个证书,私钥是隐藏的(在 HSM 中) 我有一个缓冲区:

echo "hello world!!!!" > sign.txt

使用以下命令,我创建缓冲区的 sha256 签名,类似于我的 HSM 将执行的操作:

openssl dgst -sha256 -sign myrootca.key.insecure -out sign.sha256 sign.txt

提取公钥:

openssl x509 -pubkey -noout -in myrootca.crt  > myrootca.publicKey.pem

验证公钥:

openssl dgst -sha256 -verify myrootca.publicKey.pem -signature sign.sha256 sign.txt

我想我知道如何正确表示我的公钥和签名文件

sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL,
                                 e, "key file");
sigbio = BIO_new_file(sigfile, "rb");

但找不到合适的 API 从这里继续

最佳答案

我遇到的问题是事先弄清楚签名的长度是多少,以便为必须事先了解 RSA key 大小和哈希类型的签名分配位置

sha256 + RSA1024 ~ 128byte
sha256 + RSA2048 ~ 256byte

使用 openssl API based of this guide我已设法使用以下代码验证签名:

Verifyx509VsPrivKeySig(X509* x509Cert,char* signature,size_t sigLen,char* message,size_t messageLen)
{
        int rc;
        EVP_PKEY* pPubkey = NULL;
        EVP_MD_CTX* ctx = NULL;

        rc = getX509Publickey(x509Cert, &pPubkey);
        if (rc != SSL_OK)
        {
                goto err_verify;
        }

        ctx = EVP_MD_CTX_create();
        if(ctx == NULL) {
                PRINT_LOG_ERR("EVP_MD_CTX_create failed, error 0x%lx\n", ERR_get_error());
                /* failed */
                goto err_verify;
        }

        rc = EVP_DigestVerifyInit(ctx, NULL, EVP_sha256(), NULL, pPubkey);
        if(rc != 1) {
                PRINT_LOG_ERR("EVP_DigestVerifyInit failed, error 0x%lx\n", ERR_get_error());
                goto err_EVP_XTX_destroy; /* failed */
        }

        rc = EVP_DigestVerifyUpdate(ctx, message, messageLen);
        if(rc != 1) {
                PRINT_LOG_ERR("EVP_DigestVerifyUpdate failed, error 0x%lx\n", ERR_get_error());
                goto err_EVP_XTX_destroy; /* failed */
        }

        /* Clear any errors for the call below */
        ERR_clear_error();

        rc = EVP_DigestVerifyFinal(ctx,(const unsigned char*) signature, sigLen);
        if(rc != 1) {
                PRINT_LOG_ERR("EVP_DigestVerifyFinal failed, error 0x%lx\n", ERR_get_error());
                goto err_EVP_XTX_destroy; /* failed */
        }


        /*if we got to here , verify sig finished with good result!!*/
    if(ctx) {
        EVP_MD_CTX_destroy(ctx);
        ctx = NULL;
    }

    return true;
    //////////////////// ERROR HANDLING ///////////////////////////
err_EVP_XTX_destroy:
        EVP_MD_CTX_destroy(ctx);
err_verify:
        return false;
}

关于c - 验证公钥与私钥签名匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47550347/

相关文章:

c - 只允许数字继续使用 while 和 scanf

c - 旧版本的 OpenSSL 中的 cb_arg 是什么意思?

ssl - 申请 SSL 证书的人必须在他们的机器上有他们的私钥吗?

python - 使用 Python 结构模块解压 C 结构

c - C 中的线程安全与原子性

c - 当我使用 -static 时 GCC 吓坏了

android - 在使用 OpenSSL enc 子命令加密的 Android 上解密文件

ssl - 没有 Openssl 的 HTTP 公钥固定 (HPKP)

java - 使用 Java 中的 Bouncy CaSTLe 自签名 X509 证书

ssl - OpenSSL X509 使用 CA 验证签名