验证程序签名

来源:互联网 发布:淘宝上药店 编辑:程序博客网 时间:2024/04/27 05:49

参考自:

http://msdn.microsoft.com/en-us/library/aa382384.aspx
http://support.microsoft.com/kb/323809/nl

#include <Windows.h>#include <WinTrust.h>#include <Softpub.h>#include <wincrypt.h>#pragma comment (lib, "wintrust")#pragma comment(lib, "crypt32.lib")bool VerifyEmbeddedSignature(const wchar_t * srcfile){    WINTRUST_FILE_INFO fileData;    memset(&fileData, 0, sizeof(fileData));    fileData.cbStruct = sizeof(fileData);    fileData.pcwszFilePath = srcfile;    GUID wvt_policy_guid = WINTRUST_ACTION_GENERIC_VERIFY_V2;    WINTRUST_DATA wtrust_data;    memset(&wtrust_data, 0, sizeof(wtrust_data));    wtrust_data.cbStruct = sizeof(wtrust_data);    wtrust_data.dwUIChoice = WTD_UI_NONE;    wtrust_data.fdwRevocationChecks = WTD_REVOKE_NONE;    wtrust_data.dwUnionChoice = WTD_CHOICE_FILE;    wtrust_data.pFile = &fileData;    LONG lStatus = WinVerifyTrust(NULL,        &wvt_policy_guid, &wtrust_data);    _tprintf_s(_T("verify failed! %d\n"), lStatus);    return lStatus == ERROR_SUCCESS;}bool CheckSignerInfo(const wchar_t *src_file, const wchar_t *issuer_name, const wchar_t *subj_name){    if(src_file == NULL || issuer_name == NULL || subj_name == NULL)        return false;    bool ret = false;    DWORD dwEncoding = 0, dwCotentType = 0, dwFormatType = 0;    DWORD dwData = 0;    HCERTSTORE hStore = NULL;    HCRYPTMSG hMsg = NULL;    PCMSG_SIGNER_INFO pSignerInfo = NULL;    DWORD dwSignerInfo = 0;    CERT_INFO CertInfo;    PCCERT_CONTEXT pCertContext = NULL;    WCHAR *lpIssuerName = NULL;    WCHAR *lpSubjName = NULL;    if(!CryptQueryObject(CERT_QUERY_OBJECT_FILE,        src_file,        CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,        CERT_QUERY_FORMAT_FLAG_BINARY,        0,        &dwEncoding,        &dwCotentType,        &dwFormatType,        &hStore,        &hMsg,        NULL))    {        goto finish_do;    }    if(!CryptMsgGetParam(hMsg,        CMSG_SIGNER_INFO_PARAM,        0,        NULL,        &dwSignerInfo))    {        goto finish_do;    }    pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo);    if(pSignerInfo == NULL)    {        goto finish_do;    }    if(!CryptMsgGetParam(hMsg,        CMSG_SIGNER_INFO_PARAM,        0,        (PVOID)pSignerInfo,        &dwSignerInfo))    {        goto finish_do;    }    //    memset(&CertInfo, 0, sizeof(CertInfo));    CertInfo.Issuer = pSignerInfo->Issuer;    CertInfo.SerialNumber = pSignerInfo->SerialNumber;    pCertContext = CertFindCertificateInStore(hStore,        X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,        0,        CERT_FIND_SUBJECT_CERT,        (PVOID)&CertInfo,        NULL);    if(pCertContext == NULL)    {        goto finish_do;    }    //    dwData = CertGetNameStringW(pCertContext,        CERT_NAME_SIMPLE_DISPLAY_TYPE,        CERT_NAME_ISSUER_FLAG,        NULL,        NULL,        0);    if(dwData == 0)    {        goto finish_do;    }    lpIssuerName = (WCHAR*)LocalAlloc(LPTR, dwData * sizeof(WCHAR));    if(lpIssuerName == NULL)    {        goto finish_do;    }    dwData = CertGetNameStringW(pCertContext,        CERT_NAME_SIMPLE_DISPLAY_TYPE,        CERT_NAME_ISSUER_FLAG,        NULL,        lpIssuerName,        dwData);    if(dwData == 0)    {        goto finish_do;    }    //    dwData = CertGetNameStringW(pCertContext,        CERT_NAME_SIMPLE_DISPLAY_TYPE,        0,        NULL,        NULL,        0);    if(dwData == 0)    {        goto finish_do;    }    lpSubjName = (WCHAR*)LocalAlloc(LPTR, dwData * sizeof(WCHAR));    if(lpSubjName == NULL)    {        goto finish_do;    }    dwData = CertGetNameStringW(pCertContext,        CERT_NAME_SIMPLE_DISPLAY_TYPE,        0,        NULL,        lpSubjName,        dwData);    if(dwData == 0)    {        goto finish_do;    }    ret = ( (_wcsicmp(lpIssuerName, issuer_name) == 0) && (_wcsicmp(lpSubjName, subj_name) == 0) );finish_do:    if(lpSubjName != NULL)    {        LocalFree(lpSubjName);        lpSubjName = NULL;    }    if(lpIssuerName != NULL)    {        LocalFree(lpIssuerName);        lpIssuerName = NULL;    }    if(pCertContext != NULL)    {        CertFreeCertificateContext(pCertContext);        pCertContext = NULL;    }    if(pSignerInfo != NULL)    {        LocalFree(pSignerInfo);        pSignerInfo = NULL;    }    if(hMsg != NULL)    {        CryptMsgClose(hMsg);        hMsg = NULL;    }    if(hStore != NULL)    {        CertCloseStore(hStore, 0);        hStore = NULL;    }    return ret;}

原创粉丝点击