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

Windows编程

开发平台:

Delphi

  1. //+=========================================================================
  2. //  Certificate Verify CTL Usage Data Structures and APIs
  3. //==========================================================================
  4. type
  5.   PCTL_VERIFY_USAGE_PARA = ^CTL_VERIFY_USAGE_PARA;
  6.   {$EXTERNALSYM PCTL_VERIFY_USAGE_PARA}
  7.   _CTL_VERIFY_USAGE_PARA = record
  8.     cbSize: DWORD;
  9.     ListIdentifier: CRYPT_DATA_BLOB; // OPTIONAL
  10.     cCtlStore: DWORD;
  11.     rghCtlStore: PHCERTSTORE; // OPTIONAL
  12.     cSignerStore: DWORD;
  13.     rghSignerStore: PHCERTSTORE; // OPTIONAL
  14.   end;
  15.   {$EXTERNALSYM _CTL_VERIFY_USAGE_PARA}
  16.   CTL_VERIFY_USAGE_PARA = _CTL_VERIFY_USAGE_PARA;
  17.   {$EXTERNALSYM CTL_VERIFY_USAGE_PARA}
  18.   TCtlVerifyUsagePara = CTL_VERIFY_USAGE_PARA;
  19.   PCtlVerifyUsagePara = PCTL_VERIFY_USAGE_PARA;
  20.   PCTL_VERIFY_USAGE_STATUS = ^CTL_VERIFY_USAGE_STATUS;
  21.   {$EXTERNALSYM PCTL_VERIFY_USAGE_STATUS}
  22.   _CTL_VERIFY_USAGE_STATUS = record
  23.     cbSize: DWORD;
  24.     dwError: DWORD;
  25.     dwFlags: DWORD;
  26.     ppCtl: PPCCTL_CONTEXT; // IN OUT OPTIONAL
  27.     dwCtlEntryIndex: DWORD;
  28.     ppSigner: PPCCERT_CONTEXT; // IN OUT OPTIONAL
  29.     dwSignerIndex: DWORD;
  30.   end;
  31.   {$EXTERNALSYM _CTL_VERIFY_USAGE_STATUS}
  32.   CTL_VERIFY_USAGE_STATUS = _CTL_VERIFY_USAGE_STATUS;
  33.   {$EXTERNALSYM CTL_VERIFY_USAGE_STATUS}
  34.   TCtlVerifyUsageStatus = CTL_VERIFY_USAGE_STATUS;
  35.   PCtlVerifyUsageStatus = PCTL_VERIFY_USAGE_STATUS;
  36. const
  37.   CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG = $1;
  38.   {$EXTERNALSYM CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG}
  39.   CERT_VERIFY_TRUSTED_SIGNERS_FLAG    = $2;
  40.   {$EXTERNALSYM CERT_VERIFY_TRUSTED_SIGNERS_FLAG}
  41.   CERT_VERIFY_NO_TIME_CHECK_FLAG      = $4;
  42.   {$EXTERNALSYM CERT_VERIFY_NO_TIME_CHECK_FLAG}
  43.   CERT_VERIFY_ALLOW_MORE_USAGE_FLAG   = $8;
  44.   {$EXTERNALSYM CERT_VERIFY_ALLOW_MORE_USAGE_FLAG}
  45.   CERT_VERIFY_UPDATED_CTL_FLAG = $1;
  46.   {$EXTERNALSYM CERT_VERIFY_UPDATED_CTL_FLAG}
  47. //+-------------------------------------------------------------------------
  48. //  Verify that a subject is trusted for the specified usage by finding a
  49. //  signed and time valid CTL with the usage identifiers and containing the
  50. //  the subject. A subject can be identified by either its certificate context
  51. //  or any identifier such as its SHA1 hash.
  52. //
  53. //  See CertFindSubjectInCTL for definition of dwSubjectType and pvSubject
  54. //  parameters.
  55. //
  56. //  Via pVerifyUsagePara, the caller can specify the stores to be searched
  57. //  to find the CTL. The caller can also specify the stores containing
  58. //  acceptable CTL signers. By setting the ListIdentifier, the caller
  59. //  can also restrict to a particular signer CTL list.
  60. //
  61. //  Via pVerifyUsageStatus, the CTL containing the subject, the subject's
  62. //  index into the CTL's array of entries, and the signer of the CTL
  63. //  are returned. If the caller is not interested, ppCtl and ppSigner can be set
  64. //  to NULL. Returned contexts must be freed via the store's free context APIs.
  65. //
  66. //  If the CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG isn't set, then, a time
  67. //  invalid CTL in one of the CtlStores may be replaced. When replaced, the
  68. //  CERT_VERIFY_UPDATED_CTL_FLAG is set in pVerifyUsageStatus->dwFlags.
  69. //
  70. //  If the CERT_VERIFY_TRUSTED_SIGNERS_FLAG is set, then, only the
  71. //  SignerStores specified in pVerifyUsageStatus are searched to find
  72. //  the signer. Otherwise, the SignerStores provide additional sources
  73. //  to find the signer's certificate.
  74. //
  75. //  If CERT_VERIFY_NO_TIME_CHECK_FLAG is set, then, the CTLs aren't checked
  76. //  for time validity.
  77. //
  78. //  If CERT_VERIFY_ALLOW_MORE_USAGE_FLAG is set, then, the CTL may contain
  79. //  additional usage identifiers than specified by pSubjectUsage. Otherwise,
  80. //  the found CTL will contain the same usage identifers and no more.
  81. //
  82. //  CertVerifyCTLUsage will be implemented as a dispatcher to OID installable
  83. //  functions. First, it will try to find an OID function matching the first
  84. //  usage object identifier in the pUsage sequence. Next, it will dispatch
  85. //  to the default CertDllVerifyCTLUsage functions.
  86. //
  87. //  If the subject is trusted for the specified usage, then, TRUE is
  88. //  returned. Otherwise, FALSE is returned with dwError set to one of the
  89. //  following:
  90. //      CRYPT_E_NO_VERIFY_USAGE_DLL
  91. //      CRYPT_E_NO_VERIFY_USAGE_CHECK
  92. //      CRYPT_E_VERIFY_USAGE_OFFLINE
  93. //      CRYPT_E_NOT_IN_CTL
  94. //      CRYPT_E_NO_TRUSTED_SIGNER
  95. //--------------------------------------------------------------------------
  96. function CertVerifyCTLUsage(dwEncodingType: DWORD; dwSubjectType: DWORD;
  97.   pvSubject: Pointer; pSubjectUsage: PCTL_USAGE; dwFlags: DWORD;
  98.   pVerifyUsagePara: PCTL_VERIFY_USAGE_PARA;
  99.   pVerifyUsageStatus: PCTL_VERIFY_USAGE_STATUS): BOOL; stdcall;
  100. {$EXTERNALSYM CertVerifyCTLUsage}
  101. //+=========================================================================
  102. //  Certificate Revocation Data Structures and APIs
  103. //==========================================================================
  104. //+-------------------------------------------------------------------------
  105. //  The following data structure may be passed to CertVerifyRevocation to
  106. //  assist in finding the issuer of the context to be verified.
  107. //
  108. //  When pIssuerCert is specified, pIssuerCert is the issuer of
  109. //  rgpvContext[cContext - 1].
  110. //
  111. //  When cCertStore and rgCertStore are specified, these stores may contain
  112. //  an issuer certificate.
  113. //
  114. //  When hCrlStore is specified then a handler which uses CRLs can search this
  115. //  store for them
  116. //
  117. //  When pftTimeToUse is specified then the handler (if possible) must determine
  118. //  revocation status relative to the time given otherwise the answer may be
  119. //  independent of time or relative to current time
  120. //--------------------------------------------------------------------------
  121. type
  122.   PCERT_REVOCATION_PARA = ^CERT_REVOCATION_PARA;
  123.   {$EXTERNALSYM PCERT_REVOCATION_PARA}
  124.   _CERT_REVOCATION_PARA = record
  125.     cbSize: DWORD;
  126.     pIssuerCert: PCCERT_CONTEXT;
  127.     cCertStore: DWORD;
  128.     rgCertStore: PHCERTSTORE;
  129.     hCrlStore: HCERTSTORE;
  130.     pftTimeToUse: LPFILETIME;
  131.   end;
  132.   {$EXTERNALSYM _CERT_REVOCATION_PARA}
  133.   CERT_REVOCATION_PARA = _CERT_REVOCATION_PARA;
  134.   {$EXTERNALSYM CERT_REVOCATION_PARA}
  135.   TCertRevocationPara = CERT_REVOCATION_PARA;
  136.   PCertRevocationPara = PCERT_REVOCATION_PARA;
  137. //+-------------------------------------------------------------------------
  138. //  The following data structure is returned by CertVerifyRevocation to
  139. //  specify the status of the revoked or unchecked context. Review the
  140. //  following CertVerifyRevocation comments for details.
  141. //
  142. //  Upon input to CertVerifyRevocation, cbSize must be set to a size
  143. //  >= sizeof(CERT_REVOCATION_STATUS). Otherwise, CertVerifyRevocation
  144. //  returns FALSE and sets LastError to E_INVALIDARG.
  145. //
  146. //  Upon input to the installed or registered CRYPT_OID_VERIFY_REVOCATION_FUNC
  147. //  functions, the dwIndex, dwError and dwReason have been zero'ed.
  148. //--------------------------------------------------------------------------
  149.   PCERT_REVOCATION_STATUS = ^CERT_REVOCATION_STATUS;
  150.   {$EXTERNALSYM PCERT_REVOCATION_STATUS}
  151.   _CERT_REVOCATION_STATUS = record
  152.     cbSize: DWORD;
  153.     dwIndex: DWORD;
  154.     dwError: DWORD;
  155.     dwReason: DWORD;
  156.   end;
  157.   {$EXTERNALSYM _CERT_REVOCATION_STATUS}
  158.   CERT_REVOCATION_STATUS = _CERT_REVOCATION_STATUS;
  159.   {$EXTERNALSYM CERT_REVOCATION_STATUS}
  160.   TCertRevocationStatus = CERT_REVOCATION_STATUS;
  161.   PCertRevocationStatus = PCERT_REVOCATION_STATUS;
  162. //+-------------------------------------------------------------------------
  163. //  Verifies the array of contexts for revocation. The dwRevType parameter
  164. //  indicates the type of the context data structure passed in rgpvContext.
  165. //  Currently only the revocation of certificates is defined.
  166. //
  167. //  If the CERT_VERIFY_REV_CHAIN_FLAG flag is set, then, CertVerifyRevocation
  168. //  is verifying a chain of certs where, rgpvContext[i + 1] is the issuer
  169. //  of rgpvContext[i]. Otherwise, CertVerifyRevocation makes no assumptions
  170. //  about the order of the contexts.
  171. //
  172. //  To assist in finding the issuer, the pRevPara may optionally be set. See
  173. //  the CERT_REVOCATION_PARA data structure for details.
  174. //
  175. //  The contexts must contain enough information to allow the
  176. //  installable or registered revocation DLLs to find the revocation server. For
  177. //  certificates, this information would normally be conveyed in an
  178. //  extension such as the IETF's AuthorityInfoAccess extension.
  179. //
  180. //  CertVerifyRevocation returns TRUE if all of the contexts were successfully
  181. //  checked and none were revoked. Otherwise, returns FALSE and updates the
  182. //  returned pRevStatus data structure as follows:
  183. //    dwIndex
  184. //      Index of the first context that was revoked or unable to
  185. //      be checked for revocation
  186. //    dwError
  187. //      Error status. LastError is also set to this error status.
  188. //      dwError can be set to one of the following error codes defined
  189. //      in winerror.h:
  190. //        ERROR_SUCCESS - good context
  191. //        CRYPT_E_REVOKED - context was revoked. dwReason contains the
  192. //           reason for revocation
  193. //        CRYPT_E_REVOCATION_OFFLINE - unable to connect to the
  194. //           revocation server
  195. //        CRYPT_E_NOT_IN_REVOCATION_DATABASE - the context to be checked
  196. //           was not found in the revocation server's database.
  197. //        CRYPT_E_NO_REVOCATION_CHECK - the called revocation function
  198. //           wasn't able to do a revocation check on the context
  199. //        CRYPT_E_NO_REVOCATION_DLL - no installed or registered Dll was
  200. //           found to verify revocation
  201. //    dwReason
  202. //      The dwReason is currently only set for CRYPT_E_REVOKED and contains
  203. //      the reason why the context was revoked. May be one of the following
  204. //      CRL reasons defined by the CRL Reason Code extension ("2.5.29.21")
  205. //          CRL_REASON_UNSPECIFIED              0
  206. //          CRL_REASON_KEY_COMPROMISE           1
  207. //          CRL_REASON_CA_COMPROMISE            2
  208. //          CRL_REASON_AFFILIATION_CHANGED      3
  209. //          CRL_REASON_SUPERSEDED               4
  210. //          CRL_REASON_CESSATION_OF_OPERATION   5
  211. //          CRL_REASON_CERTIFICATE_HOLD         6
  212. //
  213. //  For each entry in rgpvContext, CertVerifyRevocation iterates
  214. //  through the CRYPT_OID_VERIFY_REVOCATION_FUNC
  215. //  function set's list of installed DEFAULT functions.
  216. //  CryptGetDefaultOIDFunctionAddress is called with pwszDll = NULL. If no
  217. //  installed functions are found capable of doing the revocation verification,
  218. //  CryptVerifyRevocation iterates through CRYPT_OID_VERIFY_REVOCATION_FUNC's
  219. //  list of registered DEFAULT Dlls. CryptGetDefaultOIDDllList is called to
  220. //  get the list. CryptGetDefaultOIDFunctionAddress is called to load the Dll.
  221. //
  222. //  The called functions have the same signature as CertVerifyRevocation. A
  223. //  called function returns TRUE if it was able to successfully check all of
  224. //  the contexts and none were revoked. Otherwise, the called function returns
  225. //  FALSE and updates pRevStatus. dwIndex is set to the index of
  226. //  the first context that was found to be revoked or unable to be checked.
  227. //  dwError and LastError are updated. For CRYPT_E_REVOKED, dwReason
  228. //  is updated. Upon input to the called function, dwIndex, dwError and
  229. //  dwReason have been zero'ed. cbSize has been checked to be >=
  230. //  sizeof(CERT_REVOCATION_STATUS).
  231. //
  232. //  If the called function returns FALSE, and dwError isn't set to
  233. //  CRYPT_E_REVOKED, then, CertVerifyRevocation either continues on to the
  234. //  next DLL in the list for a returned dwIndex of 0 or for a returned
  235. //  dwIndex > 0, restarts the process of finding a verify function by
  236. //  advancing the start of the context array to the returned dwIndex and
  237. //  decrementing the count of remaining contexts.
  238. //--------------------------------------------------------------------------
  239. function CertVerifyRevocation(dwEncodingType, dwRevType, cContext: DWORD;
  240.   rgpvContext: PVOID; dwFlags: DWORD; pRevPara: PCERT_REVOCATION_PARA;
  241.   pRevStatus: PCERT_REVOCATION_STATUS): BOOL; stdcall;
  242. {$EXTERNALSYM CertVerifyRevocation}
  243. //+-------------------------------------------------------------------------
  244. //  Revocation types
  245. //--------------------------------------------------------------------------
  246. const
  247.   CERT_CONTEXT_REVOCATION_TYPE = 1;
  248.   {$EXTERNALSYM CERT_CONTEXT_REVOCATION_TYPE}
  249. //+-------------------------------------------------------------------------
  250. //  When the following flag is set, rgpvContext[] consists of a chain
  251. //  of certificates, where rgpvContext[i + 1] is the issuer of rgpvContext[i].
  252. //--------------------------------------------------------------------------
  253.   CERT_VERIFY_REV_CHAIN_FLAG = $00000001;
  254.   {$EXTERNALSYM CERT_VERIFY_REV_CHAIN_FLAG}
  255. //+-------------------------------------------------------------------------
  256. // CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION prevents the revocation handler from
  257. // accessing any network based resources for revocation checking
  258. //--------------------------------------------------------------------------
  259.   CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION = $00000002;
  260.   {$EXTERNALSYM CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION}
  261. //+-------------------------------------------------------------------------
  262. //  CERT_CONTEXT_REVOCATION_TYPE
  263. //
  264. //  pvContext points to a const CERT_CONTEXT.
  265. //--------------------------------------------------------------------------
  266. //+=========================================================================
  267. //  Certificate Helper APIs
  268. //==========================================================================
  269. //+-------------------------------------------------------------------------
  270. //  Compare two multiple byte integer blobs to see if they are identical.
  271. //
  272. //  Before doing the comparison, leading zero bytes are removed from a
  273. //  positive number and leading 0xFF bytes are removed from a negative
  274. //  number.
  275. //
  276. //  The multiple byte integers are treated as Little Endian. pbData[0] is the
  277. //  least significant byte and pbData[cbData - 1] is the most significant
  278. //  byte.
  279. //
  280. //  Returns TRUE if the integer blobs are identical after removing leading
  281. //  0 or 0xFF bytes.
  282. //--------------------------------------------------------------------------
  283. function CertCompareIntegerBlob(pInt1, pInt2: PCRYPT_INTEGER_BLOB): BOOL; stdcall;
  284. {$EXTERNALSYM CertCompareIntegerBlob}
  285. //+-------------------------------------------------------------------------
  286. //  Compare two certificates to see if they are identical.
  287. //
  288. //  Since a certificate is uniquely identified by its Issuer and SerialNumber,
  289. //  these are the only fields needing to be compared.
  290. //
  291. //  Returns TRUE if the certificates are identical.
  292. //--------------------------------------------------------------------------
  293. function CertCompareCertificate(dwCertEncodingType: DWORD; pCertId1, pCertId2: PCERT_INFO): BOOL; stdcall;
  294. {$EXTERNALSYM CertCompareCertificate}
  295. //+-------------------------------------------------------------------------
  296. //  Compare two certificate names to see if they are identical.
  297. //
  298. //  Returns TRUE if the names are identical.
  299. //--------------------------------------------------------------------------
  300. function CertCompareCertificateName(dwCertEncodingType: DWORD;
  301.   pCertName1: PCERT_NAME_BLOB; pCertName2: PCERT_NAME_BLOB): BOOL; stdcall;
  302. {$EXTERNALSYM CertCompareCertificateName}
  303. //+-------------------------------------------------------------------------
  304. //  Compare the attributes in the certificate name with the specified
  305. //  Relative Distinguished Name's (CERT_RDN) array of attributes.
  306. //  The comparison iterates through the CERT_RDN attributes and looks for an
  307. //  attribute match in any of the certificate name's RDNs.
  308. //  Returns TRUE if all the attributes are found and match.
  309. //
  310. //  The CERT_RDN_ATTR fields can have the following special values:
  311. //    pszObjId == NULL              - ignore the attribute object identifier
  312. //    dwValueType == RDN_ANY_TYPE   - ignore the value type
  313. //
  314. //  CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG should be set to do
  315. //  a case insensitive match. Otherwise, defaults to an exact, case sensitive
  316. //  match.
  317. //
  318. //  CERT_UNICODE_IS_RDN_ATTRS_FLAG should be set if the pRDN was initialized
  319. //  with unicode strings as for CryptEncodeObject(X509_UNICODE_NAME).
  320. //--------------------------------------------------------------------------
  321. function CertIsRDNAttrsInCertificateName(dwCertEncodingType, dwFlags: DWORD;
  322.   pCertName: PCERT_NAME_BLOB; pRDN: PCERT_RDN): BOOL; stdcall;
  323. {$EXTERNALSYM CertIsRDNAttrsInCertificateName}
  324. const
  325.   CERT_UNICODE_IS_RDN_ATTRS_FLAG          = $1;
  326.   {$EXTERNALSYM CERT_UNICODE_IS_RDN_ATTRS_FLAG}
  327.   CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG = $2;
  328.   {$EXTERNALSYM CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG}
  329. //+-------------------------------------------------------------------------
  330. //  Compare two public keys to see if they are identical.
  331. //
  332. //  Returns TRUE if the keys are identical.
  333. //--------------------------------------------------------------------------
  334. function CertComparePublicKeyInfo(dwCertEncodingType: DWORD;
  335.   pPublicKey1, pPublicKey2: PCERT_PUBLIC_KEY_INFO): BOOL; stdcall;
  336. {$EXTERNALSYM CertComparePublicKeyInfo}
  337. //+-------------------------------------------------------------------------
  338. //  Get the public/private key's bit length.
  339. //
  340. //  Returns 0 if unable to determine the key's length.
  341. //--------------------------------------------------------------------------
  342. function CertGetPublicKeyLength(dwCertEncodingType: DWORD;
  343.   pPublicKey: PCERT_PUBLIC_KEY_INFO): DWORD; stdcall;
  344. {$EXTERNALSYM CertGetPublicKeyLength}
  345. //+-------------------------------------------------------------------------
  346. //  Verify the signature of a subject certificate or a CRL using the
  347. //  public key info
  348. //
  349. //  Returns TRUE for a valid signature.
  350. //
  351. //  hCryptProv specifies the crypto provider to use to verify the signature.
  352. //  It doesn't need to use a private key.
  353. //--------------------------------------------------------------------------
  354. function CryptVerifyCertificateSignature(hCryptProv: HCRYPTPROV;
  355.   dwCertEncodingType: DWORD; pbEncoded: LPBYTE; cbEncoded: DWORD;
  356.   pPublicKey: PCERT_PUBLIC_KEY_INFO): BOOL; stdcall;
  357. {$EXTERNALSYM CryptVerifyCertificateSignature}
  358. //+-------------------------------------------------------------------------
  359. //  Verify the signature of a subject certificate, CRL, certificate request
  360. //  or keygen request using the issuer's public key.
  361. //
  362. //  Returns TRUE for a valid signature.
  363. //
  364. //  The subject can be an encoded blob or a context for a certificate or CRL.
  365. //  For a subject certificate context, if the certificate is missing
  366. //  inheritable PublicKey Algorithm Parameters, the context's
  367. //  CERT_PUBKEY_ALG_PARA_PROP_ID is updated with the issuer's public key
  368. //  algorithm parameters for a valid signature.
  369. //
  370. //  The issuer can be a pointer to a CERT_PUBLIC_KEY_INFO, certificate
  371. //  context or a chain context.
  372. //
  373. //  hCryptProv specifies the crypto provider to use to verify the signature.
  374. //  Its private key isn't used. If hCryptProv is NULL, a default
  375. //  provider is picked according to the PublicKey Algorithm OID.
  376. //--------------------------------------------------------------------------
  377. function CryptVerifyCertificateSignatureEx(hCryptProv: HCRYPTPROV;
  378.   dwCertEncodingType, dwSubjectType: DWORD; pvSubject: Pointer;
  379.   dwIssuerType: DWORD; pvIssuer: Pointer; dwFlags: DWORD; pvReserved: Pointer): BOOL; stdcall;
  380. {$EXTERNALSYM CryptVerifyCertificateSignatureEx}
  381. // Subject Types
  382. const
  383.   CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB = 1;
  384.   {$EXTERNALSYM CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB}
  385.     // pvSubject :: PCRYPT_DATA_BLOB
  386.   CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT = 2;
  387.   {$EXTERNALSYM CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT}
  388.     // pvSubject :: PCCERT_CONTEXT
  389.   CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL = 3;
  390.   {$EXTERNALSYM CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL}
  391.     // pvSubject :: PCCRL_CONTEXT
  392. // Issuer Types
  393.   CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY = 1;
  394.   {$EXTERNALSYM CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY}
  395.     // pvIssuer :: PCERT_PUBLIC_KEY_INFO
  396.   CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT = 2;
  397.   {$EXTERNALSYM CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT}
  398.     // pvIssuer :: PCCERT_CONTEXT
  399.   CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN = 3;
  400.   {$EXTERNALSYM CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN}
  401.     // pvIssuer :: PCCERT_CHAIN_CONTEXT
  402. //+-------------------------------------------------------------------------
  403. //  Compute the hash of the "to be signed" information in the encoded
  404. //  signed content (CERT_SIGNED_CONTENT_INFO).
  405. //
  406. //  hCryptProv specifies the crypto provider to use to compute the hash.
  407. //  It doesn't need to use a private key.
  408. //--------------------------------------------------------------------------
  409. function CryptHashToBeSigned(hCryptProv: HCRYPTPROV; dwCertEncodingType: DWORD;
  410.   pbEncoded: LPBYTE; cbEncoded: DWORD; pbComputedHash: LPBYTE;
  411.   var pcbComputedHash: DWORD): BOOL; stdcall;
  412. {$EXTERNALSYM CryptHashToBeSigned}
  413. //+-------------------------------------------------------------------------
  414. //  Hash the encoded content.
  415. //
  416. //  hCryptProv specifies the crypto provider to use to compute the hash.
  417. //  It doesn't need to use a private key.
  418. //
  419. //  Algid specifies the CAPI hash algorithm to use. If Algid is 0, then, the
  420. //  default hash algorithm (currently SHA1) is used.
  421. //--------------------------------------------------------------------------
  422. function CryptHashCertificate(hCryptProv: HCRYPTPROV; Algid: ALG_ID;
  423.   dwFlags: DWORD; pbEncoded: LPBYTE; cbEncoded: DWORD; pbComputedHash: LPBYTE;
  424.   var pcbComputedHash: DWORD): BOOL; stdcall;
  425. {$EXTERNALSYM CryptHashCertificate}
  426. //+-------------------------------------------------------------------------
  427. //  Sign the "to be signed" information in the encoded signed content.
  428. //
  429. //  hCryptProv specifies the crypto provider to use to do the signature.
  430. //  It uses the specified private key.
  431. //--------------------------------------------------------------------------
  432. function CryptSignCertificate(hCryptProv: HCRYPTPROV; dwKeySpec: DWORD;
  433.   dwCertEncodingType: DWORD; pbEncodedToBeSigned: LPBYTE; cbEncodedToBeSigned: DWORD;
  434.   pSignatureAlgorithm: PCRYPT_ALGORITHM_IDENTIFIER; pvHashAuxInfo: Pointer;
  435.   pbSignature: LPBYTE; var pcbSignature: DWORD): BOOL; stdcall;
  436. {$EXTERNALSYM CryptSignCertificate}
  437. //+-------------------------------------------------------------------------
  438. //  Encode the "to be signed" information. Sign the encoded "to be signed".
  439. //  Encode the "to be signed" and the signature.
  440. //
  441. //  hCryptProv specifies the crypto provider to use to do the signature.
  442. //  It uses the specified private key.
  443. //--------------------------------------------------------------------------
  444. function CryptSignAndEncodeCertificate(hCryptProv: HCRYPTPROV; dwKeySpec: DWORD;
  445.   dwCertEncodingType: DWORD; lpszStructType: LPCSTR; pvStructInfo: Pointer;
  446.   pSignatureAlgorithm: PCRYPT_ALGORITHM_IDENTIFIER; pvHashAuxInfo: Pointer;
  447.   pbEncoded: PBYTE; var pcbEncoded: DWORD): BOOL; stdcall;
  448. {$EXTERNALSYM CryptSignAndEncodeCertificate}
  449. //+-------------------------------------------------------------------------
  450. //  Verify the time validity of a certificate.
  451. //
  452. //  Returns -1 if before NotBefore, +1 if after NotAfter and otherwise 0 for
  453. //  a valid certificate
  454. //
  455. //  If pTimeToVerify is NULL, uses the current time.
  456. //--------------------------------------------------------------------------
  457. function CertVerifyTimeValidity(pTimeToVerify: LPFILETIME; pCertInfo: PCERT_INFO): LONG; stdcall;
  458. {$EXTERNALSYM CertVerifyTimeValidity}
  459. //+-------------------------------------------------------------------------
  460. //  Verify the time validity of a CRL.
  461. //
  462. //  Returns -1 if before ThisUpdate, +1 if after NextUpdate and otherwise 0 for
  463. //  a valid CRL
  464. //
  465. //  If pTimeToVerify is NULL, uses the current time.
  466. //--------------------------------------------------------------------------
  467. function CertVerifyCRLTimeValidity(pTimeToVerify: LPFILETIME; pCrlInfo: PCRL_INFO): LONG; stdcall;
  468. {$EXTERNALSYM CertVerifyCRLTimeValidity}
  469. //+-------------------------------------------------------------------------
  470. //  Verify that the subject's time validity nests within the issuer's time
  471. //  validity.
  472. //
  473. //  Returns TRUE if it nests. Otherwise, returns FALSE.
  474. //--------------------------------------------------------------------------
  475. function CertVerifyValidityNesting(pSubjectInfo, pIssuerInfo: PCERT_INFO): BOOL; stdcall;
  476. {$EXTERNALSYM CertVerifyValidityNesting}
  477. //+-------------------------------------------------------------------------
  478. //  Verify that the subject certificate isn't on its issuer CRL.
  479. //
  480. //  Returns true if the certificate isn't on the CRL.
  481. //--------------------------------------------------------------------------
  482. function CertVerifyCRLRevocation(dwCertEncodingType: DWORD; pCertId: PCERT_INFO;
  483.   cCrlInfo: DWORD; rgpCrlInfo: PCRL_INFO): BOOL; stdcall;
  484. {$EXTERNALSYM CertVerifyCRLRevocation}
  485. //+-------------------------------------------------------------------------
  486. //  Convert the CAPI AlgId to the ASN.1 Object Identifier string
  487. //
  488. //  Returns NULL if there isn't an ObjId corresponding to the AlgId.
  489. //--------------------------------------------------------------------------
  490. function CertAlgIdToOID(dwAlgId: DWORD): LPCSTR; stdcall;
  491. {$EXTERNALSYM CertAlgIdToOID}
  492. //+-------------------------------------------------------------------------
  493. //  Convert the ASN.1 Object Identifier string to the CAPI AlgId.
  494. //
  495. //  Returns 0 if there isn't an AlgId corresponding to the ObjId.
  496. //--------------------------------------------------------------------------
  497. function CertOIDToAlgId(pszObjId: LPCSTR): DWORD; stdcall;
  498. {$EXTERNALSYM CertOIDToAlgId}
  499. //+-------------------------------------------------------------------------
  500. //  Find an extension identified by its Object Identifier.
  501. //
  502. //  If found, returns pointer to the extension. Otherwise, returns NULL.
  503. //--------------------------------------------------------------------------
  504. function CertFindExtension(pszObjId: LPCSTR; cExtensions: DWORD;
  505.   rgExtensions: PCERT_EXTENSION): PCERT_EXTENSION; stdcall;
  506. {$EXTERNALSYM CertFindExtension}
  507. //+-------------------------------------------------------------------------
  508. //  Find the first attribute identified by its Object Identifier.
  509. //
  510. //  If found, returns pointer to the attribute. Otherwise, returns NULL.
  511. //--------------------------------------------------------------------------
  512. function CertFindAttribute(pszObjId: LPCSTR; cAttr: DWORD;
  513.   rgAttr: PCRYPT_ATTRIBUTE): PCRYPT_ATTRIBUTE; stdcall;
  514. {$EXTERNALSYM CertFindAttribute}
  515. //+-------------------------------------------------------------------------
  516. //  Find the first CERT_RDN attribute identified by its Object Identifier in
  517. //  the name's list of Relative Distinguished Names.
  518. //
  519. //  If found, returns pointer to the attribute. Otherwise, returns NULL.
  520. //--------------------------------------------------------------------------
  521. function CertFindRDNAttr(pszObjId: LPCSTR; pName: PCERT_NAME_INFO): PCERT_RDN_ATTR; stdcall;
  522. {$EXTERNALSYM CertFindRDNAttr}
  523. //+-------------------------------------------------------------------------
  524. //  Get the intended key usage bytes from the certificate.
  525. //
  526. //  If the certificate doesn't have any intended key usage bytes, returns FALSE
  527. //  and *pbKeyUsage is zeroed. Otherwise, returns TRUE and up through
  528. //  cbKeyUsage bytes are copied into *pbKeyUsage. Any remaining uncopied
  529. //  bytes are zeroed.
  530. //--------------------------------------------------------------------------
  531. function CertGetIntendedKeyUsage(dwCertEncodingType: DWORD; pCertInfo: PCERT_INFO;
  532.   pbKeyUsage: LPBYTE; cbKeyUsage: DWORD): BOOL; stdcall;
  533. {$EXTERNALSYM CertGetIntendedKeyUsage}
  534. type
  535.   HCRYPTDEFAULTCONTEXT = Pointer;
  536.   {$EXTERNALSYM HCRYPTDEFAULTCONTEXT}
  537. //+-------------------------------------------------------------------------
  538. //  Install a previously CryptAcquiredContext'ed HCRYPTPROV to be used as
  539. //  a default context.
  540. //
  541. //  dwDefaultType and pvDefaultPara specify where the default context is used.
  542. //  For example, install the HCRYPTPROV to be used to verify certificate's
  543. //  having szOID_OIWSEC_md5RSA signatures.
  544. //
  545. //  By default, the installed HCRYPTPROV is only applicable to the current
  546. //  thread. Set CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG to allow the HCRYPTPROV
  547. //  to be used by all threads in the current process.
  548. //
  549. //  For a successful install, TRUE is returned and *phDefaultContext is
  550. //  updated with the HANDLE to be passed to CryptUninstallDefaultContext.
  551. //
  552. //  The installed HCRYPTPROVs are stack ordered (the last installed
  553. //  HCRYPTPROV is checked first). All thread installed HCRYPTPROVs are
  554. //  checked before any process HCRYPTPROVs.
  555. //
  556. //  The installed HCRYPTPROV remains available for default usage until
  557. //  CryptUninstallDefaultContext is called or the thread or process exits.
  558. //
  559. //  If CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG is set, then, the HCRYPTPROV
  560. //  is CryptReleaseContext'ed at thread or process exit. However,
  561. //  not CryptReleaseContext'ed if CryptUninstallDefaultContext is
  562. //  called.
  563. //--------------------------------------------------------------------------
  564. function CryptInstallDefaultContext(hCryptProv: HCRYPTPROV; dwDefaultType: DWORD;
  565.   pvDefaultPara: Pointer; dwFlags: DWORD; pvReserved: Pointer;
  566.   var phDefaultContext: HCRYPTDEFAULTCONTEXT): BOOL; stdcall;
  567. {$EXTERNALSYM CryptInstallDefaultContext}
  568. // dwFlags
  569. const
  570.   CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG = $00000001;
  571.   {$EXTERNALSYM CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG}
  572.   CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG      = $00000002;
  573.   {$EXTERNALSYM CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG}
  574. // List of dwDefaultType's
  575.   CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID       = 1;
  576.   {$EXTERNALSYM CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID}
  577.   CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID = 2;
  578.   {$EXTERNALSYM CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID}
  579. //+-------------------------------------------------------------------------
  580. //  CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID
  581. //
  582. //  Install a default HCRYPTPROV used to verify a certificate
  583. //  signature. pvDefaultPara points to the szOID of the certificate
  584. //  signature algorithm, for example, szOID_OIWSEC_md5RSA. If
  585. //  pvDefaultPara is NULL, then, the HCRYPTPROV is used to verify all
  586. //  certificate signatures. Note, pvDefaultPara can't be NULL when
  587. //  CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG is set.
  588. //--------------------------------------------------------------------------
  589. //+-------------------------------------------------------------------------
  590. //  CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID
  591. //
  592. //  Same as CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID. However, the default
  593. //  HCRYPTPROV is to be used for multiple signature szOIDs. pvDefaultPara
  594. //  points to a CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA structure containing
  595. //  an array of szOID pointers.
  596. //--------------------------------------------------------------------------
  597. type
  598.   PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA = ^CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
  599.   {$EXTERNALSYM PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA}
  600.   _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA = record
  601.     cOID: DWORD;
  602.     rgpszOID: LPLPSTR;
  603.   end;
  604.   {$EXTERNALSYM _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA}
  605.   CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA = _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
  606.   {$EXTERNALSYM CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA}
  607.   TCryptDefaultContextMultiOidPara = CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
  608.   PCryptDefaultContextMultiOidPara = PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
  609. //+-------------------------------------------------------------------------
  610. //  Uninstall a default context previously installed by
  611. //  CryptInstallDefaultContext.
  612. //
  613. //  For a default context installed with CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG
  614. //  set, if any other threads are currently using this context,
  615. //  this function will block until they finish.
  616. //--------------------------------------------------------------------------
  617. function CryptUninstallDefaultContext(hDefaultContext: HCRYPTDEFAULTCONTEXT;
  618.   dwFlags: DWORD; pvReserved: Pointer): BOOL; stdcall;
  619. {$EXTERNALSYM CryptUninstallDefaultContext}
  620. //+-------------------------------------------------------------------------
  621. //  Export the public key info associated with the provider's corresponding
  622. //  private key.
  623. //
  624. //  Calls CryptExportPublicKeyInfo with pszPublicKeyObjId = szOID_RSA_RSA,
  625. //  dwFlags = 0 and pvAuxInfo = NULL.
  626. //--------------------------------------------------------------------------
  627. function CryptExportPublicKeyInfo(hCryptProv: HCRYPTPROV; dwKeySpec: DWORD;
  628.   dwCertEncodingType: DWORD; pInfo: PCERT_PUBLIC_KEY_INFO; var pcbInfo: DWORD): BOOL; stdcall;
  629. {$EXTERNALSYM CryptExportPublicKeyInfo}
  630. //+-------------------------------------------------------------------------
  631. //  Export the public key info associated with the provider's corresponding
  632. //  private key.
  633. //
  634. //  Uses the dwCertEncodingType and pszPublicKeyObjId to call the
  635. //  installable CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC. The called function
  636. //  has the same signature as CryptExportPublicKeyInfoEx.
  637. //
  638. //  If unable to find an installable OID function for the pszPublicKeyObjId,
  639. //  attempts to export as a RSA Public Key (szOID_RSA_RSA).
  640. //
  641. //  The dwFlags and pvAuxInfo aren't used for szOID_RSA_RSA.
  642. //--------------------------------------------------------------------------
  643. const
  644.   CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC = 'CryptDllExportPublicKeyInfoEx';
  645.   {$EXTERNALSYM CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC}
  646. function CryptExportPublicKeyInfoEx(hCryptProv: HCRYPTPROV; dwKeySpec: DWORD;
  647.   dwCertEncodingType: DWORD; pszPublicKeyObjId: LPSTR; dwFlags: DWORD;
  648.   pvAuxInfo: Pointer; pInfo: PCERT_PUBLIC_KEY_INFO; var pcbInfo: DWORD): BOOL; stdcall;
  649. {$EXTERNALSYM CryptExportPublicKeyInfoEx}
  650. //+-------------------------------------------------------------------------
  651. //  Convert and import the public key info into the provider and return a
  652. //  handle to the public key.
  653. //
  654. //  Calls CryptImportPublicKeyInfoEx with aiKeyAlg = 0, dwFlags = 0 and
  655. //  pvAuxInfo = NULL.
  656. //--------------------------------------------------------------------------
  657. function CryptImportPublicKeyInfo(hCryptProv: HCRYPTPROV; dwCertEncodingType: DWORD;
  658.   pInfo: PCERT_PUBLIC_KEY_INFO; var phKey: HCRYPTKEY): BOOL; stdcall;
  659. {$EXTERNALSYM CryptImportPublicKeyInfo}
  660. //+-------------------------------------------------------------------------
  661. //  Convert and import the public key info into the provider and return a
  662. //  handle to the public key.
  663. //
  664. //  Uses the dwCertEncodingType and pInfo->Algorithm.pszObjId to call the
  665. //  installable CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC. The called function
  666. //  has the same signature as CryptImportPublicKeyInfoEx.
  667. //
  668. //  If unable to find an installable OID function for the pszObjId,
  669. //  attempts to import as a RSA Public Key (szOID_RSA_RSA).
  670. //
  671. //  For szOID_RSA_RSA: aiKeyAlg may be set to CALG_RSA_SIGN or CALG_RSA_KEYX.
  672. //  Defaults to CALG_RSA_KEYX. The dwFlags and pvAuxInfo aren't used.
  673. //--------------------------------------------------------------------------
  674. const
  675.   CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC = 'CryptDllImportPublicKeyInfoEx';
  676.   {$EXTERNALSYM CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC}
  677. function CryptImportPublicKeyInfoEx(hCryptProv: HCRYPTPROV; dwCertEncodingType: DWORD;
  678.   pInfo: PCERT_PUBLIC_KEY_INFO; aiKeyAlg: ALG_ID; dwFlags: DWORD; pvAuxInfo: Pointer;
  679.   var phKey: HCRYPTKEY): BOOL; stdcall;
  680. {$EXTERNALSYM CryptImportPublicKeyInfoEx}
  681. //+-------------------------------------------------------------------------
  682. //  Acquire a HCRYPTPROV handle and dwKeySpec for the specified certificate
  683. //  context. Uses the certificate's CERT_KEY_PROV_INFO_PROP_ID property.
  684. //  The returned HCRYPTPROV handle may optionally be cached using the
  685. //  certificate's CERT_KEY_CONTEXT_PROP_ID property.
  686. //
  687. //  If CRYPT_ACQUIRE_CACHE_FLAG is set, then, if an already acquired and
  688. //  cached HCRYPTPROV exists for the certificate, its returned. Otherwise,
  689. //  a HCRYPTPROV is acquired and then cached via the certificate's
  690. //  CERT_KEY_CONTEXT_PROP_ID.
  691. //
  692. //  The CRYPT_ACQUIRE_USE_PROV_INFO_FLAG can be set to use the dwFlags field of
  693. //  the certificate's CERT_KEY_PROV_INFO_PROP_ID property's CRYPT_KEY_PROV_INFO
  694. //  data structure to determine if the returned HCRYPTPROV should be cached.
  695. //  HCRYPTPROV caching is enabled if the CERT_SET_KEY_CONTEXT_PROP_ID flag was
  696. //  set.
  697. //
  698. //  If CRYPT_ACQUIRE_COMPARE_KEY_FLAG is set, then,
  699. //  the public key in the certificate is compared with the public
  700. //  key returned by the cryptographic provider. If the keys don't match, the
  701. //  acquire fails and LastError is set to NTE_BAD_PUBLIC_KEY. Note, if
  702. //  a cached HCRYPTPROV is returned, the comparison isn't done. We assume the
  703. //  comparison was done on the initial acquire.
  704. //
  705. //  *pfCallerFreeProv is returned set to FALSE for:
  706. //    - Acquire or public key comparison fails.
  707. //    - CRYPT_ACQUIRE_CACHE_FLAG is set.
  708. //    - CRYPT_ACQUIRE_USE_PROV_INFO_FLAG is set AND
  709. //      CERT_SET_KEY_CONTEXT_PROP_ID flag is set in the dwFlags field of the
  710. //      certificate's CERT_KEY_PROV_INFO_PROP_ID property's
  711. //      CRYPT_KEY_PROV_INFO data structure.
  712. //  When *pfCallerFreeProv is FALSE, the caller must not release. The
  713. //  returned HCRYPTPROV will be released on the last free of the certificate
  714. //  context.
  715. //
  716. //  Otherwise, *pfCallerFreeProv is TRUE and the returned HCRYPTPROV must
  717. //  be released by the caller by calling CryptReleaseContext.
  718. //--------------------------------------------------------------------------
  719. function CryptAcquireCertificatePrivateKey(pCert: PCCERT_CONTEXT; dwFlags: DWORD;
  720.   pvReserved: Pointer; var phCryptProv: HCRYPTPROV; pdwKeySpec: LPDWORD;
  721.   pfCallerFreeProv: PBOOL): BOOL; stdcall;
  722. {$EXTERNALSYM CryptAcquireCertificatePrivateKey}
  723. const
  724.   CRYPT_ACQUIRE_CACHE_FLAG         = $1;
  725.   {$EXTERNALSYM CRYPT_ACQUIRE_CACHE_FLAG}
  726.   CRYPT_ACQUIRE_USE_PROV_INFO_FLAG = $2;
  727.   {$EXTERNALSYM CRYPT_ACQUIRE_USE_PROV_INFO_FLAG}
  728.   CRYPT_ACQUIRE_COMPARE_KEY_FLAG   = $4;
  729.   {$EXTERNALSYM CRYPT_ACQUIRE_COMPARE_KEY_FLAG}
  730. //+-------------------------------------------------------------------------
  731. //  Enumerates the cryptographic providers and their containers to find the
  732. //  private key corresponding to the certificate's public key. For a match,
  733. //  the certificate's CERT_KEY_PROV_INFO_PROP_ID property is updated.
  734. //
  735. //  If the CERT_KEY_PROV_INFO_PROP_ID is already set, then, its checked to
  736. //  see if it matches the provider's public key. For a match, the above
  737. //  enumeration is skipped.
  738. //
  739. //  By default both the user and machine key containers are searched.
  740. //  The CRYPT_FIND_USER_KEYSET_FLAG or CRYPT_FIND_MACHINE_KEYSET_FLAG
  741. //  can be set in dwFlags to restrict the search to either of the containers.
  742. //
  743. //  If a container isn't found, returns FALSE with LastError set to
  744. //  NTE_NO_KEY.
  745. //--------------------------------------------------------------------------
  746. function CryptFindCertificateKeyProvInfo(pCert: PCCERT_CONTEXT; dwFlags: DWORD;
  747.   pvReserved: Pointer): BOOL; stdcall;
  748. {$EXTERNALSYM CryptFindCertificateKeyProvInfo}
  749. const
  750.   CRYPT_FIND_USER_KEYSET_FLAG    = $1;
  751.   {$EXTERNALSYM CRYPT_FIND_USER_KEYSET_FLAG}
  752.   CRYPT_FIND_MACHINE_KEYSET_FLAG = $2;
  753.   {$EXTERNALSYM CRYPT_FIND_MACHINE_KEYSET_FLAG}
  754. //+-------------------------------------------------------------------------
  755. //  This is the prototype for the installable function which is called to
  756. //  actually import a key into a CSP.  an installable of this type is called
  757. //  from CryptImportPKCS8.  the algorithm OID of the private key is used
  758. //  to look up the proper installable function to call.
  759. //
  760. //  hCryptProv - the provider to import the key to
  761. //  pPrivateKeyInfo - describes the key to be imported
  762. //  dwFlags - The available flags are:
  763. //              CRYPT_EXPORTABLE
  764. //              this flag is used when importing private keys, for a full
  765. //              explanation please see the documentation for CryptImportKey.
  766. //  pvAuxInfo - reserved for future, must be NULL
  767. //--------------------------------------------------------------------------
  768. type
  769.   PFN_IMPORT_PRIV_KEY_FUNC = function (hCryptProv: HCRYPTPROV;
  770.     pPrivateKeyInfo: PCRYPT_PRIVATE_KEY_INFO; dwFlags: DWORD;
  771.     pvAuxInfo: Pointer): BOOL; stdcall;
  772.   {$EXTERNALSYM PFN_IMPORT_PRIV_KEY_FUNC}
  773.   PFnImportPrivKeyFunc = PFN_IMPORT_PRIV_KEY_FUNC;
  774. const
  775.   CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNC = 'CryptDllImportPrivateKeyInfoEx';
  776.   {$EXTERNALSYM CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNC}
  777. //+-------------------------------------------------------------------------
  778. // Convert (from PKCS8 format) and import the private key into a provider
  779. // and return a handle to the provider as well as the KeySpec used to import to.
  780. //
  781. // This function will call the PRESOLVE_HCRYPTPROV_FUNC in the
  782. // privateKeyAndParams to obtain a handle of provider to import the key to.
  783. // if the PRESOLVE_HCRYPTPROV_FUNC is NULL then the default provider will be used.
  784. //
  785. // privateKeyAndParams - private key blob and corresponding parameters
  786. // dwFlags - The available flags are:
  787. //              CRYPT_EXPORTABLE
  788. //              this flag is used when importing private keys, for a full
  789. //              explanation please see the documentation for CryptImportKey.
  790. // phCryptProv - filled in with the handle of the provider the key was
  791. //               imported to, the caller is responsible for freeing it
  792. // pvAuxInfo - This parameter is reserved for future use and should be set
  793. //             to NULL in the interim.
  794. //--------------------------------------------------------------------------
  795. function CryptImportPKCS8(sImportParams: CRYPT_PKCS8_IMPORT_PARAMS; dwFlags: DWORD;
  796.   phCryptProv: PHCRYPTPROV; pvAuxInfo: Pointer): BOOL; stdcall;
  797. {$EXTERNALSYM CryptImportPKCS8}
  798. //+-------------------------------------------------------------------------
  799. // this is the prototype for installable functions for exporting the private key
  800. //--------------------------------------------------------------------------
  801. type
  802.   PFN_EXPORT_PRIV_KEY_FUNC = function (hCryptProv: HCRYPTPROV; dwKeySpec: DWORD;
  803.     pszPrivateKeyObjId: LPSTR; dwFlags: DWORD; pvAuxInfo: Pointer;
  804.     var pPrivateKeyInfo: CRYPT_PRIVATE_KEY_INFO; var pcbPrivateKeyBlob: DWORD): BOOL; stdcall;
  805.   {$EXTERNALSYM PFN_EXPORT_PRIV_KEY_FUNC}
  806.   PfnExportPrivKeyFunc = PFN_EXPORT_PRIV_KEY_FUNC;
  807. const
  808.   CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC = 'CryptDllExportPrivateKeyInfoEx';
  809.   {$EXTERNALSYM CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC}
  810.   CRYPT_DELETE_KEYSET = $0001;
  811.   {$EXTERNALSYM CRYPT_DELETE_KEYSET}
  812. //+-------------------------------------------------------------------------
  813. //  CryptExportPKCS8 -- superseded by CryptExportPKCS8Ex
  814. //
  815. //  Export the private key in PKCS8 format
  816. //--------------------------------------------------------------------------
  817. function CryptExportPKCS8(hCryptProv: HCRYPTPROV; dwKeySpec: DWORD;
  818.   pszPrivateKeyObjId: LPSTR; dwFlags: DWORD; pvAuxInfo: Pointer;
  819.   pbPrivateKeyBlob: LPBYTE; var pcbPrivateKeyBlob: DWORD): BOOL; stdcall;
  820. {$EXTERNALSYM CryptExportPKCS8}
  821. //+-------------------------------------------------------------------------
  822. // CryptExportPKCS8Ex
  823. //
  824. //  Export the private key in PKCS8 format
  825. //
  826. //
  827. //  Uses the pszPrivateKeyObjId to call the
  828. //  installable CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC. The called function
  829. //  has the signature defined by PFN_EXPORT_PRIV_KEY_FUNC.
  830. //
  831. //  If unable to find an installable OID function for the pszPrivateKeyObjId,
  832. //  attempts to export as a RSA Private Key (szOID_RSA_RSA).
  833. //
  834. // psExportParams - specifies information about the key to export
  835. // dwFlags - The flag values. None currently supported
  836. // pvAuxInfo - This parameter is reserved for future use and should be set to
  837. //                           NULL in the interim.
  838. // pbPrivateKeyBlob - A pointer to the private key blob.  It will be encoded
  839. //                                          as a PKCS8 PrivateKeyInfo.
  840. // pcbPrivateKeyBlob - A pointer to a DWORD that contains the size, in bytes,
  841. //                                           of the private key blob being exported.
  842. //+-------------------------------------------------------------------------
  843. function CryptExportPKCS8Ex(psExportParams: PCRYPT_PKCS8_EXPORT_PARAMS;
  844.   dwFlags: DWORD; pvAuxInfo: Pointer; pbPrivateKeyBlob: LPBYTE;
  845.   var pcbPrivateKeyBlob: DWORD): BOOL; stdcall;
  846. {$EXTERNALSYM CryptExportPKCS8Ex}
  847. //+-------------------------------------------------------------------------
  848. //  Compute the hash of the encoded public key info.
  849. //
  850. //  The public key info is encoded and then hashed.
  851. //--------------------------------------------------------------------------
  852. function CryptHashPublicKeyInfo(hCryptProv: HCRYPTPROV; Algid: ALG_ID;
  853.   dwFlags: DWORD; dwCertEncodingType: DWORD; pInfo: PCERT_PUBLIC_KEY_INFO;
  854.   pbComputedHash: LPBYTE; var pcbComputedHash: DWORD): BOOL; stdcall;
  855. {$EXTERNALSYM CryptHashPublicKeyInfo}
  856. //+-------------------------------------------------------------------------
  857. //  Convert a Name Value to a null terminated char string
  858. //
  859. //  Returns the number of characters converted including the terminating null
  860. //  character. If psz is NULL or csz is 0, returns the required size of the
  861. //  destination string (including the terminating null char).
  862. //
  863. //  If psz != NULL && csz != 0, returned psz is always NULL terminated.
  864. //
  865. //  Note: csz includes the NULL char.
  866. //--------------------------------------------------------------------------
  867. function CertRDNValueToStrA(dwValueType: DWORD; pValue: PCERT_RDN_VALUE_BLOB;
  868.   psz: LPSTR; csz: DWORD): DWORD; stdcall;
  869. {$EXTERNALSYM CertRDNValueToStrA}
  870. //+-------------------------------------------------------------------------
  871. //  Convert a Name Value to a null terminated char string
  872. //
  873. //  Returns the number of characters converted including the terminating null
  874. //  character. If psz is NULL or csz is 0, returns the required size of the
  875. //  destination string (including the terminating null char).
  876. //
  877. //  If psz != NULL && csz != 0, returned psz is always NULL terminated.
  878. //
  879. //  Note: csz includes the NULL char.
  880. //--------------------------------------------------------------------------
  881. function CertRDNValueToStrW(dwValueType: DWORD; pValue: PCERT_RDN_VALUE_BLOB;
  882.   psz: LPWSTR; csz: DWORD): DWORD; stdcall;
  883. {$EXTERNALSYM CertRDNValueToStrW}
  884. {$IFDEF UNICODE}
  885. function CertRDNValueToStr(dwValueType: DWORD; pValue: PCERT_RDN_VALUE_BLOB;
  886.   psz: LPWSTR; csz: DWORD): DWORD; stdcall;
  887. {$EXTERNALSYM CertRDNValueToStr}
  888. {$ELSE}
  889. function CertRDNValueToStr(dwValueType: DWORD; pValue: PCERT_RDN_VALUE_BLOB;
  890.   psz: LPSTR; csz: DWORD): DWORD; stdcall;
  891. {$EXTERNALSYM CertRDNValueToStr}
  892. {$ENDIF}
  893. //+-------------------------------------------------------------------------
  894. //  Convert the certificate name blob to a null terminated char string.
  895. //
  896. //  Follows the string representation of distinguished names specified in
  897. //  RFC 1779. (Note, added double quoting "" for embedded quotes, quote
  898. //  empty strings and don't quote strings containing consecutive spaces).
  899. //  RDN values of type CERT_RDN_ENCODED_BLOB or CERT_RDN_OCTET_STRING are
  900. //  formatted in hexadecimal (e.g. #0A56CF).
  901. //
  902. //  The name string is formatted according to the dwStrType:
  903. //    CERT_SIMPLE_NAME_STR
  904. //      The object identifiers are discarded. CERT_RDN entries are separated
  905. //      by ", ". Multiple attributes per CERT_RDN are separated by " + ".
  906. //      For example:
  907. //          Microsoft, Joe Cool + Programmer
  908. //    CERT_OID_NAME_STR
  909. //      The object identifiers are included with a "=" separator from their
  910. //      attribute value. CERT_RDN entries are separated by ", ".
  911. //      Multiple attributes per CERT_RDN are separated by " + ". For example:
  912. //          2.5.4.11=Microsoft, 2.5.4.3=Joe Cool + 2.5.4.12=Programmer
  913. //    CERT_X500_NAME_STR
  914. //      The object identifiers are converted to their X500 key name. Otherwise,
  915. //      same as CERT_OID_NAME_STR. If the object identifier doesn't have
  916. //      a corresponding X500 key name, then, the object identifier is used with
  917. //      a "OID." prefix. For example:
  918. //          OU=Microsoft, CN=Joe Cool + T=Programmer, OID.1.2.3.4.5.6=Unknown
  919. //
  920. //  We quote the RDN value if it contains leading or trailing whitespace
  921. //  or one of the following characters: ",", "+", "=", """, "n",  "<", ">",
  922. //  "#" or ";". The quoting character is ". If the the RDN Value contains
  923. //  a " it is double quoted (""). For example:
  924. //      OU="  Microsoft", CN="Joe ""Cool""" + T="Programmer, Manager"
  925. //
  926. //  CERT_NAME_STR_SEMICOLON_FLAG can be or'ed into dwStrType to replace
  927. //  the ", " separator with a "; " separator.
  928. //
  929. //  CERT_NAME_STR_CRLF_FLAG can be or'ed into dwStrType to replace
  930. //  the ", " separator with a "rn" separator.
  931. //
  932. //  CERT_NAME_STR_NO_PLUS_FLAG can be or'ed into dwStrType to replace the
  933. //  " + " separator with a single space, " ".
  934. //
  935. //  CERT_NAME_STR_NO_QUOTING_FLAG can be or'ed into dwStrType to inhibit
  936. //  the above quoting.
  937. //
  938. //  CERT_NAME_STR_REVERSE_FLAG can be or'ed into dwStrType to reverse the
  939. //  order of the RDNs before converting to the string.
  940. //
  941. //  By default, CERT_RDN_T61_STRING encoded values are initially decoded
  942. //  as UTF8. If the UTF8 decoding fails, then, decoded as 8 bit characters.
  943. //  CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG can be or'ed into dwStrType to
  944. //  skip the initial attempt to decode as UTF8.
  945. //
  946. //  Returns the number of characters converted including the terminating null
  947. //  character. If psz is NULL or csz is 0, returns the required size of the
  948. //  destination string (including the terminating null char).
  949. //
  950. //  If psz != NULL && csz != 0, returned psz is always NULL terminated.
  951. //
  952. //  Note: csz includes the NULL char.
  953. //--------------------------------------------------------------------------
  954. //+-------------------------------------------------------------------------
  955. //--------------------------------------------------------------------------
  956. function CertNameToStrA(dwCertEncodingType: DWORD; pName: PCERT_NAME_BLOB;
  957.   dwStrType: DWORD; psz: LPSTR; csz: DWORD): DWORD; stdcall;
  958. {$EXTERNALSYM CertNameToStrA}
  959. //+-------------------------------------------------------------------------
  960. //--------------------------------------------------------------------------
  961. function CertNameToStrW(dwCertEncodingType: DWORD; pName: PCERT_NAME_BLOB;
  962.   dwStrType: DWORD; psz: LPWSTR; csz: DWORD): DWORD; stdcall;
  963. {$EXTERNALSYM CertNameToStrW}
  964. {$IFDEF UNICODE}
  965. function CertNameToStr(dwCertEncodingType: DWORD; pName: PCERT_NAME_BLOB;
  966.   dwStrType: DWORD; psz: LPWSTR; csz: DWORD): DWORD; stdcall;
  967. {$EXTERNALSYM CertNameToStr}
  968. {$ELSE}
  969. function CertNameToStr(dwCertEncodingType: DWORD; pName: PCERT_NAME_BLOB;
  970.   dwStrType: DWORD; psz: LPSTR; csz: DWORD): DWORD; stdcall;
  971. {$EXTERNALSYM CertNameToStr}
  972. {$ENDIF}
  973. //+-------------------------------------------------------------------------
  974. //  Certificate name string types
  975. //--------------------------------------------------------------------------
  976. const
  977.   CERT_SIMPLE_NAME_STR = 1;
  978.   {$EXTERNALSYM CERT_SIMPLE_NAME_STR}
  979.   CERT_OID_NAME_STR    = 2;
  980.   {$EXTERNALSYM CERT_OID_NAME_STR}
  981.   CERT_X500_NAME_STR   = 3;
  982.   {$EXTERNALSYM CERT_X500_NAME_STR}
  983. //+-------------------------------------------------------------------------
  984. //  Certificate name string type flags OR'ed with the above types
  985. //--------------------------------------------------------------------------
  986.   CERT_NAME_STR_SEMICOLON_FLAG  = $40000000;
  987.   {$EXTERNALSYM CERT_NAME_STR_SEMICOLON_FLAG}
  988.   CERT_NAME_STR_NO_PLUS_FLAG    = $20000000;
  989.   {$EXTERNALSYM CERT_NAME_STR_NO_PLUS_FLAG}
  990.   CERT_NAME_STR_NO_QUOTING_FLAG = $10000000;
  991.   {$EXTERNALSYM CERT_NAME_STR_NO_QUOTING_FLAG}
  992.   CERT_NAME_STR_CRLF_FLAG       = $08000000;
  993.   {$EXTERNALSYM CERT_NAME_STR_CRLF_FLAG}
  994.   CERT_NAME_STR_COMMA_FLAG      = $04000000;
  995.   {$EXTERNALSYM CERT_NAME_STR_COMMA_FLAG}
  996.   CERT_NAME_STR_REVERSE_FLAG    = $02000000;
  997.   {$EXTERNALSYM CERT_NAME_STR_REVERSE_FLAG}
  998.   CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG    = $00010000;
  999.   {$EXTERNALSYM CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG}
  1000.   CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG  = $00020000;
  1001.   {$EXTERNALSYM CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG}
  1002.   CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG = $00040000;
  1003.   {$EXTERNALSYM CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG}
  1004. //+-------------------------------------------------------------------------
  1005. //  Convert the null terminated X500 string to an encoded certificate name.
  1006. //
  1007. //  The input string is expected to be formatted the same as the output
  1008. //  from the above CertNameToStr API.
  1009. //
  1010. //  The CERT_SIMPLE_NAME_STR type isn't supported. Otherwise, when dwStrType
  1011. //  is set to 0, CERT_OID_NAME_STR or CERT_X500_NAME_STR, allow either a
  1012. //  case insensitive X500 key (CN=), case insensitive "OID." prefixed
  1013. //  object identifier (OID.1.2.3.4.5.6=) or an object identifier (1.2.3.4=).
  1014. //
  1015. //  If no flags are OR'ed into dwStrType, then, allow "," or ";" as RDN
  1016. //  separators and "+" as the multiple RDN value separator. Quoting is
  1017. //  supported. A quote may be included in a quoted value by double quoting,
  1018. //  for example (CN="Joe ""Cool"""). A value starting with a "#" is treated
  1019. //  as ascii hex and converted to a CERT_RDN_OCTET_STRING. Embedded whitespace
  1020. //  is skipped (1.2.3 = # AB CD 01  is the same as 1.2.3=#ABCD01).
  1021. //
  1022. //  Whitespace surrounding the keys, object identifers and values is removed.
  1023. //
  1024. //  CERT_NAME_STR_COMMA_FLAG can be or'ed into dwStrType to only allow the
  1025. //  "," as the RDN separator.
  1026. //
  1027. //  CERT_NAME_STR_SEMICOLON_FLAG can be or'ed into dwStrType to only allow the
  1028. //  ";" as the RDN separator.
  1029. //
  1030. //  CERT_NAME_STR_CRLF_FLAG can be or'ed into dwStrType to only allow
  1031. //  "r" or "n" as the RDN separator.
  1032. //
  1033. //  CERT_NAME_STR_NO_PLUS_FLAG can be or'ed into dwStrType to ignore "+"
  1034. //  as a separator and not allow multiple values per RDN.
  1035. //
  1036. //  CERT_NAME_STR_NO_QUOTING_FLAG can be or'ed into dwStrType to inhibit
  1037. //  quoting.
  1038. //
  1039. //  CERT_NAME_STR_REVERSE_FLAG can be or'ed into dwStrType to reverse the
  1040. //  order of the RDNs after converting from the string and before encoding.
  1041. //
  1042. //  CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG can be or'ed into dwStrType to
  1043. //  to select the CERT_RDN_T61_STRING encoded value type instead of
  1044. //  CERT_RDN_UNICODE_STRING if all the UNICODE characters are <= 0xFF.
  1045. //
  1046. //  CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG can be or'ed into dwStrType to
  1047. //  to select the CERT_RDN_UTF8_STRING encoded value type instead of
  1048. //  CERT_RDN_UNICODE_STRING.
  1049. //
  1050. //  Support the following X500 Keys:
  1051. //
  1052. //  Key         Object Identifier               RDN Value Type(s)
  1053. //  ---         -----------------               -----------------
  1054. //  CN          szOID_COMMON_NAME               Printable, Unicode
  1055. //  L           szOID_LOCALITY_NAME             Printable, Unicode
  1056. //  O           szOID_ORGANIZATION_NAME         Printable, Unicode
  1057. //  OU          szOID_ORGANIZATIONAL_UNIT_NAME  Printable, Unicode
  1058. //  E           szOID_RSA_emailAddr             Only IA5
  1059. //  Email       szOID_RSA_emailAddr             Only IA5
  1060. //  C           szOID_COUNTRY_NAME              Only Printable
  1061. //  S           szOID_STATE_OR_PROVINCE_NAME    Printable, Unicode
  1062. //  ST          szOID_STATE_OR_PROVINCE_NAME    Printable, Unicode
  1063. //  STREET      szOID_STREET_ADDRESS            Printable, Unicode
  1064. //  T           szOID_TITLE                     Printable, Unicode
  1065. //  Title       szOID_TITLE                     Printable, Unicode
  1066. //  G           szOID_GIVEN_NAME                Printable, Unicode
  1067. //  GivenName   szOID_GIVEN_NAME                Printable, Unicode
  1068. //  I           szOID_INITIALS                  Printable, Unicode
  1069. //  Initials    szOID_INITIALS                  Printable, Unicode
  1070. //  SN          szOID_SUR_NAME                  Printable, Unicode
  1071. //  DC          szOID_DOMAIN_COMPONENT          IA5, UTF8
  1072. //
  1073. //  Note, T61 is selected instead of Unicode if
  1074. //  CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG is set and all the unicode
  1075. //  characters are <= 0xFF.
  1076. //
  1077. //  Note, UTF8 is selected instead of Unicode if
  1078. //  CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG is set.
  1079. //
  1080. //  Returns TRUE if successfully parsed the input string and encoded
  1081. //  the name.
  1082. //
  1083. //  If the input string is detected to be invalid, *ppszError is updated
  1084. //  to point to the beginning of the invalid character sequence. Otherwise,
  1085. //  *ppszError is set to NULL. *ppszError is updated with a non-NULL pointer
  1086. //  for the following errors:
  1087. //      CRYPT_E_INVALID_X500_STRING
  1088. //      CRYPT_E_INVALID_NUMERIC_STRING
  1089. //      CRYPT_E_INVALID_PRINTABLE_STRING
  1090. //      CRYPT_E_INVALID_IA5_STRING
  1091. //
  1092. //  ppszError can be set to NULL if not interested in getting a pointer
  1093. //  to the invalid character sequence.
  1094. //--------------------------------------------------------------------------
  1095. //+-------------------------------------------------------------------------
  1096. //--------------------------------------------------------------------------
  1097. function CertStrToNameA(dwCertEncodingType: DWORD; pszX500: LPCSTR;
  1098.   dwStrType: DWORD; pvReserved: Pointer; pbEncoded: LPBYTE; var pcbEncoded: DWORD;
  1099.   ppszError: LPLPCSTR): BOOL; stdcall;
  1100. {$EXTERNALSYM CertStrToNameA}
  1101. function CertStrToNameW(dwCertEncodingType: DWORD; pszX500: LPCWSTR;
  1102.   dwStrType: DWORD; pvReserved: Pointer; pbEncoded: LPBYTE; var pcbEncoded: DWORD;
  1103.   ppszError: LPLPCWSTR): BOOL; stdcall;
  1104. {$EXTERNALSYM CertStrToNameW}
  1105. {$IFDEF UNICODE}
  1106. function CertStrToName(dwCertEncodingType: DWORD; pszX500: LPCWSTR;
  1107.   dwStrType: DWORD; pvReserved: Pointer; pbEncoded: LPBYTE; var pcbEncoded: DWORD;
  1108.   ppszError: LPLPCWSTR): BOOL; stdcall;
  1109. {$EXTERNALSYM CertStrToName}
  1110. {$ELSE}
  1111. function CertStrToName(dwCertEncodingType: DWORD; pszX500: LPCSTR;
  1112.   dwStrType: DWORD; pvReserved: Pointer; pbEncoded: LPBYTE; var pcbEncoded: DWORD;
  1113.   ppszError: LPLPCSTR): BOOL; stdcall;
  1114. {$EXTERNALSYM CertStrToName}
  1115. {$ENDIF}
  1116. //+-------------------------------------------------------------------------
  1117. //  Get the subject or issuer name from the certificate and
  1118. //  according to the specified format type, convert to a null terminated
  1119. //  character string.
  1120. //
  1121. //  CERT_NAME_ISSUER_FLAG can be set to get the issuer's name. Otherwise,
  1122. //  gets the subject's name.
  1123. //
  1124. //  By default, CERT_RDN_T61_STRING encoded values are initially decoded
  1125. //  as UTF8. If the UTF8 decoding fails, then, decoded as 8 bit characters.
  1126. //  CERT_NAME_DISABLE_IE4_UTF8_FLAG can be set in dwFlags to
  1127. //  skip the initial attempt to decode as UTF8.
  1128. //
  1129. //  The name string is formatted according to the dwType:
  1130. //    CERT_NAME_EMAIL_TYPE
  1131. //      If the certificate has a Subject Alternative Name extension (for
  1132. //      issuer, Issuer Alternative Name), searches for first rfc822Name choice.
  1133. //      If the rfc822Name choice isn't found in the extension, searches the
  1134. //      Subject Name field for the Email OID, "1.2.840.113549.1.9.1".
  1135. //      If the rfc822Name or Email OID is found, returns the string. Otherwise,
  1136. //      returns an empty string (returned character count is 1).
  1137. //    CERT_NAME_RDN_TYPE
  1138. //      Converts the Subject Name blob by calling CertNameToStr. pvTypePara
  1139. //      points to a DWORD containing the dwStrType passed to CertNameToStr.
  1140. //      If the Subject Name field is empty and the certificate has a
  1141. //      Subject Alternative Name extension, searches for and converts
  1142. //      the first directoryName choice.
  1143. //    CERT_NAME_ATTR_TYPE
  1144. //      pvTypePara points to the Object Identifier specifying the name attribute
  1145. //      to be returned. For example, to get the CN,
  1146. //      pvTypePara = szOID_COMMON_NAME ("2.5.4.3"). Searches, the Subject Name
  1147. //      field for the attribute.
  1148. //      If the Subject Name field is empty and the certificate has a
  1149. //      Subject Alternative Name extension, checks for
  1150. //      the first directoryName choice and searches it.
  1151. //
  1152. //      Note, searches the RDNs in reverse order.
  1153. //
  1154. //    CERT_NAME_SIMPLE_DISPLAY_TYPE
  1155. //      Iterates through the following list of name attributes and searches
  1156. //      the Subject Name and then the Subject Alternative Name extension
  1157. //      for the first occurrence of:
  1158. //          szOID_COMMON_NAME ("2.5.4.3")
  1159. //          szOID_ORGANIZATIONAL_UNIT_NAME ("2.5.4.11")
  1160. //          szOID_ORGANIZATION_NAME ("2.5.4.10")
  1161. //          szOID_RSA_emailAddr ("1.2.840.113549.1.9.1")
  1162. //
  1163. //      If none of the above attributes is found, then, searches the
  1164. //      Subject Alternative Name extension for a rfc822Name choice.
  1165. //
  1166. //      If still no match, then, returns the first attribute.
  1167. //
  1168. //      Note, like CERT_NAME_ATTR_TYPE, searches the RDNs in reverse order.
  1169. //
  1170. //    CERT_NAME_FRIENDLY_DISPLAY_TYPE
  1171. //      First checks if the certificate has a CERT_FRIENDLY_NAME_PROP_ID
  1172. //      property. If it does, then, this property is returned. Otherwise,
  1173. //      returns the above CERT_NAME_SIMPLE_DISPLAY_TYPE.
  1174. //
  1175. //  Returns the number of characters converted including the terminating null
  1176. //  character. If pwszNameString is NULL or cchNameString is 0, returns the
  1177. //  required size of the destination string (including the terminating null
  1178. //  char). If the specified name type isn't found. returns an empty string
  1179. //  with a returned character count of 1.
  1180. //
  1181. //  If pwszNameString != NULL && cwszNameString != 0, returned pwszNameString
  1182. //  is always NULL terminated.
  1183. //
  1184. //  Note: cchNameString includes the NULL char.
  1185. //--------------------------------------------------------------------------
  1186. //+-------------------------------------------------------------------------
  1187. //--------------------------------------------------------------------------
  1188. function CertGetNameStringA(pCertContext: PCCERT_CONTEXT; dwType, dwFlags: DWORD;
  1189.   pvTypePara: Pointer; pszNameString: LPSTR; cchNameString: DWORD): DWORD; stdcall;
  1190. {$EXTERNALSYM CertGetNameStringA}
  1191. function CertGetNameStringW(pCertContext: PCCERT_CONTEXT; dwType, dwFlags: DWORD;
  1192.   pvTypePara: Pointer; pszNameString: LPWSTR; cchNameString: DWORD): DWORD; stdcall;
  1193. {$EXTERNALSYM CertGetNameStringW}
  1194. {$IFDEF UNICODE}
  1195. function CertGetNameString(pCertContext: PCCERT_CONTEXT; dwType, dwFlags: DWORD;
  1196.   pvTypePara: Pointer; pszNameString: LPWSTR; cchNameString: DWORD): DWORD; stdcall;
  1197. {$EXTERNALSYM CertGetNameString}
  1198. {$ELSE}
  1199. function CertGetNameString(pCertContext: PCCERT_CONTEXT; dwType, dwFlags: DWORD;
  1200.   pvTypePara: Pointer; pszNameString: LPSTR; cchNameString: DWORD): DWORD; stdcall;
  1201. {$EXTERNALSYM CertGetNameString}
  1202. {$ENDIF}
  1203. //+-------------------------------------------------------------------------
  1204. //  Certificate name types
  1205. //--------------------------------------------------------------------------
  1206. const
  1207.   CERT_NAME_EMAIL_TYPE            = 1;
  1208.   {$EXTERNALSYM CERT_NAME_EMAIL_TYPE}
  1209.   CERT_NAME_RDN_TYPE              = 2;
  1210.   {$EXTERNALSYM CERT_NAME_RDN_TYPE}
  1211.   CERT_NAME_ATTR_TYPE             = 3;
  1212.   {$EXTERNALSYM CERT_NAME_ATTR_TYPE}
  1213.   CERT_NAME_SIMPLE_DISPLAY_TYPE   = 4;
  1214.   {$EXTERNALSYM CERT_NAME_SIMPLE_DISPLAY_TYPE}
  1215.   CERT_NAME_FRIENDLY_DISPLAY_TYPE = 5;
  1216.   {$EXTERNALSYM CERT_NAME_FRIENDLY_DISPLAY_TYPE}
  1217. //+-------------------------------------------------------------------------
  1218. //  Certificate name flags
  1219. //--------------------------------------------------------------------------
  1220.   CERT_NAME_ISSUER_FLAG           = $1;
  1221.   {$EXTERNALSYM CERT_NAME_ISSUER_FLAG}
  1222.   CERT_NAME_DISABLE_IE4_UTF8_FLAG = $00010000;
  1223.   {$EXTERNALSYM CERT_NAME_DISABLE_IE4_UTF8_FLAG}
  1224. //+=========================================================================
  1225. //  Simplified Cryptographic Message Data Structures and APIs
  1226. //==========================================================================
  1227. //+-------------------------------------------------------------------------
  1228. //              Conventions for the *pb and *pcb output parameters:
  1229. //
  1230. //              Upon entry to the function:
  1231. //                  if pcb is OPTIONAL && pcb == NULL, then,
  1232. //                      No output is returned
  1233. //                  else if pb == NULL && pcb != NULL, then,
  1234. //                      Length only determination. No length error is
  1235. //                      returned.
  1236. //                  otherwise where (pb != NULL && pcb != NULL && *pcb != 0)
  1237. //                      Output is returned. If *pcb isn't big enough a
  1238. //                      length error is returned. In all cases *pcb is updated
  1239. //                      with the actual length needed/returned.
  1240. //--------------------------------------------------------------------------
  1241. //+-------------------------------------------------------------------------
  1242. //  Type definitions of the parameters used for doing the cryptographic
  1243. //  operations.
  1244. //--------------------------------------------------------------------------
  1245. //+-------------------------------------------------------------------------
  1246. //  Callback to get and verify the signer's certificate.
  1247. //
  1248. //  Passed the CertId of the signer (its Issuer and SerialNumber) and a
  1249. //  handle to its cryptographic signed message's cert store.
  1250. //
  1251. //  For CRYPT_E_NO_SIGNER, called with pSignerId == NULL.
  1252. //
  1253. //  For a valid signer certificate, returns a pointer to a read only
  1254. //  CERT_CONTEXT. The returned CERT_CONTEXT is either obtained from a
  1255. //  cert store or was created via CertCreateCertificateContext. For either case,
  1256. //  its freed via CertFreeCertificateContext.
  1257. //
  1258. //  If a valid certificate isn't found, this callback returns NULL with
  1259. //  LastError set via SetLastError().
  1260. //
  1261. //  The NULL implementation tries to get the Signer certificate from the
  1262. //  message cert store. It doesn't verify the certificate.
  1263. //
  1264. //  Note, if the KEYID choice was selected for a CMS SignerId, then, the
  1265. //  SerialNumber is 0 and the Issuer is encoded containing a single RDN with a
  1266. //  single Attribute whose OID is szOID_KEYID_RDN, value type is
  1267. //  CERT_RDN_OCTET_STRING and value is the KEYID. When the
  1268. //  CertGetSubjectCertificateFromStore and
  1269. //  CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
  1270. //  special KEYID Issuer and SerialNumber, they do a KEYID match.
  1271. //--------------------------------------------------------------------------
  1272. type
  1273.   PFN_CRYPT_GET_SIGNER_CERTIFICATE = function (pvGetArg: Pointer;
  1274.     dwCertEncodingType: DWORD; pSignerId: PCERT_INFO;
  1275.     hMsgCertStore: HCERTSTORE): PCCERT_CONTEXT; stdcall;
  1276.   {$EXTERNALSYM PFN_CRYPT_GET_SIGNER_CERTIFICATE}
  1277.   PfnCryptGetSignerCertificate = PFN_CRYPT_GET_SIGNER_CERTIFICATE;
  1278. //+-------------------------------------------------------------------------
  1279. //  The CRYPT_SIGN_MESSAGE_PARA are used for signing messages using the
  1280. //  specified signing certificate context.
  1281. //
  1282. //  Either the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID must
  1283. //  be set for each rgpSigningCert[]. Either one specifies the private
  1284. //  signature key to use.
  1285. //
  1286. //  If any certificates and/or CRLs are to be included in the signed message,
  1287. //  then, the MsgCert and MsgCrl parameters need to be updated. If the
  1288. //  rgpSigningCerts are to be included, then, they must also be in the
  1289. //  rgpMsgCert array.
  1290. //
  1291. //  cbSize must be set to the sizeof(CRYPT_SIGN_MESSAGE_PARA) or else
  1292. //  LastError will be updated with E_INVALIDARG.
  1293. //
  1294. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  1295. //
  1296. //  dwFlags normally is set to 0. However, if the encoded output
  1297. //  is to be a CMSG_SIGNED inner content of an outer cryptographic message,
  1298. //  such as a CMSG_ENVELOPED, then, the CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG
  1299. //  should be set. If not set, then it would be encoded as an inner content
  1300. //  type of CMSG_DATA.
  1301. //
  1302. //  dwInnerContentType is normally set to 0. It needs to be set if the
  1303. //  ToBeSigned input is the encoded output of another cryptographic
  1304. //  message, such as, an CMSG_ENVELOPED. When set, it's one of the cryptographic
  1305. //  message types, for example, CMSG_ENVELOPED.
  1306. //
  1307. //  If the inner content of a nested cryptographic message is data (CMSG_DATA
  1308. //  the default), then, neither dwFlags or dwInnerContentType need to be set.
  1309. //
  1310. //  For CMS messages, CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG may be
  1311. //  set to encapsulate nonData inner content within an OCTET STRING.
  1312. //
  1313. //  For CMS messages, CRYPT_MESSAGE_KEYID_SIGNER_FLAG may be set to identify
  1314. //  signers by their Key Identifier and not their Issuer and Serial Number.
  1315. //
  1316. //  If HashEncryptionAlgorithm is present and not NULL its used instead of
  1317. //  the SigningCert's PublicKeyInfo.Algorithm.
  1318. //
  1319. //  Note, for RSA, the hash encryption algorithm is normally the same as
  1320. //  the public key algorithm. For DSA, the hash encryption algorithm is
  1321. //  normally a DSS signature algorithm.
  1322. //
  1323. //  pvHashEncryptionAuxInfo currently isn't used and must be set to NULL if
  1324. //  present in the data structure.
  1325. //--------------------------------------------------------------------------
  1326. type
  1327.   PCRYPT_SIGN_MESSAGE_PARA = ^CRYPT_SIGN_MESSAGE_PARA;
  1328.   {$EXTERNALSYM PCRYPT_SIGN_MESSAGE_PARA}
  1329.   _CRYPT_SIGN_MESSAGE_PARA = record
  1330.     cbSize: DWORD;
  1331.     dwMsgEncodingType: DWORD;
  1332.     pSigningCert: PCCERT_CONTEXT;
  1333.     HashAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  1334.     pvHashAuxInfo: Pointer;
  1335.     cMsgCert: DWORD;
  1336.     rgpMsgCert: PPCCERT_CONTEXT;
  1337.     cMsgCrl: DWORD;
  1338.     rgpMsgCrl: PPCCRL_CONTEXT;
  1339.     cAuthAttr: DWORD;
  1340.     rgAuthAttr: PCRYPT_ATTRIBUTE;
  1341.     cUnauthAttr: DWORD;
  1342.     rgUnauthAttr: PCRYPT_ATTRIBUTE;
  1343.     dwFlags: DWORD;
  1344.     dwInnerContentType: DWORD;
  1345.     {$IFDEF CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS}
  1346.     HashEncryptionAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  1347.     pvHashEncryptionAuxInfo: Pointer;
  1348.     {$ENDIF}
  1349.   end;
  1350.   {$EXTERNALSYM _CRYPT_SIGN_MESSAGE_PARA}
  1351.   CRYPT_SIGN_MESSAGE_PARA = _CRYPT_SIGN_MESSAGE_PARA;
  1352.   {$EXTERNALSYM CRYPT_SIGN_MESSAGE_PARA}
  1353.   TCryptSignMessagePara = CRYPT_SIGN_MESSAGE_PARA;
  1354.   PCryptSignMessagePara = PCRYPT_SIGN_MESSAGE_PARA;
  1355. const
  1356.   CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG = $1;
  1357.   {$EXTERNALSYM CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG}
  1358. // When set, nonData type inner content is encapsulated within an
  1359. // OCTET STRING
  1360.   CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG = $2;
  1361.   {$EXTERNALSYM CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG}
  1362. // When set, signers are identified by their Key Identifier and not
  1363. // their Issuer and Serial Number.
  1364.   CRYPT_MESSAGE_KEYID_SIGNER_FLAG = $4;
  1365.   {$EXTERNALSYM CRYPT_MESSAGE_KEYID_SIGNER_FLAG}
  1366. //+-------------------------------------------------------------------------
  1367. //  The CRYPT_VERIFY_MESSAGE_PARA are used to verify signed messages.
  1368. //
  1369. //  hCryptProv is used to do hashing and signature verification.
  1370. //
  1371. //  The dwCertEncodingType specifies the encoding type of the certificates
  1372. //  and/or CRLs in the message.
  1373. //
  1374. //  pfnGetSignerCertificate is called to get and verify the message signer's
  1375. //  certificate.
  1376. //
  1377. //  cbSize must be set to the sizeof(CRYPT_VERIFY_MESSAGE_PARA) or else
  1378. //  LastError will be updated with E_INVALIDARG.
  1379. //--------------------------------------------------------------------------
  1380. type
  1381.   PCRYPT_VERIFY_MESSAGE_PARA = ^CRYPT_VERIFY_MESSAGE_PARA;
  1382.   {$EXTERNALSYM PCRYPT_VERIFY_MESSAGE_PARA}
  1383.   _CRYPT_VERIFY_MESSAGE_PARA = record
  1384.     cbSize: DWORD;
  1385.     dwMsgAndCertEncodingType: DWORD;
  1386.     hCryptProv: HCRYPTPROV;
  1387.     pfnGetSignerCertificate: PFN_CRYPT_GET_SIGNER_CERTIFICATE;
  1388.     pvGetArg: Pointer;
  1389.   end;
  1390.   {$EXTERNALSYM _CRYPT_VERIFY_MESSAGE_PARA}
  1391.   CRYPT_VERIFY_MESSAGE_PARA = _CRYPT_VERIFY_MESSAGE_PARA;
  1392.   {$EXTERNALSYM CRYPT_VERIFY_MESSAGE_PARA}
  1393.   TCryptVerifyMessagePara = CRYPT_VERIFY_MESSAGE_PARA;
  1394.   PCryptVerifyMessagePara = PCRYPT_VERIFY_MESSAGE_PARA;
  1395. //+-------------------------------------------------------------------------
  1396. //  The CRYPT_ENCRYPT_MESSAGE_PARA are used for encrypting messages.
  1397. //
  1398. //  hCryptProv is used to do content encryption, recipient key
  1399. //  encryption, and recipient key export. Its private key
  1400. //  isn't used.
  1401. //
  1402. //  Currently, pvEncryptionAuxInfo is only defined for RC2 or RC4 encryption
  1403. //  algorithms. Otherwise, its not used and must be set to NULL.
  1404. //  See CMSG_RC2_AUX_INFO for the RC2 encryption algorithms.
  1405. //  See CMSG_RC4_AUX_INFO for the RC4 encryption algorithms.
  1406. //
  1407. //  To enable SP3 compatible encryption, pvEncryptionAuxInfo should point to
  1408. //  a CMSG_SP3_COMPATIBLE_AUX_INFO data structure.
  1409. //
  1410. //  cbSize must be set to the sizeof(CRYPT_ENCRYPT_MESSAGE_PARA) or else
  1411. //  LastError will be updated with E_INVALIDARG.
  1412. //
  1413. //  dwFlags normally is set to 0. However, if the encoded output
  1414. //  is to be a CMSG_ENVELOPED inner content of an outer cryptographic message,
  1415. //  such as a CMSG_SIGNED, then, the CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG
  1416. //  should be set. If not set, then it would be encoded as an inner content
  1417. //  type of CMSG_DATA.
  1418. //
  1419. //  dwInnerContentType is normally set to 0. It needs to be set if the
  1420. //  ToBeEncrypted input is the encoded output of another cryptographic
  1421. //  message, such as, an CMSG_SIGNED. When set, it's one of the cryptographic
  1422. //  message types, for example, CMSG_SIGNED.
  1423. //
  1424. //  If the inner content of a nested cryptographic message is data (CMSG_DATA
  1425. //  the default), then, neither dwFlags or dwInnerContentType need to be set.
  1426. //
  1427. //  For CMS messages, CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG may be
  1428. //  set to encapsulate nonData inner content within an OCTET STRING before
  1429. //  encrypting.
  1430. //
  1431. //  For CMS messages, CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG may be set to identify
  1432. //  recipients by their Key Identifier and not their Issuer and Serial Number.
  1433. //--------------------------------------------------------------------------
  1434. type
  1435.   PCRYPT_ENCRYPT_MESSAGE_PARA = ^CRYPT_ENCRYPT_MESSAGE_PARA;
  1436.   {$EXTERNALSYM PCRYPT_ENCRYPT_MESSAGE_PARA}
  1437.   _CRYPT_ENCRYPT_MESSAGE_PARA = record
  1438.     cbSize: DWORD;
  1439.     dwMsgEncodingType: DWORD;
  1440.     hCryptProv: HCRYPTPROV;
  1441.     ContentEncryptionAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  1442.     pvEncryptionAuxInfo: Pointer;
  1443.     dwFlags: DWORD;
  1444.     dwInnerContentType: DWORD;
  1445.   end;
  1446.   {$EXTERNALSYM _CRYPT_ENCRYPT_MESSAGE_PARA}
  1447.   CRYPT_ENCRYPT_MESSAGE_PARA = _CRYPT_ENCRYPT_MESSAGE_PARA;
  1448.   {$EXTERNALSYM CRYPT_ENCRYPT_MESSAGE_PARA}
  1449.   TCryptEncryptMessagePara = CRYPT_ENCRYPT_MESSAGE_PARA;
  1450.   PCryptEncryptMessagePara = PCRYPT_ENCRYPT_MESSAGE_PARA;
  1451. // When set, recipients are identified by their Key Identifier and not
  1452. // their Issuer and Serial Number.
  1453. const
  1454.   CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG = $4;
  1455.   {$EXTERNALSYM CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG}
  1456. //+-------------------------------------------------------------------------
  1457. //  The CRYPT_DECRYPT_MESSAGE_PARA are used for decrypting messages.
  1458. //
  1459. //  The CertContext to use for decrypting a message is obtained from one
  1460. //  of the specified cert stores. An encrypted message can have one or
  1461. //  more recipients. The recipients are identified by their CertId (Issuer
  1462. //  and SerialNumber). The cert stores are searched to find the CertContext
  1463. //  corresponding to the CertId.
  1464. //
  1465. //  For CMS, the recipients may also be identified by their KeyId.
  1466. //  CMS also allows Key Agreement (Diffie Hellman) in addition to
  1467. //  Key Transport (RSA) recipients.
  1468. //
  1469. //  Only CertContexts in the store with either
  1470. //  the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID set
  1471. //  can be used. Either property specifies the private exchange key to use.
  1472. //
  1473. //  cbSize must be set to the sizeof(CRYPT_DECRYPT_MESSAGE_PARA) or else
  1474. //  LastError will be updated with E_INVALIDARG.
  1475. //--------------------------------------------------------------------------
  1476. type
  1477.   PCRYPT_DECRYPT_MESSAGE_PARA = ^CRYPT_DECRYPT_MESSAGE_PARA;
  1478.   {$EXTERNALSYM PCRYPT_DECRYPT_MESSAGE_PARA}
  1479.   _CRYPT_DECRYPT_MESSAGE_PARA = record
  1480.     cbSize: DWORD;
  1481.     dwMsgAndCertEncodingType: DWORD;
  1482.     cCertStore: DWORD;
  1483.     rghCertStore: PHCERTSTORE;
  1484.   end;
  1485.   {$EXTERNALSYM _CRYPT_DECRYPT_MESSAGE_PARA}
  1486.   CRYPT_DECRYPT_MESSAGE_PARA = _CRYPT_DECRYPT_MESSAGE_PARA;
  1487.   {$EXTERNALSYM CRYPT_DECRYPT_MESSAGE_PARA}
  1488.   TCryptDecryptMessagePara = CRYPT_DECRYPT_MESSAGE_PARA;
  1489.   PCryptDecryptMessagePara = PCRYPT_DECRYPT_MESSAGE_PARA;
  1490. //+-------------------------------------------------------------------------
  1491. //  The CRYPT_HASH_MESSAGE_PARA are used for hashing or unhashing
  1492. //  messages.
  1493. //
  1494. //  hCryptProv is used to compute the hash.
  1495. //
  1496. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  1497. //
  1498. //  cbSize must be set to the sizeof(CRYPT_HASH_MESSAGE_PARA) or else
  1499. //  LastError will be updated with E_INVALIDARG.
  1500. //--------------------------------------------------------------------------
  1501.   PCRYPT_HASH_MESSAGE_PARA = ^CRYPT_HASH_MESSAGE_PARA;
  1502.   {$EXTERNALSYM PCRYPT_HASH_MESSAGE_PARA}
  1503.   _CRYPT_HASH_MESSAGE_PARA = record
  1504.     cbSize: DWORD;
  1505.     dwMsgEncodingType: DWORD;
  1506.     hCryptProv: HCRYPTPROV;
  1507.     HashAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  1508.     pvHashAuxInfo: Pointer;
  1509.   end;
  1510.   {$EXTERNALSYM _CRYPT_HASH_MESSAGE_PARA}
  1511.   CRYPT_HASH_MESSAGE_PARA = _CRYPT_HASH_MESSAGE_PARA;
  1512.   {$EXTERNALSYM CRYPT_HASH_MESSAGE_PARA}
  1513.   TCryptHashMessagePara = CRYPT_HASH_MESSAGE_PARA;
  1514.   PCryptHashMessagePara = PCRYPT_HASH_MESSAGE_PARA;
  1515. //+-------------------------------------------------------------------------
  1516. //  The CRYPT_KEY_SIGN_MESSAGE_PARA are used for signing messages until a
  1517. //  certificate has been created for the signature key.
  1518. //
  1519. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  1520. //
  1521. //  If PubKeyAlgorithm isn't set, defaults to szOID_RSA_RSA.
  1522. //
  1523. //  cbSize must be set to the sizeof(CRYPT_KEY_SIGN_MESSAGE_PARA) or else
  1524. //  LastError will be updated with E_INVALIDARG.
  1525. //--------------------------------------------------------------------------
  1526.   PCRYPT_KEY_SIGN_MESSAGE_PARA = ^CRYPT_KEY_SIGN_MESSAGE_PARA;
  1527.   {$EXTERNALSYM PCRYPT_KEY_SIGN_MESSAGE_PARA}
  1528.   _CRYPT_KEY_SIGN_MESSAGE_PARA = record
  1529.     cbSize: DWORD;
  1530.     dwMsgAndCertEncodingType: DWORD;
  1531.     hCryptProv: HCRYPTPROV;
  1532.     dwKeySpec: DWORD;
  1533.     HashAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  1534.     pvHashAuxInfo: Pointer;
  1535.     PubKeyAlgorithm: CRYPT_ALGORITHM_IDENTIFIER;
  1536.   end;
  1537.   {$EXTERNALSYM _CRYPT_KEY_SIGN_MESSAGE_PARA}
  1538.   CRYPT_KEY_SIGN_MESSAGE_PARA = _CRYPT_KEY_SIGN_MESSAGE_PARA;
  1539.   {$EXTERNALSYM CRYPT_KEY_SIGN_MESSAGE_PARA}
  1540.   TCryptKeySignMessagePara = CRYPT_KEY_SIGN_MESSAGE_PARA;
  1541.   PCryptKeySignMessagePara = PCRYPT_KEY_SIGN_MESSAGE_PARA;
  1542. //+-------------------------------------------------------------------------
  1543. //  The CRYPT_KEY_VERIFY_MESSAGE_PARA are used to verify signed messages without
  1544. //  a certificate for the signer.
  1545. //
  1546. //  Normally used until a certificate has been created for the key.
  1547. //
  1548. //  hCryptProv is used to do hashing and signature verification.
  1549. //
  1550. //  cbSize must be set to the sizeof(CRYPT_KEY_VERIFY_MESSAGE_PARA) or else
  1551. //  LastError will be updated with E_INVALIDARG.
  1552. //--------------------------------------------------------------------------
  1553.   PCRYPT_KEY_VERIFY_MESSAGE_PARA = ^CRYPT_KEY_VERIFY_MESSAGE_PARA;
  1554.   {$EXTERNALSYM PCRYPT_KEY_VERIFY_MESSAGE_PARA}
  1555.   _CRYPT_KEY_VERIFY_MESSAGE_PARA = record
  1556.     cbSize: DWORD;
  1557.     dwMsgEncodingType: DWORD;
  1558.     hCryptProv: HCRYPTPROV;
  1559.   end;
  1560.   {$EXTERNALSYM _CRYPT_KEY_VERIFY_MESSAGE_PARA}
  1561.   CRYPT_KEY_VERIFY_MESSAGE_PARA = _CRYPT_KEY_VERIFY_MESSAGE_PARA;
  1562.   {$EXTERNALSYM CRYPT_KEY_VERIFY_MESSAGE_PARA}
  1563.   TCryptKeyVerifyMessagePara = CRYPT_KEY_VERIFY_MESSAGE_PARA;
  1564.   PCryptKeyVerifyMessagePara = PCRYPT_KEY_VERIFY_MESSAGE_PARA;
  1565. //+-------------------------------------------------------------------------
  1566. //  Sign the message.
  1567. //
  1568. //  If fDetachedSignature is TRUE, the "to be signed" content isn't included
  1569. //  in the encoded signed blob.
  1570. //--------------------------------------------------------------------------
  1571. function CryptSignMessage(pSignPara: PCRYPT_SIGN_MESSAGE_PARA;
  1572.   fDetachedSignature: BOOL; cToBeSigned: DWORD; rgpbToBeSigned: LPBYTE;
  1573.   rgcbToBeSigned: LPDWORD; pbSignedBlob: LPBYTE; var pcbSignedBlob: DWORD): BOOL; stdcall;
  1574. {$EXTERNALSYM CryptSignMessage}
  1575. //+-------------------------------------------------------------------------
  1576. //  Verify a signed message.
  1577. //
  1578. //  If pbDecoded == NULL, then, *pcbDecoded is implicitly set to 0 on input.
  1579. //  For *pcbDecoded == 0 && ppSignerCert == NULL on input, the signer isn't
  1580. //  verified.
  1581. //
  1582. //  A message might have more than one signer. Set dwSignerIndex to iterate
  1583. //  through all the signers. dwSignerIndex == 0 selects the first signer.
  1584. //
  1585. //  pVerifyPara's pfnGetSignerCertificate is called to get the signer's
  1586. //  certificate.
  1587. //
  1588. //  For a verified signer and message, *ppSignerCert is updated
  1589. //  with the CertContext of the signer. It must be freed by calling
  1590. //  CertFreeCertificateContext. Otherwise, *ppSignerCert is set to NULL.
  1591. //
  1592. //  ppSignerCert can be NULL, indicating the caller isn't interested
  1593. //  in getting the CertContext of the signer.
  1594. //
  1595. //  pcbDecoded can be NULL, indicating the caller isn't interested in getting
  1596. //  the decoded content. Furthermore, if the message doesn't contain any
  1597. //  content or signers, then, pcbDecoded must be set to NULL, to allow the
  1598. //  pVerifyPara->pfnGetCertificate to be called. Normally, this would be
  1599. //  the case when the signed message contains only certficates and CRLs.
  1600. //  If pcbDecoded is NULL and the message doesn't have the indicated signer,
  1601. //  pfnGetCertificate is called with pSignerId set to NULL.
  1602. //
  1603. //  If the message doesn't contain any signers || dwSignerIndex > message's
  1604. //  SignerCount, then, an error is returned with LastError set to
  1605. //  CRYPT_E_NO_SIGNER. Also, for CRYPT_E_NO_SIGNER, pfnGetSignerCertificate
  1606. //  is still called with pSignerId set to NULL.
  1607. //
  1608. //  Note, an alternative way to get the certificates and CRLs from a
  1609. //  signed message is to call CryptGetMessageCertificates.
  1610. //--------------------------------------------------------------------------
  1611. function CryptVerifyMessageSignature(pVerifyPara: PCRYPT_VERIFY_MESSAGE_PARA;
  1612.   dwSignerIndex: DWORD; pbSignedBlob: LPBYTE; cbSignedBlob: DWORD;
  1613.   pbDecoded: LPBYTE; pcbDecoded: LPDWORD; ppSignerCert: PPCCERT_CONTEXT): BOOL; stdcall;
  1614. {$EXTERNALSYM CryptVerifyMessageSignature}
  1615. //+-------------------------------------------------------------------------
  1616. //  Returns the count of signers in the signed message. For no signers, returns
  1617. //  0. For an error returns -1 with LastError updated accordingly.
  1618. //--------------------------------------------------------------------------
  1619. function CryptGetMessageSignerCount(dwMsgEncodingType: DWORD; pbSignedBlob: LPBYTE;
  1620.   cbSignedBlob: DWORD): LONG; stdcall;
  1621. {$EXTERNALSYM CryptGetMessageSignerCount}
  1622. //+-------------------------------------------------------------------------
  1623. //  Returns the cert store containing the message's certs and CRLs.
  1624. //  For an error, returns NULL with LastError updated.
  1625. //--------------------------------------------------------------------------
  1626. function CryptGetMessageCertificates(dwMsgAndCertEncodingType: DWORD;
  1627.   hCryptProv: HCRYPTPROV; dwFlags: DWORD; pbSignedBlob: LPBYTE;
  1628.   cbSignedBlob: DWORD): HCERTSTORE; stdcall;
  1629. {$EXTERNALSYM CryptGetMessageCertificates}
  1630. //+-------------------------------------------------------------------------
  1631. //  Verify a signed message containing detached signature(s).
  1632. //  The "to be signed" content is passed in separately. No
  1633. //  decoded output. Otherwise, identical to CryptVerifyMessageSignature.
  1634. //--------------------------------------------------------------------------
  1635. function CryptVerifyDetachedMessageSignature(pVerifyPara: PCRYPT_VERIFY_MESSAGE_PARA;
  1636.   dwSignerIndex: DWORD; pbDetachedSignBlob: LPBYTE; cbDetachedSignBlob: DWORD;
  1637.   cToBeSigned: DWORD; rgpbToBeSigned: LPBYTE; rgcbToBeSigned: LPDWORD;
  1638.   ppSignerCert: PPCCERT_CONTEXT): BOOL; stdcall;
  1639. {$EXTERNALSYM CryptVerifyDetachedMessageSignature}
  1640. //+-------------------------------------------------------------------------
  1641. //  Encrypts the message for the recipient(s).
  1642. //--------------------------------------------------------------------------
  1643. function CryptEncryptMessage(pEncryptPara: PCRYPT_ENCRYPT_MESSAGE_PARA;
  1644.   cRecipientCert: DWORD; rgpRecipientCert: PCCERT_CONTEXT; pbToBeEncrypted: LPBYTE;
  1645.   cbToBeEncrypted: DWORD; pbEncryptedBlob: LPBYTE; var pcbEncryptedBlob: DWORD): BOOL; stdcall;
  1646. {$EXTERNALSYM CryptEncryptMessage}
  1647. //+-------------------------------------------------------------------------
  1648. //  Decrypts the message.
  1649. //
  1650. //  If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input.
  1651. //  For *pcbDecrypted == 0 && ppXchgCert == NULL on input, the message isn't
  1652. //  decrypted.
  1653. //
  1654. //  For a successfully decrypted message, *ppXchgCert is updated
  1655. //  with the CertContext used to decrypt. It must be freed by calling
  1656. //  CertStoreFreeCert. Otherwise, *ppXchgCert is set to NULL.
  1657. //
  1658. //  ppXchgCert can be NULL, indicating the caller isn't interested
  1659. //  in getting the CertContext used to decrypt.
  1660. //--------------------------------------------------------------------------
  1661. function CryptDecryptMessage(pDecryptPara: PCRYPT_DECRYPT_MESSAGE_PARA;
  1662.   pbEncryptedBlob: LPBYTE; cbEncryptedBlob: DWORD; pbDecrypted: LPBYTE;
  1663.   pcbDecrypted: LPDWORD; ppXchgCert: PPCCERT_CONTEXT): BOOL; stdcall;
  1664. {$EXTERNALSYM CryptDecryptMessage}
  1665. //+-------------------------------------------------------------------------
  1666. //  Sign the message and encrypt for the recipient(s). Does a CryptSignMessage
  1667. //  followed with a CryptEncryptMessage.
  1668. //
  1669. //  Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED
  1670. //  inside of an CMSG_ENVELOPED.
  1671. //--------------------------------------------------------------------------
  1672. function CryptSignAndEncryptMessage(pSignPara: PCRYPT_SIGN_MESSAGE_PARA;
  1673.   pEncryptPara: PCRYPT_ENCRYPT_MESSAGE_PARA; cRecipientCert: DWORD;
  1674.   rgpRecipientCert: PCCERT_CONTEXT; pbToBeSignedAndEncrypted: LPBYTE;
  1675.   cbToBeSignedAndEncrypted: DWORD; pbSignedAndEncryptedBlob: LPBYTE;
  1676.   var pcbSignedAndEncryptedBlob: DWORD): BOOL; stdcall;
  1677. {$EXTERNALSYM CryptSignAndEncryptMessage}
  1678. //+-------------------------------------------------------------------------
  1679. //  Decrypts the message and verifies the signer. Does a CryptDecryptMessage
  1680. //  followed with a CryptVerifyMessageSignature.
  1681. //
  1682. //  If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input.
  1683. //  For *pcbDecrypted == 0 && ppSignerCert == NULL on input, the signer isn't
  1684. //  verified.
  1685. //
  1686. //  A message might have more than one signer. Set dwSignerIndex to iterate
  1687. //  through all the signers. dwSignerIndex == 0 selects the first signer.
  1688. //
  1689. //  The pVerifyPara's VerifySignerPolicy is called to verify the signer's
  1690. //  certificate.
  1691. //
  1692. //  For a successfully decrypted and verified message, *ppXchgCert and
  1693. //  *ppSignerCert are updated. They must be freed by calling
  1694. //  CertStoreFreeCert. Otherwise, they are set to NULL.
  1695. //
  1696. //  ppXchgCert and/or ppSignerCert can be NULL, indicating the
  1697. //  caller isn't interested in getting the CertContext.
  1698. //
  1699. //  Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED
  1700. //  inside of an CMSG_ENVELOPED.
  1701. //
  1702. //  The message always needs to be decrypted to allow access to the
  1703. //  signed message. Therefore, if ppXchgCert != NULL, its always updated.
  1704. //--------------------------------------------------------------------------
  1705. function CryptDecryptAndVerifyMessageSignature(pDecryptPara: PCRYPT_DECRYPT_MESSAGE_PARA;
  1706.   pVerifyPara: PCRYPT_VERIFY_MESSAGE_PARA; dwSignerIndex: DWORD; pbEncryptedBlob: LPBYTE;
  1707.   cbEncryptedBlob: DWORD; pbDecrypted: LPBYTE; pcbDecrypted: LPDWORD;
  1708.   ppXchgCert: PPCCERT_CONTEXT; ppSignerCert: PPCCERT_CONTEXT): BOOL; stdcall;
  1709. {$EXTERNALSYM CryptDecryptAndVerifyMessageSignature}
  1710. //+-------------------------------------------------------------------------
  1711. //  Decodes a cryptographic message which may be one of the following types:
  1712. //    CMSG_DATA
  1713. //    CMSG_SIGNED
  1714. //    CMSG_ENVELOPED
  1715. //    CMSG_SIGNED_AND_ENVELOPED
  1716. //    CMSG_HASHED
  1717. //
  1718. //  dwMsgTypeFlags specifies the set of allowable messages. For example, to
  1719. //  decode either SIGNED or ENVELOPED messages, set dwMsgTypeFlags to:
  1720. //      CMSG_SIGNED_FLAG | CMSG_ENVELOPED_FLAG.
  1721. //
  1722. //  dwProvInnerContentType is only applicable when processing nested
  1723. //  crytographic messages. When processing an outer crytographic message
  1724. //  it must be set to 0. When decoding a nested cryptographic message
  1725. //  its the dwInnerContentType returned by a previous CryptDecodeMessage
  1726. //  of the outer message. The InnerContentType can be any of the CMSG types,
  1727. //  for example, CMSG_DATA, CMSG_SIGNED, ...
  1728. //
  1729. //  The optional *pdwMsgType is updated with the type of message.
  1730. //
  1731. //  The optional *pdwInnerContentType is updated with the type of the inner
  1732. //  message. Unless there is cryptographic message nesting, CMSG_DATA
  1733. //  is returned.
  1734. //
  1735. //  For CMSG_DATA: returns decoded content.
  1736. //  For CMSG_SIGNED: same as CryptVerifyMessageSignature.
  1737. //  For CMSG_ENVELOPED: same as CryptDecryptMessage.
  1738. //  For CMSG_SIGNED_AND_ENVELOPED: same as CryptDecryptMessage plus
  1739. //      CryptVerifyMessageSignature.
  1740. //  For CMSG_HASHED: verifies the hash and returns decoded content.
  1741. //--------------------------------------------------------------------------
  1742. function CryptDecodeMessage(dwMsgTypeFlags: DWORD; pDecryptPara: PCRYPT_DECRYPT_MESSAGE_PARA;
  1743.   pVerifyPara: PCRYPT_VERIFY_MESSAGE_PARA; dwSignerIndex: DWORD; pbEncodedBlob: LPBYTE;
  1744.   cbEncodedBlob: DWORD; dwPrevInnerContentType: DWORD; pdwMsgType: LPDWORD;
  1745.   pdwInnerContentType: LPDWORD; pbDecoded: LPBYTE; pcbDecoded: LPDWORD;
  1746.   ppXchgCert: PPCCERT_CONTEXT; ppSignerCert: PPCCERT_CONTEXT): BOOL; stdcall;
  1747. {$EXTERNALSYM CryptDecodeMessage}
  1748. //+-------------------------------------------------------------------------
  1749. //  Hash the message.
  1750. //
  1751. //  If fDetachedHash is TRUE, only the ComputedHash is encoded in the
  1752. //  pbHashedBlob. Otherwise, both the ToBeHashed and ComputedHash
  1753. //  are encoded.
  1754. //
  1755. //  pcbHashedBlob or pcbComputedHash can be NULL, indicating the caller
  1756. //  isn't interested in getting the output.
  1757. //--------------------------------------------------------------------------
  1758. function CryptHashMessage(pHashPara: PCRYPT_HASH_MESSAGE_PARA; fDetachedHash: BOOL;
  1759.   cToBeHashed: DWORD; rgpbToBeHashed: LPBYTE; rgcbToBeHashed: LPDWORD;
  1760.   pbHashedBlob: LPBYTE; pcbHashedBlob: LPDWORD; pbComputedHash: LPBYTE;
  1761.   pcbComputedHash: LPDWORD): BOOL; stdcall;
  1762. {$EXTERNALSYM CryptHashMessage}
  1763. //+-------------------------------------------------------------------------
  1764. //  Verify a hashed message.
  1765. //
  1766. //  pcbToBeHashed or pcbComputedHash can be NULL,
  1767. //  indicating the caller isn't interested in getting the output.
  1768. //--------------------------------------------------------------------------
  1769. function CryptVerifyMessageHash(pHashPara: PCRYPT_HASH_MESSAGE_PARA;
  1770.   pbHashedBlob: LPBYTE; cbHashedBlob: DWORD; pbToBeHashed: LPBYTE;
  1771.   pcbToBeHashed: LPDWORD; pbComputedHash: LPBYTE; pcbComputedHash: LPDWORD): BOOL; stdcall;
  1772. {$EXTERNALSYM CryptVerifyMessageHash}
  1773. //+-------------------------------------------------------------------------
  1774. //  Verify a hashed message containing a detached hash.
  1775. //  The "to be hashed" content is passed in separately. No
  1776. //  decoded output. Otherwise, identical to CryptVerifyMessageHash.
  1777. //
  1778. //  pcbComputedHash can be NULL, indicating the caller isn't interested
  1779. //  in getting the output.
  1780. //--------------------------------------------------------------------------
  1781. function CryptVerifyDetachedMessageHash(pHashPara: PCRYPT_HASH_MESSAGE_PARA;
  1782.   pbDetachedHashBlob: LPBYTE; cbDetachedHashBlob: DWORD; cToBeHashed: DWORD;
  1783.   rgpbToBeHashed: LPBYTE; rgcbToBeHashed: LPDWORD; pbComputedHash: LPBYTE;
  1784.   pcbComputedHash: LPDWORD): BOOL; stdcall;
  1785. {$EXTERNALSYM CryptVerifyDetachedMessageHash}
  1786. //+-------------------------------------------------------------------------
  1787. //  Sign the message using the provider's private key specified in the
  1788. //  parameters. A dummy SignerId is created and stored in the message.
  1789. //
  1790. //  Normally used until a certificate has been created for the key.
  1791. //--------------------------------------------------------------------------
  1792. function CryptSignMessageWithKey(pSignPara: PCRYPT_KEY_SIGN_MESSAGE_PARA;
  1793.   pbToBeSigned: LPBYTE; cbToBeSigned: DWORD; pbSignedBlob: LPBYTE;
  1794.   var pcbSignedBlob: DWORD): BOOL; stdcall;
  1795. {$EXTERNALSYM CryptSignMessageWithKey}
  1796. //+-------------------------------------------------------------------------
  1797. //  Verify a signed message using the specified public key info.
  1798. //
  1799. //  Normally called by a CA until it has created a certificate for the
  1800. //  key.
  1801. //
  1802. //  pPublicKeyInfo contains the public key to use to verify the signed
  1803. //  message. If NULL, the signature isn't verified (for instance, the decoded
  1804. //  content may contain the PublicKeyInfo).
  1805. //
  1806. //  pcbDecoded can be NULL, indicating the caller isn't interested
  1807. //  in getting the decoded content.
  1808. //--------------------------------------------------------------------------
  1809. function CryptVerifyMessageSignatureWithKey(pVerifyPara: PCRYPT_KEY_VERIFY_MESSAGE_PARA;
  1810.   pPublicKeyInfo: PCERT_PUBLIC_KEY_INFO; pbSignedBlob: LPBYTE; cbSignedBlob: DWORD;
  1811.   pbDecoded: LPBYTE; pcbDecoded: LPDWORD): BOOL; stdcall;
  1812. {$EXTERNALSYM CryptVerifyMessageSignatureWithKey}
  1813. //+=========================================================================
  1814. //  System Certificate Store Data Structures and APIs
  1815. //==========================================================================
  1816. //+-------------------------------------------------------------------------
  1817. //  Get a system certificate store based on a subsystem protocol.
  1818. //
  1819. //  Current examples of subsystems protocols are:
  1820. //      "MY"    Cert Store hold certs with associated Private Keys
  1821. //      "CA"    Certifying Authority certs
  1822. //      "ROOT"  Root Certs
  1823. //      "SPC"   Software publisher certs
  1824. //
  1825. //
  1826. //  If hProv is NULL the default provider "1" is opened for you.
  1827. //  When the store is closed the provider is release. Otherwise
  1828. //  if hProv is not NULL, no provider is created or released.
  1829. //
  1830. //  The returned Cert Store can be searched for an appropriate Cert
  1831. //  using the Cert Store API's (see certstor.h)
  1832. //
  1833. //  When done, the cert store should be closed using CertStoreClose
  1834. //--------------------------------------------------------------------------
  1835. function CertOpenSystemStoreA(hProv: HCRYPTPROV; szSubsystemProtocol: LPCSTR): HCERTSTORE; stdcall;
  1836. {$EXTERNALSYM CertOpenSystemStoreA}
  1837. function CertOpenSystemStoreW(hProv: HCRYPTPROV; szSubsystemProtocol: LPCWSTR): HCERTSTORE; stdcall;
  1838. {$EXTERNALSYM CertOpenSystemStoreW}
  1839. {$IFDEF UNICODE}
  1840. function CertOpenSystemStore(hProv: HCRYPTPROV; szSubsystemProtocol: LPCWSTR): HCERTSTORE; stdcall;
  1841. {$EXTERNALSYM CertOpenSystemStore}
  1842. {$ELSE}
  1843. function CertOpenSystemStore(hProv: HCRYPTPROV; szSubsystemProtocol: LPCSTR): HCERTSTORE; stdcall;
  1844. {$EXTERNALSYM CertOpenSystemStore}
  1845. {$ENDIF}
  1846. function CertAddEncodedCertificateToSystemStoreA(szCertStoreName: LPCSTR;
  1847.   pbCertEncoded: LPBYTE; cbCertEncoded: DWORD): BOOL; stdcall;
  1848. {$EXTERNALSYM CertAddEncodedCertificateToSystemStoreA}
  1849. function CertAddEncodedCertificateToSystemStoreW(szCertStoreName: LPCWSTR;
  1850.   pbCertEncoded: LPBYTE; cbCertEncoded: DWORD): BOOL; stdcall;
  1851. {$EXTERNALSYM CertAddEncodedCertificateToSystemStoreW}
  1852. {$IFDEF UNICODE}
  1853. function CertAddEncodedCertificateToSystemStore(szCertStoreName: LPCWSTR;
  1854.   pbCertEncoded: LPBYTE; cbCertEncoded: DWORD): BOOL; stdcall;
  1855. {$EXTERNALSYM CertAddEncodedCertificateToSystemStore}
  1856. {$ELSE}
  1857. function CertAddEncodedCertificateToSystemStore(szCertStoreName: LPCSTR;
  1858.   pbCertEncoded: LPBYTE; cbCertEncoded: DWORD): BOOL; stdcall;
  1859. {$EXTERNALSYM CertAddEncodedCertificateToSystemStore}
  1860. {$ENDIF}
  1861. //+-------------------------------------------------------------------------
  1862. //  Find all certificate chains tying the given issuer name to any certificate
  1863. //  that the current user has a private key for.
  1864. //
  1865. //  If no certificate chain is found, FALSE is returned with LastError set
  1866. //  to CRYPT_E_NOT_FOUND and the counts zeroed.
  1867. //
  1868. //  IE 3.0 ASSUMPTION:
  1869. //   The client certificates are in the "My" system store. The issuer
  1870. //   cerificates may be in the "Root", "CA" or "My" system stores.
  1871. //--------------------------------------------------------------------------
  1872. type
  1873.   PCERT_CHAIN = ^CERT_CHAIN;
  1874.   {$EXTERNALSYM PCERT_CHAIN}
  1875.   _CERT_CHAIN = record
  1876.     cCerts: DWORD; // number of certs in chain
  1877.     certs: PCERT_BLOB; // pointer to array of cert chain blobs
  1878.     // representing the certs
  1879.     keyLocatorInfo: CRYPT_KEY_PROV_INFO; // key locator for cert
  1880.   end;
  1881.   {$EXTERNALSYM _CERT_CHAIN}
  1882.   CERT_CHAIN = _CERT_CHAIN;
  1883.   {$EXTERNALSYM CERT_CHAIN}
  1884.   TCertChain = CERT_CHAIN;
  1885.   PCertChain = PCERT_CHAIN;
  1886. // WINCRYPT32API    This is not exported by crypt32, it is exported by softpub
  1887. function FindCertsByIssuer(pCertChains: PCERT_CHAIN; var pcbCertChains: DWORD;
  1888.   pcCertChains: LPDWORD; pbEncodedIssuerName: LPBYTE; cbEncodedIssuerName: DWORD;
  1889.   pwszPurpose: LPCWSTR; dwKeySpec: DWORD): HRESULT; stdcall;
  1890. {$EXTERNALSYM FindCertsByIssuer}
  1891. //-------------------------------------------------------------------------
  1892. //
  1893. //  CryptQueryObject takes a CERT_BLOB or a file name and returns the
  1894. //  information about the content in the blob or in the file.
  1895. //
  1896. //  Parameters:
  1897. //  INPUT   dwObjectType:
  1898. //                       Indicate the type of the object.  Should be one of the
  1899. //                       following:
  1900. //                          CERT_QUERY_OBJECT_FILE
  1901. //                          CERT_QUERY_OBJECT_BLOB
  1902. //
  1903. //  INPUT   pvObject:
  1904. //                        If dwObjectType == CERT_QUERY_OBJECT_FILE, it is a
  1905. //                        LPWSTR, that is, the pointer to a wchar file name
  1906. //                        if dwObjectType == CERT_QUERY_OBJECT_BLOB, it is a
  1907. //                        PCERT_BLOB, that is, a pointer to a CERT_BLOB
  1908. //
  1909. //  INPUT   dwExpectedContentTypeFlags:
  1910. //                        Indicate the expected contenet type.
  1911. //                        Can be one of the following:
  1912. //                              CERT_QUERY_CONTENT_FLAG_ALL  (the content can be any type)
  1913. //                              CERT_QUERY_CONTENT_FLAG_CERT
  1914. //                              CERT_QUERY_CONTENT_FLAG_CTL
  1915. //                              CERT_QUERY_CONTENT_FLAG_CRL
  1916. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE
  1917. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT
  1918. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL
  1919. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL
  1920. //                              CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
  1921. //                              CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED
  1922. //                              CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED
  1923. //                              CERT_QUERY_CONTNET_FLAG_PKCS10
  1924. //                              CERT_QUERY_CONTNET_FLAG_PFX
  1925. //
  1926. //  INPUT   dwExpectedFormatTypeFlags:
  1927. //                        Indicate the expected format type.
  1928. //                        Can be one of the following:
  1929. //                              CERT_QUERY_FORMAT_FLAG_ALL (the content can be any format)
  1930. //                              CERT_QUERY_FORMAT_FLAG_BINARY
  1931. //                              CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED
  1932. //
  1933. //
  1934. //  INPUT   dwFlags
  1935. //                        Reserved flag.  Should always set to 0
  1936. //
  1937. //  OUTPUT  pdwMsgAndCertEncodingType
  1938. //                        Optional output.  If NULL != pdwMsgAndCertEncodingType,
  1939. //                        it contains the encoding type of the content as any
  1940. //                        combination of the following:
  1941. //                              X509_ASN_ENCODING
  1942. //                              PKCS_7_ASN_ENCODING
  1943. //
  1944. //  OUTPUT  pdwContentType
  1945. //                        Optional output.  If NULL!=pdwContentType, it contains
  1946. //                        the content type as one of the the following:
  1947. //                              CERT_QUERY_CONTENT_CERT
  1948. //                              CERT_QUERY_CONTENT_CTL
  1949. //                              CERT_QUERY_CONTENT_CRL
  1950. //                              CERT_QUERY_CONTENT_SERIALIZED_STORE
  1951. //                              CERT_QUERY_CONTENT_SERIALIZED_CERT
  1952. //                              CERT_QUERY_CONTENT_SERIALIZED_CTL
  1953. //                              CERT_QUERY_CONTENT_SERIALIZED_CRL
  1954. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED
  1955. //                              CERT_QUERY_CONTENT_PKCS7_UNSIGNED
  1956. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
  1957. //                              CERT_QUERY_CONTENT_PKCS10
  1958. //                              CERT_QUERY_CONTENT_PFX
  1959. //
  1960. //  OUTPUT  pdwFormatType
  1961. //                        Optional output.  If NULL !=pdwFormatType, it
  1962. //                        contains the format type of the content as one of the
  1963. //                        following:
  1964. //                              CERT_QUERY_FORMAT_BINARY
  1965. //                              CERT_QUERY_FORMAT_BASE64_ENCODED
  1966. //
  1967. //
  1968. //  OUTPUT  phCertStore
  1969. //                        Optional output.  If NULL !=phStore,
  1970. //                        it contains a cert store that includes all of certificates,
  1971. //                        CRL, and CTL in the object if the object content type is
  1972. //                        one of the following:
  1973. //                              CERT_QUERY_CONTENT_CERT
  1974. //                              CERT_QUERY_CONTENT_CTL
  1975. //                              CERT_QUERY_CONTENT_CRL
  1976. //                              CERT_QUERY_CONTENT_SERIALIZED_STORE
  1977. //                              CERT_QUERY_CONTENT_SERIALIZED_CERT
  1978. //                              CERT_QUERY_CONTENT_SERIALIZED_CTL
  1979. //                              CERT_QUERY_CONTENT_SERIALIZED_CRL
  1980. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED
  1981. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
  1982. //
  1983. //                       Caller should free *phCertStore via CertCloseStore.
  1984. //
  1985. //
  1986. //  OUTPUT  phMsg        Optional output.  If NULL != phMsg,
  1987. //                        it contains a handle to a opened message if
  1988. //                        the content type is one of the following:
  1989. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED
  1990. //                              CERT_QUERY_CONTENT_PKCS7_UNSIGNED
  1991. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
  1992. //
  1993. //                       Caller should free *phMsg via CryptMsgClose.
  1994. //
  1995. //  OUTPUT pContext     Optional output.  If NULL != pContext,
  1996. //                      it contains either a PCCERT_CONTEXT or PCCRL_CONTEXT,
  1997. //                      or PCCTL_CONTEXT based on the content type.
  1998. //
  1999. //                      If the content type is CERT_QUERY_CONTENT_CERT or
  2000. //                      CERT_QUERY_CONTENT_SERIALIZED_CERT, it is a PCCERT_CONTEXT;
  2001. //                      Caller should free the pContext via CertFreeCertificateContext.
  2002. //
  2003. //                      If the content type is CERT_QUERY_CONTENT_CRL or
  2004. //                      CERT_QUERY_CONTENT_SERIALIZED_CRL, it is a PCCRL_CONTEXT;
  2005. //                      Caller should free the pContext via CertFreeCRLContext.
  2006. //
  2007. //                      If the content type is CERT_QUERY_CONTENT_CTL or
  2008. //                      CERT_QUERY_CONTENT_SERIALIZED_CTL, it is a PCCTL_CONTEXT;
  2009. //                      Caller should free the pContext via CertFreeCTLContext.
  2010. //
  2011. //  If the *pbObject is of type CERT_QUERY_CONTENT_PKCS10 or CERT_QUERY_CONTENT_PFX, CryptQueryObject
  2012. //  will not return anything in *phCertstore, *phMsg, or *ppvContext.
  2013. //--------------------------------------------------------------------------
  2014. function CryptQueryObject(dwObjectType: DWORD; pvObject: Pointer;
  2015.   dwExpectedContentTypeFlags, dwExpectedFormatTypeFlags, dwFlags: DWORD;
  2016.   pdwMsgAndCertEncodingType, pdwContentType, pdwFormatType: LPDWORD;
  2017.   phCertStore: PHCERTSTORE; phMsg: PHCRYPTMSG; ppvContext: PPointer): BOOL; stdcall;
  2018. {$EXTERNALSYM CryptQueryObject}
  2019. //-------------------------------------------------------------------------
  2020. //dwObjectType for CryptQueryObject
  2021. //-------------------------------------------------------------------------
  2022. const
  2023.   CERT_QUERY_OBJECT_FILE = $00000001;
  2024.   {$EXTERNALSYM CERT_QUERY_OBJECT_FILE}
  2025.   CERT_QUERY_OBJECT_BLOB = $00000002;
  2026.   {$EXTERNALSYM CERT_QUERY_OBJECT_BLOB}
  2027. //-------------------------------------------------------------------------
  2028. //dwConentType for CryptQueryObject
  2029. //-------------------------------------------------------------------------
  2030. //encoded single certificate
  2031.   CERT_QUERY_CONTENT_CERT = 1;
  2032.   {$EXTERNALSYM CERT_QUERY_CONTENT_CERT}
  2033. //encoded single CTL
  2034.   CERT_QUERY_CONTENT_CTL = 2;
  2035.   {$EXTERNALSYM CERT_QUERY_CONTENT_CTL}
  2036. //encoded single CRL
  2037.   CERT_QUERY_CONTENT_CRL = 3;
  2038.   {$EXTERNALSYM CERT_QUERY_CONTENT_CRL}
  2039. //serialized store
  2040.   CERT_QUERY_CONTENT_SERIALIZED_STORE = 4;
  2041.   {$EXTERNALSYM CERT_QUERY_CONTENT_SERIALIZED_STORE}
  2042. //serialized single certificate
  2043.   CERT_QUERY_CONTENT_SERIALIZED_CERT = 5;
  2044.   {$EXTERNALSYM CERT_QUERY_CONTENT_SERIALIZED_CERT}
  2045. //serialized single CTL
  2046.   CERT_QUERY_CONTENT_SERIALIZED_CTL = 6;
  2047.   {$EXTERNALSYM CERT_QUERY_CONTENT_SERIALIZED_CTL}
  2048. //serialized single CRL
  2049.   CERT_QUERY_CONTENT_SERIALIZED_CRL = 7;
  2050.   {$EXTERNALSYM CERT_QUERY_CONTENT_SERIALIZED_CRL}
  2051. //a PKCS#7 signed message
  2052.   CERT_QUERY_CONTENT_PKCS7_SIGNED = 8;
  2053.   {$EXTERNALSYM CERT_QUERY_CONTENT_PKCS7_SIGNED}
  2054. //a PKCS#7 message, such as enveloped message.  But it is not a signed message,
  2055.   CERT_QUERY_CONTENT_PKCS7_UNSIGNED = 9;
  2056.   {$EXTERNALSYM CERT_QUERY_CONTENT_PKCS7_UNSIGNED}
  2057. //a PKCS7 signed message embedded in a file
  2058.   CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED = 10;
  2059.   {$EXTERNALSYM CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED}
  2060. //an encoded PKCS#10
  2061.   CERT_QUERY_CONTENT_PKCS10 = 11;
  2062.   {$EXTERNALSYM CERT_QUERY_CONTENT_PKCS10}
  2063. //an encoded PKX BLOB
  2064.   CERT_QUERY_CONTENT_PFX = 12;
  2065.   {$EXTERNALSYM CERT_QUERY_CONTENT_PFX}
  2066. //-------------------------------------------------------------------------
  2067. //dwExpectedConentTypeFlags for CryptQueryObject
  2068. //-------------------------------------------------------------------------
  2069. //encoded single certificate
  2070.   CERT_QUERY_CONTENT_FLAG_CERT = (1 shl CERT_QUERY_CONTENT_CERT);
  2071.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_CERT}
  2072. //encoded single CTL
  2073.   CERT_QUERY_CONTENT_FLAG_CTL = (1 shl CERT_QUERY_CONTENT_CTL);
  2074.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_CTL}
  2075. //encoded single CRL
  2076.   CERT_QUERY_CONTENT_FLAG_CRL = (1 shl CERT_QUERY_CONTENT_CRL);
  2077.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_CRL}
  2078. //serialized store
  2079.   CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE = (1 shl CERT_QUERY_CONTENT_SERIALIZED_STORE);
  2080.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE}
  2081. //serialized single certificate
  2082.   CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT = (1 shl CERT_QUERY_CONTENT_SERIALIZED_CERT);
  2083.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT}
  2084. //serialized single CTL
  2085.   CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL = (1 shl CERT_QUERY_CONTENT_SERIALIZED_CTL);
  2086.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL}
  2087. //serialized single CRL
  2088.   CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL = (1 shl CERT_QUERY_CONTENT_SERIALIZED_CRL);
  2089.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL}
  2090. //an encoded PKCS#7 signed message
  2091.   CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED = (1 shl CERT_QUERY_CONTENT_PKCS7_SIGNED);
  2092.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED}
  2093. //an encoded PKCS#7 message.  But it is not a signed message
  2094.   CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED = (1 shl CERT_QUERY_CONTENT_PKCS7_UNSIGNED);
  2095.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED}
  2096. //the content includes an embedded PKCS7 signed message
  2097.   CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED = (1 shl CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED);
  2098.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED}
  2099. //an encoded PKCS#10
  2100.   CERT_QUERY_CONTENT_FLAG_PKCS10 = (1 shl CERT_QUERY_CONTENT_PKCS10);
  2101.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_PKCS10}
  2102. //an encoded PFX BLOB
  2103.   CERT_QUERY_CONTENT_FLAG_PFX = (1 shl CERT_QUERY_CONTENT_PFX);
  2104.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_PFX}
  2105. //content can be any type
  2106.   CERT_QUERY_CONTENT_FLAG_ALL = CERT_QUERY_CONTENT_FLAG_CERT or
  2107.                                 CERT_QUERY_CONTENT_FLAG_CTL or
  2108.                                 CERT_QUERY_CONTENT_FLAG_CRL or
  2109.                                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE or
  2110.                                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT or
  2111.                                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL or
  2112.                                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL or
  2113.                                 CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED or
  2114.                                 CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED or
  2115.                                 CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED or
  2116.                                 CERT_QUERY_CONTENT_FLAG_PKCS10 or
  2117.                                 CERT_QUERY_CONTENT_FLAG_PFX;
  2118.   {$EXTERNALSYM CERT_QUERY_CONTENT_FLAG_ALL}
  2119. //-------------------------------------------------------------------------
  2120. //dwFormatType for CryptQueryObject
  2121. //-------------------------------------------------------------------------
  2122. //the content is in binary format
  2123.   CERT_QUERY_FORMAT_BINARY = 1;
  2124.   {$EXTERNALSYM CERT_QUERY_FORMAT_BINARY}
  2125. //the content is base64 encoded
  2126.   CERT_QUERY_FORMAT_BASE64_ENCODED = 2;
  2127.   {$EXTERNALSYM CERT_QUERY_FORMAT_BASE64_ENCODED}
  2128. //-------------------------------------------------------------------------
  2129. //dwExpectedFormatTypeFlags for CryptQueryObject
  2130. //-------------------------------------------------------------------------
  2131. //the content is in binary format
  2132.   CERT_QUERY_FORMAT_FLAG_BINARY = (1 shl CERT_QUERY_FORMAT_BINARY);
  2133.   {$EXTERNALSYM CERT_QUERY_FORMAT_FLAG_BINARY}
  2134. //the content is base64 encoded
  2135.   CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 shl CERT_QUERY_FORMAT_BASE64_ENCODED);
  2136.   {$EXTERNALSYM CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED}
  2137. //the content can be of any format
  2138.   CERT_QUERY_FORMAT_FLAG_ALL = CERT_QUERY_FORMAT_FLAG_BINARY or CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED;
  2139.   {$EXTERNALSYM CERT_QUERY_FORMAT_FLAG_ALL}
  2140. //
  2141. // Crypt32 Memory Management Routines.  All Crypt32 API which return allocated
  2142. // buffers will do so via CryptMemAlloc, CryptMemRealloc.  Clients can free
  2143. // those buffers using CryptMemFree.  Also included is CryptMemSize
  2144. //
  2145. function CryptMemAlloc(cbSize: ULONG): LPVOID; stdcall;
  2146. {$EXTERNALSYM CryptMemAlloc}
  2147. function CryptMemRealloc(pv: LPVOID; cbSize: ULONG): LPVOID; stdcall;
  2148. {$EXTERNALSYM CryptMemRealloc}
  2149. procedure CryptMemFree(pv: LPVOID); stdcall;
  2150. {$EXTERNALSYM CryptMemFree}
  2151. //
  2152. // Crypt32 Asynchronous Parameter Management Routines.  All Crypt32 API which
  2153. // expose asynchronous mode operation use a Crypt32 Async Handle to pass
  2154. // around information about the operation e.g. callback routines.  The
  2155. // following API are used for manipulation of the async handle
  2156. //
  2157. type
  2158.   HCRYPTASYNC = HANDLE;
  2159.   {$EXTERNALSYM HCRYPTASYNC}
  2160.   PHCRYPTASYNC = ^HCRYPTASYNC;
  2161.   {$EXTERNALSYM PHCRYPTASYNC}
  2162.   PFN_CRYPT_ASYNC_PARAM_FREE_FUNC = procedure (pszParamOid: LPSTR; pvParam: LPVOID); stdcall;
  2163.   {$EXTERNALSYM PFN_CRYPT_ASYNC_PARAM_FREE_FUNC}
  2164.   PFnCryptAsyncParamFreeFunc = PFN_CRYPT_ASYNC_PARAM_FREE_FUNC;
  2165. function CryptCreateAsyncHandle(dwFlags: DWORD; phAsync: PHCRYPTASYNC): BOOL; stdcall;
  2166. {$EXTERNALSYM CryptCreateAsyncHandle}
  2167. function CryptSetAsyncParam(hAsync: HCRYPTASYNC; pszParamOid: LPSTR;
  2168.   pvParam: LPVOID; pfnFree: PFN_CRYPT_ASYNC_PARAM_FREE_FUNC): BOOL; stdcall;
  2169. {$EXTERNALSYM CryptSetAsyncParam}
  2170. function CryptGetAsyncParam(hAsync: HCRYPTASYNC; pszParamOid: LPSTR;
  2171.   var ppvParam: LPVOID; var ppfnFree: PFN_CRYPT_ASYNC_PARAM_FREE_FUNC): BOOL; stdcall;
  2172. {$EXTERNALSYM CryptGetAsyncParam}
  2173. function CryptCloseAsyncHandle(hAsync: HCRYPTASYNC): BOOL; stdcall;
  2174. {$EXTERNALSYM CryptCloseAsyncHandle}
  2175. //
  2176. // Crypt32 Remote Object Retrieval Routines.  This API allows retrieval of
  2177. // remote PKI objects where the location is given by an URL.  The remote
  2178. // object retrieval manager exposes two provider models.  One is the "Scheme
  2179. // Provider" model which allows for installable protocol providers as defined
  2180. // by the URL scheme e.g. ldap, http, ftp.  The scheme provider entry point is
  2181. // the same as the CryptRetrieveObjectByUrl however the *ppvObject returned
  2182. // is ALWAYS a counted array of encoded bits (one per object retrieved).  The
  2183. // second provider model is the "Context Provider" model which allows for
  2184. // installable creators of CAPI2 context handles (objects) based on the
  2185. // retrieved encoded bits.  These are dispatched based on the object OID given
  2186. // in the call to CryptRetrieveObjectByUrl.
  2187. //
  2188. type
  2189.   PCRYPT_BLOB_ARRAY = ^CRYPT_BLOB_ARRAY;
  2190.   {$EXTERNALSYM PCRYPT_BLOB_ARRAY}
  2191.   _CRYPT_BLOB_ARRAY = record
  2192.     cBlob: DWORD;
  2193.     rgBlob: PCRYPT_DATA_BLOB;
  2194.   end;
  2195.   {$EXTERNALSYM _CRYPT_BLOB_ARRAY}
  2196.   CRYPT_BLOB_ARRAY = _CRYPT_BLOB_ARRAY;
  2197.   {$EXTERNALSYM CRYPT_BLOB_ARRAY}
  2198.   TCryptBlobArray = CRYPT_BLOB_ARRAY;
  2199.   PCryptBlobArray = PCRYPT_BLOB_ARRAY;  
  2200.   PCRYPT_CREDENTIALS = ^CRYPT_CREDENTIALS;
  2201.   {$EXTERNALSYM PCRYPT_CREDENTIALS}
  2202.   _CRYPT_CREDENTIALS = record
  2203.     cbSize: DWORD;
  2204.     pszCredentialsOid: LPCSTR;
  2205.     pvCredentials: LPVOID;
  2206.   end;
  2207.   {$EXTERNALSYM _CRYPT_CREDENTIALS}
  2208.   CRYPT_CREDENTIALS = _CRYPT_CREDENTIALS;
  2209.   {$EXTERNALSYM CRYPT_CREDENTIALS}
  2210.   TCryptCredentials = CRYPT_CREDENTIALS;
  2211.   PCryptCredentials = PCRYPT_CREDENTIALS;
  2212. const
  2213.   CREDENTIAL_OID_PASSWORD_CREDENTIALS_A = LPCSTR(1);
  2214.   {$EXTERNALSYM CREDENTIAL_OID_PASSWORD_CREDENTIALS_A}
  2215.   CREDENTIAL_OID_PASSWORD_CREDENTIALS_W = LPCSTR(2);
  2216.   {$EXTERNALSYM CREDENTIAL_OID_PASSWORD_CREDENTIALS_W}
  2217. {$IFDEF UNICODE}
  2218.   CREDENTIAL_OID_PASSWORD_CREDENTIALS = CREDENTIAL_OID_PASSWORD_CREDENTIALS_W;
  2219.   {$EXTERNALSYM CREDENTIAL_OID_PASSWORD_CREDENTIALS}
  2220. {$ELSE}
  2221.   CREDENTIAL_OID_PASSWORD_CREDENTIALS = CREDENTIAL_OID_PASSWORD_CREDENTIALS_A;
  2222.   {$EXTERNALSYM CREDENTIAL_OID_PASSWORD_CREDENTIALS}
  2223. {$ENDIF}
  2224. type
  2225.   PCRYPT_PASSWORD_CREDENTIALSA = ^CRYPT_PASSWORD_CREDENTIALSA;
  2226.   {$EXTERNALSYM PCRYPT_PASSWORD_CREDENTIALSA}
  2227.   _CRYPT_PASSWORD_CREDENTIALSA = record
  2228.     cbSize: DWORD;
  2229.     pszUsername: LPSTR;
  2230.     pszPassword: LPSTR;
  2231.   end;
  2232.   {$EXTERNALSYM _CRYPT_PASSWORD_CREDENTIALSA}
  2233.   CRYPT_PASSWORD_CREDENTIALSA = _CRYPT_PASSWORD_CREDENTIALSA;
  2234.   {$EXTERNALSYM CRYPT_PASSWORD_CREDENTIALSA}
  2235.   TCryptPasswordCredentialsA = CRYPT_PASSWORD_CREDENTIALSA;
  2236.   PCryptPasswordCredentialsA = PCRYPT_PASSWORD_CREDENTIALSA;
  2237.   PCRYPT_PASSWORD_CREDENTIALSW = ^CRYPT_PASSWORD_CREDENTIALSW;
  2238.   {$EXTERNALSYM PCRYPT_PASSWORD_CREDENTIALSW}
  2239.   _CRYPT_PASSWORD_CREDENTIALSW = record
  2240.     cbSize: DWORD;
  2241.     pszUsername: LPWSTR;
  2242.     pszPassword: LPWSTR;
  2243.   end;
  2244.   {$EXTERNALSYM _CRYPT_PASSWORD_CREDENTIALSW}
  2245.   CRYPT_PASSWORD_CREDENTIALSW = _CRYPT_PASSWORD_CREDENTIALSW;
  2246.   {$EXTERNALSYM CRYPT_PASSWORD_CREDENTIALSW}
  2247.   TCryptPasswordCredentialsW = CRYPT_PASSWORD_CREDENTIALSW;
  2248.   PCryptPasswordCredentialsW = PCRYPT_PASSWORD_CREDENTIALSW;
  2249. {$IFDEF UNICODE}
  2250.   CRYPT_PASSWORD_CREDENTIALS = CRYPT_PASSWORD_CREDENTIALSW;
  2251.   {$EXTERNALSYM CRYPT_PASSWORD_CREDENTIALS}
  2252.   PCRYPT_PASSWORD_CREDENTIALS = PCRYPT_PASSWORD_CREDENTIALSW;
  2253.   {$EXTERNALSYM PCRYPT_PASSWORD_CREDENTIALS}
  2254.   TCryptPasswordCredentials = TCryptPasswordCredentialsW;
  2255.   PCryptPasswordCredentials = PCryptPasswordCredentialsW;
  2256. {$ELSE}
  2257.   CRYPT_PASSWORD_CREDENTIALS = CRYPT_PASSWORD_CREDENTIALSA;
  2258.   {$EXTERNALSYM CRYPT_PASSWORD_CREDENTIALS}
  2259.   PCRYPT_PASSWORD_CREDENTIALS = PCRYPT_PASSWORD_CREDENTIALSA;
  2260.   {$EXTERNALSYM PCRYPT_PASSWORD_CREDENTIALS}
  2261.   TCryptPasswordCredentials = TCryptPasswordCredentialsA;
  2262.   PCryptPasswordCredentials = PCryptPasswordCredentialsA;
  2263. {$ENDIF}
  2264. //
  2265. // Scheme Provider Signatures
  2266. //
  2267. const
  2268.   SCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNC = 'SchemeDllRetrieveEncodedObject';
  2269.   {$EXTERNALSYM SCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNC}
  2270. type
  2271.   PFN_FREE_ENCODED_OBJECT_FUNC = procedure (pszObjectOid: LPCSTR;
  2272.     pObject: PCRYPT_BLOB_ARRAY; pvFreeContext: LPVOID); stdcall;
  2273.   {$EXTERNALSYM PFN_FREE_ENCODED_OBJECT_FUNC}
  2274.   PFnFreeEncodedObjectFunc = PFN_FREE_ENCODED_OBJECT_FUNC;
  2275. //
  2276. // SchemeDllRetrieveEncodedObject has the following signature:
  2277. //
  2278. // BOOL WINAPI SchemeDllRetrieveEncodedObject (
  2279. //                   IN LPCSTR pszUrl,
  2280. //                   IN LPCSTR pszObjectOid,
  2281. //                   IN DWORD dwRetrievalFlags,
  2282. //                   IN DWORD dwTimeout,
  2283. //                   OUT PCRYPT_BLOB_ARRAY pObject,
  2284. //                   OUT PFN_FREE_ENCODED_OBJECT_FUNC* ppfnFreeObject,
  2285. //                   OUT LPVOID* ppvFreeContext,
  2286. //                   IN HCRYPTASYNC hAsyncRetrieve,
  2287. //                   IN PCRYPT_CREDENTIALS pCredentials,
  2288. //                   IN LPVOID pvReserved
  2289. //                   )
  2290. //
  2291. //
  2292. // Context Provider Signatures
  2293. //
  2294. const
  2295.   CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC = 'ContextDllCreateObjectContext';
  2296.   {$EXTERNALSYM CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC}
  2297.   CONTEXT_OID_CERTIFICATE = LPCSTR(1);
  2298.   {$EXTERNALSYM CONTEXT_OID_CERTIFICATE}
  2299.   CONTEXT_OID_CRL         = LPCSTR(2);
  2300.   {$EXTERNALSYM CONTEXT_OID_CRL}
  2301.   CONTEXT_OID_CTL         = LPCSTR(3);
  2302.   {$EXTERNALSYM CONTEXT_OID_CTL}
  2303.   CONTEXT_OID_PKCS7       = LPCSTR(4);
  2304.   {$EXTERNALSYM CONTEXT_OID_PKCS7}
  2305.   CONTEXT_OID_CAPI2_ANY   = LPCSTR(5);
  2306.   {$EXTERNALSYM CONTEXT_OID_CAPI2_ANY}
  2307. //
  2308. // ContextDllCreateObjectContext has the following signature:
  2309. //
  2310. // BOOL WINAPI ContextDllCreateObjectContext (
  2311. //                    IN LPCSTR pszObjectOid,
  2312. //                    IN DWORD dwRetrievalFlags,
  2313. //                    IN PCRYPT_BLOB_ARRAY pObject,
  2314. //                    OUT LPVOID* ppvContext
  2315. //                    )
  2316. //
  2317. //
  2318. // Remote Object Retrieval API
  2319. //
  2320. //
  2321. // Retrieval flags
  2322. //
  2323.   CRYPT_RETRIEVE_MULTIPLE_OBJECTS = $00000001;
  2324.   {$EXTERNALSYM CRYPT_RETRIEVE_MULTIPLE_OBJECTS}
  2325.   CRYPT_CACHE_ONLY_RETRIEVAL      = $00000002;
  2326.   {$EXTERNALSYM CRYPT_CACHE_ONLY_RETRIEVAL}
  2327.   CRYPT_WIRE_ONLY_RETRIEVAL       = $00000004;
  2328.   {$EXTERNALSYM CRYPT_WIRE_ONLY_RETRIEVAL}
  2329.   CRYPT_DONT_CACHE_RESULT         = $00000008;
  2330.   {$EXTERNALSYM CRYPT_DONT_CACHE_RESULT}
  2331.   CRYPT_ASYNC_RETRIEVAL           = $00000010;
  2332.   {$EXTERNALSYM CRYPT_ASYNC_RETRIEVAL}
  2333. //
  2334. // Data verification retrieval flags
  2335. //
  2336. // CRYPT_VERIFY_CONTEXT_SIGNATURE is used to get signature verification
  2337. // on the context created.  In this case pszObjectOid must be non-NULL and
  2338. // pvVerify points to the signer certificate context
  2339. //
  2340. // CRYPT_VERIFY_DATA_HASH is used to get verification of the blob data
  2341. // retrieved by the protocol.  The pvVerify points to an URL_DATA_HASH
  2342. // structure (TBD)
  2343. //
  2344.   CRYPT_VERIFY_CONTEXT_SIGNATURE = $00000020;
  2345.   {$EXTERNALSYM CRYPT_VERIFY_CONTEXT_SIGNATURE}
  2346.   CRYPT_VERIFY_DATA_HASH         = $00000040;
  2347.   {$EXTERNALSYM CRYPT_VERIFY_DATA_HASH}
  2348. //
  2349. // Time Valid Object flags
  2350. //
  2351.   CRYPT_KEEP_TIME_VALID          = $00000080;
  2352.   {$EXTERNALSYM CRYPT_KEEP_TIME_VALID}
  2353.   CRYPT_DONT_VERIFY_SIGNATURE    = $00000100;
  2354.   {$EXTERNALSYM CRYPT_DONT_VERIFY_SIGNATURE}
  2355.   CRYPT_DONT_CHECK_TIME_VALIDITY = $00000200;
  2356.   {$EXTERNALSYM CRYPT_DONT_CHECK_TIME_VALIDITY}
  2357. function CryptRetrieveObjectByUrlA(pszUrl: LPCSTR; pszObjectOid: LPCSTR;
  2358.   dwRetrievalFlags: DWORD; dwTimeout: DWORD; var ppvObject: LPVOID;
  2359.   hAsyncRetrieve: HCRYPTASYNC; pCredentials: PCRYPT_CREDENTIALS;
  2360.   pvVerify: LPVOID; pvReserved: LPVOID): BOOL; stdcall;
  2361. {$EXTERNALSYM CryptRetrieveObjectByUrlA}
  2362. function CryptRetrieveObjectByUrlW(pszUrl: LPCWSTR; pszObjectOid: LPCSTR;
  2363.   dwRetrievalFlags: DWORD; dwTimeout: DWORD; var ppvObject: LPVOID;
  2364.   hAsyncRetrieve: HCRYPTASYNC; pCredentials: PCRYPT_CREDENTIALS;
  2365.   pvVerify: LPVOID; pvReserved: LPVOID): BOOL; stdcall;
  2366. {$EXTERNALSYM CryptRetrieveObjectByUrlW}
  2367. {$IFDEF UNICODE}
  2368. function CryptRetrieveObjectByUrl(pszUrl: LPCWSTR; pszObjectOid: LPCSTR;
  2369.   dwRetrievalFlags: DWORD; dwTimeout: DWORD; var ppvObject: LPVOID;
  2370.   hAsyncRetrieve: HCRYPTASYNC; pCredentials: PCRYPT_CREDENTIALS;
  2371.   pvVerify: LPVOID; pvReserved: LPVOID): BOOL; stdcall;
  2372. {$EXTERNALSYM CryptRetrieveObjectByUrl}
  2373. {$ELSE}
  2374. function CryptRetrieveObjectByUrl(pszUrl: LPCSTR; pszObjectOid: LPCSTR;
  2375.   dwRetrievalFlags: DWORD; dwTimeout: DWORD; var ppvObject: LPVOID;
  2376.   hAsyncRetrieve: HCRYPTASYNC; pCredentials: PCRYPT_CREDENTIALS;
  2377.   pvVerify: LPVOID; pvReserved: LPVOID): BOOL; stdcall;
  2378. {$EXTERNALSYM CryptRetrieveObjectByUrl}
  2379. {$ENDIF}
  2380. //
  2381. // Call back function to cancel object retrieval
  2382. //
  2383. // The function can be installed on a per thread basis.  
  2384. // If CryptInstallCancelRetrieval is called for multiple times, only the most recent
  2385. // installation will be kept.
  2386. //
  2387. // This is only effective for http, https, gopher, and ftp protocol.  
  2388. // It is ignored by the rest of the protocols.
  2389. type
  2390.   PFN_CRYPT_CANCEL_RETRIEVAL = function (dwFlags: DWORD; pvArg: Pointer): BOOL; stdcall;
  2391.   {$EXTERNALSYM PFN_CRYPT_CANCEL_RETRIEVAL}
  2392.   PFnCryptCancelRetrieval = PFN_CRYPT_CANCEL_RETRIEVAL;
  2393. //
  2394. // PFN_CRYPT_CANCEL_RETRIEVAL
  2395. //
  2396. // This function should return FALSE when the object retrieval should be continued
  2397. // and return TRUE when the object retrieval should be cancelled.
  2398. //
  2399. function CryptInstallCancelRetrieval(pfnCancel: PFN_CRYPT_CANCEL_RETRIEVAL;
  2400.   pvArg: Pointer; dwFlags: DWORD; pvReserved: Pointer): BOOL; stdcall;
  2401. {$EXTERNALSYM CryptInstallCancelRetrieval}
  2402. function CryptUninstallCancelRetrieval(dwFlags: DWORD; pvReserved: Pointer): BOOL; stdcall;
  2403. {$EXTERNALSYM CryptUninstallCancelRetrieval}
  2404. function CryptCancelAsyncRetrieval(hAsyncRetrieval: HCRYPTASYNC): BOOL; stdcall;
  2405. {$EXTERNALSYM CryptCancelAsyncRetrieval}
  2406. //
  2407. // Remote Object Async Retrieval parameters
  2408. //
  2409. //
  2410. // A client that wants to be notified of asynchronous object retrieval
  2411. // completion sets this parameter on the async handle
  2412. //
  2413. const
  2414.   CRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETION = LPCSTR(1);
  2415.   {$EXTERNALSYM CRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETION}
  2416. type
  2417.   PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC = procedure (pvCompletion: LPVOID;
  2418.     dwCompletionCode: DWORD; pszUrl: LPCSTR; pszObjectOid: LPSTR; pvObject: LPVOID); stdcall;
  2419.   {$EXTERNALSYM PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC}
  2420.   PFnCryptASynchRetrievalCompletionFunc = PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC;
  2421.   PCRYPT_ASYNC_RETRIEVAL_COMPLETION = ^CRYPT_ASYNC_RETRIEVAL_COMPLETION;
  2422.   {$EXTERNALSYM PCRYPT_ASYNC_RETRIEVAL_COMPLETION}
  2423.   _CRYPT_ASYNC_RETRIEVAL_COMPLETION = record
  2424.     pfnCompletion: PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC;
  2425.     pvCompletion: LPVOID;
  2426.   end;
  2427.   {$EXTERNALSYM _CRYPT_ASYNC_RETRIEVAL_COMPLETION}
  2428.   CRYPT_ASYNC_RETRIEVAL_COMPLETION = _CRYPT_ASYNC_RETRIEVAL_COMPLETION;
  2429.   {$EXTERNALSYM CRYPT_ASYNC_RETRIEVAL_COMPLETION}
  2430.   TCryptAsyncRetrievalCompletion = CRYPT_ASYNC_RETRIEVAL_COMPLETION;
  2431.   PCryptAsyncRetrievalCompletion = PCRYPT_ASYNC_RETRIEVAL_COMPLETION;
  2432. //
  2433. // This function is set on the async handle by a scheme provider that
  2434. // supports asynchronous retrieval
  2435. //
  2436. const
  2437.   CRYPT_PARAM_CANCEL_ASYNC_RETRIEVAL = LPCSTR(2);
  2438.   {$EXTERNALSYM CRYPT_PARAM_CANCEL_ASYNC_RETRIEVAL}
  2439. type
  2440.   PFN_CANCEL_ASYNC_RETRIEVAL_FUNC = function (hAsyncRetrieve: HCRYPTASYNC): BOOL; stdcall;
  2441.   {$EXTERNALSYM PFN_CANCEL_ASYNC_RETRIEVAL_FUNC}
  2442.   PFnCancelASynchRetrievalFunc = PFN_CANCEL_ASYNC_RETRIEVAL_FUNC;
  2443. //
  2444. // Get the locator for a CAPI object
  2445. //
  2446. const
  2447.   CRYPT_GET_URL_FROM_PROPERTY         = $00000001;
  2448.   {$EXTERNALSYM CRYPT_GET_URL_FROM_PROPERTY}
  2449.   CRYPT_GET_URL_FROM_EXTENSION        = $00000002;
  2450.   {$EXTERNALSYM CRYPT_GET_URL_FROM_EXTENSION}
  2451.   CRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTE = $00000004;
  2452.   {$EXTERNALSYM CRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTE}
  2453.   CRYPT_GET_URL_FROM_AUTH_ATTRIBUTE   = $00000008;
  2454.   {$EXTERNALSYM CRYPT_GET_URL_FROM_AUTH_ATTRIBUTE}
  2455. type
  2456.   PCRYPT_URL_ARRAY = ^CRYPT_URL_ARRAY;
  2457.   {$EXTERNALSYM PCRYPT_URL_ARRAY}
  2458.   _CRYPT_URL_ARRAY = record
  2459.     cUrl: DWORD;
  2460.     rgwszUrl: LPWSTR;
  2461.   end;
  2462.   {$EXTERNALSYM _CRYPT_URL_ARRAY}
  2463.   CRYPT_URL_ARRAY = _CRYPT_URL_ARRAY;
  2464.   {$EXTERNALSYM CRYPT_URL_ARRAY}
  2465.   TCryptUrlArray = CRYPT_URL_ARRAY;
  2466.   PCryptUrlArray = PCRYPT_URL_ARRAY;
  2467.   PCRYPT_URL_INFO = ^CRYPT_URL_INFO;
  2468.   {$EXTERNALSYM PCRYPT_URL_INFO}
  2469.   _CRYPT_URL_INFO = record
  2470.     cbSize: DWORD;
  2471.   end;
  2472.   {$EXTERNALSYM _CRYPT_URL_INFO}
  2473.   CRYPT_URL_INFO = _CRYPT_URL_INFO;
  2474.   {$EXTERNALSYM CRYPT_URL_INFO}
  2475.   TCryptUrlInfo = CRYPT_URL_INFO;
  2476.   PCryptUrlInfo = PCRYPT_URL_INFO;
  2477. function CryptGetObjectUrl(pszUrlOid: LPCSTR; pvPara: LPVOID; dwFlags: DWORD;
  2478.   pUrlArray: PCRYPT_URL_ARRAY; var pcbUrlArray: DWORD; pUrlInfo: PCRYPT_URL_INFO;
  2479.   pcbUrlInfo: LPDWORD; pvReserved: LPVOID): BOOL; stdcall;
  2480. {$EXTERNALSYM CryptGetObjectUrl}
  2481. const
  2482.   URL_OID_GET_OBJECT_URL_FUNC = 'UrlDllGetObjectUrl';
  2483.   {$EXTERNALSYM URL_OID_GET_OBJECT_URL_FUNC}
  2484. //
  2485. // UrlDllGetObjectUrl has the same signature as CryptGetObjectUrl
  2486. //
  2487. //
  2488. // URL_OID_CERTIFICATE_ISSUER
  2489. //
  2490. // pvPara == PCCERT_CONTEXT, certificate whose issuer's URL is being requested
  2491. //
  2492. // This will be retrieved from the authority info access extension or property
  2493. // on the certificate
  2494. //
  2495. // URL_OID_CERTIFICATE_CRL_DIST_POINT
  2496. //
  2497. // pvPara == PCCERT_CONTEXT, certificate whose CRL distribution point is being
  2498. // requested
  2499. //
  2500. // This will be retrieved from the CRL distribution point extension or property
  2501. // on the certificate
  2502. //
  2503. // URL_OID_CTL_ISSUER
  2504. //
  2505. // pvPara == PCCTL_CONTEXT, Signer Index, CTL whose issuer's URL (identified
  2506. // by the signer index) is being requested
  2507. //
  2508. // This will be retrieved from an authority info access attribute method encoded
  2509. // in each signer info in the PKCS7 (CTL)
  2510. //
  2511. // URL_OID_CTL_NEXT_UPDATE
  2512. //
  2513. // pvPara == PCCTL_CONTEXT, Signer Index, CTL whose next update URL is being
  2514. // requested and an optional signer index in case we need to check signer
  2515. // info attributes
  2516. //
  2517. // This will be retrieved from an authority info access CTL extension, property,
  2518. // or signer info attribute method
  2519. //
  2520. // URL_OID_CRL_ISSUER
  2521. //
  2522. // pvPara == PCCRL_CONTEXT, CRL whose issuer's URL is being requested
  2523. //
  2524. // This will be retrieved from a property on the CRL which has been inherited
  2525. // from the subject cert (either from the subject cert issuer or the subject
  2526. // cert distribution point extension).  It will be encoded as an authority
  2527. // info access extension method.
  2528. //
  2529. const
  2530.   URL_OID_CERTIFICATE_ISSUER         = LPCSTR(1);
  2531.   {$EXTERNALSYM URL_OID_CERTIFICATE_ISSUER}
  2532.   URL_OID_CERTIFICATE_CRL_DIST_POINT = LPCSTR(2);
  2533.   {$EXTERNALSYM URL_OID_CERTIFICATE_CRL_DIST_POINT}
  2534.   URL_OID_CTL_ISSUER                 = LPCSTR(3);
  2535.   {$EXTERNALSYM URL_OID_CTL_ISSUER}
  2536.   URL_OID_CTL_NEXT_UPDATE            = LPCSTR(4);
  2537.   {$EXTERNALSYM URL_OID_CTL_NEXT_UPDATE}
  2538.   URL_OID_CRL_ISSUER                 = LPCSTR(5);
  2539.   {$EXTERNALSYM URL_OID_CRL_ISSUER}
  2540. //
  2541. // Get a time valid CAPI2 object
  2542. //
  2543. function CryptGetTimeValidObject(pszTimeValidOid: LPCSTR; pvPara: LPVOID;
  2544.   pIssuer: PCCERT_CONTEXT; pftValidFor: LPFILETIME; dwFlags, dwTimeout: DWORD;
  2545.   ppvObject: LPLPVOID; pCredentials: PCRYPT_CREDENTIALS; pvReserved: LPVOID): BOOL; stdcall;
  2546. {$EXTERNALSYM CryptGetTimeValidObject}
  2547. const
  2548.   TIME_VALID_OID_GET_OBJECT_FUNC = 'TimeValidDllGetObject';
  2549.   {$EXTERNALSYM TIME_VALID_OID_GET_OBJECT_FUNC}
  2550. //
  2551. // TimeValidDllGetObject has the same signature as CryptGetTimeValidObject
  2552. //
  2553. //
  2554. // TIME_VALID_OID_GET_CTL
  2555. //
  2556. // pvPara == PCCTL_CONTEXT, the current CTL
  2557. //
  2558. // TIME_VALID_OID_GET_CRL
  2559. //
  2560. // pvPara == PCCRL_CONTEXT, the current CRL
  2561. //
  2562. // TIME_VALID_OID_GET_CRL_FROM_CERT
  2563. //
  2564. // pvPara == PCCERT_CONTEXT, the subject cert
  2565. //
  2566.   TIME_VALID_OID_GET_CTL           = LPCSTR(1);
  2567.   {$EXTERNALSYM TIME_VALID_OID_GET_CTL}
  2568.   TIME_VALID_OID_GET_CRL           = LPCSTR(2);
  2569.   {$EXTERNALSYM TIME_VALID_OID_GET_CRL}
  2570.   TIME_VALID_OID_GET_CRL_FROM_CERT = LPCSTR(3);
  2571.   {$EXTERNALSYM TIME_VALID_OID_GET_CRL_FROM_CERT}
  2572. function CryptFlushTimeValidObject(pszFlushTimeValidOid: LPCSTR; pvPara: LPVOID;
  2573.   pIssuer: PCCERT_CONTEXT; dwFlags: DWORD; pvReserved: LPVOID): BOOL; stdcall;
  2574. {$EXTERNALSYM CryptFlushTimeValidObject}
  2575. const
  2576.   TIME_VALID_OID_FLUSH_OBJECT_FUNC = 'TimeValidDllFlushObject';
  2577.   {$EXTERNALSYM TIME_VALID_OID_FLUSH_OBJECT_FUNC}
  2578. //
  2579. // TimeValidDllFlushObject has the same signature as CryptFlushTimeValidObject
  2580. //
  2581. //
  2582. // TIME_VALID_OID_FLUSH_CTL
  2583. //
  2584. // pvPara == PCCTL_CONTEXT, the CTL to flush
  2585. //
  2586. // TIME_VALID_OID_FLUSH_CRL
  2587. //
  2588. // pvPara == PCCRL_CONTEXT, the CRL to flush
  2589. //
  2590. // TIME_VALID_OID_FLUSH_CRL_FROM_CERT
  2591. //
  2592.   TIME_VALID_OID_FLUSH_CTL           = LPCSTR(1);
  2593.   {$EXTERNALSYM TIME_VALID_OID_FLUSH_CTL}
  2594.   TIME_VALID_OID_FLUSH_CRL           = LPCSTR(2);
  2595.   {$EXTERNALSYM TIME_VALID_OID_FLUSH_CRL}
  2596.   TIME_VALID_OID_FLUSH_CRL_FROM_CERT = LPCSTR(3);
  2597.   {$EXTERNALSYM TIME_VALID_OID_FLUSH_CRL_FROM_CERT}
  2598. //-------------------------------------------------------------------------
  2599. // Data Protection APIs
  2600. //-------------------------------------------------------------------------
  2601. //
  2602. // Data protection APIs enable applications to easily secure data.
  2603. //
  2604. // The base provider provides protection based on the users' logon
  2605. // credentials. The data secured with these APIs follow the same
  2606. // roaming characteristics as HKCU -- if HKCU roams, the data
  2607. // protected by the base provider may roam as well. This makes
  2608. // the API ideal for the munging of data stored in the registry.
  2609. //
  2610. //
  2611. // Prompt struct -- what to tell users about the access
  2612. //
  2613. type
  2614.   PCRYPTPROTECT_PROMPTSTRUCT = ^CRYPTPROTECT_PROMPTSTRUCT;
  2615.   {$EXTERNALSYM PCRYPTPROTECT_PROMPTSTRUCT}
  2616.   _CRYPTPROTECT_PROMPTSTRUCT = record
  2617.     cbSize: DWORD;
  2618.     dwPromptFlags: DWORD;
  2619.     hwndApp: HWND;
  2620.     szPrompt: LPCWSTR;
  2621.   end;
  2622.   {$EXTERNALSYM _CRYPTPROTECT_PROMPTSTRUCT}
  2623.   CRYPTPROTECT_PROMPTSTRUCT = _CRYPTPROTECT_PROMPTSTRUCT;
  2624.   {$EXTERNALSYM CRYPTPROTECT_PROMPTSTRUCT}
  2625.   TCryptProtectPromptStruct = CRYPTPROTECT_PROMPTSTRUCT;