使用openssl验证ECDSA签名时出现问题

使用openssl验证ECDSA签名时出现问题,openssl,digital-signature,Openssl,Digital Signature,我正在使用openssl验证智能卡的ECDSA签名。 然而,我有两张卡,遇到了麻烦。 挑战发送到卡上,签名,然后发回。使用公钥验证签名 我以前在这里贴过一个帖子,我问如何将我从卡片上得到的普通签名转换成DER格式。这个问题已经解决了,我让它工作了。但签名不会验证所有卡(EVP\u DigestVerifyFinal()返回0)。 我用另一个系统验证了来自卡的签名确实可以用公钥验证。然而,我无法查看该系统的代码 下面是验证代码,底部是转换签名的功能 我不是密码专家。例如,我是否缺少需要进入EVP\

我正在使用openssl验证智能卡的ECDSA签名。 然而,我有两张卡,遇到了麻烦。 挑战发送到卡上,签名,然后发回。使用公钥验证签名

我以前在这里贴过一个帖子,我问如何将我从卡片上得到的普通签名转换成DER格式。这个问题已经解决了,我让它工作了。但签名不会验证所有卡(
EVP\u DigestVerifyFinal()
返回0)。 我用另一个系统验证了来自卡的签名确实可以用公钥验证。然而,我无法查看该系统的代码

下面是验证代码,底部是转换签名的功能

我不是密码专家。例如,我是否缺少需要进入
EVP\u DigestVerifyInit()
的设置?是否始终需要使用EVP_sha1()对其进行初始化? 谢谢你的回答

bool doAA(std::vector<unsigned char> oRND, std::vector<unsigned char> oSIG, std::vector<unsigned char> oPKEY)
{
    EVP_PKEY* m_pPubkey;
    BIO* keyBio = BIO_new_mem_buf(&oPKEY[0], (int)oPKEY.size());
    m_pPubkey = d2i_PUBKEY_bio(keyBio, NULL);       
    BIO_free(keyBio);

    if (NULL == m_pPubkey)
    {
        std::cout << "Error Public key is NULL" << std::endl;
        return false;
    }

    // check if ECDSA signature and then verify
    int nRes = 0;
    int type = EVP_PKEY_base_id(m_pPubkey);
    if (type == EVP_PKEY_EC)
    {
        EVP_MD_CTX* ctx = EVP_MD_CTX_create();

        nRes = EVP_DigestVerifyInit(ctx, NULL, EVP_sha1(), NULL, m_pPubkey);
        if (1 != nRes)
        {
            EVP_MD_CTX_cleanup(ctx);
            std::cout << "Error EVP_DigestVerifyInit" << std::endl;
            return false;
        }

        nRes = EVP_DigestVerifyUpdate(ctx, &oRND[0], oRND.size());
        if (1 != nRes)
        {
            EVP_MD_CTX_cleanup(ctx);
            std::cout << "Error EVP_DigestVerifyUpdate" << std::endl;
            return false;
        }

        ConvertPlainToDERSignature(oSIG);

        nRes = EVP_DigestVerifyFinal(ctx, &oSIG[0], oSIG.size());
        EVP_MD_CTX_cleanup(ctx);
        if (nRes < 0)
        {
            std::cout << "Error EVP_DigestVerifyFinal failed" << std::endl;
            return false;
        }
        else if (nRes == 0)
        {
            std::cout << "Error EVP_DigestVerifyFinal: Signature could not be verified" << std::endl;
            return false;
        }
    }
    else
    {
        std::cout << "Not a ECDSA Signature" << std::endl;
        return false;
    }

    return nRes == 1;
}

void ConvertPlainToDERSignature(std::vector<unsigned char>& raSignature)
{
    ECDSA_SIG* ec_sig = ECDSA_SIG_new();
    int nLen = raSignature.size() / 2;
    if (NULL == BN_bin2bn(&raSignature[0], nLen, (ec_sig->r)))
    {
        std::cout << "OpensslError " << std::string(ERR_error_string(ERR_get_error(), NULL)) << std::endl;
    }
    std::cout << "ECDSA Signature R: " << std::string(BN_bn2hex(ec_sig->r)) << std::endl;;

    if (NULL == BN_bin2bn(&raSignature[0] + nLen, nLen, (ec_sig->s)))
    {
        std::cout << "OpensslError " << std::string(ERR_error_string(ERR_get_error(), NULL)) << std::endl;
    }
    std::cout << "ECDSA Signature S: " << std::string(BN_bn2hex(ec_sig->s)) << std::endl;;

    int sig_size = i2d_ECDSA_SIG(ec_sig, NULL);
    unsigned char *sig_bytes = new unsigned char[sig_size];
    unsigned char *p;
    memset(sig_bytes, 6, sig_size);

    p = sig_bytes;
    int new_sig_size = i2d_ECDSA_SIG(ec_sig, &p);

    raSignature.clear();

    raSignature.resize(new_sig_size);

    memcpy(&raSignature[0], sig_bytes, new_sig_size);
    delete[] sig_bytes;
}
bool-doAA(std::vector-oRND,std::vector-oSIG,std::vector-oPKEY)
{
执行副总裁;
BIO*keyBio=BIO_new_mem_buf(&oPKEY[0],(int)oPKEY.size());
m_pPubkey=d2i_PUBKEY_bio(keyBio,NULL);
无生物素(keyBio);
if(NULL==m_pPubkey)
{
std::cout“使用openssl验证ECDSA签名的问题”-您从未说明问题是什么。问题是什么?“使用openssl验证ECDSA签名的问题”-您从未说明问题是什么。问题是什么?