验证邮件签名是否产生HEADER TOO LONG错误

时间:2019-02-25 11:01:24

标签: c++ openssl rsa

背景

我正在尝试使用openssl验证给定二进制文件的签名。二进制散列的实际签名由第三方完成。第三方和我都有相同的确切证书-他们向我发送了证书。

我已通过运行openssl x509 -noout -text -inform DER -in CERT_PATH验证了证书的运行状况。这样可以正确显示证书的内容。

到目前为止,以下是我的代码-我基于openssl Wiki示例here

static std::vector<char> ReadAllBytes(char const* filename){
    std::ifstream ifs(filename, std::ios::binary|std::ios::ate);
    std::ifstream::pos_type pos = ifs.tellg();

    std::vector<char>  result(pos);

    ifs.seekg(0, std::ios::beg);
    ifs.read(result.data(), pos);

    return result;
}

int main(int ac, const char * av[]) {

    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();

    // most of error check omitted for brevity

    auto foundBinBytes = ReadAllBytes("BINARY_PATH");

    auto foundSgnBytes = ReadAllBytes("SIGNATURE_PATH");

    auto foundCertBytes = ReadAllBytes("CERT_PATH");

    ERR_clear_error();
    BIO *b = NULL;
    X509 *c;
    b = BIO_new_mem_buf(reinterpret_cast<const unsigned char *>(foundCertBytes.data()), foundCertBytes.size());

    c = d2i_X509_bio(b, NULL);
    EVP_MD_CTX* ctx = NULL;
    ctx = EVP_MD_CTX_create();

    const EVP_MD* md = EVP_get_digestbyname("SHA256");

    int rc = EVP_DigestInit_ex(ctx, md, NULL);

    EVP_PKEY *k = NULL;
    k = X509_get_pubkey(c);

    rc = EVP_DigestVerifyInit(ctx, NULL, md, NULL, k);

    rc = EVP_DigestVerifyUpdate(ctx, reinterpret_cast<const unsigned char *>(foundBinBytes.data()), foundBinBytes.size());

    ERR_clear_error();
    rc = EVP_DigestVerifyFinal(ctx, reinterpret_cast<const unsigned char *>(foundSgnBytes.data()), foundSgnBytes.size());

    ERR_print_errors_fp( stdout );
    // openssl free functions omitted
    if(ctx) {
        EVP_MD_CTX_destroy(ctx);
        ctx = NULL;
    }

    return 0;
}

问题

运行此代码会产生以下错误:

4511950444:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:/.../crypto/asn1/asn1_lib.c:152:
4511950444:error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header:/.../crypto/asn1/tasn_dec.c:1152:
4511950444:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:/.../crypto/asn1/tasn_dec.c:314:Type=X509_SIG

问题

我的设置/代码有什么问题?我一路上错过了什么吗?

1 个答案:

答案 0 :(得分:0)

读取文件时,您永远不会检查错误。您在那里可能有错误(文件“ CERT_PATH”是否存在?您具有读取权限吗?...)。

如果无法读取“ CERT_PATH”,则foundCertBytes.data()是一个空字节数组,这将解释随后的错误。

相关问题