简体   繁体   English

打印数字签名信息

[英]print digital signature infos

As in the title specified, I'd like to print the digital signature information out to the console. 像指定的标题一样,我想将数字签名信息打印到控制台。 Here is the code I wrote: 这是我写的代码:

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;
}

I would like to print those two variables at the end (which is now commendted): pSignerInfo->Issuer; 我想在最后打印这两个变量(现在值得推荐):pSignerInfo-> Issuer; pSignerInfo->SerialNumber; pSignerInfo->的SerialNumber;

I've got no idea how could I make it readable format, like a string, byte or char array. 我不知道如何使它成为可读的格式,例如字符串,字节或char数组。 Could you help me with it? 你能帮我吗?

This article http://support.microsoft.com/kb/323809 has the code you need. 本文http://support.microsoft.com/kb/323809提供了您所需的代码。 Here's a short snippet of it: 这是它的一小段:

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

There's more code in there, obviously, covering all the various corners of this task. 显然,其中包含更多代码,涵盖了此任务的所有各个方面。 Including printing the SerialNumber as well 包括打印SerialNumber

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM