WinCrypt.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:634k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //+-------------------------------------------------------------------------
  2. //  CMSG_CTRL_DEL_CERT
  3. //
  4. //  Delete a certificate from a signed-data or signed-and-enveloped-data
  5. //  message.
  6. //
  7. //  pvCtrlPara points to a DWORD containing the 0-based index of the
  8. //  certificate to be removed.
  9. //--------------------------------------------------------------------------
  10. //+-------------------------------------------------------------------------
  11. //  CMSG_CTRL_ADD_CRL
  12. //
  13. //  Add a CRL to a signed-data or signed-and-enveloped-data message.
  14. //
  15. //  pvCtrlPara points to a CRYPT_DATA_BLOB containing the CRL's
  16. //  encoded bytes.
  17. //--------------------------------------------------------------------------
  18. //+-------------------------------------------------------------------------
  19. //  CMSG_CTRL_DEL_CRL
  20. //
  21. //  Delete a CRL from a signed-data or signed-and-enveloped-data message.
  22. //
  23. //  pvCtrlPara points to a DWORD containing the 0-based index of the CRL
  24. //  to be removed.
  25. //--------------------------------------------------------------------------
  26. //+-------------------------------------------------------------------------
  27. //  CMSG_CTRL_ADD_ATTR_CERT
  28. //
  29. //  Add an attribute certificate to a signed-data message.
  30. //
  31. //  pvCtrlPara points to a CRYPT_DATA_BLOB containing the attribute
  32. //  certificate's encoded bytes.
  33. //--------------------------------------------------------------------------
  34. //+-------------------------------------------------------------------------
  35. //  CMSG_CTRL_DEL_ATTR_CERT
  36. //
  37. //  Delete an attribute certificate from a signed-data message.
  38. //
  39. //  pvCtrlPara points to a DWORD containing the 0-based index of the
  40. //  attribute certificate to be removed.
  41. //--------------------------------------------------------------------------
  42. //+-------------------------------------------------------------------------
  43. //  Verify a countersignature, at the SignerInfo level.
  44. //  ie. verify that pbSignerInfoCountersignature contains the encrypted
  45. //  hash of the encryptedDigest field of pbSignerInfo.
  46. //
  47. //  hCryptProv is used to hash the encryptedDigest field of pbSignerInfo.
  48. //  The only fields referenced from pciCountersigner are SerialNumber, Issuer,
  49. //  and SubjectPublicKeyInfo.
  50. //--------------------------------------------------------------------------
  51. BOOL
  52. WINAPI
  53. CryptMsgVerifyCountersignatureEncoded(
  54.     IN HCRYPTPROV   hCryptProv,
  55.     IN DWORD        dwEncodingType,
  56.     IN PBYTE        pbSignerInfo,
  57.     IN DWORD        cbSignerInfo,
  58.     IN PBYTE        pbSignerInfoCountersignature,
  59.     IN DWORD        cbSignerInfoCountersignature,
  60.     IN PCERT_INFO   pciCountersigner
  61.     );
  62. //+-------------------------------------------------------------------------
  63. //  Verify a countersignature, at the SignerInfo level.
  64. //  ie. verify that pbSignerInfoCountersignature contains the encrypted
  65. //  hash of the encryptedDigest field of pbSignerInfo.
  66. //
  67. //  hCryptProv is used to hash the encryptedDigest field of pbSignerInfo.
  68. //
  69. //  The signer can be a CERT_PUBLIC_KEY_INFO, certificate context or a
  70. //  chain context.
  71. //--------------------------------------------------------------------------
  72. BOOL
  73. WINAPI
  74. CryptMsgVerifyCountersignatureEncodedEx(
  75.     IN HCRYPTPROV   hCryptProv,
  76.     IN DWORD        dwEncodingType,
  77.     IN PBYTE        pbSignerInfo,
  78.     IN DWORD        cbSignerInfo,
  79.     IN PBYTE        pbSignerInfoCountersignature,
  80.     IN DWORD        cbSignerInfoCountersignature,
  81.     IN DWORD        dwSignerType,
  82.     IN void         *pvSigner,
  83.     IN DWORD        dwFlags,
  84.     IN OPTIONAL void *pvReserved
  85.     );
  86. // See CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA for dwSignerType definitions
  87. //+-------------------------------------------------------------------------
  88. //  Countersign an already-existing signature in a message
  89. //
  90. //  dwIndex is a zero-based index of the SignerInfo to be countersigned.
  91. //--------------------------------------------------------------------------
  92. BOOL
  93. WINAPI
  94. CryptMsgCountersign(
  95.     IN OUT HCRYPTMSG            hCryptMsg,
  96.     IN DWORD                    dwIndex,
  97.     IN DWORD                    cCountersigners,
  98.     IN PCMSG_SIGNER_ENCODE_INFO rgCountersigners
  99.     );
  100. //+-------------------------------------------------------------------------
  101. //  Countersign an already-existing signature (encoded SignerInfo).
  102. //  Output an encoded SignerInfo blob, suitable for use as a countersignature
  103. //  attribute in the unauthenticated attributes of a signed-data or
  104. //  signed-and-enveloped-data message.
  105. //--------------------------------------------------------------------------
  106. BOOL
  107. WINAPI
  108. CryptMsgCountersignEncoded(
  109.     IN DWORD                    dwEncodingType,
  110.     IN PBYTE                    pbSignerInfo,
  111.     IN DWORD                    cbSignerInfo,
  112.     IN DWORD                    cCountersigners,
  113.     IN PCMSG_SIGNER_ENCODE_INFO rgCountersigners,
  114.     OUT PBYTE                   pbCountersignature,
  115.     IN OUT PDWORD               pcbCountersignature
  116.     );
  117. //+-------------------------------------------------------------------------
  118. //  CryptMsg OID installable functions
  119. //--------------------------------------------------------------------------
  120. typedef void * (WINAPI *PFN_CMSG_ALLOC) (
  121.     IN size_t cb
  122.     );
  123. typedef void (WINAPI *PFN_CMSG_FREE)(
  124.     IN void *pv
  125.     );
  126. // Note, the following 3 installable functions are obsolete and have been
  127. // replaced with GenContentEncryptKey, ExportKeyTrans, ExportKeyAgree,
  128. // ExportMailList, ImportKeyTrans, ImportKeyAgree and ImportMailList
  129. // installable functions.
  130. // If *phCryptProv is NULL upon entry, then, if supported, the installable
  131. // function should acquire a default provider and return. Note, its up
  132. // to the installable function to release at process detach.
  133. //
  134. // If paiEncrypt->Parameters.cbData is 0, then, the callback may optionally
  135. // return default encoded parameters in *ppbEncryptParameters and
  136. // *pcbEncryptParameters. pfnAlloc must be called for the allocation.
  137. #define CMSG_OID_GEN_ENCRYPT_KEY_FUNC   "CryptMsgDllGenEncryptKey"
  138. typedef BOOL (WINAPI *PFN_CMSG_GEN_ENCRYPT_KEY) (
  139.     IN OUT HCRYPTPROV               *phCryptProv,
  140.     IN PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
  141.     IN PVOID                        pvEncryptAuxInfo,
  142.     IN PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
  143.     IN PFN_CMSG_ALLOC               pfnAlloc,
  144.     OUT HCRYPTKEY                   *phEncryptKey,
  145.     OUT PBYTE                       *ppbEncryptParameters,
  146.     OUT PDWORD                      pcbEncryptParameters
  147.     );
  148. #define CMSG_OID_EXPORT_ENCRYPT_KEY_FUNC   "CryptMsgDllExportEncryptKey"
  149. typedef BOOL (WINAPI *PFN_CMSG_EXPORT_ENCRYPT_KEY) (
  150.     IN HCRYPTPROV                   hCryptProv,
  151.     IN HCRYPTKEY                    hEncryptKey,
  152.     IN PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
  153.     OUT PBYTE                       pbData,
  154.     IN OUT PDWORD                   pcbData
  155.     );
  156. #define CMSG_OID_IMPORT_ENCRYPT_KEY_FUNC   "CryptMsgDllImportEncryptKey"
  157. typedef BOOL (WINAPI *PFN_CMSG_IMPORT_ENCRYPT_KEY) (
  158.     IN HCRYPTPROV                   hCryptProv,
  159.     IN DWORD                        dwKeySpec,
  160.     IN PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
  161.     IN PCRYPT_ALGORITHM_IDENTIFIER  paiPubKey,
  162.     IN PBYTE                        pbEncodedKey,
  163.     IN DWORD                        cbEncodedKey,
  164.     OUT HCRYPTKEY                   *phEncryptKey
  165.     );
  166. // To get the default installable function for GenContentEncryptKey,
  167. // ExportKeyTrans, ExportKeyAgree, ExportMailList, ImportKeyTrans,
  168. // ImportKeyAgree or ImportMailList call CryptGetOIDFunctionAddress()
  169. // with the pszOID argument set to the following constant. dwEncodingType
  170. // should be set to CRYPT_ASN_ENCODING or X509_ASN_ENCODING.
  171. #define CMSG_DEFAULT_INSTALLABLE_FUNC_OID   ((LPCSTR) 1)
  172. //+-------------------------------------------------------------------------
  173. //  Content Encrypt Info
  174. //
  175. //  The following data structure contains the information shared between
  176. //  the GenContentEncryptKey and the ExportKeyTrans, ExportKeyAgree and
  177. //  ExportMailList installable functions.
  178. //--------------------------------------------------------------------------
  179. typedef struct _CMSG_CONTENT_ENCRYPT_INFO {
  180.     DWORD                       cbSize;
  181.     HCRYPTPROV                  hCryptProv;
  182.     CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
  183.     void                        *pvEncryptionAuxInfo;
  184.     DWORD                       cRecipients;
  185.     PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
  186.     PFN_CMSG_ALLOC              pfnAlloc;
  187.     PFN_CMSG_FREE               pfnFree;
  188.     DWORD                       dwEncryptFlags;
  189.     HCRYPTKEY                   hContentEncryptKey;
  190.     DWORD                       dwFlags;
  191. } CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO;
  192. #define CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG   0x00000001
  193. #define CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG         0x00000001
  194. #define CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG   0x00008000
  195. //+-------------------------------------------------------------------------
  196. // Upon input, ContentEncryptInfo has been initialized from the
  197. // EnvelopedEncodeInfo.
  198. //
  199. // Note, if rgpRecipients instead of rgCmsRecipients are set in the
  200. // EnvelopedEncodeInfo, then, the rgpRecipients have been converted
  201. // to rgCmsRecipients in the ContentEncryptInfo.
  202. //
  203. // The following fields may be changed in ContentEncryptInfo:
  204. //      hContentEncryptKey
  205. //      hCryptProv
  206. //      ContentEncryptionAlgorithm.Parameters
  207. //      dwFlags
  208. //
  209. // All other fields in the ContentEncryptInfo are READONLY.
  210. //
  211. // If CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG is set upon entry
  212. // in dwEncryptFlags, then, any potentially variable length encoded
  213. // output should be padded with zeroes to always obtain the
  214. // same maximum encoded length. This is necessary for
  215. // CryptMsgCalculateEncodedLength() or CryptMsgOpenToEncode() with
  216. // definite length streaming.
  217. //
  218. // The hContentEncryptKey must be updated.
  219. //
  220. // If hCryptProv is NULL upon input, then, it must be updated.
  221. // If a HCRYPTPROV is acquired that must be released, then, the
  222. // CMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAG must be set in dwFlags.
  223. //
  224. // If ContentEncryptionAlgorithm.Parameters is updated, then, the
  225. // CMSG_CONTENT_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags. pfnAlloc and
  226. // pfnFree must be used for doing the allocation.
  227. //
  228. // ContentEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
  229. //--------------------------------------------------------------------------
  230. #define CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC  "CryptMsgDllGenContentEncryptKey"
  231. typedef BOOL (WINAPI *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) (
  232.     IN OUT PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
  233.     IN DWORD dwFlags,
  234.     IN OPTIONAL void *pvReserved
  235.     );
  236. //+-------------------------------------------------------------------------
  237. //  Key Transport Encrypt Info
  238. //
  239. //  The following data structure contains the information updated by the
  240. //  ExportKeyTrans installable function.
  241. //--------------------------------------------------------------------------
  242. typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO {
  243.     DWORD                       cbSize;
  244.     DWORD                       dwRecipientIndex;
  245.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  246.     CRYPT_DATA_BLOB             EncryptedKey;
  247.     DWORD                       dwFlags;
  248. } CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO;
  249. #define CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG       0x00000001
  250. //+-------------------------------------------------------------------------
  251. // Upon input, KeyTransEncryptInfo has been initialized from the
  252. // KeyTransEncodeInfo.
  253. //
  254. // The following fields may be changed in KeyTransEncryptInfo:
  255. //      EncryptedKey
  256. //      KeyEncryptionAlgorithm.Parameters
  257. //      dwFlags
  258. //
  259. // All other fields in the KeyTransEncryptInfo are READONLY.
  260. //
  261. // The EncryptedKey must be updated. The pfnAlloc and pfnFree specified in
  262. // ContentEncryptInfo must be used for doing the allocation.
  263. //
  264. // If the KeyEncryptionAlgorithm.Parameters is updated, then, the
  265. // CMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags.
  266. // The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used
  267. // for doing the allocation.
  268. //
  269. // KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
  270. //--------------------------------------------------------------------------
  271. #define CMSG_OID_EXPORT_KEY_TRANS_FUNC  "CryptMsgDllExportKeyTrans"
  272. typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_TRANS) (
  273.     IN PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
  274.     IN PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo,
  275.     IN OUT PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo,
  276.     IN DWORD dwFlags,
  277.     IN OPTIONAL void *pvReserved
  278.     );
  279. //+-------------------------------------------------------------------------
  280. //  Key Agree Key Encrypt Info
  281. //
  282. //  The following data structure contains the information updated by the
  283. //  ExportKeyAgree installable function for each encrypted key agree
  284. //  recipient.
  285. //--------------------------------------------------------------------------
  286. typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO {
  287.     DWORD                       cbSize;
  288.     CRYPT_DATA_BLOB             EncryptedKey;
  289. } CMSG_KEY_AGREE_KEY_ENCRYPT_INFO, *PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO;
  290. //+-------------------------------------------------------------------------
  291. //  Key Agree Encrypt Info
  292. //
  293. //  The following data structure contains the information applicable to
  294. //  all recipients. Its updated by the ExportKeyAgree installable function.
  295. //--------------------------------------------------------------------------
  296. typedef struct _CMSG_KEY_AGREE_ENCRYPT_INFO {
  297.     DWORD                       cbSize;
  298.     DWORD                       dwRecipientIndex;
  299.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  300.     CRYPT_DATA_BLOB             UserKeyingMaterial;
  301.     DWORD                       dwOriginatorChoice;
  302.     union {
  303.         // CMSG_KEY_AGREE_ORIGINATOR_CERT
  304.         CERT_ID                     OriginatorCertId;
  305.         // CMSG_KEY_AGREE_ORIGINATOR_PUBLIC_KEY
  306.         CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
  307.     };
  308.     DWORD                       cKeyAgreeKeyEncryptInfo;
  309.     PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo;
  310.     DWORD                       dwFlags;
  311. } CMSG_KEY_AGREE_ENCRYPT_INFO, *PCMSG_KEY_AGREE_ENCRYPT_INFO;
  312. #define CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG           0x00000001
  313. #define CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG       0x00000002
  314. #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_ALG_FLAG     0x00000004
  315. #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_PARA_FLAG    0x00000008
  316. #define CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_BITS_FLAG    0x00000010
  317. //+-------------------------------------------------------------------------
  318. // Upon input, KeyAgreeEncryptInfo has been initialized from the
  319. // KeyAgreeEncodeInfo.
  320. //
  321. // The following fields may be changed in KeyAgreeEncryptInfo:
  322. //      KeyEncryptionAlgorithm.Parameters
  323. //      UserKeyingMaterial
  324. //      dwOriginatorChoice
  325. //      OriginatorCertId
  326. //      OriginatorPublicKeyInfo
  327. //      dwFlags
  328. //
  329. // All other fields in the KeyAgreeEncryptInfo are READONLY.
  330. //
  331. // If the KeyEncryptionAlgorithm.Parameters is updated, then, the
  332. // CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags.
  333. // The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used
  334. // for doing the allocation.
  335. //
  336. // If the UserKeyingMaterial is updated, then, the
  337. // CMSG_KEY_AGREE_ENCRYPT_FREE_MATERIAL_FLAG must be set in dwFlags.
  338. // pfnAlloc and pfnFree must be used for doing the allocation.
  339. //
  340. // The dwOriginatorChoice must be updated to either
  341. // CMSG_KEY_AGREE_ORIGINATOR_CERT or CMSG_KEY_AGREE_ORIGINATOR_PUBLIC_KEY.
  342. //
  343. // If the OriginatorPublicKeyInfo is updated, then, the appropriate
  344. // CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_*_FLAG must be set in dwFlags and
  345. // pfnAlloc and pfnFree must be used for doing the allocation.
  346. //
  347. // If CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAG is set upon entry
  348. // in pContentEncryptInfo->dwEncryptFlags, then, the OriginatorPublicKeyInfo's
  349. // Ephemeral PublicKey should be padded with zeroes to always obtain the
  350. // same maximum encoded length. Note, the length of the generated ephemeral Y
  351. // public key can vary depending on the number of leading zero bits.
  352. //
  353. // Upon input, the array of *rgpKeyAgreeKeyEncryptInfo has been initialized.
  354. // The EncryptedKey must be updated for each recipient key.
  355. // The pfnAlloc and pfnFree specified in
  356. // ContentEncryptInfo must be used for doing the allocation.
  357. //
  358. // KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
  359. //--------------------------------------------------------------------------
  360. #define CMSG_OID_EXPORT_KEY_AGREE_FUNC  "CryptMsgDllExportKeyAgree"
  361. typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_AGREE) (
  362.     IN PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
  363.     IN PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo,
  364.     IN OUT PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo,
  365.     IN DWORD dwFlags,
  366.     IN OPTIONAL void *pvReserved
  367.     );
  368. //+-------------------------------------------------------------------------
  369. //  Mail List Encrypt Info
  370. //
  371. //  The following data structure contains the information updated by the
  372. //  ExportMailList installable function.
  373. //--------------------------------------------------------------------------
  374. typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO {
  375.     DWORD                       cbSize;
  376.     DWORD                       dwRecipientIndex;
  377.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  378.     CRYPT_DATA_BLOB             EncryptedKey;
  379.     DWORD                       dwFlags;
  380. } CMSG_MAIL_LIST_ENCRYPT_INFO, *PCMSG_MAIL_LIST_ENCRYPT_INFO;
  381. #define CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG       0x00000001
  382. //+-------------------------------------------------------------------------
  383. // Upon input, MailListEncryptInfo has been initialized from the
  384. // MailListEncodeInfo.
  385. //
  386. // The following fields may be changed in MailListEncryptInfo:
  387. //      EncryptedKey
  388. //      KeyEncryptionAlgorithm.Parameters
  389. //      dwFlags
  390. //
  391. // All other fields in the MailListEncryptInfo are READONLY.
  392. //
  393. // The EncryptedKey must be updated. The pfnAlloc and pfnFree specified in
  394. // ContentEncryptInfo must be used for doing the allocation.
  395. //
  396. // If the KeyEncryptionAlgorithm.Parameters is updated, then, the
  397. // CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG must be set in dwFlags.
  398. // The pfnAlloc and pfnFree specified in ContentEncryptInfo must be used
  399. // for doing the allocation.
  400. //
  401. // KeyEncryptionAlgorithm.pszObjId is used to get the OIDFunctionAddress.
  402. //--------------------------------------------------------------------------
  403. #define CMSG_OID_EXPORT_MAIL_LIST_FUNC  "CryptMsgDllExportMailList"
  404. typedef BOOL (WINAPI *PFN_CMSG_EXPORT_MAIL_LIST) (
  405.     IN PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
  406.     IN PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo,
  407.     IN OUT PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo,
  408.     IN DWORD dwFlags,
  409.     IN OPTIONAL void *pvReserved
  410.     );
  411. //+-------------------------------------------------------------------------
  412. // OID Installable functions for importing an encoded and encrypted content
  413. // encryption key.
  414. //
  415. // There's a different installable function for each CMS Recipient choice:
  416. //  ImportKeyTrans
  417. //  ImportKeyAgree
  418. //  ImportMailList
  419. //
  420. // Iterates through the following OIDs to get the OID installable function:
  421. //   KeyEncryptionOID!ContentEncryptionOID
  422. //   KeyEncryptionOID
  423. //   ContentEncryptionOID
  424. //
  425. // If the OID installable function doesn't support the specified
  426. // KeyEncryption and ContentEncryption OIDs, then, return FALSE with
  427. // LastError set to E_NOTIMPL.
  428. //--------------------------------------------------------------------------
  429. #define CMSG_OID_IMPORT_KEY_TRANS_FUNC   "CryptMsgDllImportKeyTrans"
  430. typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_TRANS) (
  431.     IN PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
  432.     IN PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara,
  433.     IN DWORD dwFlags,
  434.     IN OPTIONAL void *pvReserved,
  435.     OUT HCRYPTKEY *phContentEncryptKey
  436.     );
  437. #define CMSG_OID_IMPORT_KEY_AGREE_FUNC   "CryptMsgDllImportKeyAgree"
  438. typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_AGREE) (
  439.     IN PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
  440.     IN PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara,
  441.     IN DWORD dwFlags,
  442.     IN OPTIONAL void *pvReserved,
  443.     OUT HCRYPTKEY *phContentEncryptKey
  444.     );
  445. #define CMSG_OID_IMPORT_MAIL_LIST_FUNC   "CryptMsgDllImportMailList"
  446. typedef BOOL (WINAPI *PFN_CMSG_IMPORT_MAIL_LIST) (
  447.     IN PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
  448.     IN PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara,
  449.     IN DWORD dwFlags,
  450.     IN OPTIONAL void *pvReserved,
  451.     OUT HCRYPTKEY *phContentEncryptKey
  452.     );
  453. //+=========================================================================
  454. //  Certificate Store Data Structures and APIs
  455. //==========================================================================
  456. //+-------------------------------------------------------------------------
  457. //              In its most basic implementation, a cert store is simply a
  458. //              collection of certificates and/or CRLs. This is the case when
  459. //              a cert store is opened with all of its certificates and CRLs
  460. //              coming from a PKCS #7 encoded cryptographic message.
  461. //
  462. //              Nonetheless, all cert stores have the following properties:
  463. //               - A public key may have more than one certificate in the store.
  464. //                 For example, a private/public key used for signing may have a
  465. //                 certificate issued for VISA and another issued for
  466. //                 Mastercard. Also, when a certificate is renewed there might
  467. //                 be more than one certificate with the same subject and
  468. //                 issuer.
  469. //               - However, each certificate in the store is uniquely
  470. //                 identified by its Issuer and SerialNumber.
  471. //               - There's an issuer of subject certificate relationship. A
  472. //                 certificate's issuer is found by doing a match of
  473. //                 pSubjectCert->Issuer with pIssuerCert->Subject.
  474. //                 The relationship is verified by using
  475. //                 the issuer's public key to verify the subject certificate's
  476. //                 signature. Note, there might be X.509 v3 extensions
  477. //                 to assist in finding the issuer certificate.
  478. //               - Since issuer certificates might be renewed, a subject
  479. //                 certificate might have more than one issuer certificate.
  480. //               - There's an issuer of CRL relationship. An
  481. //                 issuer's CRL is found by doing a match of
  482. //                 pIssuerCert->Subject with pCrl->Issuer.
  483. //                 The relationship is verified by using
  484. //                 the issuer's public key to verify the CRL's
  485. //                 signature. Note, there might be X.509 v3 extensions
  486. //                 to assist in finding the CRL.
  487. //               - Since some issuers might support the X.509 v3 delta CRL
  488. //                 extensions, an issuer might have more than one CRL.
  489. //               - The store shouldn't have any redundant certificates or
  490. //                 CRLs. There shouldn't be two certificates with the same
  491. //                 Issuer and SerialNumber. There shouldn't be two CRLs with
  492. //                 the same Issuer, ThisUpdate and NextUpdate.
  493. //               - The store has NO policy or trust information. No
  494. //                 certificates are tagged as being "root". Its up to
  495. //                 the application to maintain a list of CertIds (Issuer +
  496. //                 SerialNumber) for certificates it trusts.
  497. //               - The store might contain bad certificates and/or CRLs.
  498. //                 The issuer's signature of a subject certificate or CRL may
  499. //                 not verify. Certificates or CRLs may not satisfy their
  500. //                 time validity requirements. Certificates may be
  501. //                 revoked.
  502. //
  503. //              In addition to the certificates and CRLs, properties can be
  504. //              stored. There are two predefined property IDs for a user
  505. //              certificate: CERT_KEY_PROV_HANDLE_PROP_ID and
  506. //              CERT_KEY_PROV_INFO_PROP_ID. The CERT_KEY_PROV_HANDLE_PROP_ID
  507. //              is a HCRYPTPROV handle to the private key assoicated
  508. //              with the certificate. The CERT_KEY_PROV_INFO_PROP_ID contains
  509. //              information to be used to call
  510. //              CryptAcquireContext and CryptSetProvParam to get a handle
  511. //              to the private key associated with the certificate.
  512. //
  513. //              There exists two more predefined property IDs for certificates
  514. //              and CRLs, CERT_SHA1_HASH_PROP_ID and CERT_MD5_HASH_PROP_ID.
  515. //              If these properties don't already exist, then, a hash of the
  516. //              content is computed. (CERT_HASH_PROP_ID maps to the default
  517. //              hash algorithm, currently, CERT_SHA1_HASH_PROP_ID).
  518. //
  519. //              There are additional APIs for creating certificate and CRL
  520. //      contexts not in a store (CertCreateCertificateContext and
  521. //      CertCreateCRLContext).
  522. //
  523. //--------------------------------------------------------------------------
  524. typedef void *HCERTSTORE;
  525. //+-------------------------------------------------------------------------
  526. //  Certificate context.
  527. //
  528. //  A certificate context contains both the encoded and decoded representation
  529. //  of a certificate. A certificate context returned by a cert store function
  530. //  must be freed by calling the CertFreeCertificateContext function. The
  531. //  CertDuplicateCertificateContext function can be called to make a duplicate
  532. //  copy (which also must be freed by calling CertFreeCertificateContext).
  533. //--------------------------------------------------------------------------
  534. typedef struct _CERT_CONTEXT {
  535.     DWORD                   dwCertEncodingType;
  536.     BYTE                    *pbCertEncoded;
  537.     DWORD                   cbCertEncoded;
  538.     PCERT_INFO              pCertInfo;
  539.     HCERTSTORE              hCertStore;
  540. } CERT_CONTEXT, *PCERT_CONTEXT;
  541. typedef const CERT_CONTEXT *PCCERT_CONTEXT;
  542. //+-------------------------------------------------------------------------
  543. //  CRL context.
  544. //
  545. //  A CRL context contains both the encoded and decoded representation
  546. //  of a CRL. A CRL context returned by a cert store function
  547. //  must be freed by calling the CertFreeCRLContext function. The
  548. //  CertDuplicateCRLContext function can be called to make a duplicate
  549. //  copy (which also must be freed by calling CertFreeCRLContext).
  550. //--------------------------------------------------------------------------
  551. typedef struct _CRL_CONTEXT {
  552.     DWORD                   dwCertEncodingType;
  553.     BYTE                    *pbCrlEncoded;
  554.     DWORD                   cbCrlEncoded;
  555.     PCRL_INFO               pCrlInfo;
  556.     HCERTSTORE              hCertStore;
  557. } CRL_CONTEXT, *PCRL_CONTEXT;
  558. typedef const CRL_CONTEXT *PCCRL_CONTEXT;
  559. //+-------------------------------------------------------------------------
  560. //  Certificate Trust List (CTL) context.
  561. //
  562. //  A CTL context contains both the encoded and decoded representation
  563. //  of a CTL. Also contains an opened HCRYPTMSG handle to the decoded
  564. //  cryptographic signed message containing the CTL_INFO as its inner content.
  565. //  pbCtlContent is the encoded inner content of the signed message.
  566. //
  567. //  The CryptMsg APIs can be used to extract additional signer information.
  568. //--------------------------------------------------------------------------
  569. typedef struct _CTL_CONTEXT {
  570.     DWORD                   dwMsgAndCertEncodingType;
  571.     BYTE                    *pbCtlEncoded;
  572.     DWORD                   cbCtlEncoded;
  573.     PCTL_INFO               pCtlInfo;
  574.     HCERTSTORE              hCertStore;
  575.     HCRYPTMSG               hCryptMsg;
  576.     BYTE                    *pbCtlContent;
  577.     DWORD                   cbCtlContent;
  578. } CTL_CONTEXT, *PCTL_CONTEXT;
  579. typedef const CTL_CONTEXT *PCCTL_CONTEXT;
  580. //+-------------------------------------------------------------------------
  581. //  Certificate, CRL and CTL property IDs
  582. //
  583. //  See CertSetCertificateContextProperty or CertGetCertificateContextProperty
  584. //  for usage information.
  585. //--------------------------------------------------------------------------
  586. #define CERT_KEY_PROV_HANDLE_PROP_ID        1
  587. #define CERT_KEY_PROV_INFO_PROP_ID          2
  588. #define CERT_SHA1_HASH_PROP_ID              3
  589. #define CERT_MD5_HASH_PROP_ID               4
  590. #define CERT_HASH_PROP_ID                   CERT_SHA1_HASH_PROP_ID
  591. #define CERT_KEY_CONTEXT_PROP_ID            5
  592. #define CERT_KEY_SPEC_PROP_ID               6
  593. #define CERT_IE30_RESERVED_PROP_ID          7
  594. #define CERT_PUBKEY_HASH_RESERVED_PROP_ID   8
  595. #define CERT_ENHKEY_USAGE_PROP_ID           9
  596. #define CERT_CTL_USAGE_PROP_ID              CERT_ENHKEY_USAGE_PROP_ID
  597. #define CERT_NEXT_UPDATE_LOCATION_PROP_ID   10
  598. #define CERT_FRIENDLY_NAME_PROP_ID          11
  599. #define CERT_PVK_FILE_PROP_ID               12
  600. #define CERT_DESCRIPTION_PROP_ID            13
  601. #define CERT_ACCESS_STATE_PROP_ID           14
  602. #define CERT_SIGNATURE_HASH_PROP_ID         15
  603. #define CERT_SMART_CARD_DATA_PROP_ID        16
  604. #define CERT_EFS_PROP_ID                    17
  605. #define CERT_FORTEZZA_DATA_PROP_ID          18
  606. #define CERT_ARCHIVED_PROP_ID               19
  607. #define CERT_KEY_IDENTIFIER_PROP_ID         20
  608. #define CERT_AUTO_ENROLL_PROP_ID            21
  609. #define CERT_PUBKEY_ALG_PARA_PROP_ID        22
  610. #define CERT_CROSS_CERT_DIST_POINTS_PROP_ID 23
  611. #define CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID     24
  612. #define CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID    25
  613. #define CERT_ENROLLMENT_PROP_ID             26
  614. #define CERT_DATE_STAMP_PROP_ID             27
  615. #define CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID  28
  616. #define CERT_SUBJECT_NAME_MD5_HASH_PROP_ID  29
  617. #define CERT_EXTENDED_ERROR_INFO_PROP_ID    30
  618. // Note, 32 - 35 are reserved for the CERT, CRL, CTL and KeyId file element IDs.
  619. //       36 - 63 are reserved for future element IDs.
  620. #define CERT_RENEWAL_PROP_ID                64
  621. #define CERT_ARCHIVED_KEY_HASH_PROP_ID      65
  622. #define CERT_FIRST_RESERVED_PROP_ID         66
  623. #define CERT_LAST_RESERVED_PROP_ID          0x00007FFF
  624. #define CERT_FIRST_USER_PROP_ID             0x00008000
  625. #define CERT_LAST_USER_PROP_ID              0x0000FFFF
  626. #define IS_CERT_HASH_PROP_ID(X)     (CERT_SHA1_HASH_PROP_ID == (X) || 
  627.                                         CERT_MD5_HASH_PROP_ID == (X) || 
  628.                                         CERT_SIGNATURE_HASH_PROP_ID == (X))
  629. #define IS_PUBKEY_HASH_PROP_ID(X)     (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || 
  630.                                         CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X))
  631. #define IS_CHAIN_HASH_PROP_ID(X)     (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || 
  632.                                         CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID == (X) || 
  633.                                         CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID == (X) || 
  634.                                         CERT_SUBJECT_NAME_MD5_HASH_PROP_ID == (X))
  635. //+-------------------------------------------------------------------------
  636. //  Property OIDs
  637. //--------------------------------------------------------------------------
  638. // The OID component following the prefix contains the PROP_ID (decimal)
  639. #define szOID_CERT_PROP_ID_PREFIX           "1.3.6.1.4.1.311.10.11."
  640. #define szOID_CERT_KEY_IDENTIFIER_PROP_ID   "1.3.6.1.4.1.311.10.11.20"
  641. #define szOID_CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID 
  642.                                             "1.3.6.1.4.1.311.10.11.28"
  643. #define szOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID 
  644.                                             "1.3.6.1.4.1.311.10.11.29"
  645. //+-------------------------------------------------------------------------
  646. //  Access State flags returned by CERT_ACCESS_STATE_PROP_ID. Note,
  647. //  CERT_ACCESS_PROP_ID is read only.
  648. //--------------------------------------------------------------------------
  649. // Set if context property writes are persisted. For instance, not set for
  650. // memory store contexts. Set for registry based stores opened as read or write.
  651. // Not set for registry based stores opened as read only.
  652. #define CERT_ACCESS_STATE_WRITE_PERSIST_FLAG    0x1
  653. // Set if context resides in a SYSTEM or SYSTEM_REGISTRY store.
  654. #define CERT_ACCESS_STATE_SYSTEM_STORE_FLAG     0x2
  655. //+-------------------------------------------------------------------------
  656. //  Cryptographic Key Provider Information
  657. //
  658. //  CRYPT_KEY_PROV_INFO defines the CERT_KEY_PROV_INFO_PROP_ID's pvData.
  659. //
  660. //  The CRYPT_KEY_PROV_INFO fields are passed to CryptAcquireContext
  661. //  to get a HCRYPTPROV handle. The optional CRYPT_KEY_PROV_PARAM fields are
  662. //  passed to CryptSetProvParam to further initialize the provider.
  663. //
  664. //  The dwKeySpec field identifies the private key to use from the container
  665. //  For example, AT_KEYEXCHANGE or AT_SIGNATURE.
  666. //--------------------------------------------------------------------------
  667. typedef struct _CRYPT_KEY_PROV_PARAM {
  668.     DWORD           dwParam;
  669.     BYTE            *pbData;
  670.     DWORD           cbData;
  671.     DWORD           dwFlags;
  672. } CRYPT_KEY_PROV_PARAM, *PCRYPT_KEY_PROV_PARAM;
  673. typedef struct _CRYPT_KEY_PROV_INFO {
  674.     LPWSTR                  pwszContainerName;
  675.     LPWSTR                  pwszProvName;
  676.     DWORD                   dwProvType;
  677.     DWORD                   dwFlags;
  678.     DWORD                   cProvParam;
  679.     PCRYPT_KEY_PROV_PARAM   rgProvParam;
  680.     DWORD                   dwKeySpec;
  681. } CRYPT_KEY_PROV_INFO, *PCRYPT_KEY_PROV_INFO;
  682. //+-------------------------------------------------------------------------
  683. //  The following flag should be set in the above dwFlags to enable
  684. //  a CertSetCertificateContextProperty(CERT_KEY_CONTEXT_PROP_ID) after a
  685. //  CryptAcquireContext is done in the Sign or Decrypt Message functions.
  686. //
  687. //  The following define must not collide with any of the
  688. //  CryptAcquireContext dwFlag defines.
  689. //--------------------------------------------------------------------------
  690. #define CERT_SET_KEY_PROV_HANDLE_PROP_ID    0x00000001
  691. #define CERT_SET_KEY_CONTEXT_PROP_ID        0x00000001
  692. //+-------------------------------------------------------------------------
  693. //  Certificate Key Context
  694. //
  695. //  CERT_KEY_CONTEXT defines the CERT_KEY_CONTEXT_PROP_ID's pvData.
  696. //--------------------------------------------------------------------------
  697. typedef struct _CERT_KEY_CONTEXT {
  698.     DWORD           cbSize;           // sizeof(CERT_KEY_CONTEXT)
  699.     HCRYPTPROV      hCryptProv;
  700.     DWORD           dwKeySpec;
  701. } CERT_KEY_CONTEXT, *PCERT_KEY_CONTEXT;
  702. //+-------------------------------------------------------------------------
  703. //  Certificate Store Provider Types
  704. //--------------------------------------------------------------------------
  705. #define CERT_STORE_PROV_MSG                 ((LPCSTR) 1)
  706. #define CERT_STORE_PROV_MEMORY              ((LPCSTR) 2)
  707. #define CERT_STORE_PROV_FILE                ((LPCSTR) 3)
  708. #define CERT_STORE_PROV_REG                 ((LPCSTR) 4)
  709. #define CERT_STORE_PROV_PKCS7               ((LPCSTR) 5)
  710. #define CERT_STORE_PROV_SERIALIZED          ((LPCSTR) 6)
  711. #define CERT_STORE_PROV_FILENAME_A          ((LPCSTR) 7)
  712. #define CERT_STORE_PROV_FILENAME_W          ((LPCSTR) 8)
  713. #define CERT_STORE_PROV_FILENAME            CERT_STORE_PROV_FILENAME_W
  714. #define CERT_STORE_PROV_SYSTEM_A            ((LPCSTR) 9)
  715. #define CERT_STORE_PROV_SYSTEM_W            ((LPCSTR) 10)
  716. #define CERT_STORE_PROV_SYSTEM              CERT_STORE_PROV_SYSTEM_W
  717. #define CERT_STORE_PROV_COLLECTION          ((LPCSTR) 11)
  718. #define CERT_STORE_PROV_SYSTEM_REGISTRY_A   ((LPCSTR) 12)
  719. #define CERT_STORE_PROV_SYSTEM_REGISTRY_W   ((LPCSTR) 13)
  720. #define CERT_STORE_PROV_SYSTEM_REGISTRY     CERT_STORE_PROV_SYSTEM_REGISTRY_W
  721. #define CERT_STORE_PROV_PHYSICAL_W          ((LPCSTR) 14)
  722. #define CERT_STORE_PROV_PHYSICAL            CERT_STORE_PROV_PHYSICAL_W
  723. #define CERT_STORE_PROV_SMART_CARD_W        ((LPCSTR) 15)
  724. #define CERT_STORE_PROV_SMART_CARD          CERT_STORE_PROV_SMART_CARD_W
  725. #define CERT_STORE_PROV_LDAP_W              ((LPCSTR) 16)
  726. #define CERT_STORE_PROV_LDAP                CERT_STORE_PROV_LDAP_W
  727. #define sz_CERT_STORE_PROV_MEMORY           "Memory"
  728. #define sz_CERT_STORE_PROV_FILENAME_W       "File"
  729. #define sz_CERT_STORE_PROV_FILENAME         sz_CERT_STORE_PROV_FILENAME_W
  730. #define sz_CERT_STORE_PROV_SYSTEM_W         "System"
  731. #define sz_CERT_STORE_PROV_SYSTEM           sz_CERT_STORE_PROV_SYSTEM_W
  732. #define sz_CERT_STORE_PROV_PKCS7            "PKCS7"
  733. #define sz_CERT_STORE_PROV_SERIALIZED       "Serialized"
  734. #define sz_CERT_STORE_PROV_COLLECTION       "Collection"
  735. #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W "SystemRegistry"
  736. #define sz_CERT_STORE_PROV_SYSTEM_REGISTRY  sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W
  737. #define sz_CERT_STORE_PROV_PHYSICAL_W       "Physical"
  738. #define sz_CERT_STORE_PROV_PHYSICAL         sz_CERT_STORE_PROV_PHYSICAL_W
  739. #define sz_CERT_STORE_PROV_SMART_CARD_W     "SmartCard"
  740. #define sz_CERT_STORE_PROV_SMART_CARD       sz_CERT_STORE_PROV_SMART_CARD_W
  741. #define sz_CERT_STORE_PROV_LDAP_W           "Ldap"
  742. #define sz_CERT_STORE_PROV_LDAP             sz_CERT_STORE_PROV_LDAP_W
  743. //+-------------------------------------------------------------------------
  744. //  Certificate Store verify/results flags
  745. //--------------------------------------------------------------------------
  746. #define CERT_STORE_SIGNATURE_FLAG           0x00000001
  747. #define CERT_STORE_TIME_VALIDITY_FLAG       0x00000002
  748. #define CERT_STORE_REVOCATION_FLAG          0x00000004
  749. #define CERT_STORE_NO_CRL_FLAG              0x00010000
  750. #define CERT_STORE_NO_ISSUER_FLAG           0x00020000
  751. #define CERT_STORE_BASE_CRL_FLAG            0x00000100
  752. #define CERT_STORE_DELTA_CRL_FLAG           0x00000200
  753. //+-------------------------------------------------------------------------
  754. //  Certificate Store open/property flags
  755. //--------------------------------------------------------------------------
  756. #define CERT_STORE_NO_CRYPT_RELEASE_FLAG                0x00000001
  757. #define CERT_STORE_SET_LOCALIZED_NAME_FLAG              0x00000002
  758. #define CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG     0x00000004
  759. #define CERT_STORE_DELETE_FLAG                          0x00000010
  760. #define CERT_STORE_SHARE_STORE_FLAG                     0x00000040
  761. #define CERT_STORE_SHARE_CONTEXT_FLAG                   0x00000080
  762. #define CERT_STORE_MANIFOLD_FLAG                        0x00000100
  763. #define CERT_STORE_ENUM_ARCHIVED_FLAG                   0x00000200
  764. #define CERT_STORE_UPDATE_KEYID_FLAG                    0x00000400
  765. #define CERT_STORE_BACKUP_RESTORE_FLAG                  0x00000800
  766. #define CERT_STORE_READONLY_FLAG                        0x00008000
  767. #define CERT_STORE_OPEN_EXISTING_FLAG                   0x00004000
  768. #define CERT_STORE_CREATE_NEW_FLAG                      0x00002000
  769. #define CERT_STORE_MAXIMUM_ALLOWED_FLAG                 0x00001000
  770. //+-------------------------------------------------------------------------
  771. //  Certificate Store Provider flags are in the HiWord (0xFFFF0000)
  772. //--------------------------------------------------------------------------
  773. //+-------------------------------------------------------------------------
  774. //  Certificate System Store Flag Values
  775. //--------------------------------------------------------------------------
  776. // Includes flags and location
  777. #define CERT_SYSTEM_STORE_MASK                  0xFFFF0000
  778. // Set if pvPara points to a CERT_SYSTEM_STORE_RELOCATE_PARA structure
  779. #define CERT_SYSTEM_STORE_RELOCATE_FLAG         0x80000000
  780. typedef struct _CERT_SYSTEM_STORE_RELOCATE_PARA {
  781.     union {
  782.         HKEY                hKeyBase;
  783.         void                *pvBase;
  784.     };
  785.     union {
  786.         void                *pvSystemStore;
  787.         LPCSTR              pszSystemStore;
  788.         LPCWSTR             pwszSystemStore;
  789.     };
  790. } CERT_SYSTEM_STORE_RELOCATE_PARA, *PCERT_SYSTEM_STORE_RELOCATE_PARA;
  791. // By default, when the CurrentUser "Root" store is opened, any SystemRegistry
  792. // roots not also on the protected root list are deleted from the cache before
  793. // CertOpenStore() returns. Set the following flag to return all the roots
  794. // in the SystemRegistry without checking the protected root list.
  795. #define CERT_SYSTEM_STORE_UNPROTECTED_FLAG      0x40000000
  796. // Location of the system store:
  797. #define CERT_SYSTEM_STORE_LOCATION_MASK         0x00FF0000
  798. #define CERT_SYSTEM_STORE_LOCATION_SHIFT        16
  799. //  Registry: HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE
  800. #define CERT_SYSTEM_STORE_CURRENT_USER_ID       1
  801. #define CERT_SYSTEM_STORE_LOCAL_MACHINE_ID      2
  802. //  Registry: HKEY_LOCAL_MACHINESoftwareMicrosoftCryptographyServices
  803. #define CERT_SYSTEM_STORE_CURRENT_SERVICE_ID    4
  804. #define CERT_SYSTEM_STORE_SERVICES_ID           5
  805. //  Registry: HKEY_USERS
  806. #define CERT_SYSTEM_STORE_USERS_ID              6
  807. //  Registry: HKEY_CURRENT_USERSoftwarePoliciesMicrosoftSystemCertificates
  808. #define CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID    7
  809. //  Registry: HKEY_LOCAL_MACHINESoftwarePoliciesMicrosoftSystemCertificates
  810. #define CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID   8
  811. //  Registry: HKEY_LOCAL_MACHINESoftwareMicrosoftEnterpriseCertificates
  812. #define CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE_ID     9
  813. #define CERT_SYSTEM_STORE_CURRENT_USER          
  814.     (CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)
  815. #define CERT_SYSTEM_STORE_LOCAL_MACHINE         
  816.     (CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)
  817. #define CERT_SYSTEM_STORE_CURRENT_SERVICE       
  818.     (CERT_SYSTEM_STORE_CURRENT_SERVICE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)
  819. #define CERT_SYSTEM_STORE_SERVICES              
  820.     (CERT_SYSTEM_STORE_SERVICES_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)
  821. #define CERT_SYSTEM_STORE_USERS                 
  822.     (CERT_SYSTEM_STORE_USERS_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)
  823. #define CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY   
  824.     (CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID << 
  825.         CERT_SYSTEM_STORE_LOCATION_SHIFT)
  826. #define CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY  
  827.     (CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID << 
  828.         CERT_SYSTEM_STORE_LOCATION_SHIFT)
  829. #define CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE  
  830.     (CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE_ID << 
  831.         CERT_SYSTEM_STORE_LOCATION_SHIFT)
  832. //+-------------------------------------------------------------------------
  833. //  Group Policy Store Defines
  834. //--------------------------------------------------------------------------
  835. // Registry path to the Group Policy system stores
  836. #define CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH 
  837.     L"Software\Policies\Microsoft\SystemCertificates"
  838. //+-------------------------------------------------------------------------
  839. //  EFS Defines
  840. //--------------------------------------------------------------------------
  841. // Registry path to the EFS EFSBlob SubKey - Value type is REG_BINARY
  842. #define CERT_EFSBLOB_REGPATH    
  843.     CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\EFS"
  844. #define CERT_EFSBLOB_VALUE_NAME L"EFSBlob"
  845. //+-------------------------------------------------------------------------
  846. //  Protected Root Defines
  847. //--------------------------------------------------------------------------
  848. // Registry path to the Protected Roots Flags SubKey
  849. #define CERT_PROT_ROOT_FLAGS_REGPATH    
  850.     CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\Root\ProtectedRoots"
  851. #define CERT_PROT_ROOT_FLAGS_VALUE_NAME L"Flags"
  852. // Set the following flag to inhibit the opening of the CurrentUser's
  853. // .Default physical store when opening the CurrentUser's "Root" system store.
  854. // The .Default physical store open's the CurrentUser SystemRegistry "Root"
  855. // store.
  856. #define CERT_PROT_ROOT_DISABLE_CURRENT_USER_FLAG    0x1
  857. // Set the following flag to inhibit the adding of roots from the
  858. // CurrentUser SystemRegistry "Root" store to the protected root list
  859. // when the "Root" store is initially protected.
  860. #define CERT_PROT_ROOT_INHIBIT_ADD_AT_INIT_FLAG     0x2
  861. // Set the following flag to inhibit the purging of protected roots from the
  862. // CurrentUser SystemRegistry "Root" store that are
  863. // also in the LocalMachine SystemRegistry "Root" store. Note, when not
  864. // disabled, the purging is done silently without UI.
  865. #define CERT_PROT_ROOT_INHIBIT_PURGE_LM_FLAG        0x4
  866. // Set the following flag to inhibit the opening of the LocalMachine's
  867. // .AuthRoot physical store when opening the LocalMachine's "Root" system store.
  868. // The .AuthRoot physical store open's the LocalMachine SystemRegistry
  869. // "AuthRoot" store. The "AuthRoot" store contains the pre-installed
  870. // SSL ServerAuth and the ActiveX Authenticode "root" certificates.
  871. #define CERT_PROT_ROOT_DISABLE_LM_AUTH_FLAG         0x8
  872. // The semantics for the following legacy definition has been changed to be
  873. // the same as for the CERT_PROT_ROOT_DISABLE_LM_AUTH_FLAG.
  874. #define CERT_PROT_ROOT_ONLY_LM_GPT_FLAG             0x8
  875. // Set the following flag to disable the requiring of the issuing CA
  876. // certificate being in the "NTAuth" system registry store found in the
  877. // CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE store location.
  878. //
  879. // When set, CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_NT_AUTH)
  880. // will check that the chain has a valid name constraint for all name
  881. // spaces, including UPN if the issuing CA isn't in the "NTAuth" store.
  882. #define CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG 0x10
  883. //+-------------------------------------------------------------------------
  884. //  Trusted Publisher Definitions
  885. //--------------------------------------------------------------------------
  886. // Registry path to the trusted publisher "Safer" group policy subkey
  887. #define CERT_TRUST_PUB_SAFER_GROUP_POLICY_REGPATH    
  888.     CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\TrustedPublisher\Safer"
  889. // Registry path to the Local Machine system stores
  890. #define CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH 
  891.     L"Software\Microsoft\SystemCertificates"
  892. // Registry path to the trusted publisher "Safer" local machine subkey
  893. #define CERT_TRUST_PUB_SAFER_LOCAL_MACHINE_REGPATH    
  894.     CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH L"\TrustedPublisher\Safer"
  895. // "Safer" subkey value names. All values are DWORDs.
  896. #define CERT_TRUST_PUB_AUTHENTICODE_FLAGS_VALUE_NAME    L"AuthenticodeFlags"
  897. // AuthenticodeFlags definitions
  898. // Definition of who is allowed to trust publishers
  899. //
  900. // Setting allowed trust to MACHINE_ADMIN or ENTERPRISE_ADMIN disables UI,
  901. // only trusts publishers in the "TrustedPublisher" system store and
  902. // inhibits the opening of the CurrentUser's .Default physical store when
  903. // opening the CurrentUsers's "TrustedPublisher" system store.
  904. //
  905. // The .Default physical store open's the CurrentUser SystemRegistry
  906. // "TrustedPublisher" store.
  907. //
  908. // Setting allowed trust to ENTERPRISE_ADMIN only opens the
  909. // LocalMachine's .GroupPolicy and .Enterprise physical stores when opening
  910. // the CurrentUser's "TrustedPublisher" system store or when opening the
  911. // LocalMachine's "TrustedPublisher" system store.
  912. #define CERT_TRUST_PUB_ALLOW_TRUST_MASK                 0x00000003
  913. #define CERT_TRUST_PUB_ALLOW_END_USER_TRUST             0x00000000
  914. #define CERT_TRUST_PUB_ALLOW_MACHINE_ADMIN_TRUST        0x00000001
  915. #define CERT_TRUST_PUB_ALLOW_ENTERPRISE_ADMIN_TRUST     0x00000002
  916. // Set the following flag to enable revocation checking of the publisher
  917. // chain.
  918. #define CERT_TRUST_PUB_CHECK_PUBLISHER_REV_FLAG         0x00000100
  919. // Set the following flag to enable revocation checking of the time stamp
  920. // chain.
  921. #define CERT_TRUST_PUB_CHECK_TIMESTAMP_REV_FLAG         0x00000200
  922. //+-------------------------------------------------------------------------
  923. //  OCM Subcomponents Definitions
  924. //--------------------------------------------------------------------------
  925. // Registry path to the OCM Subcomponents local machine subkey
  926. #define CERT_OCM_SUBCOMPONENTS_LOCAL_MACHINE_REGPATH        
  927.     L"SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OC Manager\Subcomponents"
  928. // REG_DWORD, 1 is installed, 0 is NOT installed
  929. #define CERT_OCM_SUBCOMPONENTS_ROOT_AUTO_UPDATE_VALUE_NAME  L"RootAutoUpdate"
  930.     
  931. //+-------------------------------------------------------------------------
  932. //  AuthRoot Auto Update Definitions
  933. //--------------------------------------------------------------------------
  934. // Registry path to the AuthRoot "Auto Update" local machine subkey
  935. #define CERT_AUTH_ROOT_AUTO_UPDATE_LOCAL_MACHINE_REGPATH    
  936.     CERT_LOCAL_MACHINE_SYSTEM_STORE_REGPATH L"\AuthRoot\AutoUpdate"
  937. // AuthRoot Auto Update subkey value names.
  938. // REG_SZ, URL to the directory containing the AuthRoots, CTL and Seq files
  939. #define CERT_AUTH_ROOT_AUTO_UPDATE_ROOT_DIR_URL_VALUE_NAME      L"RootDirUrl"
  940. // REG_DWORD, seconds between syncs. 0 implies use default.
  941. #define CERT_AUTH_ROOT_AUTO_UPDATE_SYNC_DELTA_TIME_VALUE_NAME   L"SyncDeltaTime"
  942. // REG_DWORD, misc flags
  943. #define CERT_AUTH_ROOT_AUTO_UPDATE_FLAGS_VALUE_NAME             L"Flags"
  944. #define CERT_AUTH_ROOT_AUTO_UPDATE_DISABLE_UNTRUSTED_ROOT_LOGGING_FLAG  0x1
  945. #define CERT_AUTH_ROOT_AUTO_UPDATE_DISABLE_PARTIAL_CHAIN_LOGGING_FLAG   0x2
  946. // AuthRoot Auto Update filenames
  947. // CTL containing the list of certs in the AuthRoot store
  948. #define CERT_AUTH_ROOT_CTL_FILENAME                             L"authroot.stl"
  949. #define CERT_AUTH_ROOT_CTL_FILENAME_A                           "authroot.stl"
  950. // Cab containing the above CTL
  951. #define CERT_AUTH_ROOT_CAB_FILENAME                             L"authrootstl.cab"
  952. // SequenceNumber (Formatted as big endian ascii hex)
  953. #define CERT_AUTH_ROOT_SEQ_FILENAME                             L"authrootseq.txt"
  954. // Root certs extension
  955. #define CERT_AUTH_ROOT_CERT_EXT                                 L".crt"
  956. //+-------------------------------------------------------------------------
  957. //  Certificate Registry Store Flag Values (CERT_STORE_REG)
  958. //--------------------------------------------------------------------------
  959. // Set this flag if the HKEY passed in pvPara points to a remote computer
  960. // registry key.
  961. #define CERT_REGISTRY_STORE_REMOTE_FLAG         0x10000
  962. // Set this flag if the contexts are to be persisted as a single serialized
  963. // store in the registry. Mainly used for stores downloaded from the GPT.
  964. // Such as the CurrentUserGroupPolicy or LocalMachineGroupPolicy stores.
  965. #define CERT_REGISTRY_STORE_SERIALIZED_FLAG     0x20000
  966. // The following flags are for internal use. When set, the
  967. // pvPara parameter passed to CertOpenStore is a pointer to the following
  968. // data structure and not the HKEY. The above CERT_REGISTRY_STORE_REMOTE_FLAG
  969. // is also set if hKeyBase was obtained via RegConnectRegistry().
  970. #define CERT_REGISTRY_STORE_CLIENT_GPT_FLAG     0x80000000
  971. #define CERT_REGISTRY_STORE_LM_GPT_FLAG         0x01000000
  972. typedef struct _CERT_REGISTRY_STORE_CLIENT_GPT_PARA {
  973.     HKEY                hKeyBase;
  974.     LPWSTR              pwszRegPath;
  975. } CERT_REGISTRY_STORE_CLIENT_GPT_PARA, *PCERT_REGISTRY_STORE_CLIENT_GPT_PARA;
  976. // The following flag is for internal use. When set, the contexts are
  977. // persisted into roaming files instead of the registry. Such as, the
  978. // CurrentUser "My" store. When this flag is set, the following data structure
  979. // is passed to CertOpenStore instead of HKEY.
  980. #define CERT_REGISTRY_STORE_ROAMING_FLAG        0x40000
  981. // hKey may be NULL or non-NULL. When non-NULL, existing contexts are
  982. // moved from the registry to roaming files.
  983. typedef struct _CERT_REGISTRY_STORE_ROAMING_PARA {
  984.     HKEY                hKey;
  985.     LPWSTR              pwszStoreDirectory;
  986. } CERT_REGISTRY_STORE_ROAMING_PARA, *PCERT_REGISTRY_STORE_ROAMING_PARA;
  987. // The following flag is for internal use. When set, the "My" DWORD value
  988. // at HKLMSoftwareMicrosoftCryptographyIEDirtyFlags is set to 0x1
  989. // whenever a certificate is added to the registry store.
  990. #define CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG    0x80000
  991. // Registry path to the subkey containing the "My" DWORD value to be set
  992. #define CERT_IE_DIRTY_FLAGS_REGPATH 
  993.     L"Software\Microsoft\Cryptography\IEDirtyFlags"
  994. //+-------------------------------------------------------------------------
  995. //  Certificate File Store Flag Values for the providers:
  996. //      CERT_STORE_PROV_FILE
  997. //      CERT_STORE_PROV_FILENAME
  998. //      CERT_STORE_PROV_FILENAME_A
  999. //      CERT_STORE_PROV_FILENAME_W
  1000. //      sz_CERT_STORE_PROV_FILENAME_W
  1001. //--------------------------------------------------------------------------
  1002. // Set this flag if any store changes are to be committed to the file.
  1003. // The changes are committed at CertCloseStore or by calling
  1004. // CertControlStore(CERT_STORE_CTRL_COMMIT).
  1005. //
  1006. // The open fails with E_INVALIDARG if both CERT_FILE_STORE_COMMIT_ENABLE_FLAG
  1007. // and CERT_STORE_READONLY_FLAG are set in dwFlags.
  1008. //
  1009. // For the FILENAME providers:  if the file contains an X509 encoded
  1010. // certificate, the open fails with ERROR_ACCESS_DENIED.
  1011. //
  1012. // For the FILENAME providers: if CERT_STORE_CREATE_NEW_FLAG is set, the
  1013. // CreateFile uses CREATE_NEW. If CERT_STORE_OPEN_EXISTING is set, uses
  1014. // OPEN_EXISTING. Otherwise, defaults to OPEN_ALWAYS.
  1015. //
  1016. // For the FILENAME providers:  the file is committed as either a PKCS7 or
  1017. // serialized store depending on the type read at open. However, if the
  1018. // file is empty then, if the filename has either a ".p7c" or ".spc"
  1019. // extension its committed as a PKCS7. Otherwise, its committed as a
  1020. // serialized store.
  1021. //
  1022. // For CERT_STORE_PROV_FILE, the file handle is duplicated. Its always
  1023. // committed as a serialized store.
  1024. //
  1025. #define CERT_FILE_STORE_COMMIT_ENABLE_FLAG      0x10000
  1026. //+-------------------------------------------------------------------------
  1027. //  Certificate LDAP Store Flag Values for the providers:
  1028. //      CERT_STORE_PROV_LDAP
  1029. //      CERT_STORE_PROV_LDAP_W
  1030. //      sz_CERT_STORE_PROV_LDAP_W
  1031. //      sz_CERT_STORE_PROV_LDAP
  1032. //--------------------------------------------------------------------------
  1033. // Set this flag to digitally sign all of the ldap traffic to and from a
  1034. // Windows 2000 LDAP server using the Kerberos authentication protocol.
  1035. // This feature provides integrity required by some applications. 
  1036. //
  1037. #define CERT_LDAP_STORE_SIGN_FLAG               0x10000
  1038. // Performs an A-Record only DNS lookup on the supplied host string.
  1039. // This prevents bogus DNS queries from being generated when resolving host
  1040. // names. Use this flag whenever passing a hostname as opposed to a
  1041. // domain name for the hostname parameter. 
  1042. //
  1043. // See LDAP_OPT_AREC_EXCLUSIVE defined in winldap.h for more details.
  1044. #define CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG     0x20000
  1045. //+-------------------------------------------------------------------------
  1046. //  Open the cert store using the specified store provider.
  1047. //
  1048. //  If CERT_STORE_DELETE_FLAG is set, then, the store is deleted. NULL is
  1049. //  returned for both success and failure. However, GetLastError() returns 0
  1050. //  for success and nonzero for failure.
  1051. //
  1052. //  If CERT_STORE_SET_LOCALIZED_NAME_FLAG is set, then, if supported, the
  1053. //  provider sets the store's CERT_STORE_LOCALIZED_NAME_PROP_ID property.
  1054. //  The store's localized name can be retrieved by calling
  1055. //  CertSetStoreProperty(dwPropID = CERT_STORE_LOCALIZED_NAME_PROP_ID).
  1056. //  This flag is supported by the following providers (and their sz_
  1057. //  equivalent):
  1058. //      CERT_STORE_PROV_FILENAME_A
  1059. //      CERT_STORE_PROV_FILENAME_W
  1060. //      CERT_STORE_PROV_SYSTEM_A
  1061. //      CERT_STORE_PROV_SYSTEM_W
  1062. //      CERT_STORE_PROV_SYSTEM_REGISTRY_A
  1063. //      CERT_STORE_PROV_SYSTEM_REGISTRY_W
  1064. //      CERT_STORE_PROV_PHYSICAL_W
  1065. //
  1066. //  If CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG is set, then, the
  1067. //  closing of the store's provider is deferred until all certificate,
  1068. //  CRL and CTL contexts obtained from the store are freed. Also,
  1069. //  if a non NULL HCRYPTPROV was passed, then, it will continue to be used.
  1070. //  By default, the store's provider is closed on the final CertCloseStore.
  1071. //  If this flag isn't set, then, any property changes made to previously
  1072. //  duplicated contexts after the final CertCloseStore will not be persisted.
  1073. //  By setting this flag, property changes made
  1074. //  after the CertCloseStore will be persisted. Note, setting this flag
  1075. //  causes extra overhead in doing context duplicates and frees.
  1076. //  If CertCloseStore is called with CERT_CLOSE_STORE_FORCE_FLAG, then,
  1077. //  the CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG flag is ignored.
  1078. //
  1079. //  CERT_STORE_MANIFOLD_FLAG can be set to check for certificates having the
  1080. //  manifold extension and archive the "older" certificates with the same
  1081. //  manifold extension value. A certificate is archived by setting the
  1082. //  CERT_ARCHIVED_PROP_ID.
  1083. //
  1084. //  By default, contexts having the CERT_ARCHIVED_PROP_ID, are skipped
  1085. //  during enumeration. CERT_STORE_ENUM_ARCHIVED_FLAG can be set to include
  1086. //  archived contexts when enumerating. Note, contexts having the
  1087. //  CERT_ARCHIVED_PROP_ID are still found for explicit finds, such as,
  1088. //  finding a context with a specific hash or finding a certificate having
  1089. //  a specific issuer and serial number.
  1090. //
  1091. //  CERT_STORE_UPDATE_KEYID_FLAG can be set to also update the Key Identifier's
  1092. //  CERT_KEY_PROV_INFO_PROP_ID property whenever a certificate's
  1093. //  CERT_KEY_IDENTIFIER_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID property is set
  1094. //  and the other property already exists. If the Key Identifier's
  1095. //  CERT_KEY_PROV_INFO_PROP_ID already exists, it isn't updated. Any
  1096. //  errors encountered are silently ignored.
  1097. //
  1098. //  By default, this flag is implicitly set for the "My.Default" CurrentUser
  1099. //  and LocalMachine physical stores.
  1100. //
  1101. //  CERT_STORE_READONLY_FLAG can be set to open the store as read only.
  1102. //  Otherwise, the store is opened as read/write.
  1103. //
  1104. //  CERT_STORE_OPEN_EXISTING_FLAG can be set to only open an existing
  1105. //  store. CERT_STORE_CREATE_NEW_FLAG can be set to create a new store and
  1106. //  fail if the store already exists. Otherwise, the default is to open
  1107. //  an existing store or create a new store if it doesn't already exist.
  1108. //
  1109. //  hCryptProv specifies the crypto provider to use to create the hash
  1110. //  properties or verify the signature of a subject certificate or CRL.
  1111. //  The store doesn't need to use a private
  1112. //  key. If the CERT_STORE_NO_CRYPT_RELEASE_FLAG isn't set, hCryptProv is
  1113. //  CryptReleaseContext'ed on the final CertCloseStore.
  1114. //
  1115. //  Note, if the open fails, hCryptProv is released if it would have been
  1116. //  released when the store was closed.
  1117. //
  1118. //  If hCryptProv is zero, then, the default provider and container for the
  1119. //  PROV_RSA_FULL provider type is CryptAcquireContext'ed with
  1120. //  CRYPT_VERIFYCONTEXT access. The CryptAcquireContext is deferred until
  1121. //  the first create hash or verify signature. In addition, once acquired,
  1122. //  the default provider isn't released until process exit when crypt32.dll
  1123. //  is unloaded. The acquired default provider is shared across all stores
  1124. //  and threads.
  1125. //
  1126. //  After initializing the store's data structures and optionally acquiring a
  1127. //  default crypt provider, CertOpenStore calls CryptGetOIDFunctionAddress to
  1128. //  get the address of the CRYPT_OID_OPEN_STORE_PROV_FUNC specified by
  1129. //  lpszStoreProvider. Since a store can contain certificates with different
  1130. //  encoding types, CryptGetOIDFunctionAddress is called with dwEncodingType
  1131. //  set to 0 and not the dwEncodingType passed to CertOpenStore.
  1132. //  PFN_CERT_DLL_OPEN_STORE_FUNC specifies the signature of the provider's
  1133. //  open function. This provider open function is called to load the
  1134. //  store's certificates and CRLs. Optionally, the provider may return an
  1135. //  array of functions called before a certificate or CRL is added or deleted
  1136. //  or has a property that is set.
  1137. //
  1138. //  Use of the dwEncodingType parameter is provider dependent. The type
  1139. //  definition for pvPara also depends on the provider.
  1140. //
  1141. //  Store providers are installed or registered via
  1142. //  CryptInstallOIDFunctionAddress or CryptRegisterOIDFunction, where,
  1143. //  dwEncodingType is 0 and pszFuncName is CRYPT_OID_OPEN_STORE_PROV_FUNC.
  1144. //
  1145. //  Here's a list of the predefined provider types (implemented in crypt32.dll):
  1146. //
  1147. //  CERT_STORE_PROV_MSG:
  1148. //      Gets the certificates and CRLs from the specified cryptographic message.
  1149. //      dwEncodingType contains the message and certificate encoding types.
  1150. //      The message's handle is passed in pvPara. Given,
  1151. //          HCRYPTMSG hCryptMsg; pvPara = (const void *) hCryptMsg;
  1152. //
  1153. //  CERT_STORE_PROV_MEMORY
  1154. //  sz_CERT_STORE_PROV_MEMORY:
  1155. //      Opens a store without any initial certificates or CRLs. pvPara
  1156. //      isn't used.
  1157. //
  1158. //  CERT_STORE_PROV_FILE:
  1159. //      Reads the certificates and CRLs from the specified file. The file's
  1160. //      handle is passed in pvPara. Given,
  1161. //          HANDLE hFile; pvPara = (const void *) hFile;
  1162. //
  1163. //      For a successful open, the file pointer is advanced past
  1164. //      the certificates and CRLs and their properties read from the file.
  1165. //      Note, only expects a serialized store and not a file containing
  1166. //      either a PKCS #7 signed message or a single encoded certificate.
  1167. //
  1168. //      The hFile isn't closed.
  1169. //
  1170. //  CERT_STORE_PROV_REG:
  1171. //      Reads the certificates and CRLs from the registry. The registry's
  1172. //      key handle is passed in pvPara. Given,
  1173. //          HKEY hKey; pvPara = (const void *) hKey;
  1174. //
  1175. //      The input hKey isn't closed by the provider. Before returning, the
  1176. //      provider opens it own copy of the hKey.
  1177. //
  1178. //      If CERT_STORE_READONLY_FLAG is set, then, the registry subkeys are
  1179. //      RegOpenKey'ed with KEY_READ_ACCESS. Otherwise, the registry subkeys
  1180. //      are RegCreateKey'ed with KEY_ALL_ACCESS.
  1181. //
  1182. //      This provider returns the array of functions for reading, writing,
  1183. //      deleting and property setting certificates and CRLs.
  1184. //      Any changes to the opened store are immediately pushed through to
  1185. //      the registry. However, if CERT_STORE_READONLY_FLAG is set, then,
  1186. //      writing, deleting or property setting results in a
  1187. //      SetLastError(E_ACCESSDENIED).
  1188. //
  1189. //      Note, all the certificates and CRLs are read from the registry
  1190. //      when the store is opened. The opened store serves as a write through
  1191. //      cache.
  1192. //
  1193. //      If CERT_REGISTRY_STORE_SERIALIZED_FLAG is set, then, the
  1194. //      contexts are persisted as a single serialized store subkey in the
  1195. //      registry.
  1196. //
  1197. //  CERT_STORE_PROV_PKCS7:
  1198. //  sz_CERT_STORE_PROV_PKCS7:
  1199. //      Gets the certificates and CRLs from the encoded PKCS #7 signed message.
  1200. //      dwEncodingType specifies the message and certificate encoding types.
  1201. //      The pointer to the encoded message's blob is passed in pvPara. Given,
  1202. //          CRYPT_DATA_BLOB EncodedMsg; pvPara = (const void *) &EncodedMsg;
  1203. //
  1204. //      Note, also supports the IE3.0 special version of a
  1205. //      PKCS #7 signed message referred to as a "SPC" formatted message.
  1206. //
  1207. //  CERT_STORE_PROV_SERIALIZED:
  1208. //  sz_CERT_STORE_PROV_SERIALIZED:
  1209. //      Gets the certificates and CRLs from memory containing a serialized
  1210. //      store.  The pointer to the serialized memory blob is passed in pvPara.
  1211. //      Given,
  1212. //          CRYPT_DATA_BLOB Serialized; pvPara = (const void *) &Serialized;
  1213. //
  1214. //  CERT_STORE_PROV_FILENAME_A:
  1215. //  CERT_STORE_PROV_FILENAME_W:
  1216. //  CERT_STORE_PROV_FILENAME:
  1217. //  sz_CERT_STORE_PROV_FILENAME_W:
  1218. //  sz_CERT_STORE_PROV_FILENAME:
  1219. //      Opens the file and first attempts to read as a serialized store. Then,
  1220. //      as a PKCS #7 signed message. Finally, as a single encoded certificate.
  1221. //      The filename is passed in pvPara. The filename is UNICODE for the
  1222. //      "_W" provider and ASCII for the "_A" provider. For "_W": given,
  1223. //          LPCWSTR pwszFilename; pvPara = (const void *) pwszFilename;
  1224. //      For "_A": given,
  1225. //          LPCSTR pszFilename; pvPara = (const void *) pszFilename;
  1226. //
  1227. //      Note, the default (without "_A" or "_W") is unicode.
  1228. //
  1229. //      Note, also supports the reading of the IE3.0 special version of a
  1230. //      PKCS #7 signed message file referred to as a "SPC" formatted file.
  1231. //
  1232. //  CERT_STORE_PROV_SYSTEM_A:
  1233. //  CERT_STORE_PROV_SYSTEM_W:
  1234. //  CERT_STORE_PROV_SYSTEM:
  1235. //  sz_CERT_STORE_PROV_SYSTEM_W:
  1236. //  sz_CERT_STORE_PROV_SYSTEM:
  1237. //      Opens the specified logical "System" store. The upper word of the
  1238. //      dwFlags parameter is used to specify the location of the system store.
  1239. //
  1240. //      A "System" store is a collection consisting of one or more "Physical"
  1241. //      stores. A "Physical" store is registered via the
  1242. //      CertRegisterPhysicalStore API. Each of the registered physical stores
  1243. //      is CertStoreOpen'ed and added to the collection via
  1244. //      CertAddStoreToCollection.
  1245. //
  1246. //      The CERT_SYSTEM_STORE_CURRENT_USER, CERT_SYSTEM_STORE_LOCAL_MACHINE,
  1247. //      CERT_SYSTEM_STORE_CURRENT_SERVICE, CERT_SYSTEM_STORE_SERVICES,
  1248. //      CERT_SYSTEM_STORE_USERS, CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
  1249. //      CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY and
  1250. //      CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRSE
  1251. //      system stores by default have a "SystemRegistry" store that is
  1252. //      opened and added to the collection.
  1253. //
  1254. //      The system store name is passed in pvPara. The name is UNICODE for the
  1255. //      "_W" provider and ASCII for the "_A" provider. For "_W": given,
  1256. //          LPCWSTR pwszSystemName; pvPara = (const void *) pwszSystemName;
  1257. //      For "_A": given,
  1258. //          LPCSTR pszSystemName; pvPara = (const void *) pszSystemName;
  1259. //
  1260. //      Note, the default (without "_A" or "_W") is UNICODE.
  1261. //
  1262. //      The system store name can't contain any backslashes.
  1263. //
  1264. //      If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvPara
  1265. //      points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure instead
  1266. //      of pointing to a null terminated UNICODE or ASCII string.
  1267. //      Sibling physical stores are also opened as relocated using
  1268. //      pvPara's hKeyBase.
  1269. //
  1270. //      The CERT_SYSTEM_STORE_SERVICES or CERT_SYSTEM_STORE_USERS system
  1271. //      store name must be prefixed with the ServiceName or UserName.
  1272. //      For example, "ServiceNameTrust".
  1273. //
  1274. //      Stores on remote computers can be accessed for the
  1275. //      CERT_SYSTEM_STORE_LOCAL_MACHINE, CERT_SYSTEM_STORE_SERVICES,
  1276. //      CERT_SYSTEM_STORE_USERS, CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
  1277. //      or CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE
  1278. //      locations by prepending the computer name. For example, a remote
  1279. //      local machine store is accessed via "\ComputerNameTrust" or
  1280. //      "ComputerNameTrust". A remote service store is accessed via
  1281. //      "\ComputerNameServiceNameTrust". The leading "\" backslashes are
  1282. //      optional in the ComputerName.
  1283. //
  1284. //      If CERT_STORE_READONLY_FLAG is set, then, the registry is
  1285. //      RegOpenKey'ed with KEY_READ_ACCESS. Otherwise, the registry is
  1286. //      RegCreateKey'ed with KEY_ALL_ACCESS.
  1287. //
  1288. //      The "root" store is treated differently from the other system
  1289. //      stores. Before a certificate is added to or deleted from the "root"
  1290. //      store, a pop up message box is displayed. The certificate's subject,
  1291. //      issuer, serial number, time validity, sha1 and md5 thumbprints are
  1292. //      displayed. The user is given the option to do the add or delete.
  1293. //      If they don't allow the operation, LastError is set to E_ACCESSDENIED.
  1294. //
  1295. //  CERT_STORE_PROV_SYSTEM_REGISTRY_A
  1296. //  CERT_STORE_PROV_SYSTEM_REGISTRY_W
  1297. //  CERT_STORE_PROV_SYSTEM_REGISTRY
  1298. //  sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W
  1299. //  sz_CERT_STORE_PROV_SYSTEM_REGISTRY
  1300. //      Opens the "System" store's default "Physical" store residing in the
  1301. //      registry. The upper word of the dwFlags
  1302. //      parameter is used to specify the location of the system store.
  1303. //
  1304. //      After opening the registry key associated with the system name,
  1305. //      the CERT_STORE_PROV_REG provider is called to complete the open.
  1306. //
  1307. //      The system store name is passed in pvPara. The name is UNICODE for the
  1308. //      "_W" provider and ASCII for the "_A" provider. For "_W": given,
  1309. //          LPCWSTR pwszSystemName; pvPara = (const void *) pwszSystemName;
  1310. //      For "_A": given,
  1311. //          LPCSTR pszSystemName; pvPara = (const void *) pszSystemName;
  1312. //
  1313. //      Note, the default (without "_A" or "_W") is UNICODE.
  1314. //
  1315. //      If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvPara
  1316. //      points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure instead
  1317. //      of pointing to a null terminated UNICODE or ASCII string.
  1318. //
  1319. //      See above for details on prepending a ServiceName and/or ComputerName
  1320. //      to the store name.
  1321. //
  1322. //      If CERT_STORE_READONLY_FLAG is set, then, the registry is
  1323. //      RegOpenKey'ed with KEY_READ_ACCESS. Otherwise, the registry is
  1324. //      RegCreateKey'ed with KEY_ALL_ACCESS.
  1325. //
  1326. //      The "root" store is treated differently from the other system
  1327. //      stores. Before a certificate is added to or deleted from the "root"
  1328. //      store, a pop up message box is displayed. The certificate's subject,
  1329. //      issuer, serial number, time validity, sha1 and md5 thumbprints are
  1330. //      displayed. The user is given the option to do the add or delete.
  1331. //      If they don't allow the operation, LastError is set to E_ACCESSDENIED.
  1332. //
  1333. //  CERT_STORE_PROV_PHYSICAL_W
  1334. //  CERT_STORE_PROV_PHYSICAL
  1335. //  sz_CERT_STORE_PROV_PHYSICAL_W
  1336. //  sz_CERT_STORE_PROV_PHYSICAL
  1337. //      Opens the specified "Physical" store in the "System" store.
  1338. //
  1339. //      Both the system store and physical names are passed in pvPara. The
  1340. //      names are separated with an intervening "". For example,
  1341. //      "Root.Default". The string is UNICODE.
  1342. //
  1343. //      The system and physical store names can't contain any backslashes.
  1344. //
  1345. //      If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvPara
  1346. //      points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure instead
  1347. //      of pointing to a null terminated UNICODE string.
  1348. //      The specified physical store is opened as relocated using pvPara's
  1349. //      hKeyBase.
  1350. //
  1351. //      For CERT_SYSTEM_STORE_SERVICES or CERT_SYSTEM_STORE_USERS,
  1352. //      the system and physical store names
  1353. //      must be prefixed with the ServiceName or UserName. For example,
  1354. //      "ServiceNameRoot.Default".
  1355. //
  1356. //      Physical stores on remote computers can be accessed for the
  1357. //      CERT_SYSTEM_STORE_LOCAL_MACHINE, CERT_SYSTEM_STORE_SERVICES,
  1358. //      CERT_SYSTEM_STORE_USERS, CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
  1359. //      or CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE
  1360. //      locations by prepending the computer name. For example, a remote
  1361. //      local machine store is accessed via "\ComputerNameRoot.Default"
  1362. //      or "ComputerNameRoot.Default". A remote service store is
  1363. //      accessed via "\ComputerNameServiceNameRoot.Default". The
  1364. //      leading "\" backslashes are optional in the ComputerName.
  1365. //
  1366. //  CERT_STORE_PROV_COLLECTION
  1367. //  sz_CERT_STORE_PROV_COLLECTION
  1368. //      Opens a store that is a collection of other stores. Stores are
  1369. //      added or removed to/from the collection via the CertAddStoreToCollection
  1370. //      and CertRemoveStoreFromCollection APIs.
  1371. //
  1372. //  CERT_STORE_PROV_SMART_CARD_W
  1373. //  CERT_STORE_PROV_SMART_CARD
  1374. //  sz_CERT_STORE_PROV_SMART_CARD_W
  1375. //  sz_CERT_STORE_PROV_SMART_CARD
  1376. //      Opens a store instantiated over a particular smart card storage.  pvPara
  1377. //      identifies where on the card the store is located and is of the
  1378. //      following format:
  1379. //
  1380. //                Card NameProvider NameProvider Type[Container Name]
  1381. //
  1382. //      Container Name is optional and if NOT specified the Card Name is used
  1383. //      as the Container Name.  Future versions of the provider will support
  1384. //      instantiating the store over the entire card in which case just
  1385. //      Card Name ( or id ) will be sufficient.
  1386. //
  1387. //  Here's a list of the predefined provider types (implemented in
  1388. //  cryptnet.dll):
  1389. //
  1390. //  CERT_STORE_PROV_LDAP_W
  1391. //  CERT_STORE_PROV_LDAP
  1392. //  sz_CERT_STORE_PROV_LDAP_W
  1393. //  sz_CERT_STORE_PROV_LDAP
  1394. //      Opens a store over the results of the query specified by and LDAP
  1395. //      URL which is passed in via pvPara.  In order to do writes to the
  1396. //      store the URL must specify a BASE query, no filter and a single
  1397. //      attribute.
  1398. //
  1399. //--------------------------------------------------------------------------
  1400. WINCRYPT32API
  1401. HCERTSTORE
  1402. WINAPI
  1403. CertOpenStore(
  1404.     IN LPCSTR lpszStoreProvider,
  1405.     IN DWORD dwEncodingType,
  1406.     IN HCRYPTPROV hCryptProv,
  1407.     IN DWORD dwFlags,
  1408.     IN const void *pvPara
  1409.     );
  1410. //+-------------------------------------------------------------------------
  1411. //  OID Installable Certificate Store Provider Data Structures
  1412. //--------------------------------------------------------------------------
  1413. // Handle returned by the store provider when opened.
  1414. typedef void *HCERTSTOREPROV;
  1415. // Store Provider OID function's pszFuncName.
  1416. #define CRYPT_OID_OPEN_STORE_PROV_FUNC   "CertDllOpenStoreProv"
  1417. // Note, the Store Provider OID function's dwEncodingType is always 0.
  1418. // The following information is returned by the provider when opened. Its
  1419. // zeroed with cbSize set before the provider is called. If the provider
  1420. // doesn't need to be called again after the open it doesn't need to
  1421. // make any updates to the CERT_STORE_PROV_INFO.
  1422. typedef struct _CERT_STORE_PROV_INFO {
  1423.     DWORD               cbSize;
  1424.     DWORD               cStoreProvFunc;
  1425.     void                **rgpvStoreProvFunc;
  1426.     HCERTSTOREPROV      hStoreProv;
  1427.     DWORD               dwStoreProvFlags;
  1428.     HCRYPTOIDFUNCADDR   hStoreProvFuncAddr2;
  1429. } CERT_STORE_PROV_INFO, *PCERT_STORE_PROV_INFO;
  1430. // Definition of the store provider's open function.
  1431. //
  1432. // *pStoreProvInfo has been zeroed before the call.
  1433. //
  1434. // Note, pStoreProvInfo->cStoreProvFunc should be set last.  Once set,
  1435. // all subsequent store calls, such as CertAddSerializedElementToStore will
  1436. // call the appropriate provider callback function.
  1437. typedef BOOL (WINAPI *PFN_CERT_DLL_OPEN_STORE_PROV_FUNC)(
  1438.     IN LPCSTR lpszStoreProvider,
  1439.     IN DWORD dwEncodingType,
  1440.     IN HCRYPTPROV hCryptProv,
  1441.     IN DWORD dwFlags,
  1442.     IN const void *pvPara,
  1443.     IN HCERTSTORE hCertStore,
  1444.     IN OUT PCERT_STORE_PROV_INFO pStoreProvInfo
  1445.     );
  1446. // The open callback sets the following flag, if it maintains its
  1447. // contexts externally and not in the cached store.
  1448. #define CERT_STORE_PROV_EXTERNAL_FLAG           0x1
  1449. // The open callback sets the following flag for a successful delete.
  1450. // When set, the close callback isn't called.
  1451. #define CERT_STORE_PROV_DELETED_FLAG            0x2
  1452. // The open callback sets the following flag if it doesn't persist store
  1453. // changes.
  1454. #define CERT_STORE_PROV_NO_PERSIST_FLAG         0x4
  1455. // The open callback sets the following flag if the contexts are persisted
  1456. // to a system store.
  1457. #define CERT_STORE_PROV_SYSTEM_STORE_FLAG       0x8
  1458. // Indices into the store provider's array of callback functions.
  1459. //
  1460. // The provider can implement any subset of the following functions. It
  1461. // sets pStoreProvInfo->cStoreProvFunc to the last index + 1 and any
  1462. // preceding not implemented functions to NULL.
  1463. #define CERT_STORE_PROV_CLOSE_FUNC              0
  1464. #define CERT_STORE_PROV_READ_CERT_FUNC          1
  1465. #define CERT_STORE_PROV_WRITE_CERT_FUNC         2
  1466. #define CERT_STORE_PROV_DELETE_CERT_FUNC        3
  1467. #define CERT_STORE_PROV_SET_CERT_PROPERTY_FUNC  4
  1468. #define CERT_STORE_PROV_READ_CRL_FUNC           5
  1469. #define CERT_STORE_PROV_WRITE_CRL_FUNC          6
  1470. #define CERT_STORE_PROV_DELETE_CRL_FUNC         7
  1471. #define CERT_STORE_PROV_SET_CRL_PROPERTY_FUNC   8
  1472. #define CERT_STORE_PROV_READ_CTL_FUNC           9
  1473. #define CERT_STORE_PROV_WRITE_CTL_FUNC          10
  1474. #define CERT_STORE_PROV_DELETE_CTL_FUNC         11
  1475. #define CERT_STORE_PROV_SET_CTL_PROPERTY_FUNC   12
  1476. #define CERT_STORE_PROV_CONTROL_FUNC            13
  1477. #define CERT_STORE_PROV_FIND_CERT_FUNC          14
  1478. #define CERT_STORE_PROV_FREE_FIND_CERT_FUNC     15
  1479. #define CERT_STORE_PROV_GET_CERT_PROPERTY_FUNC  16
  1480. #define CERT_STORE_PROV_FIND_CRL_FUNC           17
  1481. #define CERT_STORE_PROV_FREE_FIND_CRL_FUNC      18
  1482. #define CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC   19
  1483. #define CERT_STORE_PROV_FIND_CTL_FUNC           20
  1484. #define CERT_STORE_PROV_FREE_FIND_CTL_FUNC      21
  1485. #define CERT_STORE_PROV_GET_CTL_PROPERTY_FUNC   22
  1486. // Called by CertCloseStore when the store's reference count is
  1487. // decremented to 0.
  1488. typedef void (WINAPI *PFN_CERT_STORE_PROV_CLOSE)(
  1489.     IN HCERTSTOREPROV hStoreProv,
  1490.     IN DWORD dwFlags
  1491.     );
  1492. // Currently not called directly by the store APIs. However, may be exported
  1493. // to support other providers based on it.
  1494. //
  1495. // Reads the provider's copy of the certificate context. If it exists,
  1496. // creates a new certificate context.
  1497. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CERT)(
  1498.     IN HCERTSTOREPROV hStoreProv,
  1499.     IN PCCERT_CONTEXT pStoreCertContext,
  1500.     IN DWORD dwFlags,
  1501.     OUT PCCERT_CONTEXT *ppProvCertContext
  1502.     );
  1503. #define CERT_STORE_PROV_WRITE_ADD_FLAG      0x1
  1504. // Called by CertAddEncodedCertificateToStore,
  1505. // CertAddCertificateContextToStore or CertAddSerializedElementToStore before
  1506. // adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In
  1507. // addition to the encoded certificate, the added pCertContext might also
  1508. // have properties.
  1509. //
  1510. // Returns TRUE if its OK to update the the store.
  1511. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CERT)(
  1512.     IN HCERTSTOREPROV hStoreProv,
  1513.     IN PCCERT_CONTEXT pCertContext,
  1514.     IN DWORD dwFlags
  1515.     );
  1516. // Called by CertDeleteCertificateFromStore before deleting from the
  1517. // store.
  1518. //
  1519. // Returns TRUE if its OK to delete from the store.
  1520. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CERT)(
  1521.     IN HCERTSTOREPROV hStoreProv,
  1522.     IN PCCERT_CONTEXT pCertContext,
  1523.     IN DWORD dwFlags
  1524.     );
  1525. // Called by CertSetCertificateContextProperty before setting the
  1526. // certificate's property. Also called by CertGetCertificateContextProperty,
  1527. // when getting a hash property that needs to be created and then persisted
  1528. // via the set.
  1529. //
  1530. // Upon input, the property hasn't been set for the pCertContext parameter.
  1531. //
  1532. // Returns TRUE if its OK to set the property.
  1533. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CERT_PROPERTY)(
  1534.     IN HCERTSTOREPROV hStoreProv,
  1535.     IN PCCERT_CONTEXT pCertContext,
  1536.     IN DWORD dwPropId,
  1537.     IN DWORD dwFlags,
  1538.     IN const void *pvData
  1539.     );
  1540. // Currently not called directly by the store APIs. However, may be exported
  1541. // to support other providers based on it.
  1542. //
  1543. // Reads the provider's copy of the CRL context. If it exists,
  1544. // creates a new CRL context.
  1545. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CRL)(
  1546.     IN HCERTSTOREPROV hStoreProv,
  1547.     IN PCCRL_CONTEXT pStoreCrlContext,
  1548.     IN DWORD dwFlags,
  1549.     OUT PCCRL_CONTEXT *ppProvCrlContext
  1550.     );
  1551. // Called by CertAddEncodedCRLToStore,
  1552. // CertAddCRLContextToStore or CertAddSerializedElementToStore before
  1553. // adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In
  1554. // addition to the encoded CRL, the added pCertContext might also
  1555. // have properties.
  1556. //
  1557. // Returns TRUE if its OK to update the the store.
  1558. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CRL)(
  1559.     IN HCERTSTOREPROV hStoreProv,
  1560.     IN PCCRL_CONTEXT pCrlContext,
  1561.     IN DWORD dwFlags
  1562.     );
  1563. // Called by CertDeleteCRLFromStore before deleting from the store.
  1564. //
  1565. // Returns TRUE if its OK to delete from the store.
  1566. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CRL)(
  1567.     IN HCERTSTOREPROV hStoreProv,
  1568.     IN PCCRL_CONTEXT pCrlContext,
  1569.     IN DWORD dwFlags
  1570.     );
  1571. // Called by CertSetCRLContextProperty before setting the
  1572. // CRL's property. Also called by CertGetCRLContextProperty,
  1573. // when getting a hash property that needs to be created and then persisted
  1574. // via the set.
  1575. //
  1576. // Upon input, the property hasn't been set for the pCrlContext parameter.
  1577. //
  1578. // Returns TRUE if its OK to set the property.
  1579. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CRL_PROPERTY)(
  1580.     IN HCERTSTOREPROV hStoreProv,
  1581.     IN PCCRL_CONTEXT pCrlContext,
  1582.     IN DWORD dwPropId,
  1583.     IN DWORD dwFlags,
  1584.     IN const void *pvData
  1585.     );
  1586. // Currently not called directly by the store APIs. However, may be exported
  1587. // to support other providers based on it.
  1588. //
  1589. // Reads the provider's copy of the CTL context. If it exists,
  1590. // creates a new CTL context.
  1591. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_READ_CTL)(
  1592.     IN HCERTSTOREPROV hStoreProv,
  1593.     IN PCCTL_CONTEXT pStoreCtlContext,
  1594.     IN DWORD dwFlags,
  1595.     OUT PCCTL_CONTEXT *ppProvCtlContext
  1596.     );
  1597. // Called by CertAddEncodedCTLToStore,
  1598. // CertAddCTLContextToStore or CertAddSerializedElementToStore before
  1599. // adding to the store. The CERT_STORE_PROV_WRITE_ADD_FLAG is set. In
  1600. // addition to the encoded CTL, the added pCertContext might also
  1601. // have properties.
  1602. //
  1603. // Returns TRUE if its OK to update the the store.
  1604. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_WRITE_CTL)(
  1605.     IN HCERTSTOREPROV hStoreProv,
  1606.     IN PCCTL_CONTEXT pCtlContext,
  1607.     IN DWORD dwFlags
  1608.     );
  1609. // Called by CertDeleteCTLFromStore before deleting from the store.
  1610. //
  1611. // Returns TRUE if its OK to delete from the store.
  1612. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_DELETE_CTL)(
  1613.     IN HCERTSTOREPROV hStoreProv,
  1614.     IN PCCTL_CONTEXT pCtlContext,
  1615.     IN DWORD dwFlags
  1616.                                                      );
  1617. // Called by CertSetCTLContextProperty before setting the
  1618. // CTL's property. Also called by CertGetCTLContextProperty,
  1619. // when getting a hash property that needs to be created and then persisted
  1620. // via the set.
  1621. //
  1622. // Upon input, the property hasn't been set for the pCtlContext parameter.
  1623. //
  1624. // Returns TRUE if its OK to set the property.
  1625. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_SET_CTL_PROPERTY)(
  1626.     IN HCERTSTOREPROV hStoreProv,
  1627.     IN PCCTL_CONTEXT pCtlContext,
  1628.     IN DWORD dwPropId,
  1629.     IN DWORD dwFlags,
  1630.     IN const void *pvData
  1631.     );
  1632. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_CONTROL)(
  1633.     IN HCERTSTOREPROV hStoreProv,
  1634.     IN DWORD dwFlags,
  1635.     IN DWORD dwCtrlType,
  1636.     IN void const *pvCtrlPara
  1637.     );
  1638. typedef struct _CERT_STORE_PROV_FIND_INFO {
  1639.     DWORD               cbSize;
  1640.     DWORD               dwMsgAndCertEncodingType;
  1641.     DWORD               dwFindFlags;
  1642.     DWORD               dwFindType;
  1643.     const void          *pvFindPara;
  1644. } CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
  1645. typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
  1646. *PCCERT_STORE_PROV_FIND_INFO;
  1647. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CERT)(
  1648.     IN HCERTSTOREPROV hStoreProv,
  1649.     IN PCCERT_STORE_PROV_FIND_INFO pFindInfo,
  1650.     IN PCCERT_CONTEXT pPrevCertContext,
  1651.     IN DWORD dwFlags,
  1652.     IN OUT void **ppvStoreProvFindInfo,
  1653.     OUT PCCERT_CONTEXT *ppProvCertContext
  1654.     );
  1655. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
  1656.     IN HCERTSTOREPROV hStoreProv,
  1657.     IN PCCERT_CONTEXT pCertContext,
  1658.     IN void *pvStoreProvFindInfo,
  1659.     IN DWORD dwFlags
  1660.     );
  1661. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
  1662.     IN HCERTSTOREPROV hStoreProv,
  1663.     IN PCCERT_CONTEXT pCertContext,
  1664.     IN DWORD dwPropId,
  1665.     IN DWORD dwFlags,
  1666.     OUT void *pvData,
  1667.     IN OUT DWORD *pcbData
  1668.     );
  1669. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CRL)(
  1670.     IN HCERTSTOREPROV hStoreProv,
  1671.     IN PCCERT_STORE_PROV_FIND_INFO pFindInfo,
  1672.     IN PCCRL_CONTEXT pPrevCrlContext,
  1673.     IN DWORD dwFlags,
  1674.     IN OUT void **ppvStoreProvFindInfo,
  1675.     OUT PCCRL_CONTEXT *ppProvCrlContext
  1676.     );
  1677. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CRL)(
  1678.     IN HCERTSTOREPROV hStoreProv,
  1679.     IN PCCRL_CONTEXT pCrlContext,
  1680.     IN void *pvStoreProvFindInfo,
  1681.     IN DWORD dwFlags
  1682.     );
  1683. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CRL_PROPERTY)(
  1684.     IN HCERTSTOREPROV hStoreProv,
  1685.     IN PCCRL_CONTEXT pCrlContext,
  1686.     IN DWORD dwPropId,
  1687.     IN DWORD dwFlags,
  1688.     OUT void *pvData,
  1689.     IN OUT DWORD *pcbData
  1690.     );
  1691. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CTL)(
  1692.     IN HCERTSTOREPROV hStoreProv,
  1693.     IN PCCERT_STORE_PROV_FIND_INFO pFindInfo,
  1694.     IN PCCTL_CONTEXT pPrevCtlContext,
  1695.     IN DWORD dwFlags,
  1696.     IN OUT void **ppvStoreProvFindInfo,
  1697.     OUT PCCTL_CONTEXT *ppProvCtlContext
  1698.     );
  1699. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CTL)(
  1700.     IN HCERTSTOREPROV hStoreProv,
  1701.     IN PCCTL_CONTEXT pCtlContext,
  1702.     IN void *pvStoreProvFindInfo,
  1703.     IN DWORD dwFlags
  1704.     );
  1705. typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CTL_PROPERTY)(
  1706.     IN HCERTSTOREPROV hStoreProv,
  1707.     IN PCCTL_CONTEXT pCtlContext,
  1708.     IN DWORD dwPropId,
  1709.     IN DWORD dwFlags,
  1710.     OUT void *pvData,
  1711.     IN OUT DWORD *pcbData
  1712.     );
  1713. //+-------------------------------------------------------------------------
  1714. //  Duplicate a cert store handle
  1715. //--------------------------------------------------------------------------
  1716. WINCRYPT32API
  1717. HCERTSTORE
  1718. WINAPI
  1719. CertDuplicateStore(
  1720.     IN HCERTSTORE hCertStore
  1721.     );
  1722. #define CERT_STORE_SAVE_AS_STORE        1
  1723. #define CERT_STORE_SAVE_AS_PKCS7        2
  1724. #define CERT_STORE_SAVE_TO_FILE         1
  1725. #define CERT_STORE_SAVE_TO_MEMORY       2
  1726. #define CERT_STORE_SAVE_TO_FILENAME_A   3
  1727. #define CERT_STORE_SAVE_TO_FILENAME_W   4
  1728. #define CERT_STORE_SAVE_TO_FILENAME     CERT_STORE_SAVE_TO_FILENAME_W
  1729. //+-------------------------------------------------------------------------
  1730. //  Save the cert store. Extended version with lots of options.
  1731. //
  1732. //  According to the dwSaveAs parameter, the store can be saved as a
  1733. //  serialized store (CERT_STORE_SAVE_AS_STORE) containing properties in
  1734. //  addition to encoded certificates, CRLs and CTLs or the store can be saved
  1735. //  as a PKCS #7 signed message (CERT_STORE_SAVE_AS_PKCS7) which doesn't
  1736. //  include the properties or CTLs.
  1737. //
  1738. //  Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
  1739. //  CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't saved into
  1740. //  a serialized store.
  1741. //
  1742. //  For CERT_STORE_SAVE_AS_PKCS7, the dwEncodingType specifies the message
  1743. //  encoding type. The dwEncodingType parameter isn't used for
  1744. //  CERT_STORE_SAVE_AS_STORE.
  1745. //
  1746. //  The dwFlags parameter currently isn't used and should be set to 0.
  1747. //
  1748. //  The dwSaveTo and pvSaveToPara parameters specify where to save the
  1749. //  store as follows:
  1750. //    CERT_STORE_SAVE_TO_FILE:
  1751. //      Saves to the specified file. The file's handle is passed in
  1752. //      pvSaveToPara. Given,
  1753. //          HANDLE hFile; pvSaveToPara = (void *) hFile;
  1754. //
  1755. //      For a successful save, the file pointer is positioned after the
  1756. //      last write.
  1757. //
  1758. //    CERT_STORE_SAVE_TO_MEMORY:
  1759. //      Saves to the specified memory blob. The pointer to
  1760. //      the memory blob is passed in pvSaveToPara. Given,
  1761. //          CRYPT_DATA_BLOB SaveBlob; pvSaveToPara = (void *) &SaveBlob;
  1762. //      Upon entry, the SaveBlob's pbData and cbData need to be initialized.
  1763. //      Upon return, cbData is updated with the actual length.
  1764. //      For a length only calculation, pbData should be set to NULL. If
  1765. //      pbData is non-NULL and cbData isn't large enough, FALSE is returned
  1766. //      with a last error of ERRROR_MORE_DATA.
  1767. //
  1768. //    CERT_STORE_SAVE_TO_FILENAME_A:
  1769. //    CERT_STORE_SAVE_TO_FILENAME_W:
  1770. //    CERT_STORE_SAVE_TO_FILENAME:
  1771. //      Opens the file and saves to it. The filename is passed in pvSaveToPara.
  1772. //      The filename is UNICODE for the "_W" option and ASCII for the "_A"
  1773. //      option. For "_W": given,
  1774. //          LPCWSTR pwszFilename; pvSaveToPara = (void *) pwszFilename;
  1775. //      For "_A": given,
  1776. //          LPCSTR pszFilename; pvSaveToPara = (void *) pszFilename;
  1777. //
  1778. //      Note, the default (without "_A" or "_W") is UNICODE.
  1779. //
  1780. //--------------------------------------------------------------------------
  1781. WINCRYPT32API
  1782. BOOL
  1783. WINAPI
  1784. CertSaveStore(
  1785.     IN HCERTSTORE hCertStore,
  1786.     IN DWORD dwEncodingType,
  1787.     IN DWORD dwSaveAs,
  1788.     IN DWORD dwSaveTo,
  1789.     IN OUT void *pvSaveToPara,
  1790.     IN DWORD dwFlags
  1791.     );
  1792. //+-------------------------------------------------------------------------
  1793. //  Certificate Store close flags
  1794. //--------------------------------------------------------------------------
  1795. #define CERT_CLOSE_STORE_FORCE_FLAG         0x00000001
  1796. #define CERT_CLOSE_STORE_CHECK_FLAG         0x00000002
  1797. //+-------------------------------------------------------------------------
  1798. //  Close a cert store handle.
  1799. //
  1800. //  There needs to be a corresponding close for each open and duplicate.
  1801. //
  1802. //  Even on the final close, the cert store isn't freed until all of its
  1803. //  certificate and CRL contexts have also been freed.
  1804. //
  1805. //  On the final close, the hCryptProv passed to CertStoreOpen is
  1806. //  CryptReleaseContext'ed.
  1807. //
  1808. //  To force the closure of the store with all of its memory freed, set the
  1809. //  CERT_STORE_CLOSE_FORCE_FLAG. This flag should be set when the caller does
  1810. //  its own reference counting and wants everything to vanish.
  1811. //
  1812. //  To check if all the store's certificates and CRLs have been freed and that
  1813. //  this is the last CertCloseStore, set the CERT_CLOSE_STORE_CHECK_FLAG. If
  1814. //  set and certs, CRLs or stores still need to be freed/closed, FALSE is
  1815. //  returned with LastError set to CRYPT_E_PENDING_CLOSE. Note, for FALSE,
  1816. //  the store is still closed. This is a diagnostic flag.
  1817. //
  1818. //  LastError is preserved unless CERT_CLOSE_STORE_CHECK_FLAG is set and FALSE
  1819. //  is returned.
  1820. //--------------------------------------------------------------------------
  1821. WINCRYPT32API
  1822. BOOL
  1823. WINAPI
  1824. CertCloseStore(
  1825.     IN HCERTSTORE hCertStore,
  1826.     DWORD dwFlags
  1827.     );
  1828. //+-------------------------------------------------------------------------
  1829. //  Get the subject certificate context uniquely identified by its Issuer and
  1830. //  SerialNumber from the store.
  1831. //
  1832. //  If the certificate isn't found, NULL is returned. Otherwise, a pointer to
  1833. //  a read only CERT_CONTEXT is returned. CERT_CONTEXT must be freed by calling
  1834. //  CertFreeCertificateContext. CertDuplicateCertificateContext can be called to make a
  1835. //  duplicate.
  1836. //
  1837. //  The returned certificate might not be valid. Normally, it would be
  1838. //  verified when getting its issuer certificate (CertGetIssuerCertificateFromStore).
  1839. //--------------------------------------------------------------------------
  1840. WINCRYPT32API
  1841. PCCERT_CONTEXT
  1842. WINAPI
  1843. CertGetSubjectCertificateFromStore(
  1844.     IN HCERTSTORE hCertStore,
  1845.     IN DWORD dwCertEncodingType,
  1846.     IN PCERT_INFO pCertId           // Only the Issuer and SerialNumber
  1847.     // fields are used
  1848.     );
  1849. //+-------------------------------------------------------------------------
  1850. //  Enumerate the certificate contexts in the store.
  1851. //
  1852. //  If a certificate isn't found, NULL is returned.
  1853. //  Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT
  1854. //  must be freed by calling CertFreeCertificateContext or is freed when passed as the
  1855. //  pPrevCertContext on a subsequent call. CertDuplicateCertificateContext
  1856. //  can be called to make a duplicate.
  1857. //
  1858. //  pPrevCertContext MUST BE NULL to enumerate the first
  1859. //  certificate in the store. Successive certificates are enumerated by setting
  1860. //  pPrevCertContext to the CERT_CONTEXT returned by a previous call.
  1861. //
  1862. //  NOTE: a NON-NULL pPrevCertContext is always CertFreeCertificateContext'ed by
  1863. //  this function, even for an error.
  1864. //--------------------------------------------------------------------------
  1865. WINCRYPT32API
  1866. PCCERT_CONTEXT
  1867. WINAPI
  1868. CertEnumCertificatesInStore(
  1869.     IN HCERTSTORE hCertStore,
  1870.     IN PCCERT_CONTEXT pPrevCertContext
  1871.     );
  1872. //+-------------------------------------------------------------------------
  1873. //  Find the first or next certificate context in the store.
  1874. //
  1875. //  The certificate is found according to the dwFindType and its pvFindPara.
  1876. //  See below for a list of the find types and its parameters.
  1877. //
  1878. //  Currently dwFindFlags is only used for CERT_FIND_SUBJECT_ATTR,
  1879. //  CERT_FIND_ISSUER_ATTR or CERT_FIND_CTL_USAGE. Otherwise, must be set to 0.
  1880. //
  1881. //  Usage of dwCertEncodingType depends on the dwFindType.
  1882. //
  1883. //  If the first or next certificate isn't found, NULL is returned.
  1884. //  Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT
  1885. //  must be freed by calling CertFreeCertificateContext or is freed when passed as the
  1886. //  pPrevCertContext on a subsequent call. CertDuplicateCertificateContext
  1887. //  can be called to make a duplicate.
  1888. //
  1889. //  pPrevCertContext MUST BE NULL on the first
  1890. //  call to find the certificate. To find the next certificate, the
  1891. //  pPrevCertContext is set to the CERT_CONTEXT returned by a previous call.
  1892. //
  1893. //  NOTE: a NON-NULL pPrevCertContext is always CertFreeCertificateContext'ed by
  1894. //  this function, even for an error.
  1895. //--------------------------------------------------------------------------
  1896. WINCRYPT32API
  1897. PCCERT_CONTEXT
  1898. WINAPI
  1899. CertFindCertificateInStore(
  1900.     IN HCERTSTORE hCertStore,
  1901.     IN DWORD dwCertEncodingType,
  1902.     IN DWORD dwFindFlags,
  1903.     IN DWORD dwFindType,
  1904.     IN const void *pvFindPara,
  1905.     IN PCCERT_CONTEXT pPrevCertContext
  1906.     );
  1907. //+-------------------------------------------------------------------------
  1908. // Certificate comparison functions
  1909. //--------------------------------------------------------------------------
  1910. #define CERT_COMPARE_MASK           0xFFFF
  1911. #define CERT_COMPARE_SHIFT          16
  1912. #define CERT_COMPARE_ANY            0
  1913. #define CERT_COMPARE_SHA1_HASH      1
  1914. #define CERT_COMPARE_NAME           2
  1915. #define CERT_COMPARE_ATTR           3
  1916. #define CERT_COMPARE_MD5_HASH       4
  1917. #define CERT_COMPARE_PROPERTY       5
  1918. #define CERT_COMPARE_PUBLIC_KEY     6
  1919. #define CERT_COMPARE_HASH           CERT_COMPARE_SHA1_HASH
  1920. #define CERT_COMPARE_NAME_STR_A     7
  1921. #define CERT_COMPARE_NAME_STR_W     8
  1922. #define CERT_COMPARE_KEY_SPEC       9
  1923. #define CERT_COMPARE_ENHKEY_USAGE   10
  1924. #define CERT_COMPARE_CTL_USAGE      CERT_COMPARE_ENHKEY_USAGE
  1925. #define CERT_COMPARE_SUBJECT_CERT   11
  1926. #define CERT_COMPARE_ISSUER_OF      12
  1927. #define CERT_COMPARE_EXISTING       13
  1928. #define CERT_COMPARE_SIGNATURE_HASH 14
  1929. #define CERT_COMPARE_KEY_IDENTIFIER 15
  1930. #define CERT_COMPARE_CERT_ID        16
  1931. #define CERT_COMPARE_CROSS_CERT_DIST_POINTS 17
  1932. #define CERT_COMPARE_PUBKEY_MD5_HASH 18
  1933. //+-------------------------------------------------------------------------
  1934. //  dwFindType
  1935. //
  1936. //  The dwFindType definition consists of two components:
  1937. //   - comparison function
  1938. //   - certificate information flag
  1939. //--------------------------------------------------------------------------
  1940. #define CERT_FIND_ANY           (CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)
  1941. #define CERT_FIND_SHA1_HASH     (CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT)
  1942. #define CERT_FIND_MD5_HASH      (CERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT)
  1943. #define CERT_FIND_SIGNATURE_HASH (CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT)
  1944. #define CERT_FIND_KEY_IDENTIFIER (CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT)
  1945. #define CERT_FIND_HASH          CERT_FIND_SHA1_HASH
  1946. #define CERT_FIND_PROPERTY      (CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT)
  1947. #define CERT_FIND_PUBLIC_KEY    (CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT)
  1948. #define CERT_FIND_SUBJECT_NAME  (CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | 
  1949.                                  CERT_INFO_SUBJECT_FLAG)
  1950. #define CERT_FIND_SUBJECT_ATTR  (CERT_COMPARE_ATTR << CERT_COMPARE_SHIFT | 
  1951.                                  CERT_INFO_SUBJECT_FLAG)
  1952. #define CERT_FIND_ISSUER_NAME   (CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | 
  1953.                                  CERT_INFO_ISSUER_FLAG)
  1954. #define CERT_FIND_ISSUER_ATTR   (CERT_COMPARE_ATTR << CERT_COMPARE_SHIFT | 
  1955.                                  CERT_INFO_ISSUER_FLAG)
  1956. #define CERT_FIND_SUBJECT_STR_A (CERT_COMPARE_NAME_STR_A << CERT_COMPARE_SHIFT | 
  1957.                                  CERT_INFO_SUBJECT_FLAG)
  1958. #define CERT_FIND_SUBJECT_STR_W (CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | 
  1959.                                  CERT_INFO_SUBJECT_FLAG)
  1960. #define CERT_FIND_SUBJECT_STR   CERT_FIND_SUBJECT_STR_W
  1961. #define CERT_FIND_ISSUER_STR_A  (CERT_COMPARE_NAME_STR_A << CERT_COMPARE_SHIFT | 
  1962.                                  CERT_INFO_ISSUER_FLAG)
  1963. #define CERT_FIND_ISSUER_STR_W  (CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | 
  1964.                                  CERT_INFO_ISSUER_FLAG)
  1965. #define CERT_FIND_ISSUER_STR    CERT_FIND_ISSUER_STR_W
  1966. #define CERT_FIND_KEY_SPEC      (CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT)
  1967. #define CERT_FIND_ENHKEY_USAGE  (CERT_COMPARE_ENHKEY_USAGE << CERT_COMPARE_SHIFT)
  1968. #define CERT_FIND_CTL_USAGE     CERT_FIND_ENHKEY_USAGE
  1969. #define CERT_FIND_SUBJECT_CERT  (CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT)
  1970. #define CERT_FIND_ISSUER_OF     (CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT)
  1971. #define CERT_FIND_EXISTING      (CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)
  1972. #define CERT_FIND_CERT_ID       (CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)
  1973. #define CERT_FIND_CROSS_CERT_DIST_POINTS 
  1974.                     (CERT_COMPARE_CROSS_CERT_DIST_POINTS << CERT_COMPARE_SHIFT)
  1975. #define CERT_FIND_PUBKEY_MD5_HASH 
  1976.                     (CERT_COMPARE_PUBKEY_MD5_HASH << CERT_COMPARE_SHIFT)
  1977. //+-------------------------------------------------------------------------
  1978. //  CERT_FIND_ANY
  1979. //
  1980. //  Find any certificate.
  1981. //
  1982. //  pvFindPara isn't used.
  1983. //--------------------------------------------------------------------------
  1984. //+-------------------------------------------------------------------------
  1985. //  CERT_FIND_HASH
  1986. //
  1987. //  Find a certificate with the specified hash.
  1988. //
  1989. //  pvFindPara points to a CRYPT_HASH_BLOB.
  1990. //--------------------------------------------------------------------------
  1991. //+-------------------------------------------------------------------------
  1992. //  CERT_FIND_KEY_IDENTIFIER
  1993. //
  1994. //  Find a certificate with the specified KeyIdentifier. Gets the
  1995. //  CERT_KEY_IDENTIFIER_PROP_ID property and compares with the input
  1996. //  CRYPT_HASH_BLOB.
  1997. //
  1998. //  pvFindPara points to a CRYPT_HASH_BLOB.
  1999. //--------------------------------------------------------------------------
  2000. //+-------------------------------------------------------------------------
  2001. //  CERT_FIND_PROPERTY
  2002. //
  2003. //  Find a certificate having the specified property.
  2004. //
  2005. //  pvFindPara points to a DWORD containing the PROP_ID
  2006. //--------------------------------------------------------------------------
  2007. //+-------------------------------------------------------------------------
  2008. //  CERT_FIND_PUBLIC_KEY
  2009. //
  2010. //  Find a certificate matching the specified public key.
  2011. //
  2012. //  pvFindPara points to a CERT_PUBLIC_KEY_INFO containing the public key
  2013. //--------------------------------------------------------------------------
  2014. //+-------------------------------------------------------------------------
  2015. //  CERT_FIND_SUBJECT_NAME
  2016. //  CERT_FIND_ISSUER_NAME
  2017. //
  2018. //  Find a certificate with the specified subject/issuer name. Does an exact
  2019. //  match of the entire name.
  2020. //
  2021. //  Restricts search to certificates matching the dwCertEncodingType.
  2022. //
  2023. //  pvFindPara points to a CERT_NAME_BLOB.
  2024. //--------------------------------------------------------------------------
  2025. //+-------------------------------------------------------------------------
  2026. //  CERT_FIND_SUBJECT_ATTR
  2027. //  CERT_FIND_ISSUER_ATTR
  2028. //
  2029. //  Find a certificate with the specified subject/issuer attributes.
  2030. //
  2031. //  Compares the attributes in the subject/issuer name with the
  2032. //  Relative Distinguished Name's (CERT_RDN) array of attributes specified in
  2033. //  pvFindPara. The comparison iterates through the CERT_RDN attributes and looks
  2034. //  for an attribute match in any of the subject/issuer's RDNs.
  2035. //
  2036. //  The CERT_RDN_ATTR fields can have the following special values:
  2037. //    pszObjId == NULL              - ignore the attribute object identifier
  2038. //    dwValueType == RDN_ANY_TYPE   - ignore the value type
  2039. //    Value.pbData == NULL          - match any value
  2040. //
  2041. //  CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG should be set in dwFindFlags to do
  2042. //  a case insensitive match. Otherwise, defaults to an exact, case sensitive
  2043. //  match.
  2044. //
  2045. //  CERT_UNICODE_IS_RDN_ATTRS_FLAG should be set in dwFindFlags if the RDN was
  2046. //  initialized with unicode strings as for
  2047. //  CryptEncodeObject(X509_UNICODE_NAME).
  2048. //
  2049. //  Restricts search to certificates matching the dwCertEncodingType.
  2050. //
  2051. //  pvFindPara points to a CERT_RDN (defined in wincert.h).
  2052. //--------------------------------------------------------------------------
  2053. //+-------------------------------------------------------------------------
  2054. //  CERT_FIND_SUBJECT_STR_A
  2055. //  CERT_FIND_SUBJECT_STR_W | CERT_FIND_SUBJECT_STR
  2056. //  CERT_FIND_ISSUER_STR_A
  2057. //  CERT_FIND_ISSUER_STR_W  | CERT_FIND_ISSUER_STR
  2058. //
  2059. //  Find a certificate containing the specified subject/issuer name string.
  2060. //
  2061. //  First, the certificate's subject/issuer is converted to a name string
  2062. //  via CertNameToStrA/CertNameToStrW(CERT_SIMPLE_NAME_STR). Then, a
  2063. //  case insensitive substring within string match is performed.
  2064. //
  2065. //  Restricts search to certificates matching the dwCertEncodingType.
  2066. //
  2067. //  For *_STR_A, pvFindPara points to a null terminated character string.
  2068. //  For *_STR_W, pvFindPara points to a null terminated wide character string.
  2069. //--------------------------------------------------------------------------
  2070. //+-------------------------------------------------------------------------
  2071. //  CERT_FIND_KEY_SPEC
  2072. //
  2073. //  Find a certificate having a CERT_KEY_SPEC_PROP_ID property matching
  2074. //  the specified KeySpec.
  2075. //
  2076. //  pvFindPara points to a DWORD containing the KeySpec.
  2077. //--------------------------------------------------------------------------
  2078. //+-------------------------------------------------------------------------
  2079. //  CERT_FIND_ENHKEY_USAGE
  2080. //
  2081. //  Find a certificate having the szOID_ENHANCED_KEY_USAGE extension or
  2082. //  the CERT_ENHKEY_USAGE_PROP_ID and matching the specified pszUsageIdentifers.
  2083. //
  2084. //  pvFindPara points to a CERT_ENHKEY_USAGE data structure. If pvFindPara
  2085. //  is NULL or CERT_ENHKEY_USAGE's cUsageIdentifier is 0, then, matches any
  2086. //  certificate having enhanced key usage.
  2087. //
  2088. //  If the CERT_FIND_VALID_ENHKEY_USAGE_FLAG is set, then, only does a match
  2089. //  for certificates that are valid for the specified usages. By default,
  2090. //  the ceriticate must be valid for all usages. CERT_FIND_OR_ENHKEY_USAGE_FLAG
  2091. //  can be set, if the certificate only needs to be valid for one of the
  2092. //  specified usages. Note, CertGetValidUsages() is called to get the
  2093. //  certificate's list of valid usages. Only the CERT_FIND_OR_ENHKEY_USAGE_FLAG
  2094. //  is applicable when this flag is set.
  2095. //
  2096. //  The CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG can be set in dwFindFlags to
  2097. //  also match a certificate without either the extension or property.
  2098. //
  2099. //  If CERT_FIND_NO_ENHKEY_USAGE_FLAG is set in dwFindFlags, finds
  2100. //  certificates without the key usage extension or property. Setting this
  2101. //  flag takes precedence over pvFindPara being NULL.
  2102. //
  2103. //  If the CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG is set, then, only does a match
  2104. //  using the extension. If pvFindPara is NULL or cUsageIdentifier is set to
  2105. //  0, finds certificates having the extension. If
  2106. //  CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG is set, also matches a certificate
  2107. //  without the extension. If CERT_FIND_NO_ENHKEY_USAGE_FLAG is set, finds
  2108. //  certificates without the extension.
  2109. //
  2110. //  If the CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG is set, then, only does a match
  2111. //  using the property. If pvFindPara is NULL or cUsageIdentifier is set to
  2112. //  0, finds certificates having the property. If
  2113. //  CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG is set, also matches a certificate
  2114. //  without the property. If CERT_FIND_NO_ENHKEY_USAGE_FLAG is set, finds
  2115. //  certificates without the property.
  2116. //
  2117. //  If CERT_FIND_OR_ENHKEY_USAGE_FLAG is set, does an "OR" match of any of
  2118. //  the specified pszUsageIdentifiers. If not set, then, does an "AND" match
  2119. //  of all of the specified pszUsageIdentifiers.
  2120. //--------------------------------------------------------------------------
  2121. #define CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG  0x1
  2122. #define CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG  0x2
  2123. #define CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG 0x4
  2124. #define CERT_FIND_NO_ENHKEY_USAGE_FLAG        0x8
  2125. #define CERT_FIND_OR_ENHKEY_USAGE_FLAG        0x10
  2126. #define CERT_FIND_VALID_ENHKEY_USAGE_FLAG     0x20
  2127. #define CERT_FIND_OPTIONAL_CTL_USAGE_FLAG   CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG
  2128. #define CERT_FIND_EXT_ONLY_CTL_USAGE_FLAG 
  2129.         CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG
  2130. #define CERT_FIND_PROP_ONLY_CTL_USAGE_FLAG 
  2131.         CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG
  2132. #define CERT_FIND_NO_CTL_USAGE_FLAG         CERT_FIND_NO_ENHKEY_USAGE_FLAG
  2133. #define CERT_FIND_OR_CTL_USAGE_FLAG         CERT_FIND_OR_ENHKEY_USAGE_FLAG
  2134. #define CERT_FIND_VALID_CTL_USAGE_FLAG      CERT_FIND_VALID_ENHKEY_USAGE_FLAG
  2135. //+-------------------------------------------------------------------------
  2136. //  CERT_FIND_CERT_ID
  2137. //
  2138. //  Find a certificate with the specified CERT_ID.
  2139. //
  2140. //  pvFindPara points to a CERT_ID.
  2141. //--------------------------------------------------------------------------
  2142. //+-------------------------------------------------------------------------
  2143. //  CERT_FIND_CROSS_CERT_DIST_POINTS
  2144. //
  2145. //  Find a certificate having either a cross certificate distribution
  2146. //  point extension or property.
  2147. //
  2148. //  pvFindPara isn't used.
  2149. //--------------------------------------------------------------------------
  2150. //+-------------------------------------------------------------------------
  2151. //  Get the certificate context from the store for the first or next issuer
  2152. //  of the specified subject certificate. Perform the enabled
  2153. //  verification checks on the subject. (Note, the checks are on the subject
  2154. //  using the returned issuer certificate.)
  2155. //
  2156. //  If the first or next issuer certificate isn't found, NULL is returned.
  2157. //  Otherwise, a pointer to a read only CERT_CONTEXT is returned. CERT_CONTEXT
  2158. //  must be freed by calling CertFreeCertificateContext or is freed when passed as the
  2159. //  pPrevIssuerContext on a subsequent call. CertDuplicateCertificateContext
  2160. //  can be called to make a duplicate.
  2161. //
  2162. //  For a self signed subject certificate, NULL is returned with LastError set
  2163. //  to CERT_STORE_SELF_SIGNED. The enabled verification checks are still done.
  2164. //
  2165. //  The pSubjectContext may have been obtained from this store, another store
  2166. //  or created by the caller application. When created by the caller, the
  2167. //  CertCreateCertificateContext function must have been called.
  2168. //
  2169. //  An issuer may have multiple certificates. This may occur when the validity
  2170. //  period is about to change. pPrevIssuerContext MUST BE NULL on the first
  2171. //  call to get the issuer. To get the next certificate for the issuer, the
  2172. //  pPrevIssuerContext is set to the CERT_CONTEXT returned by a previous call.
  2173. //
  2174. //  NOTE: a NON-NULL pPrevIssuerContext is always CertFreeCertificateContext'ed by
  2175. //  this function, even for an error.
  2176. //
  2177. //  The following flags can be set in *pdwFlags to enable verification checks
  2178. //  on the subject certificate context:
  2179. //      CERT_STORE_SIGNATURE_FLAG     - use the public key in the returned
  2180. //                                      issuer certificate to verify the
  2181. //                                      signature on the subject certificate.
  2182. //                                      Note, if pSubjectContext->hCertStore ==
  2183. //                                      hCertStore, the store provider might
  2184. //                                      be able to eliminate a redo of
  2185. //                                      the signature verify.
  2186. //      CERT_STORE_TIME_VALIDITY_FLAG - get the current time and verify that
  2187. //                                      its within the subject certificate's
  2188. //                                      validity period
  2189. //      CERT_STORE_REVOCATION_FLAG    - check if the subject certificate is on
  2190. //                                      the issuer's revocation list
  2191. //
  2192. //  If an enabled verification check fails, then, its flag is set upon return.
  2193. //  If CERT_STORE_REVOCATION_FLAG was enabled and the issuer doesn't have a
  2194. //  CRL in the store, then, CERT_STORE_NO_CRL_FLAG is set in addition to
  2195. //  the CERT_STORE_REVOCATION_FLAG.
  2196. //
  2197. //  If CERT_STORE_SIGNATURE_FLAG or CERT_STORE_REVOCATION_FLAG is set, then,
  2198. //  CERT_STORE_NO_ISSUER_FLAG is set if it doesn't have an issuer certificate
  2199. //  in the store.
  2200. //
  2201. //  For a verification check failure, a pointer to the issuer's CERT_CONTEXT
  2202. //  is still returned and SetLastError isn't updated.
  2203. //--------------------------------------------------------------------------
  2204. WINCRYPT32API
  2205. PCCERT_CONTEXT
  2206. WINAPI
  2207. CertGetIssuerCertificateFromStore(
  2208.     IN HCERTSTORE hCertStore,
  2209.     IN PCCERT_CONTEXT pSubjectContext,
  2210.     IN OPTIONAL PCCERT_CONTEXT pPrevIssuerContext,
  2211.     IN OUT DWORD *pdwFlags
  2212.     );
  2213. //+-------------------------------------------------------------------------
  2214. //  Perform the enabled verification checks on the subject certificate
  2215. //  using the issuer. Same checks and flags definitions as for the above
  2216. //  CertGetIssuerCertificateFromStore.
  2217. //
  2218. //  If you are only checking CERT_STORE_TIME_VALIDITY_FLAG, then, the
  2219. //  issuer can be NULL.
  2220. //
  2221. //  For a verification check failure, SUCCESS is still returned.
  2222. //--------------------------------------------------------------------------
  2223. WINCRYPT32API
  2224. BOOL
  2225. WINAPI
  2226. CertVerifySubjectCertificateContext(
  2227.     IN PCCERT_CONTEXT pSubject,
  2228.     IN OPTIONAL PCCERT_CONTEXT pIssuer,
  2229.     IN OUT DWORD *pdwFlags
  2230.     );
  2231. //+-------------------------------------------------------------------------
  2232. //  Duplicate a certificate context
  2233. //--------------------------------------------------------------------------
  2234. WINCRYPT32API
  2235. PCCERT_CONTEXT
  2236. WINAPI
  2237. CertDuplicateCertificateContext(
  2238.     IN PCCERT_CONTEXT pCertContext
  2239.     );
  2240. //+-------------------------------------------------------------------------
  2241. //  Create a certificate context from the encoded certificate. The created
  2242. //  context isn't put in a store.
  2243. //
  2244. //  Makes a copy of the encoded certificate in the created context.
  2245. //
  2246. //  If unable to decode and create the certificate context, NULL is returned.
  2247. //  Otherwise, a pointer to a read only CERT_CONTEXT is returned.
  2248. //  CERT_CONTEXT must be freed by calling CertFreeCertificateContext.
  2249. //  CertDuplicateCertificateContext can be called to make a duplicate.
  2250. //
  2251. //  CertSetCertificateContextProperty and CertGetCertificateContextProperty can be called
  2252. //  to store properties for the certificate.
  2253. //--------------------------------------------------------------------------
  2254. WINCRYPT32API
  2255. PCCERT_CONTEXT
  2256. WINAPI
  2257. CertCreateCertificateContext(
  2258.     IN DWORD dwCertEncodingType,
  2259.     IN const BYTE *pbCertEncoded,
  2260.     IN DWORD cbCertEncoded
  2261.     );
  2262. //+-------------------------------------------------------------------------
  2263. //  Free a certificate context
  2264. //
  2265. //  There needs to be a corresponding free for each context obtained by a
  2266. //  get, find, duplicate or create.
  2267. //--------------------------------------------------------------------------
  2268. WINCRYPT32API
  2269. BOOL
  2270. WINAPI
  2271. CertFreeCertificateContext(
  2272.     IN PCCERT_CONTEXT pCertContext
  2273.     );
  2274. //+-------------------------------------------------------------------------
  2275. //  Set the property for the specified certificate context.
  2276. //
  2277. //  The type definition for pvData depends on the dwPropId value. There are
  2278. //  five predefined types:
  2279. //      CERT_KEY_PROV_HANDLE_PROP_ID - a HCRYPTPROV for the certificate's
  2280. //      private key is passed in pvData. Updates the hCryptProv field
  2281. //      of the CERT_KEY_CONTEXT_PROP_ID. If the CERT_KEY_CONTEXT_PROP_ID
  2282. //      doesn't exist, its created with all the other fields zeroed out. If
  2283. //      CERT_STORE_NO_CRYPT_RELEASE_FLAG isn't set, HCRYPTPROV is implicitly
  2284. //      released when either the property is set to NULL or on the final
  2285. //      free of the CertContext.
  2286. //
  2287. //      CERT_KEY_PROV_INFO_PROP_ID - a PCRYPT_KEY_PROV_INFO for the certificate's
  2288. //      private key is passed in pvData.
  2289. //
  2290. //      CERT_SHA1_HASH_PROP_ID       -
  2291. //      CERT_MD5_HASH_PROP_ID        -
  2292. //      CERT_SIGNATURE_HASH_PROP_ID  - normally, a hash property is implicitly
  2293. //      set by doing a CertGetCertificateContextProperty. pvData points to a
  2294. //      CRYPT_HASH_BLOB.
  2295. //
  2296. //      CERT_KEY_CONTEXT_PROP_ID - a PCERT_KEY_CONTEXT for the certificate's
  2297. //      private key is passed in pvData. The CERT_KEY_CONTEXT contains both the
  2298. //      hCryptProv and dwKeySpec for the private key.
  2299. //      See the CERT_KEY_PROV_HANDLE_PROP_ID for more information about
  2300. //      the hCryptProv field and dwFlags settings. Note, more fields may
  2301. //      be added for this property. The cbSize field value will be adjusted
  2302. //      accordingly.
  2303. //
  2304. //      CERT_KEY_SPEC_PROP_ID - the dwKeySpec for the private key. pvData
  2305. //      points to a DWORD containing the KeySpec
  2306. //
  2307. //      CERT_ENHKEY_USAGE_PROP_ID - enhanced key usage definition for the
  2308. //      certificate. pvData points to a CRYPT_DATA_BLOB containing an
  2309. //      ASN.1 encoded CERT_ENHKEY_USAGE (encoded via
  2310. //      CryptEncodeObject(X509_ENHANCED_KEY_USAGE).
  2311. //
  2312. //      CERT_NEXT_UPDATE_LOCATION_PROP_ID - location of the next update.
  2313. //      Currently only applicable to CTLs. pvData points to a CRYPT_DATA_BLOB
  2314. //      containing an ASN.1 encoded CERT_ALT_NAME_INFO (encoded via
  2315. //      CryptEncodeObject(X509_ALTERNATE_NAME)).
  2316. //
  2317. //      CERT_FRIENDLY_NAME_PROP_ID - friendly name for the cert, CRL or CTL.
  2318. //      pvData points to a CRYPT_DATA_BLOB. pbData is a pointer to a NULL
  2319. //      terminated unicode, wide character string.
  2320. //      cbData = (wcslen((LPWSTR) pbData) + 1) * sizeof(WCHAR).
  2321. //
  2322. //      CERT_DESCRIPTION_PROP_ID - description for the cert, CRL or CTL.
  2323. //      pvData points to a CRYPT_DATA_BLOB. pbData is a pointer to a NULL
  2324. //      terminated unicode, wide character string.
  2325. //      cbData = (wcslen((LPWSTR) pbData) + 1) * sizeof(WCHAR).
  2326. //
  2327. //      CERT_ARCHIVED_PROP_ID - when this property is set, the certificate
  2328. //      is skipped during enumeration. Note, certificates having this property
  2329. //      are still found for explicit finds, such as, finding a certificate
  2330. //      with a specific hash or finding a certificate having a specific issuer
  2331. //      and serial number. pvData points to a CRYPT_DATA_BLOB. This blob
  2332. //      can be NULL (pbData = NULL, cbData = 0).
  2333. //
  2334. //      CERT_PUBKEY_ALG_PARA_PROP_ID - for public keys supporting
  2335. //      algorithm parameter inheritance. pvData points to a CRYPT_OBJID_BLOB
  2336. //      containing the ASN.1 encoded PublicKey Algorithm Parameters. For
  2337. //      DSS this would be the parameters encoded via
  2338. //      CryptEncodeObject(X509_DSS_PARAMETERS). This property may be set
  2339. //      by CryptVerifyCertificateSignatureEx().
  2340. //
  2341. //      CERT_CROSS_CERT_DIST_POINTS_PROP_ID - location of the cross certs.
  2342. //      Currently only applicable to certs. pvData points to a CRYPT_DATA_BLOB
  2343. //      containing an ASN.1 encoded CROSS_CERT_DIST_POINTS_INFO (encoded via
  2344. //      CryptEncodeObject(X509_CROSS_CERT_DIST_POINTS)).
  2345. //
  2346. //      CERT_ENROLLMENT_PROP_ID - enrollment information of the pending request.
  2347. //      It contains RequestID, CADNSName, CAName, and FriendlyName.
  2348. //      The data format is defined as, the first 4 bytes - pending request ID,
  2349. //      next 4 bytes - CADNSName size in characters including null-terminator
  2350. //      followed by CADNSName string with null-terminator,
  2351. //      next 4 bytes - CAName size in characters including null-terminator
  2352. //      followed by CAName string with null-terminator,
  2353. //      next 4 bytes - FriendlyName size in characters including null-terminator
  2354. //      followed by FriendlyName string with null-terminator.
  2355. //
  2356. //      CERT_DATE_STAMP_PROP_ID - contains the time when added to the store
  2357. //      by an admin tool. pvData points to a CRYPT_DATA_BLOB containing
  2358. //      the FILETIME.
  2359. //
  2360. //      CERT_RENEWAL_PROP_ID - contains the hash of renewed certificate
  2361. //
  2362. //  For all the other PROP_IDs: an encoded PCRYPT_DATA_BLOB is passed in pvData.
  2363. //
  2364. //  If the property already exists, then, the old value is deleted and silently
  2365. //  replaced. Setting, pvData to NULL, deletes the property.
  2366. //
  2367. //  CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG can be set to ignore any
  2368. //  provider write errors and always update the cached context's property.
  2369. //--------------------------------------------------------------------------
  2370. WINCRYPT32API
  2371. BOOL
  2372. WINAPI
  2373. CertSetCertificateContextProperty(
  2374.     IN PCCERT_CONTEXT pCertContext,
  2375.     IN DWORD dwPropId,
  2376.     IN DWORD dwFlags,
  2377.     IN const void *pvData
  2378.     );
  2379. // Set this flag to ignore any store provider write errors and always update
  2380. // the cached context's property
  2381. #define CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG     0x80000000
  2382. // Set this flag to inhibit the persisting of this property
  2383. #define CERT_SET_PROPERTY_INHIBIT_PERSIST_FLAG          0x40000000
  2384. //+-------------------------------------------------------------------------
  2385. //  Get the property for the specified certificate context.
  2386. //
  2387. //  For CERT_KEY_PROV_HANDLE_PROP_ID, pvData points to a HCRYPTPROV.
  2388. //
  2389. //  For CERT_KEY_PROV_INFO_PROP_ID, pvData points to a CRYPT_KEY_PROV_INFO structure.
  2390. //  Elements pointed to by fields in the pvData structure follow the
  2391. //  structure. Therefore, *pcbData may exceed the size of the structure.
  2392. //
  2393. //  For CERT_KEY_CONTEXT_PROP_ID, pvData points to a CERT_KEY_CONTEXT structure.
  2394. //
  2395. //  For CERT_KEY_SPEC_PROP_ID, pvData points to a DWORD containing the KeySpec.
  2396. //  If the CERT_KEY_CONTEXT_PROP_ID exists, the KeySpec is obtained from there.
  2397. //  Otherwise, if the CERT_KEY_PROV_INFO_PROP_ID exists, its the source
  2398. //  of the KeySpec.
  2399. //
  2400. //  For CERT_SHA1_HASH_PROP_ID or CERT_MD5_HASH_PROP_ID, if the hash
  2401. //  doesn't already exist, then, its computed via CryptHashCertificate()
  2402. //  and then set. pvData points to the computed hash. Normally, the length
  2403. //  is 20 bytes for SHA and 16 for MD5.
  2404. //
  2405. //  For CERT_SIGNATURE_HASH_PROP_ID, if the hash
  2406. //  doesn't already exist, then, its computed via CryptHashToBeSigned()
  2407. //  and then set. pvData points to the computed hash. Normally, the length
  2408. //  is 20 bytes for SHA and 16 for MD5.
  2409. //
  2410. //  For CERT_ACCESS_STATE_PROP_ID, pvData points to a DWORD containing the
  2411. //  access state flags. The appropriate CERT_ACCESS_STATE_*_FLAG's are set
  2412. //  in the returned DWORD. See the CERT_ACCESS_STATE_*_FLAG definitions
  2413. //  above. Note, this property is read only. It can't be set.
  2414. //
  2415. //  For CERT_KEY_IDENTIFIER_PROP_ID, if property doesn't already exist,
  2416. //  first searches for the szOID_SUBJECT_KEY_IDENTIFIER extension. Next,
  2417. //  does SHA1 hash of the certficate's SubjectPublicKeyInfo. pvData
  2418. //  points to the key identifier bytes. Normally, the length is 20 bytes.
  2419. //
  2420. //  For CERT_PUBKEY_ALG_PARA_PROP_ID, pvPara points to the ASN.1 encoded
  2421. //  PublicKey Algorithm Parameters. This property will only be set
  2422. //  for public keys supporting algorithm parameter inheritance and when the
  2423. //  parameters have been omitted from the encoded and signed certificate.
  2424. //
  2425. //  For CERT_DATE_STAMP_PROP_ID, pvPara points to a FILETIME updated by
  2426. //  an admin tool to indicate when the certificate was added to the store.
  2427. //
  2428. //  For all other PROP_IDs, pvData points to an encoded array of bytes.
  2429. //--------------------------------------------------------------------------
  2430. WINCRYPT32API
  2431. BOOL
  2432. WINAPI
  2433. CertGetCertificateContextProperty(
  2434.     IN PCCERT_CONTEXT pCertContext,
  2435.     IN DWORD dwPropId,
  2436.     OUT void *pvData,
  2437.     IN OUT DWORD *pcbData
  2438.     );
  2439. //+-------------------------------------------------------------------------
  2440. //  Enumerate the properties for the specified certificate context.
  2441. //
  2442. //  To get the first property, set dwPropId to 0. The ID of the first
  2443. //  property is returned. To get the next property, set dwPropId to the
  2444. //  ID returned by the last call. To enumerate all the properties continue
  2445. //  until 0 is returned.
  2446. //
  2447. //  CertGetCertificateContextProperty is called to get the property's data.
  2448. //
  2449. //  Note, since, the CERT_KEY_PROV_HANDLE_PROP_ID and CERT_KEY_SPEC_PROP_ID
  2450. //  properties are stored as fields in the CERT_KEY_CONTEXT_PROP_ID
  2451. //  property, they aren't enumerated individually.
  2452. //--------------------------------------------------------------------------
  2453. WINCRYPT32API
  2454. DWORD
  2455. WINAPI
  2456. CertEnumCertificateContextProperties(
  2457.     IN PCCERT_CONTEXT pCertContext,
  2458.     IN DWORD dwPropId
  2459.     );
  2460. //+-------------------------------------------------------------------------
  2461. //  Creates a CTL entry whose attributes are the certificate context's
  2462. //  properties.
  2463. //
  2464. //  The SubjectIdentifier in the CTL entry is the SHA1 hash of the certificate.
  2465. //
  2466. //  The certificate properties are added as attributes. The property attribute 
  2467. //  OID is the decimal PROP_ID preceded by szOID_CERT_PROP_ID_PREFIX. Each
  2468. //  property value is copied as a single attribute value.
  2469. //
  2470. //  Any additional attributes to be included in the CTL entry can be passed
  2471. //  in via the cOptAttr and rgOptAttr parameters.
  2472. //
  2473. //  CTL_ENTRY_FROM_PROP_CHAIN_FLAG can be set in dwFlags, to force the
  2474. //  inclusion of the chain building hash properties as attributes.
  2475. //--------------------------------------------------------------------------
  2476. WINCRYPT32API
  2477. BOOL
  2478. WINAPI
  2479. CertCreateCTLEntryFromCertificateContextProperties(
  2480.     IN PCCERT_CONTEXT pCertContext,
  2481.     IN DWORD cOptAttr,
  2482.     IN OPTIONAL PCRYPT_ATTRIBUTE rgOptAttr,
  2483.     IN DWORD dwFlags,
  2484.     IN OPTIONAL void *pvReserved,
  2485.     OUT OPTIONAL PCTL_ENTRY pCtlEntry,
  2486.     IN OUT DWORD *pcbCtlEntry
  2487.     );
  2488. // Set this flag to get and include the chain building hash properties
  2489. // as attributes in the CTL entry
  2490. #define CTL_ENTRY_FROM_PROP_CHAIN_FLAG                  0x1
  2491. //+-------------------------------------------------------------------------
  2492. //  Sets properties on the certificate context using the attributes in
  2493. //  the CTL entry.
  2494. //
  2495. //  The property attribute OID is the decimal PROP_ID preceded by
  2496. //  szOID_CERT_PROP_ID_PREFIX. Only attributes containing such an OID are
  2497. //  copied.
  2498. //
  2499. //  CERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAG may be set in dwFlags.
  2500. //--------------------------------------------------------------------------
  2501. WINCRYPT32API
  2502. BOOL
  2503. WINAPI
  2504. CertSetCertificateContextPropertiesFromCTLEntry(
  2505.     IN PCCERT_CONTEXT pCertContext,
  2506.     IN PCTL_ENTRY pCtlEntry,
  2507.     IN DWORD dwFlags
  2508.     );
  2509. //+-------------------------------------------------------------------------
  2510. //  Get the first or next CRL context from the store for the specified
  2511. //  issuer certificate. Perform the enabled verification checks on the CRL.
  2512. //
  2513. //  If the first or next CRL isn't found, NULL is returned.
  2514. //  Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT
  2515. //  must be freed by calling CertFreeCRLContext. However, the free must be
  2516. //  pPrevCrlContext on a subsequent call. CertDuplicateCRLContext
  2517. //  can be called to make a duplicate.
  2518. //
  2519. //  The pIssuerContext may have been obtained from this store, another store
  2520. //  or created by the caller application. When created by the caller, the
  2521. //  CertCreateCertificateContext function must have been called.
  2522. //
  2523. //  If pIssuerContext == NULL, finds all the CRLs in the store.
  2524. //
  2525. //  An issuer may have multiple CRLs. For example, it generates delta CRLs
  2526. //  using a X.509 v3 extension. pPrevCrlContext MUST BE NULL on the first
  2527. //  call to get the CRL. To get the next CRL for the issuer, the
  2528. //  pPrevCrlContext is set to the CRL_CONTEXT returned by a previous call.
  2529. //
  2530. //  NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by
  2531. //  this function, even for an error.
  2532. //
  2533. //  The following flags can be set in *pdwFlags to enable verification checks
  2534. //  on the returned CRL:
  2535. //      CERT_STORE_SIGNATURE_FLAG     - use the public key in the
  2536. //                                      issuer's certificate to verify the
  2537. //                                      signature on the returned CRL.
  2538. //                                      Note, if pIssuerContext->hCertStore ==
  2539. //                                      hCertStore, the store provider might
  2540. //                                      be able to eliminate a redo of
  2541. //                                      the signature verify.
  2542. //      CERT_STORE_TIME_VALIDITY_FLAG - get the current time and verify that
  2543. //                                      its within the CRL's ThisUpdate and
  2544. //                                      NextUpdate validity period.
  2545. //      CERT_STORE_BASE_CRL_FLAG      - get base CRL.
  2546. //      CERT_STORE_DELTA_CRL_FLAG     - get delta CRL.
  2547. //
  2548. //  If only one of CERT_STORE_BASE_CRL_FLAG or CERT_STORE_DELTA_CRL_FLAG is
  2549. //  set, then, only returns either a base or delta CRL. In any case, the
  2550. //  appropriate base or delta flag will be cleared upon returned. If both
  2551. //  flags are set, then, only one of flags will be cleared.
  2552. //
  2553. //  If an enabled verification check fails, then, its flag is set upon return.
  2554. //
  2555. //  If pIssuerContext == NULL, then, an enabled CERT_STORE_SIGNATURE_FLAG
  2556. //  always fails and the CERT_STORE_NO_ISSUER_FLAG is also set.
  2557. //
  2558. //  For a verification check failure, a pointer to the first or next
  2559. //  CRL_CONTEXT is still returned and SetLastError isn't updated.
  2560. //--------------------------------------------------------------------------
  2561. WINCRYPT32API
  2562. PCCRL_CONTEXT
  2563. WINAPI
  2564. CertGetCRLFromStore(
  2565.     IN HCERTSTORE hCertStore,
  2566.     IN OPTIONAL PCCERT_CONTEXT pIssuerContext,
  2567.     IN PCCRL_CONTEXT pPrevCrlContext,
  2568.     IN OUT DWORD *pdwFlags
  2569.     );
  2570. //+-------------------------------------------------------------------------
  2571. //  Enumerate the CRL contexts in the store.
  2572. //
  2573. //  If a CRL isn't found, NULL is returned.
  2574. //  Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT
  2575. //  must be freed by calling CertFreeCRLContext or is freed when passed as the
  2576. //  pPrevCrlContext on a subsequent call. CertDuplicateCRLContext
  2577. //  can be called to make a duplicate.
  2578. //
  2579. //  pPrevCrlContext MUST BE NULL to enumerate the first
  2580. //  CRL in the store. Successive CRLs are enumerated by setting
  2581. //  pPrevCrlContext to the CRL_CONTEXT returned by a previous call.
  2582. //
  2583. //  NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by
  2584. //  this function, even for an error.
  2585. //--------------------------------------------------------------------------
  2586. WINCRYPT32API
  2587. PCCRL_CONTEXT
  2588. WINAPI
  2589. CertEnumCRLsInStore(
  2590.     IN HCERTSTORE hCertStore,
  2591.     IN PCCRL_CONTEXT pPrevCrlContext
  2592.     );
  2593. //+-------------------------------------------------------------------------
  2594. //  Find the first or next CRL context in the store.
  2595. //
  2596. //  The CRL is found according to the dwFindType and its pvFindPara.
  2597. //  See below for a list of the find types and its parameters.
  2598. //
  2599. //  Currently dwFindFlags isn't used and must be set to 0.
  2600. //
  2601. //  Usage of dwCertEncodingType depends on the dwFindType.
  2602. //
  2603. //  If the first or next CRL isn't found, NULL is returned.
  2604. //  Otherwise, a pointer to a read only CRL_CONTEXT is returned. CRL_CONTEXT
  2605. //  must be freed by calling CertFreeCRLContext or is freed when passed as the
  2606. //  pPrevCrlContext on a subsequent call. CertDuplicateCRLContext
  2607. //  can be called to make a duplicate.
  2608. //
  2609. //  pPrevCrlContext MUST BE NULL on the first
  2610. //  call to find the CRL. To find the next CRL, the
  2611. //  pPrevCrlContext is set to the CRL_CONTEXT returned by a previous call.
  2612. //
  2613. //  NOTE: a NON-NULL pPrevCrlContext is always CertFreeCRLContext'ed by
  2614. //  this function, even for an error.
  2615. //--------------------------------------------------------------------------
  2616. WINCRYPT32API
  2617. PCCRL_CONTEXT
  2618. WINAPI
  2619. CertFindCRLInStore(
  2620.     IN HCERTSTORE hCertStore,
  2621.     IN DWORD dwCertEncodingType,
  2622.     IN DWORD dwFindFlags,
  2623.     IN DWORD dwFindType,
  2624.     IN const void *pvFindPara,
  2625.     IN PCCRL_CONTEXT pPrevCrlContext
  2626.     );
  2627. #define CRL_FIND_ANY                0
  2628. #define CRL_FIND_ISSUED_BY          1
  2629. #define CRL_FIND_EXISTING           2
  2630. #define CRL_FIND_ISSUED_FOR         3
  2631. //+-------------------------------------------------------------------------
  2632. //  CRL_FIND_ANY
  2633. //
  2634. //  Find any CRL.
  2635. //
  2636. //  pvFindPara isn't used.
  2637. //--------------------------------------------------------------------------
  2638. //+-------------------------------------------------------------------------
  2639. //  CRL_FIND_ISSUED_BY
  2640. //
  2641. //  Find CRL matching the specified issuer.
  2642. //
  2643. //  pvFindPara is the PCCERT_CONTEXT of the CRL issuer. May be NULL to
  2644. //  match any issuer.
  2645. //
  2646. //  By default, only does issuer name matching. The following flags can be
  2647. //  set in dwFindFlags to do additional filtering.
  2648. //
  2649. //  If CRL_FIND_ISSUED_BY_AKI_FLAG is set in dwFindFlags, then, checks if the
  2650. //  CRL has an Authority Key Identifier (AKI) extension. If the CRL has an
  2651. //  AKI, then, only returns a CRL whose AKI matches the issuer.
  2652. //
  2653. //  Note, the AKI extension has the following OID:
  2654. //  szOID_AUTHORITY_KEY_IDENTIFIER2 and its corresponding data structure.
  2655. //
  2656. //  If CRL_FIND_ISSUED_BY_SIGNATURE_FLAG is set in dwFindFlags, then,
  2657. //  uses the public key in the issuer's certificate to verify the
  2658. //  signature on the CRL. Only returns a CRL having a valid signature.
  2659. //
  2660. //  If CRL_FIND_ISSUED_BY_DELTA_FLAG is set in dwFindFlags, then, only
  2661. //  returns a delta CRL.
  2662. //
  2663. //  If CRL_FIND_ISSUED_BY_BASE_FLAG is set in dwFindFlags, then, only
  2664. //  returns a base CRL.
  2665. //--------------------------------------------------------------------------
  2666. #define CRL_FIND_ISSUED_BY_AKI_FLAG         0x1
  2667. #define CRL_FIND_ISSUED_BY_SIGNATURE_FLAG   0x2
  2668. #define CRL_FIND_ISSUED_BY_DELTA_FLAG       0x4
  2669. #define CRL_FIND_ISSUED_BY_BASE_FLAG        0x8
  2670. //+-------------------------------------------------------------------------
  2671. //  CRL_FIND_EXISTING
  2672. //
  2673. //  Find existing CRL in the store.
  2674. //
  2675. //  pvFindPara is the PCCRL_CONTEXT of the CRL to check if it already
  2676. //  exists in the store.
  2677. //--------------------------------------------------------------------------
  2678. //+-------------------------------------------------------------------------
  2679. //  CRL_FIND_ISSUED_FOR
  2680. //
  2681. //  Find CRL for the specified subject and its issuer.
  2682. //
  2683. //  pvFindPara points to the following CRL_FIND_ISSUED_FOR_PARA which contains
  2684. //  both the subject and issuer certificates. Not optional.
  2685. //
  2686. //  The subject's issuer name is used to match the CRL's issuer name. Otherwise,
  2687. //  the issuer's certificate is used the same as in the above
  2688. //  CRL_FIND_ISSUED_BY.
  2689. //
  2690. //  Note, when cross certificates are used, the subject name in the issuer's
  2691. //  certificate may not match the issuer name in the subject certificate and
  2692. //  its corresponding CRL.
  2693. //
  2694. //  All of the above CRL_FIND_ISSUED_BY_*_FLAGS apply to this find type.
  2695. //--------------------------------------------------------------------------
  2696. typedef struct _CRL_FIND_ISSUED_FOR_PARA {
  2697.     PCCERT_CONTEXT              pSubjectCert;
  2698.     PCCERT_CONTEXT              pIssuerCert;
  2699. } CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA;
  2700. //+-------------------------------------------------------------------------
  2701. //  Duplicate a CRL context
  2702. //--------------------------------------------------------------------------
  2703. WINCRYPT32API
  2704. PCCRL_CONTEXT
  2705. WINAPI
  2706. CertDuplicateCRLContext(
  2707.     IN PCCRL_CONTEXT pCrlContext
  2708.     );
  2709. //+-------------------------------------------------------------------------
  2710. //  Create a CRL context from the encoded CRL. The created
  2711. //  context isn't put in a store.
  2712. //
  2713. //  Makes a copy of the encoded CRL in the created context.
  2714. //
  2715. //  If unable to decode and create the CRL context, NULL is returned.
  2716. //  Otherwise, a pointer to a read only CRL_CONTEXT is returned.
  2717. //  CRL_CONTEXT must be freed by calling CertFreeCRLContext.
  2718. //  CertDuplicateCRLContext can be called to make a duplicate.
  2719. //
  2720. //  CertSetCRLContextProperty and CertGetCRLContextProperty can be called
  2721. //  to store properties for the CRL.
  2722. //--------------------------------------------------------------------------
  2723. WINCRYPT32API
  2724. PCCRL_CONTEXT
  2725. WINAPI
  2726. CertCreateCRLContext(
  2727.     IN DWORD dwCertEncodingType,
  2728.     IN const BYTE *pbCrlEncoded,
  2729.     IN DWORD cbCrlEncoded
  2730.     );
  2731. //+-------------------------------------------------------------------------
  2732. //  Free a CRL context
  2733. //
  2734. //  There needs to be a corresponding free for each context obtained by a
  2735. //  get, duplicate or create.
  2736. //--------------------------------------------------------------------------
  2737. WINCRYPT32API
  2738. BOOL
  2739. WINAPI
  2740. CertFreeCRLContext(
  2741.     IN PCCRL_CONTEXT pCrlContext
  2742.     );
  2743. //+-------------------------------------------------------------------------
  2744. //  Set the property for the specified CRL context.
  2745. //
  2746. //  Same Property Ids and semantics as CertSetCertificateContextProperty.
  2747. //--------------------------------------------------------------------------
  2748. WINCRYPT32API
  2749. BOOL
  2750. WINAPI
  2751. CertSetCRLContextProperty(
  2752.     IN PCCRL_CONTEXT pCrlContext,
  2753.     IN DWORD dwPropId,
  2754.     IN DWORD dwFlags,
  2755.     IN const void *pvData
  2756.     );
  2757. //+-------------------------------------------------------------------------
  2758. //  Get the property for the specified CRL context.
  2759. //
  2760. //  Same Property Ids and semantics as CertGetCertificateContextProperty.
  2761. //
  2762. //  CERT_SHA1_HASH_PROP_ID, CERT_MD5_HASH_PROP_ID or
  2763. //  CERT_SIGNATURE_HASH_PROP_ID is the predefined property of most interest.
  2764. //--------------------------------------------------------------------------
  2765. WINCRYPT32API
  2766. BOOL
  2767. WINAPI
  2768. CertGetCRLContextProperty(
  2769.     IN PCCRL_CONTEXT pCrlContext,
  2770.     IN DWORD dwPropId,
  2771.     OUT void *pvData,
  2772.     IN OUT DWORD *pcbData
  2773.     );
  2774. //+-------------------------------------------------------------------------
  2775. //  Enumerate the properties for the specified CRL context.
  2776. //
  2777. //  To get the first property, set dwPropId to 0. The ID of the first
  2778. //  property is returned. To get the next property, set dwPropId to the
  2779. //  ID returned by the last call. To enumerate all the properties continue
  2780. //  until 0 is returned.
  2781. //
  2782. //  CertGetCRLContextProperty is called to get the property's data.
  2783. //--------------------------------------------------------------------------
  2784. WINCRYPT32API
  2785. DWORD
  2786. WINAPI
  2787. CertEnumCRLContextProperties(
  2788.     IN PCCRL_CONTEXT pCrlContext,
  2789.     IN DWORD dwPropId
  2790.     );
  2791. //+-------------------------------------------------------------------------
  2792. //  Search the CRL's list of entries for the specified certificate.
  2793. //
  2794. //  TRUE is returned if we were able to search the list. Otherwise, FALSE is
  2795. //  returned,
  2796. //
  2797. //  For success, if the certificate was found in the list, *ppCrlEntry is
  2798. //  updated with a pointer to the entry. Otherwise, *ppCrlEntry is set to NULL.
  2799. //  The returned entry isn't allocated and must not be freed.
  2800. //
  2801. //  dwFlags and pvReserved currently aren't used and must be set to 0 or NULL.
  2802. //--------------------------------------------------------------------------
  2803. WINCRYPT32API
  2804. BOOL
  2805. WINAPI
  2806. CertFindCertificateInCRL(
  2807.     IN PCCERT_CONTEXT pCert,
  2808.     IN PCCRL_CONTEXT pCrlContext,
  2809.     IN DWORD dwFlags,
  2810.     IN OPTIONAL void *pvReserved,
  2811.     OUT PCRL_ENTRY *ppCrlEntry
  2812.     );
  2813. //+-------------------------------------------------------------------------
  2814. //  Is the specified CRL valid for the certificate.
  2815. //
  2816. //  Returns TRUE if the CRL's list of entries would contain the certificate
  2817. //  if it was revoked. Note, doesn't check that the certificate is in the
  2818. //  list of entries.
  2819. //
  2820. //  If the CRL has an Issuing Distribution Point (IDP) extension, checks
  2821. //  that it's valid for the subject certificate.
  2822. //
  2823. //  dwFlags and pvReserved currently aren't used and must be set to 0 and NULL.
  2824. //--------------------------------------------------------------------------
  2825. WINCRYPT32API
  2826. BOOL
  2827. WINAPI
  2828. CertIsValidCRLForCertificate(
  2829.     IN PCCERT_CONTEXT pCert,
  2830.     IN PCCRL_CONTEXT pCrl,
  2831.     IN DWORD dwFlags,
  2832.     IN void *pvReserved
  2833.     );
  2834. //+-------------------------------------------------------------------------
  2835. // Add certificate/CRL, encoded, context or element disposition values.
  2836. //--------------------------------------------------------------------------
  2837. #define CERT_STORE_ADD_NEW                                  1
  2838. #define CERT_STORE_ADD_USE_EXISTING                         2
  2839. #define CERT_STORE_ADD_REPLACE_EXISTING                     3
  2840. #define CERT_STORE_ADD_ALWAYS                               4
  2841. #define CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES  5
  2842. #define CERT_STORE_ADD_NEWER                                6
  2843. #define CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES             7
  2844. //+-------------------------------------------------------------------------
  2845. //  Add the encoded certificate to the store according to the specified
  2846. //  disposition action.
  2847. //
  2848. //  Makes a copy of the encoded certificate before adding to the store.
  2849. //
  2850. //  dwAddDispostion specifies the action to take if the certificate
  2851. //  already exists in the store. This parameter must be one of the following
  2852. //  values:
  2853. //    CERT_STORE_ADD_NEW
  2854. //      Fails if the certificate already exists in the store. LastError
  2855. //      is set to CRYPT_E_EXISTS.
  2856. //    CERT_STORE_ADD_USE_EXISTING
  2857. //      If the certifcate already exists, then, its used and if ppCertContext
  2858. //      is non-NULL, the existing context is duplicated.
  2859. //    CERT_STORE_ADD_REPLACE_EXISTING
  2860. //      If the certificate already exists, then, the existing certificate
  2861. //      context is deleted before creating and adding the new context.
  2862. //    CERT_STORE_ADD_ALWAYS
  2863. //      No check is made to see if the certificate already exists. A
  2864. //      new certificate context is always created. This may lead to
  2865. //      duplicates in the store.
  2866. //    CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES
  2867. //      If the certificate already exists, then, its used.
  2868. //    CERT_STORE_ADD_NEWER
  2869. //      Fails if the certificate already exists in the store AND the NotBefore
  2870. //      time of the existing certificate is equal to or greater than the
  2871. //      NotBefore time of the new certificate being added. LastError
  2872. //      is set to CRYPT_E_EXISTS.
  2873. //
  2874. //      If an older certificate is replaced, same as
  2875. //      CERT_STORE_ADD_REPLACE_EXISTING.
  2876. //
  2877. //      For CRLs or CTLs compares the ThisUpdate times.
  2878. //
  2879. //    CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES
  2880. //      Same as CERT_STORE_ADD_NEWER. However, if an older certificate is
  2881. //      replaced, same as CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES.
  2882. //
  2883. //  CertGetSubjectCertificateFromStore is called to determine if the
  2884. //  certificate already exists in the store.
  2885. //
  2886. //  ppCertContext can be NULL, indicating the caller isn't interested
  2887. //  in getting the CERT_CONTEXT of the added or existing certificate.
  2888. //--------------------------------------------------------------------------
  2889. WINCRYPT32API
  2890. BOOL
  2891. WINAPI
  2892. CertAddEncodedCertificateToStore(
  2893.     IN HCERTSTORE hCertStore,
  2894.     IN DWORD dwCertEncodingType,
  2895.     IN const BYTE *pbCertEncoded,
  2896.     IN DWORD cbCertEncoded,
  2897.     IN DWORD dwAddDisposition,
  2898.     OUT OPTIONAL PCCERT_CONTEXT *ppCertContext
  2899.     );
  2900. //+-------------------------------------------------------------------------
  2901. //  Add the certificate context to the store according to the specified
  2902. //  disposition action.
  2903. //
  2904. //  In addition to the encoded certificate, the context's properties are