打印数字签名信息

时间:2014-06-29 21:14:22

标签: c++ visual-c++ digital-signature digital-certificate

在指定的标题中,我想将数字签名信息打印到控制台。这是我写的代码:

bool CheckDigSig(const std::wstring& filepath)
{
    bool rval = false;

    DWORD dwEncoding = 0;
    DWORD dwContentType = 0;
    DWORD dwFormatType = 0;
    HCERTSTORE hStore = NULL;
    HCRYPTMSG hMsg = NULL;

    // Get message handle and store handle from the signed file.
    BOOL fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
        filepath.c_str(),
        CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
        CERT_QUERY_FORMAT_FLAG_BINARY,
        0,
        &dwEncoding,
        &dwContentType,
        &dwFormatType,
        &hStore,
        &hMsg,
        NULL);
    if (!fResult)
        return false;

    DWORD singer_info_size = 0;
    // Get signer information size.
    fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &singer_info_size);
    if (!fResult)
    {
        CryptMsgClose(hMsg);
        CertCloseStore(hStore, 0);
        return false;
    }

    // Allocate memory for signer information.
    std::vector<byte> signer_info_data(singer_info_size);
    PCMSG_SIGNER_INFO pSignerInfo = reinterpret_cast<PCMSG_SIGNER_INFO>(signer_info_data.data());

    // Get Signer Information.
    fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &singer_info_size);
    if (fResult)
    {
        //pSignerInfo->Issuer;
        //pSignerInfo->SerialNumber;
    }

    CryptMsgClose(hMsg);
    CertCloseStore(hStore, 0);
    return rval;
}

我想在最后打印这两个变量(现在称赞): pSignerInfo-&GT;发行人; pSignerInfo-&GT;的SerialNumber;

我不知道怎样才能使它成为可读格式,比如字符串,字节或字符数组。你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

这篇文章http://support.microsoft.com/kb/323809包含您需要的代码。这是一个简短的片段:

    // Get Issuer name.
    if (!(CertGetNameString(pCertContext, 
                            CERT_NAME_SIMPLE_DISPLAY_TYPE,
                            CERT_NAME_ISSUER_FLAG,
                            NULL,
                            szName,
                            dwData)))
    // ...

显然,那里有更多的代码,涵盖了这项任务的各个角落。包括打印SerialNumber以及