spiegel-keyman/common/windows/delphi/ext/jwa/Win32API/JwaWintrust.pas
2022-06-06 08:13:37 +10:00

518 lines
16 KiB
ObjectPascal

{******************************************************************************}
{ }
{ Windows trust API interface Unit for Object Pascal }
{ }
{ Portions created by Microsoft are Copyright (C) 1995-2008 Microsoft }
{ Corporation. All Rights Reserved. }
{ }
{ Portions created by XXXXXXXXXXXXXXXXX are Copyright (C) xxxx-xxxx }
{ XXXXXXXXXXXXXXXXX. All Rights Reserved. }
{ }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project JEDI }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net }
{ }
{ The contents of this file are used with permission, subject to the Mozilla }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at }
{ http://www.mozilla.org/MPL/MPL-1.1.html }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License. }
{ }
{ Alternatively, the contents of this file may be used under the terms of the }
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
{ provisions of the LGPL License are applicable instead of those above. }
{ If you wish to allow use of your version of this file only under the terms }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting the provisions above and }
{ replace them with the notice and other provisions required by the LGPL }
{ License. If you do not delete the provisions above, a recipient may use }
{ your version of this file under either the MPL or the LGPL License. }
{ }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{ }
{******************************************************************************}
{$IFNDEF JWA_OMIT_SECTIONS}
unit JwaWintrust;
{$ENDIF JWA_OMIT_SECTIONS}
{$HPPEMIT ''}
{$HPPEMIT '#include "WinTrust.h"'}
{$HPPEMIT ''}
{$IFNDEF JWA_OMIT_SECTIONS}
{$I ..\Includes\JediAPILib.inc}
{$IFDEF DELPHI6_UP}
{$ALIGN 8}
{$ELSE}
{$ALIGN+} //WARNING: Incorrect alignment in this Delphi
{$ENDIF DELPHI6_UP}
interface
{$IFDEF JWA_WINDOWS}
uses JwaWindows;
{$ELSE}
uses JwaWinType, JwaWinCrypt;
{$ENDIF JWA_WINDOWS}
{$ENDIF JWA_OMIT_SECTIONS}
{$IFNDEF JWA_IMPLEMENTATIONSECTION}
type
PWintrustFileInfo = ^TWintrustFileInfo;
{$EXTERNALSYM PWINTRUST_FILE_INFO}
PWINTRUST_FILE_INFO = ^WINTRUST_FILE_INFO_;
{$EXTERNALSYM WINTRUST_FILE_INFO_}
WINTRUST_FILE_INFO_ = packed record
cbStruct: DWORD;
pcwszFilePath: LPCWSTR;
hFile: THandle;
pgKnownSubject: PGUID;
end;
{$EXTERNALSYM WINTRUST_FILE_INFO}
WINTRUST_FILE_INFO = WINTRUST_FILE_INFO_;
TWintrustFileInfo = WINTRUST_FILE_INFO_;
PWintrustCatalogInfo = ^TWintrustCatalogInfo;
{$EXTERNALSYM PWINTRUST_CATALOG_INFO}
PWINTRUST_CATALOG_INFO = ^WINTRUST_CATALOG_INFO_;
{$EXTERNALSYM WINTRUST_CATALOG_INFO_}
WINTRUST_CATALOG_INFO_ = packed record
cbStruct: DWORD;
dwCatalogVersion: DWORD;
pcwszCatalogFilePath: LPCWSTR;
pcwszMemberTag: LPCWSTR;
pcwszMemberFilePath: LPCWSTR;
hMemberFile: THandle;
pbCalculatedFileHash: PByte;
cbCalculatedFileHash: DWORD;
pcCatalogContext: PCCTL_CONTEXT;
end;
{$EXTERNALSYM WINTRUST_CATALOG_INFO}
WINTRUST_CATALOG_INFO = WINTRUST_CATALOG_INFO_;
TWintrustCatalogInfo = WINTRUST_CATALOG_INFO_;
PWintrustBlobInfo = ^TWintrustBlobInfo;
{$EXTERNALSYM PWINTRUST_BLOB_INFO}
PWINTRUST_BLOB_INFO = ^WINTRUST_BLOB_INFO_;
{$EXTERNALSYM WINTRUST_BLOB_INFO_}
WINTRUST_BLOB_INFO_ = packed record
cbStruct: DWORD;
gSubject: TGUID;
pcwszDisplayName: LPCWSTR;
cbMemObject: DWORD;
pbMemObject: PByte;
cbMemSignedMsg: DWORD;
pbMemSignedMsg: PByte;
end;
{$EXTERNALSYM WINTRUST_BLOB_INFO}
WINTRUST_BLOB_INFO = WINTRUST_BLOB_INFO_;
TWintrustBlobInfo = WINTRUST_BLOB_INFO_;
PWintrustSgnrInfo = ^TWintrustSgnrInfo;
{$EXTERNALSYM PWINTRUST_SGNR_INFO}
PWINTRUST_SGNR_INFO = ^WINTRUST_SGNR_INFO_;
{$EXTERNALSYM WINTRUST_SGNR_INFO_}
WINTRUST_SGNR_INFO_ = packed record
cbStruct: DWORD;
pcwszDisplayName: LPCWSTR;
psSignerInfo: PCMSG_SIGNER_INFO;
chStores: DWORD;
pahStores: PHCERTSTORE;
end;
{$EXTERNALSYM WINTRUST_SGNR_INFO}
WINTRUST_SGNR_INFO = WINTRUST_SGNR_INFO_;
TWintrustSgnrInfo = WINTRUST_SGNR_INFO_;
PWintrustCertInfo = ^TWintrustCertInfo;
{$EXTERNALSYM PWINTRUST_CERT_INFO}
PWINTRUST_CERT_INFO = ^WINTRUST_CERT_INFO_;
{$EXTERNALSYM WINTRUST_CERT_INFO_}
WINTRUST_CERT_INFO_ = packed record
cbStruct: DWORD;
pcwszDisplayName: LPCWSTR;
psCertContext: PCERT_CONTEXT;
chStores: DWORD;
pahStores: PHCERTSTORE;
dwFlags: DWORD;
psftVerifyAsOf: PFILETIME;
end;
{$EXTERNALSYM WINTRUST_CERT_INFO}
WINTRUST_CERT_INFO = WINTRUST_CERT_INFO_;
TWintrustCertInfo = WINTRUST_CERT_INFO_;
const
{$EXTERNALSYM WTCI_DONT_OPEN_STORES}
WTCI_DONT_OPEN_STORES = 1;
{$EXTERNALSYM WTCI_OPEN_ONLY_ROOT}
WTCI_OPEN_ONLY_ROOT = 2;
type
PWintrustData = ^TWintrustData;
{$EXTERNALSYM PWINTRUST_DATA}
PWINTRUST_DATA = ^WINTRUST_DATA;
{$EXTERNALSYM _WINTRUST_DATA}
_WINTRUST_DATA = packed record
cbStruct: DWORD;
pPolicyCallbackData: Pointer;
pSIPClientData: Pointer;
dwUIChoice: DWORD;
fdwRevocationChecks: DWORD;
dwUnionChoice: DWORD;
InfoUnion: record
case Integer of
0: (pFile: PWintrustFileInfo);
1: (pCatalog: PWintrustCatalogInfo);
2: (pBlob: PWintrustBlobInfo);
3: (pSgnr: PWintrustSgnrInfo);
4: (pCert: PWintrustCertInfo);
end;
dwStateAction: DWORD;
hWVTStateData: THandle;
pwszUrlReference: LPCWSTR;
dwProvFlags: DWORD;
dwUIContext: DWORD;
end;
{$EXTERNALSYM WINTRUST_DATA}
WINTRUST_DATA = _WINTRUST_DATA;
TWintrustData = _WINTRUST_DATA;
const
{$EXTERNALSYM WTD_UI_ALL}
WTD_UI_ALL = 1;
{$EXTERNALSYM WTD_UI_NONE}
WTD_UI_NONE = 2;
{$EXTERNALSYM WTD_UI_NOBAD}
WTD_UI_NOBAD = 3;
{$EXTERNALSYM WTD_UI_NOGOOD}
WTD_UI_NOGOOD = 4;
{$EXTERNALSYM WTD_REVOKE_NONE}
WTD_REVOKE_NONE = 0;
{$EXTERNALSYM WTD_REVOKE_WHOLECHAIN}
WTD_REVOKE_WHOLECHAIN = 1;
{$EXTERNALSYM WTD_CHOICE_FILE}
WTD_CHOICE_FILE = 1;
{$EXTERNALSYM WTD_CHOICE_CATALOG}
WTD_CHOICE_CATALOG = 2;
{$EXTERNALSYM WTD_CHOICE_BLOB}
WTD_CHOICE_BLOB = 3;
{$EXTERNALSYM WTD_CHOICE_SIGNER}
WTD_CHOICE_SIGNER = 4;
{$EXTERNALSYM WTD_CHOICE_CERT}
WTD_CHOICE_CERT = 5;
{$EXTERNALSYM WTD_STATEACTION_IGNORE}
WTD_STATEACTION_IGNORE = 0;
{$EXTERNALSYM WTD_STATEACTION_VERIFY}
WTD_STATEACTION_VERIFY = 1;
{$EXTERNALSYM WTD_STATEACTION_CLOSE}
WTD_STATEACTION_CLOSE = 2;
{$EXTERNALSYM WTD_STATEACTION_AUTO_CACHE}
WTD_STATEACTION_AUTO_CACHE = 3;
{$EXTERNALSYM WTD_STATEACTION_AUTO_CACHE_FLUSH}
WTD_STATEACTION_AUTO_CACHE_FLUSH = 4;
{$EXTERNALSYM WTD_PROV_FLAGS_MASK}
WTD_PROV_FLAGS_MASK = $FFFF;
{$EXTERNALSYM WTD_USE_IE4_TRUST_FLAG}
WTD_USE_IE4_TRUST_FLAG = 1;
{$EXTERNALSYM WTD_NO_IE4_CHAIN_FLAG}
WTD_NO_IE4_CHAIN_FLAG = 2;
{$EXTERNALSYM WTD_NO_POLICY_USAGE_FLAG}
WTD_NO_POLICY_USAGE_FLAG = 4;
{$EXTERNALSYM WTD_REVOCATION_CHECK_NONE}
WTD_REVOCATION_CHECK_NONE = $10;
{$EXTERNALSYM WTD_REVOCATION_CHECK_END_CERT}
WTD_REVOCATION_CHECK_END_CERT = $20;
{$EXTERNALSYM WTD_REVOCATION_CHECK_CHAIN}
WTD_REVOCATION_CHECK_CHAIN = $40;
{$EXTERNALSYM WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT}
WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = $80;
{$EXTERNALSYM WTD_SAFER_FLAG}
WTD_SAFER_FLAG = $100;
{$EXTERNALSYM WTD_HASH_ONLY_FLAG}
WTD_HASH_ONLY_FLAG = $200;
{$EXTERNALSYM WTD_USE_DEFAULT_OSVER_CHECK}
WTD_USE_DEFAULT_OSVER_CHECK = $400;
{$EXTERNALSYM WTD_LIFETIME_SIGNING_CHECK}
WTD_LIFETIME_SIGNING_CHECK = $800;
{$EXTERNALSYM WTD_CACHE_ONLY_URL_RETRIEVAL}
WTD_CACHE_ONLY_URL_RETRIEVAL = $1000;
{$EXTERNALSYM WTD_UI_CONTEXT_EXECUTE}
WTD_UI_CONTEXT_EXECUTE = 0;
{$EXTERNALSYM WTD_UI_CONTEXT_INSTALL}
WTD_UI_CONTEXT_INSTALL = 1;
type
PCRYPT_PROVIDER_PRIVDATA = ^CRYPT_PROVIDER_PRIVDATA;
_CRYPT_PROVIDER_PRIVDATA = packed record
cbStruct: DWORD;
gProviderID: GUID;
cbProvData: DWORD;
pvProvData: Pointer;
end;
CRYPT_PROVIDER_PRIVDATA = _CRYPT_PROVIDER_PRIVDATA;
PPROVDATA_SIP = ^PROVDATA_SIP;
_PROVDATA_SIP = packed record
cbStruct: DWORD;
gSubject: GUID;
//The following members are actually typed pointers. The
//corresponding structures are defined in mssip.h.
pSip: Pointer;
pCATSip: Pointer;
psSipSubjectInfo: Pointer;
psSipCATSubjectInfo: Pointer;
psIndirectData: Pointer;
end;
PROVDATA_SIP = _PROVDATA_SIP;
PCRYPT_PROVIDER_CERT = ^CRYPT_PROVIDER_CERT;
_CRYPT_PROVIDER_CERT = packed record
cbStruct: DWORD;
pCert: PCCERT_CONTEXT;
fCommercial: BOOL;
fTrustedRoot: BOOL;
fSelfSigned: BOOL;
fTestCert: BOOL;
dwRevokedReason: DWORD;
dwConfidence: DWORD;
dwError: DWORD;
pTrustListContext: PCTL_CONTEXT;
fTrustListSignerCert: BOOL;
pCtlContext: PCCTL_CONTEXT;
dwCtlError: DWORD;
fIsCyclic: BOOL;
pChainElement: PCERT_CHAIN_ELEMENT;
end;
CRYPT_PROVIDER_CERT = _CRYPT_PROVIDER_CERT;
PCRYPT_PROVIDER_SGNR = ^CRYPT_PROVIDER_SGNR;
_CRYPT_PROVIDER_SGNR = packed record
cbStruct: DWORD;
sftVerifyAsOf: FILETIME;
csCertChain: PCRYPT_PROVIDER_CERT;
dwSignerType: DWORD;
psSigner: PCMSG_SIGNER_INFO;
dwError: DWORD;
csCounterSigners: DWORD;
pasCounterSigners: PCRYPT_PROVIDER_SGNR;
pChainContext: PCCERT_CHAIN_CONTEXT;
end;
CRYPT_PROVIDER_SGNR = _CRYPT_PROVIDER_SGNR;
PCryptProviderData = ^TCryptProviderData;
PCRYPT_PROVIDER_DATA = ^CRYPT_PROVIDER_DATA;
_CRYPT_PROVIDER_DATA = packed record
cbStruct: DWORD;
pWintrustData: PWINTRUST_DATA;
fOpenedFile: BOOL;
hWndParent: HWND;
pgActionId: PGUID;
hProv: HCRYPTPROV;
dwError: DWORD;
dwRegSecuritySettings: DWORD;
dwRegPolicySettings: DWORD;
psPfns: Pointer; //actually a pointer to a _CRYPT_PROVIDER_FUNCTIONS
cdwTrustStepErrors: DWORD;
padwTrustStepErrors: PDWORD;
chStores: DWORD;
pahStores: PHCERTSTORE;
dwEncoding: DWORD;
hMsg: HCRYPTMSG;
csSigners: DWORD;
pasSigners: PCRYPT_PROVIDER_SGNR;
csProvPrivData: DWORD;
pasProvPrivData: PCRYPT_PROVIDER_PRIVDATA;
dwSubjectChoice: DWORD;
pPDSIP: PPROVDATA_SIP; //in C a union with one member
pszUsageOID: PAnsiChar;
fRecallWithState: BOOL;
sftSystemTime: FILETIME;
pszCTLSignerUsageOID: PAnsiChar;
dwProvFlags: DWORD;
dwFinalError: DWORD;
pRequestUsage: PCERT_USAGE_MATCH;
dwTrustPubSettings: DWORD;
dwUIStateFlags: DWORD;
end;
CRYPT_PROVIDER_DATA = _CRYPT_PROVIDER_DATA;
TCryptProviderData = _CRYPT_PROVIDER_DATA;
{$EXTERNALSYM WinVerifyTrust}
function WinVerifyTrust(hwnd: HWND; const pgActionID: TGUID; var pWinTrustData: _WINTRUST_DATA): LONG; stdcall;
{$EXTERNALSYM WTHelperGetProvSignerFromChain}
function WTHelperGetProvSignerFromChain(pProvData: PCRYPT_PROVIDER_DATA; idxSigner: DWORD; fCounterSigner: BOOL; idxCounterSigner: DWORD): PCRYPT_PROVIDER_SGNR; stdcall;
{$EXTERNALSYM WTHelperGetProvCertFromChain}
function WTHelperGetProvCertFromChain(pSgnr: PCRYPT_PROVIDER_SGNR; idxCert: DWORD): PCRYPT_PROVIDER_CERT; stdcall;
{$EXTERNALSYM WTHelperProvDataFromStateData}
function WTHelperProvDataFromStateData(hStateData: THandle): PCRYPT_PROVIDER_DATA; stdcall;
{$EXTERNALSYM WTHelperGetProvPrivateDataFromChain}
function WTHelperGetProvPrivateDataFromChain(pProvData: PCRYPT_PROVIDER_DATA; const pgProviderId: TGUID): PCRYPT_PROVIDER_PRIVDATA; stdcall;
{$EXTERNALSYM WTHelperCertIsSelfSigned}
function WTHelperCertIsSelfSigned(dwEncoding: DWORD; pCert: PCERT_INFO): BOOL; stdcall;
{$EXTERNALSYM WTHelperCertCheckValidSignature}
function WTHelperCertCheckValidSignature(pProvData: PCRYPT_PROVIDER_DATA): HRESULT; stdcall;
{$ENDIF JWA_IMPLEMENTATIONSECTION}
{$IFNDEF JWA_OMIT_SECTIONS}
implementation
uses JwaWinDllNames;
{$ENDIF JWA_OMIT_SECTIONS}
{$IFNDEF JWA_INTERFACESECTION}
{$IFNDEF JWA_INCLUDEMODE}
const
wintrust = 'wintrust.dll';
{$IFDEF UNICODE}
AWSuffix = 'W';
{$ELSE}
AWSuffix = 'A';
{$ENDIF UNICODE}
{$ENDIF JWA_INCLUDEMODE}
{$IFDEF DYNAMIC_LINK}
var
_WinVerifyTrust: Pointer;
function WinVerifyTrust;
begin
GetProcedureAddress(_WinVerifyTrust, wintrust, 'WinVerifyTrust');
asm
MOV ESP, EBP
POP EBP
JMP [_WinVerifyTrust]
end;
end;
var
_WTHelperGetProvSignerFromChain: Pointer;
function WTHelperGetProvSignerFromChain;
begin
GetProcedureAddress(_WTHelperGetProvSignerFromChain, wintrust, 'WTHelperGetProvSignerFromChain');
asm
MOV ESP, EBP
POP EBP
JMP [_WTHelperGetProvSignerFromChain]
end;
end;
var
_WTHelperGetProvCertFromChain: Pointer;
function WTHelperGetProvCertFromChain;
begin
GetProcedureAddress(_WTHelperGetProvCertFromChain, wintrust, 'WTHelperGetProvCertFromChain');
asm
MOV ESP, EBP
POP EBP
JMP [_WTHelperGetProvCertFromChain]
end;
end;
var
_WTHelperProvDataFromStateData: Pointer;
function WTHelperProvDataFromStateData;
begin
GetProcedureAddress(_WTHelperProvDataFromStateData, wintrust, 'WTHelperProvDataFromStateData');
asm
MOV ESP, EBP
POP EBP
JMP [_WTHelperProvDataFromStateData]
end;
end;
var
_WTHelperGetProvPrivateDataFromChain: Pointer;
function WTHelperGetProvPrivateDataFromChain;
begin
GetProcedureAddress(_WTHelperGetProvPrivateDataFromChain, wintrust, 'WTHelperGetProvPrivateDataFromChain');
asm
MOV ESP, EBP
POP EBP
JMP [_WTHelperGetProvPrivateDataFromChain]
end;
end;
var
_WTHelperCertIsSelfSigned: Pointer;
function WTHelperCertIsSelfSigned;
begin
GetProcedureAddress(_WTHelperCertIsSelfSigned, wintrust, 'WTHelperCertIsSelfSigned');
asm
MOV ESP, EBP
POP EBP
JMP [_WTHelperCertIsSelfSigned]
end;
end;
var
_WTHelperCertCheckValidSignature: Pointer;
function WTHelperCertCheckValidSignature;
begin
GetProcedureAddress(_WTHelperCertCheckValidSignature, wintrust, 'WTHelperCertCheckValidSignature');
asm
MOV ESP, EBP
POP EBP
JMP [_WTHelperCertCheckValidSignature]
end;
end;
{$ELSE}
function WinVerifyTrust; external wintrust name 'WinVerifyTrust';
function WTHelperGetProvSignerFromChain; external wintrust name 'WTHelperGetProvSignerFromChain';
function WTHelperGetProvCertFromChain; external wintrust name 'WTHelperGetProvCertFromChain';
function WTHelperProvDataFromStateData; external wintrust name 'WTHelperProvDataFromStateData';
function WTHelperGetProvPrivateDataFromChain; external wintrust name 'WTHelperGetProvPrivateDataFromChain';
function WTHelperCertIsSelfSigned; external wintrust name 'WTHelperCertIsSelfSigned';
function WTHelperCertCheckValidSignature; external wintrust name 'WTHelperCertCheckValidSignature';
{$ENDIF DYNAMIC_LINK}
{$ENDIF JWA_INTERFACESECTION}
{$IFNDEF JWA_OMIT_SECTIONS}
end.
{$ENDIF JWA_OMIT_SECTIONS}