unit TrustCheck;

interface

uses
Windows,SysUtils,jwaWinTrust,JwaWinCrypt; function CheckFileTrust(const FileName: WideString; var Signner: WideString): Boolean; implementation const
WINTRUST_ACTION_GENERIC_VERIFY_V2: TGUID = '{00AAC56B-CD44-11d0-8CC2-00C04FC295EE}'; function CryptCATAdminAcquireContext(var HCatAdmin: THandle; pgSubsystem: PGUID; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminReleaseContext(hAdmin: THANDLE; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminCalcHashFromFileHandle(hFile: THANDLE; var dwSize: DWORD; buf: PByte; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminEnumCatalogFromHash(hAdmin: THANDLE; pbHash: PByte; pHashSize: DWORD; dwFlags: DWORD; phPrevCatInfo: PHandle): THANDLE; stdcall;external 'wintrust.dll' ;
function CryptCATCatalogInfoFromContext(hCatInfo: THANDLE; psCatInfo: PWintrustCatalogInfo; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function CryptCATAdminReleaseCatalogContext(hAdmin: THANDLE; hCatInfo: THANDLE; dwFlags: DWORD): BOOL; stdcall; external 'wintrust.dll' ;
function WinVerifyTrust(hwnd: THANDLE; pgActionID: PGUID; pWintrustData: PWINTRUST_DATA): Longint; stdcall; external 'wintrust.dll' ; function bf2s(bf: PByte; len: Integer): WideString;
begin
Result := '';
while len > do
begin
Result := Result + IntToHex(bf^,);
Inc(bf);
Dec(len);
end;
end; function GetSignner(hWVTStateData: THANDLE): WideString;
var
provider: PCRYPT_PROVIDER_DATA;
signner: PCRYPT_PROVIDER_SGNR;
cert: PCRYPT_PROVIDER_CERT;
S: string;
i: Integer;
begin
provider := WTHelperProvDataFromStateData(hWVTStateData);
if provider = nil then
Exit;
signner := WTHelperGetProvSignerFromChain(provider,,False,);
if signner = nil then
Exit;
cert := WTHelperGetProvCertFromChain(signner, );
if cert = nil then
Exit;
i := CertGetNameString(cert.pCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, , nil, nil, );
SetLength(S,i);
CertGetNameString(cert.pCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, , nil, @s[], Length(s));
Result := S;
end; function CheckFileTrust(const FileName: WideString; var Signner: WideString): Boolean;
var
buf: array[..]of Byte;
cb: DWORD;
hAdmin: THandle;
hCtx: THandle;
hFile: THandle;
I,Ret: Integer;
S: WideString;
WTrustData: WINTRUST_DATA;
WTDFileInfo: TWintrustFileInfo;
CatalogInfo: TWintrustCatalogInfo;
WTDCatalogInfo: WINTRUST_CATALOG_INFO;
begin
Result := False;
Signner := '';
if not FileExists(FileName) then
Exit;
hAdmin := ;
hCtx := ;
hFile := INVALID_HANDLE_VALUE;
try
if not CryptCATAdminAcquireContext(hAdmin,nil,) then
Exit;
hFile := CreateFileW(PWideChar(FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,);
if hFile = INVALID_HANDLE_VALUE then
begin
I := GetLastError;
sleep(I * );
Exit;
end;
cb := SizeOf(buf);
if not CryptCATAdminCalcHashFromFileHandle(hFile,cb,@buf[],) then
Exit;
S := bf2s(@buf[],cb);
hCtx := CryptCATAdminEnumCatalogFromHash(hAdmin,@buf[],cb,,nil);
FillChar(WTrustData,SizeOf(WTrustData),); WTrustData.dwUIChoice := WTD_UI_NONE;
WTrustData.fdwRevocationChecks := WTD_REVOKE_NONE;
WTrustData.dwStateAction := WTD_STATEACTION_VERIFY;
WTrustData.dwProvFlags := WTD_REVOCATION_CHECK_NONE;
if hCtx = then
begin
FillChar(WTDFileInfo,SizeOf(WTDFileInfo),);
WTDFileInfo.cbStruct := SizeOf(WTDFileInfo);
WTDFileInfo.pcwszFilePath := PWideChar(FileName);
WTrustData.cbStruct := SizeOf(WTrustData);
WTrustData.dwUnionChoice := WTD_CHOICE_FILE;
WTrustData.InfoUnion.pFile := @WTDFileInfo;
end
else
begin
CryptCATCatalogInfoFromContext(hCtx, @CatalogInfo, );
FillChar(WTDCatalogInfo,SizeOf(WTDCatalogInfo),);
WTDCatalogInfo.cbStruct := SizeOf(WTDCatalogInfo);
WTDCatalogInfo.pcwszCatalogFilePath := CatalogInfo.pcwszCatalogFilePath;
WTDCatalogInfo.pcwszMemberFilePath := PWideChar(Filename);
WTDCatalogInfo.pcwszMemberTag := PWideChar(S);
WTrustData.cbStruct := SizeOf(WTrustData);
WTrustData.dwUnionChoice := WTD_CHOICE_CATALOG;
WTrustData.InfoUnion.pCatalog := @WTDCatalogInfo;
end;
Ret := WinVerifyTrust(INVALID_HANDLE_VALUE,@WINTRUST_ACTION_GENERIC_VERIFY_V2,@WTrustData);
Result := Ret = ;
if Result and (WTrustData.hWVTStateData > ) then
Signner := GetSignner(WTrustData.hWVTStateData);
WTrustData.dwStateAction := WTD_STATEACTION_CLOSE;
WinVerifyTrust(INVALID_HANDLE_VALUE,@WINTRUST_ACTION_GENERIC_VERIFY_V2,@WTrustData);
finally
if hCtx > then
CryptCATAdminReleaseCatalogContext(hAdmin,hCtx, );
if hAdmin <> then
CryptCATAdminReleaseContext(hAdmin,);
if hFile <> INVALID_HANDLE_VALUE then
CloseHandle(hFile);
end;
end; end.

delphi数字签名验证及能够获取数字签名文件信息(利用wintrust.dll的导出函数,翻译一下)的更多相关文章

  1. Delphi使用两种不同方法获取系统端口信息--(装载)

    Delphi使用两种方法获取windows系统的端口,还可测试发送消息,点击获取端口信息后,可依次得到如下信息:DCB结构大小.波特率大小.XON的临界值.XOFF的临界值.字符位数.奇偶检验位.停止 ...

  2. delphi 简单的删除字符串尾部数字的代码

    delphi  简单的删除字符串尾部数字的代码 方式一: function FilterShowName(const sName: String): String; var I: Integer; b ...

  3. 【PE结构】恶意代码数字签名验证

    说明 恶意代码数字签名验证功能,WinverityTrust.CryptQueryObject 代码实现 WinVerifyTrust //------------------------------ ...

  4. certbot 获取数字证书失效问题

    title: certbot 获取数字证书失效问题 author: Narule date: 2021-02-18 10:45:00 +0800 categories: [Technology^技术, ...

  5. NGK Global首尔站:内存是未来获取数字财富的新模式

    近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...

  6. list 分批导入db, 每1000条数据一批 , 从字符串中获取数字,小数, 版本号比较

    //这个有个弊端: 分组后分批导入, 是阻塞的,我没有导入完成,别人就不能导入, 这里可以优化成异步,线程池 public static void main(String[] args) { Rand ...

  7. 和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)

    转自http://blog.csdn.net/bluishglc/article/details/7585965 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统 ...

  8. 转!!通俗理解数字加密,数字签名,数字证书和https

    原博文地址:https://www.jianshu.com/p/4932cb1499bf 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应. ...

  9. 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain

    AToken数字货币钱包 超容易上手支持五大主流币种   互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载     国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...

随机推荐

  1. 一个简单的文本编辑器。(是在DEV C++下写的)

    //头文件// main.h #define CM_FILE_SAVEAS 9072 #define CM_FILE_EXIT 9071 #define CM_FILE_OPEN 9070 #defi ...

  2. Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角

    好了,前面说了那么多废话,最终要进入正题了(等等,敢情前面你都是在耍我们么?) 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blo ...

  3. CSS通用编码规范

    CSS通用编码规范 总结一部分前端编码规范,CSS部分先奉上,大多比较通用,应该是主流方式吧. 1 前言 本文档的目标是使 CSS 代码在团队中风格保持一致,容易被理解和被维护. 尽管本文档是针对 C ...

  4. 对Devexpress ASP.NET组件的一些看法

    使用.net开发的应该都熟悉DevExpress这套组件,强大的功能,显著提高开发效率和提升用户体验. 不过好像大都用winform, 说起用asp.net组件来开发webform,很多人开口就说慢, ...

  5. Random类短时间大量随机重复的问题

    先声明一下,我是在那篇文章上看到的解决方法: http://dl.download.csdn.net/down10/20141103/4b173214e41ff3207305c2470524b0f3. ...

  6. html 浮动元素

    在CSS布局中分为内联元素(display:inline)和块状元素(display:block),块状元素默认会占据一行,可设置高度宽度以及边距,而内联元素不会也不能设置.常见的内联元素有:a.sp ...

  7. Redis的入门Demo(java)

    java代码部分参考了:http://www.runoob.com/redis/redis-java.html 在java中使用Redis,需要引入Redis驱动,就是jedis-2.1.0.jar, ...

  8. java 写文件解析

    import java.io.File; import java.io.FileOutputStream; import java.io.*; public class FileTest { publ ...

  9. javascript 作用域链

    最近想整理一下js执行代码的一些知识,如果有出错的地方还请指正. 执行环境(Execution Context) 所有的javascript代码都是在一个执行环境中被执行的.它只是一种机制,用来完成运 ...

  10. bzoj 1046 : [HAOI2007]上升序列 dp

    题目链接 1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3620  Solved: 1236[Submit] ...