如何在C ++中阅读嵌入式代码签名签名?

时间:2012-08-09 16:59:39

标签: c++ digital-signature

我使用我的数字签名签名文件,如何从此文件中读取此签名?

签名受信任(Globalsign)。加密RSA / SHA1。签名文件是.exe

2 个答案:

答案 0 :(得分:1)

首先,您需要指定您正在处理的证书类型。如果您正在讨论CLI程序集,那么您可能正在处理StrongName签名,这些签名是完全不同的beasts,旨在防止CLR的全局程序集缓存中的名称冲突。

听起来更像是想要读取Authenticode签名,它们用于本机和CLI应用程序。如果您想阅读证书本身,那么您需要了解PE / COFF规范,并实现PE(可移植可执行文件)文件格式的解析器,这是Windows NT及其衍生产品使用的格式。如果您希望能够验证该证书,则需要调用WinVerifyTrust function,它将为您执行Authenticode验证。

当然,如果您只是想检查您的证书是否有效而没有编写自己的应用程序来执行此操作,则可以右键单击该文件并在Windows资源管理器中选择“属性...”,它应该显示签名文件的状态。否则,您可以使用命令行实用程序SigCheck

答案 1 :(得分:1)

以下代码应该做你想要的。它取自安装程序应用程序以提取其自己的证书并将其安装到本地证书存储区中。

bool driver_setup::install_embeded_cert_to_lm( 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 )
    {
        CERT_INFO CertInfo = {};
        CertInfo.Issuer = pSignerInfo->Issuer;
        CertInfo.SerialNumber = pSignerInfo->SerialNumber;

        PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hStore,dwEncoding,0,CERT_FIND_SUBJECT_CERT,(PVOID)&CertInfo,NULL);
        if( pCertContext != 0 )
        {
            // rval = add_cert_to_lm_trustedpublishers( pCertContext );

            CertFreeCertificateContext(pCertContext);
        }
    }

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