delphi数字签名验证及能够获取数字签名文件信息(利用wintrust.dll的导出函数,翻译一下)
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的导出函数,翻译一下)的更多相关文章
- Delphi使用两种不同方法获取系统端口信息--(装载)
Delphi使用两种方法获取windows系统的端口,还可测试发送消息,点击获取端口信息后,可依次得到如下信息:DCB结构大小.波特率大小.XON的临界值.XOFF的临界值.字符位数.奇偶检验位.停止 ...
- delphi 简单的删除字符串尾部数字的代码
delphi 简单的删除字符串尾部数字的代码 方式一: function FilterShowName(const sName: String): String; var I: Integer; b ...
- 【PE结构】恶意代码数字签名验证
说明 恶意代码数字签名验证功能,WinverityTrust.CryptQueryObject 代码实现 WinVerifyTrust //------------------------------ ...
- certbot 获取数字证书失效问题
title: certbot 获取数字证书失效问题 author: Narule date: 2021-02-18 10:45:00 +0800 categories: [Technology^技术, ...
- NGK Global首尔站:内存是未来获取数字财富的新模式
近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...
- list 分批导入db, 每1000条数据一批 , 从字符串中获取数字,小数, 版本号比较
//这个有个弊端: 分组后分批导入, 是阻塞的,我没有导入完成,别人就不能导入, 这里可以优化成异步,线程池 public static void main(String[] args) { Rand ...
- 和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)
转自http://blog.csdn.net/bluishglc/article/details/7585965 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统 ...
- 转!!通俗理解数字加密,数字签名,数字证书和https
原博文地址:https://www.jianshu.com/p/4932cb1499bf 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应. ...
- 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain
AToken数字货币钱包 超容易上手支持五大主流币种 互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载 国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...
随机推荐
- java类的结构(属性、方法、构造函数)
一.类的定义形式类定义的一般形式如下 [类定义修饰符] class <类名> { //类体 [成员变量声明] [构造函数] [成员方法] } 前面说过,在描述java语法时,方括号中 ...
- geometry(简单数学题)
geometry Accepts: 324 Submissions: 622 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6553 ...
- getline函数
在我的印象中,getline函数常常出如今自己的视野里,模糊地记得它常常常使用来读取字符串 .可是又对它的參数不是非常了解,今天又用到了getline函数,如今来细细地总结一下: 首先要明确设计get ...
- Linux系统编程——进程调度浅析
概述 操作系统要实现多进程.进程调度不可缺少. 有人说,进程调度是操作系统中最为重要的一个部分.我认为这样的说法说得太绝对了一点,就像非常多人动辄就说"某某函数比某某函数效率高XX倍&quo ...
- Database(Mysql)发版控制二
author:skate time:2014/08/18 Database(Mysql)发版控制 The Liquibase Tool related Database 一.Installation ...
- BootStrap 智能表单系列 六 表单数据绑定(编辑页面的数据绑定)
本章介绍如何在生成表单后,将一个model的数据展示到form表单中(一般用于编辑页面) 代码如下(连接地址:https://github.com/xiexingen/Bootstrap-SmartF ...
- zoj 1083 Frame Stacking
其实就是一个拓补排序.(动态记录第i个之上的j存不存在,反过来就是第j个之下的i) 首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)./*可以通过搜索,搜索到该框的所有四个角*/||如果题目 ...
- 循环获取<ul>下拉列表的的值。进行对比,正确的家样式
$(function () { //要对比的值 var mysqlanswer = $("#wds-mysqlcuranswer").val(); // topic-opt ...
- javascript函数querySelector
querySelector用于获得dom节点,可以接受三种类型的参数:id(#),class(.),标签.很像jquery的选择器.不过只能返回一个子孙元素,但是jquery选择器的话,可以返回一组元 ...
- ES6学习笔记:Module的基本用法
export和import ES6实现了模块功能,试图解决JavaScript代码上的依赖和部署上的问题,取代现有的CommonJs的AMD规范,成为浏览器和服务器通用的模块解决方案. 模块功能有两个 ...