[2020]C++验证文件数字签名(无内存泄露版本) huoji 数字签名,C++ 2020-10-29 1290 次浏览 96 次点赞 傻逼百度 一堆复制粘贴的帖子 这些帖子无一例外都有内存泄露. 给个没内存泄露的自己的修改版: ```cpp LONG CdigitalSig::GetSoftSign(PCWSTR v_pszFilePath, char* v_pszSign, int v_iBufSize) { VMProtectBeginVirtualization("GetSoftSign"); //首先判断参数是否正确 if (v_pszFilePath == NULL) return -1; HCERTSTORE hStore = NULL; HCRYPTMSG hMsg = NULL; PCCERT_CONTEXT pCertContext = NULL; BOOL bResult; DWORD dwEncoding, dwContentType, dwFormatType; PCMSG_SIGNER_INFO pSignerInfo = NULL; PCMSG_SIGNER_INFO pCounterSignerInfo = NULL; DWORD dwSignerInfo; CERT_INFO CertInfo; SYSTEMTIME st; LONG lRet; DWORD dwDataSize = 0; char chTemp[MAX_PATH] = { 0 }; do { //从签名文件中获取存储句柄 bResult = CryptQueryObject( CERT_QUERY_OBJECT_FILE, //指示要查询的对象的类型 v_pszFilePath, CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, CERT_QUERY_FORMAT_FLAG_BINARY, 0, &dwEncoding, &dwContentType, &dwFormatType, &hStore, &hMsg, NULL ); if (!bResult) { lRet = -1; break; } //获取签名信息所需的缓冲区大小 bResult = CryptMsgGetParam( hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &dwSignerInfo ); if (!bResult) { lRet = -1; break; } //分配缓冲区 pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo); if (pSignerInfo == NULL) { lRet = -1; break; } //获取签名信息 bResult = CryptMsgGetParam( hMsg, CMSG_SIGNER_INFO_PARAM, 0, pSignerInfo, &dwSignerInfo ); if (!bResult) { lRet = -1; break; } CertInfo.Issuer = pSignerInfo->Issuer; CertInfo.SerialNumber = pSignerInfo->SerialNumber; pCertContext = CertFindCertificateInStore( hStore, CRYPT_ASN_ENCODING, 0, CERT_FIND_SUBJECT_CERT, (PVOID)&CertInfo, NULL ); if (pCertContext == NULL) { lRet = -1; break; } //获取数字键名 //没有给定缓冲区,那么说明只要获取下需要的长度 if (v_pszSign == NULL) { dwDataSize = CertGetNameString( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0 ); if (dwDataSize != 0) { lRet = dwDataSize; } else { lRet = -1; } break; } if (!(CertGetNameStringA( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, v_pszSign, v_iBufSize ) ) ) { lRet = -1; break; } lRet = 0; } while (FALSE); if (pSignerInfo != NULL) { LocalFree((HLOCAL)pSignerInfo); } if (hStore != NULL) CertCloseStore(hStore, 0); if (hMsg != NULL) CryptMsgClose(hMsg); if (pCertContext != NULL) CertFreeCertificateContext(pCertContext); return lRet; VMProtectEnd(); } ``` 本文由 huoji 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。 点赞 96
还不快抢沙发