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

模拟服务器

开发平台:

C/C++

  1. //  cbSize must be set to the sizeof(CRYPT_SIGN_MESSAGE_PARA) or else
  2. //  LastError will be updated with E_INVALIDARG.
  3. //
  4. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  5. //
  6. //  dwFlags normally is set to 0. However, if the encoded output
  7. //  is to be a CMSG_SIGNED inner content of an outer cryptographic message,
  8. //  such as a CMSG_ENVELOPED, then, the CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG
  9. //  should be set. If not set, then it would be encoded as an inner content
  10. //  type of CMSG_DATA.
  11. //
  12. //  dwInnerContentType is normally set to 0. It needs to be set if the
  13. //  ToBeSigned input is the encoded output of another cryptographic
  14. //  message, such as, an CMSG_ENVELOPED. When set, it's one of the cryptographic
  15. //  message types, for example, CMSG_ENVELOPED.
  16. //
  17. //  If the inner content of a nested cryptographic message is data (CMSG_DATA
  18. //  the default), then, neither dwFlags or dwInnerContentType need to be set.
  19. //
  20. //  For CMS messages, CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG may be
  21. //  set to encapsulate nonData inner content within an OCTET STRING.
  22. //
  23. //  For CMS messages, CRYPT_MESSAGE_KEYID_SIGNER_FLAG may be set to identify
  24. //  signers by their Key Identifier and not their Issuer and Serial Number.
  25. //
  26. //  The CRYPT_MESSAGE_SILENT_KEYSET_FLAG can be set to suppress any UI by the
  27. //  CSP. See CryptAcquireContext's CRYPT_SILENT flag for more details.
  28. //
  29. //  If HashEncryptionAlgorithm is present and not NULL its used instead of
  30. //  the SigningCert's PublicKeyInfo.Algorithm.
  31. //
  32. //  Note, for RSA, the hash encryption algorithm is normally the same as
  33. //  the public key algorithm. For DSA, the hash encryption algorithm is
  34. //  normally a DSS signature algorithm.
  35. //
  36. //  pvHashEncryptionAuxInfo currently isn't used and must be set to NULL if
  37. //  present in the data structure.
  38. //--------------------------------------------------------------------------
  39. typedef struct _CRYPT_SIGN_MESSAGE_PARA {
  40.     DWORD                       cbSize;
  41.     DWORD                       dwMsgEncodingType;
  42.     PCCERT_CONTEXT              pSigningCert;
  43.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  44.     void                        *pvHashAuxInfo;
  45.     DWORD                       cMsgCert;
  46.     PCCERT_CONTEXT              *rgpMsgCert;
  47.     DWORD                       cMsgCrl;
  48.     PCCRL_CONTEXT               *rgpMsgCrl;
  49.     DWORD                       cAuthAttr;
  50.     PCRYPT_ATTRIBUTE            rgAuthAttr;
  51.     DWORD                       cUnauthAttr;
  52.     PCRYPT_ATTRIBUTE            rgUnauthAttr;
  53.     DWORD                       dwFlags;
  54.     DWORD                       dwInnerContentType;
  55. #ifdef CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS
  56.     CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
  57.     void                        *pvHashEncryptionAuxInfo;
  58. #endif
  59. } CRYPT_SIGN_MESSAGE_PARA, *PCRYPT_SIGN_MESSAGE_PARA;
  60. #define CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG         0x00000001
  61. // When set, nonData type inner content is encapsulated within an
  62. // OCTET STRING
  63. #define CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG 0x00000002
  64. // When set, signers are identified by their Key Identifier and not
  65. // their Issuer and Serial Number.
  66. #define CRYPT_MESSAGE_KEYID_SIGNER_FLAG             0x00000004
  67. // When set, suppresses any UI by the CSP.
  68. // See CryptAcquireContext's CRYPT_SILENT flag for more details.
  69. #define CRYPT_MESSAGE_SILENT_KEYSET_FLAG            0x00000040
  70. //+-------------------------------------------------------------------------
  71. //  The CRYPT_VERIFY_MESSAGE_PARA are used to verify signed messages.
  72. //
  73. //  hCryptProv is used to do hashing and signature verification.
  74. //
  75. //  The dwCertEncodingType specifies the encoding type of the certificates
  76. //  and/or CRLs in the message.
  77. //
  78. //  pfnGetSignerCertificate is called to get and verify the message signer's
  79. //  certificate.
  80. //
  81. //  cbSize must be set to the sizeof(CRYPT_VERIFY_MESSAGE_PARA) or else
  82. //  LastError will be updated with E_INVALIDARG.
  83. //--------------------------------------------------------------------------
  84. typedef struct _CRYPT_VERIFY_MESSAGE_PARA {
  85.     DWORD                               cbSize;
  86.     DWORD                               dwMsgAndCertEncodingType;
  87.     HCRYPTPROV                          hCryptProv;
  88.     PFN_CRYPT_GET_SIGNER_CERTIFICATE    pfnGetSignerCertificate;
  89.     void                                *pvGetArg;
  90. } CRYPT_VERIFY_MESSAGE_PARA, *PCRYPT_VERIFY_MESSAGE_PARA;
  91. //+-------------------------------------------------------------------------
  92. //  The CRYPT_ENCRYPT_MESSAGE_PARA are used for encrypting messages.
  93. //
  94. //  hCryptProv is used to do content encryption, recipient key
  95. //  encryption, and recipient key export. Its private key
  96. //  isn't used.
  97. //
  98. //  Currently, pvEncryptionAuxInfo is only defined for RC2 or RC4 encryption
  99. //  algorithms. Otherwise, its not used and must be set to NULL.
  100. //  See CMSG_RC2_AUX_INFO for the RC2 encryption algorithms.
  101. //  See CMSG_RC4_AUX_INFO for the RC4 encryption algorithms.
  102. //
  103. //  To enable SP3 compatible encryption, pvEncryptionAuxInfo should point to
  104. //  a CMSG_SP3_COMPATIBLE_AUX_INFO data structure.
  105. //
  106. //  cbSize must be set to the sizeof(CRYPT_ENCRYPT_MESSAGE_PARA) or else
  107. //  LastError will be updated with E_INVALIDARG.
  108. //
  109. //  dwFlags normally is set to 0. However, if the encoded output
  110. //  is to be a CMSG_ENVELOPED inner content of an outer cryptographic message,
  111. //  such as a CMSG_SIGNED, then, the CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAG
  112. //  should be set. If not set, then it would be encoded as an inner content
  113. //  type of CMSG_DATA.
  114. //
  115. //  dwInnerContentType is normally set to 0. It needs to be set if the
  116. //  ToBeEncrypted input is the encoded output of another cryptographic
  117. //  message, such as, an CMSG_SIGNED. When set, it's one of the cryptographic
  118. //  message types, for example, CMSG_SIGNED.
  119. //
  120. //  If the inner content of a nested cryptographic message is data (CMSG_DATA
  121. //  the default), then, neither dwFlags or dwInnerContentType need to be set.
  122. //
  123. //  For CMS messages, CRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAG may be
  124. //  set to encapsulate nonData inner content within an OCTET STRING before
  125. //  encrypting.
  126. //
  127. //  For CMS messages, CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG may be set to identify
  128. //  recipients by their Key Identifier and not their Issuer and Serial Number.
  129. //--------------------------------------------------------------------------
  130. typedef struct _CRYPT_ENCRYPT_MESSAGE_PARA {
  131.     DWORD                       cbSize;
  132.     DWORD                       dwMsgEncodingType;
  133.     HCRYPTPROV                  hCryptProv;
  134.     CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
  135.     void                        *pvEncryptionAuxInfo;
  136.     DWORD                       dwFlags;
  137.     DWORD                       dwInnerContentType;
  138. } CRYPT_ENCRYPT_MESSAGE_PARA, *PCRYPT_ENCRYPT_MESSAGE_PARA;
  139. // When set, recipients are identified by their Key Identifier and not
  140. // their Issuer and Serial Number.
  141. #define CRYPT_MESSAGE_KEYID_RECIPIENT_FLAG          0x4
  142. //+-------------------------------------------------------------------------
  143. //  The CRYPT_DECRYPT_MESSAGE_PARA are used for decrypting messages.
  144. //
  145. //  The CertContext to use for decrypting a message is obtained from one
  146. //  of the specified cert stores. An encrypted message can have one or
  147. //  more recipients. The recipients are identified by their CertId (Issuer
  148. //  and SerialNumber). The cert stores are searched to find the CertContext
  149. //  corresponding to the CertId.
  150. //
  151. //  For CMS, the recipients may also be identified by their KeyId.
  152. //  CMS also allows Key Agreement (Diffie Hellman) in addition to
  153. //  Key Transport (RSA) recipients.
  154. //
  155. //  Only CertContexts in the store with either
  156. //  the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID set
  157. //  can be used. Either property specifies the private exchange key to use.
  158. //
  159. //  cbSize must be set to the sizeof(CRYPT_DECRYPT_MESSAGE_PARA) or else
  160. //  LastError will be updated with E_INVALIDARG.
  161. //--------------------------------------------------------------------------
  162. typedef struct _CRYPT_DECRYPT_MESSAGE_PARA {
  163.     DWORD                   cbSize;
  164.     DWORD                   dwMsgAndCertEncodingType;
  165.     DWORD                   cCertStore;
  166.     HCERTSTORE              *rghCertStore;
  167. #ifdef CRYPT_DECRYPT_MESSAGE_PARA_HAS_EXTRA_FIELDS
  168. // The above defined, CRYPT_MESSAGE_SILENT_KEYSET_FLAG, can be set to
  169. // suppress UI by the CSP.  See CryptAcquireContext's CRYPT_SILENT
  170. // flag for more details.
  171.     DWORD                   dwFlags;
  172. #endif
  173. } CRYPT_DECRYPT_MESSAGE_PARA, *PCRYPT_DECRYPT_MESSAGE_PARA;
  174. //+-------------------------------------------------------------------------
  175. //  The CRYPT_HASH_MESSAGE_PARA are used for hashing or unhashing
  176. //  messages.
  177. //
  178. //  hCryptProv is used to compute the hash.
  179. //
  180. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  181. //
  182. //  cbSize must be set to the sizeof(CRYPT_HASH_MESSAGE_PARA) or else
  183. //  LastError will be updated with E_INVALIDARG.
  184. //--------------------------------------------------------------------------
  185. typedef struct _CRYPT_HASH_MESSAGE_PARA {
  186.     DWORD                       cbSize;
  187.     DWORD                       dwMsgEncodingType;
  188.     HCRYPTPROV                  hCryptProv;
  189.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  190.     void                        *pvHashAuxInfo;
  191. } CRYPT_HASH_MESSAGE_PARA, *PCRYPT_HASH_MESSAGE_PARA;
  192. //+-------------------------------------------------------------------------
  193. //  The CRYPT_KEY_SIGN_MESSAGE_PARA are used for signing messages until a
  194. //  certificate has been created for the signature key.
  195. //
  196. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  197. //
  198. //  If PubKeyAlgorithm isn't set, defaults to szOID_RSA_RSA.
  199. //
  200. //  cbSize must be set to the sizeof(CRYPT_KEY_SIGN_MESSAGE_PARA) or else
  201. //  LastError will be updated with E_INVALIDARG.
  202. //--------------------------------------------------------------------------
  203. typedef struct _CRYPT_KEY_SIGN_MESSAGE_PARA {
  204.     DWORD                       cbSize;
  205.     DWORD                       dwMsgAndCertEncodingType;
  206.     HCRYPTPROV                  hCryptProv;
  207.     DWORD                       dwKeySpec;
  208.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  209.     void                        *pvHashAuxInfo;
  210.     CRYPT_ALGORITHM_IDENTIFIER  PubKeyAlgorithm;
  211. } CRYPT_KEY_SIGN_MESSAGE_PARA, *PCRYPT_KEY_SIGN_MESSAGE_PARA;
  212. //+-------------------------------------------------------------------------
  213. //  The CRYPT_KEY_VERIFY_MESSAGE_PARA are used to verify signed messages without
  214. //  a certificate for the signer.
  215. //
  216. //  Normally used until a certificate has been created for the key.
  217. //
  218. //  hCryptProv is used to do hashing and signature verification.
  219. //
  220. //  cbSize must be set to the sizeof(CRYPT_KEY_VERIFY_MESSAGE_PARA) or else
  221. //  LastError will be updated with E_INVALIDARG.
  222. //--------------------------------------------------------------------------
  223. typedef struct _CRYPT_KEY_VERIFY_MESSAGE_PARA {
  224.     DWORD                   cbSize;
  225.     DWORD                   dwMsgEncodingType;
  226.     HCRYPTPROV              hCryptProv;
  227. } CRYPT_KEY_VERIFY_MESSAGE_PARA, *PCRYPT_KEY_VERIFY_MESSAGE_PARA;
  228. //+-------------------------------------------------------------------------
  229. //  Sign the message.
  230. //
  231. //  If fDetachedSignature is TRUE, the "to be signed" content isn't included
  232. //  in the encoded signed blob.
  233. //--------------------------------------------------------------------------
  234. WINCRYPT32API
  235. BOOL
  236. WINAPI
  237. CryptSignMessage(
  238.     IN PCRYPT_SIGN_MESSAGE_PARA pSignPara,
  239.     IN BOOL fDetachedSignature,
  240.     IN DWORD cToBeSigned,
  241.     IN const BYTE *rgpbToBeSigned[],
  242.     IN DWORD rgcbToBeSigned[],
  243.     OUT BYTE *pbSignedBlob,
  244.     IN OUT DWORD *pcbSignedBlob
  245.     );
  246. //+-------------------------------------------------------------------------
  247. //  Verify a signed message.
  248. //
  249. //  If pbDecoded == NULL, then, *pcbDecoded is implicitly set to 0 on input.
  250. //  For *pcbDecoded == 0 && ppSignerCert == NULL on input, the signer isn't
  251. //  verified.
  252. //
  253. //  A message might have more than one signer. Set dwSignerIndex to iterate
  254. //  through all the signers. dwSignerIndex == 0 selects the first signer.
  255. //
  256. //  pVerifyPara's pfnGetSignerCertificate is called to get the signer's
  257. //  certificate.
  258. //
  259. //  For a verified signer and message, *ppSignerCert is updated
  260. //  with the CertContext of the signer. It must be freed by calling
  261. //  CertFreeCertificateContext. Otherwise, *ppSignerCert is set to NULL.
  262. //
  263. //  ppSignerCert can be NULL, indicating the caller isn't interested
  264. //  in getting the CertContext of the signer.
  265. //
  266. //  pcbDecoded can be NULL, indicating the caller isn't interested in getting
  267. //  the decoded content. Furthermore, if the message doesn't contain any
  268. //  content or signers, then, pcbDecoded must be set to NULL, to allow the
  269. //  pVerifyPara->pfnGetCertificate to be called. Normally, this would be
  270. //  the case when the signed message contains only certficates and CRLs.
  271. //  If pcbDecoded is NULL and the message doesn't have the indicated signer,
  272. //  pfnGetCertificate is called with pSignerId set to NULL.
  273. //
  274. //  If the message doesn't contain any signers || dwSignerIndex > message's
  275. //  SignerCount, then, an error is returned with LastError set to
  276. //  CRYPT_E_NO_SIGNER. Also, for CRYPT_E_NO_SIGNER, pfnGetSignerCertificate
  277. //  is still called with pSignerId set to NULL.
  278. //
  279. //  Note, an alternative way to get the certificates and CRLs from a
  280. //  signed message is to call CryptGetMessageCertificates.
  281. //--------------------------------------------------------------------------
  282. WINCRYPT32API
  283. BOOL
  284. WINAPI
  285. CryptVerifyMessageSignature(
  286.     IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  287.     IN DWORD dwSignerIndex,
  288.     IN const BYTE *pbSignedBlob,
  289.     IN DWORD cbSignedBlob,
  290.     OUT BYTE OPTIONAL *pbDecoded,
  291.     IN OUT OPTIONAL DWORD *pcbDecoded,
  292.     OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert
  293.     );
  294. //+-------------------------------------------------------------------------
  295. //  Returns the count of signers in the signed message. For no signers, returns
  296. //  0. For an error returns -1 with LastError updated accordingly.
  297. //--------------------------------------------------------------------------
  298. WINCRYPT32API
  299. LONG
  300. WINAPI
  301. CryptGetMessageSignerCount(
  302.     IN DWORD dwMsgEncodingType,
  303.     IN const BYTE *pbSignedBlob,
  304.     IN DWORD cbSignedBlob
  305.     );
  306. //+-------------------------------------------------------------------------
  307. //  Returns the cert store containing the message's certs and CRLs.
  308. //  For an error, returns NULL with LastError updated.
  309. //--------------------------------------------------------------------------
  310. WINCRYPT32API
  311. HCERTSTORE
  312. WINAPI
  313. CryptGetMessageCertificates(
  314.     IN DWORD dwMsgAndCertEncodingType,
  315.     IN HCRYPTPROV hCryptProv,           // passed to CertOpenStore
  316.     IN DWORD dwFlags,                   // passed to CertOpenStore
  317.     IN const BYTE *pbSignedBlob,
  318.     IN DWORD cbSignedBlob
  319.     );
  320. //+-------------------------------------------------------------------------
  321. //  Verify a signed message containing detached signature(s).
  322. //  The "to be signed" content is passed in separately. No
  323. //  decoded output. Otherwise, identical to CryptVerifyMessageSignature.
  324. //--------------------------------------------------------------------------
  325. WINCRYPT32API
  326. BOOL
  327. WINAPI
  328. CryptVerifyDetachedMessageSignature(
  329.     IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  330.     IN DWORD dwSignerIndex,
  331.     IN const BYTE *pbDetachedSignBlob,
  332.     IN DWORD cbDetachedSignBlob,
  333.     IN DWORD cToBeSigned,
  334.     IN const BYTE *rgpbToBeSigned[],
  335.     IN DWORD rgcbToBeSigned[],
  336.     OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert
  337.     );
  338. //+-------------------------------------------------------------------------
  339. //  Encrypts the message for the recipient(s).
  340. //--------------------------------------------------------------------------
  341. WINCRYPT32API
  342. BOOL
  343. WINAPI
  344. CryptEncryptMessage(
  345.     IN PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
  346.     IN DWORD cRecipientCert,
  347.     IN PCCERT_CONTEXT rgpRecipientCert[],
  348.     IN const BYTE *pbToBeEncrypted,
  349.     IN DWORD cbToBeEncrypted,
  350.     OUT BYTE *pbEncryptedBlob,
  351.     IN OUT DWORD *pcbEncryptedBlob
  352.     );
  353. //+-------------------------------------------------------------------------
  354. //  Decrypts the message.
  355. //
  356. //  If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input.
  357. //  For *pcbDecrypted == 0 && ppXchgCert == NULL on input, the message isn't
  358. //  decrypted.
  359. //
  360. //  For a successfully decrypted message, *ppXchgCert is updated
  361. //  with the CertContext used to decrypt. It must be freed by calling
  362. //  CertStoreFreeCert. Otherwise, *ppXchgCert is set to NULL.
  363. //
  364. //  ppXchgCert can be NULL, indicating the caller isn't interested
  365. //  in getting the CertContext used to decrypt.
  366. //--------------------------------------------------------------------------
  367. WINCRYPT32API
  368. BOOL
  369. WINAPI
  370. CryptDecryptMessage(
  371.     IN PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  372.     IN const BYTE *pbEncryptedBlob,
  373.     IN DWORD cbEncryptedBlob,
  374.     OUT OPTIONAL BYTE *pbDecrypted,
  375.     IN OUT OPTIONAL DWORD *pcbDecrypted,
  376.     OUT OPTIONAL PCCERT_CONTEXT *ppXchgCert
  377.     );
  378. //+-------------------------------------------------------------------------
  379. //  Sign the message and encrypt for the recipient(s). Does a CryptSignMessage
  380. //  followed with a CryptEncryptMessage.
  381. //
  382. //  Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED
  383. //  inside of an CMSG_ENVELOPED.
  384. //--------------------------------------------------------------------------
  385. WINCRYPT32API
  386. BOOL
  387. WINAPI
  388. CryptSignAndEncryptMessage(
  389.     IN PCRYPT_SIGN_MESSAGE_PARA pSignPara,
  390.     IN PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
  391.     IN DWORD cRecipientCert,
  392.     IN PCCERT_CONTEXT rgpRecipientCert[],
  393.     IN const BYTE *pbToBeSignedAndEncrypted,
  394.     IN DWORD cbToBeSignedAndEncrypted,
  395.     OUT BYTE *pbSignedAndEncryptedBlob,
  396.     IN OUT DWORD *pcbSignedAndEncryptedBlob
  397.     );
  398. //+-------------------------------------------------------------------------
  399. //  Decrypts the message and verifies the signer. Does a CryptDecryptMessage
  400. //  followed with a CryptVerifyMessageSignature.
  401. //
  402. //  If pbDecrypted == NULL, then, *pcbDecrypted is implicitly set to 0 on input.
  403. //  For *pcbDecrypted == 0 && ppSignerCert == NULL on input, the signer isn't
  404. //  verified.
  405. //
  406. //  A message might have more than one signer. Set dwSignerIndex to iterate
  407. //  through all the signers. dwSignerIndex == 0 selects the first signer.
  408. //
  409. //  The pVerifyPara's VerifySignerPolicy is called to verify the signer's
  410. //  certificate.
  411. //
  412. //  For a successfully decrypted and verified message, *ppXchgCert and
  413. //  *ppSignerCert are updated. They must be freed by calling
  414. //  CertStoreFreeCert. Otherwise, they are set to NULL.
  415. //
  416. //  ppXchgCert and/or ppSignerCert can be NULL, indicating the
  417. //  caller isn't interested in getting the CertContext.
  418. //
  419. //  Note: this isn't the CMSG_SIGNED_AND_ENVELOPED. Its a CMSG_SIGNED
  420. //  inside of an CMSG_ENVELOPED.
  421. //
  422. //  The message always needs to be decrypted to allow access to the
  423. //  signed message. Therefore, if ppXchgCert != NULL, its always updated.
  424. //--------------------------------------------------------------------------
  425. WINCRYPT32API
  426. BOOL
  427. WINAPI
  428. CryptDecryptAndVerifyMessageSignature(
  429.     IN PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  430.     IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  431.     IN DWORD dwSignerIndex,
  432.     IN const BYTE *pbEncryptedBlob,
  433.     IN DWORD cbEncryptedBlob,
  434.     OUT OPTIONAL BYTE *pbDecrypted,
  435.     IN OUT OPTIONAL DWORD *pcbDecrypted,
  436.     OUT OPTIONAL PCCERT_CONTEXT *ppXchgCert,
  437.     OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert
  438.     );
  439. //+-------------------------------------------------------------------------
  440. //  Decodes a cryptographic message which may be one of the following types:
  441. //    CMSG_DATA
  442. //    CMSG_SIGNED
  443. //    CMSG_ENVELOPED
  444. //    CMSG_SIGNED_AND_ENVELOPED
  445. //    CMSG_HASHED
  446. //
  447. //  dwMsgTypeFlags specifies the set of allowable messages. For example, to
  448. //  decode either SIGNED or ENVELOPED messages, set dwMsgTypeFlags to:
  449. //      CMSG_SIGNED_FLAG | CMSG_ENVELOPED_FLAG.
  450. //
  451. //  dwProvInnerContentType is only applicable when processing nested
  452. //  crytographic messages. When processing an outer crytographic message
  453. //  it must be set to 0. When decoding a nested cryptographic message
  454. //  its the dwInnerContentType returned by a previous CryptDecodeMessage
  455. //  of the outer message. The InnerContentType can be any of the CMSG types,
  456. //  for example, CMSG_DATA, CMSG_SIGNED, ...
  457. //
  458. //  The optional *pdwMsgType is updated with the type of message.
  459. //
  460. //  The optional *pdwInnerContentType is updated with the type of the inner
  461. //  message. Unless there is cryptographic message nesting, CMSG_DATA
  462. //  is returned.
  463. //
  464. //  For CMSG_DATA: returns decoded content.
  465. //  For CMSG_SIGNED: same as CryptVerifyMessageSignature.
  466. //  For CMSG_ENVELOPED: same as CryptDecryptMessage.
  467. //  For CMSG_SIGNED_AND_ENVELOPED: same as CryptDecryptMessage plus
  468. //      CryptVerifyMessageSignature.
  469. //  For CMSG_HASHED: verifies the hash and returns decoded content.
  470. //--------------------------------------------------------------------------
  471. WINCRYPT32API
  472. BOOL
  473. WINAPI
  474. CryptDecodeMessage(
  475.     IN DWORD dwMsgTypeFlags,
  476.     IN PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  477.     IN PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
  478.     IN DWORD dwSignerIndex,
  479.     IN const BYTE *pbEncodedBlob,
  480.     IN DWORD cbEncodedBlob,
  481.     IN DWORD dwPrevInnerContentType,
  482.     OUT OPTIONAL DWORD *pdwMsgType,
  483.     OUT OPTIONAL DWORD *pdwInnerContentType,
  484.     OUT OPTIONAL BYTE *pbDecoded,
  485.     IN OUT OPTIONAL DWORD *pcbDecoded,
  486.     OUT OPTIONAL PCCERT_CONTEXT *ppXchgCert,
  487.     OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert
  488.     );
  489. //+-------------------------------------------------------------------------
  490. //  Hash the message.
  491. //
  492. //  If fDetachedHash is TRUE, only the ComputedHash is encoded in the
  493. //  pbHashedBlob. Otherwise, both the ToBeHashed and ComputedHash
  494. //  are encoded.
  495. //
  496. //  pcbHashedBlob or pcbComputedHash can be NULL, indicating the caller
  497. //  isn't interested in getting the output.
  498. //--------------------------------------------------------------------------
  499. WINCRYPT32API
  500. BOOL
  501. WINAPI
  502. CryptHashMessage(
  503.     IN PCRYPT_HASH_MESSAGE_PARA pHashPara,
  504.     IN BOOL fDetachedHash,
  505.     IN DWORD cToBeHashed,
  506.     IN const BYTE *rgpbToBeHashed[],
  507.     IN DWORD rgcbToBeHashed[],
  508.     OUT OPTIONAL BYTE *pbHashedBlob,
  509.     IN OUT OPTIONAL DWORD *pcbHashedBlob,
  510.     OUT OPTIONAL BYTE *pbComputedHash,
  511.     IN OUT OPTIONAL DWORD *pcbComputedHash
  512.     );
  513. //+-------------------------------------------------------------------------
  514. //  Verify a hashed message.
  515. //
  516. //  pcbToBeHashed or pcbComputedHash can be NULL,
  517. //  indicating the caller isn't interested in getting the output.
  518. //--------------------------------------------------------------------------
  519. WINCRYPT32API
  520. BOOL
  521. WINAPI
  522. CryptVerifyMessageHash(
  523.     IN PCRYPT_HASH_MESSAGE_PARA pHashPara,
  524.     IN BYTE *pbHashedBlob,
  525.     IN DWORD cbHashedBlob,
  526.     OUT OPTIONAL BYTE *pbToBeHashed,
  527.     IN OUT OPTIONAL DWORD *pcbToBeHashed,
  528.     OUT OPTIONAL BYTE *pbComputedHash,
  529.     IN OUT OPTIONAL DWORD *pcbComputedHash
  530.     );
  531. //+-------------------------------------------------------------------------
  532. //  Verify a hashed message containing a detached hash.
  533. //  The "to be hashed" content is passed in separately. No
  534. //  decoded output. Otherwise, identical to CryptVerifyMessageHash.
  535. //
  536. //  pcbComputedHash can be NULL, indicating the caller isn't interested
  537. //  in getting the output.
  538. //--------------------------------------------------------------------------
  539. WINCRYPT32API
  540. BOOL
  541. WINAPI
  542. CryptVerifyDetachedMessageHash(
  543.     IN PCRYPT_HASH_MESSAGE_PARA pHashPara,
  544.     IN BYTE *pbDetachedHashBlob,
  545.     IN DWORD cbDetachedHashBlob,
  546.     IN DWORD cToBeHashed,
  547.     IN const BYTE *rgpbToBeHashed[],
  548.     IN DWORD rgcbToBeHashed[],
  549.     OUT OPTIONAL BYTE *pbComputedHash,
  550.     IN OUT OPTIONAL DWORD *pcbComputedHash
  551.     );
  552. //+-------------------------------------------------------------------------
  553. //  Sign the message using the provider's private key specified in the
  554. //  parameters. A dummy SignerId is created and stored in the message.
  555. //
  556. //  Normally used until a certificate has been created for the key.
  557. //--------------------------------------------------------------------------
  558. WINCRYPT32API
  559. BOOL
  560. WINAPI
  561. CryptSignMessageWithKey(
  562.     IN PCRYPT_KEY_SIGN_MESSAGE_PARA pSignPara,
  563.     IN const BYTE *pbToBeSigned,
  564.     IN DWORD cbToBeSigned,
  565.     OUT BYTE *pbSignedBlob,
  566.     IN OUT DWORD *pcbSignedBlob
  567.     );
  568. //+-------------------------------------------------------------------------
  569. //  Verify a signed message using the specified public key info.
  570. //
  571. //  Normally called by a CA until it has created a certificate for the
  572. //  key.
  573. //
  574. //  pPublicKeyInfo contains the public key to use to verify the signed
  575. //  message. If NULL, the signature isn't verified (for instance, the decoded
  576. //  content may contain the PublicKeyInfo).
  577. //
  578. //  pcbDecoded can be NULL, indicating the caller isn't interested
  579. //  in getting the decoded content.
  580. //--------------------------------------------------------------------------
  581. WINCRYPT32API
  582. BOOL
  583. WINAPI
  584. CryptVerifyMessageSignatureWithKey(
  585.     IN PCRYPT_KEY_VERIFY_MESSAGE_PARA pVerifyPara,
  586.     IN OPTIONAL PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
  587.     IN const BYTE *pbSignedBlob,
  588.     IN DWORD cbSignedBlob,
  589.     OUT OPTIONAL BYTE *pbDecoded,
  590.     IN OUT OPTIONAL DWORD *pcbDecoded
  591.     );
  592. //+=========================================================================
  593. //  System Certificate Store Data Structures and APIs
  594. //==========================================================================
  595. //+-------------------------------------------------------------------------
  596. //  Get a system certificate store based on a subsystem protocol.
  597. //
  598. //  Current examples of subsystems protocols are:
  599. //      "MY"    Cert Store hold certs with associated Private Keys
  600. //      "CA"    Certifying Authority certs
  601. //      "ROOT"  Root Certs
  602. //      "SPC"   Software publisher certs
  603. //
  604. //
  605. //  If hProv is NULL the default provider "1" is opened for you.
  606. //  When the store is closed the provider is release. Otherwise
  607. //  if hProv is not NULL, no provider is created or released.
  608. //
  609. //  The returned Cert Store can be searched for an appropriate Cert
  610. //  using the Cert Store API's (see certstor.h)
  611. //
  612. //  When done, the cert store should be closed using CertStoreClose
  613. //--------------------------------------------------------------------------
  614. WINCRYPT32API
  615. HCERTSTORE
  616. WINAPI
  617. CertOpenSystemStoreA(
  618.     HCRYPTPROV      hProv,
  619.     LPCSTR            szSubsystemProtocol
  620.     );
  621. WINCRYPT32API
  622. HCERTSTORE
  623. WINAPI
  624. CertOpenSystemStoreW(
  625.     HCRYPTPROV      hProv,
  626.     LPCWSTR            szSubsystemProtocol
  627.     );
  628. #ifdef UNICODE
  629. #define CertOpenSystemStore  CertOpenSystemStoreW
  630. #else
  631. #define CertOpenSystemStore  CertOpenSystemStoreA
  632. #endif // !UNICODE
  633. WINCRYPT32API
  634. BOOL
  635. WINAPI
  636. CertAddEncodedCertificateToSystemStoreA(
  637.     LPCSTR            szCertStoreName,
  638.     const BYTE *    pbCertEncoded,
  639.     DWORD           cbCertEncoded
  640.     );
  641. WINCRYPT32API
  642. BOOL
  643. WINAPI
  644. CertAddEncodedCertificateToSystemStoreW(
  645.     LPCWSTR            szCertStoreName,
  646.     const BYTE *    pbCertEncoded,
  647.     DWORD           cbCertEncoded
  648.     );
  649. #ifdef UNICODE
  650. #define CertAddEncodedCertificateToSystemStore  CertAddEncodedCertificateToSystemStoreW
  651. #else
  652. #define CertAddEncodedCertificateToSystemStore  CertAddEncodedCertificateToSystemStoreA
  653. #endif // !UNICODE
  654. //+-------------------------------------------------------------------------
  655. //  Find all certificate chains tying the given issuer name to any certificate
  656. //  that the current user has a private key for.
  657. //
  658. //  If no certificate chain is found, FALSE is returned with LastError set
  659. //  to CRYPT_E_NOT_FOUND and the counts zeroed.
  660. //
  661. //  IE 3.0 ASSUMPTION:
  662. //   The client certificates are in the "My" system store. The issuer
  663. //   cerificates may be in the "Root", "CA" or "My" system stores.
  664. //--------------------------------------------------------------------------
  665. typedef struct _CERT_CHAIN {
  666.     DWORD                   cCerts;     // number of certs in chain
  667.     PCERT_BLOB              certs;      // pointer to array of cert chain blobs
  668.                                         // representing the certs
  669.     CRYPT_KEY_PROV_INFO     keyLocatorInfo; // key locator for cert
  670. } CERT_CHAIN, *PCERT_CHAIN;
  671. // WINCRYPT32API    This is not exported by crypt32, it is exported by softpub
  672. HRESULT
  673. WINAPI
  674. FindCertsByIssuer(
  675.     OUT PCERT_CHAIN pCertChains,
  676.     IN OUT DWORD *pcbCertChains,
  677.     OUT DWORD *pcCertChains,        // count of certificates chains returned
  678.     IN BYTE* pbEncodedIssuerName,   // DER encoded issuer name
  679.     IN DWORD cbEncodedIssuerName,   // count in bytes of encoded issuer name
  680.     IN LPCWSTR pwszPurpose,         // "ClientAuth" or "CodeSigning"
  681.     IN DWORD dwKeySpec              // only return signers supporting this
  682.     // keyspec
  683.     );
  684. //-------------------------------------------------------------------------
  685. //
  686. //  CryptQueryObject takes a CERT_BLOB or a file name and returns the
  687. //  information about the content in the blob or in the file.
  688. //
  689. //  Parameters:
  690. //  INPUT   dwObjectType:
  691. //                       Indicate the type of the object.  Should be one of the
  692. //                       following:
  693. //                          CERT_QUERY_OBJECT_FILE
  694. //                          CERT_QUERY_OBJECT_BLOB
  695. //
  696. //  INPUT   pvObject:
  697. //                        If dwObjectType == CERT_QUERY_OBJECT_FILE, it is a
  698. //                        LPWSTR, that is, the pointer to a wchar file name
  699. //                        if dwObjectType == CERT_QUERY_OBJECT_BLOB, it is a
  700. //                        PCERT_BLOB, that is, a pointer to a CERT_BLOB
  701. //
  702. //  INPUT   dwExpectedContentTypeFlags:
  703. //                        Indicate the expected contenet type.
  704. //                        Can be one of the following:
  705. //                              CERT_QUERY_CONTENT_FLAG_ALL  (the content can be any type)
  706. //                              CERT_QUERY_CONTENT_FLAG_CERT
  707. //                              CERT_QUERY_CONTENT_FLAG_CTL
  708. //                              CERT_QUERY_CONTENT_FLAG_CRL
  709. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE
  710. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT
  711. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL
  712. //                              CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL
  713. //                              CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
  714. //                              CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED
  715. //                              CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED
  716. //                              CERT_QUERY_CONTENT_FLAG_PKCS10
  717. //                              CERT_QUERY_CONTENT_FLAG_PFX
  718. //                              CERT_QUERY_CONTENT_FLAG_CERT_PAIR
  719. //
  720. //  INPUT   dwExpectedFormatTypeFlags:
  721. //                        Indicate the expected format type.
  722. //                        Can be one of the following:
  723. //                              CERT_QUERY_FORMAT_FLAG_ALL (the content can be any format)
  724. //                              CERT_QUERY_FORMAT_FLAG_BINARY
  725. //                              CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED
  726. //                              CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED
  727. //
  728. //
  729. //  INPUT   dwFlags
  730. //                        Reserved flag.  Should always set to 0
  731. //
  732. //  OUTPUT  pdwMsgAndCertEncodingType
  733. //                        Optional output.  If NULL != pdwMsgAndCertEncodingType,
  734. //                        it contains the encoding type of the content as any
  735. //                        combination of the following:
  736. //                              X509_ASN_ENCODING
  737. //                              PKCS_7_ASN_ENCODING
  738. //
  739. //  OUTPUT  pdwContentType
  740. //                        Optional output.  If NULL!=pdwContentType, it contains
  741. //                        the content type as one of the the following:
  742. //                              CERT_QUERY_CONTENT_CERT
  743. //                              CERT_QUERY_CONTENT_CTL
  744. //                              CERT_QUERY_CONTENT_CRL
  745. //                              CERT_QUERY_CONTENT_SERIALIZED_STORE
  746. //                              CERT_QUERY_CONTENT_SERIALIZED_CERT
  747. //                              CERT_QUERY_CONTENT_SERIALIZED_CTL
  748. //                              CERT_QUERY_CONTENT_SERIALIZED_CRL
  749. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED
  750. //                              CERT_QUERY_CONTENT_PKCS7_UNSIGNED
  751. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
  752. //                              CERT_QUERY_CONTENT_PKCS10
  753. //                              CERT_QUERY_CONTENT_PFX
  754. //                              CERT_QUERY_CONTENT_CERT_PAIR
  755. //
  756. //  OUTPUT  pdwFormatType
  757. //                        Optional output.  If NULL !=pdwFormatType, it
  758. //                        contains the format type of the content as one of the
  759. //                        following:
  760. //                              CERT_QUERY_FORMAT_BINARY
  761. //                              CERT_QUERY_FORMAT_BASE64_ENCODED
  762. //                              CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED
  763. //
  764. //
  765. //  OUTPUT  phCertStore
  766. //                        Optional output.  If NULL !=phStore,
  767. //                        it contains a cert store that includes all of certificates,
  768. //                        CRL, and CTL in the object if the object content type is
  769. //                        one of the following:
  770. //                              CERT_QUERY_CONTENT_CERT
  771. //                              CERT_QUERY_CONTENT_CTL
  772. //                              CERT_QUERY_CONTENT_CRL
  773. //                              CERT_QUERY_CONTENT_SERIALIZED_STORE
  774. //                              CERT_QUERY_CONTENT_SERIALIZED_CERT
  775. //                              CERT_QUERY_CONTENT_SERIALIZED_CTL
  776. //                              CERT_QUERY_CONTENT_SERIALIZED_CRL
  777. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED
  778. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
  779. //                              CERT_QUERY_CONTENT_CERT_PAIR
  780. //
  781. //                       Caller should free *phCertStore via CertCloseStore.
  782. //
  783. //
  784. //  OUTPUT  phMsg        Optional output.  If NULL != phMsg,
  785. //                        it contains a handle to a opened message if
  786. //                        the content type is one of the following:
  787. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED
  788. //                              CERT_QUERY_CONTENT_PKCS7_UNSIGNED
  789. //                              CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
  790. //
  791. //                       Caller should free *phMsg via CryptMsgClose.
  792. //
  793. //  OUTPUT pContext     Optional output.  If NULL != pContext,
  794. //                      it contains either a PCCERT_CONTEXT or PCCRL_CONTEXT,
  795. //                      or PCCTL_CONTEXT based on the content type.
  796. //
  797. //                      If the content type is CERT_QUERY_CONTENT_CERT or
  798. //                      CERT_QUERY_CONTENT_SERIALIZED_CERT, it is a PCCERT_CONTEXT;
  799. //                      Caller should free the pContext via CertFreeCertificateContext.
  800. //
  801. //                      If the content type is CERT_QUERY_CONTENT_CRL or
  802. //                      CERT_QUERY_CONTENT_SERIALIZED_CRL, it is a PCCRL_CONTEXT;
  803. //                      Caller should free the pContext via CertFreeCRLContext.
  804. //
  805. //                      If the content type is CERT_QUERY_CONTENT_CTL or
  806. //                      CERT_QUERY_CONTENT_SERIALIZED_CTL, it is a PCCTL_CONTEXT;
  807. //                      Caller should free the pContext via CertFreeCTLContext.
  808. //
  809. //  If the *pbObject is of type CERT_QUERY_CONTENT_PKCS10 or CERT_QUERY_CONTENT_PFX, CryptQueryObject
  810. //  will not return anything in *phCertstore, *phMsg, or *ppvContext.
  811. //--------------------------------------------------------------------------
  812. WINCRYPT32API
  813. BOOL
  814. WINAPI
  815. CryptQueryObject(
  816.     DWORD            dwObjectType,
  817.     const void       *pvObject,
  818.     DWORD            dwExpectedContentTypeFlags,
  819.     DWORD            dwExpectedFormatTypeFlags,
  820.     DWORD            dwFlags,
  821.     DWORD            *pdwMsgAndCertEncodingType,
  822.     DWORD            *pdwContentType,
  823.     DWORD            *pdwFormatType,
  824.     HCERTSTORE       *phCertStore,
  825.     HCRYPTMSG        *phMsg,
  826.     const void       **ppvContext
  827.     );
  828. //-------------------------------------------------------------------------
  829. //dwObjectType for CryptQueryObject
  830. //-------------------------------------------------------------------------
  831. #define     CERT_QUERY_OBJECT_FILE         0x00000001
  832. #define     CERT_QUERY_OBJECT_BLOB         0x00000002
  833. //-------------------------------------------------------------------------
  834. //dwContentType for CryptQueryObject
  835. //-------------------------------------------------------------------------
  836. //encoded single certificate
  837. #define     CERT_QUERY_CONTENT_CERT                 1
  838. //encoded single CTL
  839. #define     CERT_QUERY_CONTENT_CTL                  2
  840. //encoded single CRL
  841. #define     CERT_QUERY_CONTENT_CRL                  3
  842. //serialized store
  843. #define     CERT_QUERY_CONTENT_SERIALIZED_STORE     4
  844. //serialized single certificate
  845. #define     CERT_QUERY_CONTENT_SERIALIZED_CERT      5
  846. //serialized single CTL
  847. #define     CERT_QUERY_CONTENT_SERIALIZED_CTL       6
  848. //serialized single CRL
  849. #define     CERT_QUERY_CONTENT_SERIALIZED_CRL       7
  850. //a PKCS#7 signed message
  851. #define     CERT_QUERY_CONTENT_PKCS7_SIGNED         8
  852. //a PKCS#7 message, such as enveloped message.  But it is not a signed message,
  853. #define     CERT_QUERY_CONTENT_PKCS7_UNSIGNED       9
  854. //a PKCS7 signed message embedded in a file
  855. #define     CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED   10
  856. //an encoded PKCS#10
  857. #define     CERT_QUERY_CONTENT_PKCS10               11
  858. //an encoded PKX BLOB
  859. #define     CERT_QUERY_CONTENT_PFX                                      12
  860. //an encoded CertificatePair (contains forward and/or reverse cross certs)
  861. #define     CERT_QUERY_CONTENT_CERT_PAIR            13
  862. //-------------------------------------------------------------------------
  863. //dwExpectedConentTypeFlags for CryptQueryObject
  864. //-------------------------------------------------------------------------
  865. //encoded single certificate
  866. #define     CERT_QUERY_CONTENT_FLAG_CERT   
  867.                 ( 1 << CERT_QUERY_CONTENT_CERT)
  868. //encoded single CTL
  869. #define     CERT_QUERY_CONTENT_FLAG_CTL   
  870.                 ( 1 << CERT_QUERY_CONTENT_CTL)
  871. //encoded single CRL
  872. #define     CERT_QUERY_CONTENT_FLAG_CRL   
  873.                 ( 1 << CERT_QUERY_CONTENT_CRL)
  874. //serialized store
  875. #define     CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE   
  876.                 ( 1 << CERT_QUERY_CONTENT_SERIALIZED_STORE)
  877. //serialized single certificate
  878. #define     CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT   
  879.                 ( 1 << CERT_QUERY_CONTENT_SERIALIZED_CERT)
  880. //serialized single CTL
  881. #define     CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL   
  882.                 ( 1 << CERT_QUERY_CONTENT_SERIALIZED_CTL)
  883. //serialized single CRL
  884. #define     CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL   
  885.                 ( 1 << CERT_QUERY_CONTENT_SERIALIZED_CRL)
  886. //an encoded PKCS#7 signed message
  887. #define     CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED   
  888.                 ( 1 << CERT_QUERY_CONTENT_PKCS7_SIGNED)
  889. //an encoded PKCS#7 message.  But it is not a signed message
  890. #define     CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED   
  891.                 ( 1 << CERT_QUERY_CONTENT_PKCS7_UNSIGNED)
  892. //the content includes an embedded PKCS7 signed message
  893. #define     CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED  
  894.                 ( 1 << CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED)
  895. //an encoded PKCS#10
  896. #define     CERT_QUERY_CONTENT_FLAG_PKCS10   
  897.                 ( 1 << CERT_QUERY_CONTENT_PKCS10)
  898. //an encoded PFX BLOB
  899. #define     CERT_QUERY_CONTENT_FLAG_PFX      
  900.                 ( 1 << CERT_QUERY_CONTENT_PFX)
  901. //an encoded CertificatePair (contains forward and/or reverse cross certs)
  902. #define     CERT_QUERY_CONTENT_FLAG_CERT_PAIR   
  903.                 ( 1 << CERT_QUERY_CONTENT_CERT_PAIR)
  904. //content can be any type
  905. #define     CERT_QUERY_CONTENT_FLAG_ALL                         
  906.                 CERT_QUERY_CONTENT_FLAG_CERT |                  
  907.                 CERT_QUERY_CONTENT_FLAG_CTL  |                  
  908.                 CERT_QUERY_CONTENT_FLAG_CRL  |                  
  909.                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE |      
  910.                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT  |      
  911.                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL   |      
  912.                 CERT_QUERY_CONTENT_FLAG_SERIALIZED_CRL   |      
  913.                 CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED     |      
  914.                 CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED   |      
  915.                 CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED |    
  916.                 CERT_QUERY_CONTENT_FLAG_PKCS10                     |    
  917.                 CERT_QUERY_CONTENT_FLAG_PFX                |    
  918.                 CERT_QUERY_CONTENT_FLAG_CERT_PAIR
  919. //-------------------------------------------------------------------------
  920. //dwFormatType for CryptQueryObject
  921. //-------------------------------------------------------------------------
  922. //the content is in binary format
  923. #define     CERT_QUERY_FORMAT_BINARY                1
  924. //the content is base64 encoded
  925. #define     CERT_QUERY_FORMAT_BASE64_ENCODED        2
  926. //the content is ascii hex encoded with "{ASN}" prefix
  927. #define     CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED 3
  928. //-------------------------------------------------------------------------
  929. //dwExpectedFormatTypeFlags for CryptQueryObject
  930. //-------------------------------------------------------------------------
  931. //the content is in binary format
  932. #define     CERT_QUERY_FORMAT_FLAG_BINARY         
  933.                 ( 1 << CERT_QUERY_FORMAT_BINARY)
  934. //the content is base64 encoded
  935. #define     CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED 
  936.                 ( 1 << CERT_QUERY_FORMAT_BASE64_ENCODED)
  937. //the content is ascii hex encoded with "{ASN}" prefix
  938. #define     CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED 
  939.                 ( 1 << CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED)
  940. //the content can be of any format
  941. #define     CERT_QUERY_FORMAT_FLAG_ALL              
  942.             CERT_QUERY_FORMAT_FLAG_BINARY   |       
  943.             CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | 
  944.             CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED
  945. //
  946. // Crypt32 Memory Management Routines.  All Crypt32 API which return allocated
  947. // buffers will do so via CryptMemAlloc, CryptMemRealloc.  Clients can free
  948. // those buffers using CryptMemFree.  Also included is CryptMemSize
  949. //
  950. WINCRYPT32API
  951. LPVOID
  952. WINAPI
  953. CryptMemAlloc (
  954.     IN ULONG cbSize
  955.     );
  956. WINCRYPT32API
  957. LPVOID
  958. WINAPI
  959. CryptMemRealloc (
  960.     IN LPVOID pv,
  961.     IN ULONG cbSize
  962.     );
  963. WINCRYPT32API
  964. VOID
  965. WINAPI
  966. CryptMemFree (
  967.     IN LPVOID pv
  968.     );
  969. //
  970. // Crypt32 Asynchronous Parameter Management Routines.  All Crypt32 API which
  971. // expose asynchronous mode operation use a Crypt32 Async Handle to pass
  972. // around information about the operation e.g. callback routines.  The
  973. // following API are used for manipulation of the async handle
  974. //
  975. typedef HANDLE HCRYPTASYNC, *PHCRYPTASYNC;
  976. typedef VOID (WINAPI *PFN_CRYPT_ASYNC_PARAM_FREE_FUNC) (
  977.     LPSTR pszParamOid,
  978.     LPVOID pvParam
  979.     );
  980. WINCRYPT32API
  981. BOOL
  982. WINAPI
  983. CryptCreateAsyncHandle (
  984.     IN DWORD dwFlags,
  985.     OUT PHCRYPTASYNC phAsync
  986.     );
  987. WINCRYPT32API
  988. BOOL
  989. WINAPI
  990. CryptSetAsyncParam (
  991.     IN HCRYPTASYNC hAsync,
  992.     IN LPSTR pszParamOid,
  993.     IN LPVOID pvParam,
  994.     IN OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
  995.     );
  996. WINCRYPT32API
  997. BOOL
  998. WINAPI
  999. CryptGetAsyncParam (
  1000.     IN HCRYPTASYNC hAsync,
  1001.     IN LPSTR pszParamOid,
  1002.     OUT LPVOID* ppvParam,
  1003.     OUT OPTIONAL PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
  1004.     );
  1005. WINCRYPT32API
  1006. BOOL
  1007. WINAPI
  1008. CryptCloseAsyncHandle (
  1009.     IN HCRYPTASYNC hAsync
  1010.     );
  1011. //
  1012. // Crypt32 Remote Object Retrieval Routines.  This API allows retrieval of
  1013. // remote PKI objects where the location is given by an URL.  The remote
  1014. // object retrieval manager exposes two provider models.  One is the "Scheme
  1015. // Provider" model which allows for installable protocol providers as defined
  1016. // by the URL scheme e.g. ldap, http, ftp.  The scheme provider entry point is
  1017. // the same as the CryptRetrieveObjectByUrl however the *ppvObject returned
  1018. // is ALWAYS a counted array of encoded bits (one per object retrieved).  The
  1019. // second provider model is the "Context Provider" model which allows for
  1020. // installable creators of CAPI2 context handles (objects) based on the
  1021. // retrieved encoded bits.  These are dispatched based on the object OID given
  1022. // in the call to CryptRetrieveObjectByUrl.
  1023. //
  1024. typedef struct _CRYPT_BLOB_ARRAY {
  1025.     DWORD            cBlob;
  1026.     PCRYPT_DATA_BLOB rgBlob;
  1027. } CRYPT_BLOB_ARRAY, *PCRYPT_BLOB_ARRAY;
  1028. typedef struct _CRYPT_CREDENTIALS {
  1029.     DWORD  cbSize;
  1030.     LPCSTR pszCredentialsOid;
  1031.     LPVOID pvCredentials;
  1032. } CRYPT_CREDENTIALS, *PCRYPT_CREDENTIALS;
  1033. #define CREDENTIAL_OID_PASSWORD_CREDENTIALS_A ((LPCSTR)1)
  1034. #define CREDENTIAL_OID_PASSWORD_CREDENTIALS_W ((LPCSTR)2)
  1035. #ifdef UNICODE
  1036. #define CREDENTIAL_OID_PASSWORD_CREDENTIALS CREDENTIAL_OID_PASSWORD_CREDENTIALS_W
  1037. #else
  1038. #define CREDENTIAL_OID_PASSWORD_CREDENTIALS CREDENTIAL_OID_PASSWORD_CREDENTIALS_A
  1039. #endif //UNICODE
  1040. typedef struct _CRYPT_PASSWORD_CREDENTIALSA {
  1041.     DWORD   cbSize;
  1042.     LPSTR   pszUsername;
  1043.     LPSTR   pszPassword;
  1044. } CRYPT_PASSWORD_CREDENTIALSA, *PCRYPT_PASSWORD_CREDENTIALSA;
  1045. typedef struct _CRYPT_PASSWORD_CREDENTIALSW {
  1046.     DWORD   cbSize;
  1047.     LPWSTR  pszUsername;
  1048.     LPWSTR  pszPassword;
  1049. } CRYPT_PASSWORD_CREDENTIALSW, *PCRYPT_PASSWORD_CREDENTIALSW;
  1050. #ifdef UNICODE
  1051. typedef CRYPT_PASSWORD_CREDENTIALSW CRYPT_PASSWORD_CREDENTIALS;
  1052. typedef PCRYPT_PASSWORD_CREDENTIALSW PCRYPT_PASSWORD_CREDENTIALS;
  1053. #else
  1054. typedef CRYPT_PASSWORD_CREDENTIALSA CRYPT_PASSWORD_CREDENTIALS;
  1055. typedef PCRYPT_PASSWORD_CREDENTIALSA PCRYPT_PASSWORD_CREDENTIALS;
  1056. #endif // UNICODE
  1057. //
  1058. // Scheme Provider Signatures
  1059. //
  1060. #define SCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNC "SchemeDllRetrieveEncodedObject"
  1061. typedef VOID (WINAPI *PFN_FREE_ENCODED_OBJECT_FUNC) (
  1062.     LPCSTR pszObjectOid,
  1063.     PCRYPT_BLOB_ARRAY pObject,
  1064.     LPVOID pvFreeContext
  1065.     );
  1066. //
  1067. // SchemeDllRetrieveEncodedObject has the following signature:
  1068. //
  1069. // BOOL WINAPI SchemeDllRetrieveEncodedObject (
  1070. //                   IN LPCSTR pszUrl,
  1071. //                   IN LPCSTR pszObjectOid,
  1072. //                   IN DWORD dwRetrievalFlags,
  1073. //                   IN DWORD dwTimeout,                // milliseconds
  1074. //                   OUT PCRYPT_BLOB_ARRAY pObject,
  1075. //                   OUT PFN_FREE_ENCODED_OBJECT_FUNC* ppfnFreeObject,
  1076. //                   OUT LPVOID* ppvFreeContext,
  1077. //                   IN HCRYPTASYNC hAsyncRetrieve,
  1078. //                   IN PCRYPT_CREDENTIALS pCredentials,
  1079. //                   IN PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
  1080. //                   )
  1081. //
  1082. //
  1083. // Context Provider Signatures
  1084. //
  1085. #define CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNC "ContextDllCreateObjectContext"
  1086. #define CONTEXT_OID_CERTIFICATE ((LPCSTR)1)
  1087. #define CONTEXT_OID_CRL         ((LPCSTR)2)
  1088. #define CONTEXT_OID_CTL         ((LPCSTR)3)
  1089. #define CONTEXT_OID_PKCS7       ((LPCSTR)4)
  1090. #define CONTEXT_OID_CAPI2_ANY   ((LPCSTR)5)
  1091. //
  1092. // ContextDllCreateObjectContext has the following signature:
  1093. //
  1094. // BOOL WINAPI ContextDllCreateObjectContext (
  1095. //                    IN LPCSTR pszObjectOid,
  1096. //                    IN DWORD dwRetrievalFlags,
  1097. //                    IN PCRYPT_BLOB_ARRAY pObject,
  1098. //                    OUT LPVOID* ppvContext
  1099. //                    )
  1100. //
  1101. //
  1102. // Remote Object Retrieval API
  1103. //
  1104. //
  1105. // Retrieval flags
  1106. //
  1107. #define CRYPT_RETRIEVE_MULTIPLE_OBJECTS         0x00000001
  1108. #define CRYPT_CACHE_ONLY_RETRIEVAL              0x00000002
  1109. #define CRYPT_WIRE_ONLY_RETRIEVAL               0x00000004
  1110. #define CRYPT_DONT_CACHE_RESULT                 0x00000008
  1111. #define CRYPT_ASYNC_RETRIEVAL                   0x00000010
  1112. #define CRYPT_STICKY_CACHE_RETRIEVAL            0x00001000
  1113. #define CRYPT_LDAP_SCOPE_BASE_ONLY_RETRIEVAL    0x00002000
  1114. #define CRYPT_OFFLINE_CHECK_RETRIEVAL           0x00004000
  1115. // When the following flag is set, the following 2 NULL terminated ascii
  1116. // strings are inserted at the beginning of each returned blob:
  1117. //  "%d%s", dwEntryIndex, pszAttribute
  1118. //
  1119. //  The first dwEntryIndex is 0, "0". 
  1120. //
  1121. // When set, pszObjectOid must be NULL, so that a PCRYPT_BLOB_ARRAY is returned.
  1122. #define CRYPT_LDAP_INSERT_ENTRY_ATTRIBUTE       0x00008000
  1123. // Set this flag to digitally sign all of the ldap traffic to and from a
  1124. // Windows 2000 LDAP server using the Kerberos authentication protocol.
  1125. // This feature provides integrity required by some applications. 
  1126. #define CRYPT_LDAP_SIGN_RETRIEVAL               0x00010000
  1127. // Set this flag to inhibit automatic authentication handling. See the
  1128. // wininet flag, INTERNET_FLAG_NO_AUTH, for more details.
  1129. #define CRYPT_NO_AUTH_RETRIEVAL                 0x00020000
  1130. // Performs an A-Record only DNS lookup on the supplied host string.
  1131. // This prevents bogus DNS queries from being generated when resolving host
  1132. // names. Use this flag whenever passing a hostname as opposed to a
  1133. // domain name for the hostname parameter. 
  1134. //
  1135. // See LDAP_OPT_AREC_EXCLUSIVE defined in winldap.h for more details.
  1136. #define CRYPT_LDAP_AREC_EXCLUSIVE_RETRIEVAL     0x00040000
  1137. //
  1138. // Data verification retrieval flags
  1139. //
  1140. // CRYPT_VERIFY_CONTEXT_SIGNATURE is used to get signature verification
  1141. // on the context created.  In this case pszObjectOid must be non-NULL and
  1142. // pvVerify points to the signer certificate context
  1143. //
  1144. // CRYPT_VERIFY_DATA_HASH is used to get verification of the blob data
  1145. // retrieved by the protocol.  The pvVerify points to an URL_DATA_HASH
  1146. // structure (TBD)
  1147. //
  1148. #define CRYPT_VERIFY_CONTEXT_SIGNATURE  0x00000020
  1149. #define CRYPT_VERIFY_DATA_HASH          0x00000040
  1150. //
  1151. // Time Valid Object flags
  1152. //
  1153. #define CRYPT_KEEP_TIME_VALID               0x00000080
  1154. #define CRYPT_DONT_VERIFY_SIGNATURE         0x00000100
  1155. #define CRYPT_DONT_CHECK_TIME_VALIDITY      0x00000200
  1156. // The default checks if ftNextUpdate >= ftValidFor. Set this flag to
  1157. // check if ftThisUpdate >= ftValidFor.
  1158. #define CRYPT_CHECK_FRESHNESS_TIME_VALIDITY 0x00000400
  1159. #define CRYPT_ACCUMULATIVE_TIMEOUT          0x00000800
  1160. typedef struct _CRYPT_RETRIEVE_AUX_INFO {
  1161.     DWORD       cbSize;
  1162.     FILETIME    *pLastSyncTime;
  1163. } CRYPT_RETRIEVE_AUX_INFO, *PCRYPT_RETRIEVE_AUX_INFO;
  1164. WINCRYPT32API
  1165. BOOL
  1166. WINAPI
  1167. CryptRetrieveObjectByUrlA (
  1168.     IN LPCSTR pszUrl,
  1169.     IN LPCSTR pszObjectOid,
  1170.     IN DWORD dwRetrievalFlags,
  1171.     IN DWORD dwTimeout,                     // milliseconds
  1172.     OUT LPVOID* ppvObject,
  1173.     IN HCRYPTASYNC hAsyncRetrieve,
  1174.     IN OPTIONAL PCRYPT_CREDENTIALS pCredentials,
  1175.     IN OPTIONAL LPVOID pvVerify,
  1176.     IN OPTIONAL PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
  1177.     );
  1178. WINCRYPT32API
  1179. BOOL
  1180. WINAPI
  1181. CryptRetrieveObjectByUrlW (
  1182.     IN LPCWSTR pszUrl,
  1183.     IN LPCSTR pszObjectOid,
  1184.     IN DWORD dwRetrievalFlags,
  1185.     IN DWORD dwTimeout,                     // milliseconds
  1186.     OUT LPVOID* ppvObject,
  1187.     IN HCRYPTASYNC hAsyncRetrieve,
  1188.     IN OPTIONAL PCRYPT_CREDENTIALS pCredentials,
  1189.     IN OPTIONAL LPVOID pvVerify,
  1190.     IN OPTIONAL PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
  1191.     );
  1192. #ifdef UNICODE
  1193. #define CryptRetrieveObjectByUrl  CryptRetrieveObjectByUrlW
  1194. #else
  1195. #define CryptRetrieveObjectByUrl  CryptRetrieveObjectByUrlA
  1196. #endif // !UNICODE
  1197. //
  1198. // Call back function to cancel object retrieval
  1199. //
  1200. // The function can be installed on a per thread basis.
  1201. // If CryptInstallCancelRetrieval is called for multiple times, only the most recent
  1202. // installation will be kept.
  1203. //
  1204. // This is only effective for http, https, gopher, and ftp protocol.
  1205. // It is ignored by the rest of the protocols.
  1206. typedef BOOL (WINAPI *PFN_CRYPT_CANCEL_RETRIEVAL)(
  1207.     IN DWORD dwFlags,
  1208.     IN void  *pvArg
  1209.     );
  1210. //
  1211. // PFN_CRYPT_CANCEL_RETRIEVAL
  1212. //
  1213. // This function should return FALSE when the object retrieval should be continued
  1214. // and return TRUE when the object retrieval should be cancelled.
  1215. //
  1216. WINCRYPT32API
  1217. BOOL
  1218. WINAPI
  1219. CryptInstallCancelRetrieval(
  1220.     IN PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel,
  1221.     IN const void *pvArg,
  1222.     IN DWORD dwFlags,
  1223.     IN void *pvReserved
  1224. );
  1225. WINCRYPT32API
  1226. BOOL
  1227. WINAPI
  1228. CryptUninstallCancelRetrieval(
  1229.         IN DWORD dwFlags,
  1230.         IN void  *pvReserved
  1231.         );
  1232. WINCRYPT32API
  1233. BOOL
  1234. WINAPI
  1235. CryptCancelAsyncRetrieval (
  1236.     HCRYPTASYNC hAsyncRetrieval
  1237.     );
  1238. //
  1239. // Remote Object Async Retrieval parameters
  1240. //
  1241. //
  1242. // A client that wants to be notified of asynchronous object retrieval
  1243. // completion sets this parameter on the async handle
  1244. //
  1245. #define CRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETION ((LPCSTR)1)
  1246. typedef VOID (WINAPI *PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC) (
  1247.     IN LPVOID pvCompletion,
  1248.     IN DWORD dwCompletionCode,
  1249.     IN LPCSTR pszUrl,
  1250.     IN LPSTR pszObjectOid,
  1251.     IN LPVOID pvObject
  1252.     );
  1253. typedef struct _CRYPT_ASYNC_RETRIEVAL_COMPLETION {
  1254.     PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC pfnCompletion;
  1255.     LPVOID pvCompletion;
  1256. } CRYPT_ASYNC_RETRIEVAL_COMPLETION, *PCRYPT_ASYNC_RETRIEVAL_COMPLETION;
  1257. //
  1258. // This function is set on the async handle by a scheme provider that
  1259. // supports asynchronous retrieval
  1260. //
  1261. #define CRYPT_PARAM_CANCEL_ASYNC_RETRIEVAL ((LPCSTR)2)
  1262. typedef BOOL (WINAPI *PFN_CANCEL_ASYNC_RETRIEVAL_FUNC) (
  1263.     HCRYPTASYNC hAsyncRetrieve
  1264.     );
  1265. //
  1266. // Get the locator for a CAPI object
  1267. //
  1268. #define CRYPT_GET_URL_FROM_PROPERTY         0x00000001
  1269. #define CRYPT_GET_URL_FROM_EXTENSION        0x00000002
  1270. #define CRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTE 0x00000004
  1271. #define CRYPT_GET_URL_FROM_AUTH_ATTRIBUTE   0x00000008
  1272. typedef struct _CRYPT_URL_ARRAY {
  1273.     DWORD   cUrl;
  1274.     LPWSTR* rgwszUrl;
  1275. } CRYPT_URL_ARRAY, *PCRYPT_URL_ARRAY;
  1276. typedef struct _CRYPT_URL_INFO {
  1277.     DWORD   cbSize;
  1278.     // Seconds between syncs
  1279.     DWORD   dwSyncDeltaTime;
  1280.     // Returned URLs may be grouped. For instance, groups of cross cert
  1281.     // distribution points. Each distribution point may have multiple
  1282.     // URLs, (LDAP and HTTP scheme).
  1283.     DWORD   cGroup;
  1284.     DWORD   *rgcGroupEntry;
  1285. } CRYPT_URL_INFO, *PCRYPT_URL_INFO;
  1286. WINCRYPT32API
  1287. BOOL
  1288. WINAPI
  1289. CryptGetObjectUrl (
  1290.     IN LPCSTR pszUrlOid,
  1291.     IN LPVOID pvPara,
  1292.     IN DWORD dwFlags,
  1293.     OUT OPTIONAL PCRYPT_URL_ARRAY pUrlArray,
  1294.     IN OUT DWORD* pcbUrlArray,
  1295.     OUT OPTIONAL PCRYPT_URL_INFO pUrlInfo,
  1296.     IN OUT OPTIONAL DWORD* pcbUrlInfo,
  1297.     IN OPTIONAL LPVOID pvReserved
  1298.     );
  1299. #define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl"
  1300. //
  1301. // UrlDllGetObjectUrl has the same signature as CryptGetObjectUrl
  1302. //
  1303. //
  1304. // URL_OID_CERTIFICATE_ISSUER
  1305. //
  1306. // pvPara == PCCERT_CONTEXT, certificate whose issuer's URL is being requested
  1307. //
  1308. // This will be retrieved from the authority info access extension or property
  1309. // on the certificate
  1310. //
  1311. // URL_OID_CERTIFICATE_CRL_DIST_POINT
  1312. //
  1313. // pvPara == PCCERT_CONTEXT, certificate whose CRL distribution point is being
  1314. // requested
  1315. //
  1316. // This will be retrieved from the CRL distribution point extension or property
  1317. // on the certificate
  1318. //
  1319. // URL_OID_CTL_ISSUER
  1320. //
  1321. // pvPara == PCCTL_CONTEXT, Signer Index, CTL whose issuer's URL (identified
  1322. // by the signer index) is being requested
  1323. //
  1324. // This will be retrieved from an authority info access attribute method encoded
  1325. // in each signer info in the PKCS7 (CTL)
  1326. //
  1327. // URL_OID_CTL_NEXT_UPDATE
  1328. //
  1329. // pvPara == PCCTL_CONTEXT, Signer Index, CTL whose next update URL is being
  1330. // requested and an optional signer index in case we need to check signer
  1331. // info attributes
  1332. //
  1333. // This will be retrieved from an authority info access CTL extension, property,
  1334. // or signer info attribute method
  1335. //
  1336. // URL_OID_CRL_ISSUER
  1337. //
  1338. // pvPara == PCCRL_CONTEXT, CRL whose issuer's URL is being requested
  1339. //
  1340. // This will be retrieved from a property on the CRL which has been inherited
  1341. // from the subject cert (either from the subject cert issuer or the subject
  1342. // cert distribution point extension).  It will be encoded as an authority
  1343. // info access extension method.
  1344. //
  1345. // URL_OID_CERTIFICATE_FRESHEST_CRL
  1346. //
  1347. // pvPara == PCCERT_CONTEXT, certificate whose freshest CRL distribution point
  1348. // is being requested
  1349. //
  1350. // This will be retrieved from the freshest CRL extension or property
  1351. // on the certificate
  1352. //
  1353. // URL_OID_CRL_FRESHEST_CRL
  1354. //
  1355. // pvPara == PCCERT_CRL_CONTEXT_PAIR, certificate's base CRL whose
  1356. // freshest CRL distribution point is being requested
  1357. //
  1358. // This will be retrieved from the freshest CRL extension or property
  1359. // on the CRL
  1360. //
  1361. // URL_OID_CROSS_CERT_DIST_POINT
  1362. //
  1363. // pvPara == PCCERT_CONTEXT, certificate whose cross certificate distribution
  1364. // point is being requested
  1365. //
  1366. // This will be retrieved from the cross certificate distribution point
  1367. // extension or property on the certificate
  1368. //
  1369. #define URL_OID_CERTIFICATE_ISSUER         ((LPCSTR)1)
  1370. #define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2)
  1371. #define URL_OID_CTL_ISSUER                 ((LPCSTR)3)
  1372. #define URL_OID_CTL_NEXT_UPDATE            ((LPCSTR)4)
  1373. #define URL_OID_CRL_ISSUER                 ((LPCSTR)5)
  1374. #define URL_OID_CERTIFICATE_FRESHEST_CRL   ((LPCSTR)6)
  1375. #define URL_OID_CRL_FRESHEST_CRL           ((LPCSTR)7)
  1376. #define URL_OID_CROSS_CERT_DIST_POINT      ((LPCSTR)8)
  1377. typedef struct _CERT_CRL_CONTEXT_PAIR {
  1378.     PCCERT_CONTEXT          pCertContext;
  1379.     PCCRL_CONTEXT           pCrlContext;
  1380. } CERT_CRL_CONTEXT_PAIR, *PCERT_CRL_CONTEXT_PAIR;
  1381. typedef const CERT_CRL_CONTEXT_PAIR *PCCERT_CRL_CONTEXT_PAIR;
  1382. //
  1383. // Get a time valid CAPI2 object
  1384. //
  1385. WINCRYPT32API
  1386. BOOL
  1387. WINAPI
  1388. CryptGetTimeValidObject (
  1389.     IN LPCSTR pszTimeValidOid,
  1390.     IN LPVOID pvPara,
  1391.     IN PCCERT_CONTEXT pIssuer,
  1392.     IN OPTIONAL LPFILETIME pftValidFor,
  1393.     IN DWORD dwFlags,
  1394.     IN DWORD dwTimeout,                         // milliseconds
  1395.     OUT OPTIONAL LPVOID* ppvObject,
  1396.     IN OPTIONAL PCRYPT_CREDENTIALS pCredentials,
  1397.     IN OPTIONAL LPVOID pvReserved
  1398.     );
  1399. #define TIME_VALID_OID_GET_OBJECT_FUNC "TimeValidDllGetObject"
  1400. //
  1401. // TimeValidDllGetObject has the same signature as CryptGetTimeValidObject
  1402. //
  1403. //
  1404. // TIME_VALID_OID_GET_CTL
  1405. //
  1406. // pvPara == PCCTL_CONTEXT, the current CTL
  1407. //
  1408. // TIME_VALID_OID_GET_CRL
  1409. //
  1410. // pvPara == PCCRL_CONTEXT, the current CRL
  1411. //
  1412. // TIME_VALID_OID_GET_CRL_FROM_CERT
  1413. //
  1414. // pvPara == PCCERT_CONTEXT, the subject cert
  1415. //
  1416. // TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CERT
  1417. //
  1418. // pvPara == PCCERT_CONTEXT, the subject cert
  1419. //
  1420. // TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CRL
  1421. //
  1422. // pvPara == PCCERT_CRL_CONTEXT_PAIR, the subject cert and its base CRL
  1423. //
  1424. #define TIME_VALID_OID_GET_CTL           ((LPCSTR)1)
  1425. #define TIME_VALID_OID_GET_CRL           ((LPCSTR)2)
  1426. #define TIME_VALID_OID_GET_CRL_FROM_CERT ((LPCSTR)3)
  1427. #define TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CERT   ((LPCSTR)4)
  1428. #define TIME_VALID_OID_GET_FRESHEST_CRL_FROM_CRL    ((LPCSTR)5)
  1429. WINCRYPT32API
  1430. BOOL
  1431. WINAPI
  1432. CryptFlushTimeValidObject (
  1433.      IN LPCSTR pszFlushTimeValidOid,
  1434.      IN LPVOID pvPara,
  1435.      IN PCCERT_CONTEXT pIssuer,
  1436.      IN DWORD dwFlags,
  1437.      IN LPVOID pvReserved
  1438.      );
  1439. #define TIME_VALID_OID_FLUSH_OBJECT_FUNC "TimeValidDllFlushObject"
  1440. //
  1441. // TimeValidDllFlushObject has the same signature as CryptFlushTimeValidObject
  1442. //
  1443. //
  1444. // TIME_VALID_OID_FLUSH_CTL
  1445. //
  1446. // pvPara == PCCTL_CONTEXT, the CTL to flush
  1447. //
  1448. // TIME_VALID_OID_FLUSH_CRL
  1449. //
  1450. // pvPara == PCCRL_CONTEXT, the CRL to flush
  1451. //
  1452. // TIME_VALID_OID_FLUSH_CRL_FROM_CERT
  1453. //
  1454. // pvPara == PCCERT_CONTEXT, the subject cert's CRL to flush
  1455. //
  1456. // TIME_VALID_OID_FLUSH_FRESHEST_CRL_FROM_CERT
  1457. //
  1458. // pvPara == PCCERT_CONTEXT, the subject cert's freshest CRL to flush
  1459. //
  1460. // TIME_VALID_OID_FLUSH_FRESHEST_CRL_FROM_CRL
  1461. //
  1462. // pvPara == PCCERT_CRL_CONTEXT_PAIR, the subject cert and its base CRL's
  1463. // freshest CRL to flush
  1464. //
  1465. #define TIME_VALID_OID_FLUSH_CTL           ((LPCSTR)1)
  1466. #define TIME_VALID_OID_FLUSH_CRL           ((LPCSTR)2)
  1467. #define TIME_VALID_OID_FLUSH_CRL_FROM_CERT ((LPCSTR)3)
  1468. #define TIME_VALID_OID_FLUSH_FRESHEST_CRL_FROM_CERT ((LPCSTR)4)
  1469. #define TIME_VALID_OID_FLUSH_FRESHEST_CRL_FROM_CRL  ((LPCSTR)5)
  1470. //-------------------------------------------------------------------------
  1471. // Data Protection APIs
  1472. //-------------------------------------------------------------------------
  1473. //
  1474. // Data protection APIs enable applications to easily secure data.
  1475. //
  1476. // The base provider provides protection based on the users' logon
  1477. // credentials. The data secured with these APIs follow the same
  1478. // roaming characteristics as HKCU -- if HKCU roams, the data
  1479. // protected by the base provider may roam as well. This makes
  1480. // the API ideal for the munging of data stored in the registry.
  1481. //
  1482. //
  1483. // Prompt struct -- what to tell users about the access
  1484. //
  1485. typedef struct  _CRYPTPROTECT_PROMPTSTRUCT
  1486. {
  1487.     DWORD cbSize;
  1488.     DWORD dwPromptFlags;
  1489.     HWND  hwndApp;
  1490.     LPCWSTR szPrompt;
  1491. } CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT;
  1492. //
  1493. // base provider action
  1494. //
  1495. #define CRYPTPROTECT_DEFAULT_PROVIDER   { 0xdf9d8cd0, 0x1501, 0x11d1, {0x8c, 0x7a, 0x00, 0xc0, 0x4f, 0xc2, 0x97, 0xeb} }
  1496. //
  1497. // CryptProtect PromptStruct dwPromtFlags
  1498. //
  1499. //
  1500. // prompt on unprotect
  1501. #define CRYPTPROTECT_PROMPT_ON_UNPROTECT     0x1  // 1<<0
  1502. //
  1503. // prompt on protect
  1504. #define CRYPTPROTECT_PROMPT_ON_PROTECT       0x2  // 1<<1
  1505. #define CRYPTPROTECT_PROMPT_RESERVED         0x04 // reserved, do not use.
  1506. //
  1507. // only allow strong variant UI protection (user supplied password currently).
  1508. #define CRYPTPROTECT_PROMPT_STRONG           0x08 // 1<<3
  1509. //
  1510. // CryptProtectData and CryptUnprotectData dwFlags
  1511. //
  1512. // for remote-access situations where ui is not an option
  1513. // if UI was specified on protect or unprotect operation, the call
  1514. // will fail and GetLastError() will indicate ERROR_PASSWORD_RESTRICTION
  1515. #define CRYPTPROTECT_UI_FORBIDDEN        0x1
  1516. //
  1517. // per machine protected data -- any user on machine where CryptProtectData
  1518. // took place may CryptUnprotectData
  1519. #define CRYPTPROTECT_LOCAL_MACHINE       0x4
  1520. //
  1521. // force credential synchronize during CryptProtectData()
  1522. // Synchronize is only operation that occurs during this operation
  1523. #define CRYPTPROTECT_CRED_SYNC           0x8
  1524. //
  1525. // Generate an Audit on protect and unprotect operations
  1526. //
  1527. #define CRYPTPROTECT_AUDIT              0x10
  1528. //
  1529. // Protect data with a non-recoverable key
  1530. //
  1531. #define CRYPTPROTECT_NO_RECOVERY        0x20
  1532. //
  1533. // Verify the protection of a protected blob
  1534. //
  1535. #define CRYPTPROTECT_VERIFY_PROTECTION  0x40
  1536. //
  1537. // Regenerate the local machine protection
  1538. //
  1539. #define CRYPTPROTECT_CRED_REGENERATE    0x80
  1540. // flags reserved for system use
  1541. #define CRYPTPROTECT_FIRST_RESERVED_FLAGVAL    0x0FFFFFFF
  1542. #define CRYPTPROTECT_LAST_RESERVED_FLAGVAL     0xFFFFFFFF
  1543. //
  1544. // flags specific to base provider
  1545. //
  1546. WINCRYPT32API
  1547. BOOL
  1548. WINAPI
  1549. CryptProtectData(
  1550.     IN              DATA_BLOB*      pDataIn,
  1551.     IN              LPCWSTR         szDataDescr,
  1552.     IN OPTIONAL     DATA_BLOB*      pOptionalEntropy,
  1553.     IN              PVOID           pvReserved,
  1554.     IN OPTIONAL     CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
  1555.     IN              DWORD           dwFlags,
  1556.     OUT             DATA_BLOB*      pDataOut            // out encr blob
  1557.     );
  1558. WINCRYPT32API
  1559. BOOL
  1560. WINAPI
  1561. CryptUnprotectData(
  1562.     IN              DATA_BLOB*      pDataIn,             // in encr blob
  1563.     OUT OPTIONAL    LPWSTR*         ppszDataDescr,       // out
  1564.     IN OPTIONAL     DATA_BLOB*      pOptionalEntropy,
  1565.     IN              PVOID           pvReserved,
  1566.     IN OPTIONAL     CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
  1567.     IN              DWORD           dwFlags,
  1568.     OUT             DATA_BLOB*      pDataOut
  1569.     );
  1570. //+=========================================================================
  1571. //  Helper functions to build certificates
  1572. //==========================================================================
  1573. //+-------------------------------------------------------------------------
  1574. //
  1575. // Builds a self-signed certificate and returns a PCCERT_CONTEXT representing
  1576. // the certificate. A hProv must be specified to build the cert context.
  1577. //
  1578. // pSubjectIssuerBlob is the DN for the certifcate. If an alternate subject
  1579. // name is desired it must be specified as an extension in the pExtensions
  1580. // parameter. pSubjectIssuerBlob can NOT be NULL, so minimually an empty DN
  1581. // must be specified.
  1582. //
  1583. // By default:
  1584. // pKeyProvInfo - The CSP is queried for the KeyProvInfo parameters. Only the Provider,
  1585. // Provider Type and Container is queried. Many CSPs don't support these
  1586. // queries and will cause a failure. In such cases the pKeyProvInfo
  1587. // must be specified (RSA BASE works fine).
  1588. //
  1589. // pSignatureAlgorithm - will default to SHA1RSA
  1590. // pStartTime will default to the current time
  1591. // pEndTime will default to 1 year
  1592. // pEntensions will be empty.
  1593. //
  1594. // The returned PCCERT_CONTEXT will reference the private keys by setting the
  1595. // CERT_KEY_PROV_INFO_PROP_ID. However, if this property is not desired specify the
  1596. // CERT_CREATE_SELFSIGN_NO_KEY_INFO in dwFlags.
  1597. //
  1598. // If the cert being built is only a dummy placeholder cert for speed it may not
  1599. // need to be signed. Signing of the cert is skipped if CERT_CREATE_SELFSIGN_NO_SIGN
  1600. // is specified in dwFlags.
  1601. //
  1602. //--------------------------------------------------------------------------
  1603. WINCRYPT32API
  1604. PCCERT_CONTEXT
  1605. WINAPI
  1606. CertCreateSelfSignCertificate(
  1607.     IN          HCRYPTPROV                  hProv,
  1608.     IN          PCERT_NAME_BLOB             pSubjectIssuerBlob,
  1609.     IN          DWORD                       dwFlags,
  1610.     OPTIONAL    PCRYPT_KEY_PROV_INFO        pKeyProvInfo,
  1611.     OPTIONAL    PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
  1612.     OPTIONAL    PSYSTEMTIME                 pStartTime,
  1613.     OPTIONAL    PSYSTEMTIME                 pEndTime,
  1614.     OPTIONAL    PCERT_EXTENSIONS            pExtensions
  1615.     );
  1616. #define CERT_CREATE_SELFSIGN_NO_SIGN    1
  1617. #define CERT_CREATE_SELFSIGN_NO_KEY_INFO 2
  1618. //+=========================================================================
  1619. //  Key Identifier Property Data Structures and APIs
  1620. //==========================================================================
  1621. //+-------------------------------------------------------------------------
  1622. //  Get the property for the specified Key Identifier.
  1623. //
  1624. //  The Key Identifier is the SHA1 hash of the encoded CERT_PUBLIC_KEY_INFO.
  1625. //  The Key Identifier for a certificate can be obtained by getting the
  1626. //  certificate's CERT_KEY_IDENTIFIER_PROP_ID. The
  1627. //  CryptCreateKeyIdentifierFromCSP API can be called to create the Key
  1628. //  Identifier from a CSP Public Key Blob.
  1629. //
  1630. //  A Key Identifier can have the same properties as a certificate context.
  1631. //  CERT_KEY_PROV_INFO_PROP_ID is the property of most interest.
  1632. //  For CERT_KEY_PROV_INFO_PROP_ID, pvData points to a CRYPT_KEY_PROV_INFO
  1633. //  structure. Elements pointed to by fields in the pvData structure follow the
  1634. //  structure. Therefore, *pcbData will exceed the size of the structure.
  1635. //
  1636. //  If CRYPT_KEYID_ALLOC_FLAG is set, then, *pvData is updated with a
  1637. //  pointer to allocated memory. LocalFree() must be called to free the
  1638. //  allocated memory.
  1639. //
  1640. //  By default, searches the CurrentUser's list of Key Identifiers.
  1641. //  CRYPT_KEYID_MACHINE_FLAG can be set to search the LocalMachine's list
  1642. //  of Key Identifiers. When CRYPT_KEYID_MACHINE_FLAG is set, pwszComputerName
  1643. //  can also be set to specify the name of a remote computer to be searched
  1644. //  instead of the local machine.
  1645. //--------------------------------------------------------------------------
  1646. WINCRYPT32API
  1647. BOOL
  1648. WINAPI
  1649. CryptGetKeyIdentifierProperty(
  1650.     IN const CRYPT_HASH_BLOB *pKeyIdentifier,
  1651.     IN DWORD dwPropId,
  1652.     IN DWORD dwFlags,
  1653.     IN OPTIONAL LPCWSTR pwszComputerName,
  1654.     IN OPTIONAL void *pvReserved,
  1655.     OUT void *pvData,
  1656.     IN OUT DWORD *pcbData
  1657.     );
  1658. // When the following flag is set, searches the LocalMachine instead of the
  1659. // CurrentUser. This flag is applicable to all the KeyIdentifierProperty APIs.
  1660. #define CRYPT_KEYID_MACHINE_FLAG        0x00000020
  1661. // When the following flag is set, *pvData is updated with a pointer to
  1662. // allocated memory. LocalFree() must be called to free the allocated memory.
  1663. #define CRYPT_KEYID_ALLOC_FLAG          0x00008000
  1664. //+-------------------------------------------------------------------------
  1665. //  Set the property for the specified Key Identifier.
  1666. //
  1667. //  For CERT_KEY_PROV_INFO_PROP_ID pvData points to the
  1668. //  CRYPT_KEY_PROV_INFO data structure. For all other properties, pvData
  1669. //  points to a CRYPT_DATA_BLOB.
  1670. //
  1671. //  Setting pvData == NULL, deletes the property.
  1672. //
  1673. //  Set CRYPT_KEYID_MACHINE_FLAG to set the property for a LocalMachine
  1674. //  Key Identifier. Set pwszComputerName, to select a remote computer.
  1675. //
  1676. //  If CRYPT_KEYID_DELETE_FLAG is set, the Key Identifier and all its
  1677. //  properties is deleted.
  1678. //
  1679. //  If CRYPT_KEYID_SET_NEW_FLAG is set, the set fails if the property already
  1680. //  exists. For an existing property, FALSE is returned with LastError set to
  1681. //  CRYPT_E_EXISTS.
  1682. //--------------------------------------------------------------------------
  1683. WINCRYPT32API
  1684. BOOL
  1685. WINAPI
  1686. CryptSetKeyIdentifierProperty(
  1687.     IN const CRYPT_HASH_BLOB *pKeyIdentifier,
  1688.     IN DWORD dwPropId,
  1689.     IN DWORD dwFlags,
  1690.     IN OPTIONAL LPCWSTR pwszComputerName,
  1691.     IN OPTIONAL void *pvReserved,
  1692.     IN const void *pvData
  1693.     );
  1694. // When the following flag is set, the Key Identifier and all its properties
  1695. // are deleted.
  1696. #define CRYPT_KEYID_DELETE_FLAG         0x00000010
  1697. // When the following flag is set, the set fails if the property already
  1698. // exists.
  1699. #define CRYPT_KEYID_SET_NEW_FLAG        0x00002000
  1700. //+-------------------------------------------------------------------------
  1701. //  For CERT_KEY_PROV_INFO_PROP_ID, rgppvData[] points to a
  1702. //  CRYPT_KEY_PROV_INFO.
  1703. //
  1704. //  Return FALSE to stop the enumeration.
  1705. //--------------------------------------------------------------------------
  1706. typedef BOOL (WINAPI *PFN_CRYPT_ENUM_KEYID_PROP)(
  1707.     IN const CRYPT_HASH_BLOB *pKeyIdentifier,
  1708.     IN DWORD dwFlags,
  1709.     IN void *pvReserved,
  1710.     IN void *pvArg,
  1711.     IN DWORD cProp,
  1712.     IN DWORD *rgdwPropId,
  1713.     IN void **rgpvData,
  1714.     IN DWORD *rgcbData
  1715.     );
  1716. //+-------------------------------------------------------------------------
  1717. //  Enumerate the Key Identifiers.
  1718. //
  1719. //  If pKeyIdentifier is NULL, enumerates all Key Identifers. Otherwise,
  1720. //  calls the callback for the specified KeyIdentifier. If dwPropId is
  1721. //  0, calls the callback with all the properties. Otherwise, only calls
  1722. //  the callback with the specified property (cProp = 1).
  1723. //  Furthermore, when dwPropId is specified, skips KeyIdentifiers not
  1724. //  having the property.
  1725. //
  1726. //  Set CRYPT_KEYID_MACHINE_FLAG to enumerate the LocalMachine
  1727. //  Key Identifiers. Set pwszComputerName, to enumerate Key Identifiers on
  1728. //  a remote computer.
  1729. //--------------------------------------------------------------------------
  1730. WINCRYPT32API
  1731. BOOL
  1732. WINAPI
  1733. CryptEnumKeyIdentifierProperties(
  1734.     IN OPTIONAL const CRYPT_HASH_BLOB *pKeyIdentifier,
  1735.     IN DWORD dwPropId,
  1736.     IN DWORD dwFlags,
  1737.     IN OPTIONAL LPCWSTR pwszComputerName,
  1738.     IN OPTIONAL void *pvReserved,
  1739.     IN OPTIONAL void *pvArg,
  1740.     IN PFN_CRYPT_ENUM_KEYID_PROP pfnEnum
  1741.     );
  1742. //+-------------------------------------------------------------------------
  1743. //  Create a KeyIdentifier from the CSP Public Key Blob.
  1744. //
  1745. //  Converts the CSP PUBLICKEYSTRUC into a X.509 CERT_PUBLIC_KEY_INFO and
  1746. //  encodes. The encoded CERT_PUBLIC_KEY_INFO is SHA1 hashed to obtain
  1747. //  the Key Identifier.
  1748. //
  1749. //  By default, the pPubKeyStruc->aiKeyAlg is used to find the appropriate
  1750. //  public key Object Identifier. pszPubKeyOID can be set to override
  1751. //  the default OID obtained from the aiKeyAlg.
  1752. //--------------------------------------------------------------------------
  1753. WINCRYPT32API
  1754. BOOL
  1755. WINAPI
  1756. CryptCreateKeyIdentifierFromCSP(
  1757.     IN DWORD dwCertEncodingType,
  1758.     IN OPTIONAL LPCSTR pszPubKeyOID,
  1759.     IN const PUBLICKEYSTRUC *pPubKeyStruc,
  1760.     IN DWORD cbPubKeyStruc,
  1761.     IN DWORD dwFlags,
  1762.     IN OPTIONAL void *pvReserved,
  1763.     OUT BYTE *pbHash,
  1764.     IN OUT DWORD *pcbHash
  1765.     );
  1766. //+=========================================================================
  1767. //  Certificate Chaining Infrastructure
  1768. //==========================================================================
  1769. //
  1770. // The chain engine defines the store namespace and cache partitioning for
  1771. // the Certificate Chaining infrastructure.  A default chain engine
  1772. // is defined for the process which uses all default system stores e.g.
  1773. // Root, CA, Trust, for chain building and caching.  If an application
  1774. // wishes to define its own store namespace or have its own partitioned
  1775. // cache then it can create its own chain engine.  It is advisable to create
  1776. // a chain engine at application startup and use it throughout the lifetime
  1777. // of the application in order to get optimal caching behavior
  1778. //
  1779. typedef HANDLE HCERTCHAINENGINE;
  1780. #define HCCE_CURRENT_USER  ((HCERTCHAINENGINE)NULL)
  1781. #define HCCE_LOCAL_MACHINE ((HCERTCHAINENGINE)0x1)
  1782. //
  1783. // Create a certificate chain engine.
  1784. //
  1785. //
  1786. // Configuration parameters for the certificate chain engine
  1787. //
  1788. //      hRestrictedRoot - restrict the root store (must be a subset of "Root")
  1789. //
  1790. //      hRestrictedTrust - restrict the store for CTLs
  1791. //
  1792. //      hRestrictedOther - restrict the store for certs and CRLs
  1793. //
  1794. //      cAdditionalStore, rghAdditionalStore - additional stores
  1795. //
  1796. //      NOTE: The algorithm used to define the stores for the engine is as
  1797. //            follows:
  1798. //
  1799. //            hRoot = hRestrictedRoot or System Store "Root"
  1800. //
  1801. //            hTrust = hRestrictedTrust or hWorld (defined later)
  1802. //
  1803. //            hOther = hRestrictedOther or (hRestrictedTrust == NULL) ? hWorld :
  1804. //                     hRestrictedTrust + hWorld
  1805. //
  1806. //            hWorld = hRoot + "CA" + "My" + "Trust" + rghAdditionalStore
  1807. //
  1808. //      dwFlags  - flags
  1809. //
  1810. //          CERT_CHAIN_CACHE_END_CERT - information will be cached on
  1811. //                                      the end cert as well as the other
  1812. //                                      certs in the chain
  1813. //
  1814. //          CERT_CHAIN_THREAD_STORE_SYNC - use separate thread for store syncs
  1815. //                                         and related cache updates
  1816. //
  1817. //          CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL - don't hit the wire to get
  1818. //                                                URL based objects
  1819. //
  1820. //      dwUrlRetrievalTimeout - timeout for wire based URL object retrievals
  1821. //                              (milliseconds)
  1822. //
  1823. #define CERT_CHAIN_CACHE_END_CERT           0x00000001
  1824. #define CERT_CHAIN_THREAD_STORE_SYNC        0x00000002
  1825. #define CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL 0x00000004
  1826. #define CERT_CHAIN_USE_LOCAL_MACHINE_STORE  0x00000008
  1827. #define CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE 0x00000010
  1828. #define CERT_CHAIN_ENABLE_SHARE_STORE       0x00000020
  1829. typedef struct _CERT_CHAIN_ENGINE_CONFIG {
  1830.     DWORD       cbSize;
  1831.     HCERTSTORE  hRestrictedRoot;
  1832.     HCERTSTORE  hRestrictedTrust;
  1833.     HCERTSTORE  hRestrictedOther;
  1834.     DWORD       cAdditionalStore;
  1835.     HCERTSTORE* rghAdditionalStore;
  1836.     DWORD       dwFlags;
  1837.     DWORD       dwUrlRetrievalTimeout;      // milliseconds
  1838.     DWORD       MaximumCachedCertificates;
  1839.     DWORD       CycleDetectionModulus;
  1840. } CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
  1841. WINCRYPT32API
  1842. BOOL
  1843. WINAPI
  1844. CertCreateCertificateChainEngine (
  1845.     IN PCERT_CHAIN_ENGINE_CONFIG pConfig,
  1846.     OUT HCERTCHAINENGINE* phChainEngine
  1847.     );
  1848. //
  1849. // Free a certificate trust engine
  1850. //
  1851. WINCRYPT32API
  1852. VOID
  1853. WINAPI
  1854. CertFreeCertificateChainEngine (
  1855.     IN HCERTCHAINENGINE hChainEngine
  1856.     );
  1857. //
  1858. // Resync the certificate chain engine.  This resync's the stores backing
  1859. // the engine and updates the engine caches.
  1860. //
  1861. WINCRYPT32API
  1862. BOOL
  1863. WINAPI
  1864. CertResyncCertificateChainEngine (
  1865.     IN HCERTCHAINENGINE hChainEngine
  1866.     );
  1867. //
  1868. // When an application requests a certificate chain, the data structure
  1869. // returned is in the form of a CERT_CHAIN_CONTEXT.  This contains
  1870. // an array of CERT_SIMPLE_CHAIN where each simple chain goes from
  1871. // an end cert to a self signed cert and the chain context connects simple
  1872. // chains via trust lists.  Each simple chain contains the chain of
  1873. // certificates, summary trust information about the chain and trust information
  1874. // about each certificate element in the chain.
  1875. //
  1876. //
  1877. // Trust status bits
  1878. //
  1879. typedef struct _CERT_TRUST_STATUS {
  1880.     DWORD dwErrorStatus;
  1881.     DWORD dwInfoStatus;
  1882. } CERT_TRUST_STATUS, *PCERT_TRUST_STATUS;
  1883. //
  1884. // The following are error status bits
  1885. //
  1886. // These can be applied to certificates and chains
  1887. #define CERT_TRUST_NO_ERROR                             0x00000000
  1888. #define CERT_TRUST_IS_NOT_TIME_VALID                    0x00000001
  1889. #define CERT_TRUST_IS_NOT_TIME_NESTED                   0x00000002
  1890. #define CERT_TRUST_IS_REVOKED                           0x00000004
  1891. #define CERT_TRUST_IS_NOT_SIGNATURE_VALID               0x00000008
  1892. #define CERT_TRUST_IS_NOT_VALID_FOR_USAGE               0x00000010
  1893. #define CERT_TRUST_IS_UNTRUSTED_ROOT                    0x00000020
  1894. #define CERT_TRUST_REVOCATION_STATUS_UNKNOWN            0x00000040
  1895. #define CERT_TRUST_IS_CYCLIC                            0x00000080
  1896. #define CERT_TRUST_INVALID_EXTENSION                    0x00000100
  1897. #define CERT_TRUST_INVALID_POLICY_CONSTRAINTS           0x00000200
  1898. #define CERT_TRUST_INVALID_BASIC_CONSTRAINTS            0x00000400
  1899. #define CERT_TRUST_INVALID_NAME_CONSTRAINTS             0x00000800
  1900. #define CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT    0x00001000
  1901. #define CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT      0x00002000
  1902. #define CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT    0x00004000
  1903. #define CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT         0x00008000
  1904. #define CERT_TRUST_IS_OFFLINE_REVOCATION                0x01000000
  1905. #define CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY             0x02000000
  1906. // These can be applied to chains only
  1907. #define CERT_TRUST_IS_PARTIAL_CHAIN                     0x00010000
  1908. #define CERT_TRUST_CTL_IS_NOT_TIME_VALID                0x00020000
  1909. #define CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID           0x00040000
  1910. #define CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE           0x00080000
  1911. //
  1912. // The following are info status bits
  1913. //
  1914. // These can be applied to certificates only
  1915. #define CERT_TRUST_HAS_EXACT_MATCH_ISSUER               0x00000001
  1916. #define CERT_TRUST_HAS_KEY_MATCH_ISSUER                 0x00000002
  1917. #define CERT_TRUST_HAS_NAME_MATCH_ISSUER                0x00000004
  1918. #define CERT_TRUST_IS_SELF_SIGNED                       0x00000008
  1919. // These can be applied to certificates and chains
  1920. #define CERT_TRUST_HAS_PREFERRED_ISSUER                 0x00000100
  1921. #define CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY            0x00000200
  1922. #define CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS           0x00000400
  1923. // These can be applied to chains only
  1924. #define CERT_TRUST_IS_COMPLEX_CHAIN                     0x00010000
  1925. //
  1926. // Each certificate context in a simple chain has a corresponding chain element
  1927. // in the simple chain context
  1928. //
  1929. // dwErrorStatus has CERT_TRUST_IS_REVOKED, pRevocationInfo set
  1930. // dwErrorStatus has CERT_TRUST_REVOCATION_STATUS_UNKNOWN, pRevocationInfo set
  1931. //
  1932. //         Note that the post processing revocation supported in the first
  1933. //         version only sets cbSize and dwRevocationResult.  Everything else
  1934. //         is NULL
  1935. //
  1936. //
  1937. // Revocation Information
  1938. //
  1939. typedef struct _CERT_REVOCATION_INFO {
  1940.     DWORD                       cbSize;
  1941.     DWORD                       dwRevocationResult;
  1942.     LPCSTR                      pszRevocationOid;
  1943.     LPVOID                      pvOidSpecificInfo;
  1944.     // fHasFreshnessTime is only set if we are able to retrieve revocation
  1945.     // information. For a CRL its CurrentTime - ThisUpdate.
  1946.     BOOL                        fHasFreshnessTime;
  1947.     DWORD                       dwFreshnessTime;    // seconds
  1948.     // NonNULL for CRL base revocation checking
  1949.     PCERT_REVOCATION_CRL_INFO   pCrlInfo;
  1950. } CERT_REVOCATION_INFO, *PCERT_REVOCATION_INFO;
  1951. //
  1952. // Trust List Information
  1953. //
  1954. typedef struct _CERT_TRUST_LIST_INFO {
  1955.     DWORD         cbSize;
  1956.     PCTL_ENTRY    pCtlEntry;
  1957.     PCCTL_CONTEXT pCtlContext;
  1958. } CERT_TRUST_LIST_INFO, *PCERT_TRUST_LIST_INFO;
  1959. //
  1960. // Chain Element
  1961. //
  1962. typedef struct _CERT_CHAIN_ELEMENT {
  1963.     DWORD                 cbSize;
  1964.     PCCERT_CONTEXT        pCertContext;
  1965.     CERT_TRUST_STATUS     TrustStatus;
  1966.     PCERT_REVOCATION_INFO pRevocationInfo;
  1967.     PCERT_ENHKEY_USAGE    pIssuanceUsage;       // If NULL, any
  1968.     PCERT_ENHKEY_USAGE    pApplicationUsage;    // If NULL, any
  1969.     LPCWSTR               pwszExtendedErrorInfo;    // If NULL, none
  1970. } CERT_CHAIN_ELEMENT, *PCERT_CHAIN_ELEMENT;
  1971. //
  1972. // The simple chain is an array of chain elements and a summary trust status
  1973. // for the chain
  1974. //
  1975. // rgpElements[0] is the end certificate chain element
  1976. //
  1977. // rgpElements[cElement-1] is the self-signed "root" certificate chain element
  1978. //
  1979. typedef struct _CERT_SIMPLE_CHAIN {
  1980.     DWORD                 cbSize;
  1981.     CERT_TRUST_STATUS     TrustStatus;
  1982.     DWORD                 cElement;
  1983.     PCERT_CHAIN_ELEMENT*  rgpElement;
  1984.     PCERT_TRUST_LIST_INFO pTrustListInfo;
  1985.     // fHasRevocationFreshnessTime is only set if we are able to retrieve
  1986.     // revocation information for all elements checked for revocation.
  1987.     // For a CRL its CurrentTime - ThisUpdate.
  1988.     //
  1989.     // dwRevocationFreshnessTime is the largest time across all elements
  1990.     // checked.
  1991.     BOOL                   fHasRevocationFreshnessTime;
  1992.     DWORD                  dwRevocationFreshnessTime;    // seconds
  1993. } CERT_SIMPLE_CHAIN, *PCERT_SIMPLE_CHAIN;
  1994. //
  1995. // And the chain context contains an array of simple chains and summary trust
  1996. // status for all the connected simple chains
  1997. //
  1998. // rgpChains[0] is the end certificate simple chain
  1999. //
  2000. // rgpChains[cChain-1] is the final (possibly trust list signer) chain which
  2001. // ends in a certificate which is contained in the root store
  2002. //
  2003. typedef struct _CERT_CHAIN_CONTEXT CERT_CHAIN_CONTEXT, *PCERT_CHAIN_CONTEXT;
  2004. typedef const CERT_CHAIN_CONTEXT *PCCERT_CHAIN_CONTEXT;
  2005. struct _CERT_CHAIN_CONTEXT {
  2006.     DWORD                   cbSize;
  2007.     CERT_TRUST_STATUS       TrustStatus;
  2008.     DWORD                   cChain;
  2009.     PCERT_SIMPLE_CHAIN*     rgpChain;
  2010.     // Following is returned when CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS
  2011.     // is set in dwFlags
  2012.     DWORD                   cLowerQualityChainContext;
  2013.     PCCERT_CHAIN_CONTEXT*   rgpLowerQualityChainContext;
  2014.     // fHasRevocationFreshnessTime is only set if we are able to retrieve
  2015.     // revocation information for all elements checked for revocation.
  2016.     // For a CRL its CurrentTime - ThisUpdate.
  2017.     //
  2018.     // dwRevocationFreshnessTime is the largest time across all elements
  2019.     // checked.
  2020.     BOOL                    fHasRevocationFreshnessTime;
  2021.     DWORD                   dwRevocationFreshnessTime;    // seconds
  2022. };
  2023. //
  2024. // When building a chain, the there are various parameters used for finding
  2025. // issuing certificates and trust lists.  They are identified in the
  2026. // following structure
  2027. //
  2028. // Default usage match type is AND with value zero
  2029. #define USAGE_MATCH_TYPE_AND 0x00000000
  2030. #define USAGE_MATCH_TYPE_OR  0x00000001
  2031. typedef struct _CERT_USAGE_MATCH {
  2032.     DWORD             dwType;
  2033.     CERT_ENHKEY_USAGE Usage;
  2034. } CERT_USAGE_MATCH, *PCERT_USAGE_MATCH;
  2035. typedef struct _CTL_USAGE_MATCH {
  2036.     DWORD     dwType;
  2037.     CTL_USAGE Usage;
  2038. } CTL_USAGE_MATCH, *PCTL_USAGE_MATCH;
  2039. typedef struct _CERT_CHAIN_PARA {
  2040.     DWORD            cbSize;
  2041.     CERT_USAGE_MATCH RequestedUsage;
  2042. #ifdef CERT_CHAIN_PARA_HAS_EXTRA_FIELDS
  2043.     // Note, if you #define CERT_CHAIN_PARA_HAS_EXTRA_FIELDS, then, you
  2044.     // must zero all unused fields in this data structure.
  2045.     // More fields could be added in a future release.
  2046.     CERT_USAGE_MATCH RequestedIssuancePolicy;
  2047.     DWORD            dwUrlRetrievalTimeout;     // milliseconds
  2048.     BOOL             fCheckRevocationFreshnessTime;
  2049.     DWORD            dwRevocationFreshnessTime; // seconds
  2050. #endif
  2051. } CERT_CHAIN_PARA, *PCERT_CHAIN_PARA;
  2052. //
  2053. // The following API is used for retrieving certificate chains
  2054. //
  2055. // Parameters:
  2056. //
  2057. //      hChainEngine     - the chain engine (namespace and cache) to use, NULL
  2058. //                         mean use the default chain engine
  2059. //
  2060. //      pCertContext     - the context we are retrieving the chain for, it
  2061. //                         will be the zero index element in the chain
  2062. //
  2063. //      pTime            - the point in time that we want the chain validated
  2064. //                         for.  Note that the time does not affect trust list,
  2065. //                         revocation, or root store checking.  NULL means use
  2066. //                         the current system time
  2067. //
  2068. //      hAdditionalStore - additional store to use when looking up objects
  2069. //
  2070. //      pChainPara       - parameters for chain building
  2071. //
  2072. //      dwFlags          - flags such as should revocation checking be done
  2073. //                         on the chain?
  2074. //
  2075. //      pvReserved       - reserved parameter, must be NULL
  2076. //
  2077. //      ppChainContext   - chain context returned
  2078. //
  2079. // CERT_CHAIN_CACHE_END_CERT can be used here as well
  2080. // Revocation flags are in the high nibble
  2081. #define CERT_CHAIN_REVOCATION_CHECK_END_CERT           0x10000000
  2082. #define CERT_CHAIN_REVOCATION_CHECK_CHAIN              0x20000000
  2083. #define CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT 0x40000000
  2084. #define CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY         0x80000000
  2085. // By default, the dwUrlRetrievalTimeout in pChainPara is the timeout used
  2086. // for each revocation URL wire retrieval. When the following flag is set,
  2087. // dwUrlRetrievalTimeout is the accumulative timeout across all
  2088. // revocation URL wire retrievals.
  2089. #define CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT     0x08000000
  2090. // First pass determines highest quality based upon:
  2091. //  - Chain signature valid (higest quality bit of this set)
  2092. //  - Complete chain
  2093. //  - Trusted root          (lowestest quality bit of this set)
  2094. // By default, second pass only considers paths >= highest first pass quality
  2095. #define CERT_CHAIN_DISABLE_PASS1_QUALITY_FILTERING  0x00000040
  2096. #define CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS    0x00000080
  2097. #define CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE    0x00000100
  2098. // When this flag is set, pTime will be used as the timestamp time.
  2099. // pTime will be used to determine if the end certificate was valid at this
  2100. // time. Revocation checking will be relative to pTime.
  2101. // In addition, current time will also be used
  2102. // to determine if the certificate is still time valid. All remaining
  2103. // CA and root certificates will be checked using current time and not pTime.
  2104. //
  2105. // This flag was added 4/5/01 in WXP.
  2106. #define CERT_CHAIN_TIMESTAMP_TIME                   0x00000200
  2107. WINCRYPT32API
  2108. BOOL
  2109. WINAPI
  2110. CertGetCertificateChain (
  2111.     IN OPTIONAL HCERTCHAINENGINE hChainEngine,
  2112.     IN PCCERT_CONTEXT pCertContext,
  2113.     IN OPTIONAL LPFILETIME pTime,
  2114.     IN OPTIONAL HCERTSTORE hAdditionalStore,
  2115.     IN PCERT_CHAIN_PARA pChainPara,
  2116.     IN DWORD dwFlags,
  2117.     IN LPVOID pvReserved,
  2118.     OUT PCCERT_CHAIN_CONTEXT* ppChainContext
  2119.     );
  2120. //
  2121. // Free a certificate chain
  2122. //
  2123. WINCRYPT32API
  2124. VOID
  2125. WINAPI
  2126. CertFreeCertificateChain (
  2127.     IN PCCERT_CHAIN_CONTEXT pChainContext
  2128.     );
  2129. //
  2130. // Duplicate (add a reference to) a certificate chain
  2131. //
  2132. WINCRYPT32API
  2133. PCCERT_CHAIN_CONTEXT
  2134. WINAPI
  2135. CertDuplicateCertificateChain (
  2136.     IN PCCERT_CHAIN_CONTEXT pChainContext
  2137.     );
  2138. //
  2139. // Specific Revocation Type OID and structure definitions
  2140. //
  2141. //
  2142. // CRL Revocation OID
  2143. //
  2144. #define REVOCATION_OID_CRL_REVOCATION ((LPCSTR)1)
  2145. //
  2146. // For the CRL revocation OID the pvRevocationPara is NULL
  2147. //
  2148. //
  2149. // CRL Revocation Info
  2150. //
  2151. typedef struct _CRL_REVOCATION_INFO {
  2152.     PCRL_ENTRY           pCrlEntry;
  2153.     PCCRL_CONTEXT        pCrlContext;
  2154.     PCCERT_CHAIN_CONTEXT pCrlIssuerChain;
  2155. } CRL_REVOCATION_INFO, *PCRL_REVOCATION_INFO;
  2156. //+-------------------------------------------------------------------------
  2157. //  Find the first or next certificate chain context in the store.
  2158. //
  2159. //  The chain context is found according to the dwFindFlags, dwFindType and
  2160. //  its pvFindPara. See below for a list of the find types and its parameters.
  2161. //
  2162. //  If the first or next chain context isn't found, NULL is returned.
  2163. //  Otherwise, a pointer to a read only CERT_CHAIN_CONTEXT is returned.
  2164. //  CERT_CHAIN_CONTEXT must be freed by calling CertFreeCertificateChain
  2165. //  or is freed when passed as the
  2166. //  pPrevChainContext on a subsequent call. CertDuplicateCertificateChain
  2167. //  can be called to make a duplicate.
  2168. //
  2169. //  pPrevChainContext MUST BE NULL on the first
  2170. //  call to find the chain context. To find the next chain context, the
  2171. //  pPrevChainContext is set to the CERT_CHAIN_CONTEXT returned by a previous
  2172. //  call.
  2173. //
  2174. //  NOTE: a NON-NULL pPrevChainContext is always CertFreeCertificateChain'ed by
  2175. //  this function, even for an error.
  2176. //--------------------------------------------------------------------------
  2177. WINCRYPT32API
  2178. PCCERT_CHAIN_CONTEXT
  2179. WINAPI
  2180. CertFindChainInStore(
  2181.     IN HCERTSTORE hCertStore,
  2182.     IN DWORD dwCertEncodingType,
  2183.     IN DWORD dwFindFlags,
  2184.     IN DWORD dwFindType,
  2185.     IN const void *pvFindPara,
  2186.     IN PCCERT_CHAIN_CONTEXT pPrevChainContext
  2187.     );
  2188. #define CERT_CHAIN_FIND_BY_ISSUER       1
  2189. //+-------------------------------------------------------------------------
  2190. //  CERT_CHAIN_FIND_BY_ISSUER
  2191. //
  2192. //  Find a certificate chain having a private key for the end certificate and
  2193. //  matching one of the given issuer names. A matching dwKeySpec and
  2194. //  enhanced key usage can also be specified. Additionally a callback can
  2195. //  be provided for even more caller provided filtering before building the
  2196. //  chain.
  2197. //
  2198. //  By default, only the issuers in the first simple chain are compared
  2199. //  for a name match. CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG can
  2200. //  be set in dwFindFlags to match issuers in all the simple chains.
  2201. //
  2202. //  CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG can be set in dwFindFlags to
  2203. //  not check if the end certificate has a private key.
  2204. //
  2205. //  CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG can be set in dwFindFlags
  2206. //  to compare the public key in the end certificate with the crypto
  2207. //  provider's public key. The dwAcquirePrivateKeyFlags can be set
  2208. //  in CERT_CHAIN_FIND_BY_ISSUER_PARA to enable caching of the private key's
  2209. //  HKEY returned by the CSP.
  2210. //
  2211. //  If dwCertEncodingType == 0, defaults to X509_ASN_ENCODING for the
  2212. //  array of encoded issuer names.
  2213. //
  2214. //  By default, the hCertStore passed to CertFindChainInStore, is passed
  2215. //  as an additional store to CertGetCertificateChain.
  2216. //  CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG can be set in dwFindFlags
  2217. //  to improve performance by only searching the cached system stores
  2218. //  (root, my, ca, trust) to find the issuer certificates. If you are doing
  2219. //  a find in the "my" system store, than, this flag should be set to
  2220. //  improve performance.
  2221. //
  2222. //  Setting CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG in dwFindFlags
  2223. //  restricts CertGetCertificateChain to search the Local Machine
  2224. //  cached system stores instead of the Current User's.
  2225. //
  2226. //  Setting CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG in dwFindFlags
  2227. //  restricts CertGetCertificateChain to only search the URL cache
  2228. //  and not hit the wire.
  2229. //--------------------------------------------------------------------------
  2230. // Returns FALSE to skip this certificate. Otherwise, returns TRUE to
  2231. // build a chain for this certificate.
  2232. typedef BOOL (WINAPI *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)(
  2233.     IN PCCERT_CONTEXT pCert,
  2234.     IN void *pvFindArg
  2235.     );
  2236. typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA {
  2237.     DWORD                                   cbSize;
  2238.     // If pszUsageIdentifier == NULL, matches any usage.
  2239.     LPCSTR                                  pszUsageIdentifier;
  2240.     // If dwKeySpec == 0, matches any KeySpec
  2241.     DWORD                                   dwKeySpec;
  2242.     // When CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG is set in dwFindFlags,
  2243.     // CryptAcquireCertificatePrivateKey is called to do the public key
  2244.     // comparison. The following flags can be set to enable caching
  2245.     // of the acquired private key or suppress CSP UI. See the API for more
  2246.     // details on these flags.
  2247.     DWORD                                   dwAcquirePrivateKeyFlags;
  2248.     // Pointer to an array of X509, ASN.1 encoded issuer name blobs. If
  2249.     // cIssuer == 0, matches any issuer
  2250.     DWORD                                   cIssuer;
  2251.     CERT_NAME_BLOB                          *rgIssuer;
  2252.     // If NULL or Callback returns TRUE, builds the chain for the end
  2253.     // certificate having a private key with the specified KeySpec and
  2254.     // enhanced key usage.
  2255.     PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFindCallback;
  2256.     void                                    *pvFindArg;
  2257. #ifdef CERT_CHAIN_FIND_BY_ISSUER_PARA_HAS_EXTRA_FIELDS
  2258.     // Note, if you #define CERT_CHAIN_FIND_BY_ISSUER_PARA_HAS_EXTRA_FIELDS,
  2259.     // then, you must zero all unused fields in this data structure.
  2260.     // More fields could be added in a future release.
  2261.     // If the following pointers are nonNull, returns the index of the
  2262.     // matching issuer certificate, which is at:
  2263.     // pChainContext->
  2264.     //      rgpChain[*pdwIssuerChainIndex]->rgpElement[*pdwIssuerElementIndex].
  2265.     //
  2266.     // The issuer name blob is compared against the Issuer field in the
  2267.     // certificate. The *pdwIssuerElementIndex is set to the index of this
  2268.     // subject certificate + 1. Therefore, its possible for a partial chain or
  2269.     // a self signed certificate matching the name blob, where
  2270.     // *pdwIssuerElementIndex points past the last certificate in the chain.
  2271.     //
  2272.     // Note, not updated if the above cIssuer == 0.
  2273.     DWORD                                   *pdwIssuerChainIndex;
  2274.     DWORD                                   *pdwIssuerElementIndex;
  2275. #endif
  2276. } CERT_CHAIN_FIND_ISSUER_PARA, *PCERT_CHAIN_FIND_ISSUER_PARA,
  2277.     CERT_CHAIN_FIND_BY_ISSUER_PARA, *PCERT_CHAIN_FIND_BY_ISSUER_PARA;
  2278. // The following dwFindFlags can be set for CERT_CHAIN_FIND_BY_ISSUER
  2279. // If set, compares the public key in the end certificate with the crypto
  2280. // provider's public key. This comparison is the last check made on the
  2281. // build chain.
  2282. #define CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG          0x0001
  2283. // If not set, only checks the first simple chain for an issuer name match.
  2284. // When set, also checks second and subsequent simple chains.
  2285. #define CERT_CHAIN_FIND_BY_ISSUER_COMPLEX_CHAIN_FLAG        0x0002
  2286. // If set, CertGetCertificateChain only searches the URL cache and
  2287. // doesn't hit the wire.
  2288. #define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG       0x0004
  2289. // If set, CertGetCertificateChain only opens the Local Machine
  2290. // certificate stores instead of the Current User's.
  2291. #define CERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAG        0x0008
  2292. // If set, no check is made to see if the end certificate has a private
  2293. // key associated with it.
  2294. #define CERT_CHAIN_FIND_BY_ISSUER_NO_KEY_FLAG               0x4000
  2295. // By default, the hCertStore passed to CertFindChainInStore, is passed
  2296. // as the additional store to CertGetCertificateChain. This flag can be
  2297. // set to improve performance by only searching the cached system stores
  2298. // (root, my, ca, trust) to find the issuer certificates. If not set, then,
  2299. // the hCertStore is always searched in addition to the cached system
  2300. // stores.
  2301. #define CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG           0x8000
  2302. //+=========================================================================
  2303. //  Certificate Chain Policy Data Structures and APIs
  2304. //==========================================================================
  2305. typedef struct _CERT_CHAIN_POLICY_PARA {
  2306.     DWORD                   cbSize;
  2307.     DWORD                   dwFlags;
  2308.     void                    *pvExtraPolicyPara;     // pszPolicyOID specific
  2309. } CERT_CHAIN_POLICY_PARA, *PCERT_CHAIN_POLICY_PARA;
  2310. // If both lChainIndex and lElementIndex are set to -1, the dwError applies
  2311. // to the whole chain context. If only lElementIndex is set to -1, the
  2312. // dwError applies to the lChainIndex'ed chain. Otherwise, the dwError applies
  2313. // to the certificate element at
  2314. // pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex].
  2315. typedef struct _CERT_CHAIN_POLICY_STATUS {
  2316.     DWORD                   cbSize;
  2317.     DWORD                   dwError;
  2318.     LONG                    lChainIndex;
  2319.     LONG                    lElementIndex;
  2320.     void                    *pvExtraPolicyStatus;   // pszPolicyOID specific
  2321. } CERT_CHAIN_POLICY_STATUS, *PCERT_CHAIN_POLICY_STATUS;
  2322. // Common chain policy flags
  2323. #define CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG                0x00000001
  2324. #define CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG            0x00000002
  2325. #define CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG               0x00000004
  2326. #define CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG     0x00000008
  2327. #define CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS ( 
  2328.     CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG                | 
  2329.     CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAG            | 
  2330.     CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG                 
  2331.     )
  2332. #define CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG                     0x00000010
  2333. #define CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG                   0x00000020
  2334. #define CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG                  0x00000040
  2335. #define CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG                0x00000080
  2336. #define CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG               0x00000100
  2337. #define CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG        0x00000200
  2338. #define CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG                0x00000400
  2339. #define CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG              0x00000800
  2340. #define CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS ( 
  2341.     CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG         | 
  2342.     CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG  | 
  2343.     CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG          | 
  2344.     CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG          
  2345.     )
  2346. #define CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG                       0x00008000
  2347. #define CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG                       0x00004000
  2348. //+-------------------------------------------------------------------------
  2349. //  Verify that the certificate chain satisfies the specified policy
  2350. //  requirements. If we were able to verify the chain policy, TRUE is returned
  2351. //  and the dwError field of the pPolicyStatus is updated. A dwError of 0
  2352. //  (ERROR_SUCCESS, S_OK) indicates the chain satisfies the specified policy.
  2353. //
  2354. //  If dwError applies to the entire chain context, both lChainIndex and
  2355. //  lElementIndex are set to -1. If dwError applies to a simple chain,
  2356. //  lElementIndex is set to -1 and lChainIndex is set to the index of the
  2357. //  first offending chain having the error. If dwError applies to a
  2358. //  certificate element, lChainIndex and lElementIndex are updated to
  2359. //  index the first offending certificate having the error, where, the
  2360. //  the certificate element is at:
  2361. //      pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex].
  2362. //
  2363. //  The dwFlags in pPolicyPara can be set to change the default policy checking
  2364. //  behaviour. In addition, policy specific parameters can be passed in
  2365. //  the pvExtraPolicyPara field of pPolicyPara.
  2366. //
  2367. //  In addition to returning dwError, in pPolicyStatus, policy OID specific
  2368. //  extra status may be returned via pvExtraPolicyStatus.
  2369. //--------------------------------------------------------------------------
  2370. WINCRYPT32API
  2371. BOOL
  2372. WINAPI
  2373. CertVerifyCertificateChainPolicy(
  2374.     IN LPCSTR pszPolicyOID,
  2375.     IN PCCERT_CHAIN_CONTEXT pChainContext,
  2376.     IN PCERT_CHAIN_POLICY_PARA pPolicyPara,
  2377.     IN OUT PCERT_CHAIN_POLICY_STATUS pPolicyStatus
  2378.     );
  2379. // Predefined OID Function Names
  2380. #define CRYPT_OID_VERIFY_CERTIFICATE_CHAIN_POLICY_FUNC  
  2381.     "CertDllVerifyCertificateChainPolicy"
  2382. // CertDllVerifyCertificateChainPolicy has same function signature as
  2383. // CertVerifyCertificateChainPolicy.
  2384. //+-------------------------------------------------------------------------
  2385. //  Predefined verify chain policies
  2386. //--------------------------------------------------------------------------
  2387. #define CERT_CHAIN_POLICY_BASE              ((LPCSTR) 1)
  2388. #define CERT_CHAIN_POLICY_AUTHENTICODE      ((LPCSTR) 2)
  2389. #define CERT_CHAIN_POLICY_AUTHENTICODE_TS   ((LPCSTR) 3)
  2390. #define CERT_CHAIN_POLICY_SSL               ((LPCSTR) 4)
  2391. #define CERT_CHAIN_POLICY_BASIC_CONSTRAINTS ((LPCSTR) 5)
  2392. #define CERT_CHAIN_POLICY_NT_AUTH           ((LPCSTR) 6)
  2393. #define CERT_CHAIN_POLICY_MICROSOFT_ROOT    ((LPCSTR) 7)
  2394. //+-------------------------------------------------------------------------
  2395. //  CERT_CHAIN_POLICY_BASE
  2396. //
  2397. //  Implements the base chain policy verification checks. dwFlags can
  2398. //  be set in pPolicyPara to alter the default policy checking behaviour.
  2399. //--------------------------------------------------------------------------
  2400. //+-------------------------------------------------------------------------
  2401. //  CERT_CHAIN_POLICY_AUTHENTICODE
  2402. //
  2403. //  Implements the Authenticode chain policy verification checks.
  2404. //
  2405. //  pvExtraPolicyPara may optionally be set to point to the following
  2406. //  AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA.
  2407. //
  2408. //  pvExtraPolicyStatus may optionally be set to point to the following
  2409. //  AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS.
  2410. //--------------------------------------------------------------------------
  2411. // dwRegPolicySettings are defined in wintrust.h
  2412. typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA {
  2413.     DWORD               cbSize;
  2414.     DWORD               dwRegPolicySettings;
  2415.     PCMSG_SIGNER_INFO   pSignerInfo;                // optional
  2416. } AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA,
  2417.     *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
  2418. typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS {
  2419.     DWORD               cbSize;
  2420.     BOOL                fCommercial;        // obtained from signer statement
  2421. } AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS,
  2422.     *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
  2423. //+-------------------------------------------------------------------------
  2424. //  CERT_CHAIN_POLICY_AUTHENTICODE_TS
  2425. //
  2426. //  Implements the Authenticode Time Stamp chain policy verification checks.
  2427. //
  2428. //  pvExtraPolicyPara may optionally be set to point to the following
  2429. //  AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA.
  2430. //
  2431. //  pvExtraPolicyStatus isn't used and must be set to NULL.
  2432. //--------------------------------------------------------------------------
  2433. // dwRegPolicySettings are defined in wintrust.h
  2434. typedef struct _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA {
  2435.     DWORD               cbSize;
  2436.     DWORD               dwRegPolicySettings;
  2437.     BOOL                fCommercial;
  2438. } AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA,
  2439.     *PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
  2440. //+-------------------------------------------------------------------------
  2441. //  CERT_CHAIN_POLICY_SSL
  2442. //
  2443. //  Implements the SSL client/server chain policy verification checks.
  2444. //
  2445. //  pvExtraPolicyPara may optionally be set to point to the following
  2446. //  SSL_EXTRA_CERT_CHAIN_POLICY_PARA data structure
  2447. //--------------------------------------------------------------------------
  2448. // fdwChecks flags are defined in wininet.h
  2449. typedef struct _HTTPSPolicyCallbackData
  2450. {
  2451.     union {
  2452.         DWORD           cbStruct;       // sizeof(HTTPSPolicyCallbackData);
  2453.         DWORD           cbSize;         // sizeof(HTTPSPolicyCallbackData);
  2454.     };
  2455.     DWORD           dwAuthType;
  2456. #                       define      AUTHTYPE_CLIENT         1
  2457. #                       define      AUTHTYPE_SERVER         2
  2458.     DWORD           fdwChecks;
  2459.     WCHAR           *pwszServerName; // used to check against CN=xxxx
  2460. } HTTPSPolicyCallbackData, *PHTTPSPolicyCallbackData,
  2461.     SSL_EXTRA_CERT_CHAIN_POLICY_PARA, *PSSL_EXTRA_CERT_CHAIN_POLICY_PARA;
  2462. //+-------------------------------------------------------------------------
  2463. //  CERT_CHAIN_POLICY_BASIC_CONSTRAINTS
  2464. //
  2465. //  Implements the basic constraints chain policy.
  2466. //
  2467. //  Iterates through all the certificates in the chain checking for either
  2468. //  a szOID_BASIC_CONSTRAINTS or a szOID_BASIC_CONSTRAINTS2 extension. If
  2469. //  neither extension is present, the certificate is assumed to have
  2470. //  valid policy. Otherwise, for the first certificate element, checks if
  2471. //  it matches the expected CA_FLAG or END_ENTITY_FLAG specified in
  2472. //  pPolicyPara->dwFlags. If neither or both flags are set, then, the first
  2473. //  element can be either a CA or END_ENTITY. All other elements must be
  2474. //  a CA. If the PathLenConstraint is present in the extension, its
  2475. //  checked.
  2476. //
  2477. //  The first elements in the remaining simple chains (ie, the certificate
  2478. //  used to sign the CTL) are checked to be an END_ENTITY.
  2479. //
  2480. //  If this verification fails, dwError will be set to
  2481. //  TRUST_E_BASIC_CONSTRAINTS.
  2482. //--------------------------------------------------------------------------
  2483. #define BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_CA_FLAG         0x80000000
  2484. #define BASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAG 0x40000000
  2485. //+-------------------------------------------------------------------------
  2486. //  CERT_CHAIN_POLICY_NT_AUTH
  2487. //
  2488. //  Implements the NT Authentication chain policy.
  2489. //
  2490. //  The NT Authentication chain policy consists of 3 distinct chain
  2491. //  verifications in the following order:
  2492. //      [1] CERT_CHAIN_POLICY_BASE - Implements the base chain policy
  2493. //          verification checks. The LOWORD of dwFlags can be set in
  2494. //          pPolicyPara to alter the default policy checking behaviour. See
  2495. //          CERT_CHAIN_POLICY_BASE for more details.
  2496. //
  2497. //      [2] CERT_CHAIN_POLICY_BASIC_CONSTRAINTS - Implements the basic
  2498. //          constraints chain policy. The HIWORD of dwFlags can be set
  2499. //          to specify if the first element must be either a CA or END_ENTITY.
  2500. //          See CERT_CHAIN_POLICY_BASIC_CONSTRAINTS for more details.
  2501. //
  2502. //      [3] Checks if the second element in the chain, the CA that issued
  2503. //          the end certificate, is a trusted CA for NT
  2504. //          Authentication. A CA is considered to be trusted if it exists in
  2505. //          the "NTAuth" system registry store found in the
  2506. //          CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE store location.
  2507. //          If this verification fails, whereby the CA isn't trusted,
  2508. //          dwError is set to CERT_E_UNTRUSTEDCA.
  2509. //
  2510. //          If CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG is set
  2511. //          in the "Flags" value of the HKLM policy "ProtectedRoots" subkey
  2512. //          defined by CERT_PROT_ROOT_FLAGS_REGPATH, then,
  2513. //          if the above check fails, checks if the chain
  2514. //          has CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS set in dwInfoStatus. This
  2515. //          will only be set if there was a valid name constraint for all
  2516. //          name spaces including UPN. If the chain doesn't have this info
  2517. //          status set, dwError is set to CERT_E_UNTRUSTEDCA.
  2518. //--------------------------------------------------------------------------
  2519. //+-------------------------------------------------------------------------
  2520. //  CERT_CHAIN_POLICY_MICROSOFT_ROOT
  2521. //
  2522. //  Checks if the last element of the first simple chain contains a
  2523. //  Microsoft root public key. If it doesn't contain a Microsoft root
  2524. //  public key, dwError is set to CERT_E_UNTRUSTEDROOT.
  2525. //
  2526. //  pvExtraPolicyPara and pvExtraPolicyStatus aren't used and must be set
  2527. //  to NULL.
  2528. //--------------------------------------------------------------------------
  2529. //+-------------------------------------------------------------------------
  2530. // convert formatted string to binary
  2531. // If cchString is 0, then pszString is NULL terminated and
  2532. // cchString is obtained via strlen() + 1.
  2533. // dwFlags defines string format
  2534. // if pbBinary is NULL, *pcbBinary returns the size of required memory
  2535. // *pdwSkip returns the character count of skipped strings, optional
  2536. // *pdwFlags returns the actual format used in the conversion, optional
  2537. //--------------------------------------------------------------------------
  2538. WINCRYPT32STRINGAPI
  2539. BOOL
  2540. WINAPI
  2541. CryptStringToBinaryA(
  2542.     IN     LPCSTR  pszString,
  2543.     IN     DWORD     cchString,
  2544.     IN     DWORD     dwFlags,
  2545.     IN     BYTE     *pbBinary,
  2546.     IN OUT DWORD    *pcbBinary,
  2547.     OUT    DWORD    *pdwSkip,    //OPTIONAL
  2548.     OUT    DWORD    *pdwFlags    //OPTIONAL
  2549.     );
  2550. //+-------------------------------------------------------------------------
  2551. // convert formatted string to binary
  2552. // If cchString is 0, then pszString is NULL terminated and
  2553. // cchString is obtained via strlen() + 1.
  2554. // dwFlags defines string format
  2555. // if pbBinary is NULL, *pcbBinary returns the size of required memory
  2556. // *pdwSkip returns the character count of skipped strings, optional
  2557. // *pdwFlags returns the actual format used in the conversion, optional
  2558. //--------------------------------------------------------------------------
  2559. WINCRYPT32STRINGAPI
  2560. BOOL
  2561. WINAPI
  2562. CryptStringToBinaryW(
  2563.     IN     LPCWSTR  pszString,
  2564.     IN     DWORD     cchString,
  2565.     IN     DWORD     dwFlags,
  2566.     IN     BYTE     *pbBinary,
  2567.     IN OUT DWORD    *pcbBinary,
  2568.     OUT    DWORD    *pdwSkip,    //OPTIONAL
  2569.     OUT    DWORD    *pdwFlags    //OPTIONAL
  2570.     );
  2571. #ifdef UNICODE
  2572. #define CryptStringToBinary  CryptStringToBinaryW
  2573. #else
  2574. #define CryptStringToBinary  CryptStringToBinaryA
  2575. #endif // !UNICODE
  2576. //+-------------------------------------------------------------------------
  2577. // convert binary to formatted string
  2578. // dwFlags defines string format
  2579. // if pszString is NULL, *pcchString returns the size of required memory in byte
  2580. //--------------------------------------------------------------------------
  2581. WINCRYPT32STRINGAPI
  2582. BOOL
  2583. WINAPI
  2584. CryptBinaryToStringA(
  2585.     IN     CONST BYTE  *pbBinary,
  2586.     IN     DWORD        cbBinary,
  2587.     IN     DWORD        dwFlags,
  2588.     IN     LPSTR      pszString,
  2589.     IN OUT DWORD       *pcchString
  2590.     );
  2591. //+-------------------------------------------------------------------------
  2592. // convert binary to formatted string
  2593. // dwFlags defines string format
  2594. // if pszString is NULL, *pcchString returns the size of required memory in byte
  2595. //--------------------------------------------------------------------------
  2596. WINCRYPT32STRINGAPI
  2597. BOOL
  2598. WINAPI
  2599. CryptBinaryToStringW(
  2600.     IN     CONST BYTE  *pbBinary,
  2601.     IN     DWORD        cbBinary,
  2602.     IN     DWORD        dwFlags,
  2603.     IN     LPWSTR      pszString,
  2604.     IN OUT DWORD       *pcchString
  2605.     );
  2606. #ifdef UNICODE
  2607. #define CryptBinaryToString  CryptBinaryToStringW
  2608. #else
  2609. #define CryptBinaryToString  CryptBinaryToStringA
  2610. #endif // !UNICODE
  2611. // dwFlags has the following defines
  2612. #define CRYPT_STRING_BASE64HEADER           0x00000000
  2613. #define CRYPT_STRING_BASE64                 0x00000001
  2614. #define CRYPT_STRING_BINARY                 0x00000002
  2615. #define CRYPT_STRING_BASE64REQUESTHEADER    0x00000003
  2616. #define CRYPT_STRING_HEX                    0x00000004
  2617. #define CRYPT_STRING_HEXASCII               0x00000005
  2618. #define CRYPT_STRING_BASE64_ANY             0x00000006
  2619. #define CRYPT_STRING_ANY                    0x00000007
  2620. #define CRYPT_STRING_HEX_ANY                0x00000008
  2621. #define CRYPT_STRING_BASE64X509CRLHEADER    0x00000009
  2622. #define CRYPT_STRING_HEXADDR                0x0000000a
  2623. #define CRYPT_STRING_HEXASCIIADDR           0x0000000b
  2624. #define CRYPT_STRING_NOCR                   0x80000000
  2625. // CryptBinaryToString uses the following flags
  2626. // CRYPT_STRING_BASE64HEADER - base64 format with certificate begin
  2627. //                             and end headers
  2628. // CRYPT_STRING_BASE64 - only base64 without headers
  2629. // CRYPT_STRING_BINARY - pure binary copy
  2630. // CRYPT_STRING_BASE64REQUESTHEADER - base64 format with request begin
  2631. //                                    and end headers
  2632. // CRYPT_STRING_BASE64X509CRLHEADER - base64 format with x509 crl begin
  2633. //                                    and end headers
  2634. // CRYPT_STRING_HEX - only hex format
  2635. // CRYPT_STRING_HEXASCII - hex format with ascii char display
  2636. // CRYPT_STRING_HEXADDR - hex format with address display
  2637. // CRYPT_STRING_HEXASCIIADDR - hex format with ascii char and address display
  2638. //
  2639. // CryptBinaryToString accepts CRYPT_STRING_NOCR or'd into one of the above.
  2640. // When set, line breaks contain only LF, instead of CR-LF pairs.
  2641. // CryptStringToBinary uses the following flags
  2642. // CRYPT_STRING_BASE64_ANY tries the following, in order:
  2643. //    CRYPT_STRING_BASE64HEADER
  2644. //    CRYPT_STRING_BASE64
  2645. // CRYPT_STRING_ANY tries the following, in order:
  2646. //    CRYPT_STRING_BASE64_ANY
  2647. //    CRYPT_STRING_BINARY -- should always succeed
  2648. // CRYPT_STRING_HEX_ANY tries the following, in order:
  2649. //    CRYPT_STRING_HEXADDR
  2650. //    CRYPT_STRING_HEXASCIIADDR
  2651. //    CRYPT_STRING_HEXASCII
  2652. //    CRYPT_STRING_HEX
  2653. //+=========================================================================
  2654. //  PFX (PKCS #12) function defintions and types
  2655. //==========================================================================
  2656. //+-------------------------------------------------------------------------
  2657. //      PFXImportCertStore
  2658. //
  2659. //  Import the PFX blob and return a store containing certificates
  2660. //
  2661. //  If the password parameter is incorrect or any other problems decoding
  2662. //  the PFX blob are encountered, the function will return NULL and the
  2663. //      error code can be found from GetLastError(). 
  2664. //
  2665. //  The dwFlags parameter may be set to the following:
  2666. //  CRYPT_EXPORTABLE - specify that any imported keys should be marked as 
  2667. //                     exportable (see documentation on CryptImportKey)
  2668. //  CRYPT_USER_PROTECTED - (see documentation on CryptImportKey)
  2669. //  CRYPT_MACHINE_KEYSET - used to force the private key to be stored in the
  2670. //                        the local machine and not the current user.
  2671. //  CRYPT_USER_KEYSET - used to force the private key to be stored in the
  2672. //                      the current user and not the local machine, even if
  2673. //                      the pfx blob specifies that it should go into local
  2674. //                      machine.
  2675. //--------------------------------------------------------------------------
  2676. WINCRYPT32API
  2677. HCERTSTORE
  2678. WINAPI
  2679. PFXImportCertStore(
  2680.     IN CRYPT_DATA_BLOB* pPFX,
  2681.     IN LPCWSTR szPassword,
  2682.     IN DWORD   dwFlags);
  2683. // dwFlags definitions for PFXImportCertStore
  2684. //#define CRYPT_EXPORTABLE        0x00000001  // CryptImportKey dwFlags
  2685. //#define CRYPT_USER_PROTECTED    0x00000002  // CryptImportKey dwFlags
  2686. //#define CRYPT_MACHINE_KEYSET    0x00000020  // CryptAcquireContext dwFlags
  2687. #define CRYPT_USER_KEYSET         0x00001000     
  2688. #define PKCS12_IMPORT_RESERVED_MASK    0xffff0000 
  2689. //+-------------------------------------------------------------------------
  2690. //      PFXIsPFXBlob
  2691. //
  2692. //  This function will try to decode the outer layer of the blob as a pfx 
  2693. //  blob, and if that works it will return TRUE, it will return FALSE otherwise
  2694. //
  2695. //--------------------------------------------------------------------------
  2696. WINCRYPT32API
  2697. BOOL
  2698. WINAPI
  2699. PFXIsPFXBlob(
  2700.     IN CRYPT_DATA_BLOB* pPFX);
  2701. //+-------------------------------------------------------------------------
  2702. //      PFXVerifyPassword
  2703. //
  2704. //  This function will attempt to decode the outer layer of the blob as a pfx 
  2705. //  blob and decrypt with the given password. No data from the blob will be
  2706. //  imported.
  2707. //
  2708. //  Return value is TRUE if password appears correct, FALSE otherwise.
  2709. //
  2710. //--------------------------------------------------------------------------
  2711. WINCRYPT32API
  2712. BOOL 
  2713. WINAPI
  2714. PFXVerifyPassword(
  2715.     IN CRYPT_DATA_BLOB* pPFX,
  2716.     IN LPCWSTR szPassword,
  2717.     IN DWORD dwFlags);
  2718. //+-------------------------------------------------------------------------
  2719. //      PFXExportCertStoreEx
  2720. //
  2721. //  Export the certificates and private keys referenced in the passed-in store 
  2722. //
  2723. //  This API encodes the blob under a stronger algorithm. The resulting
  2724. //  PKCS12 blobs are incompatible with the earlier PFXExportCertStore API.
  2725. //
  2726. //  The value passed in the password parameter will be used to encrypt and 
  2727. //  verify the integrity of the PFX packet. If any problems encoding the store
  2728. //  are encountered, the function will return FALSE and the error code can 
  2729. //  be found from GetLastError(). 
  2730. //
  2731. //  The dwFlags parameter may be set to any combination of 
  2732. //      EXPORT_PRIVATE_KEYS
  2733. //      REPORT_NO_PRIVATE_KEY
  2734. //      REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY
  2735. //
  2736. //  The encoded PFX blob is returned in *pPFX. If pPFX->pbData is NULL upon
  2737. //  input, this is a length only calculation, whereby, pPFX->cbData is updated
  2738. //  with the number of bytes required for the encoded blob. Otherwise,
  2739. //  the memory pointed to by pPFX->pbData is updated with the encoded bytes
  2740. //  and pPFX->cbData is updated with the encoded byte length.
  2741. //--------------------------------------------------------------------------
  2742. WINCRYPT32API
  2743. BOOL
  2744. WINAPI
  2745. PFXExportCertStoreEx(
  2746.     IN HCERTSTORE hStore,
  2747.     IN OUT CRYPT_DATA_BLOB* pPFX,
  2748.     IN LPCWSTR szPassword,
  2749.     IN void*   pvReserved,
  2750.     IN DWORD   dwFlags);
  2751. // dwFlags definitions for PFXExportCertStoreEx
  2752. #define REPORT_NO_PRIVATE_KEY                   0x0001
  2753. #define REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY   0x0002
  2754. #define EXPORT_PRIVATE_KEYS                     0x0004
  2755. #define PKCS12_EXPORT_RESERVED_MASK             0xffff0000
  2756. //+-------------------------------------------------------------------------
  2757. //      PFXExportCertStore
  2758. //
  2759. //  Export the certificates and private keys referenced in the passed-in store 
  2760. //
  2761. //  This is an old API kept for compatibility with IE4 clients. New applications
  2762. //  should call the above PfxExportCertStoreEx for enhanced security.
  2763. //--------------------------------------------------------------------------
  2764. WINCRYPT32API
  2765. BOOL
  2766. WINAPI
  2767. PFXExportCertStore(
  2768.     IN HCERTSTORE hStore,
  2769.     IN OUT CRYPT_DATA_BLOB* pPFX,
  2770.     IN LPCWSTR szPassword,
  2771.     IN DWORD   dwFlags);
  2772. #ifdef __cplusplus
  2773. }       // Balance extern "C" above
  2774. #endif
  2775. #if defined (_MSC_VER)
  2776. #if ( _MSC_VER >= 800 )
  2777. #if _MSC_VER >= 1200
  2778. #pragma warning(pop)
  2779. #else
  2780. #pragma warning(default:4201)
  2781. #endif
  2782. #endif
  2783. #endif
  2784. #endif // __WINCRYPT_H__