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

模拟服务器

开发平台:

C/C++

  1. //  also copied.  Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
  2. //  CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied.
  3. //
  4. //  Makes a copy of the certificate context before adding to the store.
  5. //
  6. //  dwAddDispostion specifies the action to take if the certificate
  7. //  already exists in the store. This parameter must be one of the following
  8. //  values:
  9. //    CERT_STORE_ADD_NEW
  10. //      Fails if the certificate already exists in the store. LastError
  11. //      is set to CRYPT_E_EXISTS.
  12. //    CERT_STORE_ADD_USE_EXISTING
  13. //      If the certifcate already exists, then, its used and if ppStoreContext
  14. //      is non-NULL, the existing context is duplicated. Iterates
  15. //      through pCertContext's properties and only copies the properties
  16. //      that don't already exist. The SHA1 and MD5 hash properties aren't
  17. //      copied.
  18. //    CERT_STORE_ADD_REPLACE_EXISTING
  19. //      If the certificate already exists, then, the existing certificate
  20. //      context is deleted before creating and adding a new context.
  21. //      Properties are copied before doing the add.
  22. //    CERT_STORE_ADD_ALWAYS
  23. //      No check is made to see if the certificate already exists. A
  24. //      new certificate context is always created and added. This may lead to
  25. //      duplicates in the store. Properties are
  26. //      copied before doing the add.
  27. //    CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES
  28. //      If the certificate already exists, then, the existing certificate
  29. //      context is used. Properties from the added context are copied and
  30. //      replace existing properties. However, any existing properties not
  31. //      in the added context remain and aren't deleted.
  32. //    CERT_STORE_ADD_NEWER
  33. //      Fails if the certificate already exists in the store AND the NotBefore
  34. //      time of the existing context is equal to or greater than the
  35. //      NotBefore time of the new context being added. LastError
  36. //      is set to CRYPT_E_EXISTS.
  37. //
  38. //      If an older context is replaced, same as
  39. //      CERT_STORE_ADD_REPLACE_EXISTING.
  40. //
  41. //      For CRLs or CTLs compares the ThisUpdate times.
  42. //
  43. //    CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES
  44. //      Same as CERT_STORE_ADD_NEWER. However, if an older context is
  45. //      replaced, same as CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES.
  46. //
  47. //  CertGetSubjectCertificateFromStore is called to determine if the
  48. //  certificate already exists in the store.
  49. //
  50. //  ppStoreContext can be NULL, indicating the caller isn't interested
  51. //  in getting the CERT_CONTEXT of the added or existing certificate.
  52. //--------------------------------------------------------------------------
  53. WINCRYPT32API
  54. BOOL
  55. WINAPI
  56. CertAddCertificateContextToStore(
  57.     IN HCERTSTORE hCertStore,
  58.     IN PCCERT_CONTEXT pCertContext,
  59.     IN DWORD dwAddDisposition,
  60.     OUT OPTIONAL PCCERT_CONTEXT *ppStoreContext
  61.     );
  62. //+-------------------------------------------------------------------------
  63. //  Certificate Store Context Types
  64. //--------------------------------------------------------------------------
  65. #define CERT_STORE_CERTIFICATE_CONTEXT  1
  66. #define CERT_STORE_CRL_CONTEXT          2
  67. #define CERT_STORE_CTL_CONTEXT          3
  68. //+-------------------------------------------------------------------------
  69. //  Certificate Store Context Bit Flags
  70. //--------------------------------------------------------------------------
  71. #define CERT_STORE_ALL_CONTEXT_FLAG             (~0UL)
  72. #define CERT_STORE_CERTIFICATE_CONTEXT_FLAG     
  73.                 (1 << CERT_STORE_CERTIFICATE_CONTEXT)
  74. #define CERT_STORE_CRL_CONTEXT_FLAG             
  75.                 (1 << CERT_STORE_CRL_CONTEXT)
  76. #define CERT_STORE_CTL_CONTEXT_FLAG             
  77.                 (1 << CERT_STORE_CTL_CONTEXT)
  78. //+-------------------------------------------------------------------------
  79. //  Add the serialized certificate or CRL element to the store.
  80. //
  81. //  The serialized element contains the encoded certificate, CRL or CTL and
  82. //  its properties, such as, CERT_KEY_PROV_INFO_PROP_ID.
  83. //
  84. //  If hCertStore is NULL, creates a certificate, CRL or CTL context not
  85. //  residing in any store.
  86. //
  87. //  dwAddDispostion specifies the action to take if the certificate or CRL
  88. //  already exists in the store. See CertAddCertificateContextToStore for a
  89. //  list of and actions taken.
  90. //
  91. //  dwFlags currently isn't used and should be set to 0.
  92. //
  93. //  dwContextTypeFlags specifies the set of allowable contexts. For example, to
  94. //  add either a certificate or CRL, set dwContextTypeFlags to:
  95. //      CERT_STORE_CERTIFICATE_CONTEXT_FLAG | CERT_STORE_CRL_CONTEXT_FLAG
  96. //
  97. //  *pdwContextType is updated with the type of the context returned in
  98. //  *ppvContxt. pdwContextType or ppvContext can be NULL, indicating the
  99. //  caller isn't interested in getting the output. If *ppvContext is
  100. //  returned it must be freed by calling CertFreeCertificateContext or
  101. //  CertFreeCRLContext.
  102. //--------------------------------------------------------------------------
  103. WINCRYPT32API
  104. BOOL
  105. WINAPI
  106. CertAddSerializedElementToStore(
  107.     IN HCERTSTORE hCertStore,
  108.     IN const BYTE *pbElement,
  109.     IN DWORD cbElement,
  110.     IN DWORD dwAddDisposition,
  111.     IN DWORD dwFlags,
  112.     IN DWORD dwContextTypeFlags,
  113.     OUT OPTIONAL DWORD *pdwContextType,
  114.     OUT OPTIONAL const void **ppvContext
  115.     );
  116. //+-------------------------------------------------------------------------
  117. //  Delete the specified certificate from the store.
  118. //
  119. //  All subsequent gets or finds for the certificate will fail. However,
  120. //  memory allocated for the certificate isn't freed until all of its contexts
  121. //  have also been freed.
  122. //
  123. //  The pCertContext is obtained from a get, enum, find or duplicate.
  124. //
  125. //  Some store provider implementations might also delete the issuer's CRLs
  126. //  if this is the last certificate for the issuer in the store.
  127. //
  128. //  NOTE: the pCertContext is always CertFreeCertificateContext'ed by
  129. //  this function, even for an error.
  130. //--------------------------------------------------------------------------
  131. WINCRYPT32API
  132. BOOL
  133. WINAPI
  134. CertDeleteCertificateFromStore(
  135.     IN PCCERT_CONTEXT pCertContext
  136.     );
  137. //+-------------------------------------------------------------------------
  138. //  Add the encoded CRL to the store according to the specified
  139. //  disposition option.
  140. //
  141. //  Makes a copy of the encoded CRL before adding to the store.
  142. //
  143. //  dwAddDispostion specifies the action to take if the CRL
  144. //  already exists in the store. See CertAddEncodedCertificateToStore for a
  145. //  list of and actions taken.
  146. //
  147. //  Compares the CRL's Issuer to determine if the CRL already exists in the
  148. //  store.
  149. //
  150. //  ppCrlContext can be NULL, indicating the caller isn't interested
  151. //  in getting the CRL_CONTEXT of the added or existing CRL.
  152. //--------------------------------------------------------------------------
  153. WINCRYPT32API
  154. BOOL
  155. WINAPI
  156. CertAddEncodedCRLToStore(
  157.     IN HCERTSTORE hCertStore,
  158.     IN DWORD dwCertEncodingType,
  159.     IN const BYTE *pbCrlEncoded,
  160.     IN DWORD cbCrlEncoded,
  161.     IN DWORD dwAddDisposition,
  162.     OUT OPTIONAL PCCRL_CONTEXT *ppCrlContext
  163.     );
  164. //+-------------------------------------------------------------------------
  165. //  Add the CRL context to the store according to the specified
  166. //  disposition option.
  167. //
  168. //  In addition to the encoded CRL, the context's properties are
  169. //  also copied.  Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
  170. //  CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied.
  171. //
  172. //  Makes a copy of the encoded CRL before adding to the store.
  173. //
  174. //  dwAddDispostion specifies the action to take if the CRL
  175. //  already exists in the store. See CertAddCertificateContextToStore for a
  176. //  list of and actions taken.
  177. //
  178. //  Compares the CRL's Issuer, ThisUpdate and NextUpdate to determine
  179. //  if the CRL already exists in the store.
  180. //
  181. //  ppStoreContext can be NULL, indicating the caller isn't interested
  182. //  in getting the CRL_CONTEXT of the added or existing CRL.
  183. //--------------------------------------------------------------------------
  184. WINCRYPT32API
  185. BOOL
  186. WINAPI
  187. CertAddCRLContextToStore(
  188.     IN HCERTSTORE hCertStore,
  189.     IN PCCRL_CONTEXT pCrlContext,
  190.     IN DWORD dwAddDisposition,
  191.     OUT OPTIONAL PCCRL_CONTEXT *ppStoreContext
  192.     );
  193. //+-------------------------------------------------------------------------
  194. //  Delete the specified CRL from the store.
  195. //
  196. //  All subsequent gets for the CRL will fail. However,
  197. //  memory allocated for the CRL isn't freed until all of its contexts
  198. //  have also been freed.
  199. //
  200. //  The pCrlContext is obtained from a get or duplicate.
  201. //
  202. //  NOTE: the pCrlContext is always CertFreeCRLContext'ed by
  203. //  this function, even for an error.
  204. //--------------------------------------------------------------------------
  205. WINCRYPT32API
  206. BOOL
  207. WINAPI
  208. CertDeleteCRLFromStore(
  209.     IN PCCRL_CONTEXT pCrlContext
  210.     );
  211. //+-------------------------------------------------------------------------
  212. //  Serialize the certificate context's encoded certificate and its
  213. //  properties.
  214. //--------------------------------------------------------------------------
  215. WINCRYPT32API
  216. BOOL
  217. WINAPI
  218. CertSerializeCertificateStoreElement(
  219.     IN PCCERT_CONTEXT pCertContext,
  220.     IN DWORD dwFlags,
  221.     OUT BYTE *pbElement,
  222.     IN OUT DWORD *pcbElement
  223.     );
  224. //+-------------------------------------------------------------------------
  225. //  Serialize the CRL context's encoded CRL and its properties.
  226. //--------------------------------------------------------------------------
  227. WINCRYPT32API
  228. BOOL
  229. WINAPI
  230. CertSerializeCRLStoreElement(
  231.     IN PCCRL_CONTEXT pCrlContext,
  232.     IN DWORD dwFlags,
  233.     OUT BYTE *pbElement,
  234.     IN OUT DWORD *pcbElement
  235.     );
  236. //+=========================================================================
  237. //  Certificate Trust List (CTL) Store Data Structures and APIs
  238. //==========================================================================
  239. //+-------------------------------------------------------------------------
  240. //  Duplicate a CTL context
  241. //--------------------------------------------------------------------------
  242. WINCRYPT32API
  243. PCCTL_CONTEXT
  244. WINAPI
  245. CertDuplicateCTLContext(
  246.     IN PCCTL_CONTEXT pCtlContext
  247.     );
  248. //+-------------------------------------------------------------------------
  249. //  Create a CTL context from the encoded CTL. The created
  250. //  context isn't put in a store.
  251. //
  252. //  Makes a copy of the encoded CTL in the created context.
  253. //
  254. //  If unable to decode and create the CTL context, NULL is returned.
  255. //  Otherwise, a pointer to a read only CTL_CONTEXT is returned.
  256. //  CTL_CONTEXT must be freed by calling CertFreeCTLContext.
  257. //  CertDuplicateCTLContext can be called to make a duplicate.
  258. //
  259. //  CertSetCTLContextProperty and CertGetCTLContextProperty can be called
  260. //  to store properties for the CTL.
  261. //--------------------------------------------------------------------------
  262. WINCRYPT32API
  263. PCCTL_CONTEXT
  264. WINAPI
  265. CertCreateCTLContext(
  266.     IN DWORD dwMsgAndCertEncodingType,
  267.     IN const BYTE *pbCtlEncoded,
  268.     IN DWORD cbCtlEncoded
  269.     );
  270. //+-------------------------------------------------------------------------
  271. //  Free a CTL context
  272. //
  273. //  There needs to be a corresponding free for each context obtained by a
  274. //  get, duplicate or create.
  275. //--------------------------------------------------------------------------
  276. WINCRYPT32API
  277. BOOL
  278. WINAPI
  279. CertFreeCTLContext(
  280.     IN PCCTL_CONTEXT pCtlContext
  281.     );
  282. //+-------------------------------------------------------------------------
  283. //  Set the property for the specified CTL context.
  284. //
  285. //  Same Property Ids and semantics as CertSetCertificateContextProperty.
  286. //--------------------------------------------------------------------------
  287. WINCRYPT32API
  288. BOOL
  289. WINAPI
  290. CertSetCTLContextProperty(
  291.     IN PCCTL_CONTEXT pCtlContext,
  292.     IN DWORD dwPropId,
  293.     IN DWORD dwFlags,
  294.     IN const void *pvData
  295.     );
  296. //+-------------------------------------------------------------------------
  297. //  Get the property for the specified CTL context.
  298. //
  299. //  Same Property Ids and semantics as CertGetCertificateContextProperty.
  300. //
  301. //  CERT_SHA1_HASH_PROP_ID or CERT_NEXT_UPDATE_LOCATION_PROP_ID are the
  302. //  predefined properties of most interest.
  303. //--------------------------------------------------------------------------
  304. WINCRYPT32API
  305. BOOL
  306. WINAPI
  307. CertGetCTLContextProperty(
  308.     IN PCCTL_CONTEXT pCtlContext,
  309.     IN DWORD dwPropId,
  310.     OUT void *pvData,
  311.     IN OUT DWORD *pcbData
  312.     );
  313. //+-------------------------------------------------------------------------
  314. //  Enumerate the properties for the specified CTL context.
  315. //--------------------------------------------------------------------------
  316. WINCRYPT32API
  317. DWORD
  318. WINAPI
  319. CertEnumCTLContextProperties(
  320.     IN PCCTL_CONTEXT pCtlContext,
  321.     IN DWORD dwPropId
  322.     );
  323. //+-------------------------------------------------------------------------
  324. //  Enumerate the CTL contexts in the store.
  325. //
  326. //  If a CTL isn't found, NULL is returned.
  327. //  Otherwise, a pointer to a read only CTL_CONTEXT is returned. CTL_CONTEXT
  328. //  must be freed by calling CertFreeCTLContext or is freed when passed as the
  329. //  pPrevCtlContext on a subsequent call. CertDuplicateCTLContext
  330. //  can be called to make a duplicate.
  331. //
  332. //  pPrevCtlContext MUST BE NULL to enumerate the first
  333. //  CTL in the store. Successive CTLs are enumerated by setting
  334. //  pPrevCtlContext to the CTL_CONTEXT returned by a previous call.
  335. //
  336. //  NOTE: a NON-NULL pPrevCtlContext is always CertFreeCTLContext'ed by
  337. //  this function, even for an error.
  338. //--------------------------------------------------------------------------
  339. WINCRYPT32API
  340. PCCTL_CONTEXT
  341. WINAPI
  342. CertEnumCTLsInStore(
  343.     IN HCERTSTORE hCertStore,
  344.     IN PCCTL_CONTEXT pPrevCtlContext
  345.     );
  346. //+-------------------------------------------------------------------------
  347. //  Attempt to find the specified subject in the CTL.
  348. //
  349. //  For CTL_CERT_SUBJECT_TYPE, pvSubject points to a CERT_CONTEXT. The CTL's
  350. //  SubjectAlgorithm is examined to determine the representation of the
  351. //  subject's identity. Initially, only SHA1 or MD5 hash will be supported.
  352. //  The appropriate hash property is obtained from the CERT_CONTEXT.
  353. //
  354. //  For CTL_ANY_SUBJECT_TYPE, pvSubject points to the CTL_ANY_SUBJECT_INFO
  355. //  structure which contains the SubjectAlgorithm to be matched in the CTL
  356. //  and the SubjectIdentifer to be matched in one of the CTL entries.
  357. //
  358. //  The certificate's hash or the CTL_ANY_SUBJECT_INFO's SubjectIdentifier
  359. //  is used as the key in searching the subject entries. A binary
  360. //  memory comparison is done between the key and the entry's SubjectIdentifer.
  361. //
  362. //  dwEncodingType isn't used for either of the above SubjectTypes.
  363. //--------------------------------------------------------------------------
  364. WINCRYPT32API
  365. PCTL_ENTRY
  366. WINAPI
  367. CertFindSubjectInCTL(
  368.     IN DWORD dwEncodingType,
  369.     IN DWORD dwSubjectType,
  370.     IN void *pvSubject,
  371.     IN PCCTL_CONTEXT pCtlContext,
  372.     IN DWORD dwFlags
  373.     );
  374. // Subject Types:
  375. //  CTL_ANY_SUBJECT_TYPE, pvSubject points to following CTL_ANY_SUBJECT_INFO.
  376. //  CTL_CERT_SUBJECT_TYPE, pvSubject points to CERT_CONTEXT.
  377. #define CTL_ANY_SUBJECT_TYPE            1
  378. #define CTL_CERT_SUBJECT_TYPE           2
  379. typedef struct _CTL_ANY_SUBJECT_INFO {
  380.     CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
  381.     CRYPT_DATA_BLOB             SubjectIdentifier;
  382. } CTL_ANY_SUBJECT_INFO, *PCTL_ANY_SUBJECT_INFO;
  383. //+-------------------------------------------------------------------------
  384. //  Find the first or next CTL context in the store.
  385. //
  386. //  The CTL is found according to the dwFindType and its pvFindPara.
  387. //  See below for a list of the find types and its parameters.
  388. //
  389. //  Currently dwFindFlags isn't used and must be set to 0.
  390. //
  391. //  Usage of dwMsgAndCertEncodingType depends on the dwFindType.
  392. //
  393. //  If the first or next CTL isn't found, NULL is returned.
  394. //  Otherwise, a pointer to a read only CTL_CONTEXT is returned. CTL_CONTEXT
  395. //  must be freed by calling CertFreeCTLContext or is freed when passed as the
  396. //  pPrevCtlContext on a subsequent call. CertDuplicateCTLContext
  397. //  can be called to make a duplicate.
  398. //
  399. //  pPrevCtlContext MUST BE NULL on the first
  400. //  call to find the CTL. To find the next CTL, the
  401. //  pPrevCtlContext is set to the CTL_CONTEXT returned by a previous call.
  402. //
  403. //  NOTE: a NON-NULL pPrevCtlContext is always CertFreeCTLContext'ed by
  404. //  this function, even for an error.
  405. //--------------------------------------------------------------------------
  406. WINCRYPT32API
  407. PCCTL_CONTEXT
  408. WINAPI
  409. CertFindCTLInStore(
  410.     IN HCERTSTORE hCertStore,
  411.     IN DWORD dwMsgAndCertEncodingType,
  412.     IN DWORD dwFindFlags,
  413.     IN DWORD dwFindType,
  414.     IN const void *pvFindPara,
  415.     IN PCCTL_CONTEXT pPrevCtlContext
  416.     );
  417. #define CTL_FIND_ANY                0
  418. #define CTL_FIND_SHA1_HASH          1
  419. #define CTL_FIND_MD5_HASH           2
  420. #define CTL_FIND_USAGE              3
  421. #define CTL_FIND_SUBJECT            4
  422. #define CTL_FIND_EXISTING           5
  423. typedef struct _CTL_FIND_USAGE_PARA {
  424.     DWORD               cbSize;
  425.     CTL_USAGE           SubjectUsage;   // optional
  426.     CRYPT_DATA_BLOB     ListIdentifier; // optional
  427.     PCERT_INFO          pSigner;        // optional
  428. } CTL_FIND_USAGE_PARA, *PCTL_FIND_USAGE_PARA;
  429. #define CTL_FIND_NO_LIST_ID_CBDATA  0xFFFFFFFF
  430. #define CTL_FIND_NO_SIGNER_PTR      ((PCERT_INFO) -1)
  431. #define CTL_FIND_SAME_USAGE_FLAG    0x1
  432. typedef struct _CTL_FIND_SUBJECT_PARA {
  433.     DWORD                   cbSize;
  434.     PCTL_FIND_USAGE_PARA    pUsagePara; // optional
  435.     DWORD                   dwSubjectType;
  436.     void                    *pvSubject;
  437. } CTL_FIND_SUBJECT_PARA, *PCTL_FIND_SUBJECT_PARA;
  438. //+-------------------------------------------------------------------------
  439. //  CTL_FIND_ANY
  440. //
  441. //  Find any CTL.
  442. //
  443. //  pvFindPara isn't used.
  444. //--------------------------------------------------------------------------
  445. //+-------------------------------------------------------------------------
  446. //  CTL_FIND_SHA1_HASH
  447. //  CTL_FIND_MD5_HASH
  448. //
  449. //  Find a CTL with the specified hash.
  450. //
  451. //  pvFindPara points to a CRYPT_HASH_BLOB.
  452. //--------------------------------------------------------------------------
  453. //+-------------------------------------------------------------------------
  454. //  CTL_FIND_USAGE
  455. //
  456. //  Find a CTL having the specified usage identifiers, list identifier or
  457. //  signer. The CertEncodingType of the signer is obtained from the
  458. //  dwMsgAndCertEncodingType parameter.
  459. //
  460. //  pvFindPara points to a CTL_FIND_USAGE_PARA data structure. The
  461. //  SubjectUsage.cUsageIdentifer can be 0 to match any usage. The
  462. //  ListIdentifier.cbData can be 0 to match any list identifier. To only match
  463. //  CTLs without a ListIdentifier, cbData must be set to
  464. //  CTL_FIND_NO_LIST_ID_CBDATA. pSigner can be NULL to match any signer. Only
  465. //  the Issuer and SerialNumber fields of the pSigner's PCERT_INFO are used.
  466. //  To only match CTLs without a signer, pSigner must be set to
  467. //  CTL_FIND_NO_SIGNER_PTR.
  468. //
  469. //  The CTL_FIND_SAME_USAGE_FLAG can be set in dwFindFlags to
  470. //  only match CTLs with the same usage identifiers. CTLs having additional
  471. //  usage identifiers aren't matched. For example, if only "1.2.3" is specified
  472. //  in CTL_FIND_USAGE_PARA, then, for a match, the CTL must only contain
  473. //  "1.2.3" and not any additional usage identifers.
  474. //--------------------------------------------------------------------------
  475. //+-------------------------------------------------------------------------
  476. //  CTL_FIND_SUBJECT
  477. //
  478. //  Find a CTL having the specified subject. CertFindSubjectInCTL can be
  479. //  called to get a pointer to the subject's entry in the CTL.  pUsagePara can
  480. //  optionally be set to enable the above CTL_FIND_USAGE matching.
  481. //
  482. //  pvFindPara points to a CTL_FIND_SUBJECT_PARA data structure.
  483. //--------------------------------------------------------------------------
  484. //+-------------------------------------------------------------------------
  485. //  Add the encoded CTL to the store according to the specified
  486. //  disposition option.
  487. //
  488. //  Makes a copy of the encoded CTL before adding to the store.
  489. //
  490. //  dwAddDispostion specifies the action to take if the CTL
  491. //  already exists in the store. See CertAddEncodedCertificateToStore for a
  492. //  list of and actions taken.
  493. //
  494. //  Compares the CTL's SubjectUsage, ListIdentifier and any of its signers
  495. //  to determine if the CTL already exists in the store.
  496. //
  497. //  ppCtlContext can be NULL, indicating the caller isn't interested
  498. //  in getting the CTL_CONTEXT of the added or existing CTL.
  499. //--------------------------------------------------------------------------
  500. WINCRYPT32API
  501. BOOL
  502. WINAPI
  503. CertAddEncodedCTLToStore(
  504.     IN HCERTSTORE hCertStore,
  505.     IN DWORD dwMsgAndCertEncodingType,
  506.     IN const BYTE *pbCtlEncoded,
  507.     IN DWORD cbCtlEncoded,
  508.     IN DWORD dwAddDisposition,
  509.     OUT OPTIONAL PCCTL_CONTEXT *ppCtlContext
  510.     );
  511. //+-------------------------------------------------------------------------
  512. //  Add the CTL context to the store according to the specified
  513. //  disposition option.
  514. //
  515. //  In addition to the encoded CTL, the context's properties are
  516. //  also copied.  Note, the CERT_KEY_CONTEXT_PROP_ID property (and its
  517. //  CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_SPEC_PROP_ID) isn't copied.
  518. //
  519. //  Makes a copy of the encoded CTL before adding to the store.
  520. //
  521. //  dwAddDispostion specifies the action to take if the CTL
  522. //  already exists in the store. See CertAddCertificateContextToStore for a
  523. //  list of and actions taken.
  524. //
  525. //  Compares the CTL's SubjectUsage, ListIdentifier and any of its signers
  526. //  to determine if the CTL already exists in the store.
  527. //
  528. //  ppStoreContext can be NULL, indicating the caller isn't interested
  529. //  in getting the CTL_CONTEXT of the added or existing CTL.
  530. //--------------------------------------------------------------------------
  531. WINCRYPT32API
  532. BOOL
  533. WINAPI
  534. CertAddCTLContextToStore(
  535.     IN HCERTSTORE hCertStore,
  536.     IN PCCTL_CONTEXT pCtlContext,
  537.     IN DWORD dwAddDisposition,
  538.     OUT OPTIONAL PCCTL_CONTEXT *ppStoreContext
  539.     );
  540. //+-------------------------------------------------------------------------
  541. //  Serialize the CTL context's encoded CTL and its properties.
  542. //--------------------------------------------------------------------------
  543. WINCRYPT32API
  544. BOOL
  545. WINAPI
  546. CertSerializeCTLStoreElement(
  547.     IN PCCTL_CONTEXT pCtlContext,
  548.     IN DWORD dwFlags,
  549.     OUT BYTE *pbElement,
  550.     IN OUT DWORD *pcbElement
  551.     );
  552. //+-------------------------------------------------------------------------
  553. //  Delete the specified CTL from the store.
  554. //
  555. //  All subsequent gets for the CTL will fail. However,
  556. //  memory allocated for the CTL isn't freed until all of its contexts
  557. //  have also been freed.
  558. //
  559. //  The pCtlContext is obtained from a get or duplicate.
  560. //
  561. //  NOTE: the pCtlContext is always CertFreeCTLContext'ed by
  562. //  this function, even for an error.
  563. //--------------------------------------------------------------------------
  564. WINCRYPT32API
  565. BOOL
  566. WINAPI
  567. CertDeleteCTLFromStore(
  568.     IN PCCTL_CONTEXT pCtlContext
  569.     );
  570. WINCRYPT32API
  571. BOOL
  572. WINAPI
  573. CertAddCertificateLinkToStore(
  574.     IN HCERTSTORE hCertStore,
  575.     IN PCCERT_CONTEXT pCertContext,
  576.     IN DWORD dwAddDisposition,
  577.     OUT OPTIONAL PCCERT_CONTEXT *ppStoreContext
  578.     );
  579. WINCRYPT32API
  580. BOOL
  581. WINAPI
  582. CertAddCRLLinkToStore(
  583.     IN HCERTSTORE hCertStore,
  584.     IN PCCRL_CONTEXT pCrlContext,
  585.     IN DWORD dwAddDisposition,
  586.     OUT OPTIONAL PCCRL_CONTEXT *ppStoreContext
  587.     );
  588. WINCRYPT32API
  589. BOOL
  590. WINAPI
  591. CertAddCTLLinkToStore(
  592.     IN HCERTSTORE hCertStore,
  593.     IN PCCTL_CONTEXT pCtlContext,
  594.     IN DWORD dwAddDisposition,
  595.     OUT OPTIONAL PCCTL_CONTEXT *ppStoreContext
  596.     );
  597. WINCRYPT32API
  598. BOOL
  599. WINAPI
  600. CertAddStoreToCollection(
  601.     IN HCERTSTORE hCollectionStore,
  602.     IN OPTIONAL HCERTSTORE hSiblingStore,
  603.     IN DWORD dwUpdateFlags,
  604.     IN DWORD dwPriority
  605.     );
  606. WINCRYPT32API
  607. void
  608. WINAPI
  609. CertRemoveStoreFromCollection(
  610.     IN HCERTSTORE hCollectionStore,
  611.     IN HCERTSTORE hSiblingStore
  612.     );
  613. WINCRYPT32API
  614. BOOL
  615. WINAPI
  616. CertControlStore(
  617.     IN HCERTSTORE hCertStore,
  618.     IN DWORD dwFlags,
  619.     IN DWORD dwCtrlType,
  620.     IN void const *pvCtrlPara
  621.     );
  622. //+-------------------------------------------------------------------------
  623. //  Certificate Store control types
  624. //--------------------------------------------------------------------------
  625. #define CERT_STORE_CTRL_RESYNC              1
  626. #define CERT_STORE_CTRL_NOTIFY_CHANGE       2
  627. #define CERT_STORE_CTRL_COMMIT              3
  628. #define CERT_STORE_CTRL_AUTO_RESYNC         4
  629. #define CERT_STORE_CTRL_CANCEL_NOTIFY       5
  630. #define CERT_STORE_CTRL_INHIBIT_DUPLICATE_HANDLE_FLAG   0x1
  631. //+-------------------------------------------------------------------------
  632. //  CERT_STORE_CTRL_RESYNC
  633. //
  634. //  Re-synchronize the store.
  635. //
  636. //  The pvCtrlPara points to the event HANDLE to be signaled on
  637. //  the next store change. Normally, this would be the same
  638. //  event HANDLE passed to CERT_STORE_CTRL_NOTIFY_CHANGE during initialization.
  639. //
  640. //  If pvCtrlPara is NULL, no events are re-armed.
  641. //
  642. //  By default the event HANDLE is DuplicateHandle'd.
  643. //  CERT_STORE_CTRL_INHIBIT_DUPLICATE_HANDLE_FLAG can be set in dwFlags
  644. //  to inhibit a DupicateHandle of the event HANDLE. If this flag
  645. //  is set, then, CertControlStore(CERT_STORE_CTRL_CANCEL_NOTIFY) must be
  646. //  called for this event HANDLE before closing the hCertStore.
  647. //--------------------------------------------------------------------------
  648. //+-------------------------------------------------------------------------
  649. //  CERT_STORE_CTRL_NOTIFY_CHANGE
  650. //
  651. //  Signal the event when the underlying store is changed.
  652. //
  653. //  pvCtrlPara points to the event HANDLE to be signaled.
  654. //
  655. //  pvCtrlPara can be NULL to inform the store of a subsequent
  656. //  CERT_STORE_CTRL_RESYNC and allow it to optimize by only doing a resync
  657. //  if the store has changed. For the registry based stores, an internal
  658. //  notify change event is created and registered to be signaled.
  659. //
  660. //  Recommend calling CERT_STORE_CTRL_NOTIFY_CHANGE once for each event to
  661. //  be passed to CERT_STORE_CTRL_RESYNC. This should only happen after
  662. //  the event has been created. Not after each time the event is signaled.
  663. //
  664. //  By default the event HANDLE is DuplicateHandle'd.
  665. //  CERT_STORE_CTRL_INHIBIT_DUPLICATE_HANDLE_FLAG can be set in dwFlags
  666. //  to inhibit a DupicateHandle of the event HANDLE. If this flag
  667. //  is set, then, CertControlStore(CERT_STORE_CTRL_CANCEL_NOTIFY) must be
  668. //  called for this event HANDLE before closing the hCertStore.
  669. //--------------------------------------------------------------------------
  670. //+-------------------------------------------------------------------------
  671. //  CERT_STORE_CTRL_CANCEL_NOTIFY
  672. //
  673. //  Cancel notification signaling of the event HANDLE passed in a previous
  674. //  CERT_STORE_CTRL_NOTIFY_CHANGE or CERT_STORE_CTRL_RESYNC.
  675. //
  676. //  pvCtrlPara points to the event HANDLE to be canceled.
  677. //--------------------------------------------------------------------------
  678. //+-------------------------------------------------------------------------
  679. //  CERT_STORE_CTRL_AUTO_RESYNC
  680. //
  681. //  At the start of every enumeration or find store API call, check if the
  682. //  underlying store has changed. If it has changed, re-synchronize.
  683. //
  684. //  This check is only done in the enumeration or find APIs when the
  685. //  pPrevContext is NULL.
  686. //
  687. //  The pvCtrlPara isn't used and must be set to NULL.
  688. //--------------------------------------------------------------------------
  689. //+-------------------------------------------------------------------------
  690. //  CERT_STORE_CTRL_COMMIT
  691. //
  692. //  If any changes have been to the cached store, they are committed to
  693. //  persisted storage. If no changes have been made since the store was
  694. //  opened or the last commit, this call is ignored. May also be ignored by
  695. //  store providers that persist changes immediately.
  696. //
  697. //  CERT_STORE_CTRL_COMMIT_FORCE_FLAG can be set to force the store
  698. //  to be committed even if it hasn't been touched.
  699. //
  700. //  CERT_STORE_CTRL_COMMIT_CLEAR_FLAG can be set to inhibit a commit on
  701. //  store close.
  702. //--------------------------------------------------------------------------
  703. #define CERT_STORE_CTRL_COMMIT_FORCE_FLAG   0x1
  704. #define CERT_STORE_CTRL_COMMIT_CLEAR_FLAG   0x2
  705. //+=========================================================================
  706. //  Cert Store Property Defines and APIs
  707. //==========================================================================
  708. //+-------------------------------------------------------------------------
  709. //  Store property IDs. This is a property applicable to the entire store.
  710. //  Its not a property on an individual certificate, CRL or CTL context.
  711. //
  712. //  Currently, no store properties are persisted. (This differs from
  713. //  most context properties which are persisted.)
  714. //
  715. //  See CertSetStoreProperty or CertGetStoreProperty for usage information.
  716. //
  717. //  Note, the range for predefined store properties should be outside
  718. //  the range of predefined context properties. We will start at 4096.
  719. //--------------------------------------------------------------------------
  720. #define CERT_STORE_LOCALIZED_NAME_PROP_ID   0x1000
  721. //+-------------------------------------------------------------------------
  722. //  Set a store property.
  723. //
  724. //  The type definition for pvData depends on the dwPropId value.
  725. //      CERT_STORE_LOCALIZED_NAME_PROP_ID - localized name of the store.
  726. //      pvData points to a CRYPT_DATA_BLOB. pbData is a pointer to a NULL
  727. //      terminated unicode, wide character string.
  728. //      cbData = (wcslen((LPWSTR) pbData) + 1) * sizeof(WCHAR).
  729. //
  730. //  For all the other PROP_IDs: an encoded PCRYPT_DATA_BLOB is passed in pvData.
  731. //
  732. //  If the property already exists, then, the old value is deleted and silently
  733. //  replaced. Setting, pvData to NULL, deletes the property.
  734. //--------------------------------------------------------------------------
  735. WINCRYPT32API
  736. BOOL
  737. WINAPI
  738. CertSetStoreProperty(
  739.     IN HCERTSTORE hCertStore,
  740.     IN DWORD dwPropId,
  741.     IN DWORD dwFlags,
  742.     IN const void *pvData
  743.     );
  744. //+-------------------------------------------------------------------------
  745. //  Get a store property.
  746. //
  747. //  The type definition for pvData depends on the dwPropId value.
  748. //      CERT_STORE_LOCALIZED_NAME_PROP_ID - localized name of the store.
  749. //      pvData points to a NULL terminated unicode, wide character string.
  750. //      cbData = (wcslen((LPWSTR) pvData) + 1) * sizeof(WCHAR).
  751. //
  752. //  For all other PROP_IDs, pvData points to an array of bytes.
  753. //
  754. //  If the property doesn't exist, returns FALSE and sets LastError to
  755. //  CRYPT_E_NOT_FOUND.
  756. //--------------------------------------------------------------------------
  757. WINCRYPT32API
  758. BOOL
  759. WINAPI
  760. CertGetStoreProperty(
  761.     IN HCERTSTORE hCertStore,
  762.     IN DWORD dwPropId,
  763.     OUT void *pvData,
  764.     IN OUT DWORD *pcbData
  765.     );
  766. typedef struct _CERT_CREATE_CONTEXT_PARA {
  767.     DWORD                   cbSize;
  768.     PFN_CRYPT_FREE          pfnFree;            // OPTIONAL
  769.     void                    *pvFree;            // OPTIONAL
  770. } CERT_CREATE_CONTEXT_PARA, *PCERT_CREATE_CONTEXT_PARA;
  771. //+-------------------------------------------------------------------------
  772. //  Creates the specified context from the encoded bytes. The created
  773. //  context isn't put in a store.
  774. //
  775. //  dwContextType values:
  776. //      CERT_STORE_CERTIFICATE_CONTEXT
  777. //      CERT_STORE_CRL_CONTEXT
  778. //      CERT_STORE_CTL_CONTEXT
  779. //
  780. //  If CERT_CREATE_CONTEXT_NOCOPY_FLAG is set, the created context points
  781. //  directly to the pbEncoded instead of an allocated copy. See flag
  782. //  definition for more details.
  783. //
  784. //  If CERT_CREATE_CONTEXT_SORTED_FLAG is set, the context is created
  785. //  with sorted entries. This flag may only be set for CERT_STORE_CTL_CONTEXT.
  786. //  Setting this flag implicitly sets CERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG and
  787. //  CERT_CREATE_CONTEXT_NO_ENTRY_FLAG. See flag definition for
  788. //  more details.
  789. //
  790. //  If CERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG is set, the context is created
  791. //  without creating a HCRYPTMSG handle for the context. This flag may only be
  792. //  set for CERT_STORE_CTL_CONTEXT.  See flag definition for more details.
  793. //
  794. //  If CERT_CREATE_CONTEXT_NO_ENTRY_FLAG is set, the context is created
  795. //  without decoding the entries. This flag may only be set for
  796. //  CERT_STORE_CTL_CONTEXT.  See flag definition for more details.
  797. //
  798. //  If unable to decode and create the context, NULL is returned.
  799. //  Otherwise, a pointer to a read only CERT_CONTEXT, CRL_CONTEXT or
  800. //  CTL_CONTEXT is returned. The context must be freed by the appropriate
  801. //  free context API. The context can be duplicated by calling the
  802. //  appropriate duplicate context API.
  803. //--------------------------------------------------------------------------
  804. WINCRYPT32API
  805. const void *
  806. WINAPI
  807. CertCreateContext(
  808.     IN DWORD dwContextType,
  809.     IN DWORD dwEncodingType,
  810.     IN const BYTE *pbEncoded,
  811.     IN DWORD cbEncoded,
  812.     IN DWORD dwFlags,
  813.     IN OPTIONAL PCERT_CREATE_CONTEXT_PARA pCreatePara
  814.     );
  815. // When the following flag is set, the created context points directly to the
  816. // pbEncoded instead of an allocated copy. If pCreatePara and
  817. // pCreatePara->pfnFree are non-NULL, then, pfnFree is called to free
  818. // the pbEncoded when the context is last freed. Otherwise, no attempt is
  819. // made to free the pbEncoded. If pCreatePara->pvFree is non-NULL, then its
  820. // passed to pfnFree instead of pbEncoded.
  821. //
  822. // Note, if CertCreateContext fails, pfnFree is still called.
  823. #define CERT_CREATE_CONTEXT_NOCOPY_FLAG     0x1
  824. // When the following flag is set, a context with sorted entries is created.
  825. // Currently only applicable to a CTL context.
  826. //
  827. // For CTLs: the cCTLEntry in the returned CTL_INFO is always
  828. // 0. CertFindSubjectInSortedCTL and CertEnumSubjectInSortedCTL must be called
  829. // to find or enumerate the CTL entries.
  830. //
  831. // The Sorted CTL TrustedSubjects extension isn't returned in the created
  832. // context's CTL_INFO.
  833. #define CERT_CREATE_CONTEXT_SORTED_FLAG     0x2
  834. // By default when a CTL context is created, a HCRYPTMSG handle to its
  835. // SignedData message is created. This flag can be set to improve performance
  836. // by not creating the HCRYPTMSG handle.
  837. //
  838. // This flag is only applicable to a CTL context.
  839. #define CERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG   0x4
  840. // By default when a CTL context is created, its entries are decoded.
  841. // This flag can be set to improve performance by not decoding the
  842. // entries.
  843. //
  844. // This flag is only applicable to a CTL context.
  845. #define CERT_CREATE_CONTEXT_NO_ENTRY_FLAG       0x8
  846. //+=========================================================================
  847. //  Certificate System Store Data Structures and APIs
  848. //==========================================================================
  849. //+-------------------------------------------------------------------------
  850. //  System Store Information
  851. //
  852. //  Currently, no system store information is persisted.
  853. //--------------------------------------------------------------------------
  854. typedef struct _CERT_SYSTEM_STORE_INFO {
  855.     DWORD   cbSize;
  856. } CERT_SYSTEM_STORE_INFO, *PCERT_SYSTEM_STORE_INFO;
  857. //+-------------------------------------------------------------------------
  858. //  Physical Store Information
  859. //
  860. //  The Open fields are passed directly to CertOpenStore() to open
  861. //  the physical store.
  862. //
  863. //  By default all system stores located in the registry have an
  864. //  implicit SystemRegistry physical store that is opened. To disable the
  865. //  opening of this store, the SystemRegistry
  866. //  physical store corresponding to the System store must be registered with
  867. //  CERT_PHYSICAL_STORE_OPEN_DISABLE_FLAG set in dwFlags. Alternatively,
  868. //  a physical store with the name of ".Default" may be registered.
  869. //
  870. //  Depending on the store location and store name, additional predefined
  871. //  physical stores may be opened. For example, system stores in
  872. //  CURRENT_USER have the predefined physical store, .LocalMachine.
  873. //  To disable the opening of these predefined physical stores, the
  874. //  corresponding physical store must be registered with
  875. //  CERT_PHYSICAL_STORE_OPEN_DISABLE_FLAG set in dwFlags.
  876. //
  877. //  The CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG must be set in dwFlags
  878. //  to enable the adding of a context to the store.
  879. //
  880. //  When a system store is opened via the SERVICES or USERS store location,
  881. //  the ServiceName is prepended to the OpenParameters
  882. //  for CERT_SYSTEM_STORE_CURRENT_USER or CERT_SYSTEM_STORE_CURRENT_SERVICE
  883. //  physical stores and the dwOpenFlags store location is changed to
  884. //  CERT_SYSTEM_STORE_USERS or CERT_SYSTEM_STORE_SERVICES.
  885. //
  886. //  By default the SYSTEM, SYSTEM_REGISTRY and PHYSICAL provider
  887. //  stores are also opened remotely when the outer system store is opened.
  888. //  The CERT_PHYSICAL_STORE_REMOTE_OPEN_DISABLE_FLAG may be set in dwFlags
  889. //  to disable remote opens.
  890. //
  891. //  When opened remotely, the \ComputerName is implicitly prepended to the
  892. //  OpenParameters for the SYSTEM, SYSTEM_REGISTRY and PHYSICAL provider types.
  893. //  To also prepend the \ComputerName to other provider types, set the
  894. //  CERT_PHYSICAL_STORE_INSERT_COMPUTER_NAME_ENABLE_FLAG in dwFlags.
  895. //
  896. //  When the system store is opened, its physical stores are ordered
  897. //  according to the dwPriority. A larger dwPriority indicates higher priority.
  898. //--------------------------------------------------------------------------
  899. typedef struct _CERT_PHYSICAL_STORE_INFO {
  900.     DWORD               cbSize;
  901.     LPSTR               pszOpenStoreProvider;   // REG_SZ
  902.     DWORD               dwOpenEncodingType;     // REG_DWORD
  903.     DWORD               dwOpenFlags;            // REG_DWORD
  904.     CRYPT_DATA_BLOB     OpenParameters;         // REG_BINARY
  905.     DWORD               dwFlags;                // REG_DWORD
  906.     DWORD               dwPriority;             // REG_DWORD
  907. } CERT_PHYSICAL_STORE_INFO, *PCERT_PHYSICAL_STORE_INFO;
  908. //+-------------------------------------------------------------------------
  909. //  Physical Store Information dwFlags
  910. //--------------------------------------------------------------------------
  911. #define CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG                     0x1
  912. #define CERT_PHYSICAL_STORE_OPEN_DISABLE_FLAG                   0x2
  913. #define CERT_PHYSICAL_STORE_REMOTE_OPEN_DISABLE_FLAG            0x4
  914. #define CERT_PHYSICAL_STORE_INSERT_COMPUTER_NAME_ENABLE_FLAG    0x8
  915. //+-------------------------------------------------------------------------
  916. //  Register a system store.
  917. //
  918. //  The upper word of the dwFlags parameter is used to specify the location of
  919. //  the system store.
  920. //
  921. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
  922. //  points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
  923. //  pvSystemStore points to a null terminated UNICODE string.
  924. //
  925. //  The CERT_SYSTEM_STORE_SERVICES or CERT_SYSTEM_STORE_USERS system store
  926. //  name must be prefixed with the ServiceName or UserName. For example,
  927. //  "ServiceNameTrust".
  928. //
  929. //  Stores on remote computers can be registered for the
  930. //  CERT_SYSTEM_STORE_LOCAL_MACHINE, CERT_SYSTEM_STORE_SERVICES,
  931. //  CERT_SYSTEM_STORE_USERS, CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
  932. //  or CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE
  933. //  locations by prepending the computer name. For example, a remote
  934. //  local machine store is registered via "\ComputerNameTrust" or
  935. //  "ComputerNameTrust". A remote service store is registered via
  936. //  "\ComputerNameServiceNameTrust". The leading "\" backslashes are
  937. //  optional in the ComputerName.
  938. //
  939. //  Set CERT_STORE_CREATE_NEW_FLAG to cause a failure if the system store
  940. //  already exists in the store location.
  941. //--------------------------------------------------------------------------
  942. WINCRYPT32API
  943. BOOL
  944. WINAPI
  945. CertRegisterSystemStore(
  946.     IN const void *pvSystemStore,
  947.     IN DWORD dwFlags,
  948.     IN PCERT_SYSTEM_STORE_INFO pStoreInfo,
  949.     IN OPTIONAL void *pvReserved
  950.     );
  951. //+-------------------------------------------------------------------------
  952. //  Register a physical store for the specified system store.
  953. //
  954. //  The upper word of the dwFlags parameter is used to specify the location of
  955. //  the system store.
  956. //
  957. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
  958. //  points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
  959. //  pvSystemStore points to a null terminated UNICODE string.
  960. //
  961. //  See CertRegisterSystemStore for details on prepending a ServiceName
  962. //  and/or ComputerName to the system store name.
  963. //
  964. //  Set CERT_STORE_CREATE_NEW_FLAG to cause a failure if the physical store
  965. //  already exists in the system store.
  966. //--------------------------------------------------------------------------
  967. WINCRYPT32API
  968. BOOL
  969. WINAPI
  970. CertRegisterPhysicalStore(
  971.     IN const void *pvSystemStore,
  972.     IN DWORD dwFlags,
  973.     IN LPCWSTR pwszStoreName,
  974.     IN PCERT_PHYSICAL_STORE_INFO pStoreInfo,
  975.     IN OPTIONAL void *pvReserved
  976.     );
  977. //+-------------------------------------------------------------------------
  978. //  Unregister the specified system store.
  979. //
  980. //  The upper word of the dwFlags parameter is used to specify the location of
  981. //  the system store.
  982. //
  983. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
  984. //  points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
  985. //  pvSystemStore points to a null terminated UNICODE string.
  986. //
  987. //  See CertRegisterSystemStore for details on prepending a ServiceName
  988. //  and/or ComputerName to the system store name.
  989. //
  990. //  CERT_STORE_DELETE_FLAG can optionally be set in dwFlags.
  991. //--------------------------------------------------------------------------
  992. WINCRYPT32API
  993. BOOL
  994. WINAPI
  995. CertUnregisterSystemStore(
  996.     IN const void *pvSystemStore,
  997.     IN DWORD dwFlags
  998.     );
  999. //+-------------------------------------------------------------------------
  1000. //  Unregister the physical store from the specified system store.
  1001. //
  1002. //  The upper word of the dwFlags parameter is used to specify the location of
  1003. //  the system store.
  1004. //
  1005. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
  1006. //  points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
  1007. //  pvSystemStore points to a null terminated UNICODE string.
  1008. //
  1009. //  See CertRegisterSystemStore for details on prepending a ServiceName
  1010. //  and/or ComputerName to the system store name.
  1011. //
  1012. //  CERT_STORE_DELETE_FLAG can optionally be set in dwFlags.
  1013. //--------------------------------------------------------------------------
  1014. WINCRYPT32API
  1015. BOOL
  1016. WINAPI
  1017. CertUnregisterPhysicalStore(
  1018.     IN const void *pvSystemStore,
  1019.     IN DWORD dwFlags,
  1020.     IN LPCWSTR pwszStoreName
  1021.     );
  1022. //+-------------------------------------------------------------------------
  1023. //  Enum callbacks
  1024. //
  1025. //  The CERT_SYSTEM_STORE_LOCATION_MASK bits in the dwFlags parameter
  1026. //  specifies the location of the system store
  1027. //
  1028. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
  1029. //  points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
  1030. //  pvSystemStore points to a null terminated UNICODE string.
  1031. //
  1032. //  The callback returns FALSE and sets LAST_ERROR to stop the enumeration.
  1033. //  The LAST_ERROR is returned to the caller of the enumeration.
  1034. //
  1035. //  The pvSystemStore passed to the callback has leading ComputerName and/or
  1036. //  ServiceName prefixes where appropriate.
  1037. //--------------------------------------------------------------------------
  1038. typedef BOOL (WINAPI *PFN_CERT_ENUM_SYSTEM_STORE_LOCATION)(
  1039.     IN LPCWSTR pwszStoreLocation,
  1040.     IN DWORD dwFlags,
  1041.     IN OPTIONAL void *pvReserved,
  1042.     IN OPTIONAL void *pvArg
  1043.     );
  1044. typedef BOOL (WINAPI *PFN_CERT_ENUM_SYSTEM_STORE)(
  1045.     IN const void *pvSystemStore,
  1046.     IN DWORD dwFlags,
  1047.     IN PCERT_SYSTEM_STORE_INFO pStoreInfo,
  1048.     IN OPTIONAL void *pvReserved,
  1049.     IN OPTIONAL void *pvArg
  1050.     );
  1051. typedef BOOL (WINAPI *PFN_CERT_ENUM_PHYSICAL_STORE)(
  1052.     IN const void *pvSystemStore,
  1053.     IN DWORD dwFlags,
  1054.     IN LPCWSTR pwszStoreName,
  1055.     IN PCERT_PHYSICAL_STORE_INFO pStoreInfo,
  1056.     IN OPTIONAL void *pvReserved,
  1057.     IN OPTIONAL void *pvArg
  1058.     );
  1059. // In the PFN_CERT_ENUM_PHYSICAL_STORE callback the following flag is
  1060. // set if the physical store wasn't registered and is an implicitly created
  1061. // predefined physical store.
  1062. #define CERT_PHYSICAL_STORE_PREDEFINED_ENUM_FLAG    0x1
  1063. // Names of implicitly created predefined physical stores
  1064. #define CERT_PHYSICAL_STORE_DEFAULT_NAME            L".Default"
  1065. #define CERT_PHYSICAL_STORE_GROUP_POLICY_NAME       L".GroupPolicy"
  1066. #define CERT_PHYSICAL_STORE_LOCAL_MACHINE_NAME      L".LocalMachine"
  1067. #define CERT_PHYSICAL_STORE_DS_USER_CERTIFICATE_NAME L".UserCertificate"
  1068. #define CERT_PHYSICAL_STORE_LOCAL_MACHINE_GROUP_POLICY_NAME 
  1069.             L".LocalMachineGroupPolicy"
  1070. #define CERT_PHYSICAL_STORE_ENTERPRISE_NAME         L".Enterprise"
  1071. #define CERT_PHYSICAL_STORE_AUTH_ROOT_NAME          L".AuthRoot"
  1072. //+-------------------------------------------------------------------------
  1073. //  Enumerate the system store locations.
  1074. //--------------------------------------------------------------------------
  1075. WINCRYPT32API
  1076. BOOL
  1077. WINAPI
  1078. CertEnumSystemStoreLocation(
  1079.     IN DWORD dwFlags,
  1080.     IN void *pvArg,
  1081.     IN PFN_CERT_ENUM_SYSTEM_STORE_LOCATION pfnEnum
  1082.     );
  1083. //+-------------------------------------------------------------------------
  1084. //  Enumerate the system stores.
  1085. //
  1086. //  The upper word of the dwFlags parameter is used to specify the location of
  1087. //  the system store.
  1088. //
  1089. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags,
  1090. //  pvSystemStoreLocationPara points to a CERT_SYSTEM_STORE_RELOCATE_PARA
  1091. //  data structure. Otherwise, pvSystemStoreLocationPara points to a null
  1092. //  terminated UNICODE string.
  1093. //
  1094. //  For CERT_SYSTEM_STORE_LOCAL_MACHINE,
  1095. //  CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY or
  1096. //  CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE, pvSystemStoreLocationPara can
  1097. //  optionally be set to a unicode computer name for enumerating local machine
  1098. //  stores on a remote computer. For example, "\ComputerName" or
  1099. //  "ComputerName".  The leading "\" backslashes are optional in the
  1100. //  ComputerName.
  1101. //
  1102. //  For CERT_SYSTEM_STORE_SERVICES or CERT_SYSTEM_STORE_USERS,
  1103. //  if pvSystemStoreLocationPara is NULL, then,
  1104. //  enumerates both the service/user names and the stores for each service/user
  1105. //  name. Otherwise, pvSystemStoreLocationPara is a unicode string specifying a
  1106. //  remote computer name and/or service/user name. For example:
  1107. //      "ServiceName"
  1108. //      "\ComputerName" or "ComputerName"
  1109. //      "ComputerNameServiceName"
  1110. //  Note, if only the ComputerName is specified, then, it must have either
  1111. //  the leading "\" backslashes or a trailing backslash. Otherwise, its
  1112. //  interpretted as the ServiceName or UserName.
  1113. //--------------------------------------------------------------------------
  1114. WINCRYPT32API
  1115. BOOL
  1116. WINAPI
  1117. CertEnumSystemStore(
  1118.     IN DWORD dwFlags,
  1119.     IN OPTIONAL void *pvSystemStoreLocationPara,
  1120.     IN void *pvArg,
  1121.     IN PFN_CERT_ENUM_SYSTEM_STORE pfnEnum
  1122.     );
  1123. //+-------------------------------------------------------------------------
  1124. //  Enumerate the physical stores for the specified system store.
  1125. //
  1126. //  The upper word of the dwFlags parameter is used to specify the location of
  1127. //  the system store.
  1128. //
  1129. //  If CERT_SYSTEM_STORE_RELOCATE_FLAG is set in dwFlags, pvSystemStore
  1130. //  points to a CERT_SYSTEM_STORE_RELOCATE_PARA data structure. Otherwise,
  1131. //  pvSystemStore points to a null terminated UNICODE string.
  1132. //
  1133. //  See CertRegisterSystemStore for details on prepending a ServiceName
  1134. //  and/or ComputerName to the system store name.
  1135. //
  1136. //  If the system store location only supports system stores and doesn't
  1137. //  support physical stores, LastError is set to ERROR_CALL_NOT_IMPLEMENTED.
  1138. //--------------------------------------------------------------------------
  1139. WINCRYPT32API
  1140. BOOL
  1141. WINAPI
  1142. CertEnumPhysicalStore(
  1143.     IN const void *pvSystemStore,
  1144.     IN DWORD dwFlags,
  1145.     IN void *pvArg,
  1146.     IN PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum
  1147.     );
  1148. //+-------------------------------------------------------------------------
  1149. //  Certificate System Store Installable Functions
  1150. //
  1151. //  The CERT_SYSTEM_STORE_LOCATION_MASK bits in the dwFlags parameter passed
  1152. //  to the CertOpenStore(for "System", "SystemRegistry" or "Physical"
  1153. //  Provider), CertRegisterSystemStore,
  1154. //  CertUnregisterSystemStore, CertEnumSystemStore, CertRegisterPhysicalStore,
  1155. //  CertUnregisterPhysicalStore and CertEnumPhysicalStore APIs is used as the
  1156. //  constant pszOID value passed to the OID installable functions.
  1157. //  Therefore, the pszOID is restricted to a constant <= (LPCSTR) 0x0FFF.
  1158. //
  1159. //  The EncodingType is 0.
  1160. //--------------------------------------------------------------------------
  1161. // Installable System Store Provider OID pszFuncNames.
  1162. #define CRYPT_OID_OPEN_SYSTEM_STORE_PROV_FUNC   "CertDllOpenSystemStoreProv"
  1163. #define CRYPT_OID_REGISTER_SYSTEM_STORE_FUNC    "CertDllRegisterSystemStore"
  1164. #define CRYPT_OID_UNREGISTER_SYSTEM_STORE_FUNC  "CertDllUnregisterSystemStore"
  1165. #define CRYPT_OID_ENUM_SYSTEM_STORE_FUNC        "CertDllEnumSystemStore"
  1166. #define CRYPT_OID_REGISTER_PHYSICAL_STORE_FUNC  "CertDllRegisterPhysicalStore"
  1167. #define CRYPT_OID_UNREGISTER_PHYSICAL_STORE_FUNC "CertDllUnregisterPhysicalStore"
  1168. #define CRYPT_OID_ENUM_PHYSICAL_STORE_FUNC      "CertDllEnumPhysicalStore"
  1169. // CertDllOpenSystemStoreProv has the same function signature as the
  1170. // installable "CertDllOpenStoreProv" function. See CertOpenStore for
  1171. // more details.
  1172. // CertDllRegisterSystemStore has the same function signature as
  1173. // CertRegisterSystemStore.
  1174. //
  1175. // The "SystemStoreLocation" REG_SZ value must also be set for registered
  1176. // CertDllEnumSystemStore OID functions.
  1177. #define CRYPT_OID_SYSTEM_STORE_LOCATION_VALUE_NAME  L"SystemStoreLocation"
  1178. // The remaining Register, Enum and Unregister OID installable functions
  1179. // have the same signature as their Cert Store API counterpart.
  1180. //+=========================================================================
  1181. //  Enhanced Key Usage Helper Functions
  1182. //==========================================================================
  1183. //+-------------------------------------------------------------------------
  1184. //  Get the enhanced key usage extension or property from the certificate
  1185. //  and decode.
  1186. //
  1187. //  If the CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG is set, then, only get the
  1188. //  extension.
  1189. //
  1190. //  If the CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG is set, then, only get the
  1191. //  property.
  1192. //--------------------------------------------------------------------------
  1193. WINCRYPT32API
  1194. BOOL
  1195. WINAPI
  1196. CertGetEnhancedKeyUsage(
  1197.     IN PCCERT_CONTEXT pCertContext,
  1198.     IN DWORD dwFlags,
  1199.     OUT PCERT_ENHKEY_USAGE pUsage,
  1200.     IN OUT DWORD *pcbUsage
  1201.     );
  1202. //+-------------------------------------------------------------------------
  1203. //  Set the enhanced key usage property for the certificate.
  1204. //--------------------------------------------------------------------------
  1205. WINCRYPT32API
  1206. BOOL
  1207. WINAPI
  1208. CertSetEnhancedKeyUsage(
  1209.     IN PCCERT_CONTEXT pCertContext,
  1210.     IN PCERT_ENHKEY_USAGE pUsage
  1211.     );
  1212. //+-------------------------------------------------------------------------
  1213. //  Add the usage identifier to the certificate's enhanced key usage property.
  1214. //--------------------------------------------------------------------------
  1215. WINCRYPT32API
  1216. BOOL
  1217. WINAPI
  1218. CertAddEnhancedKeyUsageIdentifier(
  1219.     IN PCCERT_CONTEXT pCertContext,
  1220.     IN LPCSTR pszUsageIdentifier
  1221.     );
  1222. //+-------------------------------------------------------------------------
  1223. //  Remove the usage identifier from the certificate's enhanced key usage
  1224. //  property.
  1225. //--------------------------------------------------------------------------
  1226. WINCRYPT32API
  1227. BOOL
  1228. WINAPI
  1229. CertRemoveEnhancedKeyUsageIdentifier(
  1230.     IN PCCERT_CONTEXT pCertContext,
  1231.     IN LPCSTR pszUsageIdentifier
  1232.     );
  1233. //+---------------------------------------------------------------------------
  1234. //
  1235. //
  1236. //  Takes an array of certs and returns an array of usages
  1237. //  which consists of the intersection of the valid usages for each cert.
  1238. //  If each cert is good for all possible usages then the cNumOIDs is set to -1.
  1239. //
  1240. //----------------------------------------------------------------------------
  1241. WINCRYPT32API
  1242. BOOL
  1243. WINAPI
  1244. CertGetValidUsages(
  1245.     IN      DWORD           cCerts,
  1246.     IN      PCCERT_CONTEXT  *rghCerts,
  1247.     OUT     int             *cNumOIDs,
  1248.     OUT     LPSTR           *rghOIDs,
  1249.     IN OUT  DWORD           *pcbOIDs);
  1250. //+=========================================================================
  1251. //  Cryptographic Message helper functions for verifying and signing a
  1252. //  CTL.
  1253. //==========================================================================
  1254. //+-------------------------------------------------------------------------
  1255. //  Get and verify the signer of a cryptographic message.
  1256. //
  1257. //  To verify a CTL, the hCryptMsg is obtained from the CTL_CONTEXT's
  1258. //  hCryptMsg field.
  1259. //
  1260. //  If CMSG_TRUSTED_SIGNER_FLAG is set, then, treat the Signer stores as being
  1261. //  trusted and only search them to find the certificate corresponding to the
  1262. //  signer's issuer and serial number.  Otherwise, the SignerStores are
  1263. //  optionally provided to supplement the message's store of certificates.
  1264. //  If a signer certificate is found, its public key is used to verify
  1265. //  the message signature. The CMSG_SIGNER_ONLY_FLAG can be set to
  1266. //  return the signer without doing the signature verify.
  1267. //
  1268. //  If CMSG_USE_SIGNER_INDEX_FLAG is set, then, only get the signer specified
  1269. //  by *pdwSignerIndex. Otherwise, iterate through all the signers
  1270. //  until a signer verifies or no more signers.
  1271. //
  1272. //  For a verified signature, *ppSigner is updated with certificate context
  1273. //  of the signer and *pdwSignerIndex is updated with the index of the signer.
  1274. //  ppSigner and/or pdwSignerIndex can be NULL, indicating the caller isn't
  1275. //  interested in getting the CertContext and/or index of the signer.
  1276. //--------------------------------------------------------------------------
  1277. WINCRYPT32API
  1278. BOOL
  1279. WINAPI
  1280. CryptMsgGetAndVerifySigner(
  1281.     IN HCRYPTMSG hCryptMsg,
  1282.     IN DWORD cSignerStore,
  1283.     IN OPTIONAL HCERTSTORE *rghSignerStore,
  1284.     IN DWORD dwFlags,
  1285.     OUT OPTIONAL PCCERT_CONTEXT *ppSigner,
  1286.     IN OUT OPTIONAL DWORD *pdwSignerIndex
  1287.     );
  1288. #define CMSG_TRUSTED_SIGNER_FLAG            0x1
  1289. #define CMSG_SIGNER_ONLY_FLAG               0x2
  1290. #define CMSG_USE_SIGNER_INDEX_FLAG          0x4
  1291. //+-------------------------------------------------------------------------
  1292. //  Sign an encoded CTL.
  1293. //
  1294. //  The pbCtlContent can be obtained via a CTL_CONTEXT's pbCtlContent
  1295. //  field or via a CryptEncodeObject(PKCS_CTL or PKCS_SORTED_CTL).
  1296. //
  1297. //  CMSG_CMS_ENCAPSULATED_CTL_FLAG can be set to encode a CMS compatible
  1298. //  V3 SignedData message.
  1299. //--------------------------------------------------------------------------
  1300. WINCRYPT32API
  1301. BOOL
  1302. WINAPI
  1303. CryptMsgSignCTL(
  1304.     IN DWORD dwMsgEncodingType,
  1305.     IN BYTE *pbCtlContent,
  1306.     IN DWORD cbCtlContent,
  1307.     IN PCMSG_SIGNED_ENCODE_INFO pSignInfo,
  1308.     IN DWORD dwFlags,
  1309.     OUT BYTE *pbEncoded,
  1310.     IN OUT DWORD *pcbEncoded
  1311.     );
  1312. // When set, CTL inner content is encapsulated within an OCTET STRING
  1313. #define CMSG_CMS_ENCAPSULATED_CTL_FLAG  0x00008000
  1314. //+-------------------------------------------------------------------------
  1315. //  Encode the CTL and create a signed message containing the encoded CTL.
  1316. //
  1317. //  Set CMSG_ENCODE_SORTED_CTL_FLAG if the CTL entries are to be sorted
  1318. //  before encoding. This flag should be set, if the
  1319. //  CertFindSubjectInSortedCTL or CertEnumSubjectInSortedCTL APIs will
  1320. //  be called. If the identifier for the CTL entries is a hash, such as,
  1321. //  MD5 or SHA1, then, CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG should
  1322. //  also be set.
  1323. //
  1324. //  CMSG_CMS_ENCAPSULATED_CTL_FLAG can be set to encode a CMS compatible
  1325. //  V3 SignedData message.
  1326. //--------------------------------------------------------------------------
  1327. WINCRYPT32API
  1328. BOOL
  1329. WINAPI
  1330. CryptMsgEncodeAndSignCTL(
  1331.     IN DWORD dwMsgEncodingType,
  1332.     IN PCTL_INFO pCtlInfo,
  1333.     IN PCMSG_SIGNED_ENCODE_INFO pSignInfo,
  1334.     IN DWORD dwFlags,
  1335.     OUT BYTE *pbEncoded,
  1336.     IN OUT DWORD *pcbEncoded
  1337.     );
  1338. //  The following flag is set if the CTL is to be encoded with sorted
  1339. //  trusted subjects and the szOID_SORTED_CTL extension is inserted containing
  1340. //  sorted offsets to the encoded subjects.
  1341. #define CMSG_ENCODE_SORTED_CTL_FLAG                     0x1
  1342. //  If the above sorted flag is set, then, the following flag should also
  1343. //  be set if the identifier for the TrustedSubjects is a hash,
  1344. //  such as, MD5 or SHA1.
  1345. #define CMSG_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAG      0x2
  1346. //+-------------------------------------------------------------------------
  1347. //  Returns TRUE if the SubjectIdentifier exists in the CTL. Optionally
  1348. //  returns a pointer to and byte count of the Subject's encoded attributes.
  1349. //--------------------------------------------------------------------------
  1350. WINCRYPT32API
  1351. BOOL
  1352. WINAPI
  1353. CertFindSubjectInSortedCTL(
  1354.     IN PCRYPT_DATA_BLOB pSubjectIdentifier,
  1355.     IN PCCTL_CONTEXT pCtlContext,
  1356.     IN DWORD dwFlags,
  1357.     IN void *pvReserved,
  1358.     OUT OPTIONAL PCRYPT_DER_BLOB pEncodedAttributes
  1359.     );
  1360. //+-------------------------------------------------------------------------
  1361. //  Enumerates through the sequence of TrustedSubjects in a CTL context
  1362. //  created with CERT_CREATE_CONTEXT_SORTED_FLAG set.
  1363. //
  1364. //  To start the enumeration, *ppvNextSubject must be NULL. Upon return,
  1365. //  *ppvNextSubject is updated to point to the next TrustedSubject in
  1366. //  the encoded sequence.
  1367. //
  1368. //  Returns FALSE for no more subjects or invalid arguments.
  1369. //
  1370. //  Note, the returned DER_BLOBs point directly into the encoded
  1371. //  bytes (not allocated, and must not be freed).
  1372. //--------------------------------------------------------------------------
  1373. WINCRYPT32API
  1374. BOOL
  1375. WINAPI
  1376. CertEnumSubjectInSortedCTL(
  1377.     IN PCCTL_CONTEXT pCtlContext,
  1378.     IN OUT void **ppvNextSubject,
  1379.     OUT OPTIONAL PCRYPT_DER_BLOB pSubjectIdentifier,
  1380.     OUT OPTIONAL PCRYPT_DER_BLOB pEncodedAttributes
  1381.     );
  1382. //+=========================================================================
  1383. //  Certificate Verify CTL Usage Data Structures and APIs
  1384. //==========================================================================
  1385. typedef struct _CTL_VERIFY_USAGE_PARA {
  1386.     DWORD                   cbSize;
  1387.     CRYPT_DATA_BLOB         ListIdentifier;     // OPTIONAL
  1388.     DWORD                   cCtlStore;
  1389.     HCERTSTORE              *rghCtlStore;       // OPTIONAL
  1390.     DWORD                   cSignerStore;
  1391.     HCERTSTORE              *rghSignerStore;    // OPTIONAL
  1392. } CTL_VERIFY_USAGE_PARA, *PCTL_VERIFY_USAGE_PARA;
  1393. typedef struct _CTL_VERIFY_USAGE_STATUS {
  1394.     DWORD                   cbSize;
  1395.     DWORD                   dwError;
  1396.     DWORD                   dwFlags;
  1397.     PCCTL_CONTEXT           *ppCtl;             // IN OUT OPTIONAL
  1398.     DWORD                   dwCtlEntryIndex;
  1399.     PCCERT_CONTEXT          *ppSigner;          // IN OUT OPTIONAL
  1400.     DWORD                   dwSignerIndex;
  1401. } CTL_VERIFY_USAGE_STATUS, *PCTL_VERIFY_USAGE_STATUS;
  1402. #define CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG     0x1
  1403. #define CERT_VERIFY_TRUSTED_SIGNERS_FLAG        0x2
  1404. #define CERT_VERIFY_NO_TIME_CHECK_FLAG          0x4
  1405. #define CERT_VERIFY_ALLOW_MORE_USAGE_FLAG       0x8
  1406. #define CERT_VERIFY_UPDATED_CTL_FLAG            0x1
  1407. //+-------------------------------------------------------------------------
  1408. //  Verify that a subject is trusted for the specified usage by finding a
  1409. //  signed and time valid CTL with the usage identifiers and containing the
  1410. //  the subject. A subject can be identified by either its certificate context
  1411. //  or any identifier such as its SHA1 hash.
  1412. //
  1413. //  See CertFindSubjectInCTL for definition of dwSubjectType and pvSubject
  1414. //  parameters.
  1415. //
  1416. //  Via pVerifyUsagePara, the caller can specify the stores to be searched
  1417. //  to find the CTL. The caller can also specify the stores containing
  1418. //  acceptable CTL signers. By setting the ListIdentifier, the caller
  1419. //  can also restrict to a particular signer CTL list.
  1420. //
  1421. //  Via pVerifyUsageStatus, the CTL containing the subject, the subject's
  1422. //  index into the CTL's array of entries, and the signer of the CTL
  1423. //  are returned. If the caller is not interested, ppCtl and ppSigner can be set
  1424. //  to NULL. Returned contexts must be freed via the store's free context APIs.
  1425. //
  1426. //  If the CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG isn't set, then, a time
  1427. //  invalid CTL in one of the CtlStores may be replaced. When replaced, the
  1428. //  CERT_VERIFY_UPDATED_CTL_FLAG is set in pVerifyUsageStatus->dwFlags.
  1429. //
  1430. //  If the CERT_VERIFY_TRUSTED_SIGNERS_FLAG is set, then, only the
  1431. //  SignerStores specified in pVerifyUsageStatus are searched to find
  1432. //  the signer. Otherwise, the SignerStores provide additional sources
  1433. //  to find the signer's certificate.
  1434. //
  1435. //  If CERT_VERIFY_NO_TIME_CHECK_FLAG is set, then, the CTLs aren't checked
  1436. //  for time validity.
  1437. //
  1438. //  If CERT_VERIFY_ALLOW_MORE_USAGE_FLAG is set, then, the CTL may contain
  1439. //  additional usage identifiers than specified by pSubjectUsage. Otherwise,
  1440. //  the found CTL will contain the same usage identifers and no more.
  1441. //
  1442. //  CertVerifyCTLUsage will be implemented as a dispatcher to OID installable
  1443. //  functions. First, it will try to find an OID function matching the first
  1444. //  usage object identifier in the pUsage sequence. Next, it will dispatch
  1445. //  to the default CertDllVerifyCTLUsage functions.
  1446. //
  1447. //  If the subject is trusted for the specified usage, then, TRUE is
  1448. //  returned. Otherwise, FALSE is returned with dwError set to one of the
  1449. //  following:
  1450. //      CRYPT_E_NO_VERIFY_USAGE_DLL
  1451. //      CRYPT_E_NO_VERIFY_USAGE_CHECK
  1452. //      CRYPT_E_VERIFY_USAGE_OFFLINE
  1453. //      CRYPT_E_NOT_IN_CTL
  1454. //      CRYPT_E_NO_TRUSTED_SIGNER
  1455. //--------------------------------------------------------------------------
  1456. WINCRYPT32API
  1457. BOOL
  1458. WINAPI
  1459. CertVerifyCTLUsage(
  1460.     IN DWORD dwEncodingType,
  1461.     IN DWORD dwSubjectType,
  1462.     IN void *pvSubject,
  1463.     IN PCTL_USAGE pSubjectUsage,
  1464.     IN DWORD dwFlags,
  1465.     IN OPTIONAL PCTL_VERIFY_USAGE_PARA pVerifyUsagePara,
  1466.     IN OUT PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus
  1467.     );
  1468. //+=========================================================================
  1469. //  Certificate Revocation Data Structures and APIs
  1470. //==========================================================================
  1471. //+-------------------------------------------------------------------------
  1472. //  This data structure is updated by a CRL revocation type handler
  1473. //  with the base and possibly the delta CRL used.
  1474. //--------------------------------------------------------------------------
  1475. typedef struct _CERT_REVOCATION_CRL_INFO {
  1476.     DWORD                   cbSize;
  1477.     PCCRL_CONTEXT           pBaseCrlContext;
  1478.     PCCRL_CONTEXT           pDeltaCrlContext;
  1479.     // When revoked, points to entry in either of the above CRL contexts.
  1480.     // Don't free.
  1481.     PCRL_ENTRY              pCrlEntry;
  1482.     BOOL                    fDeltaCrlEntry; // TRUE if in pDeltaCrlContext
  1483. } CERT_REVOCATION_CRL_INFO, *PCERT_REVOCATION_CRL_INFO;
  1484. //+-------------------------------------------------------------------------
  1485. //  The following data structure may be passed to CertVerifyRevocation to
  1486. //  assist in finding the issuer of the context to be verified.
  1487. //
  1488. //  When pIssuerCert is specified, pIssuerCert is the issuer of
  1489. //  rgpvContext[cContext - 1].
  1490. //
  1491. //  When cCertStore and rgCertStore are specified, these stores may contain
  1492. //  an issuer certificate.
  1493. //
  1494. //  When hCrlStore is specified then a handler which uses CRLs can search this
  1495. //  store for them
  1496. //
  1497. //  When pftTimeToUse is specified then the handler (if possible) must determine
  1498. //  revocation status relative to the time given otherwise the answer may be
  1499. //  independent of time or relative to current time
  1500. //--------------------------------------------------------------------------
  1501. typedef struct _CERT_REVOCATION_PARA {
  1502.     DWORD                       cbSize;
  1503.     PCCERT_CONTEXT              pIssuerCert;
  1504.     DWORD                       cCertStore;
  1505.     HCERTSTORE                  *rgCertStore;
  1506.     HCERTSTORE                  hCrlStore;
  1507.     LPFILETIME                  pftTimeToUse;
  1508. #ifdef CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS
  1509.     // Note, if you #define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS, then, you
  1510.     // must zero all unused fields in this data structure.
  1511.     // More fields could be added in a future release.
  1512.     // 0 uses revocation handler's default timeout.
  1513.     DWORD                       dwUrlRetrievalTimeout;  // milliseconds
  1514.     // When set, checks and attempts to retrieve a CRL where
  1515.     // ThisUpdate >= (CurrentTime - dwFreshnessTime). Otherwise, defaults
  1516.     // to using the CRL's NextUpdate.
  1517.     BOOL                        fCheckFreshnessTime;
  1518.     DWORD                       dwFreshnessTime;        // seconds
  1519.     // If NULL, revocation handler gets the current time
  1520.     LPFILETIME                  pftCurrentTime;
  1521.     // If nonNULL, a CRL revocation type handler updates with the base and
  1522.     // possibly the delta CRL used. Note, *pCrlInfo must be initialized
  1523.     // by the caller. Any nonNULL CRL contexts are freed. Any updated
  1524.     // CRL contexts must be freed by the caller.
  1525.     //
  1526.     // The CRL info is only applicable to the last context checked. If
  1527.     // interested in this information, then, CertVerifyRevocation should be
  1528.     // called with cContext = 1.
  1529.     PCERT_REVOCATION_CRL_INFO   pCrlInfo;
  1530. #endif
  1531. } CERT_REVOCATION_PARA, *PCERT_REVOCATION_PARA;
  1532. //+-------------------------------------------------------------------------
  1533. //  The following data structure is returned by CertVerifyRevocation to
  1534. //  specify the status of the revoked or unchecked context. Review the
  1535. //  following CertVerifyRevocation comments for details.
  1536. //
  1537. //  Upon input to CertVerifyRevocation, cbSize must be set to a size
  1538. //  >= (offsetof(CERT_REVOCATION_STATUS, dwReason) + sizeof(DWORD) ).
  1539. //  Otherwise, CertVerifyRevocation returns FALSE and sets LastError to
  1540. //  E_INVALIDARG.
  1541. //
  1542. //  Upon input to the installed or registered CRYPT_OID_VERIFY_REVOCATION_FUNC
  1543. //  functions, the dwIndex, dwError and dwReason have been zero'ed.
  1544. //  If present, fHasFreshnessTime and dwFreshnessTime have been zero'ed.
  1545. //--------------------------------------------------------------------------
  1546. typedef struct _CERT_REVOCATION_STATUS {
  1547.     DWORD                   cbSize;
  1548.     DWORD                   dwIndex;
  1549.     DWORD                   dwError;
  1550.     DWORD                   dwReason;
  1551.     // Depending on cbSize, the following fields may optionally be returned.
  1552.     // The Freshness time is only applicable to the last context checked. If
  1553.     // interested in this information, then, CertVerifyRevocation should be
  1554.     // called with cContext = 1.
  1555.     //
  1556.     // fHasFreshnessTime is only set if we are able to retrieve revocation
  1557.     // information. For a CRL its CurrentTime - ThisUpdate.
  1558.     BOOL                    fHasFreshnessTime;
  1559.     DWORD                   dwFreshnessTime;    // seconds
  1560. } CERT_REVOCATION_STATUS, *PCERT_REVOCATION_STATUS;
  1561. //+-------------------------------------------------------------------------
  1562. //  Verifies the array of contexts for revocation. The dwRevType parameter
  1563. //  indicates the type of the context data structure passed in rgpvContext.
  1564. //  Currently only the revocation of certificates is defined.
  1565. //
  1566. //  If the CERT_VERIFY_REV_CHAIN_FLAG flag is set, then, CertVerifyRevocation
  1567. //  is verifying a chain of certs where, rgpvContext[i + 1] is the issuer
  1568. //  of rgpvContext[i]. Otherwise, CertVerifyRevocation makes no assumptions
  1569. //  about the order of the contexts.
  1570. //
  1571. //  To assist in finding the issuer, the pRevPara may optionally be set. See
  1572. //  the CERT_REVOCATION_PARA data structure for details.
  1573. //
  1574. //  The contexts must contain enough information to allow the
  1575. //  installable or registered revocation DLLs to find the revocation server. For
  1576. //  certificates, this information would normally be conveyed in an
  1577. //  extension such as the IETF's AuthorityInfoAccess extension.
  1578. //
  1579. //  CertVerifyRevocation returns TRUE if all of the contexts were successfully
  1580. //  checked and none were revoked. Otherwise, returns FALSE and updates the
  1581. //  returned pRevStatus data structure as follows:
  1582. //    dwIndex
  1583. //      Index of the first context that was revoked or unable to
  1584. //      be checked for revocation
  1585. //    dwError
  1586. //      Error status. LastError is also set to this error status.
  1587. //      dwError can be set to one of the following error codes defined
  1588. //      in winerror.h:
  1589. //        ERROR_SUCCESS - good context
  1590. //        CRYPT_E_REVOKED - context was revoked. dwReason contains the
  1591. //           reason for revocation
  1592. //        CRYPT_E_REVOCATION_OFFLINE - unable to connect to the
  1593. //           revocation server
  1594. //        CRYPT_E_NOT_IN_REVOCATION_DATABASE - the context to be checked
  1595. //           was not found in the revocation server's database.
  1596. //        CRYPT_E_NO_REVOCATION_CHECK - the called revocation function
  1597. //           wasn't able to do a revocation check on the context
  1598. //        CRYPT_E_NO_REVOCATION_DLL - no installed or registered Dll was
  1599. //           found to verify revocation
  1600. //    dwReason
  1601. //      The dwReason is currently only set for CRYPT_E_REVOKED and contains
  1602. //      the reason why the context was revoked. May be one of the following
  1603. //      CRL reasons defined by the CRL Reason Code extension ("2.5.29.21")
  1604. //          CRL_REASON_UNSPECIFIED              0
  1605. //          CRL_REASON_KEY_COMPROMISE           1
  1606. //          CRL_REASON_CA_COMPROMISE            2
  1607. //          CRL_REASON_AFFILIATION_CHANGED      3
  1608. //          CRL_REASON_SUPERSEDED               4
  1609. //          CRL_REASON_CESSATION_OF_OPERATION   5
  1610. //          CRL_REASON_CERTIFICATE_HOLD         6
  1611. //
  1612. //  For each entry in rgpvContext, CertVerifyRevocation iterates
  1613. //  through the CRYPT_OID_VERIFY_REVOCATION_FUNC
  1614. //  function set's list of installed DEFAULT functions.
  1615. //  CryptGetDefaultOIDFunctionAddress is called with pwszDll = NULL. If no
  1616. //  installed functions are found capable of doing the revocation verification,
  1617. //  CryptVerifyRevocation iterates through CRYPT_OID_VERIFY_REVOCATION_FUNC's
  1618. //  list of registered DEFAULT Dlls. CryptGetDefaultOIDDllList is called to
  1619. //  get the list. CryptGetDefaultOIDFunctionAddress is called to load the Dll.
  1620. //
  1621. //  The called functions have the same signature as CertVerifyRevocation. A
  1622. //  called function returns TRUE if it was able to successfully check all of
  1623. //  the contexts and none were revoked. Otherwise, the called function returns
  1624. //  FALSE and updates pRevStatus. dwIndex is set to the index of
  1625. //  the first context that was found to be revoked or unable to be checked.
  1626. //  dwError and LastError are updated. For CRYPT_E_REVOKED, dwReason
  1627. //  is updated. Upon input to the called function, dwIndex, dwError and
  1628. //  dwReason have been zero'ed. cbSize has been checked to be >=
  1629. //  sizeof(CERT_REVOCATION_STATUS).
  1630. //
  1631. //  If the called function returns FALSE, and dwError isn't set to
  1632. //  CRYPT_E_REVOKED, then, CertVerifyRevocation either continues on to the
  1633. //  next DLL in the list for a returned dwIndex of 0 or for a returned
  1634. //  dwIndex > 0, restarts the process of finding a verify function by
  1635. //  advancing the start of the context array to the returned dwIndex and
  1636. //  decrementing the count of remaining contexts.
  1637. //--------------------------------------------------------------------------
  1638. WINCRYPT32API
  1639. BOOL
  1640. WINAPI
  1641. CertVerifyRevocation(
  1642.     IN DWORD dwEncodingType,
  1643.     IN DWORD dwRevType,
  1644.     IN DWORD cContext,
  1645.     IN PVOID rgpvContext[],
  1646.     IN DWORD dwFlags,
  1647.     IN OPTIONAL PCERT_REVOCATION_PARA pRevPara,
  1648.     IN OUT PCERT_REVOCATION_STATUS pRevStatus
  1649.     );
  1650. //+-------------------------------------------------------------------------
  1651. //  Revocation types
  1652. //--------------------------------------------------------------------------
  1653. #define CERT_CONTEXT_REVOCATION_TYPE        1
  1654. //+-------------------------------------------------------------------------
  1655. //  When the following flag is set, rgpvContext[] consists of a chain
  1656. //  of certificates, where rgpvContext[i + 1] is the issuer of rgpvContext[i].
  1657. //--------------------------------------------------------------------------
  1658. #define CERT_VERIFY_REV_CHAIN_FLAG              0x00000001
  1659. //+-------------------------------------------------------------------------
  1660. // CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION prevents the revocation handler from
  1661. // accessing any network based resources for revocation checking
  1662. //--------------------------------------------------------------------------
  1663. #define CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION 0x00000002
  1664. //+-------------------------------------------------------------------------
  1665. //  By default, the dwUrlRetrievalTimeout in pRevPara is the timeout used
  1666. //  for each URL wire retrieval. When the following flag is set,
  1667. //  dwUrlRetrievalTimeout is the accumulative timeout across all URL wire
  1668. //  retrievals.
  1669. //--------------------------------------------------------------------------
  1670. #define CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG   0x00000004
  1671. //+-------------------------------------------------------------------------
  1672. //  CERT_CONTEXT_REVOCATION_TYPE
  1673. //
  1674. //  pvContext points to a const CERT_CONTEXT.
  1675. //--------------------------------------------------------------------------
  1676. //+=========================================================================
  1677. //  Certificate Helper APIs
  1678. //==========================================================================
  1679. //+-------------------------------------------------------------------------
  1680. //  Compare two multiple byte integer blobs to see if they are identical.
  1681. //
  1682. //  Before doing the comparison, leading zero bytes are removed from a
  1683. //  positive number and leading 0xFF bytes are removed from a negative
  1684. //  number.
  1685. //
  1686. //  The multiple byte integers are treated as Little Endian. pbData[0] is the
  1687. //  least significant byte and pbData[cbData - 1] is the most significant
  1688. //  byte.
  1689. //
  1690. //  Returns TRUE if the integer blobs are identical after removing leading
  1691. //  0 or 0xFF bytes.
  1692. //--------------------------------------------------------------------------
  1693. BOOL
  1694. WINAPI
  1695. CertCompareIntegerBlob(
  1696.     IN PCRYPT_INTEGER_BLOB pInt1,
  1697.     IN PCRYPT_INTEGER_BLOB pInt2
  1698.     );
  1699. //+-------------------------------------------------------------------------
  1700. //  Compare two certificates to see if they are identical.
  1701. //
  1702. //  Since a certificate is uniquely identified by its Issuer and SerialNumber,
  1703. //  these are the only fields needing to be compared.
  1704. //
  1705. //  Returns TRUE if the certificates are identical.
  1706. //--------------------------------------------------------------------------
  1707. WINCRYPT32API
  1708. BOOL
  1709. WINAPI
  1710. CertCompareCertificate(
  1711.     IN DWORD dwCertEncodingType,
  1712.     IN PCERT_INFO pCertId1,
  1713.     IN PCERT_INFO pCertId2
  1714.     );
  1715. //+-------------------------------------------------------------------------
  1716. //  Compare two certificate names to see if they are identical.
  1717. //
  1718. //  Returns TRUE if the names are identical.
  1719. //--------------------------------------------------------------------------
  1720. WINCRYPT32API
  1721. BOOL
  1722. WINAPI
  1723. CertCompareCertificateName(
  1724.     IN DWORD dwCertEncodingType,
  1725.     IN PCERT_NAME_BLOB pCertName1,
  1726.     IN PCERT_NAME_BLOB pCertName2
  1727.     );
  1728. //+-------------------------------------------------------------------------
  1729. //  Compare the attributes in the certificate name with the specified
  1730. //  Relative Distinguished Name's (CERT_RDN) array of attributes.
  1731. //  The comparison iterates through the CERT_RDN attributes and looks for an
  1732. //  attribute match in any of the certificate name's RDNs.
  1733. //  Returns TRUE if all the attributes are found and match.
  1734. //
  1735. //  The CERT_RDN_ATTR fields can have the following special values:
  1736. //    pszObjId == NULL              - ignore the attribute object identifier
  1737. //    dwValueType == RDN_ANY_TYPE   - ignore the value type
  1738. //
  1739. //  CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG should be set to do
  1740. //  a case insensitive match. Otherwise, defaults to an exact, case sensitive
  1741. //  match.
  1742. //
  1743. //  CERT_UNICODE_IS_RDN_ATTRS_FLAG should be set if the pRDN was initialized
  1744. //  with unicode strings as for CryptEncodeObject(X509_UNICODE_NAME).
  1745. //--------------------------------------------------------------------------
  1746. WINCRYPT32API
  1747. BOOL
  1748. WINAPI
  1749. CertIsRDNAttrsInCertificateName(
  1750.     IN DWORD dwCertEncodingType,
  1751.     IN DWORD dwFlags,
  1752.     IN PCERT_NAME_BLOB pCertName,
  1753.     IN PCERT_RDN pRDN
  1754.     );
  1755. #define CERT_UNICODE_IS_RDN_ATTRS_FLAG              0x1
  1756. #define CERT_CASE_INSENSITIVE_IS_RDN_ATTRS_FLAG     0x2
  1757. //+-------------------------------------------------------------------------
  1758. //  Compare two public keys to see if they are identical.
  1759. //
  1760. //  Returns TRUE if the keys are identical.
  1761. //--------------------------------------------------------------------------
  1762. WINCRYPT32API
  1763. BOOL
  1764. WINAPI
  1765. CertComparePublicKeyInfo(
  1766.     IN DWORD dwCertEncodingType,
  1767.     IN PCERT_PUBLIC_KEY_INFO pPublicKey1,
  1768.     IN PCERT_PUBLIC_KEY_INFO pPublicKey2
  1769.     );
  1770. //+-------------------------------------------------------------------------
  1771. //  Get the public/private key's bit length.
  1772. //
  1773. //  Returns 0 if unable to determine the key's length.
  1774. //--------------------------------------------------------------------------
  1775. WINCRYPT32API
  1776. DWORD
  1777. WINAPI
  1778. CertGetPublicKeyLength(
  1779.     IN DWORD dwCertEncodingType,
  1780.     IN PCERT_PUBLIC_KEY_INFO pPublicKey
  1781.     );
  1782. //+-------------------------------------------------------------------------
  1783. //  Verify the signature of a subject certificate or a CRL using the
  1784. //  public key info
  1785. //
  1786. //  Returns TRUE for a valid signature.
  1787. //
  1788. //  hCryptProv specifies the crypto provider to use to verify the signature.
  1789. //  It doesn't need to use a private key.
  1790. //--------------------------------------------------------------------------
  1791. WINCRYPT32API
  1792. BOOL
  1793. WINAPI
  1794. CryptVerifyCertificateSignature(
  1795.     IN HCRYPTPROV               hCryptProv,
  1796.     IN DWORD                    dwCertEncodingType,
  1797.     IN const BYTE *             pbEncoded,
  1798.     IN DWORD                    cbEncoded,
  1799.     IN PCERT_PUBLIC_KEY_INFO    pPublicKey
  1800.     );
  1801. //+-------------------------------------------------------------------------
  1802. //  Verify the signature of a subject certificate, CRL, certificate request
  1803. //  or keygen request using the issuer's public key.
  1804. //
  1805. //  Returns TRUE for a valid signature.
  1806. //
  1807. //  The subject can be an encoded blob or a context for a certificate or CRL.
  1808. //  For a subject certificate context, if the certificate is missing
  1809. //  inheritable PublicKey Algorithm Parameters, the context's
  1810. //  CERT_PUBKEY_ALG_PARA_PROP_ID is updated with the issuer's public key
  1811. //  algorithm parameters for a valid signature.
  1812. //
  1813. //  The issuer can be a pointer to a CERT_PUBLIC_KEY_INFO, certificate
  1814. //  context or a chain context.
  1815. //
  1816. //  hCryptProv specifies the crypto provider to use to verify the signature.
  1817. //  Its private key isn't used. If hCryptProv is NULL, a default
  1818. //  provider is picked according to the PublicKey Algorithm OID.
  1819. //
  1820. //  If the signature algorithm is a hashing algorithm, then, the
  1821. //  signature is expected to contain the hash octets. Only dwIssuerType
  1822. //  of CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL may be specified
  1823. //  to verify this no signature case. If any other dwIssuerType is
  1824. //  specified, the verify will fail with LastError set to E_INVALIDARG.
  1825. //--------------------------------------------------------------------------
  1826. WINCRYPT32API
  1827. BOOL
  1828. WINAPI
  1829. CryptVerifyCertificateSignatureEx(
  1830.     IN OPTIONAL HCRYPTPROV hCryptProv,
  1831.     IN DWORD dwCertEncodingType,
  1832.     IN DWORD dwSubjectType,
  1833.     IN void *pvSubject,
  1834.     IN DWORD dwIssuerType,
  1835.     IN void *pvIssuer,
  1836.     IN DWORD dwFlags,
  1837.     IN OPTIONAL void *pvReserved
  1838.     );
  1839. // Subject Types
  1840. #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB         1
  1841.     // pvSubject :: PCRYPT_DATA_BLOB
  1842. #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT         2
  1843.     // pvSubject :: PCCERT_CONTEXT
  1844. #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRL          3
  1845.     // pvSubject :: PCCRL_CONTEXT
  1846. // Issuer Types
  1847. #define CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY        1
  1848.     // pvIssuer :: PCERT_PUBLIC_KEY_INFO
  1849. #define CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT          2
  1850.     // pvIssuer :: PCCERT_CONTEXT
  1851. #define CRYPT_VERIFY_CERT_SIGN_ISSUER_CHAIN         3
  1852.     // pvIssuer :: PCCERT_CHAIN_CONTEXT
  1853. #define CRYPT_VERIFY_CERT_SIGN_ISSUER_NULL          4
  1854.     // pvIssuer :: NULL
  1855. //+-------------------------------------------------------------------------
  1856. //  Compute the hash of the "to be signed" information in the encoded
  1857. //  signed content (CERT_SIGNED_CONTENT_INFO).
  1858. //
  1859. //  hCryptProv specifies the crypto provider to use to compute the hash.
  1860. //  It doesn't need to use a private key.
  1861. //--------------------------------------------------------------------------
  1862. WINCRYPT32API
  1863. BOOL
  1864. WINAPI
  1865. CryptHashToBeSigned(
  1866.     IN HCRYPTPROV hCryptProv,
  1867.     IN DWORD dwCertEncodingType,
  1868.     IN const BYTE *pbEncoded,
  1869.     IN DWORD cbEncoded,
  1870.     OUT BYTE *pbComputedHash,
  1871.     IN OUT DWORD *pcbComputedHash
  1872.     );
  1873. //+-------------------------------------------------------------------------
  1874. //  Hash the encoded content.
  1875. //
  1876. //  hCryptProv specifies the crypto provider to use to compute the hash.
  1877. //  It doesn't need to use a private key.
  1878. //
  1879. //  Algid specifies the CAPI hash algorithm to use. If Algid is 0, then, the
  1880. //  default hash algorithm (currently SHA1) is used.
  1881. //--------------------------------------------------------------------------
  1882. WINCRYPT32API
  1883. BOOL
  1884. WINAPI
  1885. CryptHashCertificate(
  1886.     IN HCRYPTPROV hCryptProv,
  1887.     IN ALG_ID Algid,
  1888.     IN DWORD dwFlags,
  1889.     IN const BYTE *pbEncoded,
  1890.     IN DWORD cbEncoded,
  1891.     OUT BYTE *pbComputedHash,
  1892.     IN OUT DWORD *pcbComputedHash
  1893.     );
  1894. //+-------------------------------------------------------------------------
  1895. //  Sign the "to be signed" information in the encoded signed content.
  1896. //
  1897. //  hCryptProv specifies the crypto provider to use to do the signature.
  1898. //  It uses the specified private key.
  1899. //
  1900. //  If the SignatureAlgorithm is a hash algorithm, then, the signature
  1901. //  contains the hash octets. A private key isn't used to encrypt the hash.
  1902. //  dwKeySpec isn't used and hCryptProv can be NULL where an appropriate
  1903. //  default provider will be used for hashing.
  1904. //--------------------------------------------------------------------------
  1905. WINCRYPT32API
  1906. BOOL
  1907. WINAPI
  1908. CryptSignCertificate(
  1909.     IN HCRYPTPROV hCryptProv,
  1910.     IN DWORD dwKeySpec,
  1911.     IN DWORD dwCertEncodingType,
  1912.     IN const BYTE *pbEncodedToBeSigned,
  1913.     IN DWORD cbEncodedToBeSigned,
  1914.     IN PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
  1915.     IN OPTIONAL const void *pvHashAuxInfo,
  1916.     OUT BYTE *pbSignature,
  1917.     IN OUT DWORD *pcbSignature
  1918.     );
  1919. //+-------------------------------------------------------------------------
  1920. //  Encode the "to be signed" information. Sign the encoded "to be signed".
  1921. //  Encode the "to be signed" and the signature.
  1922. //
  1923. //  hCryptProv specifies the crypto provider to use to do the signature.
  1924. //  It uses the specified private key.
  1925. //
  1926. //  If the SignatureAlgorithm is a hash algorithm, then, the signature
  1927. //  contains the hash octets. A private key isn't used to encrypt the hash.
  1928. //  dwKeySpec isn't used and hCryptProv can be NULL where an appropriate
  1929. //  default provider will be used for hashing.
  1930. //--------------------------------------------------------------------------
  1931. WINCRYPT32API
  1932. BOOL
  1933. WINAPI
  1934. CryptSignAndEncodeCertificate(
  1935.     IN HCRYPTPROV hCryptProv,
  1936.     IN DWORD dwKeySpec,
  1937.     IN DWORD dwCertEncodingType,
  1938.     IN LPCSTR lpszStructType,       // "to be signed"
  1939.     IN const void *pvStructInfo,
  1940.     IN PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
  1941.     IN OPTIONAL const void *pvHashAuxInfo,
  1942.     OUT PBYTE pbEncoded,
  1943.     IN OUT DWORD *pcbEncoded
  1944.     );
  1945. //+-------------------------------------------------------------------------
  1946. //  Verify the time validity of a certificate.
  1947. //
  1948. //  Returns -1 if before NotBefore, +1 if after NotAfter and otherwise 0 for
  1949. //  a valid certificate
  1950. //
  1951. //  If pTimeToVerify is NULL, uses the current time.
  1952. //--------------------------------------------------------------------------
  1953. WINCRYPT32API
  1954. LONG
  1955. WINAPI
  1956. CertVerifyTimeValidity(
  1957.     IN LPFILETIME pTimeToVerify,
  1958.     IN PCERT_INFO pCertInfo
  1959.     );
  1960. //+-------------------------------------------------------------------------
  1961. //  Verify the time validity of a CRL.
  1962. //
  1963. //  Returns -1 if before ThisUpdate, +1 if after NextUpdate and otherwise 0 for
  1964. //  a valid CRL
  1965. //
  1966. //  If pTimeToVerify is NULL, uses the current time.
  1967. //--------------------------------------------------------------------------
  1968. WINCRYPT32API
  1969. LONG
  1970. WINAPI
  1971. CertVerifyCRLTimeValidity(
  1972.     IN LPFILETIME pTimeToVerify,
  1973.     IN PCRL_INFO pCrlInfo
  1974.     );
  1975. //+-------------------------------------------------------------------------
  1976. //  Verify that the subject's time validity nests within the issuer's time
  1977. //  validity.
  1978. //
  1979. //  Returns TRUE if it nests. Otherwise, returns FALSE.
  1980. //--------------------------------------------------------------------------
  1981. WINCRYPT32API
  1982. BOOL
  1983. WINAPI
  1984. CertVerifyValidityNesting(
  1985.     IN PCERT_INFO pSubjectInfo,
  1986.     IN PCERT_INFO pIssuerInfo
  1987.     );
  1988. //+-------------------------------------------------------------------------
  1989. //  Verify that the subject certificate isn't on its issuer CRL.
  1990. //
  1991. //  Returns true if the certificate isn't on the CRL.
  1992. //--------------------------------------------------------------------------
  1993. WINCRYPT32API
  1994. BOOL
  1995. WINAPI
  1996. CertVerifyCRLRevocation(
  1997.     IN DWORD dwCertEncodingType,
  1998.     IN PCERT_INFO pCertId,          // Only the Issuer and SerialNumber
  1999.     // fields are used
  2000.     IN DWORD cCrlInfo,
  2001.     IN PCRL_INFO rgpCrlInfo[]
  2002.     );
  2003. //+-------------------------------------------------------------------------
  2004. //  Convert the CAPI AlgId to the ASN.1 Object Identifier string
  2005. //
  2006. //  Returns NULL if there isn't an ObjId corresponding to the AlgId.
  2007. //--------------------------------------------------------------------------
  2008. WINCRYPT32API
  2009. LPCSTR
  2010. WINAPI
  2011. CertAlgIdToOID(
  2012.     IN DWORD dwAlgId
  2013.     );
  2014. //+-------------------------------------------------------------------------
  2015. //  Convert the ASN.1 Object Identifier string to the CAPI AlgId.
  2016. //
  2017. //  Returns 0 if there isn't an AlgId corresponding to the ObjId.
  2018. //--------------------------------------------------------------------------
  2019. WINCRYPT32API
  2020. DWORD
  2021. WINAPI
  2022. CertOIDToAlgId(
  2023.     IN LPCSTR pszObjId
  2024.     );
  2025. //+-------------------------------------------------------------------------
  2026. //  Find an extension identified by its Object Identifier.
  2027. //
  2028. //  If found, returns pointer to the extension. Otherwise, returns NULL.
  2029. //--------------------------------------------------------------------------
  2030. WINCRYPT32API
  2031. PCERT_EXTENSION
  2032. WINAPI
  2033. CertFindExtension(
  2034.     IN LPCSTR pszObjId,
  2035.     IN DWORD cExtensions,
  2036.     IN CERT_EXTENSION rgExtensions[]
  2037.     );
  2038. //+-------------------------------------------------------------------------
  2039. //  Find the first attribute identified by its Object Identifier.
  2040. //
  2041. //  If found, returns pointer to the attribute. Otherwise, returns NULL.
  2042. //--------------------------------------------------------------------------
  2043. WINCRYPT32API
  2044. PCRYPT_ATTRIBUTE
  2045. WINAPI
  2046. CertFindAttribute(
  2047.     IN LPCSTR pszObjId,
  2048.     IN DWORD cAttr,
  2049.     IN CRYPT_ATTRIBUTE rgAttr[]
  2050.     );
  2051. //+-------------------------------------------------------------------------
  2052. //  Find the first CERT_RDN attribute identified by its Object Identifier in
  2053. //  the name's list of Relative Distinguished Names.
  2054. //
  2055. //  If found, returns pointer to the attribute. Otherwise, returns NULL.
  2056. //--------------------------------------------------------------------------
  2057. WINCRYPT32API
  2058. PCERT_RDN_ATTR
  2059. WINAPI
  2060. CertFindRDNAttr(
  2061.     IN LPCSTR pszObjId,
  2062.     IN PCERT_NAME_INFO pName
  2063.     );
  2064. //+-------------------------------------------------------------------------
  2065. //  Get the intended key usage bytes from the certificate.
  2066. //
  2067. //  If the certificate doesn't have any intended key usage bytes, returns FALSE
  2068. //  and *pbKeyUsage is zeroed. Otherwise, returns TRUE and up through
  2069. //  cbKeyUsage bytes are copied into *pbKeyUsage. Any remaining uncopied
  2070. //  bytes are zeroed.
  2071. //--------------------------------------------------------------------------
  2072. WINCRYPT32API
  2073. BOOL
  2074. WINAPI
  2075. CertGetIntendedKeyUsage(
  2076.     IN DWORD dwCertEncodingType,
  2077.     IN PCERT_INFO pCertInfo,
  2078.     OUT BYTE *pbKeyUsage,
  2079.     IN DWORD cbKeyUsage
  2080.     );
  2081. typedef void *HCRYPTDEFAULTCONTEXT;
  2082. //+-------------------------------------------------------------------------
  2083. //  Install a previously CryptAcquiredContext'ed HCRYPTPROV to be used as
  2084. //  a default context.
  2085. //
  2086. //  dwDefaultType and pvDefaultPara specify where the default context is used.
  2087. //  For example, install the HCRYPTPROV to be used to verify certificate's
  2088. //  having szOID_OIWSEC_md5RSA signatures.
  2089. //
  2090. //  By default, the installed HCRYPTPROV is only applicable to the current
  2091. //  thread. Set CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG to allow the HCRYPTPROV
  2092. //  to be used by all threads in the current process.
  2093. //
  2094. //  For a successful install, TRUE is returned and *phDefaultContext is
  2095. //  updated with the HANDLE to be passed to CryptUninstallDefaultContext.
  2096. //
  2097. //  The installed HCRYPTPROVs are stack ordered (the last installed
  2098. //  HCRYPTPROV is checked first). All thread installed HCRYPTPROVs are
  2099. //  checked before any process HCRYPTPROVs.
  2100. //
  2101. //  The installed HCRYPTPROV remains available for default usage until
  2102. //  CryptUninstallDefaultContext is called or the thread or process exits.
  2103. //
  2104. //  If CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG is set, then, the HCRYPTPROV
  2105. //  is CryptReleaseContext'ed at thread or process exit. However,
  2106. //  not CryptReleaseContext'ed if CryptUninstallDefaultContext is
  2107. //  called.
  2108. //--------------------------------------------------------------------------
  2109. WINCRYPT32API
  2110. BOOL
  2111. WINAPI
  2112. CryptInstallDefaultContext(
  2113.     IN HCRYPTPROV hCryptProv,
  2114.     IN DWORD dwDefaultType,
  2115.     IN const void *pvDefaultPara,
  2116.     IN DWORD dwFlags,
  2117.     IN void *pvReserved,
  2118.     OUT HCRYPTDEFAULTCONTEXT *phDefaultContext
  2119.     );
  2120. // dwFlags
  2121. #define CRYPT_DEFAULT_CONTEXT_AUTO_RELEASE_FLAG             0x00000001
  2122. #define CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG                  0x00000002
  2123. // List of dwDefaultType's
  2124. #define CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID         1
  2125. #define CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID   2
  2126. //+-------------------------------------------------------------------------
  2127. //  CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID
  2128. //
  2129. //  Install a default HCRYPTPROV used to verify a certificate
  2130. //  signature. pvDefaultPara points to the szOID of the certificate
  2131. //  signature algorithm, for example, szOID_OIWSEC_md5RSA. If
  2132. //  pvDefaultPara is NULL, then, the HCRYPTPROV is used to verify all
  2133. //  certificate signatures. Note, pvDefaultPara can't be NULL when
  2134. //  CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG is set.
  2135. //--------------------------------------------------------------------------
  2136. //+-------------------------------------------------------------------------
  2137. //  CRYPT_DEFAULT_CONTEXT_MULTI_CERT_SIGN_OID
  2138. //
  2139. //  Same as CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OID. However, the default
  2140. //  HCRYPTPROV is to be used for multiple signature szOIDs. pvDefaultPara
  2141. //  points to a CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA structure containing
  2142. //  an array of szOID pointers.
  2143. //--------------------------------------------------------------------------
  2144. typedef struct _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA {
  2145.     DWORD               cOID;
  2146.     LPSTR               *rgpszOID;
  2147. } CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA, *PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
  2148. //+-------------------------------------------------------------------------
  2149. //  Uninstall a default context previously installed by
  2150. //  CryptInstallDefaultContext.
  2151. //
  2152. //  For a default context installed with CRYPT_DEFAULT_CONTEXT_PROCESS_FLAG
  2153. //  set, if any other threads are currently using this context,
  2154. //  this function will block until they finish.
  2155. //--------------------------------------------------------------------------
  2156. WINCRYPT32API
  2157. BOOL
  2158. WINAPI
  2159. CryptUninstallDefaultContext(
  2160.     HCRYPTDEFAULTCONTEXT hDefaultContext,
  2161.     IN DWORD dwFlags,
  2162.     IN void *pvReserved
  2163.     );
  2164. //+-------------------------------------------------------------------------
  2165. //  Export the public key info associated with the provider's corresponding
  2166. //  private key.
  2167. //
  2168. //  Calls CryptExportPublicKeyInfoEx with pszPublicKeyObjId = NULL,
  2169. //  dwFlags = 0 and pvAuxInfo = NULL.
  2170. //--------------------------------------------------------------------------
  2171. WINCRYPT32API
  2172. BOOL
  2173. WINAPI
  2174. CryptExportPublicKeyInfo(
  2175.     IN HCRYPTPROV hCryptProv,
  2176.     IN DWORD dwKeySpec,
  2177.     IN DWORD dwCertEncodingType,
  2178.     OUT PCERT_PUBLIC_KEY_INFO pInfo,
  2179.     IN OUT DWORD *pcbInfo
  2180.     );
  2181. //+-------------------------------------------------------------------------
  2182. //  Export the public key info associated with the provider's corresponding
  2183. //  private key.
  2184. //
  2185. //  Uses the dwCertEncodingType and pszPublicKeyObjId to call the
  2186. //  installable CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC. The called function
  2187. //  has the same signature as CryptExportPublicKeyInfoEx.
  2188. //
  2189. //  If unable to find an installable OID function for the pszPublicKeyObjId,
  2190. //  attempts to export as a RSA Public Key (szOID_RSA_RSA).
  2191. //
  2192. //  The dwFlags and pvAuxInfo aren't used for szOID_RSA_RSA.
  2193. //--------------------------------------------------------------------------
  2194. #define CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC   "CryptDllExportPublicKeyInfoEx"
  2195. WINCRYPT32API
  2196. BOOL
  2197. WINAPI
  2198. CryptExportPublicKeyInfoEx(
  2199.     IN HCRYPTPROV hCryptProv,
  2200.     IN DWORD dwKeySpec,
  2201.     IN DWORD dwCertEncodingType,
  2202.     IN LPSTR pszPublicKeyObjId,
  2203.     IN DWORD dwFlags,
  2204.     IN OPTIONAL void *pvAuxInfo,
  2205.     OUT PCERT_PUBLIC_KEY_INFO pInfo,
  2206.     IN OUT DWORD *pcbInfo
  2207.     );
  2208. //+-------------------------------------------------------------------------
  2209. //  Convert and import the public key info into the provider and return a
  2210. //  handle to the public key.
  2211. //
  2212. //  Calls CryptImportPublicKeyInfoEx with aiKeyAlg = 0, dwFlags = 0 and
  2213. //  pvAuxInfo = NULL.
  2214. //--------------------------------------------------------------------------
  2215. WINCRYPT32API
  2216. BOOL
  2217. WINAPI
  2218. CryptImportPublicKeyInfo(
  2219.     IN HCRYPTPROV hCryptProv,
  2220.     IN DWORD dwCertEncodingType,
  2221.     IN PCERT_PUBLIC_KEY_INFO pInfo,
  2222.     OUT HCRYPTKEY *phKey
  2223.     );
  2224. //+-------------------------------------------------------------------------
  2225. //  Convert and import the public key info into the provider and return a
  2226. //  handle to the public key.
  2227. //
  2228. //  Uses the dwCertEncodingType and pInfo->Algorithm.pszObjId to call the
  2229. //  installable CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC. The called function
  2230. //  has the same signature as CryptImportPublicKeyInfoEx.
  2231. //
  2232. //  If unable to find an installable OID function for the pszObjId,
  2233. //  attempts to import as a RSA Public Key (szOID_RSA_RSA).
  2234. //
  2235. //  For szOID_RSA_RSA: aiKeyAlg may be set to CALG_RSA_SIGN or CALG_RSA_KEYX.
  2236. //  Defaults to CALG_RSA_KEYX. The dwFlags and pvAuxInfo aren't used.
  2237. //--------------------------------------------------------------------------
  2238. #define CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC   "CryptDllImportPublicKeyInfoEx"
  2239. WINCRYPT32API
  2240. BOOL
  2241. WINAPI
  2242. CryptImportPublicKeyInfoEx(
  2243.     IN HCRYPTPROV hCryptProv,
  2244.     IN DWORD dwCertEncodingType,
  2245.     IN PCERT_PUBLIC_KEY_INFO pInfo,
  2246.     IN ALG_ID aiKeyAlg,
  2247.     IN DWORD dwFlags,
  2248.     IN OPTIONAL void *pvAuxInfo,
  2249.     OUT HCRYPTKEY *phKey
  2250.     );
  2251. //+-------------------------------------------------------------------------
  2252. //  Acquire a HCRYPTPROV handle and dwKeySpec for the specified certificate
  2253. //  context. Uses the certificate's CERT_KEY_PROV_INFO_PROP_ID property.
  2254. //  The returned HCRYPTPROV handle may optionally be cached using the
  2255. //  certificate's CERT_KEY_CONTEXT_PROP_ID property.
  2256. //
  2257. //  If CRYPT_ACQUIRE_CACHE_FLAG is set, then, if an already acquired and
  2258. //  cached HCRYPTPROV exists for the certificate, its returned. Otherwise,
  2259. //  a HCRYPTPROV is acquired and then cached via the certificate's
  2260. //  CERT_KEY_CONTEXT_PROP_ID.
  2261. //
  2262. //  The CRYPT_ACQUIRE_USE_PROV_INFO_FLAG can be set to use the dwFlags field of
  2263. //  the certificate's CERT_KEY_PROV_INFO_PROP_ID property's CRYPT_KEY_PROV_INFO
  2264. //  data structure to determine if the returned HCRYPTPROV should be cached.
  2265. //  HCRYPTPROV caching is enabled if the CERT_SET_KEY_CONTEXT_PROP_ID flag was
  2266. //  set.
  2267. //
  2268. //  If CRYPT_ACQUIRE_COMPARE_KEY_FLAG is set, then,
  2269. //  the public key in the certificate is compared with the public
  2270. //  key returned by the cryptographic provider. If the keys don't match, the
  2271. //  acquire fails and LastError is set to NTE_BAD_PUBLIC_KEY. Note, if
  2272. //  a cached HCRYPTPROV is returned, the comparison isn't done. We assume the
  2273. //  comparison was done on the initial acquire.
  2274. //
  2275. //  The CRYPT_ACQUIRE_SILENT_FLAG can be set to suppress any UI by the CSP.
  2276. //  See CryptAcquireContext's CRYPT_SILENT flag for more details.
  2277. //
  2278. //  *pfCallerFreeProv is returned set to FALSE for:
  2279. //    - Acquire or public key comparison fails.
  2280. //    - CRYPT_ACQUIRE_CACHE_FLAG is set.
  2281. //    - CRYPT_ACQUIRE_USE_PROV_INFO_FLAG is set AND
  2282. //      CERT_SET_KEY_CONTEXT_PROP_ID flag is set in the dwFlags field of the
  2283. //      certificate's CERT_KEY_PROV_INFO_PROP_ID property's
  2284. //      CRYPT_KEY_PROV_INFO data structure.
  2285. //  When *pfCallerFreeProv is FALSE, the caller must not release. The
  2286. //  returned HCRYPTPROV will be released on the last free of the certificate
  2287. //  context.
  2288. //
  2289. //  Otherwise, *pfCallerFreeProv is TRUE and the returned HCRYPTPROV must
  2290. //  be released by the caller by calling CryptReleaseContext.
  2291. //--------------------------------------------------------------------------
  2292. WINCRYPT32API
  2293. BOOL
  2294. WINAPI
  2295. CryptAcquireCertificatePrivateKey(
  2296.     IN PCCERT_CONTEXT pCert,
  2297.     IN DWORD dwFlags,
  2298.     IN void *pvReserved,
  2299.     OUT HCRYPTPROV *phCryptProv,
  2300.     OUT OPTIONAL DWORD *pdwKeySpec,
  2301.     OUT OPTIONAL BOOL *pfCallerFreeProv
  2302.     );
  2303. #define CRYPT_ACQUIRE_CACHE_FLAG                0x00000001
  2304. #define CRYPT_ACQUIRE_USE_PROV_INFO_FLAG        0x00000002
  2305. #define CRYPT_ACQUIRE_COMPARE_KEY_FLAG          0x00000004
  2306. #define CRYPT_ACQUIRE_SILENT_FLAG               0x00000040
  2307. //+-------------------------------------------------------------------------
  2308. //  Enumerates the cryptographic providers and their containers to find the
  2309. //  private key corresponding to the certificate's public key. For a match,
  2310. //  the certificate's CERT_KEY_PROV_INFO_PROP_ID property is updated.
  2311. //
  2312. //  If the CERT_KEY_PROV_INFO_PROP_ID is already set, then, its checked to
  2313. //  see if it matches the provider's public key. For a match, the above
  2314. //  enumeration is skipped.
  2315. //
  2316. //  By default both the user and machine key containers are searched.
  2317. //  The CRYPT_FIND_USER_KEYSET_FLAG or CRYPT_FIND_MACHINE_KEYSET_FLAG
  2318. //  can be set in dwFlags to restrict the search to either of the containers.
  2319. //
  2320. //  The CRYPT_FIND_SILENT_KEYSET_FLAG can be set to suppress any UI by the CSP.
  2321. //  See CryptAcquireContext's CRYPT_SILENT flag for more details.
  2322. //
  2323. //  If a container isn't found, returns FALSE with LastError set to
  2324. //  NTE_NO_KEY.
  2325. //--------------------------------------------------------------------------
  2326. WINCRYPT32API
  2327. BOOL
  2328. WINAPI
  2329. CryptFindCertificateKeyProvInfo(
  2330.     IN PCCERT_CONTEXT pCert,
  2331.     IN DWORD dwFlags,
  2332.     IN void *pvReserved
  2333.     );
  2334. #define CRYPT_FIND_USER_KEYSET_FLAG        0x00000001
  2335. #define CRYPT_FIND_MACHINE_KEYSET_FLAG     0x00000002
  2336. #define CRYPT_FIND_SILENT_KEYSET_FLAG      0x00000040
  2337. //+-------------------------------------------------------------------------
  2338. //  This is the prototype for the installable function which is called to
  2339. //  actually import a key into a CSP.  an installable of this type is called
  2340. //  from CryptImportPKCS8.  the algorithm OID of the private key is used
  2341. //  to look up the proper installable function to call.
  2342. //
  2343. //  hCryptProv - the provider to import the key to
  2344. //  pPrivateKeyInfo - describes the key to be imported
  2345. //  dwFlags - The available flags are:
  2346. //              CRYPT_EXPORTABLE
  2347. //              this flag is used when importing private keys, for a full
  2348. //              explanation please see the documentation for CryptImportKey.
  2349. //  pvAuxInfo - reserved for future, must be NULL
  2350. //--------------------------------------------------------------------------
  2351. typedef BOOL (WINAPI *PFN_IMPORT_PRIV_KEY_FUNC) (
  2352.     HCRYPTPROV              hCryptProv,         // in
  2353.     CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   // in
  2354.     DWORD                   dwFlags,            // in, optional
  2355.     void                    *pvAuxInfo          // in, optional
  2356.     );
  2357. #define CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNC   "CryptDllImportPrivateKeyInfoEx"
  2358. //+-------------------------------------------------------------------------
  2359. // Convert (from PKCS8 format) and import the private key into a provider
  2360. // and return a handle to the provider as well as the KeySpec used to import to.
  2361. //
  2362. // This function will call the PRESOLVE_HCRYPTPROV_FUNC in the
  2363. // privateKeyAndParams to obtain a handle of provider to import the key to.
  2364. // if the PRESOLVE_HCRYPTPROV_FUNC is NULL then the default provider will be used.
  2365. //
  2366. // privateKeyAndParams - private key blob and corresponding parameters
  2367. // dwFlags - The available flags are:
  2368. //              CRYPT_EXPORTABLE
  2369. //              this flag is used when importing private keys, for a full
  2370. //              explanation please see the documentation for CryptImportKey.
  2371. // phCryptProv - filled in with the handle of the provider the key was
  2372. //               imported to, the caller is responsible for freeing it
  2373. // pvAuxInfo - This parameter is reserved for future use and should be set
  2374. //             to NULL in the interim.
  2375. //--------------------------------------------------------------------------
  2376. WINCRYPT32API
  2377. BOOL
  2378. WINAPI
  2379. CryptImportPKCS8(
  2380.     CRYPT_PKCS8_IMPORT_PARAMS           sImportParams,          // in
  2381.     DWORD                               dwFlags,                // in, optional
  2382.     HCRYPTPROV                          *phCryptProv,           // out, optional
  2383.     void                                *pvAuxInfo              // in, optional
  2384.     );
  2385. //+-------------------------------------------------------------------------
  2386. // this is the prototype for installable functions for exporting the private key
  2387. //--------------------------------------------------------------------------
  2388. typedef BOOL (WINAPI *PFN_EXPORT_PRIV_KEY_FUNC) (
  2389.     HCRYPTPROV              hCryptProv,         // in
  2390.     DWORD                   dwKeySpec,          // in
  2391.     LPSTR                   pszPrivateKeyObjId, // in
  2392.     DWORD                   dwFlags,            // in
  2393.     void                    *pvAuxInfo,         // in
  2394.     CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   // out
  2395.     DWORD                   *pcbPrivateKeyBlob  // in, out
  2396.     );
  2397. #define CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC   "CryptDllExportPrivateKeyInfoEx"
  2398. #define CRYPT_DELETE_KEYSET 0x0001
  2399. //+-------------------------------------------------------------------------
  2400. //  CryptExportPKCS8 -- superseded by CryptExportPKCS8Ex
  2401. //
  2402. //  Export the private key in PKCS8 format
  2403. //--------------------------------------------------------------------------
  2404. WINCRYPT32API
  2405. BOOL
  2406. WINAPI
  2407. CryptExportPKCS8(
  2408.     HCRYPTPROV  hCryptProv,         // in
  2409.     DWORD       dwKeySpec,          // in
  2410.     LPSTR       pszPrivateKeyObjId, // in
  2411.     DWORD       dwFlags,            // in
  2412.     void        *pvAuxInfo,         // in
  2413.     BYTE        *pbPrivateKeyBlob,  // out
  2414.     DWORD       *pcbPrivateKeyBlob  // in, out
  2415.     );
  2416. //+-------------------------------------------------------------------------
  2417. // CryptExportPKCS8Ex
  2418. //
  2419. //  Export the private key in PKCS8 format
  2420. //
  2421. //
  2422. //  Uses the pszPrivateKeyObjId to call the
  2423. //  installable CRYPT_OID_EXPORT_PRIVATE_KEY_INFO_FUNC. The called function
  2424. //  has the signature defined by PFN_EXPORT_PRIV_KEY_FUNC.
  2425. //
  2426. //  If unable to find an installable OID function for the pszPrivateKeyObjId,
  2427. //  attempts to export as a RSA Private Key (szOID_RSA_RSA).
  2428. //
  2429. // psExportParams - specifies information about the key to export
  2430. // dwFlags - The flag values. None currently supported
  2431. // pvAuxInfo - This parameter is reserved for future use and should be set to
  2432. //                         NULL in the interim.
  2433. // pbPrivateKeyBlob - A pointer to the private key blob.  It will be encoded
  2434. //                                        as a PKCS8 PrivateKeyInfo.
  2435. // pcbPrivateKeyBlob - A pointer to a DWORD that contains the size, in bytes,
  2436. //                                         of the private key blob being exported.
  2437. //+-------------------------------------------------------------------------
  2438. WINCRYPT32API
  2439. BOOL
  2440. WINAPI
  2441. CryptExportPKCS8Ex(
  2442.     CRYPT_PKCS8_EXPORT_PARAMS* psExportParams, // in
  2443.     DWORD       dwFlags,            // in
  2444.     void        *pvAuxInfo,         // in
  2445.     BYTE        *pbPrivateKeyBlob,  // out
  2446.     DWORD       *pcbPrivateKeyBlob  // in, out
  2447.     );
  2448. //+-------------------------------------------------------------------------
  2449. //  Compute the hash of the encoded public key info.
  2450. //
  2451. //  The public key info is encoded and then hashed.
  2452. //--------------------------------------------------------------------------
  2453. WINCRYPT32API
  2454. BOOL
  2455. WINAPI
  2456. CryptHashPublicKeyInfo(
  2457.     IN HCRYPTPROV hCryptProv,
  2458.     IN ALG_ID Algid,
  2459.     IN DWORD dwFlags,
  2460.     IN DWORD dwCertEncodingType,
  2461.     IN PCERT_PUBLIC_KEY_INFO pInfo,
  2462.     OUT BYTE *pbComputedHash,
  2463.     IN OUT DWORD *pcbComputedHash
  2464.     );
  2465. //+-------------------------------------------------------------------------
  2466. //  Convert a Name Value to a null terminated char string
  2467. //
  2468. //  Returns the number of characters converted including the terminating null
  2469. //  character. If psz is NULL or csz is 0, returns the required size of the
  2470. //  destination string (including the terminating null char).
  2471. //
  2472. //  If psz != NULL && csz != 0, returned psz is always NULL terminated.
  2473. //
  2474. //  Note: csz includes the NULL char.
  2475. //--------------------------------------------------------------------------
  2476. WINCRYPT32API
  2477. DWORD
  2478. WINAPI
  2479. CertRDNValueToStrA(
  2480.     IN DWORD dwValueType,
  2481.     IN PCERT_RDN_VALUE_BLOB pValue,
  2482.     OUT OPTIONAL LPSTR psz,
  2483.     IN DWORD csz
  2484.     );
  2485. //+-------------------------------------------------------------------------
  2486. //  Convert a Name Value to a null terminated char string
  2487. //
  2488. //  Returns the number of characters converted including the terminating null
  2489. //  character. If psz is NULL or csz is 0, returns the required size of the
  2490. //  destination string (including the terminating null char).
  2491. //
  2492. //  If psz != NULL && csz != 0, returned psz is always NULL terminated.
  2493. //
  2494. //  Note: csz includes the NULL char.
  2495. //--------------------------------------------------------------------------
  2496. WINCRYPT32API
  2497. DWORD
  2498. WINAPI
  2499. CertRDNValueToStrW(
  2500.     IN DWORD dwValueType,
  2501.     IN PCERT_RDN_VALUE_BLOB pValue,
  2502.     OUT OPTIONAL LPWSTR psz,
  2503.     IN DWORD csz
  2504.     );
  2505. #ifdef UNICODE
  2506. #define CertRDNValueToStr  CertRDNValueToStrW
  2507. #else
  2508. #define CertRDNValueToStr  CertRDNValueToStrA
  2509. #endif // !UNICODE
  2510. //+-------------------------------------------------------------------------
  2511. //  Convert the certificate name blob to a null terminated char string.
  2512. //
  2513. //  Follows the string representation of distinguished names specified in
  2514. //  RFC 1779. (Note, added double quoting "" for embedded quotes, quote
  2515. //  empty strings and don't quote strings containing consecutive spaces).
  2516. //  RDN values of type CERT_RDN_ENCODED_BLOB or CERT_RDN_OCTET_STRING are
  2517. //  formatted in hexadecimal (e.g. #0A56CF).
  2518. //
  2519. //  The name string is formatted according to the dwStrType:
  2520. //    CERT_SIMPLE_NAME_STR
  2521. //      The object identifiers are discarded. CERT_RDN entries are separated
  2522. //      by ", ". Multiple attributes per CERT_RDN are separated by " + ".
  2523. //      For example:
  2524. //          Microsoft, Joe Cool + Programmer
  2525. //    CERT_OID_NAME_STR
  2526. //      The object identifiers are included with a "=" separator from their
  2527. //      attribute value. CERT_RDN entries are separated by ", ".
  2528. //      Multiple attributes per CERT_RDN are separated by " + ". For example:
  2529. //          2.5.4.11=Microsoft, 2.5.4.3=Joe Cool + 2.5.4.12=Programmer
  2530. //    CERT_X500_NAME_STR
  2531. //      The object identifiers are converted to their X500 key name. Otherwise,
  2532. //      same as CERT_OID_NAME_STR. If the object identifier doesn't have
  2533. //      a corresponding X500 key name, then, the object identifier is used with
  2534. //      a "OID." prefix. For example:
  2535. //          OU=Microsoft, CN=Joe Cool + T=Programmer, OID.1.2.3.4.5.6=Unknown
  2536. //
  2537. //  We quote the RDN value if it contains leading or trailing whitespace
  2538. //  or one of the following characters: ",", "+", "=", """, "n",  "<", ">",
  2539. //  "#" or ";". The quoting character is ". If the the RDN Value contains
  2540. //  a " it is double quoted (""). For example:
  2541. //      OU="  Microsoft", CN="Joe ""Cool""" + T="Programmer, Manager"
  2542. //
  2543. //  CERT_NAME_STR_SEMICOLON_FLAG can be or'ed into dwStrType to replace
  2544. //  the ", " separator with a "; " separator.
  2545. //
  2546. //  CERT_NAME_STR_CRLF_FLAG can be or'ed into dwStrType to replace
  2547. //  the ", " separator with a "rn" separator.
  2548. //
  2549. //  CERT_NAME_STR_NO_PLUS_FLAG can be or'ed into dwStrType to replace the
  2550. //  " + " separator with a single space, " ".
  2551. //
  2552. //  CERT_NAME_STR_NO_QUOTING_FLAG can be or'ed into dwStrType to inhibit
  2553. //  the above quoting.
  2554. //
  2555. //  CERT_NAME_STR_REVERSE_FLAG can be or'ed into dwStrType to reverse the
  2556. //  order of the RDNs before converting to the string.
  2557. //
  2558. //  By default, CERT_RDN_T61_STRING encoded values are initially decoded
  2559. //  as UTF8. If the UTF8 decoding fails, then, decoded as 8 bit characters.
  2560. //  CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG can be or'ed into dwStrType to
  2561. //  skip the initial attempt to decode as UTF8.
  2562. //
  2563. //  Returns the number of characters converted including the terminating null
  2564. //  character. If psz is NULL or csz is 0, returns the required size of the
  2565. //  destination string (including the terminating null char).
  2566. //
  2567. //  If psz != NULL && csz != 0, returned psz is always NULL terminated.
  2568. //
  2569. //  Note: csz includes the NULL char.
  2570. //--------------------------------------------------------------------------
  2571. //+-------------------------------------------------------------------------
  2572. //--------------------------------------------------------------------------
  2573. WINCRYPT32API
  2574. DWORD
  2575. WINAPI
  2576. CertNameToStrA(
  2577.     IN DWORD dwCertEncodingType,
  2578.     IN PCERT_NAME_BLOB pName,
  2579.     IN DWORD dwStrType,
  2580.     OUT OPTIONAL LPSTR psz,
  2581.     IN DWORD csz
  2582.     );
  2583. //+-------------------------------------------------------------------------
  2584. //--------------------------------------------------------------------------
  2585. WINCRYPT32API
  2586. DWORD
  2587. WINAPI
  2588. CertNameToStrW(
  2589.     IN DWORD dwCertEncodingType,
  2590.     IN PCERT_NAME_BLOB pName,
  2591.     IN DWORD dwStrType,
  2592.     OUT OPTIONAL LPWSTR psz,
  2593.     IN DWORD csz
  2594.     );
  2595. #ifdef UNICODE
  2596. #define CertNameToStr  CertNameToStrW
  2597. #else
  2598. #define CertNameToStr  CertNameToStrA
  2599. #endif // !UNICODE
  2600. //+-------------------------------------------------------------------------
  2601. //  Certificate name string types
  2602. //--------------------------------------------------------------------------
  2603. #define CERT_SIMPLE_NAME_STR        1
  2604. #define CERT_OID_NAME_STR           2
  2605. #define CERT_X500_NAME_STR          3
  2606. //+-------------------------------------------------------------------------
  2607. //  Certificate name string type flags OR'ed with the above types
  2608. //--------------------------------------------------------------------------
  2609. #define CERT_NAME_STR_SEMICOLON_FLAG    0x40000000
  2610. #define CERT_NAME_STR_NO_PLUS_FLAG      0x20000000
  2611. #define CERT_NAME_STR_NO_QUOTING_FLAG   0x10000000
  2612. #define CERT_NAME_STR_CRLF_FLAG         0x08000000
  2613. #define CERT_NAME_STR_COMMA_FLAG        0x04000000
  2614. #define CERT_NAME_STR_REVERSE_FLAG      0x02000000
  2615. #define CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG     0x00010000
  2616. #define CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG   0x00020000
  2617. #define CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG  0x00040000
  2618. //+-------------------------------------------------------------------------
  2619. //  Convert the null terminated X500 string to an encoded certificate name.
  2620. //
  2621. //  The input string is expected to be formatted the same as the output
  2622. //  from the above CertNameToStr API.
  2623. //
  2624. //  The CERT_SIMPLE_NAME_STR type isn't supported. Otherwise, when dwStrType
  2625. //  is set to 0, CERT_OID_NAME_STR or CERT_X500_NAME_STR, allow either a
  2626. //  case insensitive X500 key (CN=), case insensitive "OID." prefixed
  2627. //  object identifier (OID.1.2.3.4.5.6=) or an object identifier (1.2.3.4=).
  2628. //
  2629. //  If no flags are OR'ed into dwStrType, then, allow "," or ";" as RDN
  2630. //  separators and "+" as the multiple RDN value separator. Quoting is
  2631. //  supported. A quote may be included in a quoted value by double quoting,
  2632. //  for example (CN="Joe ""Cool"""). A value starting with a "#" is treated
  2633. //  as ascii hex and converted to a CERT_RDN_OCTET_STRING. Embedded whitespace
  2634. //  is skipped (1.2.3 = # AB CD 01  is the same as 1.2.3=#ABCD01).
  2635. //
  2636. //  Whitespace surrounding the keys, object identifers and values is removed.
  2637. //
  2638. //  CERT_NAME_STR_COMMA_FLAG can be or'ed into dwStrType to only allow the
  2639. //  "," as the RDN separator.
  2640. //
  2641. //  CERT_NAME_STR_SEMICOLON_FLAG can be or'ed into dwStrType to only allow the
  2642. //  ";" as the RDN separator.
  2643. //
  2644. //  CERT_NAME_STR_CRLF_FLAG can be or'ed into dwStrType to only allow
  2645. //  "r" or "n" as the RDN separator.
  2646. //
  2647. //  CERT_NAME_STR_NO_PLUS_FLAG can be or'ed into dwStrType to ignore "+"
  2648. //  as a separator and not allow multiple values per RDN.
  2649. //
  2650. //  CERT_NAME_STR_NO_QUOTING_FLAG can be or'ed into dwStrType to inhibit
  2651. //  quoting.
  2652. //
  2653. //  CERT_NAME_STR_REVERSE_FLAG can be or'ed into dwStrType to reverse the
  2654. //  order of the RDNs after converting from the string and before encoding.
  2655. //
  2656. //  CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG can be or'ed into dwStrType to
  2657. //  to select the CERT_RDN_T61_STRING encoded value type instead of
  2658. //  CERT_RDN_UNICODE_STRING if all the UNICODE characters are <= 0xFF.
  2659. //
  2660. //  CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG can be or'ed into dwStrType to
  2661. //  to select the CERT_RDN_UTF8_STRING encoded value type instead of
  2662. //  CERT_RDN_UNICODE_STRING.
  2663. //
  2664. //  Support the following X500 Keys:
  2665. //
  2666. //  Key         Object Identifier               RDN Value Type(s)
  2667. //  ---         -----------------               -----------------
  2668. //  CN          szOID_COMMON_NAME               Printable, Unicode
  2669. //  L           szOID_LOCALITY_NAME             Printable, Unicode
  2670. //  O           szOID_ORGANIZATION_NAME         Printable, Unicode
  2671. //  OU          szOID_ORGANIZATIONAL_UNIT_NAME  Printable, Unicode
  2672. //  E           szOID_RSA_emailAddr             Only IA5
  2673. //  Email       szOID_RSA_emailAddr             Only IA5
  2674. //  C           szOID_COUNTRY_NAME              Only Printable
  2675. //  S           szOID_STATE_OR_PROVINCE_NAME    Printable, Unicode
  2676. //  ST          szOID_STATE_OR_PROVINCE_NAME    Printable, Unicode
  2677. //  STREET      szOID_STREET_ADDRESS            Printable, Unicode
  2678. //  T           szOID_TITLE                     Printable, Unicode
  2679. //  Title       szOID_TITLE                     Printable, Unicode
  2680. //  G           szOID_GIVEN_NAME                Printable, Unicode
  2681. //  GivenName   szOID_GIVEN_NAME                Printable, Unicode
  2682. //  I           szOID_INITIALS                  Printable, Unicode
  2683. //  Initials    szOID_INITIALS                  Printable, Unicode
  2684. //  SN          szOID_SUR_NAME                  Printable, Unicode
  2685. //  DC          szOID_DOMAIN_COMPONENT          IA5, UTF8
  2686. //
  2687. //  Note, T61 is selected instead of Unicode if
  2688. //  CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG is set and all the unicode
  2689. //  characters are <= 0xFF.
  2690. //
  2691. //  Note, UTF8 is selected instead of Unicode if
  2692. //  CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG is set.
  2693. //
  2694. //  Returns TRUE if successfully parsed the input string and encoded
  2695. //  the name.
  2696. //
  2697. //  If the input string is detected to be invalid, *ppszError is updated
  2698. //  to point to the beginning of the invalid character sequence. Otherwise,
  2699. //  *ppszError is set to NULL. *ppszError is updated with a non-NULL pointer
  2700. //  for the following errors:
  2701. //      CRYPT_E_INVALID_X500_STRING
  2702. //      CRYPT_E_INVALID_NUMERIC_STRING
  2703. //      CRYPT_E_INVALID_PRINTABLE_STRING
  2704. //      CRYPT_E_INVALID_IA5_STRING
  2705. //
  2706. //  ppszError can be set to NULL if not interested in getting a pointer
  2707. //  to the invalid character sequence.
  2708. //--------------------------------------------------------------------------
  2709. //+-------------------------------------------------------------------------
  2710. //--------------------------------------------------------------------------
  2711. WINCRYPT32API
  2712. BOOL
  2713. WINAPI
  2714. CertStrToNameA(
  2715.     IN DWORD dwCertEncodingType,
  2716.     IN LPCSTR pszX500,
  2717.     IN DWORD dwStrType,
  2718.     IN OPTIONAL void *pvReserved,
  2719.     OUT BYTE *pbEncoded,
  2720.     IN OUT DWORD *pcbEncoded,
  2721.     OUT OPTIONAL LPCSTR *ppszError
  2722.     );
  2723. //+-------------------------------------------------------------------------
  2724. //--------------------------------------------------------------------------
  2725. WINCRYPT32API
  2726. BOOL
  2727. WINAPI
  2728. CertStrToNameW(
  2729.     IN DWORD dwCertEncodingType,
  2730.     IN LPCWSTR pszX500,
  2731.     IN DWORD dwStrType,
  2732.     IN OPTIONAL void *pvReserved,
  2733.     OUT BYTE *pbEncoded,
  2734.     IN OUT DWORD *pcbEncoded,
  2735.     OUT OPTIONAL LPCWSTR *ppszError
  2736.     );
  2737. #ifdef UNICODE
  2738. #define CertStrToName  CertStrToNameW
  2739. #else
  2740. #define CertStrToName  CertStrToNameA
  2741. #endif // !UNICODE
  2742. //+-------------------------------------------------------------------------
  2743. //  Get the subject or issuer name from the certificate and
  2744. //  according to the specified format type, convert to a null terminated
  2745. //  character string.
  2746. //
  2747. //  CERT_NAME_ISSUER_FLAG can be set to get the issuer's name. Otherwise,
  2748. //  gets the subject's name.
  2749. //
  2750. //  By default, CERT_RDN_T61_STRING encoded values are initially decoded
  2751. //  as UTF8. If the UTF8 decoding fails, then, decoded as 8 bit characters.
  2752. //  CERT_NAME_DISABLE_IE4_UTF8_FLAG can be set in dwFlags to
  2753. //  skip the initial attempt to decode as UTF8.
  2754. //
  2755. //  The name string is formatted according to the dwType:
  2756. //    CERT_NAME_EMAIL_TYPE
  2757. //      If the certificate has a Subject Alternative Name extension (for
  2758. //      issuer, Issuer Alternative Name), searches for first rfc822Name choice.
  2759. //      If the rfc822Name choice isn't found in the extension, searches the
  2760. //      Subject Name field for the Email OID, "1.2.840.113549.1.9.1".
  2761. //      If the rfc822Name or Email OID is found, returns the string. Otherwise,
  2762. //      returns an empty string (returned character count is 1).
  2763. //    CERT_NAME_DNS_TYPE
  2764. //      If the certificate has a Subject Alternative Name extension (for
  2765. //      issuer, Issuer Alternative Name), searches for first DNSName choice.
  2766. //      If the DNSName choice isn't found in the extension, searches the
  2767. //      Subject Name field for the CN OID, "2.5.4.3".
  2768. //      If the DNSName or CN OID is found, returns the string. Otherwise,
  2769. //      returns an empty string.
  2770. //    CERT_NAME_URL_TYPE
  2771. //      If the certificate has a Subject Alternative Name extension (for
  2772. //      issuer, Issuer Alternative Name), searches for first URL choice.
  2773. //      If the URL choice is found, returns the string. Otherwise,
  2774. //      returns an empty string.
  2775. //    CERT_NAME_UPN_TYPE
  2776. //      If the certificate has a Subject Alternative Name extension,
  2777. //      searches the OtherName choices looking for a
  2778. //      pszObjId == szOID_NT_PRINCIPAL_NAME, "1.3.6.1.4.1.311.20.2.3".
  2779. //      If the UPN OID is found, the blob is decoded as a
  2780. //      X509_UNICODE_ANY_STRING and the decoded string is returned.
  2781. //      Otherwise, returns an empty string.
  2782. //    CERT_NAME_RDN_TYPE
  2783. //      Converts the Subject Name blob by calling CertNameToStr. pvTypePara
  2784. //      points to a DWORD containing the dwStrType passed to CertNameToStr.
  2785. //      If the Subject Name field is empty and the certificate has a
  2786. //      Subject Alternative Name extension, searches for and converts
  2787. //      the first directoryName choice.
  2788. //    CERT_NAME_ATTR_TYPE
  2789. //      pvTypePara points to the Object Identifier specifying the name attribute
  2790. //      to be returned. For example, to get the CN,
  2791. //      pvTypePara = szOID_COMMON_NAME ("2.5.4.3"). Searches, the Subject Name
  2792. //      field for the attribute.
  2793. //      If the Subject Name field is empty and the certificate has a
  2794. //      Subject Alternative Name extension, checks for
  2795. //      the first directoryName choice and searches it.
  2796. //
  2797. //      Note, searches the RDNs in reverse order.
  2798. //
  2799. //    CERT_NAME_SIMPLE_DISPLAY_TYPE
  2800. //      Iterates through the following list of name attributes and searches
  2801. //      the Subject Name and then the Subject Alternative Name extension
  2802. //      for the first occurrence of:
  2803. //          szOID_COMMON_NAME ("2.5.4.3")
  2804. //          szOID_ORGANIZATIONAL_UNIT_NAME ("2.5.4.11")
  2805. //          szOID_ORGANIZATION_NAME ("2.5.4.10")
  2806. //          szOID_RSA_emailAddr ("1.2.840.113549.1.9.1")
  2807. //
  2808. //      If none of the above attributes is found, then, searches the
  2809. //      Subject Alternative Name extension for a rfc822Name choice.
  2810. //
  2811. //      If still no match, then, returns the first attribute.
  2812. //
  2813. //      Note, like CERT_NAME_ATTR_TYPE, searches the RDNs in reverse order.
  2814. //
  2815. //    CERT_NAME_FRIENDLY_DISPLAY_TYPE
  2816. //      First checks if the certificate has a CERT_FRIENDLY_NAME_PROP_ID
  2817. //      property. If it does, then, this property is returned. Otherwise,
  2818. //      returns the above CERT_NAME_SIMPLE_DISPLAY_TYPE.
  2819. //
  2820. //  Returns the number of characters converted including the terminating null
  2821. //  character. If pwszNameString is NULL or cchNameString is 0, returns the
  2822. //  required size of the destination string (including the terminating null
  2823. //  char). If the specified name type isn't found. returns an empty string
  2824. //  with a returned character count of 1.
  2825. //
  2826. //  If pwszNameString != NULL && cwszNameString != 0, returned pwszNameString
  2827. //  is always NULL terminated.
  2828. //
  2829. //  Note: cchNameString includes the NULL char.
  2830. //--------------------------------------------------------------------------
  2831. //+-------------------------------------------------------------------------
  2832. //--------------------------------------------------------------------------
  2833. WINCRYPT32API
  2834. DWORD
  2835. WINAPI
  2836. CertGetNameStringA(
  2837.     IN PCCERT_CONTEXT pCertContext,
  2838.     IN DWORD dwType,
  2839.     IN DWORD dwFlags,
  2840.     IN void *pvTypePara,
  2841.     OUT OPTIONAL LPSTR pszNameString,
  2842.     IN DWORD cchNameString
  2843.     );
  2844. //+-------------------------------------------------------------------------
  2845. //--------------------------------------------------------------------------
  2846. WINCRYPT32API
  2847. DWORD
  2848. WINAPI
  2849. CertGetNameStringW(
  2850.     IN PCCERT_CONTEXT pCertContext,
  2851.     IN DWORD dwType,
  2852.     IN DWORD dwFlags,
  2853.     IN void *pvTypePara,
  2854.     OUT OPTIONAL LPWSTR pszNameString,
  2855.     IN DWORD cchNameString
  2856.     );
  2857. #ifdef UNICODE
  2858. #define CertGetNameString  CertGetNameStringW
  2859. #else
  2860. #define CertGetNameString  CertGetNameStringA
  2861. #endif // !UNICODE
  2862. //+-------------------------------------------------------------------------
  2863. //  Certificate name types
  2864. //--------------------------------------------------------------------------
  2865. #define CERT_NAME_EMAIL_TYPE            1
  2866. #define CERT_NAME_RDN_TYPE              2
  2867. #define CERT_NAME_ATTR_TYPE             3
  2868. #define CERT_NAME_SIMPLE_DISPLAY_TYPE   4
  2869. #define CERT_NAME_FRIENDLY_DISPLAY_TYPE 5
  2870. #define CERT_NAME_DNS_TYPE              6
  2871. #define CERT_NAME_URL_TYPE              7
  2872. #define CERT_NAME_UPN_TYPE              8
  2873. //+-------------------------------------------------------------------------
  2874. //  Certificate name flags
  2875. //--------------------------------------------------------------------------
  2876. #define CERT_NAME_ISSUER_FLAG           0x1
  2877. #define CERT_NAME_DISABLE_IE4_UTF8_FLAG 0x00010000
  2878. //+=========================================================================
  2879. //  Simplified Cryptographic Message Data Structures and APIs
  2880. //==========================================================================
  2881. //+-------------------------------------------------------------------------
  2882. //              Conventions for the *pb and *pcb output parameters:
  2883. //
  2884. //              Upon entry to the function:
  2885. //                  if pcb is OPTIONAL && pcb == NULL, then,
  2886. //                      No output is returned
  2887. //                  else if pb == NULL && pcb != NULL, then,
  2888. //                      Length only determination. No length error is
  2889. //                      returned.
  2890. //                  otherwise where (pb != NULL && pcb != NULL && *pcb != 0)
  2891. //                      Output is returned. If *pcb isn't big enough a
  2892. //                      length error is returned. In all cases *pcb is updated
  2893. //                      with the actual length needed/returned.
  2894. //--------------------------------------------------------------------------
  2895. //+-------------------------------------------------------------------------
  2896. //  Type definitions of the parameters used for doing the cryptographic
  2897. //  operations.
  2898. //--------------------------------------------------------------------------
  2899. //+-------------------------------------------------------------------------
  2900. //  Callback to get and verify the signer's certificate.
  2901. //
  2902. //  Passed the CertId of the signer (its Issuer and SerialNumber) and a
  2903. //  handle to its cryptographic signed message's cert store.
  2904. //
  2905. //  For CRYPT_E_NO_SIGNER, called with pSignerId == NULL.
  2906. //
  2907. //  For a valid signer certificate, returns a pointer to a read only
  2908. //  CERT_CONTEXT. The returned CERT_CONTEXT is either obtained from a
  2909. //  cert store or was created via CertCreateCertificateContext. For either case,
  2910. //  its freed via CertFreeCertificateContext.
  2911. //
  2912. //  If a valid certificate isn't found, this callback returns NULL with
  2913. //  LastError set via SetLastError().
  2914. //
  2915. //  The NULL implementation tries to get the Signer certificate from the
  2916. //  message cert store. It doesn't verify the certificate.
  2917. //
  2918. //  Note, if the KEYID choice was selected for a CMS SignerId, then, the
  2919. //  SerialNumber is 0 and the Issuer is encoded containing a single RDN with a
  2920. //  single Attribute whose OID is szOID_KEYID_RDN, value type is
  2921. //  CERT_RDN_OCTET_STRING and value is the KEYID. When the
  2922. //  CertGetSubjectCertificateFromStore and
  2923. //  CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
  2924. //  special KEYID Issuer and SerialNumber, they do a KEYID match.
  2925. //--------------------------------------------------------------------------
  2926. typedef PCCERT_CONTEXT (WINAPI *PFN_CRYPT_GET_SIGNER_CERTIFICATE)(
  2927.     IN void *pvGetArg,
  2928.     IN DWORD dwCertEncodingType,
  2929.     IN PCERT_INFO pSignerId,    // Only the Issuer and SerialNumber
  2930.                                 // fields have been updated
  2931.     IN HCERTSTORE hMsgCertStore
  2932.     );
  2933. //+-------------------------------------------------------------------------
  2934. //  The CRYPT_SIGN_MESSAGE_PARA are used for signing messages using the
  2935. //  specified signing certificate context.
  2936. //
  2937. //  Either the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID must
  2938. //  be set for each rgpSigningCert[]. Either one specifies the private
  2939. //  signature key to use.
  2940. //
  2941. //  If any certificates and/or CRLs are to be included in the signed message,
  2942. //  then, the MsgCert and MsgCrl parameters need to be updated. If the
  2943. //  rgpSigningCerts are to be included, then, they must also be in the
  2944. //  rgpMsgCert array.
  2945. //