验证 public 密钥与私钥签名匹配
Verify public key matches signature of private key
我是 openssl 新手 API。
我的目标是验证我的 public 密钥是 "related" 我的隐藏私钥。
使用 openssl cli 的解决方案:
我有一个证书,私钥是隐藏的(在 HSM 中)
我有一个缓冲区:
echo "hello world!!!!" > sign.txt
使用以下命令我创建缓冲区的 sha256 签名类似于我的 HSM 将执行的操作:
openssl dgst -sha256 -sign myrootca.key.insecure -out sign.sha256 sign.txt
提取public密钥:
openssl x509 -pubkey -noout -in myrootca.crt > myrootca.publicKey.pem
验证 public 密钥:
openssl dgst -sha256 -verify myrootca.publicKey.pem -signature sign.sha256 sign.txt
我想我知道如何正确表示我的 public 密钥和签名文件
sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL,
e, "key file");
sigbio = BIO_new_file(sigfile, "rb");
但找不到合适的 API 从这里继续
我遇到的问题是事先弄清楚签名的长度是多少,以便为签名分配位置,而签名必须事先了解 RSA 密钥大小和哈希类型
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;
}
我是 openssl 新手 API。
我的目标是验证我的 public 密钥是 "related" 我的隐藏私钥。
使用 openssl cli 的解决方案:
我有一个证书,私钥是隐藏的(在 HSM 中) 我有一个缓冲区:
echo "hello world!!!!" > sign.txt
使用以下命令我创建缓冲区的 sha256 签名类似于我的 HSM 将执行的操作:
openssl dgst -sha256 -sign myrootca.key.insecure -out sign.sha256 sign.txt
提取public密钥:
openssl x509 -pubkey -noout -in myrootca.crt > myrootca.publicKey.pem
验证 public 密钥:
openssl dgst -sha256 -verify myrootca.publicKey.pem -signature sign.sha256 sign.txt
我想我知道如何正确表示我的 public 密钥和签名文件
sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL,
e, "key file");
sigbio = BIO_new_file(sigfile, "rb");
但找不到合适的 API 从这里继续
我遇到的问题是事先弄清楚签名的长度是多少,以便为签名分配位置,而签名必须事先了解 RSA 密钥大小和哈希类型
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;
}