验证程序签名
来源:互联网 发布:淘宝上药店 编辑:程序博客网 时间: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;}
- 验证程序签名
- web接口签名验证程序
- java程序实现加密解密以及签名和签名验证
- 使用JAVA实现签名验证示例程序
- 验证签名
- 微信小程序用户数据的签名验证和加解密
- web签名验证程序【跨服务器、中文字符签名方法】-php为例
- 给程序集添加数字签名和验证程序集的数据签名
- Java Applet签名验证
- PKI_SVS签名验证服务器
- SVS签名验证是怎么回事?
- GPG签名验证错误
- Java Applet签名验证
- Java Applet签名验证
- XML签名验证
- Android签名验证简介
- RSA-签名与验证
- Android 签名验证
- 乱码问题
- Android编程之另一种原因造成Cursor未关闭错误
- 10个重要的算法C语言实现源代码
- WinRT 介绍
- Unity Tweak Tool:MyUnity
- 验证程序签名
- c语言静态库.h文件的注意事项(一个编程菜鸟记录自己的编程路程)
- 三层架构详解
- eclipse创建webx工程
- 前言——记录Java学习的每一步
- MapWindow 相关
- MySQL中UNION和UNION ALL的使用
- esp
- MQTT推送