JwaWinCrypt.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:773k
源码类别:

Windows编程

开发平台:

Delphi

  1.   PCryptProtectPromptStruct = PCRYPTPROTECT_PROMPTSTRUCT;
  2. //
  3. // base provider action
  4. //
  5. const
  6.   CRYPTPROTECT_DEFAULT_PROVIDER: GUID = (
  7.     D1:$df9d8cd0; D2:$1501; D3:$11d1; D4:($8c, $7a, $00, $c0, $4f, $c2, $97, $eb));
  8.   {$EXTERNALSYM CRYPTPROTECT_DEFAULT_PROVIDER}
  9. //
  10. // CryptProtect PromptStruct dwPromtFlags
  11. //
  12. //
  13. // prompt on unprotect
  14.   CRYPTPROTECT_PROMPT_ON_UNPROTECT = $1; // 1<<0
  15.   {$EXTERNALSYM CRYPTPROTECT_PROMPT_ON_UNPROTECT}
  16. //
  17. // prompt on protect
  18.   CRYPTPROTECT_PROMPT_ON_PROTECT = $2; // 1<<1
  19.   {$EXTERNALSYM CRYPTPROTECT_PROMPT_ON_PROTECT}
  20.   CRYPTPROTECT_PROMPT_RESERVED   = $04; // reserved, do not use.
  21.   {$EXTERNALSYM CRYPTPROTECT_PROMPT_RESERVED}
  22. //
  23. // only allow strong variant UI protection (user supplied password currently).
  24.   CRYPTPROTECT_PROMPT_STRONG = $08; // 1<<3
  25.   {$EXTERNALSYM CRYPTPROTECT_PROMPT_STRONG}
  26. //
  27. // CryptProtectData and CryptUnprotectData dwFlags
  28. //
  29. // for remote-access situations where ui is not an option
  30. // if UI was specified on protect or unprotect operation, the call
  31. // will fail and GetLastError() will indicate ERROR_PASSWORD_RESTRICTION
  32.   CRYPTPROTECT_UI_FORBIDDEN = $1;
  33.   {$EXTERNALSYM CRYPTPROTECT_UI_FORBIDDEN}
  34. //
  35. // per machine protected data -- any user on machine where CryptProtectData
  36. // took place may CryptUnprotectData
  37.   CRYPTPROTECT_LOCAL_MACHINE = $4;
  38.   {$EXTERNALSYM CRYPTPROTECT_LOCAL_MACHINE}
  39. //
  40. // force credential synchronize during CryptProtectData()
  41. // Synchronize is only operation that occurs during this operation
  42.   CRYPTPROTECT_CRED_SYNC = $8;
  43.   {$EXTERNALSYM CRYPTPROTECT_CRED_SYNC}
  44. // flags reserved for system use
  45.   CRYPTPROTECT_FIRST_RESERVED_FLAGVAL = $0FFFFFFF;
  46.   {$EXTERNALSYM CRYPTPROTECT_FIRST_RESERVED_FLAGVAL}
  47.   CRYPTPROTECT_LAST_RESERVED_FLAGVAL  = DWORD($FFFFFFFF);
  48.   {$EXTERNALSYM CRYPTPROTECT_LAST_RESERVED_FLAGVAL}
  49. //
  50. // flags specific to base provider
  51. //
  52. function CryptProtectData(pDataIn: PDATA_BLOB; szDataDescr: LPCWSTR;
  53.   pOptionalEntropy: PDATA_BLOB; pvReserved: PVOID;
  54.   pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB): BOOL; stdcall;
  55. {$EXTERNALSYM CryptProtectData}
  56. function CryptUnprotectData(pDataIn: PDATA_BLOB; ppszDataDescr: LPLPWSTR;
  57.   pOptionalEntropy: PDATA_BLOB; pvReserved: PVOID;
  58.   pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB): BOOL; stdcall;
  59. {$EXTERNALSYM CryptUnprotectData}
  60. //+=========================================================================
  61. //  Helper functions to build certificates
  62. //==========================================================================
  63. //+-------------------------------------------------------------------------
  64. //
  65. // Builds a self-signed certificate and returns a PCCERT_CONTEXT representing
  66. // the certificate. A hProv must be specified to build the cert context.
  67. //
  68. // pSubjectIssuerBlob is the DN for the certifcate. If an alternate subject
  69. // name is desired it must be specified as an extension in the pExtensions
  70. // parameter. pSubjectIssuerBlob can NOT be NULL, so minimually an empty DN
  71. // must be specified.
  72. //
  73. // By default:
  74. // pKeyProvInfo - The CSP is queried for the KeyProvInfo parameters. Only the Provider,
  75. // Provider Type and Container is queried. Many CSPs don't support these
  76. // queries and will cause a failure. In such cases the pKeyProvInfo
  77. // must be specified (RSA BASE works fine).
  78. //
  79. // pSignatureAlgorithm - will default to SHA1RSA
  80. // pStartTime will default to the current time
  81. // pEndTime will default to 1 year
  82. // pEntensions will be empty.
  83. //
  84. // The returned PCCERT_CONTEXT will reference the private keys by setting the
  85. // CERT_KEY_PROV_INFO_PROP_ID. However, if this property is not desired specify the
  86. // CERT_CREATE_SELFSIGN_NO_KEY_INFO in dwFlags.
  87. //
  88. // If the cert being built is only a dummy placeholder cert for speed it may not
  89. // need to be signed. Signing of the cert is skipped if CERT_CREATE_SELFSIGN_NO_SIGN
  90. // is specified in dwFlags.
  91. //
  92. //--------------------------------------------------------------------------
  93. function CertCreateSelfSignCertificate(hProv: HCRYPTPROV;
  94.   pSubjectIssuerBlob: PCERT_NAME_BLOB; dwFlags: DWORD;
  95.   pKeyProvInfo: PCRYPT_KEY_PROV_INFO; pSignatureAlgorithm: PCRYPT_ALGORITHM_IDENTIFIER;
  96.   pStartTime, pEndTime: PSYSTEMTIME; pExtensions: PCERT_EXTENSIONS): PCCERT_CONTEXT; stdcall;
  97. {$EXTERNALSYM CertCreateSelfSignCertificate}
  98. const
  99.   CERT_CREATE_SELFSIGN_NO_SIGN     = 1;
  100.   {$EXTERNALSYM CERT_CREATE_SELFSIGN_NO_SIGN}
  101.   CERT_CREATE_SELFSIGN_NO_KEY_INFO = 2;
  102.   {$EXTERNALSYM CERT_CREATE_SELFSIGN_NO_KEY_INFO}
  103. //+=========================================================================
  104. //  Key Identifier Property Data Structures and APIs
  105. //==========================================================================
  106. //+-------------------------------------------------------------------------
  107. //  Get the property for the specified Key Identifier.
  108. //
  109. //  The Key Identifier is the SHA1 hash of the encoded CERT_PUBLIC_KEY_INFO.
  110. //  The Key Identifier for a certificate can be obtained by getting the
  111. //  certificate's CERT_KEY_IDENTIFIER_PROP_ID. The
  112. //  CryptCreateKeyIdentifierFromCSP API can be called to create the Key
  113. //  Identifier from a CSP Public Key Blob.
  114. //
  115. //  A Key Identifier can have the same properties as a certificate context.
  116. //  CERT_KEY_PROV_INFO_PROP_ID is the property of most interest.
  117. //  For CERT_KEY_PROV_INFO_PROP_ID, pvData points to a CRYPT_KEY_PROV_INFO
  118. //  structure. Elements pointed to by fields in the pvData structure follow the
  119. //  structure. Therefore, *pcbData will exceed the size of the structure.
  120. //
  121. //  If CRYPT_KEYID_ALLOC_FLAG is set, then, *pvData is updated with a
  122. //  pointer to allocated memory. LocalFree() must be called to free the
  123. //  allocated memory.
  124. //
  125. //  By default, searches the CurrentUser's list of Key Identifiers.
  126. //  CRYPT_KEYID_MACHINE_FLAG can be set to search the LocalMachine's list
  127. //  of Key Identifiers. When CRYPT_KEYID_MACHINE_FLAG is set, pwszComputerName
  128. //  can also be set to specify the name of a remote computer to be searched
  129. //  instead of the local machine.
  130. //--------------------------------------------------------------------------
  131. function CryptGetKeyIdentifierProperty(pKeyIdentifier: PCRYPT_HASH_BLOB;
  132.   dwPropId: DWORD; dwFlags: DWORD; pwszComputerName: LPCWSTR; pvReserved: Pointer;
  133.   pvData: Pointer; var pcbData: DWORD): BOOL; stdcall;
  134. {$EXTERNALSYM CryptGetKeyIdentifierProperty}
  135. // When the following flag is set, searches the LocalMachine instead of the
  136. // CurrentUser. This flag is applicable to all the KeyIdentifierProperty APIs.
  137. const
  138.   CRYPT_KEYID_MACHINE_FLAG = $00000020;
  139.   {$EXTERNALSYM CRYPT_KEYID_MACHINE_FLAG}
  140. // When the following flag is set, *pvData is updated with a pointer to
  141. // allocated memory. LocalFree() must be called to free the allocated memory.
  142.   CRYPT_KEYID_ALLOC_FLAG = $00008000;
  143.   {$EXTERNALSYM CRYPT_KEYID_ALLOC_FLAG}
  144. //+-------------------------------------------------------------------------
  145. //  Set the property for the specified Key Identifier.
  146. //
  147. //  For CERT_KEY_PROV_INFO_PROP_ID pvData points to the
  148. //  CRYPT_KEY_PROV_INFO data structure. For all other properties, pvData
  149. //  points to a CRYPT_DATA_BLOB.
  150. //
  151. //  Setting pvData == NULL, deletes the property.
  152. //
  153. //  Set CRYPT_KEYID_MACHINE_FLAG to set the property for a LocalMachine
  154. //  Key Identifier. Set pwszComputerName, to select a remote computer.
  155. //
  156. //  If CRYPT_KEYID_DELETE_FLAG is set, the Key Identifier and all its
  157. //  properties is deleted.
  158. //
  159. //  If CRYPT_KEYID_SET_NEW_FLAG is set, the set fails if the property already
  160. //  exists. For an existing property, FALSE is returned with LastError set to
  161. //  CRYPT_E_EXISTS.
  162. //--------------------------------------------------------------------------
  163. function CryptSetKeyIdentifierProperty(pKeyIdentifier: PCRYPT_HASH_BLOB;
  164.   dwPropId: DWORD; dwFlags: DWORD; pwszComputerName: LPCWSTR; pvReserved: Pointer;
  165.   pvData: Pointer): BOOL; stdcall;
  166. {$EXTERNALSYM CryptSetKeyIdentifierProperty}
  167. // When the following flag is set, the Key Identifier and all its properties
  168. // are deleted.
  169. const
  170.   CRYPT_KEYID_DELETE_FLAG = $00000010;
  171.   {$EXTERNALSYM CRYPT_KEYID_DELETE_FLAG}
  172. // When the following flag is set, the set fails if the property already
  173. // exists.
  174.   CRYPT_KEYID_SET_NEW_FLAG = $00002000;
  175.   {$EXTERNALSYM CRYPT_KEYID_SET_NEW_FLAG}
  176. //+-------------------------------------------------------------------------
  177. //  For CERT_KEY_PROV_INFO_PROP_ID, rgppvData[] points to a
  178. //  CRYPT_KEY_PROV_INFO.
  179. //
  180. //  Return FALSE to stop the enumeration.
  181. //--------------------------------------------------------------------------
  182. type
  183.   PFN_CRYPT_ENUM_KEYID_PROP = function (pKeyIdentifier: PCRYPT_HASH_BLOB;
  184.     dwFlags: DWORD; pvReserved: Pointer; pvArg: Pointer; cProp: DWORD;
  185.     rgdwPropId: LPDWORD; rgpvData: Pointer; rgcbData: LPDWORD): BOOL; stdcall;
  186.   {$EXTERNALSYM PFN_CRYPT_ENUM_KEYID_PROP}
  187.   PFnCryptEnumKeyIdProp = PFN_CRYPT_ENUM_KEYID_PROP;
  188. //+-------------------------------------------------------------------------
  189. //  Enumerate the Key Identifiers.
  190. //
  191. //  If pKeyIdentifier is NULL, enumerates all Key Identifers. Otherwise,
  192. //  calls the callback for the specified KeyIdentifier. If dwPropId is
  193. //  0, calls the callback with all the properties. Otherwise, only calls
  194. //  the callback with the specified property (cProp = 1).
  195. //  Furthermore, when dwPropId is specified, skips KeyIdentifiers not
  196. //  having the property.
  197. //
  198. //  Set CRYPT_KEYID_MACHINE_FLAG to enumerate the LocalMachine
  199. //  Key Identifiers. Set pwszComputerName, to enumerate Key Identifiers on
  200. //  a remote computer.
  201. //--------------------------------------------------------------------------
  202. function CryptEnumKeyIdentifierProperties(pKeyIdentifier: PCRYPT_HASH_BLOB;
  203.   dwPropId: DWORD; dwFlags: DWORD; pwszComputerName: LPCWSTR; pvReserved: Pointer;
  204.   pvArg: Pointer; pfnEnum: PFN_CRYPT_ENUM_KEYID_PROP): BOOL; stdcall;
  205. {$EXTERNALSYM CryptEnumKeyIdentifierProperties}
  206. //+-------------------------------------------------------------------------
  207. //  Create a KeyIdentifier from the CSP Public Key Blob.
  208. //
  209. //  Converts the CSP PUBLICKEYSTRUC into a X.509 CERT_PUBLIC_KEY_INFO and
  210. //  encodes. The encoded CERT_PUBLIC_KEY_INFO is SHA1 hashed to obtain
  211. //  the Key Identifier.
  212. //
  213. //  By default, the pPubKeyStruc->aiKeyAlg is used to find the appropriate
  214. //  public key Object Identifier. pszPubKeyOID can be set to override
  215. //  the default OID obtained from the aiKeyAlg.
  216. //--------------------------------------------------------------------------
  217. function CryptCreateKeyIdentifierFromCSP(dwCertEncodingType: DWORD;
  218.   pszPubKeyOID: LPCSTR; pPubKeyStruc: PPUBLICKEYSTRUC; cbPubKeyStruc: DWORD;
  219.   dwFlags: DWORD; pvReserved: Pointer; pbHash: LPBYTE; pcbHash: DWORD): BOOL; stdcall;
  220. {$EXTERNALSYM CryptCreateKeyIdentifierFromCSP}
  221. //+=========================================================================
  222. //  Certificate Chaining Infrastructure
  223. //==========================================================================
  224. //
  225. // The chain engine defines the store namespace and cache partitioning for
  226. // the Certificate Chaining infrastructure.  A default chain engine
  227. // is defined for the process which uses all default system stores e.g.
  228. // Root, CA, Trust, for chain building and caching.  If an application
  229. // wishes to define its own store namespace or have its own partitioned
  230. // cache then it can create its own chain engine.  It is advisable to create
  231. // a chain engine at application startup and use it throughout the lifetime
  232. // of the application in order to get optimal caching behavior
  233. //
  234. type
  235.   HCERTCHAINENGINE = HANDLE;
  236.   {$EXTERNALSYM HCERTCHAINENGINE}
  237. const
  238.   HCCE_CURRENT_USER  = HCERTCHAINENGINE(0);
  239.   {$EXTERNALSYM HCCE_CURRENT_USER}
  240.   HCCE_LOCAL_MACHINE = HCERTCHAINENGINE($1);
  241.   {$EXTERNALSYM HCCE_LOCAL_MACHINE}
  242. //
  243. // Create a certificate chain engine.
  244. //
  245. //
  246. // Configuration parameters for the certificate chain engine
  247. //
  248. //      hRestrictedRoot - restrict the root store (must be a subset of "Root")
  249. //
  250. //      hRestrictedTrust - restrict the store for CTLs
  251. //
  252. //      hRestrictedOther - restrict the store for certs and CRLs
  253. //
  254. //      cAdditionalStore, rghAdditionalStore - additional stores
  255. //
  256. //      NOTE: The algorithm used to define the stores for the engine is as
  257. //            follows:
  258. //
  259. //            hRoot = hRestrictedRoot or System Store "Root"
  260. //
  261. //            hTrust = hRestrictedTrust or hWorld (defined later)
  262. //
  263. //            hOther = hRestrictedOther or (hRestrictedTrust == NULL) ? hWorld :
  264. //                     hRestrictedTrust + hWorld
  265. //
  266. //            hWorld = hRoot + "CA" + "My" + "Trust" + rghAdditionalStore
  267. //
  268. //      dwFlags  - flags
  269. //
  270. //          CERT_CHAIN_CACHE_END_CERT - information will be cached on
  271. //                                      the end cert as well as the other
  272. //                                      certs in the chain
  273. //
  274. //          CERT_CHAIN_THREAD_STORE_SYNC - use separate thread for store syncs
  275. //                                         and related cache updates
  276. //
  277. //          CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL - don't hit the wire to get
  278. //                                                URL based objects
  279. //
  280. //      dwUrlRetrievalTimeout - timeout for wire based URL object retrievals
  281. //
  282. const
  283.   CERT_CHAIN_CACHE_END_CERT           = $00000001;
  284.   {$EXTERNALSYM CERT_CHAIN_CACHE_END_CERT}
  285.   CERT_CHAIN_THREAD_STORE_SYNC        = $00000002;
  286.   {$EXTERNALSYM CERT_CHAIN_THREAD_STORE_SYNC}
  287.   CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL = $00000004;
  288.   {$EXTERNALSYM CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL}
  289.   CERT_CHAIN_USE_LOCAL_MACHINE_STORE  = $00000008;
  290.   {$EXTERNALSYM CERT_CHAIN_USE_LOCAL_MACHINE_STORE}
  291.   CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE = $00000010;
  292.   {$EXTERNALSYM CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE}
  293. type
  294.   PCERT_CHAIN_ENGINE_CONFIG = ^CERT_CHAIN_ENGINE_CONFIG;
  295.   {$EXTERNALSYM PCERT_CHAIN_ENGINE_CONFIG}
  296.   _CERT_CHAIN_ENGINE_CONFIG = record
  297.     cbSize: DWORD;
  298.     hRestrictedRoot: HCERTSTORE;
  299.     hRestrictedTrust: HCERTSTORE;
  300.     hRestrictedOther: HCERTSTORE;
  301.     cAdditionalStore: DWORD;
  302.     rghAdditionalStore: PHCERTSTORE;
  303.     dwFlags: DWORD;
  304.     dwUrlRetrievalTimeout: DWORD;
  305.     MaximumCachedCertificates: DWORD;
  306.     CycleDetectionModulus: DWORD;
  307.   end;
  308.   {$EXTERNALSYM _CERT_CHAIN_ENGINE_CONFIG}
  309.   CERT_CHAIN_ENGINE_CONFIG = _CERT_CHAIN_ENGINE_CONFIG;
  310.   {$EXTERNALSYM CERT_CHAIN_ENGINE_CONFIG}
  311.   TCertChainEngineConfig = CERT_CHAIN_ENGINE_CONFIG;
  312.   PCertChainEngineConfig = PCERT_CHAIN_ENGINE_CONFIG;
  313. function CertCreateCertificateChainEngine(pConfig: PCERT_CHAIN_ENGINE_CONFIG;
  314.   var phChainEngine: HCERTCHAINENGINE): BOOL; stdcall;
  315. {$EXTERNALSYM CertCreateCertificateChainEngine}
  316. //
  317. // Free a certificate trust engine
  318. //
  319. procedure CertFreeCertificateChainEngine(hChainEngine: HCERTCHAINENGINE); stdcall;
  320. {$EXTERNALSYM CertFreeCertificateChainEngine}
  321. //
  322. // Resync the certificate chain engine.  This resync's the stores backing
  323. // the engine and updates the engine caches.
  324. //
  325. function CertResyncCertificateChainEngine(hChainEngine: HCERTCHAINENGINE): BOOL; stdcall;
  326. {$EXTERNALSYM CertResyncCertificateChainEngine}
  327. //
  328. // When an application requests a certificate chain, the data structure
  329. // returned is in the form of a CERT_CHAIN_CONTEXT.  This contains
  330. // an array of CERT_SIMPLE_CHAIN where each simple chain goes from
  331. // an end cert to a self signed cert and the chain context connects simple
  332. // chains via trust lists.  Each simple chain contains the chain of
  333. // certificates, summary trust information about the chain and trust information
  334. // about each certificate element in the chain.
  335. //
  336. //
  337. // Trust status bits
  338. //
  339. type
  340.   PCERT_TRUST_STATUS = ^CERT_TRUST_STATUS;
  341.   {$EXTERNALSYM PCERT_TRUST_STATUS}
  342.   _CERT_TRUST_STATUS = record
  343.     dwErrorStatus: DWORD;
  344.     dwInfoStatus: DWORD;
  345.   end;
  346.   {$EXTERNALSYM _CERT_TRUST_STATUS}
  347.   CERT_TRUST_STATUS = _CERT_TRUST_STATUS;
  348.   {$EXTERNALSYM CERT_TRUST_STATUS}
  349.   TCertTrustStatus = CERT_TRUST_STATUS;
  350.   PCertTrustStatus = PCERT_TRUST_STATUS;
  351. //
  352. // The following are error status bits
  353. //
  354. // These can be applied to certificates and chains
  355. const
  356.   CERT_TRUST_NO_ERROR                  = $00000000;
  357.   {$EXTERNALSYM CERT_TRUST_NO_ERROR}
  358.   CERT_TRUST_IS_NOT_TIME_VALID         = $00000001;
  359.   {$EXTERNALSYM CERT_TRUST_IS_NOT_TIME_VALID}
  360.   CERT_TRUST_IS_NOT_TIME_NESTED        = $00000002;
  361.   {$EXTERNALSYM CERT_TRUST_IS_NOT_TIME_NESTED}
  362.   CERT_TRUST_IS_REVOKED                = $00000004;
  363.   {$EXTERNALSYM CERT_TRUST_IS_REVOKED}
  364.   CERT_TRUST_IS_NOT_SIGNATURE_VALID    = $00000008;
  365.   {$EXTERNALSYM CERT_TRUST_IS_NOT_SIGNATURE_VALID}
  366.   CERT_TRUST_IS_NOT_VALID_FOR_USAGE    = $00000010;
  367.   {$EXTERNALSYM CERT_TRUST_IS_NOT_VALID_FOR_USAGE}
  368.   CERT_TRUST_IS_UNTRUSTED_ROOT         = $00000020;
  369.   {$EXTERNALSYM CERT_TRUST_IS_UNTRUSTED_ROOT}
  370.   CERT_TRUST_REVOCATION_STATUS_UNKNOWN = $00000040;
  371.   {$EXTERNALSYM CERT_TRUST_REVOCATION_STATUS_UNKNOWN}
  372.   CERT_TRUST_IS_CYCLIC                 = $00000080;
  373.   {$EXTERNALSYM CERT_TRUST_IS_CYCLIC}
  374. // These can be applied to chains only
  375.   CERT_TRUST_IS_PARTIAL_CHAIN           = $00010000;
  376.   {$EXTERNALSYM CERT_TRUST_IS_PARTIAL_CHAIN}
  377.   CERT_TRUST_CTL_IS_NOT_TIME_VALID      = $00020000;
  378.   {$EXTERNALSYM CERT_TRUST_CTL_IS_NOT_TIME_VALID}
  379.   CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID = $00040000;
  380.   {$EXTERNALSYM CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID}
  381.   CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE = $00080000;
  382.   {$EXTERNALSYM CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE}
  383. //
  384. // The following are info status bits
  385. //
  386. // These can be applied to certificates only
  387.   CERT_TRUST_HAS_EXACT_MATCH_ISSUER = $00000001;
  388.   {$EXTERNALSYM CERT_TRUST_HAS_EXACT_MATCH_ISSUER}
  389.   CERT_TRUST_HAS_KEY_MATCH_ISSUER   = $00000002;
  390.   {$EXTERNALSYM CERT_TRUST_HAS_KEY_MATCH_ISSUER}
  391.   CERT_TRUST_HAS_NAME_MATCH_ISSUER  = $00000004;
  392.   {$EXTERNALSYM CERT_TRUST_HAS_NAME_MATCH_ISSUER}
  393.   CERT_TRUST_IS_SELF_SIGNED         = $00000008;
  394.   {$EXTERNALSYM CERT_TRUST_IS_SELF_SIGNED}
  395. // These can be applied to chains only
  396.   CERT_TRUST_IS_COMPLEX_CHAIN = $00010000;
  397.   {$EXTERNALSYM CERT_TRUST_IS_COMPLEX_CHAIN}
  398. //
  399. // Each certificate context in a simple chain has a corresponding chain element
  400. // in the simple chain context
  401. //
  402. // dwErrorStatus has CERT_TRUST_IS_REVOKED, pRevocationInfo set
  403. // dwErrorStatus has CERT_TRUST_REVOCATION_STATUS_UNKNOWN, pRevocationInfo set
  404. //
  405. // BUGBUG: Note that the post processing revocation supported in the first
  406. //         version only sets cbSize and dwRevocationResult.  Everything else
  407. //         is NULL
  408. //
  409. //
  410. // Revocation Information
  411. //
  412. type
  413.   PCERT_REVOCATION_INFO = ^CERT_REVOCATION_INFO;
  414.   {$EXTERNALSYM PCERT_REVOCATION_INFO}
  415.   _CERT_REVOCATION_INFO = record
  416.     cbSize: DWORD;
  417.     dwRevocationResult: DWORD;
  418.     pszRevocationOid: LPCSTR;
  419.     pvOidSpecificInfo: LPVOID;
  420.   end;
  421.   {$EXTERNALSYM _CERT_REVOCATION_INFO}
  422.   CERT_REVOCATION_INFO = _CERT_REVOCATION_INFO;
  423.   {$EXTERNALSYM CERT_REVOCATION_INFO}
  424.   TCertRevocationInfo = CERT_REVOCATION_INFO;
  425.   PCertRevocationInfo = PCERT_REVOCATION_INFO;
  426. //
  427. // Trust List Information
  428. //
  429.   PCERT_TRUST_LIST_INFO = ^CERT_TRUST_LIST_INFO;
  430.   {$EXTERNALSYM PCERT_TRUST_LIST_INFO}
  431.   _CERT_TRUST_LIST_INFO = record
  432.     cbSize: DWORD;
  433.     pCtlEntry: PCTL_ENTRY;
  434.     pCtlContext: PCCTL_CONTEXT;
  435.   end;
  436.   {$EXTERNALSYM _CERT_TRUST_LIST_INFO}
  437.   CERT_TRUST_LIST_INFO = _CERT_TRUST_LIST_INFO;
  438.   {$EXTERNALSYM CERT_TRUST_LIST_INFO}
  439.   TCertTrustListInfo = CERT_TRUST_LIST_INFO;
  440.   PCertTrustListInfo = PCERT_TRUST_LIST_INFO;
  441. //
  442. // Chain Element
  443. //
  444.   PCERT_CHAIN_ELEMENT = ^CERT_CHAIN_ELEMENT;
  445.   {$EXTERNALSYM PCERT_CHAIN_ELEMENT}
  446.   _CERT_CHAIN_ELEMENT = record
  447.     cbSize: DWORD;
  448.     pCertContext: PCCERT_CONTEXT;
  449.     TrustStatus: CERT_TRUST_STATUS;
  450.     pRevocationInfo: PCERT_REVOCATION_INFO;
  451.   end;
  452.   {$EXTERNALSYM _CERT_CHAIN_ELEMENT}
  453.   CERT_CHAIN_ELEMENT = _CERT_CHAIN_ELEMENT;
  454.   {$EXTERNALSYM CERT_CHAIN_ELEMENT}
  455.   TCertChainElement = CERT_CHAIN_ELEMENT;
  456.   PCertChainElement = PCERT_CHAIN_ELEMENT;
  457. //
  458. // The simple chain is an array of chain elements and a summary trust status
  459. // for the chain
  460. //
  461. // rgpElements[0] is the end certificate chain element
  462. //
  463. // rgpElements[cElement-1] is the self-signed "root" certificate chain element
  464. //
  465.   PCERT_SIMPLE_CHAIN = ^CERT_SIMPLE_CHAIN;
  466.   {$EXTERNALSYM PCERT_SIMPLE_CHAIN}
  467.   _CERT_SIMPLE_CHAIN = record
  468.     cbSize: DWORD;
  469.     TrustStatus: CERT_TRUST_STATUS;
  470.     cElement: DWORD;
  471.     rgpElement: PCERT_CHAIN_ELEMENT;
  472.     pTrustListInfo: PCERT_TRUST_LIST_INFO;
  473.   end;
  474.   {$EXTERNALSYM _CERT_SIMPLE_CHAIN}
  475.   CERT_SIMPLE_CHAIN = _CERT_SIMPLE_CHAIN;
  476.   {$EXTERNALSYM CERT_SIMPLE_CHAIN}
  477.   TCertSimpleChain = CERT_SIMPLE_CHAIN;
  478.   PCertSimpleChain = PCERT_SIMPLE_CHAIN;
  479. //
  480. // And the chain context contains an array of simple chains and summary trust
  481. // status for all the connected simple chains
  482. //
  483. // rgpChains[0] is the end certificate simple chain
  484. //
  485. // rgpChains[cChain-1] is the final (possibly trust list signer) chain which
  486. // ends in a certificate which is contained in the root store
  487. //
  488.   PCERT_CHAIN_CONTEXT = ^CERT_CHAIN_CONTEXT;
  489.   {$EXTERNALSYM PCERT_CHAIN_CONTEXT}
  490.   _CERT_CHAIN_CONTEXT = record
  491.     cbSize: DWORD;
  492.     TrustStatus: CERT_TRUST_STATUS;
  493.     cChain: DWORD;
  494.     rgpChain: PCERT_SIMPLE_CHAIN;
  495.   end;
  496.   {$EXTERNALSYM _CERT_CHAIN_CONTEXT}
  497.   CERT_CHAIN_CONTEXT = _CERT_CHAIN_CONTEXT;
  498.   {$EXTERNALSYM CERT_CHAIN_CONTEXT}
  499.   TCertChainContext = CERT_CHAIN_CONTEXT;
  500.   PCertChainContext = PCERT_CHAIN_CONTEXT;
  501.   PCCERT_CHAIN_CONTEXT = ^CERT_CHAIN_CONTEXT;
  502.   {$EXTERNALSYM PCCERT_CHAIN_CONTEXT}
  503.   PPCCERT_CHAIN_CONTEXT = ^PCERT_CHAIN_CONTEXT;
  504.   {$NODEFINE PPCCERT_CHAIN_CONTEXT}
  505. //
  506. // When building a chain, the there are various parameters used for finding
  507. // issuing certificates and trust lists.  They are identified in the
  508. // following structure
  509. //
  510. // Default usage match type is AND with value zero
  511. const
  512.   USAGE_MATCH_TYPE_AND = $00000000;
  513.   {$EXTERNALSYM USAGE_MATCH_TYPE_AND}
  514.   USAGE_MATCH_TYPE_OR  = $00000001;
  515.   {$EXTERNALSYM USAGE_MATCH_TYPE_OR}
  516. type
  517.   PCERT_USAGE_MATCH = ^CERT_USAGE_MATCH;
  518.   {$EXTERNALSYM PCERT_USAGE_MATCH}
  519.   _CERT_USAGE_MATCH = record
  520.     dwType: DWORD;
  521.     Usage: CERT_ENHKEY_USAGE;
  522.   end;
  523.   {$EXTERNALSYM _CERT_USAGE_MATCH}
  524.   CERT_USAGE_MATCH = _CERT_USAGE_MATCH;
  525.   {$EXTERNALSYM CERT_USAGE_MATCH}
  526.   TCertUsageMatch = CERT_USAGE_MATCH;
  527.   PCertUsageMatch = PCERT_USAGE_MATCH;
  528.   PCTL_USAGE_MATCH = ^CTL_USAGE_MATCH;
  529.   {$EXTERNALSYM PCTL_USAGE_MATCH}
  530.   _CTL_USAGE_MATCH = record
  531.     dwType: DWORD;
  532.     Usage: CTL_USAGE;
  533.   end;
  534.   {$EXTERNALSYM _CTL_USAGE_MATCH}
  535.   CTL_USAGE_MATCH = _CTL_USAGE_MATCH;
  536.   {$EXTERNALSYM CTL_USAGE_MATCH}
  537.   TCtlUsageMatch = CTL_USAGE_MATCH;
  538.   PCtlUsageMatch = PCTL_USAGE_MATCH;
  539.   PCERT_CHAIN_PARA = ^CERT_CHAIN_PARA;
  540.   {$EXTERNALSYM PCERT_CHAIN_PARA}
  541.   _CERT_CHAIN_PARA = record
  542.     cbSize: DWORD;
  543.     RequestedUsage: CERT_USAGE_MATCH;
  544.   end;
  545.   {$EXTERNALSYM _CERT_CHAIN_PARA}
  546.   CERT_CHAIN_PARA = _CERT_CHAIN_PARA;
  547.   {$EXTERNALSYM CERT_CHAIN_PARA}
  548.   TCertChainPara = CERT_CHAIN_PARA;
  549.   PCertChainPara = PCERT_CHAIN_PARA;
  550. //
  551. // The following API is used for retrieving certificate chains
  552. //
  553. // Parameters:
  554. //
  555. //      hChainEngine     - the chain engine (namespace and cache) to use, NULL
  556. //                         mean use the default chain engine
  557. //
  558. //      pCertContext     - the context we are retrieving the chain for, it
  559. //                         will be the zero index element in the chain
  560. //
  561. //      pTime            - the point in time that we want the chain validated
  562. //                         for.  Note that the time does not affect trust list,
  563. //                         revocation, or root store checking.  NULL means use
  564. //                         the current system time
  565. //
  566. //      hAdditionalStore - additional store to use when looking up objects
  567. //
  568. //      pChainPara       - parameters for chain building
  569. //
  570. //      dwFlags          - flags such as should revocation checking be done
  571. //                         on the chain?
  572. //
  573. //      pvReserved       - reserved parameter, must be NULL
  574. //
  575. //      ppChainContext   - chain context returned
  576. //
  577. // CERT_CHAIN_CACHE_END_CERT can be used here as well
  578. // Revocation flags are in the high nibble
  579. const
  580.   CERT_CHAIN_REVOCATION_CHECK_END_CERT           = $10000000;
  581.   {$EXTERNALSYM CERT_CHAIN_REVOCATION_CHECK_END_CERT}
  582.   CERT_CHAIN_REVOCATION_CHECK_CHAIN              = $20000000;
  583.   {$EXTERNALSYM CERT_CHAIN_REVOCATION_CHECK_CHAIN}
  584.   CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = $40000000;
  585.   {$EXTERNALSYM CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT}
  586.   CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY         = DWORD($80000000);
  587.   {$EXTERNALSYM CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY}
  588. function CertGetCertificateChain(hChainEngine: HCERTCHAINENGINE;
  589.   pCertContext: PCCERT_CONTEXT; pTime: LPFILETIME; hAdditionalStore: HCERTSTORE;
  590.   pChainPara: PCERT_CHAIN_PARA; dwFlags: DWORD; pvReserved: LPVOID;
  591.   ppChainContext: PPCCERT_CHAIN_CONTEXT): BOOL; stdcall;
  592. {$EXTERNALSYM CertGetCertificateChain}
  593. //
  594. // Free a certificate chain
  595. //
  596. procedure CertFreeCertificateChain(pChainContext: PCCERT_CHAIN_CONTEXT); stdcall;
  597. {$EXTERNALSYM CertFreeCertificateChain}
  598. //
  599. // Duplicate (add a reference to) a certificate chain
  600. //
  601. function CertDuplicateCertificateChain(pChainContext: PCCERT_CHAIN_CONTEXT): PCCERT_CHAIN_CONTEXT; stdcall;
  602. {$EXTERNALSYM CertDuplicateCertificateChain}
  603. //
  604. // Specific Revocation Type OID and structure definitions
  605. //
  606. //
  607. // CRL Revocation OID
  608. //
  609. const
  610.   REVOCATION_OID_CRL_REVOCATION = LPCSTR(1);
  611.   {$EXTERNALSYM REVOCATION_OID_CRL_REVOCATION}
  612. //
  613. // For the CRL revocation OID the pvRevocationPara is NULL
  614. //
  615. //
  616. // CRL Revocation Info
  617. //
  618. type
  619.   PCRL_REVOCATION_INFO = ^CRL_REVOCATION_INFO;
  620.   {$EXTERNALSYM PCRL_REVOCATION_INFO}
  621.   _CRL_REVOCATION_INFO = record
  622.     pCrlEntry: PCRL_ENTRY;
  623.     pCrlContext: PCCRL_CONTEXT;
  624.     pCrlIssuerChain: PCCERT_CHAIN_CONTEXT;
  625.   end;
  626.   {$EXTERNALSYM _CRL_REVOCATION_INFO}
  627.   CRL_REVOCATION_INFO = _CRL_REVOCATION_INFO;
  628.   {$EXTERNALSYM CRL_REVOCATION_INFO}
  629.   TCrlRevocationInfo = CRL_REVOCATION_INFO;
  630.   PCrlRevocationInfo = PCRL_REVOCATION_INFO;
  631. //+-------------------------------------------------------------------------
  632. //  Find the first or next certificate chain context in the store.
  633. //
  634. //  The chain context is found according to the dwFindFlags, dwFindType and
  635. //  its pvFindPara. See below for a list of the find types and its parameters.
  636. //
  637. //  If the first or next chain context isn't found, NULL is returned.
  638. //  Otherwise, a pointer to a read only CERT_CHAIN_CONTEXT is returned.
  639. //  CERT_CHAIN_CONTEXT must be freed by calling CertFreeCertificateChain
  640. //  or is freed when passed as the
  641. //  pPrevChainContext on a subsequent call. CertDuplicateCertificateChain
  642. //  can be called to make a duplicate.
  643. //
  644. //  pPrevChainContext MUST BE NULL on the first
  645. //  call to find the chain context. To find the next chain context, the
  646. //  pPrevChainContext is set to the CERT_CHAIN_CONTEXT returned by a previous
  647. //  call.
  648. //
  649. //  NOTE: a NON-NULL pPrevChainContext is always CertFreeCertificateChain'ed by
  650. //  this function, even for an error.
  651. //--------------------------------------------------------------------------
  652. function CertFindChainInStore(hCertStore: HCERTSTORE; dwCertEncodingType: DWORD;
  653.   dwFindFlags: DWORD; dwFindType: DWORD; pvFindPara: Pointer;
  654.   pPrevChainContext: PCCERT_CHAIN_CONTEXT): PCCERT_CHAIN_CONTEXT; stdcall;
  655. {$EXTERNALSYM CertFindChainInStore}
  656. const
  657.   CERT_CHAIN_FIND_BY_ISSUER = 1;
  658.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER}
  659. //+-------------------------------------------------------------------------
  660. //  CERT_CHAIN_FIND_BY_ISSUER
  661. //
  662. //  Find a certificate chain having a private key for the end certificate and
  663. //  matching one of the given issuer names. A matching dwKeySpec and
  664. //  enhanced key usage can also be specified. Additionally a callback can
  665. //  be provided for even more caller provided filtering before building the
  666. //  chain.
  667. //
  668. //  By default, only the issuers in the first simple chain are compared
  669. //  for a name match. CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG can
  670. //  be set in dwFindFlags to match issuers in all the simple chains.
  671. //
  672. //  CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG can be set in dwFindFlags to
  673. //  not check if the end certificate has a private key.
  674. //
  675. //  CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG can be set in dwFindFlags
  676. //  to compare the public key in the end certificate with the crypto
  677. //  provider's public key. The dwAcquirePrivateKeyFlags can be set
  678. //  in CERT_CHAIN_FIND_BY_ISSUER_PARA to enable caching of the private key's
  679. //  HKEY returned by the CSP.
  680. //
  681. //  If dwCertEncodingType == 0, defaults to X509_ASN_ENCODING for the
  682. //  array of encoded issuer names.
  683. //
  684. //  By default, the hCertStore passed to CertFindChainInStore, is passed
  685. //  as an additional store to CertGetCertificateChain.
  686. //  CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG can be set in dwFindFlags
  687. //  to improve performance by only searching the cached system stores
  688. //  (root, my, ca, trust) to find the issuer certificates. If you are doing
  689. //  a find in the "my" system store, than, this flag should be set to
  690. //  improve performance.
  691. //
  692. //  Setting CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG in dwFindFlags
  693. //  restricts CertGetCertificateChain to search the Local Machine
  694. //  cached system stores instead of the Current User's.
  695. //
  696. //  Setting CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG in dwFindFlags
  697. //  restricts CertGetCertificateChain to only search the URL cache
  698. //  and not hit the wire.
  699. //--------------------------------------------------------------------------
  700. // Returns FALSE to skip this certificate. Otherwise, returns TRUE to
  701. // build a chain for this certificate.
  702. type
  703.   PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK = function (pCert: PCCERT_CONTEXT;
  704.     pvFindArg: Pointer): BOOL; stdcall;
  705.   {$EXTERNALSYM PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK}
  706.   PFnCertChainFindByIssuerCallback = PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK;
  707.   PCERT_CHAIN_FIND_BY_ISSUER_PARA = ^CERT_CHAIN_FIND_BY_ISSUER_PARA;
  708.   {$EXTERNALSYM PCERT_CHAIN_FIND_BY_ISSUER_PARA}
  709.   _CERT_CHAIN_FIND_BY_ISSUER_PARA = record
  710.     cbSize: DWORD;
  711.     // If pszUsageIdentifier == NULL, matches any usage.
  712.     pszUsageIdentifier: LPCSTR;
  713.     // If dwKeySpec == 0, matches any KeySpec
  714.     dwKeySpec: DWORD;
  715.     // When CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG is set in dwFindFlags,
  716.     // CryptAcquireCertificatePrivateKey is called to do the public key
  717.     // comparison. The following flags can be set to enable caching
  718.     // of the acquired private key. See the API for more details on these
  719.     // flags.
  720.     dwAcquirePrivateKeyFlags: DWORD;
  721.     // Pointer to an array of X509, ASN.1 encoded issuer name blobs. If
  722.     // cIssuer == 0, matches any issuer
  723.     cIssuer: DWORD;
  724.     rgIssuer: PCERT_NAME_BLOB;
  725.     // If NULL or Callback returns TRUE, builds the chain for the end
  726.     // certificate having a private key with the specified KeySpec and
  727.     // enhanced key usage.
  728.     pfnFindCallback: PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK;
  729.     pvFindArg: Pointer;
  730.   end;
  731.   {$EXTERNALSYM _CERT_CHAIN_FIND_BY_ISSUER_PARA}
  732.   CERT_CHAIN_FIND_BY_ISSUER_PARA = _CERT_CHAIN_FIND_BY_ISSUER_PARA;
  733.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_PARA}
  734.   TCertChainFindByIssuerPara = CERT_CHAIN_FIND_BY_ISSUER_PARA;
  735.   PCertChainFindByIssuerPara = PCERT_CHAIN_FIND_BY_ISSUER_PARA;
  736. // The following dwFindFlags can be set for CERT_CHAIN_FIND_BY_ISSUER
  737. // If set, compares the public key in the end certificate with the crypto
  738. // provider's public key. This comparison is the last check made on the
  739. // build chain.
  740. const
  741.   CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG = $0001;
  742.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG}
  743. // If not set, only checks the first simple chain for an issuer name match.
  744. // When set, also checks second and subsequent simple chains.
  745.   CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG = $0002;
  746.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG}
  747. // If set, CertGetCertificateChain only searches the URL cache and
  748. // doesn't hit the wire.
  749.   CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG = $0004;
  750.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG}
  751. // If set, CertGetCertificateChain only opens the Local Machine
  752. // certificate stores instead of the Current User's.
  753.   CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG = $0008;
  754.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG}
  755. // If set, no check is made to see if the end certificate has a private
  756. // key associated with it.
  757.   CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG = $4000;
  758.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG}
  759. // By default, the hCertStore passed to CertFindChainInStore, is passed
  760. // as the additional store to CertGetCertificateChain. This flag can be
  761. // set to improve performance by only searching the cached system stores
  762. // (root, my, ca, trust) to find the issuer certificates. If not set, then,
  763. // the hCertStore is always searched in addition to the cached system
  764. // stores.
  765.   CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG = $8000;
  766.   {$EXTERNALSYM CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG}
  767. //+=========================================================================
  768. //  Certificate Chain Policy Data Structures and APIs
  769. //==========================================================================
  770. type
  771.   PCERT_CHAIN_POLICY_PARA = ^CERT_CHAIN_POLICY_PARA;
  772.   {$EXTERNALSYM PCERT_CHAIN_POLICY_PARA}
  773.   _CERT_CHAIN_POLICY_PARA = record
  774.     cbSize: DWORD;
  775.     dwFlags: DWORD;
  776.     pvExtraPolicyPara: Pointer; // pszPolicyOID specific
  777.   end;
  778.   {$EXTERNALSYM _CERT_CHAIN_POLICY_PARA}
  779.   CERT_CHAIN_POLICY_PARA = _CERT_CHAIN_POLICY_PARA;
  780.   {$EXTERNALSYM CERT_CHAIN_POLICY_PARA}
  781.   TCertChainPolicyPara = CERT_CHAIN_POLICY_PARA;
  782.   PCertChainPolicyPara = PCERT_CHAIN_POLICY_PARA;
  783. // If both lChainIndex and lElementIndex are set to -1, the dwError applies
  784. // to the whole chain context. If only lElementIndex is set to -1, the
  785. // dwError applies to the lChainIndex'ed chain. Otherwise, the dwError applies
  786. // to the certificate element at
  787. // pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex].
  788.   PCERT_CHAIN_POLICY_STATUS = ^CERT_CHAIN_POLICY_STATUS;
  789.   {$EXTERNALSYM PCERT_CHAIN_POLICY_STATUS}
  790.   _CERT_CHAIN_POLICY_STATUS = record
  791.     cbSize: DWORD;
  792.     dwError: DWORD;
  793.     lChainIndex: LONG;
  794.     lElementIndex: LONG;
  795.     pvExtraPolicyStatus: Pointer; // pszPolicyOID specific
  796.   end;
  797.   {$EXTERNALSYM _CERT_CHAIN_POLICY_STATUS}
  798.   CERT_CHAIN_POLICY_STATUS = _CERT_CHAIN_POLICY_STATUS;
  799.   {$EXTERNALSYM CERT_CHAIN_POLICY_STATUS}
  800.   TCertChainPolicyStatus = CERT_CHAIN_POLICY_STATUS;
  801.   PCertChainPolicyStatus = PCERT_CHAIN_POLICY_STATUS;
  802. // Common chain policy flags
  803. const
  804.   CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG     = $00000001;
  805.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG}
  806.   CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG = $00000002;
  807.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG}
  808.   CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG    = $00000004;
  809.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG}
  810.   CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS = (
  811.     CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG or
  812.     CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG or
  813.     CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG);
  814.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS}
  815.   CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG   = $00000010;
  816.   {$EXTERNALSYM CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG}
  817.   CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG = $00000020;
  818.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG}
  819.   CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG        = $00000100;
  820.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG}
  821.   CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG = $00000200;
  822.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG}
  823.   CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG         = $00000400;
  824.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG}
  825.   CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG       = $00000800;
  826.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG}
  827.   CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS = (
  828.     CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG or
  829.     CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG or
  830.     CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG or
  831.     CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG);
  832.   {$EXTERNALSYM CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS}
  833.   CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG = $00008000;
  834.   {$EXTERNALSYM CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG}
  835.   CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG = $00004000;
  836.   {$EXTERNALSYM CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG}
  837. //+-------------------------------------------------------------------------
  838. //  Verify that the certificate chain satisfies the specified policy
  839. //  requirements. If we were able to verify the chain policy, TRUE is returned
  840. //  and the dwError field of the pPolicyStatus is updated. A dwError of 0
  841. //  (ERROR_SUCCESS, S_OK) indicates the chain satisfies the specified policy.
  842. //
  843. //  If dwError applies to the entire chain context, both lChainIndex and
  844. //  lElementIndex are set to -1. If dwError applies to a simple chain,
  845. //  lElementIndex is set to -1 and lChainIndex is set to the index of the
  846. //  first offending chain having the error. If dwError applies to a
  847. //  certificate element, lChainIndex and lElementIndex are updated to
  848. //  index the first offending certificate having the error, where, the
  849. //  the certificate element is at:
  850. //      pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex].
  851. //
  852. //  The dwFlags in pPolicyPara can be set to change the default policy checking
  853. //  behaviour. In addition, policy specific parameters can be passed in
  854. //  the pvExtraPolicyPara field of pPolicyPara.
  855. //
  856. //  In addition to returning dwError, in pPolicyStatus, policy OID specific
  857. //  extra status may be returned via pvExtraPolicyStatus.
  858. //--------------------------------------------------------------------------
  859. function CertVerifyCertificateChainPolicy(pszPolicyOID: LPCSTR;
  860.   pChainContext: PCCERT_CHAIN_CONTEXT; pPolicyPara: PCERT_CHAIN_POLICY_PARA;
  861.   pPolicyStatus: PCERT_CHAIN_POLICY_STATUS): BOOL; stdcall;
  862. {$EXTERNALSYM CertVerifyCertificateChainPolicy}
  863. // Predefined OID Function Names
  864. const
  865.   CRYPT_OID_VERIFY_CERTIFICATE_CHAIN_POLICY_FUNC = 'CertDllVerifyCertificateChainPolicy';
  866.   {$EXTERNALSYM CRYPT_OID_VERIFY_CERTIFICATE_CHAIN_POLICY_FUNC}
  867. // CertDllVerifyCertificateChainPolicy has same function signature as
  868. // CertVerifyCertificateChainPolicy.
  869. //+-------------------------------------------------------------------------
  870. //  Predefined verify chain policies
  871. //--------------------------------------------------------------------------
  872.   CERT_CHAIN_POLICY_BASE              = LPCSTR(1);
  873.   {$EXTERNALSYM CERT_CHAIN_POLICY_BASE}
  874.   CERT_CHAIN_POLICY_AUTHENTICODE      = LPCSTR(2);
  875.   {$EXTERNALSYM CERT_CHAIN_POLICY_AUTHENTICODE}
  876.   CERT_CHAIN_POLICY_AUTHENTICODE_TS   = LPCSTR(3);
  877.   {$EXTERNALSYM CERT_CHAIN_POLICY_AUTHENTICODE_TS}
  878.   CERT_CHAIN_POLICY_SSL               = LPCSTR(4);
  879.   {$EXTERNALSYM CERT_CHAIN_POLICY_SSL}
  880.   CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = LPCSTR(5);
  881.   {$EXTERNALSYM CERT_CHAIN_POLICY_BASIC_CONSTRAINTS}
  882.   CERT_CHAIN_POLICY_NT_AUTH           = LPCSTR(6);
  883.   {$EXTERNALSYM CERT_CHAIN_POLICY_NT_AUTH}
  884. //+-------------------------------------------------------------------------
  885. //  CERT_CHAIN_POLICY_BASE
  886. //
  887. //  Implements the base chain policy verification checks. dwFlags can
  888. //  be set in pPolicyPara to alter the default policy checking behaviour.
  889. //--------------------------------------------------------------------------
  890. //+-------------------------------------------------------------------------
  891. //  CERT_CHAIN_POLICY_AUTHENTICODE
  892. //
  893. //  Implements the Authenticode chain policy verification checks.
  894. //
  895. //  pvExtraPolicyPara may optionally be set to point to the following
  896. //  AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA.
  897. //
  898. //  pvExtraPolicyStatus may optionally be set to point to the following
  899. //  AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS.
  900. //--------------------------------------------------------------------------
  901. // dwRegPolicySettings are defined in wintrust.h
  902. type
  903.   PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA = ^AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
  904.   {$EXTERNALSYM PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA}
  905.   _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA = record
  906.     cbSize: DWORD;
  907.     dwRegPolicySettings: DWORD;
  908.     pSignerInfo: PCMSG_SIGNER_INFO; // optional
  909.   end;
  910.   {$EXTERNALSYM _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA}
  911.   AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA = _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
  912.   {$EXTERNALSYM AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA}
  913.   TAuthenticodeExtraCertChainPolicyPara = AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
  914.   PAuthenticodeExtraCertChainPolicyPara = PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
  915.   PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS = ^AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
  916.   {$EXTERNALSYM PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS}
  917.   _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS = record
  918.     cbSize: DWORD;
  919.     fCommercial: BOOL; // obtained from signer statement
  920.   end;
  921.   {$EXTERNALSYM _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS}
  922.   AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS = _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
  923.   {$EXTERNALSYM AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS}
  924.   TAuthenticodeExtraCertChainPolicyStatus = AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
  925.   PAuthenticodeExtraCertChainPolicyStatus = PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
  926. //+-------------------------------------------------------------------------
  927. //  CERT_CHAIN_POLICY_AUTHENTICODE_TS
  928. //
  929. //  Implements the Authenticode Time Stamp chain policy verification checks.
  930. //
  931. //  pvExtraPolicyPara may optionally be set to point to the following
  932. //  AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA.
  933. //
  934. //  pvExtraPolicyStatus isn't used and must be set to NULL.
  935. //--------------------------------------------------------------------------
  936. // dwRegPolicySettings are defined in wintrust.h
  937.   PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA = ^AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
  938.   {$EXTERNALSYM PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA}
  939.   _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA = record
  940.     cbSize: DWORD;
  941.     dwRegPolicySettings: DWORD;
  942.     fCommercial: BOOL;
  943.   end;
  944.   {$EXTERNALSYM _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA}
  945.   AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA = _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
  946.   {$EXTERNALSYM AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA}
  947.   TAuthenticodeTsExtraCertChainPolicyPara = AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
  948.   PAuthenticodeTsExtraCertChainPolicyPara = PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
  949. //+-------------------------------------------------------------------------
  950. //  CERT_CHAIN_POLICY_SSL
  951. //
  952. //  Implements the SSL client/server chain policy verification checks.
  953. //
  954. //  pvExtraPolicyPara may optionally be set to point to the following
  955. //  SSL_EXTRA_CERT_CHAIN_POLICY_PARA data structure
  956. //--------------------------------------------------------------------------
  957. // fdwChecks flags are defined in wininet.h
  958. const
  959.   AUTHTYPE_CLIENT = 1;
  960.   {$EXTERNALSYM AUTHTYPE_CLIENT}
  961.   AUTHTYPE_SERVER = 2;
  962.   {$EXTERNALSYM AUTHTYPE_SERVER}
  963. type
  964.   PHTTPSPolicyCallbackData = ^HTTPSPolicyCallbackData;
  965.   {$EXTERNALSYM PHTTPSPolicyCallbackData}
  966.   _HTTPSPolicyCallbackData = record
  967.     //union {
  968.     //cbStruct: DWORD; // sizeof(HTTPSPolicyCallbackData);
  969.     cbSize: DWORD; // sizeof(HTTPSPolicyCallbackData);
  970.     //};
  971.     dwAuthType: DWORD;
  972.     fdwChecks: DWORD;
  973.     pwszServerName: PWCHAR; // used to check against CN=xxxx
  974.   end;
  975.   {$EXTERNALSYM _HTTPSPolicyCallbackData}
  976.   HTTPSPolicyCallbackData = _HTTPSPolicyCallbackData;
  977.   {$EXTERNALSYM HTTPSPolicyCallbackData}
  978.   THttpsPolicyCallbackData = HTTPSPolicyCallbackData;
  979.   SSL_EXTRA_CERT_CHAIN_POLICY_PARA = HTTPSPolicyCallbackData;
  980.   {$EXTERNALSYM SSL_EXTRA_CERT_CHAIN_POLICY_PARA}
  981.   PSSL_EXTRA_CERT_CHAIN_POLICY_PARA = PHTTPSPolicyCallbackData;
  982.   {$EXTERNALSYM PSSL_EXTRA_CERT_CHAIN_POLICY_PARA}
  983.   TSSLExtraCertChainPolicyPara = SSL_EXTRA_CERT_CHAIN_POLICY_PARA;
  984.   PSSLExtraCertChainPolicyPara = PSSL_EXTRA_CERT_CHAIN_POLICY_PARA;
  985. //+-------------------------------------------------------------------------
  986. //  CERT_CHAIN_POLICY_BASIC_CONSTRAINTS
  987. //
  988. //  Implements the basic constraints chain policy.
  989. //
  990. //  Iterates through all the certificates in the chain checking for either
  991. //  a szOID_BASIC_CONSTRAINTS or a szOID_BASIC_CONSTRAINTS2 extension. If
  992. //  neither extension is present, the certificate is assumed to have
  993. //  valid policy. Otherwise, for the first certificate element, checks if
  994. //  it matches the expected CA_FLAG or END_ENTITY_FLAG specified in
  995. //  pPolicyPara->dwFlags. If neither or both flags are set, then, the first
  996. //  element can be either a CA or END_ENTITY. All other elements must be
  997. //  a CA. If the PathLenConstraint is present in the extension, its
  998. //  checked.
  999. //
  1000. //  The first elements in the remaining simple chains (ie, the certificate
  1001. //  used to sign the CTL) are checked to be an END_ENTITY.
  1002. //
  1003. //  If this verification fails, dwError will be set to
  1004. //  TRUST_E_BASIC_CONSTRAINTS.
  1005. //--------------------------------------------------------------------------
  1006. const
  1007.   BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_CA_FLAG         = DWORD($80000000);
  1008.   {$EXTERNALSYM BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_CA_FLAG}
  1009.   BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAG = $40000000;
  1010.   {$EXTERNALSYM BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAG}
  1011. //+-------------------------------------------------------------------------
  1012. //  CERT_CHAIN_POLICY_NT_AUTH
  1013. //
  1014. //  Implements the NT Authentication chain policy.
  1015. //
  1016. //  The NT Authentication chain policy consists of 3 distinct chain
  1017. //  verifications in the following order:
  1018. //      [1] CERT_CHAIN_POLICY_BASE - Implements the base chain policy
  1019. //          verification checks. The LOWORD of dwFlags can be set in
  1020. //          pPolicyPara to alter the default policy checking behaviour. See
  1021. //          CERT_CHAIN_POLICY_BASE for more details.
  1022. //
  1023. //      [2] CERT_CHAIN_POLICY_BASIC_CONSTRAINTS - Implements the basic
  1024. //          constraints chain policy. The HIWORD of dwFlags can be set
  1025. //          to specify if the first element must be either a CA or END_ENTITY.
  1026. //          See CERT_CHAIN_POLICY_BASIC_CONSTRAINTS for more details.
  1027. //
  1028. //      [3] Checks if the second element in the chain, the CA that issued
  1029. //          the end certificate, is a trusted CA for NT
  1030. //          Authentication. A CA is considered to be trusted if it exists in
  1031. //          the "NTAuth" system registry store found in the
  1032. //          CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE store location.
  1033. //          If this verification fails, whereby the CA isn't trusted,
  1034. //          dwError is set to CERT_E_UNTRUSTEDCA.
  1035. //--------------------------------------------------------------------------
  1036. implementation
  1037. function GET_ALG_CLASS(x: DWORD): DWORD;
  1038. begin
  1039.   Result := (x and (7 shl 13));
  1040. end;
  1041. function GET_ALG_TYPE(x: DWORD): DWORD;
  1042. begin
  1043.   Result := (x and (15 shl 9));
  1044. end;
  1045. function GET_ALG_SID(x: DWORD): DWORD;
  1046. begin
  1047.   Result := x and 511;
  1048. end;
  1049. function RCRYPT_SUCCEEDED(rt: BOOL): BOOL;
  1050. begin
  1051.   Result := (rt = CRYPT_SUCCEED);
  1052. end;
  1053. function RCRYPT_FAILED(rt: BOOL): BOOL;
  1054. begin
  1055.   Result := (rt = CRYPT_FAILED)
  1056. end;
  1057. function IS_CERT_RDN_CHAR_STRING(X: DWORD): Boolean;
  1058. begin
  1059.   Result := (X and CERT_RDN_TYPE_MASK) >= CERT_RDN_NUMERIC_STRING;
  1060. end;
  1061. function GET_CERT_ENCODING_TYPE(X: DWORD): DWORD;
  1062. begin
  1063.   Result := X and CERT_ENCODING_TYPE_MASK;
  1064. end;
  1065. function GET_CMSG_ENCODING_TYPE(X: DWORD): DWORD;
  1066. begin
  1067.   Result := X and CMSG_ENCODING_TYPE_MASK;
  1068. end;
  1069. function GET_CERT_UNICODE_RDN_ERR_INDEX(X: DWORD): DWORD;
  1070. begin
  1071.   Result := (X shr CERT_UNICODE_RDN_ERR_INDEX_SHIFT) and CERT_UNICODE_RDN_ERR_INDEX_MASK;
  1072. end;
  1073. function GET_CERT_UNICODE_ATTR_ERR_INDEX(X: DWORD): DWORD;
  1074. begin
  1075.   Result := (X shr CERT_UNICODE_ATTR_ERR_INDEX_SHIFT) and CERT_UNICODE_ATTR_ERR_INDEX_MASK;
  1076. end;
  1077. function GET_CERT_UNICODE_VALUE_ERR_INDEX(X: DWORD): DWORD;
  1078. begin
  1079.   Result := X and CERT_UNICODE_VALUE_ERR_INDEX_MASK;
  1080. end;
  1081. function GET_CERT_ALT_NAME_ENTRY_ERR_INDEX(X: DWORD): DWORD;
  1082. begin
  1083.   Result := (X shr CERT_ALT_NAME_ENTRY_ERR_INDEX_SHIFT) and CERT_ALT_NAME_ENTRY_ERR_INDEX_MASK;
  1084. end;
  1085. function GET_CERT_ALT_NAME_VALUE_ERR_INDEX(X: DWORD): DWORD;
  1086. begin
  1087.   Result := X and CERT_ALT_NAME_VALUE_ERR_INDEX_MASK;
  1088. end;
  1089. function IS_CRL_DIST_POINT_ERR_CRL_ISSUER(X: DWORD): Boolean;
  1090. begin
  1091.   Result := (X and CRL_DIST_POINT_ERR_CRL_ISSUER_BIT) <> 0;
  1092. end;
  1093. function GET_CRL_DIST_POINT_ERR_INDEX(X: DWORD): DWORD;
  1094. begin
  1095.   Result := ((X shr CRL_DIST_POINT_ERR_INDEX_SHIFT) and CRL_DIST_POINT_ERR_INDEX_MASK);
  1096. end;
  1097. function IS_CERT_HASH_PROP_ID(X: DWORD): Boolean;
  1098. begin
  1099.   Result := (CERT_SHA1_HASH_PROP_ID = X) or (CERT_MD5_HASH_PROP_ID = X) or
  1100.     (CERT_SIGNATURE_HASH_PROP_ID = X);
  1101. end;
  1102. const
  1103.   crypt32 = 'crypt32.dll';
  1104.   advapi32 = 'advapi32.dll';
  1105.   softpub = 'softpub.dll';
  1106. {$IFDEF DYNAMIC_LINK}
  1107. var
  1108.   _CryptAcquireContextA: Pointer;
  1109. function CryptAcquireContextA;
  1110. begin
  1111.   GetProcedureAddress(_CryptAcquireContextA, advapi32, 'CryptAcquireContextA');
  1112.   asm
  1113.     mov esp, ebp
  1114.     pop ebp
  1115.     jmp [_CryptAcquireContextA]
  1116.   end;
  1117. end;
  1118. {$ELSE}
  1119. function CryptAcquireContextA; external advapi32 name 'CryptAcquireContextA';
  1120. {$ENDIF DYNAMIC_LINK}
  1121. {$IFDEF DYNAMIC_LINK}
  1122. var
  1123.   _CryptAcquireContextW: Pointer;
  1124. function CryptAcquireContextW;
  1125. begin
  1126.   GetProcedureAddress(_CryptAcquireContextW, advapi32, 'CryptAcquireContextW');
  1127.   asm
  1128.     mov esp, ebp
  1129.     pop ebp
  1130.     jmp [_CryptAcquireContextW]
  1131.   end;
  1132. end;
  1133. {$ELSE}
  1134. function CryptAcquireContextW; external advapi32 name 'CryptAcquireContextW';
  1135. {$ENDIF DYNAMIC_LINK}
  1136. {$IFDEF UNICODE}
  1137. {$IFDEF DYNAMIC_LINK}
  1138. var
  1139.   _CryptAcquireContext: Pointer;
  1140. function CryptAcquireContext;
  1141. begin
  1142.   GetProcedureAddress(_CryptAcquireContext, advapi32, 'CryptAcquireContextW');
  1143.   asm
  1144.     mov esp, ebp
  1145.     pop ebp
  1146.     jmp [_CryptAcquireContext]
  1147.   end;
  1148. end;
  1149. {$ELSE}
  1150. function CryptAcquireContext; external advapi32 name 'CryptAcquireContextW';
  1151. {$ENDIF DYNAMIC_LINK}
  1152. {$ELSE}
  1153. {$IFDEF DYNAMIC_LINK}
  1154. var
  1155.   _CryptAcquireContext: Pointer;
  1156. function CryptAcquireContext;
  1157. begin
  1158.   GetProcedureAddress(_CryptAcquireContext, advapi32, 'CryptAcquireContextA');
  1159.   asm
  1160.     mov esp, ebp
  1161.     pop ebp
  1162.     jmp [_CryptAcquireContext]
  1163.   end;
  1164. end;
  1165. {$ELSE}
  1166. function CryptAcquireContext; external advapi32 name 'CryptAcquireContextA';
  1167. {$ENDIF DYNAMIC_LINK}
  1168. {$ENDIF}
  1169. {$IFDEF DYNAMIC_LINK}
  1170. var
  1171.   _CryptReleaseContext: Pointer;
  1172. function CryptReleaseContext;
  1173. begin
  1174.   GetProcedureAddress(_CryptReleaseContext, advapi32, 'CryptReleaseContext');
  1175.   asm
  1176.     mov esp, ebp
  1177.     pop ebp
  1178.     jmp [_CryptReleaseContext]
  1179.   end;
  1180. end;
  1181. {$ELSE}
  1182. function CryptReleaseContext; external advapi32 name 'CryptReleaseContext';
  1183. {$ENDIF DYNAMIC_LINK}
  1184. {$IFDEF DYNAMIC_LINK}
  1185. var
  1186.   _CryptGenKey: Pointer;
  1187. function CryptGenKey;
  1188. begin
  1189.   GetProcedureAddress(_CryptGenKey, advapi32, 'CryptGenKey');
  1190.   asm
  1191.     mov esp, ebp
  1192.     pop ebp
  1193.     jmp [_CryptGenKey]
  1194.   end;
  1195. end;
  1196. {$ELSE}
  1197. function CryptGenKey; external advapi32 name 'CryptGenKey';
  1198. {$ENDIF DYNAMIC_LINK}
  1199. {$IFDEF DYNAMIC_LINK}
  1200. var
  1201.   _CryptDeriveKey: Pointer;
  1202. function CryptDeriveKey;
  1203. begin
  1204.   GetProcedureAddress(_CryptDeriveKey, advapi32, 'CryptDeriveKey');
  1205.   asm
  1206.     mov esp, ebp
  1207.     pop ebp
  1208.     jmp [_CryptDeriveKey]
  1209.   end;
  1210. end;
  1211. {$ELSE}
  1212. function CryptDeriveKey; external advapi32 name 'CryptDeriveKey';
  1213. {$ENDIF DYNAMIC_LINK}
  1214. {$IFDEF DYNAMIC_LINK}
  1215. var
  1216.   _CryptDestroyKey: Pointer;
  1217. function CryptDestroyKey;
  1218. begin
  1219.   GetProcedureAddress(_CryptDestroyKey, advapi32, 'CryptDestroyKey');
  1220.   asm
  1221.     mov esp, ebp
  1222.     pop ebp
  1223.     jmp [_CryptDestroyKey]
  1224.   end;
  1225. end;
  1226. {$ELSE}
  1227. function CryptDestroyKey; external advapi32 name 'CryptDestroyKey';
  1228. {$ENDIF DYNAMIC_LINK}
  1229. {$IFDEF DYNAMIC_LINK}
  1230. var
  1231.   _CryptSetKeyParam: Pointer;
  1232. function CryptSetKeyParam;
  1233. begin
  1234.   GetProcedureAddress(_CryptSetKeyParam, crypt32, 'CryptSetKeyParam');
  1235.   asm
  1236.     mov esp, ebp
  1237.     pop ebp
  1238.     jmp [_CryptSetKeyParam]
  1239.   end;
  1240. end;
  1241. {$ELSE}
  1242. function CryptSetKeyParam; external crypt32 name 'CryptSetKeyParam';
  1243. {$ENDIF DYNAMIC_LINK}
  1244. {$IFDEF DYNAMIC_LINK}
  1245. var
  1246.   _CryptGetKeyParam: Pointer;
  1247. function CryptGetKeyParam;
  1248. begin
  1249.   GetProcedureAddress(_CryptGetKeyParam, advapi32, 'CryptGetKeyParam');
  1250.   asm
  1251.     mov esp, ebp
  1252.     pop ebp
  1253.     jmp [_CryptGetKeyParam]
  1254.   end;
  1255. end;
  1256. {$ELSE}
  1257. function CryptGetKeyParam; external advapi32 name 'CryptGetKeyParam';
  1258. {$ENDIF DYNAMIC_LINK}
  1259. {$IFDEF DYNAMIC_LINK}
  1260. var
  1261.   _CryptSetHashParam: Pointer;
  1262. function CryptSetHashParam;
  1263. begin
  1264.   GetProcedureAddress(_CryptSetHashParam, advapi32, 'CryptSetHashParam');
  1265.   asm
  1266.     mov esp, ebp
  1267.     pop ebp
  1268.     jmp [_CryptSetHashParam]
  1269.   end;
  1270. end;
  1271. {$ELSE}
  1272. function CryptSetHashParam; external advapi32 name 'CryptSetHashParam';
  1273. {$ENDIF DYNAMIC_LINK}
  1274. {$IFDEF DYNAMIC_LINK}
  1275. var
  1276.   _CryptGetHashParam: Pointer;
  1277. function CryptGetHashParam;
  1278. begin
  1279.   GetProcedureAddress(_CryptGetHashParam, advapi32, 'CryptGetHashParam');
  1280.   asm
  1281.     mov esp, ebp
  1282.     pop ebp
  1283.     jmp [_CryptGetHashParam]
  1284.   end;
  1285. end;
  1286. {$ELSE}
  1287. function CryptGetHashParam; external advapi32 name 'CryptGetHashParam';
  1288. {$ENDIF DYNAMIC_LINK}
  1289. {$IFDEF DYNAMIC_LINK}
  1290. var
  1291.   _CryptSetProvParam: Pointer;
  1292. function CryptSetProvParam;
  1293. begin
  1294.   GetProcedureAddress(_CryptSetProvParam, advapi32, 'CryptSetProvParam');
  1295.   asm
  1296.     mov esp, ebp
  1297.     pop ebp
  1298.     jmp [_CryptSetProvParam]
  1299.   end;
  1300. end;
  1301. {$ELSE}
  1302. function CryptSetProvParam; external advapi32 name 'CryptSetProvParam';
  1303. {$ENDIF DYNAMIC_LINK}
  1304. {$IFDEF DYNAMIC_LINK}
  1305. var
  1306.   _CryptGetProvParam: Pointer;
  1307. function CryptGetProvParam;
  1308. begin
  1309.   GetProcedureAddress(_CryptGetProvParam, advapi32, 'CryptGetProvParam');
  1310.   asm
  1311.     mov esp, ebp
  1312.     pop ebp
  1313.     jmp [_CryptGetProvParam]
  1314.   end;
  1315. end;
  1316. {$ELSE}
  1317. function CryptGetProvParam; external advapi32 name 'CryptGetProvParam';
  1318. {$ENDIF DYNAMIC_LINK}
  1319. {$IFDEF DYNAMIC_LINK}
  1320. var
  1321.   _CryptGenRandom: Pointer;
  1322. function CryptGenRandom;
  1323. begin
  1324.   GetProcedureAddress(_CryptGenRandom, advapi32, 'CryptGenRandom');
  1325.   asm
  1326.     mov esp, ebp
  1327.     pop ebp
  1328.     jmp [_CryptGenRandom]
  1329.   end;
  1330. end;
  1331. {$ELSE}
  1332. function CryptGenRandom; external advapi32 name 'CryptGenRandom';
  1333. {$ENDIF DYNAMIC_LINK}
  1334. {$IFDEF DYNAMIC_LINK}
  1335. var
  1336.   _CryptGetUserKey: Pointer;
  1337. function CryptGetUserKey;
  1338. begin
  1339.   GetProcedureAddress(_CryptGetUserKey, advapi32, 'CryptGetUserKey');
  1340.   asm
  1341.     mov esp, ebp
  1342.     pop ebp
  1343.     jmp [_CryptGetUserKey]
  1344.   end;
  1345. end;
  1346. {$ELSE}
  1347. function CryptGetUserKey; external advapi32 name 'CryptGetUserKey';
  1348. {$ENDIF DYNAMIC_LINK}
  1349. {$IFDEF DYNAMIC_LINK}
  1350. var
  1351.   _CryptExportKey: Pointer;
  1352. function CryptExportKey;
  1353. begin
  1354.   GetProcedureAddress(_CryptExportKey, advapi32, 'CryptExportKey');
  1355.   asm
  1356.     mov esp, ebp
  1357.     pop ebp
  1358.     jmp [_CryptExportKey]
  1359.   end;
  1360. end;
  1361. {$ELSE}
  1362. function CryptExportKey; external advapi32 name 'CryptExportKey';
  1363. {$ENDIF DYNAMIC_LINK}
  1364. {$IFDEF DYNAMIC_LINK}
  1365. var
  1366.   _CryptImportKey: Pointer;
  1367. function CryptImportKey;
  1368. begin
  1369.   GetProcedureAddress(_CryptImportKey, advapi32, 'CryptImportKey');
  1370.   asm
  1371.     mov esp, ebp
  1372.     pop ebp
  1373.     jmp [_CryptImportKey]
  1374.   end;
  1375. end;
  1376. {$ELSE}
  1377. function CryptImportKey; external advapi32 name 'CryptImportKey';
  1378. {$ENDIF DYNAMIC_LINK}
  1379. {$IFDEF DYNAMIC_LINK}
  1380. var
  1381.   _CryptEncrypt: Pointer;
  1382. function CryptEncrypt;
  1383. begin
  1384.   GetProcedureAddress(_CryptEncrypt, advapi32, 'CryptEncrypt');
  1385.   asm
  1386.     mov esp, ebp
  1387.     pop ebp
  1388.     jmp [_CryptEncrypt]
  1389.   end;
  1390. end;
  1391. {$ELSE}
  1392. function CryptEncrypt; external advapi32 name 'CryptEncrypt';
  1393. {$ENDIF DYNAMIC_LINK}
  1394. {$IFDEF DYNAMIC_LINK}
  1395. var
  1396.   _CryptDecrypt: Pointer;
  1397. function CryptDecrypt;
  1398. begin
  1399.   GetProcedureAddress(_CryptDecrypt, advapi32, 'CryptDecrypt');
  1400.   asm
  1401.     mov esp, ebp
  1402.     pop ebp
  1403.     jmp [_CryptDecrypt]
  1404.   end;
  1405. end;
  1406. {$ELSE}
  1407. function CryptDecrypt; external advapi32 name 'CryptDecrypt';
  1408. {$ENDIF DYNAMIC_LINK}
  1409. {$IFDEF DYNAMIC_LINK}
  1410. var
  1411.   _CryptCreateHash: Pointer;
  1412. function CryptCreateHash;
  1413. begin
  1414.   GetProcedureAddress(_CryptCreateHash, advapi32, 'CryptCreateHash');
  1415.   asm
  1416.     mov esp, ebp
  1417.     pop ebp
  1418.     jmp [_CryptCreateHash]
  1419.   end;
  1420. end;
  1421. {$ELSE}
  1422. function CryptCreateHash; external advapi32 name 'CryptCreateHash';
  1423. {$ENDIF DYNAMIC_LINK}
  1424. {$IFDEF DYNAMIC_LINK}
  1425. var
  1426.   _CryptHashData: Pointer;
  1427. function CryptHashData;
  1428. begin
  1429.   GetProcedureAddress(_CryptHashData, advapi32, 'CryptHashData');
  1430.   asm
  1431.     mov esp, ebp
  1432.     pop ebp
  1433.     jmp [_CryptHashData]
  1434.   end;
  1435. end;
  1436. {$ELSE}
  1437. function CryptHashData; external advapi32 name 'CryptHashData';
  1438. {$ENDIF DYNAMIC_LINK}
  1439. {$IFDEF DYNAMIC_LINK}
  1440. var
  1441.   _CryptHashSessionKey: Pointer;
  1442. function CryptHashSessionKey;
  1443. begin
  1444.   GetProcedureAddress(_CryptHashSessionKey, advapi32, 'CryptHashSessionKey');
  1445.   asm
  1446.     mov esp, ebp
  1447.     pop ebp
  1448.     jmp [_CryptHashSessionKey]
  1449.   end;
  1450. end;
  1451. {$ELSE}
  1452. function CryptHashSessionKey; external advapi32 name 'CryptHashSessionKey';
  1453. {$ENDIF DYNAMIC_LINK}
  1454. {$IFDEF DYNAMIC_LINK}
  1455. var
  1456.   _CryptDestroyHash: Pointer;
  1457. function CryptDestroyHash;
  1458. begin
  1459.   GetProcedureAddress(_CryptDestroyHash, advapi32, 'CryptDestroyHash');
  1460.   asm
  1461.     mov esp, ebp
  1462.     pop ebp
  1463.     jmp [_CryptDestroyHash]
  1464.   end;
  1465. end;
  1466. {$ELSE}
  1467. function CryptDestroyHash; external advapi32 name 'CryptDestroyHash';
  1468. {$ENDIF DYNAMIC_LINK}
  1469. {$IFDEF DYNAMIC_LINK}
  1470. var
  1471.   _CryptSignHashA: Pointer;
  1472. function CryptSignHashA;
  1473. begin
  1474.   GetProcedureAddress(_CryptSignHashA, advapi32, 'CryptSignHashA');
  1475.   asm
  1476.     mov esp, ebp
  1477.     pop ebp
  1478.     jmp [_CryptSignHashA]
  1479.   end;
  1480. end;
  1481. {$ELSE}
  1482. function CryptSignHashA; external advapi32 name 'CryptSignHashA';
  1483. {$ENDIF DYNAMIC_LINK}
  1484. {$IFDEF DYNAMIC_LINK}
  1485. var
  1486.   _CryptSignHashW: Pointer;
  1487. function CryptSignHashW;
  1488. begin
  1489.   GetProcedureAddress(_CryptSignHashW, advapi32, 'CryptSignHashW');
  1490.   asm
  1491.     mov esp, ebp
  1492.     pop ebp
  1493.     jmp [_CryptSignHashW]
  1494.   end;
  1495. end;
  1496. {$ELSE}
  1497. function CryptSignHashW; external advapi32 name 'CryptSignHashW';
  1498. {$ENDIF DYNAMIC_LINK}
  1499. {$IFDEF UNICODE}
  1500. {$IFDEF DYNAMIC_LINK}
  1501. var
  1502.   _CryptSignHash: Pointer;
  1503. function CryptSignHash;
  1504. begin
  1505.   GetProcedureAddress(_CryptSignHash, advapi32, 'CryptSignHashW');
  1506.   asm
  1507.     mov esp, ebp
  1508.     pop ebp
  1509.     jmp [_CryptSignHash]
  1510.   end;
  1511. end;
  1512. {$ELSE}
  1513. function CryptSignHash; external advapi32 name 'CryptSignHashW';
  1514. {$ENDIF DYNAMIC_LINK}
  1515. {$ELSE}
  1516. {$IFDEF DYNAMIC_LINK}
  1517. var
  1518.   _CryptSignHash: Pointer;
  1519. function CryptSignHash;
  1520. begin
  1521.   GetProcedureAddress(_CryptSignHash, advapi32, 'CryptSignHashA');
  1522.   asm
  1523.     mov esp, ebp
  1524.     pop ebp
  1525.     jmp [_CryptSignHash]
  1526.   end;
  1527. end;
  1528. {$ELSE}
  1529. function CryptSignHash; external advapi32 name 'CryptSignHashA';
  1530. {$ENDIF DYNAMIC_LINK}
  1531. {$ENDIF}
  1532. {$IFDEF DYNAMIC_LINK}
  1533. var
  1534.   _CryptVerifySignatureA: Pointer;
  1535. function CryptVerifySignatureA;
  1536. begin
  1537.   GetProcedureAddress(_CryptVerifySignatureA, advapi32, 'CryptVerifySignatureA');
  1538.   asm
  1539.     mov esp, ebp
  1540.     pop ebp
  1541.     jmp [_CryptVerifySignatureA]
  1542.   end;
  1543. end;
  1544. {$ELSE}
  1545. function CryptVerifySignatureA; external advapi32 name 'CryptVerifySignatureA';
  1546. {$ENDIF DYNAMIC_LINK}
  1547. {$IFDEF DYNAMIC_LINK}
  1548. var
  1549.   _CryptVerifySignatureW: Pointer;
  1550. function CryptVerifySignatureW;
  1551. begin
  1552.   GetProcedureAddress(_CryptVerifySignatureW, advapi32, 'CryptVerifySignatureW');
  1553.   asm
  1554.     mov esp, ebp
  1555.     pop ebp
  1556.     jmp [_CryptVerifySignatureW]
  1557.   end;
  1558. end;
  1559. {$ELSE}
  1560. function CryptVerifySignatureW; external advapi32 name 'CryptVerifySignatureW';
  1561. {$ENDIF DYNAMIC_LINK}
  1562. {$IFDEF UNICODE}
  1563. {$IFDEF DYNAMIC_LINK}
  1564. var
  1565.   _CryptVerifySignature: Pointer;
  1566. function CryptVerifySignature;
  1567. begin
  1568.   GetProcedureAddress(_CryptVerifySignature, advapi32, 'CryptVerifySignatureW');
  1569.   asm
  1570.     mov esp, ebp
  1571.     pop ebp
  1572.     jmp [_CryptVerifySignature]
  1573.   end;
  1574. end;
  1575. {$ELSE}
  1576. function CryptVerifySignature; external advapi32 name 'CryptVerifySignatureW';
  1577. {$ENDIF DYNAMIC_LINK}
  1578. {$ELSE}
  1579. {$IFDEF DYNAMIC_LINK}
  1580. var
  1581.   _CryptVerifySignature: Pointer;
  1582. function CryptVerifySignature;
  1583. begin
  1584.   GetProcedureAddress(_CryptVerifySignature, advapi32, 'CryptVerifySignatureA');
  1585.   asm
  1586.     mov esp, ebp
  1587.     pop ebp
  1588.     jmp [_CryptVerifySignature]
  1589.   end;
  1590. end;
  1591. {$ELSE}
  1592. function CryptVerifySignature; external advapi32 name 'CryptVerifySignatureA';
  1593. {$ENDIF DYNAMIC_LINK}
  1594. {$ENDIF}
  1595. {$IFDEF DYNAMIC_LINK}
  1596. var
  1597.   _CryptSetProviderA: Pointer;
  1598. function CryptSetProviderA;
  1599. begin
  1600.   GetProcedureAddress(_CryptSetProviderA, advapi32, 'CryptSetProviderA');
  1601.   asm
  1602.     mov esp, ebp
  1603.     pop ebp
  1604.     jmp [_CryptSetProviderA]
  1605.   end;
  1606. end;
  1607. {$ELSE}
  1608. function CryptSetProviderA; external advapi32 name 'CryptSetProviderA';
  1609. {$ENDIF DYNAMIC_LINK}
  1610. {$IFDEF DYNAMIC_LINK}
  1611. var
  1612.   _CryptSetProviderW: Pointer;
  1613. function CryptSetProviderW;
  1614. begin
  1615.   GetProcedureAddress(_CryptSetProviderW, advapi32, 'CryptSetProviderW');
  1616.   asm
  1617.     mov esp, ebp
  1618.     pop ebp
  1619.     jmp [_CryptSetProviderW]
  1620.   end;
  1621. end;
  1622. {$ELSE}
  1623. function CryptSetProviderW; external advapi32 name 'CryptSetProviderW';
  1624. {$ENDIF DYNAMIC_LINK}
  1625. {$IFDEF UNICODE}
  1626. {$IFDEF DYNAMIC_LINK}
  1627. var
  1628.   _CryptSetProvider: Pointer;
  1629. function CryptSetProvider;
  1630. begin
  1631.   GetProcedureAddress(_CryptSetProvider, advapi32, 'CryptSetProviderW');
  1632.   asm
  1633.     mov esp, ebp
  1634.     pop ebp
  1635.     jmp [_CryptSetProvider]
  1636.   end;
  1637. end;
  1638. {$ELSE}
  1639. function CryptSetProvider; external advapi32 name 'CryptSetProviderW';
  1640. {$ENDIF DYNAMIC_LINK}
  1641. {$ELSE}
  1642. {$IFDEF DYNAMIC_LINK}
  1643. var
  1644.   _CryptSetProvider: Pointer;
  1645. function CryptSetProvider;
  1646. begin
  1647.   GetProcedureAddress(_CryptSetProvider, advapi32, 'CryptSetProviderA');
  1648.   asm
  1649.     mov esp, ebp
  1650.     pop ebp
  1651.     jmp [_CryptSetProvider]
  1652.   end;
  1653. end;
  1654. {$ELSE}
  1655. function CryptSetProvider; external advapi32 name 'CryptSetProviderA';
  1656. {$ENDIF DYNAMIC_LINK}
  1657. {$ENDIF}
  1658. {$IFDEF DYNAMIC_LINK}
  1659. var
  1660.   _CryptSetProviderExA: Pointer;
  1661. function CryptSetProviderExA;
  1662. begin
  1663.   GetProcedureAddress(_CryptSetProviderExA, advapi32, 'CryptSetProviderExA');
  1664.   asm
  1665.     mov esp, ebp
  1666.     pop ebp
  1667.     jmp [_CryptSetProviderExA]
  1668.   end;
  1669. end;
  1670. {$ELSE}
  1671. function CryptSetProviderExA; external advapi32 name 'CryptSetProviderExA';
  1672. {$ENDIF DYNAMIC_LINK}
  1673. {$IFDEF DYNAMIC_LINK}
  1674. var
  1675.   _CryptSetProviderExW: Pointer;
  1676. function CryptSetProviderExW;
  1677. begin
  1678.   GetProcedureAddress(_CryptSetProviderExW, advapi32, 'CryptSetProviderExW');
  1679.   asm
  1680.     mov esp, ebp
  1681.     pop ebp
  1682.     jmp [_CryptSetProviderExW]
  1683.   end;
  1684. end;
  1685. {$ELSE}
  1686. function CryptSetProviderExW; external advapi32 name 'CryptSetProviderExW';
  1687. {$ENDIF DYNAMIC_LINK}
  1688. {$IFDEF UNICODE}
  1689. {$IFDEF DYNAMIC_LINK}
  1690. var
  1691.   _CryptSetProviderEx: Pointer;
  1692. function CryptSetProviderEx;
  1693. begin
  1694.   GetProcedureAddress(_CryptSetProviderEx, advapi32, 'CryptSetProviderExW');
  1695.   asm
  1696.     mov esp, ebp
  1697.     pop ebp
  1698.     jmp [_CryptSetProviderEx]
  1699.   end;
  1700. end;
  1701. {$ELSE}
  1702. function CryptSetProviderEx; external advapi32 name 'CryptSetProviderExW';
  1703. {$ENDIF DYNAMIC_LINK}
  1704. {$ELSE}
  1705. {$IFDEF DYNAMIC_LINK}
  1706. var
  1707.   _CryptSetProviderEx: Pointer;
  1708. function CryptSetProviderEx;
  1709. begin
  1710.   GetProcedureAddress(_CryptSetProviderEx, advapi32, 'CryptSetProviderExA');
  1711.   asm
  1712.     mov esp, ebp
  1713.     pop ebp
  1714.     jmp [_CryptSetProviderEx]
  1715.   end;
  1716. end;
  1717. {$ELSE}
  1718. function CryptSetProviderEx; external advapi32 name 'CryptSetProviderExA';
  1719. {$ENDIF DYNAMIC_LINK}
  1720. {$ENDIF}
  1721. {$IFDEF DYNAMIC_LINK}
  1722. var
  1723.   _CryptGetDefaultProviderA: Pointer;
  1724. function CryptGetDefaultProviderA;
  1725. begin
  1726.   GetProcedureAddress(_CryptGetDefaultProviderA, advapi32, 'CryptGetDefaultProviderA');
  1727.   asm
  1728.     mov esp, ebp
  1729.     pop ebp
  1730.     jmp [_CryptGetDefaultProviderA]
  1731.   end;
  1732. end;
  1733. {$ELSE}
  1734. function CryptGetDefaultProviderA; external advapi32 name 'CryptGetDefaultProviderA';
  1735. {$ENDIF DYNAMIC_LINK}
  1736. {$IFDEF DYNAMIC_LINK}
  1737. var
  1738.   _CryptGetDefaultProviderW: Pointer;
  1739. function CryptGetDefaultProviderW;
  1740. begin
  1741.   GetProcedureAddress(_CryptGetDefaultProviderW, advapi32, 'CryptGetDefaultProviderW');
  1742.   asm
  1743.     mov esp, ebp
  1744.     pop ebp
  1745.     jmp [_CryptGetDefaultProviderW]
  1746.   end;
  1747. end;
  1748. {$ELSE}
  1749. function CryptGetDefaultProviderW; external advapi32 name 'CryptGetDefaultProviderW';
  1750. {$ENDIF DYNAMIC_LINK}
  1751. {$IFDEF UNICODE}
  1752. {$IFDEF DYNAMIC_LINK}
  1753. var
  1754.   _CryptGetDefaultProvider: Pointer;
  1755. function CryptGetDefaultProvider;
  1756. begin
  1757.   GetProcedureAddress(_CryptGetDefaultProvider, advapi32, 'CryptGetDefaultProviderW');
  1758.   asm
  1759.     mov esp, ebp
  1760.     pop ebp
  1761.     jmp [_CryptGetDefaultProvider]
  1762.   end;
  1763. end;
  1764. {$ELSE}
  1765. function CryptGetDefaultProvider; external advapi32 name 'CryptGetDefaultProviderW';
  1766. {$ENDIF DYNAMIC_LINK}
  1767. {$ELSE}
  1768. {$IFDEF DYNAMIC_LINK}
  1769. var
  1770.   _CryptGetDefaultProvider: Pointer;
  1771. function CryptGetDefaultProvider;
  1772. begin
  1773.   GetProcedureAddress(_CryptGetDefaultProvider, advapi32, 'CryptGetDefaultProviderA');
  1774.   asm
  1775.     mov esp, ebp
  1776.     pop ebp
  1777.     jmp [_CryptGetDefaultProvider]
  1778.   end;
  1779. end;
  1780. {$ELSE}
  1781. function CryptGetDefaultProvider; external advapi32 name 'CryptGetDefaultProviderA';
  1782. {$ENDIF DYNAMIC_LINK}
  1783. {$ENDIF}
  1784. {$IFDEF DYNAMIC_LINK}
  1785. var
  1786.   _CryptEnumProviderTypesA: Pointer;
  1787. function CryptEnumProviderTypesA;
  1788. begin
  1789.   GetProcedureAddress(_CryptEnumProviderTypesA, advapi32, 'CryptEnumProviderTypesA');
  1790.   asm
  1791.     mov esp, ebp
  1792.     pop ebp
  1793.     jmp [_CryptEnumProviderTypesA]
  1794.   end;
  1795. end;
  1796. {$ELSE}
  1797. function CryptEnumProviderTypesA; external advapi32 name 'CryptEnumProviderTypesA';
  1798. {$ENDIF DYNAMIC_LINK}
  1799. {$IFDEF DYNAMIC_LINK}
  1800. var
  1801.   _CryptEnumProviderTypesW: Pointer;
  1802. function CryptEnumProviderTypesW;
  1803. begin
  1804.   GetProcedureAddress(_CryptEnumProviderTypesW, advapi32, 'CryptEnumProviderTypesW');
  1805.   asm
  1806.     mov esp, ebp
  1807.     pop ebp
  1808.     jmp [_CryptEnumProviderTypesW]
  1809.   end;
  1810. end;
  1811. {$ELSE}
  1812. function CryptEnumProviderTypesW; external advapi32 name 'CryptEnumProviderTypesW';
  1813. {$ENDIF DYNAMIC_LINK}
  1814. {$IFDEF UNICODE}
  1815. {$IFDEF DYNAMIC_LINK}
  1816. var
  1817.   _CryptEnumProviderTypes: Pointer;
  1818. function CryptEnumProviderTypes;
  1819. begin
  1820.   GetProcedureAddress(_CryptEnumProviderTypes, advapi32, 'CryptEnumProviderTypesW');
  1821.   asm
  1822.     mov esp, ebp
  1823.     pop ebp
  1824.     jmp [_CryptEnumProviderTypes]
  1825.   end;
  1826. end;
  1827. {$ELSE}
  1828. function CryptEnumProviderTypes; external advapi32 name 'CryptEnumProviderTypesW';
  1829. {$ENDIF DYNAMIC_LINK}
  1830. {$ELSE}
  1831. {$IFDEF DYNAMIC_LINK}
  1832. var
  1833.   _CryptEnumProviderTypes: Pointer;
  1834. function CryptEnumProviderTypes;
  1835. begin
  1836.   GetProcedureAddress(_CryptEnumProviderTypes, advapi32, 'CryptEnumProviderTypesA');
  1837.   asm
  1838.     mov esp, ebp
  1839.     pop ebp
  1840.     jmp [_CryptEnumProviderTypes]
  1841.   end;
  1842. end;
  1843. {$ELSE}
  1844. function CryptEnumProviderTypes; external advapi32 name 'CryptEnumProviderTypesA';
  1845. {$ENDIF DYNAMIC_LINK}
  1846. {$ENDIF}
  1847. {$IFDEF DYNAMIC_LINK}
  1848. var
  1849.   _CryptEnumProvidersA: Pointer;
  1850. function CryptEnumProvidersA;
  1851. begin
  1852.   GetProcedureAddress(_CryptEnumProvidersA, advapi32, 'CryptEnumProvidersA');
  1853.   asm
  1854.     mov esp, ebp
  1855.     pop ebp
  1856.     jmp [_CryptEnumProvidersA]
  1857.   end;
  1858. end;
  1859. {$ELSE}
  1860. function CryptEnumProvidersA; external advapi32 name 'CryptEnumProvidersA';
  1861. {$ENDIF DYNAMIC_LINK}
  1862. {$IFDEF DYNAMIC_LINK}
  1863. var
  1864.   _CryptEnumProvidersW: Pointer;
  1865. function CryptEnumProvidersW;
  1866. begin
  1867.   GetProcedureAddress(_CryptEnumProvidersW, advapi32, 'CryptEnumProvidersW');
  1868.   asm
  1869.     mov esp, ebp
  1870.     pop ebp
  1871.     jmp [_CryptEnumProvidersW]
  1872.   end;
  1873. end;
  1874. {$ELSE}
  1875. function CryptEnumProvidersW; external advapi32 name 'CryptEnumProvidersW';
  1876. {$ENDIF DYNAMIC_LINK}
  1877. {$IFDEF UNICODE}
  1878. {$IFDEF DYNAMIC_LINK}
  1879. var
  1880.   _CryptEnumProviders: Pointer;
  1881. function CryptEnumProviders;
  1882. begin
  1883.   GetProcedureAddress(_CryptEnumProviders, advapi32, 'CryptEnumProvidersW');
  1884.   asm
  1885.     mov esp, ebp
  1886.     pop ebp
  1887.     jmp [_CryptEnumProviders]
  1888.   end;
  1889. end;
  1890. {$ELSE}
  1891. function CryptEnumProviders; external advapi32 name 'CryptEnumProvidersW';
  1892. {$ENDIF DYNAMIC_LINK}
  1893. {$ELSE}
  1894. {$IFDEF DYNAMIC_LINK}
  1895. var
  1896.   _CryptEnumProviders: Pointer;
  1897. function CryptEnumProviders;
  1898. begin
  1899.   GetProcedureAddress(_CryptEnumProviders, advapi32, 'CryptEnumProvidersA');
  1900.   asm
  1901.     mov esp, ebp
  1902.     pop ebp
  1903.     jmp [_CryptEnumProviders]
  1904.   end;
  1905. end;
  1906. {$ELSE}
  1907. function CryptEnumProviders; external advapi32 name 'CryptEnumProvidersA';
  1908. {$ENDIF DYNAMIC_LINK}
  1909. {$ENDIF}
  1910. {$IFDEF DYNAMIC_LINK}
  1911. var
  1912.   _CryptContextAddRef: Pointer;
  1913. function CryptContextAddRef;
  1914. begin
  1915.   GetProcedureAddress(_CryptContextAddRef, advapi32, 'CryptContextAddRef');
  1916.   asm
  1917.     mov esp, ebp
  1918.     pop ebp
  1919.     jmp [_CryptContextAddRef]
  1920.   end;
  1921. end;
  1922. {$ELSE}
  1923. function CryptContextAddRef; external advapi32 name 'CryptContextAddRef';
  1924. {$ENDIF DYNAMIC_LINK}
  1925. {$IFDEF DYNAMIC_LINK}
  1926. var
  1927.   _CryptDuplicateKey: Pointer;
  1928. function CryptDuplicateKey;
  1929. begin
  1930.   GetProcedureAddress(_CryptDuplicateKey, advapi32, 'CryptDuplicateKey');
  1931.   asm
  1932.     mov esp, ebp
  1933.     pop ebp
  1934.     jmp [_CryptDuplicateKey]
  1935.   end;
  1936. end;
  1937. {$ELSE}
  1938. function CryptDuplicateKey; external advapi32 name 'CryptDuplicateKey';
  1939. {$ENDIF DYNAMIC_LINK}
  1940. {$IFDEF DYNAMIC_LINK}
  1941. var
  1942.   _CryptDuplicateHash: Pointer;
  1943. function CryptDuplicateHash;
  1944. begin
  1945.   GetProcedureAddress(_CryptDuplicateHash, advapi32, 'CryptDuplicateHash');
  1946.   asm
  1947.     mov esp, ebp
  1948.     pop ebp
  1949.     jmp [_CryptDuplicateHash]
  1950.   end;
  1951. end;
  1952. {$ELSE}
  1953. function CryptDuplicateHash; external advapi32 name 'CryptDuplicateHash';
  1954. {$ENDIF DYNAMIC_LINK}
  1955. {$IFDEF DYNAMIC_LINK}
  1956. var
  1957.   _CryptFormatObject: Pointer;
  1958. function CryptFormatObject;
  1959. begin
  1960.   GetProcedureAddress(_CryptFormatObject, crypt32, 'CryptFormatObject');
  1961.   asm
  1962.     mov esp, ebp
  1963.     pop ebp
  1964.     jmp [_CryptFormatObject]
  1965.   end;
  1966. end;
  1967. {$ELSE}
  1968. function CryptFormatObject; external crypt32 name 'CryptFormatObject';
  1969. {$ENDIF DYNAMIC_LINK}
  1970. {$IFDEF DYNAMIC_LINK}
  1971. var
  1972.   _CryptEncodeObjectEx: Pointer;
  1973. function CryptEncodeObjectEx;
  1974. begin
  1975.   GetProcedureAddress(_CryptEncodeObjectEx, crypt32, 'CryptEncodeObjectEx');
  1976.   asm
  1977.     mov esp, ebp
  1978.     pop ebp
  1979.     jmp [_CryptEncodeObjectEx]
  1980.   end;
  1981. end;
  1982. {$ELSE}
  1983. function CryptEncodeObjectEx; external crypt32 name 'CryptEncodeObjectEx';
  1984. {$ENDIF DYNAMIC_LINK}
  1985. {$IFDEF DYNAMIC_LINK}
  1986. var
  1987.   _CryptEncodeObject: Pointer;
  1988. function CryptEncodeObject;
  1989. begin
  1990.   GetProcedureAddress(_CryptEncodeObject, crypt32, 'CryptEncodeObject');
  1991.   asm
  1992.     mov esp, ebp
  1993.     pop ebp
  1994.     jmp [_CryptEncodeObject]
  1995.   end;
  1996. end;
  1997. {$ELSE}
  1998. function CryptEncodeObject; external crypt32 name 'CryptEncodeObject';
  1999. {$ENDIF DYNAMIC_LINK}
  2000. {$IFDEF DYNAMIC_LINK}
  2001. var
  2002.   _CryptDecodeObjectEx: Pointer;
  2003. function CryptDecodeObjectEx;
  2004. begin
  2005.   GetProcedureAddress(_CryptDecodeObjectEx, crypt32, 'CryptDecodeObjectEx');
  2006.   asm
  2007.     mov esp, ebp
  2008.     pop ebp
  2009.     jmp [_CryptDecodeObjectEx]
  2010.   end;
  2011. end;
  2012. {$ELSE}
  2013. function CryptDecodeObjectEx; external crypt32 name 'CryptDecodeObjectEx';
  2014. {$ENDIF DYNAMIC_LINK}
  2015. {$IFDEF DYNAMIC_LINK}
  2016. var
  2017.   _CryptDecodeObject: Pointer;
  2018. function CryptDecodeObject;
  2019. begin
  2020.   GetProcedureAddress(_CryptDecodeObject, crypt32, 'CryptDecodeObject');
  2021.   asm
  2022.     mov esp, ebp
  2023.     pop ebp
  2024.     jmp [_CryptDecodeObject]
  2025.   end;
  2026. end;
  2027. {$ELSE}
  2028. function CryptDecodeObject; external crypt32 name 'CryptDecodeObject';
  2029. {$ENDIF DYNAMIC_LINK}
  2030. {$IFDEF DYNAMIC_LINK}
  2031. var
  2032.   _CryptInstallOIDFunctionAddress: Pointer;
  2033. function CryptInstallOIDFunctionAddress;
  2034. begin
  2035.   GetProcedureAddress(_CryptInstallOIDFunctionAddress, crypt32, 'CryptInstallOIDFunctionAddress');
  2036.   asm
  2037.     mov esp, ebp
  2038.     pop ebp
  2039.     jmp [_CryptInstallOIDFunctionAddress]
  2040.   end;
  2041. end;
  2042. {$ELSE}
  2043. function CryptInstallOIDFunctionAddress; external crypt32 name 'CryptInstallOIDFunctionAddress';
  2044. {$ENDIF DYNAMIC_LINK}
  2045. {$IFDEF DYNAMIC_LINK}
  2046. var
  2047.   _CryptInitOIDFunctionSet: Pointer;
  2048. function CryptInitOIDFunctionSet;
  2049. begin
  2050.   GetProcedureAddress(_CryptInitOIDFunctionSet, crypt32, 'CryptInitOIDFunctionSet');
  2051.   asm
  2052.     mov esp, ebp
  2053.     pop ebp
  2054.     jmp [_CryptInitOIDFunctionSet]
  2055.   end;
  2056. end;
  2057. {$ELSE}
  2058. function CryptInitOIDFunctionSet; external crypt32 name 'CryptInitOIDFunctionSet';
  2059. {$ENDIF DYNAMIC_LINK}
  2060. {$IFDEF DYNAMIC_LINK}
  2061. var
  2062.   _CryptGetOIDFunctionAddress: Pointer;
  2063. function CryptGetOIDFunctionAddress;
  2064. begin
  2065.   GetProcedureAddress(_CryptGetOIDFunctionAddress, crypt32, 'CryptGetOIDFunctionAddress');
  2066.   asm
  2067.     mov esp, ebp
  2068.     pop ebp
  2069.     jmp [_CryptGetOIDFunctionAddress]
  2070.   end;
  2071. end;
  2072. {$ELSE}
  2073. function CryptGetOIDFunctionAddress; external crypt32 name 'CryptGetOIDFunctionAddress';
  2074. {$ENDIF DYNAMIC_LINK}
  2075. {$IFDEF DYNAMIC_LINK}
  2076. var
  2077.   _CryptGetDefaultOIDDllList: Pointer;
  2078. function CryptGetDefaultOIDDllList;
  2079. begin
  2080.   GetProcedureAddress(_CryptGetDefaultOIDDllList, crypt32, 'CryptGetDefaultOIDDllList');
  2081.   asm
  2082.     mov esp, ebp
  2083.     pop ebp
  2084.     jmp [_CryptGetDefaultOIDDllList]
  2085.   end;
  2086. end;
  2087. {$ELSE}
  2088. function CryptGetDefaultOIDDllList; external crypt32 name 'CryptGetDefaultOIDDllList';
  2089. {$ENDIF DYNAMIC_LINK}
  2090. {$IFDEF DYNAMIC_LINK}
  2091. var
  2092.   _CryptGetDefaultOIDFunctionAddr: Pointer;
  2093. function CryptGetDefaultOIDFunctionAddress;
  2094. begin
  2095.   GetProcedureAddress(_CryptGetDefaultOIDFunctionAddr, crypt32, 'CryptGetDefaultOIDFunctionAddress');
  2096.   asm
  2097.     mov esp, ebp
  2098.     pop ebp
  2099.     jmp [_CryptGetDefaultOIDFunctionAddr]
  2100.   end;
  2101. end;
  2102. {$ELSE}
  2103. function CryptGetDefaultOIDFunctionAddress; external crypt32 name 'CryptGetDefaultOIDFunctionAddress';
  2104. {$ENDIF DYNAMIC_LINK}
  2105. {$IFDEF DYNAMIC_LINK}
  2106. var
  2107.   _CryptFreeOIDFunctionAddress: Pointer;
  2108. function CryptFreeOIDFunctionAddress;
  2109. begin
  2110.   GetProcedureAddress(_CryptFreeOIDFunctionAddress, crypt32, 'CryptFreeOIDFunctionAddress');
  2111.   asm
  2112.     mov esp, ebp
  2113.     pop ebp
  2114.     jmp [_CryptFreeOIDFunctionAddress]
  2115.   end;
  2116. end;
  2117. {$ELSE}
  2118. function CryptFreeOIDFunctionAddress; external crypt32 name 'CryptFreeOIDFunctionAddress';
  2119. {$ENDIF DYNAMIC_LINK}
  2120. {$IFDEF DYNAMIC_LINK}
  2121. var
  2122.   _CryptRegisterOIDFunction: Pointer;
  2123. function CryptRegisterOIDFunction;
  2124. begin
  2125.   GetProcedureAddress(_CryptRegisterOIDFunction, crypt32, 'CryptRegisterOIDFunction');
  2126.   asm
  2127.     mov esp, ebp
  2128.     pop ebp
  2129.     jmp [_CryptRegisterOIDFunction]
  2130.   end;
  2131. end;
  2132. {$ELSE}
  2133. function CryptRegisterOIDFunction; external crypt32 name 'CryptRegisterOIDFunction';
  2134. {$ENDIF DYNAMIC_LINK}
  2135. {$IFDEF DYNAMIC_LINK}
  2136. var
  2137.   _CryptUnregisterOIDFunction: Pointer;
  2138. function CryptUnregisterOIDFunction;
  2139. begin
  2140.   GetProcedureAddress(_CryptUnregisterOIDFunction, crypt32, 'CryptUnregisterOIDFunction');
  2141.   asm
  2142.     mov esp, ebp
  2143.     pop ebp
  2144.     jmp [_CryptUnregisterOIDFunction]
  2145.   end;
  2146. end;
  2147. {$ELSE}
  2148. function CryptUnregisterOIDFunction; external crypt32 name 'CryptUnregisterOIDFunction';
  2149. {$ENDIF DYNAMIC_LINK}
  2150. {$IFDEF DYNAMIC_LINK}
  2151. var
  2152.   _CryptRegisterDefaultOIDFunction: Pointer;
  2153. function CryptRegisterDefaultOIDFunction;
  2154. begin
  2155.   GetProcedureAddress(_CryptRegisterDefaultOIDFunction, crypt32, 'CryptRegisterDefaultOIDFunction');
  2156.   asm
  2157.     mov esp, ebp
  2158.     pop ebp
  2159.     jmp [_CryptRegisterDefaultOIDFunction]
  2160.   end;
  2161. end;
  2162. {$ELSE}
  2163. function CryptRegisterDefaultOIDFunction; external crypt32 name 'CryptRegisterDefaultOIDFunction';
  2164. {$ENDIF DYNAMIC_LINK}
  2165. {$IFDEF DYNAMIC_LINK}
  2166. var
  2167.   _CryptUnregisterDefaultOIDFunc: Pointer;
  2168. function CryptUnregisterDefaultOIDFunction;
  2169. begin
  2170.   GetProcedureAddress(_CryptUnregisterDefaultOIDFunc, crypt32, 'CryptUnregisterDefaultOIDFunction');
  2171.   asm
  2172.     mov esp, ebp
  2173.     pop ebp
  2174.     jmp [_CryptUnregisterDefaultOIDFunc]
  2175.   end;
  2176. end;
  2177. {$ELSE}
  2178. function CryptUnregisterDefaultOIDFunction; external crypt32 name 'CryptUnregisterDefaultOIDFunction';
  2179. {$ENDIF DYNAMIC_LINK}
  2180. {$IFDEF DYNAMIC_LINK}
  2181. var
  2182.   _CryptSetOIDFunctionValue: Pointer;
  2183. function CryptSetOIDFunctionValue;
  2184. begin
  2185.   GetProcedureAddress(_CryptSetOIDFunctionValue, crypt32, 'CryptSetOIDFunctionValue');
  2186.   asm
  2187.     mov esp, ebp
  2188.     pop ebp
  2189.     jmp [_CryptSetOIDFunctionValue]
  2190.   end;
  2191. end;
  2192. {$ELSE}
  2193. function CryptSetOIDFunctionValue; external crypt32 name 'CryptSetOIDFunctionValue';
  2194. {$ENDIF DYNAMIC_LINK}
  2195. {$IFDEF DYNAMIC_LINK}
  2196. var
  2197.   _CryptGetOIDFunctionValue: Pointer;
  2198. function CryptGetOIDFunctionValue;
  2199. begin
  2200.   GetProcedureAddress(_CryptGetOIDFunctionValue, crypt32, 'CryptGetOIDFunctionValue');
  2201.   asm
  2202.     mov esp, ebp
  2203.     pop ebp
  2204.     jmp [_CryptGetOIDFunctionValue]
  2205.   end;
  2206. end;
  2207. {$ELSE}
  2208. function CryptGetOIDFunctionValue; external crypt32 name 'CryptGetOIDFunctionValue';
  2209. {$ENDIF DYNAMIC_LINK}
  2210. {$IFDEF DYNAMIC_LINK}
  2211. var
  2212.   _CryptEnumOIDFunction: Pointer;
  2213. function CryptEnumOIDFunction;
  2214. begin
  2215.   GetProcedureAddress(_CryptEnumOIDFunction, crypt32, 'CryptEnumOIDFunction');
  2216.   asm
  2217.     mov esp, ebp
  2218.     pop ebp
  2219.     jmp [_CryptEnumOIDFunction]
  2220.   end;
  2221. end;
  2222. {$ELSE}
  2223. function CryptEnumOIDFunction; external crypt32 name 'CryptEnumOIDFunction';
  2224. {$ENDIF DYNAMIC_LINK}
  2225. {$IFDEF DYNAMIC_LINK}
  2226. var
  2227.   _CryptFindOIDInfo: Pointer;
  2228. function CryptFindOIDInfo;
  2229. begin
  2230.   GetProcedureAddress(_CryptFindOIDInfo, crypt32, 'CryptFindOIDInfo');
  2231.   asm
  2232.     mov esp, ebp
  2233.     pop ebp
  2234.     jmp [_CryptFindOIDInfo]
  2235.   end;
  2236. end;
  2237. {$ELSE}
  2238. function CryptFindOIDInfo; external crypt32 name 'CryptFindOIDInfo';
  2239. {$ENDIF DYNAMIC_LINK}
  2240. {$IFDEF DYNAMIC_LINK}
  2241. var
  2242.   _CryptRegisterOIDInfo: Pointer;
  2243. function CryptRegisterOIDInfo;
  2244. begin
  2245.   GetProcedureAddress(_CryptRegisterOIDInfo, crypt32, 'CryptRegisterOIDInfo');
  2246.   asm
  2247.     mov esp, ebp
  2248.     pop ebp
  2249.     jmp [_CryptRegisterOIDInfo]
  2250.   end;
  2251. end;
  2252. {$ELSE}
  2253. function CryptRegisterOIDInfo; external crypt32 name 'CryptRegisterOIDInfo';
  2254. {$ENDIF DYNAMIC_LINK}
  2255. {$IFDEF DYNAMIC_LINK}
  2256. var
  2257.   _CryptUnregisterOIDInfo: Pointer;
  2258. function CryptUnregisterOIDInfo;
  2259. begin
  2260.   GetProcedureAddress(_CryptUnregisterOIDInfo, crypt32, 'CryptUnregisterOIDInfo');
  2261.   asm
  2262.     mov esp, ebp
  2263.     pop ebp
  2264.     jmp [_CryptUnregisterOIDInfo]
  2265.   end;
  2266. end;
  2267. {$ELSE}
  2268. function CryptUnregisterOIDInfo; external crypt32 name 'CryptUnregisterOIDInfo';
  2269. {$ENDIF DYNAMIC_LINK}
  2270. {$IFDEF DYNAMIC_LINK}
  2271. var
  2272.   _CryptEnumOIDInfo: Pointer;
  2273. function CryptEnumOIDInfo;
  2274. begin
  2275.   GetProcedureAddress(_CryptEnumOIDInfo, crypt32, 'CryptEnumOIDInfo');
  2276.   asm
  2277.     mov esp, ebp
  2278.     pop ebp
  2279.     jmp [_CryptEnumOIDInfo]
  2280.   end;
  2281. end;
  2282. {$ELSE}
  2283. function CryptEnumOIDInfo; external crypt32 name 'CryptEnumOIDInfo';
  2284. {$ENDIF DYNAMIC_LINK}
  2285. {$IFDEF DYNAMIC_LINK}
  2286. var
  2287.   _CryptFindLocalizedName: Pointer;
  2288. function CryptFindLocalizedName;
  2289. begin
  2290.   GetProcedureAddress(_CryptFindLocalizedName, crypt32, 'CryptFindLocalizedName');
  2291.   asm
  2292.     mov esp, ebp
  2293.     pop ebp
  2294.     jmp [_CryptFindLocalizedName]
  2295.   end;
  2296. end;
  2297. {$ELSE}
  2298. function CryptFindLocalizedName; external crypt32 name 'CryptFindLocalizedName';
  2299. {$ENDIF DYNAMIC_LINK}
  2300. {$IFDEF DYNAMIC_LINK}
  2301. var
  2302.   _CryptMsgOpenToEncode: Pointer;
  2303. function CryptMsgOpenToEncode;
  2304. begin
  2305.   GetProcedureAddress(_CryptMsgOpenToEncode, crypt32, 'CryptMsgOpenToEncode');
  2306.   asm
  2307.     mov esp, ebp
  2308.     pop ebp
  2309.     jmp [_CryptMsgOpenToEncode]
  2310.   end;
  2311. end;
  2312. {$ELSE}
  2313. function CryptMsgOpenToEncode; external crypt32 name 'CryptMsgOpenToEncode';
  2314. {$ENDIF DYNAMIC_LINK}
  2315. {$IFDEF DYNAMIC_LINK}
  2316. var
  2317.   _CryptMsgCalculateEncodedLength: Pointer;
  2318. function CryptMsgCalculateEncodedLength;
  2319. begin
  2320.   GetProcedureAddress(_CryptMsgCalculateEncodedLength, crypt32, 'CryptMsgCalculateEncodedLength');
  2321.   asm
  2322.     mov esp, ebp
  2323.     pop ebp
  2324.     jmp [_CryptMsgCalculateEncodedLength]
  2325.   end;
  2326. end;
  2327. {$ELSE}
  2328. function CryptMsgCalculateEncodedLength; external crypt32 name 'CryptMsgCalculateEncodedLength';
  2329. {$ENDIF DYNAMIC_LINK}
  2330. {$IFDEF DYNAMIC_LINK}
  2331. var
  2332.   _CryptMsgOpenToDecode: Pointer;
  2333. function CryptMsgOpenToDecode;
  2334. begin
  2335.   GetProcedureAddress(_CryptMsgOpenToDecode, crypt32, 'CryptMsgOpenToDecode');
  2336.   asm
  2337.     mov esp, ebp
  2338.     pop ebp
  2339.     jmp [_CryptMsgOpenToDecode]
  2340.   end;
  2341. end;
  2342. {$ELSE}
  2343. function CryptMsgOpenToDecode; external crypt32 name 'CryptMsgOpenToDecode';
  2344. {$ENDIF DYNAMIC_LINK}
  2345. {$IFDEF DYNAMIC_LINK}
  2346. var
  2347.   _CryptMsgDuplicate: Pointer;
  2348. function CryptMsgDuplicate;
  2349. begin
  2350.   GetProcedureAddress(_CryptMsgDuplicate, crypt32, 'CryptMsgDuplicate');
  2351.   asm
  2352.     mov esp, ebp
  2353.     pop ebp
  2354.     jmp [_CryptMsgDuplicate]
  2355.   end;
  2356. end;
  2357. {$ELSE}
  2358. function CryptMsgDuplicate; external crypt32 name 'CryptMsgDuplicate';
  2359. {$ENDIF DYNAMIC_LINK}
  2360. {$IFDEF DYNAMIC_LINK}
  2361. var
  2362.   _CryptMsgClose: Pointer;
  2363. function CryptMsgClose;
  2364. begin
  2365.   GetProcedureAddress(_CryptMsgClose, crypt32, 'CryptMsgClose');
  2366.   asm
  2367.     mov esp, ebp
  2368.     pop ebp
  2369.     jmp [_CryptMsgClose]
  2370.   end;
  2371. end;
  2372. {$ELSE}
  2373. function CryptMsgClose; external crypt32 name 'CryptMsgClose';
  2374. {$ENDIF DYNAMIC_LINK}
  2375. {$IFDEF DYNAMIC_LINK}
  2376. var
  2377.   _CryptMsgUpdate: Pointer;
  2378. function CryptMsgUpdate;
  2379. begin
  2380.   GetProcedureAddress(_CryptMsgUpdate, crypt32, 'CryptMsgUpdate');
  2381.   asm
  2382.     mov esp, ebp
  2383.     pop ebp
  2384.     jmp [_CryptMsgUpdate]
  2385.   end;
  2386. end;
  2387. {$ELSE}
  2388. function CryptMsgUpdate; external crypt32 name 'CryptMsgUpdate';
  2389. {$ENDIF DYNAMIC_LINK}
  2390. {$IFDEF DYNAMIC_LINK}
  2391. var
  2392.   _CryptMsgGetParam: Pointer;
  2393. function CryptMsgGetParam;
  2394. begin
  2395.   GetProcedureAddress(_CryptMsgGetParam, crypt32, 'CryptMsgGetParam');
  2396.   asm
  2397.     mov esp, ebp
  2398.     pop ebp
  2399.     jmp [_CryptMsgGetParam]
  2400.   end;
  2401. end;
  2402. {$ELSE}
  2403. function CryptMsgGetParam; external crypt32 name 'CryptMsgGetParam';
  2404. {$ENDIF DYNAMIC_LINK}
  2405. {$IFDEF DYNAMIC_LINK}
  2406. var
  2407.   _CryptMsgControl: Pointer;
  2408. function CryptMsgControl;
  2409. begin
  2410.   GetProcedureAddress(_CryptMsgControl, crypt32, 'CryptMsgControl');
  2411.   asm
  2412.     mov esp, ebp
  2413.     pop ebp
  2414.     jmp [_CryptMsgControl]
  2415.   end;
  2416. end;
  2417. {$ELSE}
  2418. function CryptMsgControl; external crypt32 name 'CryptMsgControl';
  2419. {$ENDIF DYNAMIC_LINK}
  2420. {$IFDEF DYNAMIC_LINK}
  2421. var
  2422.   _CryptMsgVerifyCountersigEnc: Pointer;
  2423. function CryptMsgVerifyCountersignatureEncoded;
  2424. begin
  2425.   GetProcedureAddress(_CryptMsgVerifyCountersigEnc, crypt32, 'CryptMsgVerifyCountersignatureEncoded');
  2426.   asm
  2427.     mov esp, ebp
  2428.     pop ebp
  2429.     jmp [_CryptMsgVerifyCountersigEnc]
  2430.   end;
  2431. end;
  2432. {$ELSE}
  2433. function CryptMsgVerifyCountersignatureEncoded; external crypt32 name 'CryptMsgVerifyCountersignatureEncoded';
  2434. {$ENDIF DYNAMIC_LINK}
  2435. {$IFDEF DYNAMIC_LINK}
  2436. var
  2437.   _CryptMsgVerifyCountersigEncEx: Pointer;
  2438. function CryptMsgVerifyCountersignatureEncodedEx;
  2439. begin
  2440.   GetProcedureAddress(_CryptMsgVerifyCountersigEncEx, crypt32, 'CryptMsgVerifyCountersignatureEncodedEx');
  2441.   asm
  2442.     mov esp, ebp
  2443.     pop ebp
  2444.     jmp [_CryptMsgVerifyCountersigEncEx]
  2445.   end;
  2446. end;
  2447. {$ELSE}
  2448. function CryptMsgVerifyCountersignatureEncodedEx; external crypt32 name 'CryptMsgVerifyCountersignatureEncodedEx';
  2449. {$ENDIF DYNAMIC_LINK}
  2450. {$IFDEF DYNAMIC_LINK}
  2451. var
  2452.   _CryptMsgCountersign: Pointer;
  2453. function CryptMsgCountersign;
  2454. begin
  2455.   GetProcedureAddress(_CryptMsgCountersign, crypt32, 'CryptMsgCountersign');
  2456.   asm
  2457.     mov esp, ebp
  2458.     pop ebp
  2459.     jmp [_CryptMsgCountersign]
  2460.   end;
  2461. end;
  2462. {$ELSE}
  2463. function CryptMsgCountersign; external crypt32 name 'CryptMsgCountersign';
  2464. {$ENDIF DYNAMIC_LINK}
  2465. {$IFDEF DYNAMIC_LINK}
  2466. var
  2467.   _CryptMsgCountersignEncoded: Pointer;
  2468. function CryptMsgCountersignEncoded;
  2469. begin
  2470.   GetProcedureAddress(_CryptMsgCountersignEncoded, crypt32, 'CryptMsgCountersignEncoded');
  2471.   asm
  2472.     mov esp, ebp
  2473.     pop ebp
  2474.     jmp [_CryptMsgCountersignEncoded]
  2475.   end;
  2476. end;
  2477. {$ELSE}
  2478. function CryptMsgCountersignEncoded; external crypt32 name 'CryptMsgCountersignEncoded';
  2479. {$ENDIF DYNAMIC_LINK}
  2480. {$IFDEF DYNAMIC_LINK}
  2481. var
  2482.   _CertOpenStore: Pointer;
  2483. function CertOpenStore;
  2484. begin
  2485.   GetProcedureAddress(_CertOpenStore, crypt32, 'CertOpenStore');
  2486.   asm
  2487.     mov esp, ebp
  2488.     pop ebp
  2489.     jmp [_CertOpenStore]
  2490.   end;
  2491. end;
  2492. {$ELSE}
  2493. function CertOpenStore; external crypt32 name 'CertOpenStore';
  2494. {$ENDIF DYNAMIC_LINK}
  2495. {$IFDEF DYNAMIC_LINK}
  2496. var
  2497.   _CertDuplicateStore: Pointer;
  2498. function CertDuplicateStore;
  2499. begin
  2500.   GetProcedureAddress(_CertDuplicateStore, crypt32, 'CertDuplicateStore');
  2501.   asm
  2502.     mov esp, ebp
  2503.     pop ebp
  2504.     jmp [_CertDuplicateStore]
  2505.   end;
  2506. end;
  2507. {$ELSE}
  2508. function CertDuplicateStore; external crypt32 name 'CertDuplicateStore';
  2509. {$ENDIF DYNAMIC_LINK}
  2510. {$IFDEF DYNAMIC_LINK}
  2511. var
  2512.   _CertSaveStore: Pointer;
  2513. function CertSaveStore;
  2514. begin
  2515.   GetProcedureAddress(_CertSaveStore, crypt32, 'CertSaveStore');
  2516.   asm
  2517.     mov esp, ebp
  2518.     pop ebp
  2519.     jmp [_CertSaveStore]
  2520.   end;
  2521. end;
  2522. {$ELSE}
  2523. function CertSaveStore; external crypt32 name 'CertSaveStore';
  2524. {$ENDIF DYNAMIC_LINK}
  2525. {$IFDEF DYNAMIC_LINK}
  2526. var
  2527.   _CertCloseStore: Pointer;
  2528. function CertCloseStore;
  2529. begin
  2530.   GetProcedureAddress(_CertCloseStore, crypt32, 'CertCloseStore');
  2531.   asm
  2532.     mov esp, ebp
  2533.     pop ebp
  2534.     jmp [_CertCloseStore]
  2535.   end;
  2536. end;
  2537. {$ELSE}
  2538. function CertCloseStore; external crypt32 name 'CertCloseStore';
  2539. {$ENDIF DYNAMIC_LINK}
  2540. {$IFDEF DYNAMIC_LINK}
  2541. var
  2542.   _CertGetSubjectCertFromStore: Pointer;
  2543. function CertGetSubjectCertificateFromStore;
  2544. begin
  2545.   GetProcedureAddress(_CertGetSubjectCertFromStore, crypt32, 'CertGetSubjectCertificateFromStore');
  2546.   asm
  2547.     mov esp, ebp
  2548.     pop ebp
  2549.     jmp [_CertGetSubjectCertFromStore]
  2550.   end;
  2551. end;
  2552. {$ELSE}
  2553. function CertGetSubjectCertificateFromStore; external crypt32 name 'CertGetSubjectCertificateFromStore';
  2554. {$ENDIF DYNAMIC_LINK}
  2555. {$IFDEF DYNAMIC_LINK}
  2556. var
  2557.   _CertEnumCertificatesInStore: Pointer;
  2558. function CertEnumCertificatesInStore;
  2559. begin
  2560.   GetProcedureAddress(_CertEnumCertificatesInStore, crypt32, 'CertEnumCertificatesInStore');
  2561.   asm
  2562.     mov esp, ebp
  2563.     pop ebp
  2564.     jmp [_CertEnumCertificatesInStore]
  2565.   end;
  2566. end;
  2567. {$ELSE}
  2568. function CertEnumCertificatesInStore; external crypt32 name 'CertEnumCertificatesInStore';
  2569. {$ENDIF DYNAMIC_LINK}
  2570. {$IFDEF DYNAMIC_LINK}
  2571. var
  2572.   _CertFindCertificateInStore: Pointer;
  2573. function CertFindCertificateInStore;
  2574. begin
  2575.   GetProcedureAddress(_CertFindCertificateInStore, crypt32, 'CertFindCertificateInStore');
  2576.   asm
  2577.     mov esp, ebp
  2578.     pop ebp
  2579.     jmp [_CertFindCertificateInStore]
  2580.   end;
  2581. end;
  2582. {$ELSE}
  2583. function CertFindCertificateInStore; external crypt32 name 'CertFindCertificateInStore';
  2584. {$ENDIF DYNAMIC_LINK}
  2585. {$IFDEF DYNAMIC_LINK}
  2586. var
  2587.   _CertGetIssuerCertFromStore: Pointer;
  2588. function CertGetIssuerCertificateFromStore;
  2589. begin
  2590.   GetProcedureAddress(_CertGetIssuerCertFromStore, crypt32, 'CertGetIssuerCertificateFromStore');
  2591.   asm
  2592.     mov esp, ebp
  2593.     pop ebp
  2594.     jmp [_CertGetIssuerCertFromStore]
  2595.   end;
  2596. end;
  2597. {$ELSE}
  2598. function CertGetIssuerCertificateFromStore; external crypt32 name 'CertGetIssuerCertificateFromStore';
  2599. {$ENDIF DYNAMIC_LINK}
  2600. {$IFDEF DYNAMIC_LINK}
  2601. var
  2602.   _CertVerifySubjectCertContext: Pointer;
  2603. function CertVerifySubjectCertificateContext;