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

模拟服务器

开发平台:

C/C++

  1.     BOOL                        fInhibitPolicyMapping;
  2.     DWORD                       dwInhibitPolicyMappingSkipCerts;
  3. } CERT_POLICY_CONSTRAINTS_INFO, *PCERT_POLICY_CONSTRAINTS_INFO;
  4. //+-------------------------------------------------------------------------
  5. //  RSA_CSP_PUBLICKEYBLOB
  6. //
  7. //  pvStructInfo points to a PUBLICKEYSTRUC immediately followed by a
  8. //  RSAPUBKEY and the modulus bytes.
  9. //
  10. //  CryptExportKey outputs the above StructInfo for a dwBlobType of
  11. //  PUBLICKEYBLOB. CryptImportKey expects the above StructInfo when
  12. //  importing a public key.
  13. //
  14. //  For dwCertEncodingType = X509_ASN_ENCODING, the RSA_CSP_PUBLICKEYBLOB is
  15. //  encoded as a PKCS #1 RSAPublicKey consisting of a SEQUENCE of a
  16. //  modulus INTEGER and a publicExponent INTEGER. The modulus is encoded
  17. //  as being a unsigned integer. When decoded, if the modulus was encoded
  18. //  as unsigned integer with a leading 0 byte, the 0 byte is removed before
  19. //  converting to the CSP modulus bytes.
  20. //
  21. //  For decode, the aiKeyAlg field of PUBLICKEYSTRUC is always set to
  22. //  CALG_RSA_KEYX.
  23. //--------------------------------------------------------------------------
  24. //+-------------------------------------------------------------------------
  25. //  X509_KEYGEN_REQUEST_TO_BE_SIGNED
  26. //
  27. //  pvStructInfo points to CERT_KEYGEN_REQUEST_INFO.
  28. //
  29. //  For CryptDecodeObject(), the pbEncoded is the "to be signed" plus its
  30. //  signature (output of a X509_CERT CryptEncodeObject()).
  31. //
  32. //  For CryptEncodeObject(), the pbEncoded is just the "to be signed".
  33. //--------------------------------------------------------------------------
  34. //+-------------------------------------------------------------------------
  35. //  PKCS_ATTRIBUTE data structure
  36. //
  37. //  pvStructInfo points to a CRYPT_ATTRIBUTE.
  38. //--------------------------------------------------------------------------
  39. //+-------------------------------------------------------------------------
  40. //  PKCS_ATTRIBUTES data structure
  41. //
  42. //  pvStructInfo points to a CRYPT_ATTRIBUTES.
  43. //--------------------------------------------------------------------------
  44. //+-------------------------------------------------------------------------
  45. //  PKCS_CONTENT_INFO_SEQUENCE_OF_ANY data structure
  46. //
  47. //  pvStructInfo points to following CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY.
  48. //
  49. //  For X509_ASN_ENCODING: encoded as a PKCS#7 ContentInfo structure wrapping
  50. //  a sequence of ANY. The value of the contentType field is pszObjId,
  51. //  while the content field is the following structure:
  52. //      SequenceOfAny ::= SEQUENCE OF ANY
  53. //
  54. //  The CRYPT_DER_BLOBs point to the already encoded ANY content.
  55. //--------------------------------------------------------------------------
  56. typedef struct _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY {
  57.     LPSTR               pszObjId;
  58.     DWORD               cValue;
  59.     PCRYPT_DER_BLOB     rgValue;
  60. } CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY, *PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANY;
  61. //+-------------------------------------------------------------------------
  62. //  PKCS_CONTENT_INFO data structure
  63. //
  64. //  pvStructInfo points to following CRYPT_CONTENT_INFO.
  65. //
  66. //  For X509_ASN_ENCODING: encoded as a PKCS#7 ContentInfo structure.
  67. //  The CRYPT_DER_BLOB points to the already encoded ANY content.
  68. //--------------------------------------------------------------------------
  69. typedef struct _CRYPT_CONTENT_INFO {
  70.     LPSTR               pszObjId;
  71.     CRYPT_DER_BLOB      Content;
  72. } CRYPT_CONTENT_INFO, *PCRYPT_CONTENT_INFO;
  73. //+-------------------------------------------------------------------------
  74. //  X509_OCTET_STRING data structure
  75. //
  76. //  pvStructInfo points to a CRYPT_DATA_BLOB.
  77. //--------------------------------------------------------------------------
  78. //+-------------------------------------------------------------------------
  79. //  X509_BITS data structure
  80. //
  81. //  pvStructInfo points to a CRYPT_BIT_BLOB.
  82. //--------------------------------------------------------------------------
  83. //+-------------------------------------------------------------------------
  84. //  X509_BITS_WITHOUT_TRAILING_ZEROES data structure
  85. //
  86. //  pvStructInfo points to a CRYPT_BIT_BLOB.
  87. //
  88. //  The same as X509_BITS, except before encoding, the bit length is
  89. //  decremented to exclude trailing zero bits.
  90. //--------------------------------------------------------------------------
  91. //+-------------------------------------------------------------------------
  92. //  X509_INTEGER data structure
  93. //
  94. //  pvStructInfo points to an int.
  95. //--------------------------------------------------------------------------
  96. //+-------------------------------------------------------------------------
  97. //  X509_MULTI_BYTE_INTEGER data structure
  98. //
  99. //  pvStructInfo points to a CRYPT_INTEGER_BLOB.
  100. //--------------------------------------------------------------------------
  101. //+-------------------------------------------------------------------------
  102. //  X509_ENUMERATED data structure
  103. //
  104. //  pvStructInfo points to an int containing the enumerated value
  105. //--------------------------------------------------------------------------
  106. //+-------------------------------------------------------------------------
  107. //  X509_CHOICE_OF_TIME data structure
  108. //
  109. //  pvStructInfo points to a FILETIME.
  110. //--------------------------------------------------------------------------
  111. //+-------------------------------------------------------------------------
  112. //  X509_SEQUENCE_OF_ANY data structure
  113. //
  114. //  pvStructInfo points to following CRYPT_SEQUENCE_OF_ANY.
  115. //
  116. //  The CRYPT_DER_BLOBs point to the already encoded ANY content.
  117. //--------------------------------------------------------------------------
  118. typedef struct _CRYPT_SEQUENCE_OF_ANY {
  119.     DWORD               cValue;
  120.     PCRYPT_DER_BLOB     rgValue;
  121. } CRYPT_SEQUENCE_OF_ANY, *PCRYPT_SEQUENCE_OF_ANY;
  122. //+-------------------------------------------------------------------------
  123. //  X509_AUTHORITY_KEY_ID2
  124. //  szOID_AUTHORITY_KEY_IDENTIFIER2
  125. //
  126. //  pvStructInfo points to following CERT_AUTHORITY_KEY_ID2_INFO.
  127. //
  128. //  For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
  129. //  *pcbEncoded by CryptEncodeObject(X509_AUTHORITY_KEY_ID2)
  130. //
  131. //  See X509_ALTERNATE_NAME for error location defines.
  132. //--------------------------------------------------------------------------
  133. typedef struct _CERT_AUTHORITY_KEY_ID2_INFO {
  134.     CRYPT_DATA_BLOB     KeyId;
  135.     CERT_ALT_NAME_INFO  AuthorityCertIssuer;    // Optional, set cAltEntry
  136.                                                 // to 0 to omit.
  137.     CRYPT_INTEGER_BLOB  AuthorityCertSerialNumber;
  138. } CERT_AUTHORITY_KEY_ID2_INFO, *PCERT_AUTHORITY_KEY_ID2_INFO;
  139. //+-------------------------------------------------------------------------
  140. //  szOID_SUBJECT_KEY_IDENTIFIER
  141. //
  142. //  pvStructInfo points to a CRYPT_DATA_BLOB.
  143. //--------------------------------------------------------------------------
  144. //+-------------------------------------------------------------------------
  145. //  X509_AUTHORITY_INFO_ACCESS
  146. //  szOID_AUTHORITY_INFO_ACCESS
  147. //
  148. //  pvStructInfo points to following CERT_AUTHORITY_INFO_ACCESS.
  149. //
  150. //  For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
  151. //  *pcbEncoded by CryptEncodeObject(X509_AUTHORITY_INFO_ACCESS)
  152. //
  153. //  Error location consists of:
  154. //    ENTRY_INDEX   - 8 bits << 16
  155. //    VALUE_INDEX   - 16 bits (unicode character index)
  156. //
  157. //  See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location
  158. //  defines.
  159. //--------------------------------------------------------------------------
  160. typedef struct _CERT_ACCESS_DESCRIPTION {
  161.     LPSTR               pszAccessMethod;        // pszObjId
  162.     CERT_ALT_NAME_ENTRY AccessLocation;
  163. } CERT_ACCESS_DESCRIPTION, *PCERT_ACCESS_DESCRIPTION;
  164. typedef struct _CERT_AUTHORITY_INFO_ACCESS {
  165.     DWORD                       cAccDescr;
  166.     PCERT_ACCESS_DESCRIPTION    rgAccDescr;
  167. } CERT_AUTHORITY_INFO_ACCESS, *PCERT_AUTHORITY_INFO_ACCESS;
  168. //+-------------------------------------------------------------------------
  169. //  PKIX Access Description: Access Method Object Identifiers
  170. //--------------------------------------------------------------------------
  171. #define szOID_PKIX_ACC_DESCR            "1.3.6.1.5.5.7.48"
  172. #define szOID_PKIX_OCSP                 "1.3.6.1.5.5.7.48.1"
  173. #define szOID_PKIX_CA_ISSUERS           "1.3.6.1.5.5.7.48.2"
  174. //+-------------------------------------------------------------------------
  175. //  X509_CRL_REASON_CODE
  176. //  szOID_CRL_REASON_CODE
  177. //
  178. //  pvStructInfo points to an int which can be set to one of the following
  179. //  enumerated values:
  180. //--------------------------------------------------------------------------
  181. #define CRL_REASON_UNSPECIFIED              0
  182. #define CRL_REASON_KEY_COMPROMISE           1
  183. #define CRL_REASON_CA_COMPROMISE            2
  184. #define CRL_REASON_AFFILIATION_CHANGED      3
  185. #define CRL_REASON_SUPERSEDED               4
  186. #define CRL_REASON_CESSATION_OF_OPERATION   5
  187. #define CRL_REASON_CERTIFICATE_HOLD         6
  188. #define CRL_REASON_REMOVE_FROM_CRL          8
  189. //+-------------------------------------------------------------------------
  190. //  X509_CRL_DIST_POINTS
  191. //  szOID_CRL_DIST_POINTS
  192. //
  193. //  pvStructInfo points to following CRL_DIST_POINTS_INFO.
  194. //
  195. //  For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
  196. //  *pcbEncoded by CryptEncodeObject(X509_CRL_DIST_POINTS)
  197. //
  198. //  Error location consists of:
  199. //    CRL_ISSUER_BIT    - 1 bit  << 31 (0 for FullName, 1 for CRLIssuer)
  200. //    POINT_INDEX       - 7 bits << 24
  201. //    ENTRY_INDEX       - 8 bits << 16
  202. //    VALUE_INDEX       - 16 bits (unicode character index)
  203. //
  204. //  See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location
  205. //  defines.
  206. //--------------------------------------------------------------------------
  207. typedef struct _CRL_DIST_POINT_NAME {
  208.     DWORD   dwDistPointNameChoice;
  209.     union {
  210.         CERT_ALT_NAME_INFO      FullName;       // 1
  211.         // Not implemented      IssuerRDN;      // 2
  212.     };
  213. } CRL_DIST_POINT_NAME, *PCRL_DIST_POINT_NAME;
  214. #define CRL_DIST_POINT_NO_NAME          0
  215. #define CRL_DIST_POINT_FULL_NAME        1
  216. #define CRL_DIST_POINT_ISSUER_RDN_NAME  2
  217. typedef struct _CRL_DIST_POINT {
  218.     CRL_DIST_POINT_NAME     DistPointName;      // OPTIONAL
  219.     CRYPT_BIT_BLOB          ReasonFlags;        // OPTIONAL
  220.     CERT_ALT_NAME_INFO      CRLIssuer;          // OPTIONAL
  221. } CRL_DIST_POINT, *PCRL_DIST_POINT;
  222. #define CRL_REASON_UNUSED_FLAG                  0x80
  223. #define CRL_REASON_KEY_COMPROMISE_FLAG          0x40
  224. #define CRL_REASON_CA_COMPROMISE_FLAG           0x20
  225. #define CRL_REASON_AFFILIATION_CHANGED_FLAG     0x10
  226. #define CRL_REASON_SUPERSEDED_FLAG              0x08
  227. #define CRL_REASON_CESSATION_OF_OPERATION_FLAG  0x04
  228. #define CRL_REASON_CERTIFICATE_HOLD_FLAG        0x02
  229. typedef struct _CRL_DIST_POINTS_INFO {
  230.     DWORD                   cDistPoint;
  231.     PCRL_DIST_POINT         rgDistPoint;
  232. } CRL_DIST_POINTS_INFO, *PCRL_DIST_POINTS_INFO;
  233. #define CRL_DIST_POINT_ERR_INDEX_MASK          0x7F
  234. #define CRL_DIST_POINT_ERR_INDEX_SHIFT         24
  235. #define GET_CRL_DIST_POINT_ERR_INDEX(X)   
  236.     ((X >> CRL_DIST_POINT_ERR_INDEX_SHIFT) & CRL_DIST_POINT_ERR_INDEX_MASK)
  237. #define CRL_DIST_POINT_ERR_CRL_ISSUER_BIT      0x80000000L
  238. #define IS_CRL_DIST_POINT_ERR_CRL_ISSUER(X)   
  239.     (0 != (X & CRL_DIST_POINT_ERR_CRL_ISSUER_BIT))
  240. //+-------------------------------------------------------------------------
  241. //  X509_CROSS_CERT_DIST_POINTS
  242. //  szOID_CROSS_CERT_DIST_POINTS
  243. //
  244. //  pvStructInfo points to following CROSS_CERT_DIST_POINTS_INFO.
  245. //
  246. //  For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
  247. //  *pcbEncoded by CryptEncodeObject(X509_CRL_DIST_POINTS)
  248. //
  249. //  Error location consists of:
  250. //    POINT_INDEX       - 8 bits << 24
  251. //    ENTRY_INDEX       - 8 bits << 16
  252. //    VALUE_INDEX       - 16 bits (unicode character index)
  253. //
  254. //  See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location
  255. //  defines.
  256. //--------------------------------------------------------------------------
  257. typedef struct _CROSS_CERT_DIST_POINTS_INFO {
  258.     // Seconds between syncs. 0 implies use client default.
  259.     DWORD                   dwSyncDeltaTime;
  260.     DWORD                   cDistPoint;
  261.     PCERT_ALT_NAME_INFO     rgDistPoint;
  262. } CROSS_CERT_DIST_POINTS_INFO, *PCROSS_CERT_DIST_POINTS_INFO;
  263. #define CROSS_CERT_DIST_POINT_ERR_INDEX_MASK   0xFF
  264. #define CROSS_CERT_DIST_POINT_ERR_INDEX_SHIFT  24
  265. #define GET_CROSS_CERT_DIST_POINT_ERR_INDEX(X)   
  266.     ((X >> CROSS_CERT_DIST_POINT_ERR_INDEX_SHIFT) & 
  267.                 CROSS_CERT_DIST_POINT_ERR_INDEX_MASK)
  268. //+-------------------------------------------------------------------------
  269. //  X509_ENHANCED_KEY_USAGE
  270. //  szOID_ENHANCED_KEY_USAGE
  271. //
  272. //  pvStructInfo points to a CERT_ENHKEY_USAGE, CTL_USAGE.
  273. //--------------------------------------------------------------------------
  274. //+-------------------------------------------------------------------------
  275. //  X509_CERT_PAIR
  276. //
  277. //  pvStructInfo points to the following CERT_PAIR.
  278. //--------------------------------------------------------------------------
  279. typedef struct _CERT_PAIR {
  280.    CERT_BLOB    Forward;        // OPTIONAL, if Forward.cbData == 0, omitted
  281.    CERT_BLOB    Reverse;        // OPTIONAL, if Reverse.cbData == 0, omitted
  282. } CERT_PAIR, *PCERT_PAIR;
  283. //+-------------------------------------------------------------------------
  284. //  szOID_CRL_NUMBER
  285. //
  286. //  pvStructInfo points to an int.
  287. //--------------------------------------------------------------------------
  288. //+-------------------------------------------------------------------------
  289. //  szOID_DELTA_CRL_INDICATOR
  290. //
  291. //  pvStructInfo points to an int.
  292. //--------------------------------------------------------------------------
  293. //+-------------------------------------------------------------------------
  294. //  szOID_ISSUING_DIST_POINT
  295. //  X509_ISSUING_DIST_POINT
  296. //
  297. //  pvStructInfo points to the following CRL_ISSUING_DIST_POINT.
  298. //
  299. //  For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
  300. //  *pcbEncoded by CryptEncodeObject(X509_ISSUING_DIST_POINT)
  301. //
  302. //  Error location consists of:
  303. //    ENTRY_INDEX       - 8 bits << 16
  304. //    VALUE_INDEX       - 16 bits (unicode character index)
  305. //
  306. //  See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location
  307. //  defines.
  308. //--------------------------------------------------------------------------
  309. typedef struct _CRL_ISSUING_DIST_POINT {
  310.     CRL_DIST_POINT_NAME     DistPointName;              // OPTIONAL
  311.     BOOL                    fOnlyContainsUserCerts;
  312.     BOOL                    fOnlyContainsCACerts;
  313.     CRYPT_BIT_BLOB          OnlySomeReasonFlags;        // OPTIONAL
  314.     BOOL                    fIndirectCRL;
  315. } CRL_ISSUING_DIST_POINT, *PCRL_ISSUING_DIST_POINT;
  316. //+-------------------------------------------------------------------------
  317. //  szOID_FRESHEST_CRL
  318. //
  319. //  pvStructInfo points to CRL_DIST_POINTS_INFO.
  320. //--------------------------------------------------------------------------
  321. //+-------------------------------------------------------------------------
  322. //  szOID_NAME_CONSTRAINTS
  323. //  X509_NAME_CONSTRAINTS
  324. //
  325. //  pvStructInfo points to the following CERT_NAME_CONSTRAINTS_INFO
  326. //
  327. //  For CRYPT_E_INVALID_IA5_STRING, the error location is returned in
  328. //  *pcbEncoded by CryptEncodeObject(X509_NAME_CONSTRAINTS)
  329. //
  330. //  Error location consists of:
  331. //    EXCLUDED_SUBTREE_BIT  - 1 bit  << 31 (0 for permitted, 1 for excluded)
  332. //    ENTRY_INDEX           - 8 bits << 16
  333. //    VALUE_INDEX           - 16 bits (unicode character index)
  334. //
  335. //  See X509_ALTERNATE_NAME for ENTRY_INDEX and VALUE_INDEX error location
  336. //  defines.
  337. //--------------------------------------------------------------------------
  338. typedef struct _CERT_GENERAL_SUBTREE {
  339.     CERT_ALT_NAME_ENTRY     Base;
  340.     DWORD                   dwMinimum;
  341.     BOOL                    fMaximum;
  342.     DWORD                   dwMaximum;
  343. } CERT_GENERAL_SUBTREE, *PCERT_GENERAL_SUBTREE;
  344. typedef struct _CERT_NAME_CONSTRAINTS_INFO {
  345.     DWORD                   cPermittedSubtree;
  346.     PCERT_GENERAL_SUBTREE   rgPermittedSubtree;
  347.     DWORD                   cExcludedSubtree;
  348.     PCERT_GENERAL_SUBTREE   rgExcludedSubtree;
  349. } CERT_NAME_CONSTRAINTS_INFO, *PCERT_NAME_CONSTRAINTS_INFO;
  350. #define CERT_EXCLUDED_SUBTREE_BIT       0x80000000L
  351. #define IS_CERT_EXCLUDED_SUBTREE(X)     
  352.     (0 != (X & CERT_EXCLUDED_SUBTREE_BIT))
  353. //+-------------------------------------------------------------------------
  354. //  szOID_NEXT_UPDATE_LOCATION
  355. //
  356. //  pvStructInfo points to a CERT_ALT_NAME_INFO.
  357. //--------------------------------------------------------------------------
  358. //+-------------------------------------------------------------------------
  359. //  szOID_REMOVE_CERTIFICATE
  360. //
  361. //  pvStructInfo points to an int which can be set to one of the following
  362. //   0 - Add certificate
  363. //   1 - Remove certificate
  364. //--------------------------------------------------------------------------
  365. //+-------------------------------------------------------------------------
  366. //  PKCS_CTL
  367. //  szOID_CTL
  368. //
  369. //  pvStructInfo points to a CTL_INFO.
  370. //--------------------------------------------------------------------------
  371. //+-------------------------------------------------------------------------
  372. //  PKCS_SORTED_CTL
  373. //
  374. //  pvStructInfo points to a CTL_INFO.
  375. //
  376. //  Same as for PKCS_CTL, except, the CTL entries are sorted. The following
  377. //  extension containing the sort information is inserted as the first
  378. //  extension in the encoded CTL.
  379. //
  380. //  Only supported for Encoding. CRYPT_ENCODE_ALLOC_FLAG flag must be
  381. //  set.
  382. //--------------------------------------------------------------------------
  383. //+-------------------------------------------------------------------------
  384. // Sorted CTL TrustedSubjects extension
  385. //
  386. //  Array of little endian DWORDs:
  387. //   [0] - Flags
  388. //   [1] - Count of HashBucket entry offsets
  389. //   [2] - Maximum HashBucket entry collision count
  390. //   [3 ..] (Count + 1) HashBucket entry offsets
  391. //
  392. //  When this extension is present in the CTL,
  393. //  the ASN.1 encoded sequence of TrustedSubjects are HashBucket ordered.
  394. //
  395. //  The entry offsets point to the start of the first encoded TrustedSubject
  396. //  sequence for the HashBucket. The encoded TrustedSubjects for a HashBucket
  397. //  continue until the encoded offset of the next HashBucket. A HashBucket has
  398. //  no entries if HashBucket[N] == HashBucket[N + 1].
  399. //
  400. //  The HashBucket offsets are from the start of the ASN.1 encoded CTL_INFO.
  401. //--------------------------------------------------------------------------
  402. #define SORTED_CTL_EXT_FLAGS_OFFSET         (0*4)
  403. #define SORTED_CTL_EXT_COUNT_OFFSET         (1*4)
  404. #define SORTED_CTL_EXT_MAX_COLLISION_OFFSET (2*4)
  405. #define SORTED_CTL_EXT_HASH_BUCKET_OFFSET   (3*4)
  406. // If the SubjectIdentifiers are a MD5 or SHA1 hash, the following flag is
  407. // set. When set, the first 4 bytes of the SubjectIdentifier are used as
  408. // the dwhash. Otherwise, the SubjectIdentifier bytes are hashed into dwHash.
  409. // In either case the HashBucket index = dwHash % cHashBucket.
  410. #define SORTED_CTL_EXT_HASHED_SUBJECT_IDENTIFIER_FLAG       0x1
  411. //+-------------------------------------------------------------------------
  412. //  X509_MULTI_BYTE_UINT
  413. //
  414. //  pvStructInfo points to a CRYPT_UINT_BLOB. Before encoding, inserts a
  415. //  leading 0x00. After decoding, removes a leading 0x00.
  416. //--------------------------------------------------------------------------
  417. //+-------------------------------------------------------------------------
  418. //  X509_DSS_PUBLICKEY
  419. //
  420. //  pvStructInfo points to a CRYPT_UINT_BLOB.
  421. //--------------------------------------------------------------------------
  422. //+-------------------------------------------------------------------------
  423. //  X509_DSS_PARAMETERS
  424. //
  425. //  pvStructInfo points to following CERT_DSS_PARAMETERS data structure.
  426. //--------------------------------------------------------------------------
  427. typedef struct _CERT_DSS_PARAMETERS {
  428.     CRYPT_UINT_BLOB     p;
  429.     CRYPT_UINT_BLOB     q;
  430.     CRYPT_UINT_BLOB     g;
  431. } CERT_DSS_PARAMETERS, *PCERT_DSS_PARAMETERS;
  432. //+-------------------------------------------------------------------------
  433. //  X509_DSS_SIGNATURE
  434. //
  435. //  pvStructInfo is a BYTE rgbSignature[CERT_DSS_SIGNATURE_LEN]. The
  436. //  bytes are ordered as output by the DSS CSP's CryptSignHash().
  437. //--------------------------------------------------------------------------
  438. #define CERT_DSS_R_LEN          20
  439. #define CERT_DSS_S_LEN          20
  440. #define CERT_DSS_SIGNATURE_LEN  (CERT_DSS_R_LEN + CERT_DSS_S_LEN)
  441. // Sequence of 2 unsigned integers (the extra +1 is for a potential leading
  442. // 0x00 to make the integer unsigned)
  443. #define CERT_MAX_ASN_ENCODED_DSS_SIGNATURE_LEN  (2 + 2*(2 + 20 +1))
  444. //+-------------------------------------------------------------------------
  445. //  X509_DH_PUBLICKEY
  446. //
  447. //  pvStructInfo points to a CRYPT_UINT_BLOB.
  448. //--------------------------------------------------------------------------
  449. //+-------------------------------------------------------------------------
  450. //  X509_DH_PARAMETERS
  451. //
  452. //  pvStructInfo points to following CERT_DH_PARAMETERS data structure.
  453. //--------------------------------------------------------------------------
  454. typedef struct _CERT_DH_PARAMETERS {
  455.     CRYPT_UINT_BLOB     p;
  456.     CRYPT_UINT_BLOB     g;
  457. } CERT_DH_PARAMETERS, *PCERT_DH_PARAMETERS;
  458. //+-------------------------------------------------------------------------
  459. //  X942_DH_PARAMETERS
  460. //
  461. //  pvStructInfo points to following CERT_X942_DH_PARAMETERS data structure.
  462. //
  463. //  If q.cbData == 0, then, the following fields are zero'ed.
  464. //--------------------------------------------------------------------------
  465. typedef struct _CERT_X942_DH_VALIDATION_PARAMS {
  466.     CRYPT_BIT_BLOB      seed;
  467.     DWORD               pgenCounter;
  468. } CERT_X942_DH_VALIDATION_PARAMS, *PCERT_X942_DH_VALIDATION_PARAMS;
  469. typedef struct _CERT_X942_DH_PARAMETERS {
  470.     CRYPT_UINT_BLOB     p;          // odd prime, p = jq + 1
  471.     CRYPT_UINT_BLOB     g;          // generator, g
  472.     CRYPT_UINT_BLOB     q;          // factor of p - 1, OPTIONAL
  473.     CRYPT_UINT_BLOB     j;          // subgroup factor, OPTIONAL
  474.     PCERT_X942_DH_VALIDATION_PARAMS pValidationParams;  // OPTIONAL
  475. } CERT_X942_DH_PARAMETERS, *PCERT_X942_DH_PARAMETERS;
  476. //+-------------------------------------------------------------------------
  477. //  X942_OTHER_INFO
  478. //
  479. //  pvStructInfo points to following CRYPT_X942_OTHER_INFO data structure.
  480. //
  481. //  rgbCounter and rgbKeyLength are in Little Endian order.
  482. //--------------------------------------------------------------------------
  483. #define CRYPT_X942_COUNTER_BYTE_LENGTH      4
  484. #define CRYPT_X942_KEY_LENGTH_BYTE_LENGTH   4
  485. #define CRYPT_X942_PUB_INFO_BYTE_LENGTH     (512/8)
  486. typedef struct _CRYPT_X942_OTHER_INFO {
  487.     LPSTR               pszContentEncryptionObjId;
  488.     BYTE                rgbCounter[CRYPT_X942_COUNTER_BYTE_LENGTH];
  489.     BYTE                rgbKeyLength[CRYPT_X942_KEY_LENGTH_BYTE_LENGTH];
  490.     CRYPT_DATA_BLOB     PubInfo;    // OPTIONAL
  491. } CRYPT_X942_OTHER_INFO, *PCRYPT_X942_OTHER_INFO;
  492. //+-------------------------------------------------------------------------
  493. //  PKCS_RC2_CBC_PARAMETERS
  494. //  szOID_RSA_RC2CBC
  495. //
  496. //  pvStructInfo points to following CRYPT_RC2_CBC_PARAMETERS data structure.
  497. //--------------------------------------------------------------------------
  498. typedef struct _CRYPT_RC2_CBC_PARAMETERS {
  499.     DWORD               dwVersion;
  500.     BOOL                fIV;            // set if has following IV
  501.     BYTE                rgbIV[8];
  502. } CRYPT_RC2_CBC_PARAMETERS, *PCRYPT_RC2_CBC_PARAMETERS;
  503. #define CRYPT_RC2_40BIT_VERSION     160
  504. #define CRYPT_RC2_56BIT_VERSION     52
  505. #define CRYPT_RC2_64BIT_VERSION     120
  506. #define CRYPT_RC2_128BIT_VERSION    58
  507. //+-------------------------------------------------------------------------
  508. //  PKCS_SMIME_CAPABILITIES
  509. //  szOID_RSA_SMIMECapabilities
  510. //
  511. //  pvStructInfo points to following CRYPT_SMIME_CAPABILITIES data structure.
  512. //
  513. //  Note, for CryptEncodeObject(X509_ASN_ENCODING), Parameters.cbData == 0
  514. //  causes the encoded parameters to be omitted and not encoded as a NULL
  515. //  (05 00) as is done when encoding a CRYPT_ALGORITHM_IDENTIFIER. This
  516. //  is per the SMIME specification for encoding capabilities.
  517. //--------------------------------------------------------------------------
  518. typedef struct _CRYPT_SMIME_CAPABILITY {
  519.     LPSTR               pszObjId;
  520.     CRYPT_OBJID_BLOB    Parameters;
  521. } CRYPT_SMIME_CAPABILITY, *PCRYPT_SMIME_CAPABILITY;
  522. typedef struct _CRYPT_SMIME_CAPABILITIES {
  523.     DWORD                   cCapability;
  524.     PCRYPT_SMIME_CAPABILITY rgCapability;
  525. } CRYPT_SMIME_CAPABILITIES, *PCRYPT_SMIME_CAPABILITIES;
  526. //+-------------------------------------------------------------------------
  527. //  PKCS7_SIGNER_INFO
  528. //
  529. //  pvStructInfo points to CMSG_SIGNER_INFO.
  530. //--------------------------------------------------------------------------
  531. //+-------------------------------------------------------------------------
  532. //  CMS_SIGNER_INFO
  533. //
  534. //  pvStructInfo points to CMSG_CMS_SIGNER_INFO.
  535. //--------------------------------------------------------------------------
  536. //+-------------------------------------------------------------------------
  537. //  Verisign Certificate Extension Object Identifiers
  538. //--------------------------------------------------------------------------
  539. // Octet String containing Boolean
  540. #define szOID_VERISIGN_PRIVATE_6_9       "2.16.840.1.113733.1.6.9"
  541. // Octet String containing IA5 string: lower case 32 char hex string
  542. #define szOID_VERISIGN_ONSITE_JURISDICTION_HASH "2.16.840.1.113733.1.6.11"
  543. // Octet String containing Bit string
  544. #define szOID_VERISIGN_BITSTRING_6_13    "2.16.840.1.113733.1.6.13"
  545. // EKU
  546. #define szOID_VERISIGN_ISS_STRONG_CRYPTO "2.16.840.1.113733.1.8.1"
  547. //+-------------------------------------------------------------------------
  548. //  Netscape Certificate Extension Object Identifiers
  549. //--------------------------------------------------------------------------
  550. #define szOID_NETSCAPE                  "2.16.840.1.113730"
  551. #define szOID_NETSCAPE_CERT_EXTENSION   "2.16.840.1.113730.1"
  552. #define szOID_NETSCAPE_CERT_TYPE        "2.16.840.1.113730.1.1"
  553. #define szOID_NETSCAPE_BASE_URL         "2.16.840.1.113730.1.2"
  554. #define szOID_NETSCAPE_REVOCATION_URL   "2.16.840.1.113730.1.3"
  555. #define szOID_NETSCAPE_CA_REVOCATION_URL "2.16.840.1.113730.1.4"
  556. #define szOID_NETSCAPE_CERT_RENEWAL_URL "2.16.840.1.113730.1.7"
  557. #define szOID_NETSCAPE_CA_POLICY_URL    "2.16.840.1.113730.1.8"
  558. #define szOID_NETSCAPE_SSL_SERVER_NAME  "2.16.840.1.113730.1.12"
  559. #define szOID_NETSCAPE_COMMENT          "2.16.840.1.113730.1.13"
  560. //+-------------------------------------------------------------------------
  561. //  Netscape Certificate Data Type Object Identifiers
  562. //--------------------------------------------------------------------------
  563. #define szOID_NETSCAPE_DATA_TYPE        "2.16.840.1.113730.2"
  564. #define szOID_NETSCAPE_CERT_SEQUENCE    "2.16.840.1.113730.2.5"
  565. //+-------------------------------------------------------------------------
  566. //  szOID_NETSCAPE_CERT_TYPE extension
  567. //
  568. //  Its value is a bit string. CryptDecodeObject/CryptEncodeObject using
  569. //  X509_BITS or X509_BITS_WITHOUT_TRAILING_ZEROES.
  570. //
  571. //  The following bits are defined:
  572. //--------------------------------------------------------------------------
  573. #define NETSCAPE_SSL_CLIENT_AUTH_CERT_TYPE  0x80
  574. #define NETSCAPE_SSL_SERVER_AUTH_CERT_TYPE  0x40
  575. #define NETSCAPE_SMIME_CERT_TYPE            0x20
  576. #define NETSCAPE_SIGN_CERT_TYPE             0x10
  577. #define NETSCAPE_SSL_CA_CERT_TYPE           0x04
  578. #define NETSCAPE_SMIME_CA_CERT_TYPE         0x02
  579. #define NETSCAPE_SIGN_CA_CERT_TYPE          0x01
  580. //+-------------------------------------------------------------------------
  581. //  szOID_NETSCAPE_BASE_URL extension
  582. //
  583. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  584. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  585. //  dwValueType = CERT_RDN_IA5_STRING.
  586. //
  587. //  When present this string is added to the beginning of all relative URLs
  588. //  in the certificate.  This extension can be considered an optimization
  589. //  to reduce the size of the URL extensions.
  590. //--------------------------------------------------------------------------
  591. //+-------------------------------------------------------------------------
  592. //  szOID_NETSCAPE_REVOCATION_URL extension
  593. //
  594. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  595. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  596. //  dwValueType = CERT_RDN_IA5_STRING.
  597. //
  598. //  It is a relative or absolute URL that can be used to check the
  599. //  revocation status of a certificate. The revocation check will be
  600. //  performed as an HTTP GET method using a url that is the concatenation of
  601. //  revocation-url and certificate-serial-number.
  602. //  Where the certificate-serial-number is encoded as a string of
  603. //  ascii hexadecimal digits. For example, if the netscape-base-url is
  604. //  https://www.certs-r-us.com/, the netscape-revocation-url is
  605. //  cgi-bin/check-rev.cgi?, and the certificate serial number is 173420,
  606. //  the resulting URL would be:
  607. //  https://www.certs-r-us.com/cgi-bin/check-rev.cgi?02a56c
  608. //
  609. //  The server should return a document with a Content-Type of
  610. //  application/x-netscape-revocation.  The document should contain
  611. //  a single ascii digit, '1' if the certificate is not curently valid,
  612. //  and '0' if it is curently valid.
  613. //
  614. //  Note: for all of the URLs that include the certificate serial number,
  615. //  the serial number will be encoded as a string which consists of an even
  616. //  number of hexadecimal digits.  If the number of significant digits is odd,
  617. //  the string will have a single leading zero to ensure an even number of
  618. //  digits is generated.
  619. //--------------------------------------------------------------------------
  620. //+-------------------------------------------------------------------------
  621. //  szOID_NETSCAPE_CA_REVOCATION_URL extension
  622. //
  623. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  624. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  625. //  dwValueType = CERT_RDN_IA5_STRING.
  626. //
  627. //  It is a relative or absolute URL that can be used to check the
  628. //  revocation status of any certificates that are signed by the CA that
  629. //  this certificate belongs to. This extension is only valid in CA
  630. //  certificates.  The use of this extension is the same as the above
  631. //  szOID_NETSCAPE_REVOCATION_URL extension.
  632. //--------------------------------------------------------------------------
  633. //+-------------------------------------------------------------------------
  634. //  szOID_NETSCAPE_CERT_RENEWAL_URL extension
  635. //
  636. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  637. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  638. //  dwValueType = CERT_RDN_IA5_STRING.
  639. //
  640. //  It is a relative or absolute URL that points to a certificate renewal
  641. //  form. The renewal form will be accessed with an HTTP GET method using a
  642. //  url that is the concatenation of renewal-url and
  643. //  certificate-serial-number. Where the certificate-serial-number is
  644. //  encoded as a string of ascii hexadecimal digits. For example, if the
  645. //  netscape-base-url is https://www.certs-r-us.com/, the
  646. //  netscape-cert-renewal-url is cgi-bin/check-renew.cgi?, and the
  647. //  certificate serial number is 173420, the resulting URL would be:
  648. //  https://www.certs-r-us.com/cgi-bin/check-renew.cgi?02a56c
  649. //  The document returned should be an HTML form that will allow the user
  650. //  to request a renewal of their certificate.
  651. //--------------------------------------------------------------------------
  652. //+-------------------------------------------------------------------------
  653. //  szOID_NETSCAPE_CA_POLICY_URL extension
  654. //
  655. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  656. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  657. //  dwValueType = CERT_RDN_IA5_STRING.
  658. //
  659. //  It is a relative or absolute URL that points to a web page that
  660. //  describes the policies under which the certificate was issued.
  661. //--------------------------------------------------------------------------
  662. //+-------------------------------------------------------------------------
  663. //  szOID_NETSCAPE_SSL_SERVER_NAME extension
  664. //
  665. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  666. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  667. //  dwValueType = CERT_RDN_IA5_STRING.
  668. //
  669. //  It is a "shell expression" that can be used to match the hostname of the
  670. //  SSL server that is using this certificate.  It is recommended that if
  671. //  the server's hostname does not match this pattern the user be notified
  672. //  and given the option to terminate the SSL connection.  If this extension
  673. //  is not present then the CommonName in the certificate subject's
  674. //  distinguished name is used for the same purpose.
  675. //--------------------------------------------------------------------------
  676. //+-------------------------------------------------------------------------
  677. //  szOID_NETSCAPE_COMMENT extension
  678. //
  679. //  Its value is an IA5_STRING. CryptDecodeObject/CryptEncodeObject using
  680. //  X509_ANY_STRING or X509_UNICODE_ANY_STRING, where,
  681. //  dwValueType = CERT_RDN_IA5_STRING.
  682. //
  683. //  It is a comment that may be displayed to the user when the certificate
  684. //  is viewed.
  685. //--------------------------------------------------------------------------
  686. //+-------------------------------------------------------------------------
  687. //  szOID_NETSCAPE_CERT_SEQUENCE
  688. //
  689. //  Its value is a PKCS#7 ContentInfo structure wrapping a sequence of
  690. //  certificates. The value of the contentType field is
  691. //  szOID_NETSCAPE_CERT_SEQUENCE, while the content field is the following
  692. //  structure:
  693. //      CertificateSequence ::= SEQUENCE OF Certificate.
  694. //
  695. //  CryptDecodeObject/CryptEncodeObject using
  696. //  PKCS_CONTENT_INFO_SEQUENCE_OF_ANY, where,
  697. //  pszObjId = szOID_NETSCAPE_CERT_SEQUENCE and the CRYPT_DER_BLOBs point
  698. //  to encoded X509 certificates.
  699. //--------------------------------------------------------------------------
  700. //+=========================================================================
  701. //  Certificate Management Messages over CMS (CMC) Data Structures
  702. //==========================================================================
  703. // Content Type (request)
  704. #define szOID_CT_PKI_DATA               "1.3.6.1.5.5.7.12.2"
  705. // Content Type (response)
  706. #define szOID_CT_PKI_RESPONSE           "1.3.6.1.5.5.7.12.3"
  707. // Signature value that only contains the hash octets. The parameters for
  708. // this algorithm must be present and must be encoded as NULL. 
  709. #define szOID_PKIX_NO_SIGNATURE         "1.3.6.1.5.5.7.6.2"
  710. #define szOID_CMC                       "1.3.6.1.5.5.7.7"
  711. #define szOID_CMC_STATUS_INFO           "1.3.6.1.5.5.7.7.1"
  712. #define szOID_CMC_IDENTIFICATION        "1.3.6.1.5.5.7.7.2"
  713. #define szOID_CMC_IDENTITY_PROOF        "1.3.6.1.5.5.7.7.3"
  714. #define szOID_CMC_DATA_RETURN           "1.3.6.1.5.5.7.7.4"
  715. // Transaction Id (integer)
  716. #define szOID_CMC_TRANSACTION_ID        "1.3.6.1.5.5.7.7.5"
  717. // Sender Nonce (octet string)
  718. #define szOID_CMC_SENDER_NONCE          "1.3.6.1.5.5.7.7.6"
  719. // Recipient Nonce (octet string)
  720. #define szOID_CMC_RECIPIENT_NONCE       "1.3.6.1.5.5.7.7.7"
  721. #define szOID_CMC_ADD_EXTENSIONS        "1.3.6.1.5.5.7.7.8"
  722. #define szOID_CMC_ENCRYPTED_POP         "1.3.6.1.5.5.7.7.9"
  723. #define szOID_CMC_DECRYPTED_POP         "1.3.6.1.5.5.7.7.10"
  724. #define szOID_CMC_LRA_POP_WITNESS       "1.3.6.1.5.5.7.7.11"
  725. // Issuer Name + Serial
  726. #define szOID_CMC_GET_CERT              "1.3.6.1.5.5.7.7.15"
  727. // Issuer Name [+ CRL Name] + Time [+ Reasons]
  728. #define szOID_CMC_GET_CRL               "1.3.6.1.5.5.7.7.16"
  729. // Issuer Name + Serial [+ Reason] [+ Effective Time] [+ Secret] [+ Comment]
  730. #define szOID_CMC_REVOKE_REQUEST        "1.3.6.1.5.5.7.7.17"
  731. // (octet string) URL-style parameter list (IA5?)
  732. #define szOID_CMC_REG_INFO              "1.3.6.1.5.5.7.7.18"
  733. #define szOID_CMC_RESPONSE_INFO         "1.3.6.1.5.5.7.7.19"
  734. // (octet string)
  735. #define szOID_CMC_QUERY_PENDING         "1.3.6.1.5.5.7.7.21"
  736. #define szOID_CMC_ID_POP_LINK_RANDOM    "1.3.6.1.5.5.7.7.22"
  737. #define szOID_CMC_ID_POP_LINK_WITNESS   "1.3.6.1.5.5.7.7.23"
  738. // optional Name + Integer
  739. #define szOID_CMC_ID_CONFIRM_CERT_ACCEPTANCE "1.3.6.1.5.5.7.7.24"
  740. #define szOID_CMC_ADD_ATTRIBUTES        "1.3.6.1.4.1.311.10.10.1"
  741. //+-------------------------------------------------------------------------
  742. //  CMC_DATA
  743. //  CMC_RESPONSE
  744. //
  745. //  Certificate Management Messages over CMS (CMC) PKIData and Response
  746. //  messages.
  747. //
  748. //  For CMC_DATA, pvStructInfo points to a CMC_DATA_INFO.
  749. //  CMC_DATA_INFO contains optional arrays of tagged attributes, requests,
  750. //  content info and/or arbitrary other messages.
  751. //
  752. //  For CMC_RESPONSE, pvStructInfo points to a CMC_RESPONSE_INFO.
  753. //  CMC_RESPONSE_INFO is the same as CMC_DATA_INFO without the tagged
  754. //  requests.
  755. //--------------------------------------------------------------------------
  756. typedef struct _CMC_TAGGED_ATTRIBUTE {
  757.     DWORD               dwBodyPartID;
  758.     CRYPT_ATTRIBUTE     Attribute;
  759. } CMC_TAGGED_ATTRIBUTE, *PCMC_TAGGED_ATTRIBUTE;
  760. typedef struct _CMC_TAGGED_CERT_REQUEST {
  761.     DWORD               dwBodyPartID;
  762.     CRYPT_DER_BLOB      SignedCertRequest;
  763. } CMC_TAGGED_CERT_REQUEST, *PCMC_TAGGED_CERT_REQUEST;
  764. typedef struct _CMC_TAGGED_REQUEST {
  765.     DWORD               dwTaggedRequestChoice;
  766.     union {
  767.         // CMC_TAGGED_CERT_REQUEST_CHOICE
  768.         PCMC_TAGGED_CERT_REQUEST   pTaggedCertRequest;
  769.     };
  770. } CMC_TAGGED_REQUEST, *PCMC_TAGGED_REQUEST;
  771. #define CMC_TAGGED_CERT_REQUEST_CHOICE      1
  772. typedef struct _CMC_TAGGED_CONTENT_INFO {
  773.     DWORD               dwBodyPartID;
  774.     CRYPT_DER_BLOB      EncodedContentInfo;
  775. } CMC_TAGGED_CONTENT_INFO, *PCMC_TAGGED_CONTENT_INFO;
  776. typedef struct _CMC_TAGGED_OTHER_MSG {
  777.     DWORD               dwBodyPartID;
  778.     LPSTR               pszObjId;
  779.     CRYPT_OBJID_BLOB    Value;
  780. } CMC_TAGGED_OTHER_MSG, *PCMC_TAGGED_OTHER_MSG;
  781. // All the tagged arrays are optional
  782. typedef struct _CMC_DATA_INFO {
  783.     DWORD                       cTaggedAttribute;
  784.     PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
  785.     DWORD                       cTaggedRequest;
  786.     PCMC_TAGGED_REQUEST         rgTaggedRequest;
  787.     DWORD                       cTaggedContentInfo;
  788.     PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
  789.     DWORD                       cTaggedOtherMsg;
  790.     PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
  791. } CMC_DATA_INFO, *PCMC_DATA_INFO;
  792. // All the tagged arrays are optional
  793. typedef struct _CMC_RESPONSE_INFO {
  794.     DWORD                       cTaggedAttribute;
  795.     PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
  796.     DWORD                       cTaggedContentInfo;
  797.     PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
  798.     DWORD                       cTaggedOtherMsg;
  799.     PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
  800. } CMC_RESPONSE_INFO, *PCMC_RESPONSE_INFO;
  801. //+-------------------------------------------------------------------------
  802. //  CMC_STATUS
  803. //
  804. //  Certificate Management Messages over CMS (CMC) Status.
  805. //
  806. //  pvStructInfo points to a CMC_STATUS_INFO.
  807. //--------------------------------------------------------------------------
  808. typedef struct _CMC_PEND_INFO {
  809.     CRYPT_DATA_BLOB             PendToken;
  810.     FILETIME                    PendTime;
  811. } CMC_PEND_INFO, *PCMC_PEND_INFO;
  812. typedef struct _CMC_STATUS_INFO {
  813.     DWORD                       dwStatus;
  814.     DWORD                       cBodyList;
  815.     DWORD                       *rgdwBodyList;
  816.     LPWSTR                      pwszStatusString;   // OPTIONAL
  817.     DWORD                       dwOtherInfoChoice;
  818.     union  {
  819.         // CMC_OTHER_INFO_NO_CHOICE
  820.         //  none
  821.         // CMC_OTHER_INFO_FAIL_CHOICE
  822.         DWORD                       dwFailInfo;
  823.         // CMC_OTHER_INFO_PEND_CHOICE
  824.         PCMC_PEND_INFO              pPendInfo;
  825.     };
  826. } CMC_STATUS_INFO, *PCMC_STATUS_INFO;
  827. #define CMC_OTHER_INFO_NO_CHOICE        0
  828. #define CMC_OTHER_INFO_FAIL_CHOICE      1
  829. #define CMC_OTHER_INFO_PEND_CHOICE      2
  830. //
  831. // dwStatus values
  832. //
  833. // Request was granted
  834. #define CMC_STATUS_SUCCESS          0
  835. // Request failed, more information elsewhere in the message
  836. #define CMC_STATUS_FAILED           2
  837. // The request body part has not yet been processed. Requester is responsible
  838. // to poll back. May only be returned for certificate request operations.
  839. #define CMC_STATUS_PENDING          3
  840. // The requested operation is not supported
  841. #define CMC_STATUS_NO_SUPPORT       4
  842. // Confirmation using the idConfirmCertAcceptance control is required
  843. // before use of certificate
  844. #define CMC_STATUS_CONFIRM_REQUIRED 5
  845. //
  846. // dwFailInfo values
  847. //
  848. // Unrecognized or unsupported algorithm
  849. #define CMC_FAIL_BAD_ALG            0
  850. // Integrity check failed
  851. #define CMC_FAIL_BAD_MESSAGE_CHECK  1
  852. // Transaction not permitted or supported
  853. #define CMC_FAIL_BAD_REQUEST        2
  854. // Message time field was not sufficiently close to the system time
  855. #define CMC_FAIL_BAD_TIME           3
  856. // No certificate could be identified matching the provided criteria
  857. #define CMC_FAIL_BAD_CERT_ID        4
  858. // A requested X.509 extension is not supported by the recipient CA.
  859. #define CMC_FAIL_UNSUPORTED_EXT     5
  860. // Private key material must be supplied
  861. #define CMC_FAIL_MUST_ARCHIVE_KEYS  6
  862. // Identification Attribute failed to verify
  863. #define CMC_FAIL_BAD_IDENTITY       7
  864. // Server requires a POP proof before issuing certificate
  865. #define CMC_FAIL_POP_REQUIRED       8
  866. // POP processing failed
  867. #define CMC_FAIL_POP_FAILED         9
  868. // Server policy does not allow key re-use
  869. #define CMC_FAIL_NO_KEY_REUSE       10
  870. #define CMC_FAIL_INTERNAL_CA_ERROR  11
  871. #define CMC_FAIL_TRY_LATER          12
  872. //+-------------------------------------------------------------------------
  873. //  CMC_ADD_EXTENSIONS
  874. //
  875. //  Certificate Management Messages over CMS (CMC) Add Extensions control
  876. //  attribute.
  877. //
  878. //  pvStructInfo points to a CMC_ADD_EXTENSIONS_INFO.
  879. //--------------------------------------------------------------------------
  880. typedef struct _CMC_ADD_EXTENSIONS_INFO {
  881.     DWORD                       dwCmcDataReference;
  882.     DWORD                       cCertReference;
  883.     DWORD                       *rgdwCertReference;
  884.     DWORD                       cExtension;
  885.     PCERT_EXTENSION             rgExtension;
  886. } CMC_ADD_EXTENSIONS_INFO, *PCMC_ADD_EXTENSIONS_INFO;
  887. //+-------------------------------------------------------------------------
  888. //  CMC_ADD_ATTRIBUTES
  889. //
  890. //  Certificate Management Messages over CMS (CMC) Add Attributes control
  891. //  attribute.
  892. //
  893. //  pvStructInfo points to a CMC_ADD_ATTRIBUTES_INFO.
  894. //--------------------------------------------------------------------------
  895. typedef struct _CMC_ADD_ATTRIBUTES_INFO {
  896.     DWORD                       dwCmcDataReference;
  897.     DWORD                       cCertReference;
  898.     DWORD                       *rgdwCertReference;
  899.     DWORD                       cAttribute;
  900.     PCRYPT_ATTRIBUTE            rgAttribute;
  901. } CMC_ADD_ATTRIBUTES_INFO, *PCMC_ADD_ATTRIBUTES_INFO;
  902. //+-------------------------------------------------------------------------
  903. //  X509_CERTIFICATE_TEMPLATE
  904. //  szOID_CERTIFICATE_TEMPLATE
  905. //
  906. //  pvStructInfo points to following CERT_TEMPLATE_EXT data structure.
  907. //
  908. //--------------------------------------------------------------------------
  909. typedef struct _CERT_TEMPLATE_EXT {
  910.     LPSTR               pszObjId;
  911.     DWORD               dwMajorVersion;
  912.     BOOL                fMinorVersion;      // TRUE for a minor version
  913.     DWORD               dwMinorVersion;
  914. } CERT_TEMPLATE_EXT, *PCERT_TEMPLATE_EXT;
  915. //+=========================================================================
  916. //  Object IDentifier (OID) Installable Functions:  Data Structures and APIs
  917. //==========================================================================
  918. typedef void *HCRYPTOIDFUNCSET;
  919. typedef void *HCRYPTOIDFUNCADDR;
  920. // Predefined OID Function Names
  921. #define CRYPT_OID_ENCODE_OBJECT_FUNC        "CryptDllEncodeObject"
  922. #define CRYPT_OID_DECODE_OBJECT_FUNC        "CryptDllDecodeObject"
  923. #define CRYPT_OID_ENCODE_OBJECT_EX_FUNC     "CryptDllEncodeObjectEx"
  924. #define CRYPT_OID_DECODE_OBJECT_EX_FUNC     "CryptDllDecodeObjectEx"
  925. #define CRYPT_OID_CREATE_COM_OBJECT_FUNC    "CryptDllCreateCOMObject"
  926. #define CRYPT_OID_VERIFY_REVOCATION_FUNC    "CertDllVerifyRevocation"
  927. #define CRYPT_OID_VERIFY_CTL_USAGE_FUNC     "CertDllVerifyCTLUsage"
  928. #define CRYPT_OID_FORMAT_OBJECT_FUNC        "CryptDllFormatObject"
  929. #define CRYPT_OID_FIND_OID_INFO_FUNC        "CryptDllFindOIDInfo"
  930. #define CRYPT_OID_FIND_LOCALIZED_NAME_FUNC  "CryptDllFindLocalizedName"
  931. // CryptDllEncodeObject has same function signature as CryptEncodeObject.
  932. // CryptDllDecodeObject has same function signature as CryptDecodeObject.
  933. // CryptDllEncodeObjectEx has same function signature as CryptEncodeObjectEx.
  934. // The Ex version MUST support the CRYPT_ENCODE_ALLOC_FLAG option.
  935. //
  936. // If an Ex function isn't installed or registered, then, attempts to find
  937. // a non-EX version. If the ALLOC flag is set, then, CryptEncodeObjectEx,
  938. // does the allocation and calls the non-EX version twice.
  939. // CryptDllDecodeObjectEx has same function signature as CryptDecodeObjectEx.
  940. // The Ex version MUST support the CRYPT_DECODE_ALLOC_FLAG option.
  941. //
  942. // If an Ex function isn't installed or registered, then, attempts to find
  943. // a non-EX version. If the ALLOC flag is set, then, CryptDecodeObjectEx,
  944. // does the allocation and calls the non-EX version twice.
  945. // CryptDllCreateCOMObject has the following signature:
  946. //      BOOL WINAPI CryptDllCreateCOMObject(
  947. //          IN DWORD dwEncodingType,
  948. //          IN LPCSTR pszOID,
  949. //          IN PCRYPT_DATA_BLOB pEncodedContent,
  950. //          IN DWORD dwFlags,
  951. //          IN REFIID riid,
  952. //          OUT void **ppvObj);
  953. // CertDllVerifyRevocation has the same signature as CertVerifyRevocation
  954. //  (See CertVerifyRevocation for details on when called)
  955. // CertDllVerifyCTLUsage has the same signature as CertVerifyCTLUsage
  956. // CryptDllFindOIDInfo currently is only used to store values used by
  957. // CryptFindOIDInfo. See CryptFindOIDInfo() for more details.
  958. // CryptDllFindLocalizedName is only used to store localized string
  959. // values used by CryptFindLocalizedName. See CryptFindLocalizedName() for
  960. // more details.
  961. //  Example of a complete OID Function Registry Name:
  962. //    HKEY_LOCAL_MACHINESoftwareMicrosoftCryptographyOID
  963. //      Encoding Type 1CryptDllEncodeObject1.2.3
  964. //
  965. //  The key's L"Dll" value contains the name of the Dll.
  966. //  The key's L"FuncName" value overrides the default function name
  967. #define CRYPT_OID_REGPATH "Software\Microsoft\Cryptography\OID"
  968. #define CRYPT_OID_REG_ENCODING_TYPE_PREFIX  "EncodingType "
  969. #define CRYPT_OID_REG_DLL_VALUE_NAME        L"Dll"
  970. #define CRYPT_OID_REG_FUNC_NAME_VALUE_NAME  L"FuncName"
  971. #define CRYPT_OID_REG_FUNC_NAME_VALUE_NAME_A "FuncName"
  972. // CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG can be set in the key's L"CryptFlags"
  973. // value to register the functions before the installed functions.
  974. //
  975. // CryptSetOIDFunctionValue must be called to set this value. L"CryptFlags"
  976. // must be set using a dwValueType of REG_DWORD.
  977. #define CRYPT_OID_REG_FLAGS_VALUE_NAME      L"CryptFlags"
  978. // OID used for Default OID functions
  979. #define CRYPT_DEFAULT_OID                   "DEFAULT"
  980. typedef struct _CRYPT_OID_FUNC_ENTRY {
  981.     LPCSTR  pszOID;
  982.     void    *pvFuncAddr;
  983. } CRYPT_OID_FUNC_ENTRY, *PCRYPT_OID_FUNC_ENTRY;
  984. #define CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG  1
  985. //+-------------------------------------------------------------------------
  986. //  Install a set of callable OID function addresses.
  987. //
  988. //  By default the functions are installed at end of the list.
  989. //  Set CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG to install at beginning of list.
  990. //
  991. //  hModule should be updated with the hModule passed to DllMain to prevent
  992. //  the Dll containing the function addresses from being unloaded by
  993. //  CryptGetOIDFuncAddress/CryptFreeOIDFunctionAddress. This would be the
  994. //  case when the Dll has also regsvr32'ed OID functions via
  995. //  CryptRegisterOIDFunction.
  996. //
  997. //  DEFAULT functions are installed by setting rgFuncEntry[].pszOID =
  998. //  CRYPT_DEFAULT_OID.
  999. //--------------------------------------------------------------------------
  1000. WINCRYPT32API
  1001. BOOL
  1002. WINAPI
  1003. CryptInstallOIDFunctionAddress(
  1004.     IN HMODULE hModule,         // hModule passed to DllMain
  1005.     IN DWORD dwEncodingType,
  1006.     IN LPCSTR pszFuncName,
  1007.     IN DWORD cFuncEntry,
  1008.     IN const CRYPT_OID_FUNC_ENTRY rgFuncEntry[],
  1009.     IN DWORD dwFlags
  1010.     );
  1011. //+-------------------------------------------------------------------------
  1012. //  Initialize and return handle to the OID function set identified by its
  1013. //  function name.
  1014. //
  1015. //  If the set already exists, a handle to the existing set is returned.
  1016. //--------------------------------------------------------------------------
  1017. WINCRYPT32API
  1018. HCRYPTOIDFUNCSET
  1019. WINAPI
  1020. CryptInitOIDFunctionSet(
  1021.     IN LPCSTR pszFuncName,
  1022.     IN DWORD dwFlags
  1023.     );
  1024. //+-------------------------------------------------------------------------
  1025. //  Search the list of installed functions for an encoding type and OID match.
  1026. //  If not found, search the registry.
  1027. //
  1028. //  For success, returns TRUE with *ppvFuncAddr updated with the function's
  1029. //  address and *phFuncAddr updated with the function address's handle.
  1030. //  The function's handle is AddRef'ed. CryptFreeOIDFunctionAddress needs to
  1031. //  be called to release it.
  1032. //
  1033. //  For a registry match, the Dll containing the function is loaded.
  1034. //
  1035. //  By default, both the registered and installed function lists are searched.
  1036. //  Set CRYPT_GET_INSTALLED_OID_FUNC_FLAG to only search the installed list
  1037. //  of functions. This flag would be set by a registered function to get
  1038. //  the address of a pre-installed function it was replacing. For example,
  1039. //  the registered function might handle a new special case and call the
  1040. //  pre-installed function to handle the remaining cases.
  1041. //--------------------------------------------------------------------------
  1042. WINCRYPT32API
  1043. BOOL
  1044. WINAPI
  1045. CryptGetOIDFunctionAddress(
  1046.     IN HCRYPTOIDFUNCSET hFuncSet,
  1047.     IN DWORD dwEncodingType,
  1048.     IN LPCSTR pszOID,
  1049.     IN DWORD dwFlags,
  1050.     OUT void **ppvFuncAddr,
  1051.     OUT HCRYPTOIDFUNCADDR *phFuncAddr
  1052.     );
  1053. #define CRYPT_GET_INSTALLED_OID_FUNC_FLAG       0x1
  1054. //+-------------------------------------------------------------------------
  1055. //  Get the list of registered default Dll entries for the specified
  1056. //  function set and encoding type.
  1057. //
  1058. //  The returned list consists of none, one or more null terminated Dll file
  1059. //  names. The list is terminated with an empty (L"") Dll file name.
  1060. //  For example: L"first.dll" L"" L"second.dll" L"" L""
  1061. //--------------------------------------------------------------------------
  1062. WINCRYPT32API
  1063. BOOL
  1064. WINAPI
  1065. CryptGetDefaultOIDDllList(
  1066.     IN HCRYPTOIDFUNCSET hFuncSet,
  1067.     IN DWORD dwEncodingType,
  1068.     OUT LPWSTR pwszDllList,
  1069.     IN OUT DWORD *pcchDllList
  1070.     );
  1071. //+-------------------------------------------------------------------------
  1072. //  Either: get the first or next installed DEFAULT function OR
  1073. //  load the Dll containing the DEFAULT function.
  1074. //
  1075. //  If pwszDll is NULL, search the list of installed DEFAULT functions.
  1076. //  *phFuncAddr must be set to NULL to get the first installed function.
  1077. //  Successive installed functions are returned by setting *phFuncAddr
  1078. //  to the hFuncAddr returned by the previous call.
  1079. //
  1080. //  If pwszDll is NULL, the input *phFuncAddr
  1081. //  is always CryptFreeOIDFunctionAddress'ed by this function, even for
  1082. //  an error.
  1083. //
  1084. //  If pwszDll isn't NULL, then, attempts to load the Dll and the DEFAULT
  1085. //  function. *phFuncAddr is ignored upon entry and isn't
  1086. //  CryptFreeOIDFunctionAddress'ed.
  1087. //
  1088. //  For success, returns TRUE with *ppvFuncAddr updated with the function's
  1089. //  address and *phFuncAddr updated with the function address's handle.
  1090. //  The function's handle is AddRef'ed. CryptFreeOIDFunctionAddress needs to
  1091. //  be called to release it or CryptGetDefaultOIDFunctionAddress can also
  1092. //  be called for a NULL pwszDll.
  1093. //--------------------------------------------------------------------------
  1094. WINCRYPT32API
  1095. BOOL
  1096. WINAPI
  1097. CryptGetDefaultOIDFunctionAddress(
  1098.     IN HCRYPTOIDFUNCSET hFuncSet,
  1099.     IN DWORD dwEncodingType,
  1100.     IN OPTIONAL LPCWSTR pwszDll,
  1101.     IN DWORD dwFlags,
  1102.     OUT void **ppvFuncAddr,
  1103.     IN OUT HCRYPTOIDFUNCADDR *phFuncAddr
  1104.     );
  1105. //+-------------------------------------------------------------------------
  1106. //  Releases the handle AddRef'ed and returned by CryptGetOIDFunctionAddress
  1107. //  or CryptGetDefaultOIDFunctionAddress.
  1108. //
  1109. //  If a Dll was loaded for the function its unloaded. However, before doing
  1110. //  the unload, the DllCanUnloadNow function exported by the loaded Dll is
  1111. //  called. It should return S_FALSE to inhibit the unload or S_TRUE to enable
  1112. //  the unload. If the Dll doesn't export DllCanUnloadNow, the Dll is unloaded.
  1113. //
  1114. //  DllCanUnloadNow has the following signature:
  1115. //      STDAPI  DllCanUnloadNow(void);
  1116. //--------------------------------------------------------------------------
  1117. WINCRYPT32API
  1118. BOOL
  1119. WINAPI
  1120. CryptFreeOIDFunctionAddress(
  1121.     IN HCRYPTOIDFUNCADDR hFuncAddr,
  1122.     IN DWORD dwFlags
  1123.     );
  1124. //+-------------------------------------------------------------------------
  1125. //  Register the Dll containing the function to be called for the specified
  1126. //  encoding type, function name and OID.
  1127. //
  1128. //  pwszDll may contain environment-variable strings
  1129. //  which are ExpandEnvironmentStrings()'ed before loading the Dll.
  1130. //
  1131. //  In addition to registering the DLL, you may override the
  1132. //  name of the function to be called. For example,
  1133. //      pszFuncName = "CryptDllEncodeObject",
  1134. //      pszOverrideFuncName = "MyEncodeXyz".
  1135. //  This allows a Dll to export multiple OID functions for the same
  1136. //  function name without needing to interpose its own OID dispatcher function.
  1137. //--------------------------------------------------------------------------
  1138. WINCRYPT32API
  1139. BOOL
  1140. WINAPI
  1141. CryptRegisterOIDFunction(
  1142.     IN DWORD dwEncodingType,
  1143.     IN LPCSTR pszFuncName,
  1144.     IN LPCSTR pszOID,
  1145.     IN OPTIONAL LPCWSTR pwszDll,
  1146.     IN OPTIONAL LPCSTR pszOverrideFuncName
  1147.     );
  1148. //+-------------------------------------------------------------------------
  1149. //  Unregister the Dll containing the function to be called for the specified
  1150. //  encoding type, function name and OID.
  1151. //--------------------------------------------------------------------------
  1152. WINCRYPT32API
  1153. BOOL
  1154. WINAPI
  1155. CryptUnregisterOIDFunction(
  1156.     IN DWORD dwEncodingType,
  1157.     IN LPCSTR pszFuncName,
  1158.     IN LPCSTR pszOID
  1159.     );
  1160. //+-------------------------------------------------------------------------
  1161. //  Register the Dll containing the default function to be called for the
  1162. //  specified encoding type and function name.
  1163. //
  1164. //  Unlike CryptRegisterOIDFunction, you can't override the function name
  1165. //  needing to be exported by the Dll.
  1166. //
  1167. //  The Dll is inserted before the entry specified by dwIndex.
  1168. //    dwIndex == 0, inserts at the beginning.
  1169. //    dwIndex == CRYPT_REGISTER_LAST_INDEX, appends at the end.
  1170. //
  1171. //  pwszDll may contain environment-variable strings
  1172. //  which are ExpandEnvironmentStrings()'ed before loading the Dll.
  1173. //--------------------------------------------------------------------------
  1174. WINCRYPT32API
  1175. BOOL
  1176. WINAPI
  1177. CryptRegisterDefaultOIDFunction(
  1178.     IN DWORD dwEncodingType,
  1179.     IN LPCSTR pszFuncName,
  1180.     IN DWORD dwIndex,
  1181.     IN LPCWSTR pwszDll
  1182.     );
  1183. #define CRYPT_REGISTER_FIRST_INDEX   0
  1184. #define CRYPT_REGISTER_LAST_INDEX    0xFFFFFFFF
  1185. //+-------------------------------------------------------------------------
  1186. //  Unregister the Dll containing the default function to be called for
  1187. //  the specified encoding type and function name.
  1188. //--------------------------------------------------------------------------
  1189. WINCRYPT32API
  1190. BOOL
  1191. WINAPI
  1192. CryptUnregisterDefaultOIDFunction(
  1193.     IN DWORD dwEncodingType,
  1194.     IN LPCSTR pszFuncName,
  1195.     IN LPCWSTR pwszDll
  1196.     );
  1197. //+-------------------------------------------------------------------------
  1198. //  Set the value for the specified encoding type, function name, OID and
  1199. //  value name.
  1200. //
  1201. //  See RegSetValueEx for the possible value types.
  1202. //
  1203. //  String types are UNICODE.
  1204. //--------------------------------------------------------------------------
  1205. WINCRYPT32API
  1206. BOOL
  1207. WINAPI
  1208. CryptSetOIDFunctionValue(
  1209.     IN DWORD dwEncodingType,
  1210.     IN LPCSTR pszFuncName,
  1211.     IN LPCSTR pszOID,
  1212.     IN LPCWSTR pwszValueName,
  1213.     IN DWORD dwValueType,
  1214.     IN const BYTE *pbValueData,
  1215.     IN DWORD cbValueData
  1216.     );
  1217. //+-------------------------------------------------------------------------
  1218. //  Get the value for the specified encoding type, function name, OID and
  1219. //  value name.
  1220. //
  1221. //  See RegEnumValue for the possible value types.
  1222. //
  1223. //  String types are UNICODE.
  1224. //--------------------------------------------------------------------------
  1225. WINCRYPT32API
  1226. BOOL
  1227. WINAPI
  1228. CryptGetOIDFunctionValue(
  1229.     IN DWORD dwEncodingType,
  1230.     IN LPCSTR pszFuncName,
  1231.     IN LPCSTR pszOID,
  1232.     IN LPCWSTR pwszValueName,
  1233.     OUT DWORD *pdwValueType,
  1234.     OUT BYTE *pbValueData,
  1235.     IN OUT DWORD *pcbValueData
  1236.     );
  1237. typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_FUNC)(
  1238.     IN DWORD dwEncodingType,
  1239.     IN LPCSTR pszFuncName,
  1240.     IN LPCSTR pszOID,
  1241.     IN DWORD cValue,
  1242.     IN const DWORD rgdwValueType[],
  1243.     IN LPCWSTR const rgpwszValueName[],
  1244.     IN const BYTE * const rgpbValueData[],
  1245.     IN const DWORD rgcbValueData[],
  1246.     IN void *pvArg
  1247.     );
  1248. //+-------------------------------------------------------------------------
  1249. //  Enumerate the OID functions identified by their encoding type,
  1250. //  function name and OID.
  1251. //
  1252. //  pfnEnumOIDFunc is called for each registry key matching the input
  1253. //  parameters. Setting dwEncodingType to CRYPT_MATCH_ANY_ENCODING_TYPE matches
  1254. //  any. Setting pszFuncName or pszOID to NULL matches any.
  1255. //
  1256. //  Set pszOID == CRYPT_DEFAULT_OID to restrict the enumeration to only the
  1257. //  DEFAULT functions
  1258. //
  1259. //  String types are UNICODE.
  1260. //--------------------------------------------------------------------------
  1261. WINCRYPT32API
  1262. BOOL
  1263. WINAPI
  1264. CryptEnumOIDFunction(
  1265.     IN DWORD dwEncodingType,
  1266.     IN OPTIONAL LPCSTR pszFuncName,
  1267.     IN OPTIONAL LPCSTR pszOID,
  1268.     IN DWORD dwFlags,
  1269.     IN void *pvArg,
  1270.     IN PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc
  1271.     );
  1272. #define CRYPT_MATCH_ANY_ENCODING_TYPE   0xFFFFFFFF
  1273. //+=========================================================================
  1274. //  Object IDentifier (OID) Information:  Data Structures and APIs
  1275. //==========================================================================
  1276. //+-------------------------------------------------------------------------
  1277. //  OID Information
  1278. //--------------------------------------------------------------------------
  1279. typedef struct _CRYPT_OID_INFO {
  1280.     DWORD           cbSize;
  1281.     LPCSTR          pszOID;
  1282.     LPCWSTR         pwszName;
  1283.     DWORD           dwGroupId;
  1284.     union {
  1285.         DWORD       dwValue;
  1286.         ALG_ID      Algid;
  1287.         DWORD       dwLength;
  1288.     };
  1289.     CRYPT_DATA_BLOB ExtraInfo;
  1290. } CRYPT_OID_INFO, *PCRYPT_OID_INFO;
  1291. typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO;
  1292. //+-------------------------------------------------------------------------
  1293. //  OID Group IDs
  1294. //--------------------------------------------------------------------------
  1295. #define CRYPT_HASH_ALG_OID_GROUP_ID             1
  1296. #define CRYPT_ENCRYPT_ALG_OID_GROUP_ID          2
  1297. #define CRYPT_PUBKEY_ALG_OID_GROUP_ID           3
  1298. #define CRYPT_SIGN_ALG_OID_GROUP_ID             4
  1299. #define CRYPT_RDN_ATTR_OID_GROUP_ID             5
  1300. #define CRYPT_EXT_OR_ATTR_OID_GROUP_ID          6
  1301. #define CRYPT_ENHKEY_USAGE_OID_GROUP_ID         7
  1302. #define CRYPT_POLICY_OID_GROUP_ID               8
  1303. #define CRYPT_TEMPLATE_OID_GROUP_ID             9
  1304. #define CRYPT_LAST_OID_GROUP_ID                 9
  1305. #define CRYPT_FIRST_ALG_OID_GROUP_ID            CRYPT_HASH_ALG_OID_GROUP_ID
  1306. #define CRYPT_LAST_ALG_OID_GROUP_ID             CRYPT_SIGN_ALG_OID_GROUP_ID
  1307. // The CRYPT_*_ALG_OID_GROUP_ID's have an Algid. The CRYPT_RDN_ATTR_OID_GROUP_ID
  1308. // has a dwLength. The CRYPT_EXT_OR_ATTR_OID_GROUP_ID,
  1309. // CRYPT_ENHKEY_USAGE_OID_GROUP_ID, CRYPT_POLICY_OID_GROUP_ID or
  1310. // CRYPT_TEMPLATE_OID_GROUP_ID don't have a dwValue.
  1311. //
  1312. // CRYPT_PUBKEY_ALG_OID_GROUP_ID has the following optional ExtraInfo:
  1313. //  DWORD[0] - Flags. CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG can be set to
  1314. //             inhibit the reformatting of the signature before
  1315. //             CryptVerifySignature is called or after CryptSignHash
  1316. //             is called. CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG can
  1317. //             be set to include the public key algorithm's parameters
  1318. //             in the PKCS7's digestEncryptionAlgorithm's parameters.
  1319. //             CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG can be set to omit
  1320. //             NULL parameters when encoding.
  1321. #define CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG     0x1
  1322. #define CRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAG    0x2
  1323. #define CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG       0x4
  1324. // CRYPT_SIGN_ALG_OID_GROUP_ID has the following optional ExtraInfo:
  1325. //  DWORD[0] - Public Key Algid.
  1326. //  DWORD[1] - Flags. Same as above for CRYPT_PUBKEY_ALG_OID_GROUP_ID.
  1327. //  DWORD[2] - Optional CryptAcquireContext(CRYPT_VERIFYCONTEXT)'s dwProvType.
  1328. //             If omitted or 0, uses Public Key Algid to select
  1329. //             appropriate dwProvType for signature verification.
  1330. // CRYPT_RDN_ATTR_OID_GROUP_ID has the following optional ExtraInfo:
  1331. //  Array of DWORDs:
  1332. //   [0 ..] - Null terminated list of acceptable RDN attribute
  1333. //            value types. An empty list implies CERT_RDN_PRINTABLE_STRING,
  1334. //            CERT_RDN_UNICODE_STRING, 0.
  1335. //+-------------------------------------------------------------------------
  1336. //  Find OID information. Returns NULL if unable to find any information
  1337. //  for the specified key and group. Note, returns a pointer to a constant
  1338. //  data structure. The returned pointer MUST NOT be freed.
  1339. //
  1340. //  dwKeyType's:
  1341. //    CRYPT_OID_INFO_OID_KEY, pvKey points to a szOID
  1342. //    CRYPT_OID_INFO_NAME_KEY, pvKey points to a wszName
  1343. //    CRYPT_OID_INFO_ALGID_KEY, pvKey points to an ALG_ID
  1344. //    CRYPT_OID_INFO_SIGN_KEY, pvKey points to an array of two ALG_ID's:
  1345. //      ALG_ID[0] - Hash Algid
  1346. //      ALG_ID[1] - PubKey Algid
  1347. //
  1348. //  Setting dwGroupId to 0, searches all groups according to the dwKeyType.
  1349. //  Otherwise, only the dwGroupId is searched.
  1350. //--------------------------------------------------------------------------
  1351. WINCRYPT32API
  1352. PCCRYPT_OID_INFO
  1353. WINAPI
  1354. CryptFindOIDInfo(
  1355.     IN DWORD dwKeyType,
  1356.     IN void *pvKey,
  1357.     IN DWORD dwGroupId
  1358.     );
  1359. #define CRYPT_OID_INFO_OID_KEY           1
  1360. #define CRYPT_OID_INFO_NAME_KEY          2
  1361. #define CRYPT_OID_INFO_ALGID_KEY         3
  1362. #define CRYPT_OID_INFO_SIGN_KEY          4
  1363. //+-------------------------------------------------------------------------
  1364. //  Register OID information. The OID information specified in the
  1365. //  CCRYPT_OID_INFO structure is persisted to the registry.
  1366. //
  1367. //  crypt32.dll contains information for the commonly known OIDs. This function
  1368. //  allows applications to augment crypt32.dll's OID information. During
  1369. //  CryptFindOIDInfo's first call, the registered OID information is installed.
  1370. //
  1371. //  By default the registered OID information is installed after crypt32.dll's
  1372. //  OID entries. Set CRYPT_INSTALL_OID_INFO_BEFORE_FLAG to install before.
  1373. //--------------------------------------------------------------------------
  1374. WINCRYPT32API
  1375. BOOL
  1376. WINAPI
  1377. CryptRegisterOIDInfo(
  1378.     IN PCCRYPT_OID_INFO pInfo,
  1379.     IN DWORD dwFlags
  1380.     );
  1381. #define CRYPT_INSTALL_OID_INFO_BEFORE_FLAG  1
  1382. //+-------------------------------------------------------------------------
  1383. //  Unregister OID information. Only the pszOID and dwGroupId fields are
  1384. //  used to identify the OID information to be unregistered.
  1385. //--------------------------------------------------------------------------
  1386. WINCRYPT32API
  1387. BOOL
  1388. WINAPI
  1389. CryptUnregisterOIDInfo(
  1390.     IN PCCRYPT_OID_INFO pInfo
  1391.     );
  1392. // If the callback returns FALSE, stops the enumeration.
  1393. typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_INFO)(
  1394.     IN PCCRYPT_OID_INFO pInfo,
  1395.     IN void *pvArg
  1396.     );
  1397. //+-------------------------------------------------------------------------
  1398. //  Enumerate the OID information.
  1399. //
  1400. //  pfnEnumOIDInfo is called for each OID information entry.
  1401. //
  1402. //  Setting dwGroupId to 0 matches all groups. Otherwise, only enumerates
  1403. //  entries in the specified group.
  1404. //
  1405. //  dwFlags currently isn't used and must be set to 0.
  1406. //--------------------------------------------------------------------------
  1407. WINCRYPT32API
  1408. BOOL
  1409. WINAPI
  1410. CryptEnumOIDInfo(
  1411.     IN DWORD dwGroupId,
  1412.     IN DWORD dwFlags,
  1413.     IN void *pvArg,
  1414.     IN PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo
  1415.     );
  1416. //+-------------------------------------------------------------------------
  1417. //  Find the localized name for the specified name. For example, find the
  1418. //  localized name for the "Root" system store name. A case insensitive
  1419. //  string comparison is done.
  1420. //
  1421. //  Returns NULL if unable to find the the specified name.
  1422. //
  1423. //  Localized names for the predefined system stores ("Root", "My") and
  1424. //  predefined physical stores (".Default", ".LocalMachine") are pre-installed
  1425. //  as resource strings in crypt32.dll. CryptSetOIDFunctionValue can be called
  1426. //  as follows to register additional localized strings:
  1427. //      dwEncodingType = CRYPT_LOCALIZED_NAME_ENCODING_TYPE
  1428. //      pszFuncName = CRYPT_OID_FIND_LOCALIZED_NAME_FUNC
  1429. //      pszOID = CRYPT_LOCALIZED_NAME_OID
  1430. //      pwszValueName = Name to be localized, for example, L"ApplicationStore"
  1431. //      dwValueType = REG_SZ
  1432. //      pbValueData = pointer to the UNICODE localized string
  1433. //      cbValueData = (wcslen(UNICODE localized string) + 1) * sizeof(WCHAR)
  1434. //
  1435. //  To unregister, set pbValueData to NULL and cbValueData to 0.
  1436. //
  1437. //  The registered names are searched before the pre-installed names.
  1438. //--------------------------------------------------------------------------
  1439. WINCRYPT32API
  1440. LPCWSTR
  1441. WINAPI
  1442. CryptFindLocalizedName(
  1443.     IN LPCWSTR pwszCryptName
  1444.     );
  1445. #define CRYPT_LOCALIZED_NAME_ENCODING_TYPE  0
  1446. #define CRYPT_LOCALIZED_NAME_OID            "LocalizedNames"
  1447. //+=========================================================================
  1448. //  Low Level Cryptographic Message Data Structures and APIs
  1449. //==========================================================================
  1450. typedef void *HCRYPTMSG;
  1451. #define szOID_PKCS_7_DATA               "1.2.840.113549.1.7.1"
  1452. #define szOID_PKCS_7_SIGNED             "1.2.840.113549.1.7.2"
  1453. #define szOID_PKCS_7_ENVELOPED          "1.2.840.113549.1.7.3"
  1454. #define szOID_PKCS_7_SIGNEDANDENVELOPED "1.2.840.113549.1.7.4"
  1455. #define szOID_PKCS_7_DIGESTED           "1.2.840.113549.1.7.5"
  1456. #define szOID_PKCS_7_ENCRYPTED          "1.2.840.113549.1.7.6"
  1457. #define szOID_PKCS_9_CONTENT_TYPE       "1.2.840.113549.1.9.3"
  1458. #define szOID_PKCS_9_MESSAGE_DIGEST     "1.2.840.113549.1.9.4"
  1459. //+-------------------------------------------------------------------------
  1460. //  Message types
  1461. //--------------------------------------------------------------------------
  1462. #define CMSG_DATA                    1
  1463. #define CMSG_SIGNED                  2
  1464. #define CMSG_ENVELOPED               3
  1465. #define CMSG_SIGNED_AND_ENVELOPED    4
  1466. #define CMSG_HASHED                  5
  1467. #define CMSG_ENCRYPTED               6
  1468. //+-------------------------------------------------------------------------
  1469. //  Message Type Bit Flags
  1470. //--------------------------------------------------------------------------
  1471. #define CMSG_ALL_FLAGS                   (~0UL)
  1472. #define CMSG_DATA_FLAG                   (1 << CMSG_DATA)
  1473. #define CMSG_SIGNED_FLAG                 (1 << CMSG_SIGNED)
  1474. #define CMSG_ENVELOPED_FLAG              (1 << CMSG_ENVELOPED)
  1475. #define CMSG_SIGNED_AND_ENVELOPED_FLAG   (1 << CMSG_SIGNED_AND_ENVELOPED)
  1476. #define CMSG_HASHED_FLAG                 (1 << CMSG_HASHED)
  1477. #define CMSG_ENCRYPTED_FLAG              (1 << CMSG_ENCRYPTED)
  1478. //+-------------------------------------------------------------------------
  1479. //  Certificate Issuer and SerialNumber
  1480. //--------------------------------------------------------------------------
  1481. typedef struct _CERT_ISSUER_SERIAL_NUMBER {
  1482.     CERT_NAME_BLOB      Issuer;
  1483.     CRYPT_INTEGER_BLOB  SerialNumber;
  1484. } CERT_ISSUER_SERIAL_NUMBER, *PCERT_ISSUER_SERIAL_NUMBER;
  1485. //+-------------------------------------------------------------------------
  1486. //  Certificate Identifier
  1487. //--------------------------------------------------------------------------
  1488. typedef struct _CERT_ID {
  1489.     DWORD   dwIdChoice;
  1490.     union {
  1491.         // CERT_ID_ISSUER_SERIAL_NUMBER
  1492.         CERT_ISSUER_SERIAL_NUMBER   IssuerSerialNumber;
  1493.         // CERT_ID_KEY_IDENTIFIER
  1494.         CRYPT_HASH_BLOB             KeyId;
  1495.         // CERT_ID_SHA1_HASH
  1496.         CRYPT_HASH_BLOB             HashId;
  1497.     };
  1498. } CERT_ID, *PCERT_ID;
  1499. #define CERT_ID_ISSUER_SERIAL_NUMBER    1
  1500. #define CERT_ID_KEY_IDENTIFIER          2
  1501. #define CERT_ID_SHA1_HASH               3
  1502. //+-------------------------------------------------------------------------
  1503. //  The message encode information (pvMsgEncodeInfo) is message type dependent
  1504. //--------------------------------------------------------------------------
  1505. //+-------------------------------------------------------------------------
  1506. //  CMSG_DATA: pvMsgEncodeInfo = NULL
  1507. //--------------------------------------------------------------------------
  1508. //+-------------------------------------------------------------------------
  1509. //  CMSG_SIGNED
  1510. //
  1511. //  The pCertInfo in the CMSG_SIGNER_ENCODE_INFO provides the Issuer, SerialNumber
  1512. //  and PublicKeyInfo.Algorithm. The PublicKeyInfo.Algorithm implicitly
  1513. //  specifies the HashEncryptionAlgorithm to be used.
  1514. //
  1515. //  If the SignerId is present with a nonzero dwIdChoice its used instead
  1516. //  of the Issuer and SerialNumber in pCertInfo.
  1517. //
  1518. //  CMS supports the KEY_IDENTIFIER and ISSUER_SERIAL_NUMBER CERT_IDs. PKCS #7
  1519. //  version 1.5 only supports the ISSUER_SERIAL_NUMBER CERT_ID choice.
  1520. //
  1521. //  If HashEncryptionAlgorithm is present and not NULL its used instead of
  1522. //  the PublicKeyInfo.Algorithm.
  1523. //
  1524. //  Note, for RSA, the hash encryption algorithm is normally the same as
  1525. //  the public key algorithm. For DSA, the hash encryption algorithm is
  1526. //  normally a DSS signature algorithm.
  1527. //
  1528. //  pvHashEncryptionAuxInfo currently isn't used and must be set to NULL if
  1529. //  present in the data structure.
  1530. //
  1531. //  The hCryptProv and dwKeySpec specify the private key to use. If dwKeySpec
  1532. //  == 0, then, defaults to AT_SIGNATURE.
  1533. //
  1534. //  If the HashEncryptionAlgorithm is set to szOID_PKIX_NO_SIGNATURE, then,
  1535. //  the signature value only contains the hash octets. hCryptProv must still
  1536. //  be specified. However, since a private key isn't used the hCryptProv can be
  1537. //  acquired using CRYPT_VERIFYCONTEXT.
  1538. //
  1539. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
  1540. //  passed to CryptMsgOpenToEncode(), the signer hCryptProv's are released.
  1541. //
  1542. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  1543. //
  1544. //  CMS signed messages allow the inclusion of Attribute Certs.
  1545. //--------------------------------------------------------------------------
  1546. typedef struct _CMSG_SIGNER_ENCODE_INFO {
  1547.     DWORD                       cbSize;
  1548.     PCERT_INFO                  pCertInfo;
  1549.     HCRYPTPROV                  hCryptProv;
  1550.     DWORD                       dwKeySpec;
  1551.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  1552.     void                        *pvHashAuxInfo;
  1553.     DWORD                       cAuthAttr;
  1554.     PCRYPT_ATTRIBUTE            rgAuthAttr;
  1555.     DWORD                       cUnauthAttr;
  1556.     PCRYPT_ATTRIBUTE            rgUnauthAttr;
  1557. #ifdef CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS
  1558.     CERT_ID                     SignerId;
  1559.     CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
  1560.     void                        *pvHashEncryptionAuxInfo;
  1561. #endif
  1562. } CMSG_SIGNER_ENCODE_INFO, *PCMSG_SIGNER_ENCODE_INFO;
  1563. typedef struct _CMSG_SIGNED_ENCODE_INFO {
  1564.     DWORD                       cbSize;
  1565.     DWORD                       cSigners;
  1566.     PCMSG_SIGNER_ENCODE_INFO    rgSigners;
  1567.     DWORD                       cCertEncoded;
  1568.     PCERT_BLOB                  rgCertEncoded;
  1569.     DWORD                       cCrlEncoded;
  1570.     PCRL_BLOB                   rgCrlEncoded;
  1571. #ifdef CMSG_SIGNED_ENCODE_INFO_HAS_CMS_FIELDS
  1572.     DWORD                       cAttrCertEncoded;
  1573.     PCERT_BLOB                  rgAttrCertEncoded;
  1574. #endif
  1575. } CMSG_SIGNED_ENCODE_INFO, *PCMSG_SIGNED_ENCODE_INFO;
  1576. //+-------------------------------------------------------------------------
  1577. //  CMSG_ENVELOPED
  1578. //
  1579. //  The PCERT_INFO for the rgRecipients provides the Issuer, SerialNumber
  1580. //  and PublicKeyInfo. The PublicKeyInfo.Algorithm implicitly
  1581. //  specifies the KeyEncryptionAlgorithm to be used.
  1582. //
  1583. //  The PublicKeyInfo.PublicKey in PCERT_INFO is used to encrypt the content
  1584. //  encryption key for the recipient.
  1585. //
  1586. //  hCryptProv is used to do the content encryption, recipient key encryption
  1587. //  and export. The hCryptProv's private keys aren't used. If hCryptProv
  1588. //  is NULL, a default hCryptProv is chosen according to the
  1589. //  ContentEncryptionAlgorithm and the first recipient KeyEncryptionAlgorithm.
  1590. //
  1591. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
  1592. //  passed to CryptMsgOpenToEncode(), the envelope's hCryptProv is released.
  1593. //
  1594. //  Note: CAPI currently doesn't support more than one KeyEncryptionAlgorithm
  1595. //  per provider. This will need to be fixed.
  1596. //
  1597. //  Currently, pvEncryptionAuxInfo is only defined for RC2 or RC4 encryption
  1598. //  algorithms. Otherwise, its not used and must be set to NULL.
  1599. //  See CMSG_RC2_AUX_INFO for the RC2 encryption algorithms.
  1600. //  See CMSG_RC4_AUX_INFO for the RC4 encryption algorithms.
  1601. //
  1602. //  To enable SP3 compatible encryption, pvEncryptionAuxInfo should point to
  1603. //  a CMSG_SP3_COMPATIBLE_AUX_INFO data structure.
  1604. //
  1605. //  To enable the CMS envelope enhancements, rgpRecipients must be set to
  1606. //  NULL, and rgCmsRecipients updated to point to an array of
  1607. //  CMSG_RECIPIENT_ENCODE_INFO's.
  1608. //
  1609. //  Also, CMS envelope enhancements support the inclusion of a bag of
  1610. //  Certs, CRLs, Attribute Certs and/or Unprotected Attributes.
  1611. //--------------------------------------------------------------------------
  1612. typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO,
  1613.     *PCMSG_RECIPIENT_ENCODE_INFO;
  1614. typedef struct _CMSG_ENVELOPED_ENCODE_INFO {
  1615.     DWORD                       cbSize;
  1616.     HCRYPTPROV                  hCryptProv;
  1617.     CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
  1618.     void                        *pvEncryptionAuxInfo;
  1619.     DWORD                       cRecipients;
  1620.     // The following array may only be used for transport recipients identified
  1621.     // by their IssuereAndSerialNumber. If rgpRecipients != NULL, then,
  1622.     // the rgCmsRecipients must be NULL.
  1623.     PCERT_INFO                  *rgpRecipients;
  1624. #ifdef CMSG_ENVELOPED_ENCODE_INFO_HAS_CMS_FIELDS
  1625.     // If rgCmsRecipients != NULL, then, the above rgpRecipients must be
  1626.     // NULL.
  1627.     PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
  1628.     DWORD                       cCertEncoded;
  1629.     PCERT_BLOB                  rgCertEncoded;
  1630.     DWORD                       cCrlEncoded;
  1631.     PCRL_BLOB                   rgCrlEncoded;
  1632.     DWORD                       cAttrCertEncoded;
  1633.     PCERT_BLOB                  rgAttrCertEncoded;
  1634.     DWORD                       cUnprotectedAttr;
  1635.     PCRYPT_ATTRIBUTE            rgUnprotectedAttr;
  1636. #endif
  1637. } CMSG_ENVELOPED_ENCODE_INFO, *PCMSG_ENVELOPED_ENCODE_INFO;
  1638. //+-------------------------------------------------------------------------
  1639. //  Key Transport Recipient Encode Info
  1640. //
  1641. //  hCryptProv is used to do the recipient key encryption
  1642. //  and export. The hCryptProv's private keys aren't used.
  1643. //
  1644. //  If hCryptProv is NULL, then, the hCryptProv specified in
  1645. //  CMSG_ENVELOPED_ENCODE_INFO is used.
  1646. //
  1647. //  Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
  1648. //  passed to CryptMsgOpenToEncode(), this hCryptProv isn't released.
  1649. //
  1650. //  CMS supports the KEY_IDENTIFIER and ISSUER_SERIAL_NUMBER CERT_IDs. PKCS #7
  1651. //  version 1.5 only supports the ISSUER_SERIAL_NUMBER CERT_ID choice.
  1652. //--------------------------------------------------------------------------
  1653. typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO {
  1654.     DWORD                       cbSize;
  1655.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  1656.     void                        *pvKeyEncryptionAuxInfo;
  1657.     HCRYPTPROV                  hCryptProv;
  1658.     CRYPT_BIT_BLOB              RecipientPublicKey;
  1659.     CERT_ID                     RecipientId;
  1660. } CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO;
  1661. //+-------------------------------------------------------------------------
  1662. //  Key Agreement Recipient Encode Info
  1663. //
  1664. //  If hCryptProv is NULL, then, the hCryptProv specified in
  1665. //  CMSG_ENVELOPED_ENCODE_INFO is used.
  1666. //
  1667. //  For the CMSG_KEY_AGREE_STATIC_KEY_CHOICE, both the hCryptProv and
  1668. //  dwKeySpec must be specified to select the sender's private key.
  1669. //
  1670. //  Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
  1671. //  passed to CryptMsgOpenToEncode(), this hCryptProv isn't released.
  1672. //
  1673. //  CMS supports the KEY_IDENTIFIER and ISSUER_SERIAL_NUMBER CERT_IDs.
  1674. //
  1675. //  There is 1 key choice, ephemeral originator. The originator's ephemeral
  1676. //  key is generated using the public key algorithm parameters shared
  1677. //  amongst all the recipients.
  1678. //
  1679. //  There are 2 key choices: ephemeral originator or static sender. The
  1680. //  originator's ephemeral key is generated using the public key algorithm
  1681. //  parameters shared amongst all the recipients. For the static sender its
  1682. //  private key is used. The hCryptProv and dwKeySpec specify the private key.
  1683. //  The pSenderId identifies the certificate containing the sender's public key.
  1684. //
  1685. //  Currently, pvKeyEncryptionAuxInfo isn't used and must be set to NULL.
  1686. //
  1687. //  If KeyEncryptionAlgorithm.Parameters.cbData == 0, then, its Parameters
  1688. //  are updated with the encoded KeyWrapAlgorithm.
  1689. //
  1690. //  Currently, pvKeyWrapAuxInfo is only defined for algorithms with
  1691. //  RC2. Otherwise, its not used and must be set to NULL.
  1692. //  When set for RC2 algorithms, points to a CMSG_RC2_AUX_INFO containing
  1693. //  the RC2 effective key length.
  1694. //
  1695. //  Note, key agreement recipients are not supported in PKCS #7 version 1.5.
  1696. //--------------------------------------------------------------------------
  1697. typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO {
  1698.     DWORD                       cbSize;
  1699.     CRYPT_BIT_BLOB              RecipientPublicKey;
  1700.     CERT_ID                     RecipientId;
  1701.     // Following fields are optional and only applicable to KEY_IDENTIFIER
  1702.     // CERT_IDs.
  1703.     FILETIME                    Date;
  1704.     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
  1705. } CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO,
  1706.     *PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO;
  1707. typedef struct _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO {
  1708.     DWORD                       cbSize;
  1709.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  1710.     void                        *pvKeyEncryptionAuxInfo;
  1711.     CRYPT_ALGORITHM_IDENTIFIER  KeyWrapAlgorithm;
  1712.     void                        *pvKeyWrapAuxInfo;
  1713.     // The following hCryptProv and dwKeySpec must be specified for the
  1714.     // CMSG_KEY_AGREE_STATIC_KEY_CHOICE.
  1715.     //
  1716.     // For CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE, dwKeySpec isn't applicable
  1717.     // and hCryptProv is optional.
  1718.     HCRYPTPROV                  hCryptProv;
  1719.     DWORD                       dwKeySpec;
  1720.     DWORD                       dwKeyChoice;
  1721.     union {
  1722.         // CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE
  1723.         //
  1724.         // The ephemeral public key algorithm and parameters.
  1725.         PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm;
  1726.         // CMSG_KEY_AGREE_STATIC_KEY_CHOICE
  1727.         //
  1728.         // The CertId of the sender's certificate
  1729.         PCERT_ID                    pSenderId;
  1730.     };
  1731.     CRYPT_DATA_BLOB             UserKeyingMaterial;     // OPTIONAL
  1732.     DWORD                                       cRecipientEncryptedKeys;
  1733.     PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO   *rgpRecipientEncryptedKeys;
  1734. } CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO;
  1735. #define CMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICE         1
  1736. #define CMSG_KEY_AGREE_STATIC_KEY_CHOICE            2
  1737. //+-------------------------------------------------------------------------
  1738. //  Mail List Recipient Encode Info
  1739. //
  1740. //  There is 1 choice for the KeyEncryptionKey: an already created CSP key
  1741. //  handle. For the key handle choice, hCryptProv must be nonzero. This key
  1742. //  handle isn't destroyed.
  1743. //
  1744. //  Note, even if CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
  1745. //  passed to CryptMsgOpenToEncode(), this hCryptProv isn't released.
  1746. //
  1747. //  Currently, pvKeyEncryptionAuxInfo is only defined for RC2 key wrap
  1748. //  algorithms. Otherwise, its not used and must be set to NULL.
  1749. //  When set for RC2 algorithms, points to a CMSG_RC2_AUX_INFO containing
  1750. //  the RC2 effective key length.
  1751. //
  1752. //  Note, mail list recipients are not supported in PKCS #7 version 1.5.
  1753. //--------------------------------------------------------------------------
  1754. typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO {
  1755.     DWORD                       cbSize;
  1756.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  1757.     void                        *pvKeyEncryptionAuxInfo;
  1758.     HCRYPTPROV                  hCryptProv;
  1759.     DWORD                       dwKeyChoice;
  1760.     union {
  1761.         // CMSG_MAIL_LIST_HANDLE_KEY_CHOICE
  1762.         HCRYPTKEY                   hKeyEncryptionKey;
  1763.         // Reserve space for a potential pointer choice
  1764.         void                        *pvKeyEncryptionKey;
  1765.     };
  1766.     CRYPT_DATA_BLOB             KeyId;
  1767.     // Following fields are optional.
  1768.     FILETIME                    Date;
  1769.     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
  1770. } CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO, *PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO;
  1771. #define CMSG_MAIL_LIST_HANDLE_KEY_CHOICE    1
  1772. //+-------------------------------------------------------------------------
  1773. //  Recipient Encode Info
  1774. //
  1775. //  Note, only key transport recipients are supported in PKCS #7 version 1.5.
  1776. //--------------------------------------------------------------------------
  1777. struct _CMSG_RECIPIENT_ENCODE_INFO {
  1778.     DWORD   dwRecipientChoice;
  1779.     union {
  1780.         // CMSG_KEY_TRANS_RECIPIENT
  1781.         PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO   pKeyTrans;
  1782.         // CMSG_KEY_AGREE_RECIPIENT
  1783.         PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO   pKeyAgree;
  1784.         // CMSG_MAIL_LIST_RECIPIENT
  1785.         PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO   pMailList;
  1786.     };
  1787. };
  1788. #define CMSG_KEY_TRANS_RECIPIENT         1
  1789. #define CMSG_KEY_AGREE_RECIPIENT         2
  1790. #define CMSG_MAIL_LIST_RECIPIENT         3
  1791. //+-------------------------------------------------------------------------
  1792. //  CMSG_RC2_AUX_INFO
  1793. //
  1794. //  AuxInfo for RC2 encryption algorithms. The pvEncryptionAuxInfo field
  1795. //  in CMSG_ENCRYPTED_ENCODE_INFO should be updated to point to this
  1796. //  structure. If not specified, defaults to 40 bit.
  1797. //
  1798. //  Note, this AuxInfo is only used when, the ContentEncryptionAlgorithm's
  1799. //  Parameter.cbData is zero. Otherwise, the Parameters is decoded to
  1800. //  get the bit length.
  1801. //
  1802. //  If CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG is set in dwBitLen, then, SP3
  1803. //  compatible encryption is done and the bit length is ignored.
  1804. //--------------------------------------------------------------------------
  1805. typedef struct _CMSG_RC2_AUX_INFO {
  1806.     DWORD                       cbSize;
  1807.     DWORD                       dwBitLen;
  1808. } CMSG_RC2_AUX_INFO, *PCMSG_RC2_AUX_INFO;
  1809. //+-------------------------------------------------------------------------
  1810. //  CMSG_SP3_COMPATIBLE_AUX_INFO
  1811. //
  1812. //  AuxInfo for enabling SP3 compatible encryption.
  1813. //
  1814. //  The CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG is set in dwFlags to enable SP3
  1815. //  compatible encryption. When set, uses zero salt instead of no salt,
  1816. //  the encryption algorithm parameters are NULL instead of containing the
  1817. //  encoded RC2 parameters or encoded IV octet string and the encrypted
  1818. //  symmetric key is encoded little endian instead of big endian.
  1819. //--------------------------------------------------------------------------
  1820. typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO {
  1821.     DWORD                       cbSize;
  1822.     DWORD                       dwFlags;
  1823. } CMSG_SP3_COMPATIBLE_AUX_INFO, *PCMSG_SP3_COMPATIBLE_AUX_INFO;
  1824. #define CMSG_SP3_COMPATIBLE_ENCRYPT_FLAG    0x80000000
  1825. //+-------------------------------------------------------------------------
  1826. //  CMSG_RC4_AUX_INFO
  1827. //
  1828. //  AuxInfo for RC4 encryption algorithms. The pvEncryptionAuxInfo field
  1829. //  in CMSG_ENCRYPTED_ENCODE_INFO should be updated to point to this
  1830. //  structure. If not specified, uses the CSP's default bit length with no
  1831. //  salt. Note, the base CSP has a 40 bit default and the enhanced CSP has
  1832. //  a 128 bit default.
  1833. //
  1834. //  If CMSG_RC4_NO_SALT_FLAG is set in dwBitLen, then, no salt is generated.
  1835. //  Otherwise, (128 - dwBitLen)/8 bytes of salt are generated and encoded
  1836. //  as an OCTET STRING in the algorithm parameters field.
  1837. //--------------------------------------------------------------------------
  1838. typedef struct _CMSG_RC4_AUX_INFO {
  1839.     DWORD                       cbSize;
  1840.     DWORD                       dwBitLen;
  1841. } CMSG_RC4_AUX_INFO, *PCMSG_RC4_AUX_INFO;
  1842. #define CMSG_RC4_NO_SALT_FLAG               0x40000000
  1843. //+-------------------------------------------------------------------------
  1844. //  CMSG_SIGNED_AND_ENVELOPED
  1845. //
  1846. //  For PKCS #7, a signed and enveloped message doesn't have the
  1847. //  signer's authenticated or unauthenticated attributes. Otherwise, a
  1848. //  combination of the CMSG_SIGNED_ENCODE_INFO and CMSG_ENVELOPED_ENCODE_INFO.
  1849. //--------------------------------------------------------------------------
  1850. typedef struct _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO {
  1851.     DWORD                       cbSize;
  1852.     CMSG_SIGNED_ENCODE_INFO     SignedInfo;
  1853.     CMSG_ENVELOPED_ENCODE_INFO  EnvelopedInfo;
  1854. } CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO, *PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO;
  1855. //+-------------------------------------------------------------------------
  1856. //  CMSG_HASHED
  1857. //
  1858. //  hCryptProv is used to do the hash. Doesn't need to use a private key.
  1859. //
  1860. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags
  1861. //  passed to CryptMsgOpenToEncode(), the hCryptProv is released.
  1862. //
  1863. //  If fDetachedHash is set, then, the encoded message doesn't contain
  1864. //  any content (its treated as NULL Data)
  1865. //
  1866. //  pvHashAuxInfo currently isn't used and must be set to NULL.
  1867. //--------------------------------------------------------------------------
  1868. typedef struct _CMSG_HASHED_ENCODE_INFO {
  1869.     DWORD                       cbSize;
  1870.     HCRYPTPROV                  hCryptProv;
  1871.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  1872.     void                        *pvHashAuxInfo;
  1873. } CMSG_HASHED_ENCODE_INFO, *PCMSG_HASHED_ENCODE_INFO;
  1874. //+-------------------------------------------------------------------------
  1875. //  CMSG_ENCRYPTED
  1876. //
  1877. //  The key used to encrypt the message is identified outside of the message
  1878. //  content (for example, password).
  1879. //
  1880. //  The content input to CryptMsgUpdate has already been encrypted.
  1881. //
  1882. //  pvEncryptionAuxInfo currently isn't used and must be set to NULL.
  1883. //--------------------------------------------------------------------------
  1884. typedef struct _CMSG_ENCRYPTED_ENCODE_INFO {
  1885.     DWORD                       cbSize;
  1886.     CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
  1887.     void                        *pvEncryptionAuxInfo;
  1888. } CMSG_ENCRYPTED_ENCODE_INFO, *PCMSG_ENCRYPTED_ENCODE_INFO;
  1889. //+-------------------------------------------------------------------------
  1890. //  This parameter allows messages to be of variable length with streamed
  1891. //  output.
  1892. //
  1893. //  By default, messages are of a definite length and
  1894. //  CryptMsgGetParam(CMSG_CONTENT_PARAM) is
  1895. //  called to get the cryptographically processed content. Until closed,
  1896. //  the handle keeps a copy of the processed content.
  1897. //
  1898. //  With streamed output, the processed content can be freed as its streamed.
  1899. //
  1900. //  If the length of the content to be updated is known at the time of the
  1901. //  open, then, ContentLength should be set to that length. Otherwise, it
  1902. //  should be set to CMSG_INDEFINITE_LENGTH.
  1903. //--------------------------------------------------------------------------
  1904. typedef BOOL (WINAPI *PFN_CMSG_STREAM_OUTPUT)(
  1905.     IN const void *pvArg,
  1906.     IN BYTE *pbData,
  1907.     IN DWORD cbData,
  1908.     IN BOOL fFinal
  1909.     );
  1910. #define CMSG_INDEFINITE_LENGTH       (0xFFFFFFFF)
  1911. typedef struct _CMSG_STREAM_INFO {
  1912.     DWORD                   cbContent;
  1913.     PFN_CMSG_STREAM_OUTPUT  pfnStreamOutput;
  1914.     void                    *pvArg;
  1915. } CMSG_STREAM_INFO, *PCMSG_STREAM_INFO;
  1916. //+-------------------------------------------------------------------------
  1917. //  Open dwFlags
  1918. //--------------------------------------------------------------------------
  1919. #define CMSG_BARE_CONTENT_FLAG              0x00000001
  1920. #define CMSG_LENGTH_ONLY_FLAG               0x00000002
  1921. #define CMSG_DETACHED_FLAG                  0x00000004
  1922. #define CMSG_AUTHENTICATED_ATTRIBUTES_FLAG  0x00000008
  1923. #define CMSG_CONTENTS_OCTETS_FLAG           0x00000010
  1924. #define CMSG_MAX_LENGTH_FLAG                0x00000020
  1925. // When set, nonData type inner content is encapsulated within an
  1926. // OCTET STRING. Applicable to both Signed and Enveloped messages.
  1927. #define CMSG_CMS_ENCAPSULATED_CONTENT_FLAG  0x00000040
  1928. // If set, then, the hCryptProv passed to CryptMsgOpenToEncode or
  1929. // CryptMsgOpenToDecode is released on the final CryptMsgClose.
  1930. // Not released if CryptMsgOpenToEncode or CryptMsgOpenToDecode fails.
  1931. //
  1932. // Note, the envelope recipient hCryptProv's aren't released.
  1933. #define CMSG_CRYPT_RELEASE_CONTEXT_FLAG     0x00008000
  1934. //+-------------------------------------------------------------------------
  1935. //  Open a cryptographic message for encoding
  1936. //
  1937. //  If CMSG_BARE_CONTENT_FLAG is specified for a streamed message,
  1938. //  the streamed output will not have an outer ContentInfo wrapper. This
  1939. //  makes it suitable to be streamed into an enclosing message.
  1940. //
  1941. //  The pStreamInfo parameter needs to be set to stream the encoded message
  1942. //  output.
  1943. //--------------------------------------------------------------------------
  1944. WINCRYPT32API
  1945. HCRYPTMSG
  1946. WINAPI
  1947. CryptMsgOpenToEncode(
  1948.     IN DWORD dwMsgEncodingType,
  1949.     IN DWORD dwFlags,
  1950.     IN DWORD dwMsgType,
  1951.     IN void const *pvMsgEncodeInfo,
  1952.     IN OPTIONAL LPSTR pszInnerContentObjID,
  1953.     IN OPTIONAL PCMSG_STREAM_INFO pStreamInfo
  1954.     );
  1955. //+-------------------------------------------------------------------------
  1956. //  Calculate the length of an encoded cryptographic message.
  1957. //
  1958. //  Calculates the length of the encoded message given the
  1959. //  message type, encoding parameters and total length of
  1960. //  the data to be updated. Note, this might not be the exact length. However,
  1961. //  it will always be greater than or equal to the actual length.
  1962. //--------------------------------------------------------------------------
  1963. WINCRYPT32API
  1964. DWORD
  1965. WINAPI
  1966. CryptMsgCalculateEncodedLength(
  1967.     IN DWORD dwMsgEncodingType,
  1968.     IN DWORD dwFlags,
  1969.     IN DWORD dwMsgType,
  1970.     IN void const *pvMsgEncodeInfo,
  1971.     IN OPTIONAL LPSTR pszInnerContentObjID,
  1972.     IN DWORD cbData
  1973.     );
  1974. //+-------------------------------------------------------------------------
  1975. //  Open a cryptographic message for decoding
  1976. //
  1977. //  hCryptProv specifies the crypto provider to use for hashing and/or
  1978. //  decrypting the message. If hCryptProv is NULL, a default crypt provider
  1979. //  is used.
  1980. //
  1981. //  Currently pRecipientInfo isn't used and should be set to NULL.
  1982. //
  1983. //  The pStreamInfo parameter needs to be set to stream the decoded content
  1984. //  output.
  1985. //--------------------------------------------------------------------------
  1986. WINCRYPT32API
  1987. HCRYPTMSG
  1988. WINAPI
  1989. CryptMsgOpenToDecode(
  1990.     IN DWORD dwMsgEncodingType,
  1991.     IN DWORD dwFlags,
  1992.     IN DWORD dwMsgType,
  1993.     IN HCRYPTPROV hCryptProv,
  1994.     IN OPTIONAL PCERT_INFO pRecipientInfo,
  1995.     IN OPTIONAL PCMSG_STREAM_INFO pStreamInfo
  1996.     );
  1997. //+-------------------------------------------------------------------------
  1998. //  Duplicate a cryptographic message handle
  1999. //--------------------------------------------------------------------------
  2000. WINCRYPT32API
  2001. HCRYPTMSG
  2002. WINAPI
  2003. CryptMsgDuplicate(
  2004.     IN HCRYPTMSG hCryptMsg
  2005.     );
  2006. //+-------------------------------------------------------------------------
  2007. //  Close a cryptographic message handle
  2008. //
  2009. //  LastError is preserved unless FALSE is returned.
  2010. //--------------------------------------------------------------------------
  2011. WINCRYPT32API
  2012. BOOL
  2013. WINAPI
  2014. CryptMsgClose(
  2015.     IN HCRYPTMSG hCryptMsg
  2016.     );
  2017. //+-------------------------------------------------------------------------
  2018. //  Update the content of a cryptographic message. Depending on how the
  2019. //  message was opened, the content is either encoded or decoded.
  2020. //
  2021. //  This function is repetitively called to append to the message content.
  2022. //  fFinal is set to identify the last update. On fFinal, the encode/decode
  2023. //  is completed. The encoded/decoded content and the decoded parameters
  2024. //  are valid until the open and all duplicated handles are closed.
  2025. //--------------------------------------------------------------------------
  2026. WINCRYPT32API
  2027. BOOL
  2028. WINAPI
  2029. CryptMsgUpdate(
  2030.     IN HCRYPTMSG hCryptMsg,
  2031.     IN const BYTE *pbData,
  2032.     IN DWORD cbData,
  2033.     IN BOOL fFinal
  2034.     );
  2035. //+-------------------------------------------------------------------------
  2036. //  Get a parameter after encoding/decoding a cryptographic message. Called
  2037. //  after the final CryptMsgUpdate. Only the CMSG_CONTENT_PARAM and
  2038. //  CMSG_COMPUTED_HASH_PARAM are valid for an encoded message.
  2039. //
  2040. //  For an encoded HASHED message, the CMSG_COMPUTED_HASH_PARAM can be got
  2041. //  before any CryptMsgUpdates to get its length.
  2042. //
  2043. //  The pvData type definition depends on the dwParamType value.
  2044. //
  2045. //  Elements pointed to by fields in the pvData structure follow the
  2046. //  structure. Therefore, *pcbData may exceed the size of the structure.
  2047. //
  2048. //  Upon input, if *pcbData == 0, then, *pcbData is updated with the length
  2049. //  of the data and the pvData parameter is ignored.
  2050. //
  2051. //  Upon return, *pcbData is updated with the length of the data.
  2052. //
  2053. //  The OBJID BLOBs returned in the pvData structures point to
  2054. //  their still encoded representation. The appropriate functions
  2055. //  must be called to decode the information.
  2056. //
  2057. //  See below for a list of the parameters to get.
  2058. //--------------------------------------------------------------------------
  2059. WINCRYPT32API
  2060. BOOL
  2061. WINAPI
  2062. CryptMsgGetParam(
  2063.     IN HCRYPTMSG hCryptMsg,
  2064.     IN DWORD dwParamType,
  2065.     IN DWORD dwIndex,
  2066.     OUT void *pvData,
  2067.     IN OUT DWORD *pcbData
  2068.     );
  2069. //+-------------------------------------------------------------------------
  2070. //  Get parameter types and their corresponding data structure definitions.
  2071. //--------------------------------------------------------------------------
  2072. #define CMSG_TYPE_PARAM                              1
  2073. #define CMSG_CONTENT_PARAM                           2
  2074. #define CMSG_BARE_CONTENT_PARAM                      3
  2075. #define CMSG_INNER_CONTENT_TYPE_PARAM                4
  2076. #define CMSG_SIGNER_COUNT_PARAM                      5
  2077. #define CMSG_SIGNER_INFO_PARAM                       6
  2078. #define CMSG_SIGNER_CERT_INFO_PARAM                  7
  2079. #define CMSG_SIGNER_HASH_ALGORITHM_PARAM             8
  2080. #define CMSG_SIGNER_AUTH_ATTR_PARAM                  9
  2081. #define CMSG_SIGNER_UNAUTH_ATTR_PARAM                10
  2082. #define CMSG_CERT_COUNT_PARAM                        11
  2083. #define CMSG_CERT_PARAM                              12
  2084. #define CMSG_CRL_COUNT_PARAM                         13
  2085. #define CMSG_CRL_PARAM                               14
  2086. #define CMSG_ENVELOPE_ALGORITHM_PARAM                15
  2087. #define CMSG_RECIPIENT_COUNT_PARAM                   17
  2088. #define CMSG_RECIPIENT_INDEX_PARAM                   18
  2089. #define CMSG_RECIPIENT_INFO_PARAM                    19
  2090. #define CMSG_HASH_ALGORITHM_PARAM                    20
  2091. #define CMSG_HASH_DATA_PARAM                         21
  2092. #define CMSG_COMPUTED_HASH_PARAM                     22
  2093. #define CMSG_ENCRYPT_PARAM                           26
  2094. #define CMSG_ENCRYPTED_DIGEST                        27
  2095. #define CMSG_ENCODED_SIGNER                          28
  2096. #define CMSG_ENCODED_MESSAGE                         29
  2097. #define CMSG_VERSION_PARAM                           30
  2098. #define CMSG_ATTR_CERT_COUNT_PARAM                   31
  2099. #define CMSG_ATTR_CERT_PARAM                         32
  2100. #define CMSG_CMS_RECIPIENT_COUNT_PARAM               33
  2101. #define CMSG_CMS_RECIPIENT_INDEX_PARAM               34
  2102. #define CMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAM 35
  2103. #define CMSG_CMS_RECIPIENT_INFO_PARAM                36
  2104. #define CMSG_UNPROTECTED_ATTR_PARAM                  37
  2105. #define CMSG_SIGNER_CERT_ID_PARAM                    38
  2106. #define CMSG_CMS_SIGNER_INFO_PARAM                   39
  2107. //+-------------------------------------------------------------------------
  2108. //  CMSG_TYPE_PARAM
  2109. //
  2110. //  The type of the decoded message.
  2111. //
  2112. //  pvData points to a DWORD
  2113. //--------------------------------------------------------------------------
  2114. //+-------------------------------------------------------------------------
  2115. //  CMSG_CONTENT_PARAM
  2116. //
  2117. //  The encoded content of a cryptographic message. Depending on how the
  2118. //  message was opened, the content is either the whole PKCS#7
  2119. //  message (opened to encode) or the inner content (opened to decode).
  2120. //  In the decode case, the decrypted content is returned, if enveloped.
  2121. //  If not enveloped, and if the inner content is of type DATA, the returned
  2122. //  data is the contents octets of the inner content.
  2123. //
  2124. //  pvData points to the buffer receiving the content bytes
  2125. //--------------------------------------------------------------------------
  2126. //+-------------------------------------------------------------------------
  2127. //  CMSG_BARE_CONTENT_PARAM
  2128. //
  2129. //  The encoded content of an encoded cryptographic message, without the
  2130. //  outer layer of ContentInfo. That is, only the encoding of the
  2131. //  ContentInfo.content field is returned.
  2132. //
  2133. //  pvData points to the buffer receiving the content bytes
  2134. //--------------------------------------------------------------------------
  2135. //+-------------------------------------------------------------------------
  2136. //  CMSG_INNER_CONTENT_TYPE_PARAM
  2137. //
  2138. //  The type of the inner content of a decoded cryptographic message,
  2139. //  in the form of a NULL-terminated object identifier string
  2140. //  (eg. "1.2.840.113549.1.7.1").
  2141. //
  2142. //  pvData points to the buffer receiving the object identifier string
  2143. //--------------------------------------------------------------------------
  2144. //+-------------------------------------------------------------------------
  2145. //  CMSG_SIGNER_COUNT_PARAM
  2146. //
  2147. //  Count of signers in a SIGNED or SIGNED_AND_ENVELOPED message
  2148. //
  2149. //  pvData points to a DWORD
  2150. //--------------------------------------------------------------------------
  2151. //+-------------------------------------------------------------------------
  2152. //  CMSG_SIGNER_CERT_INFO_PARAM
  2153. //
  2154. //  To get all the signers, repetitively call CryptMsgGetParam, with
  2155. //  dwIndex set to 0 .. SignerCount - 1.
  2156. //
  2157. //  pvData points to a CERT_INFO struct.
  2158. //
  2159. //  Only the following fields have been updated in the CERT_INFO struct:
  2160. //  Issuer and SerialNumber.
  2161. //
  2162. //  Note, if the KEYID choice was selected for a CMS SignerId, then, the
  2163. //  SerialNumber is 0 and the Issuer is encoded containing a single RDN with a
  2164. //  single Attribute whose OID is szOID_KEYID_RDN, value type is
  2165. //  CERT_RDN_OCTET_STRING and value is the KEYID. When the
  2166. //  CertGetSubjectCertificateFromStore and
  2167. //  CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
  2168. //  special KEYID Issuer and SerialNumber, they do a KEYID match.
  2169. //--------------------------------------------------------------------------
  2170. //+-------------------------------------------------------------------------
  2171. //  CMSG_SIGNER_INFO_PARAM
  2172. //
  2173. //  To get all the signers, repetitively call CryptMsgGetParam, with
  2174. //  dwIndex set to 0 .. SignerCount - 1.
  2175. //
  2176. //  pvData points to a CMSG_SIGNER_INFO struct.
  2177. //
  2178. //  Note, if the KEYID choice was selected for a CMS SignerId, then, the
  2179. //  SerialNumber is 0 and the Issuer is encoded containing a single RDN with a
  2180. //  single Attribute whose OID is szOID_KEYID_RDN, value type is
  2181. //  CERT_RDN_OCTET_STRING and value is the KEYID. When the
  2182. //  CertGetSubjectCertificateFromStore and
  2183. //  CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
  2184. //  special KEYID Issuer and SerialNumber, they do a KEYID match.
  2185. //--------------------------------------------------------------------------
  2186. typedef struct _CMSG_SIGNER_INFO {
  2187.     DWORD                       dwVersion;
  2188.     CERT_NAME_BLOB              Issuer;
  2189.     CRYPT_INTEGER_BLOB          SerialNumber;
  2190.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  2191.     CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
  2192.     CRYPT_DATA_BLOB             EncryptedHash;
  2193.     CRYPT_ATTRIBUTES            AuthAttrs;
  2194.     CRYPT_ATTRIBUTES            UnauthAttrs;
  2195. } CMSG_SIGNER_INFO, *PCMSG_SIGNER_INFO;
  2196. //+-------------------------------------------------------------------------
  2197. //  CMSG_SIGNER_CERT_ID_PARAM
  2198. //
  2199. //  To get all the signers, repetitively call CryptMsgGetParam, with
  2200. //  dwIndex set to 0 .. SignerCount - 1.
  2201. //
  2202. //  pvData points to a CERT_ID struct.
  2203. //--------------------------------------------------------------------------
  2204. //+-------------------------------------------------------------------------
  2205. //  CMSG_CMS_SIGNER_INFO_PARAM
  2206. //
  2207. //  Same as CMSG_SIGNER_INFO_PARAM, except, contains SignerId instead of
  2208. //  Issuer and SerialNumber.
  2209. //
  2210. //  To get all the signers, repetitively call CryptMsgGetParam, with
  2211. //  dwIndex set to 0 .. SignerCount - 1.
  2212. //
  2213. //  pvData points to a CMSG_CMS_SIGNER_INFO struct.
  2214. //--------------------------------------------------------------------------
  2215. typedef struct _CMSG_CMS_SIGNER_INFO {
  2216.     DWORD                       dwVersion;
  2217.     CERT_ID                     SignerId;
  2218.     CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
  2219.     CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
  2220.     CRYPT_DATA_BLOB             EncryptedHash;
  2221.     CRYPT_ATTRIBUTES            AuthAttrs;
  2222.     CRYPT_ATTRIBUTES            UnauthAttrs;
  2223. } CMSG_CMS_SIGNER_INFO, *PCMSG_CMS_SIGNER_INFO;
  2224. //+-------------------------------------------------------------------------
  2225. //  CMSG_SIGNER_HASH_ALGORITHM_PARAM
  2226. //
  2227. //  This parameter specifies the HashAlgorithm that was used for the signer.
  2228. //
  2229. //  Set dwIndex to iterate through all the signers.
  2230. //
  2231. //  pvData points to an CRYPT_ALGORITHM_IDENTIFIER struct.
  2232. //--------------------------------------------------------------------------
  2233. //+-------------------------------------------------------------------------
  2234. //  CMSG_SIGNER_AUTH_ATTR_PARAM
  2235. //
  2236. //  The authenticated attributes for the signer.
  2237. //
  2238. //  Set dwIndex to iterate through all the signers.
  2239. //
  2240. //  pvData points to a CMSG_ATTR struct.
  2241. //--------------------------------------------------------------------------
  2242. typedef CRYPT_ATTRIBUTES CMSG_ATTR;
  2243. typedef CRYPT_ATTRIBUTES *PCMSG_ATTR;
  2244. //+-------------------------------------------------------------------------
  2245. //  CMSG_SIGNER_UNAUTH_ATTR_PARAM
  2246. //
  2247. //  The unauthenticated attributes for the signer.
  2248. //
  2249. //  Set dwIndex to iterate through all the signers.
  2250. //
  2251. //  pvData points to a CMSG_ATTR struct.
  2252. //--------------------------------------------------------------------------
  2253. //+-------------------------------------------------------------------------
  2254. //  CMSG_CERT_COUNT_PARAM
  2255. //
  2256. //  Count of certificates in a SIGNED or SIGNED_AND_ENVELOPED message.
  2257. //
  2258. //  CMS, also supports certificates in an ENVELOPED message.
  2259. //
  2260. //  pvData points to a DWORD
  2261. //--------------------------------------------------------------------------
  2262. //+-------------------------------------------------------------------------
  2263. //  CMSG_CERT_PARAM
  2264. //
  2265. //  To get all the certificates, repetitively call CryptMsgGetParam, with
  2266. //  dwIndex set to 0 .. CertCount - 1.
  2267. //
  2268. //  pvData points to an array of the certificate's encoded bytes.
  2269. //--------------------------------------------------------------------------
  2270. //+-------------------------------------------------------------------------
  2271. //  CMSG_CRL_COUNT_PARAM
  2272. //
  2273. //  Count of CRLs in a SIGNED or SIGNED_AND_ENVELOPED message.
  2274. //
  2275. //  CMS, also supports CRLs in an ENVELOPED message.
  2276. //
  2277. //  pvData points to a DWORD
  2278. //--------------------------------------------------------------------------
  2279. //+-------------------------------------------------------------------------
  2280. //  CMSG_CRL_PARAM
  2281. //
  2282. //  To get all the CRLs, repetitively call CryptMsgGetParam, with
  2283. //  dwIndex set to 0 .. CrlCount - 1.
  2284. //
  2285. //  pvData points to an array of the CRL's encoded bytes.
  2286. //--------------------------------------------------------------------------
  2287. //+-------------------------------------------------------------------------
  2288. //  CMSG_ENVELOPE_ALGORITHM_PARAM
  2289. //
  2290. //  The ContentEncryptionAlgorithm that was used in
  2291. //  an ENVELOPED or SIGNED_AND_ENVELOPED message.
  2292. //
  2293. //  For streaming you must be able to successfully get this parameter before
  2294. //  doing a CryptMsgControl decrypt.
  2295. //
  2296. //  pvData points to an CRYPT_ALGORITHM_IDENTIFIER struct.
  2297. //--------------------------------------------------------------------------
  2298. //+-------------------------------------------------------------------------
  2299. //  CMSG_RECIPIENT_COUNT_PARAM
  2300. //
  2301. //  Count of recipients in an ENVELOPED or SIGNED_AND_ENVELOPED message.
  2302. //
  2303. //  Count of key transport recepients.
  2304. //
  2305. //  The CMSG_CMS_RECIPIENT_COUNT_PARAM has the total count of
  2306. //  recipients (it also includes key agree and mail list recipients).
  2307. //
  2308. //  pvData points to a DWORD
  2309. //--------------------------------------------------------------------------
  2310. //+-------------------------------------------------------------------------
  2311. //  CMSG_RECIPIENT_INDEX_PARAM
  2312. //
  2313. //  Index of the recipient used to decrypt an ENVELOPED or SIGNED_AND_ENVELOPED
  2314. //  message.
  2315. //
  2316. //  Index of a key transport recipient. If a non key transport
  2317. //  recipient was used to decrypt, fails with LastError set to
  2318. //  CRYPT_E_INVALID_INDEX.
  2319. //
  2320. //  pvData points to a DWORD
  2321. //--------------------------------------------------------------------------
  2322. //+-------------------------------------------------------------------------
  2323. //  CMSG_RECIPIENT_INFO_PARAM
  2324. //
  2325. //  To get all the recipients, repetitively call CryptMsgGetParam, with
  2326. //  dwIndex set to 0 .. RecipientCount - 1.
  2327. //
  2328. //  Only returns the key transport recepients.
  2329. //
  2330. //  The CMSG_CMS_RECIPIENT_INFO_PARAM returns all recipients.
  2331. //
  2332. //  pvData points to a CERT_INFO struct.
  2333. //
  2334. //  Only the following fields have been updated in the CERT_INFO struct:
  2335. //  Issuer, SerialNumber and PublicKeyAlgorithm. The PublicKeyAlgorithm
  2336. //  specifies the KeyEncryptionAlgorithm that was used.
  2337. //
  2338. //  Note, if the KEYID choice was selected for a key transport recipient, then,
  2339. //  the SerialNumber is 0 and the Issuer is encoded containing a single RDN
  2340. //  with a single Attribute whose OID is szOID_KEYID_RDN, value type is
  2341. //  CERT_RDN_OCTET_STRING and value is the KEYID. When the
  2342. //  CertGetSubjectCertificateFromStore and
  2343. //  CertFindCertificateInStore(CERT_FIND_SUBJECT_CERT) APIs see this
  2344. //  special KEYID Issuer and SerialNumber, they do a KEYID match.
  2345. //--------------------------------------------------------------------------
  2346. //+-------------------------------------------------------------------------
  2347. //  CMSG_HASH_ALGORITHM_PARAM
  2348. //
  2349. //  The HashAlgorithm in a HASHED message.
  2350. //
  2351. //  pvData points to an CRYPT_ALGORITHM_IDENTIFIER struct.
  2352. //--------------------------------------------------------------------------
  2353. //+-------------------------------------------------------------------------
  2354. //  CMSG_HASH_DATA_PARAM
  2355. //
  2356. //  The hash in a HASHED message.
  2357. //
  2358. //  pvData points to an array of bytes.
  2359. //--------------------------------------------------------------------------
  2360. //+-------------------------------------------------------------------------
  2361. //  CMSG_COMPUTED_HASH_PARAM
  2362. //
  2363. //  The computed hash for a HASHED message.
  2364. //  This may be called for either an encoded or decoded message.
  2365. //
  2366. //  Also, the computed hash for one of the signer's in a SIGNED message.
  2367. //  It may be called for either an encoded or decoded message after the
  2368. //  final update.  Set dwIndex to iterate through all the signers.
  2369. //
  2370. //  pvData points to an array of bytes.
  2371. //--------------------------------------------------------------------------
  2372. //+-------------------------------------------------------------------------
  2373. //  CMSG_ENCRYPT_PARAM
  2374. //
  2375. //  The ContentEncryptionAlgorithm that was used in an ENCRYPTED message.
  2376. //
  2377. //  pvData points to an CRYPT_ALGORITHM_IDENTIFIER struct.
  2378. //--------------------------------------------------------------------------
  2379. //+-------------------------------------------------------------------------
  2380. //  CMSG_ENCODED_MESSAGE
  2381. //
  2382. //  The full encoded message. This is useful in the case of a decoded
  2383. //  message which has been modified (eg. a signed-data or
  2384. //  signed-and-enveloped-data message which has been countersigned).
  2385. //
  2386. //  pvData points to an array of the message's encoded bytes.
  2387. //--------------------------------------------------------------------------
  2388. //+-------------------------------------------------------------------------
  2389. //  CMSG_VERSION_PARAM
  2390. //
  2391. //  The version of the decoded message.
  2392. //
  2393. //  pvData points to a DWORD
  2394. //--------------------------------------------------------------------------
  2395. #define CMSG_SIGNED_DATA_V1                     1
  2396. #define CMSG_SIGNED_DATA_V3                     3
  2397. #define CMSG_SIGNED_DATA_PKCS_1_5_VERSION       CMSG_SIGNED_DATA_V1
  2398. #define CMSG_SIGNED_DATA_CMS_VERSION            CMSG_SIGNED_DATA_V3
  2399. #define CMSG_SIGNER_INFO_V1                     1
  2400. #define CMSG_SIGNER_INFO_V3                     3
  2401. #define CMSG_SIGNER_INFO_PKCS_1_5_VERSION       CMSG_SIGNER_INFO_V1
  2402. #define CMSG_SIGNER_INFO_CMS_VERSION            CMSG_SIGNER_INFO_V3
  2403. #define CMSG_HASHED_DATA_V0                     0
  2404. #define CMSG_HASHED_DATA_V2                     2
  2405. #define CMSG_HASHED_DATA_PKCS_1_5_VERSION       CMSG_HASHED_DATA_V0
  2406. #define CMSG_HASHED_DATA_CMS_VERSION            CMSG_HASHED_DATA_V2
  2407. #define CMSG_ENVELOPED_DATA_V0                  0
  2408. #define CMSG_ENVELOPED_DATA_V2                  2
  2409. #define CMSG_ENVELOPED_DATA_PKCS_1_5_VERSION    CMSG_ENVELOPED_DATA_V0
  2410. #define CMSG_ENVELOPED_DATA_CMS_VERSION         CMSG_ENVELOPED_DATA_V2
  2411. //+-------------------------------------------------------------------------
  2412. //  CMSG_ATTR_CERT_COUNT_PARAM
  2413. //
  2414. //  Count of attribute certificates in a SIGNED or ENVELOPED message.
  2415. //
  2416. //  pvData points to a DWORD
  2417. //--------------------------------------------------------------------------
  2418. //+-------------------------------------------------------------------------
  2419. //  CMSG_ATTR_CERT_PARAM
  2420. //
  2421. //  To get all the attribute certificates, repetitively call CryptMsgGetParam,
  2422. //  with dwIndex set to 0 .. AttrCertCount - 1.
  2423. //
  2424. //  pvData points to an array of the attribute certificate's encoded bytes.
  2425. //--------------------------------------------------------------------------
  2426. //+-------------------------------------------------------------------------
  2427. //  CMSG_CMS_RECIPIENT_COUNT_PARAM
  2428. //
  2429. //  Count of all CMS recipients in an ENVELOPED message.
  2430. //
  2431. //  pvData points to a DWORD
  2432. //--------------------------------------------------------------------------
  2433. //+-------------------------------------------------------------------------
  2434. //  CMSG_CMS_RECIPIENT_INDEX_PARAM
  2435. //
  2436. //  Index of the CMS recipient used to decrypt an ENVELOPED message.
  2437. //
  2438. //  pvData points to a DWORD
  2439. //--------------------------------------------------------------------------
  2440. //+-------------------------------------------------------------------------
  2441. //  CMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAM
  2442. //
  2443. //  For a CMS key agreement recipient, the index of the encrypted key
  2444. //  used to decrypt an ENVELOPED message.
  2445. //
  2446. //  pvData points to a DWORD
  2447. //--------------------------------------------------------------------------
  2448. //+-------------------------------------------------------------------------
  2449. //  CMSG_CMS_RECIPIENT_INFO_PARAM
  2450. //
  2451. //  To get all the CMS recipients, repetitively call CryptMsgGetParam, with
  2452. //  dwIndex set to 0 .. CmsRecipientCount - 1.
  2453. //
  2454. //  pvData points to a CMSG_CMS_RECIPIENT_INFO struct.
  2455. //--------------------------------------------------------------------------
  2456. typedef struct _CMSG_KEY_TRANS_RECIPIENT_INFO {
  2457.     DWORD                       dwVersion;
  2458.     // Currently, only ISSUER_SERIAL_NUMBER or KEYID choices
  2459.     CERT_ID                     RecipientId;
  2460.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  2461.     CRYPT_DATA_BLOB             EncryptedKey;
  2462. } CMSG_KEY_TRANS_RECIPIENT_INFO, *PCMSG_KEY_TRANS_RECIPIENT_INFO;
  2463. typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO {
  2464.     // Currently, only ISSUER_SERIAL_NUMBER or KEYID choices
  2465.     CERT_ID                     RecipientId;
  2466.     CRYPT_DATA_BLOB             EncryptedKey;
  2467.     // The following optional fields are only applicable to KEYID choice
  2468.     FILETIME                    Date;
  2469.     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
  2470. } CMSG_RECIPIENT_ENCRYPTED_KEY_INFO, *PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO;
  2471. typedef struct _CMSG_KEY_AGREE_RECIPIENT_INFO {
  2472.     DWORD                       dwVersion;
  2473.     DWORD                       dwOriginatorChoice;
  2474.     union {
  2475.         // CMSG_KEY_AGREE_ORIGINATOR_CERT
  2476.         CERT_ID                     OriginatorCertId;
  2477.         // CMSG_KEY_AGREE_ORIGINATOR_PUBLIC_KEY
  2478.         CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
  2479.     };
  2480.     CRYPT_DATA_BLOB             UserKeyingMaterial;
  2481.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  2482.     DWORD                                cRecipientEncryptedKeys;
  2483.     PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO   *rgpRecipientEncryptedKeys;
  2484. } CMSG_KEY_AGREE_RECIPIENT_INFO, *PCMSG_KEY_AGREE_RECIPIENT_INFO;
  2485. #define CMSG_KEY_AGREE_ORIGINATOR_CERT         1
  2486. #define CMSG_KEY_AGREE_ORIGINATOR_PUBLIC_KEY   2
  2487. typedef struct _CMSG_MAIL_LIST_RECIPIENT_INFO {
  2488.     DWORD                       dwVersion;
  2489.     CRYPT_DATA_BLOB             KeyId;
  2490.     CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
  2491.     CRYPT_DATA_BLOB             EncryptedKey;
  2492.     // The following fields are optional
  2493.     FILETIME                    Date;
  2494.     PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
  2495. } CMSG_MAIL_LIST_RECIPIENT_INFO, *PCMSG_MAIL_LIST_RECIPIENT_INFO;
  2496. typedef struct _CMSG_CMS_RECIPIENT_INFO {
  2497.     DWORD   dwRecipientChoice;
  2498.     union {
  2499.         // CMSG_KEY_TRANS_RECIPIENT
  2500.         PCMSG_KEY_TRANS_RECIPIENT_INFO   pKeyTrans;
  2501.         // CMSG_KEY_AGREE_RECIPIENT
  2502.         PCMSG_KEY_AGREE_RECIPIENT_INFO   pKeyAgree;
  2503.         // CMSG_MAIL_LIST_RECIPIENT
  2504.         PCMSG_MAIL_LIST_RECIPIENT_INFO   pMailList;
  2505.     };
  2506. } CMSG_CMS_RECIPIENT_INFO, *PCMSG_CMS_RECIPIENT_INFO;
  2507. // dwVersion numbers for the KeyTrans, KeyAgree and MailList recipients
  2508. #define CMSG_ENVELOPED_RECIPIENT_V0             0
  2509. #define CMSG_ENVELOPED_RECIPIENT_V2             2
  2510. #define CMSG_ENVELOPED_RECIPIENT_V3             3
  2511. #define CMSG_ENVELOPED_RECIPIENT_V4             4
  2512. #define CMSG_KEY_TRANS_PKCS_1_5_VERSION         CMSG_ENVELOPED_RECIPIENT_V0
  2513. #define CMSG_KEY_TRANS_CMS_VERSION              CMSG_ENVELOPED_RECIPIENT_V2
  2514. #define CMSG_KEY_AGREE_VERSION                  CMSG_ENVELOPED_RECIPIENT_V3
  2515. #define CMSG_MAIL_LIST_VERSION                  CMSG_ENVELOPED_RECIPIENT_V4
  2516. //+-------------------------------------------------------------------------
  2517. //  CMSG_UNPROTECTED_ATTR_PARAM
  2518. //
  2519. //  The unprotected attributes in the envelped message.
  2520. //
  2521. //  pvData points to a CMSG_ATTR struct.
  2522. //--------------------------------------------------------------------------
  2523. //+-------------------------------------------------------------------------
  2524. //  Perform a special "control" function after the final CryptMsgUpdate of a
  2525. //  encoded/decoded cryptographic message.
  2526. //
  2527. //  The dwCtrlType parameter specifies the type of operation to be performed.
  2528. //
  2529. //  The pvCtrlPara definition depends on the dwCtrlType value.
  2530. //
  2531. //  See below for a list of the control operations and their pvCtrlPara
  2532. //  type definition.
  2533. //--------------------------------------------------------------------------
  2534. WINCRYPT32API
  2535. BOOL
  2536. WINAPI
  2537. CryptMsgControl(
  2538.     IN HCRYPTMSG hCryptMsg,
  2539.     IN DWORD dwFlags,
  2540.     IN DWORD dwCtrlType,
  2541.     IN void const *pvCtrlPara
  2542.     );
  2543. //+-------------------------------------------------------------------------
  2544. //  Message control types
  2545. //--------------------------------------------------------------------------
  2546. #define CMSG_CTRL_VERIFY_SIGNATURE       1
  2547. #define CMSG_CTRL_DECRYPT                2
  2548. #define CMSG_CTRL_VERIFY_HASH            5
  2549. #define CMSG_CTRL_ADD_SIGNER             6
  2550. #define CMSG_CTRL_DEL_SIGNER             7
  2551. #define CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR 8
  2552. #define CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR 9
  2553. #define CMSG_CTRL_ADD_CERT               10
  2554. #define CMSG_CTRL_DEL_CERT               11
  2555. #define CMSG_CTRL_ADD_CRL                12
  2556. #define CMSG_CTRL_DEL_CRL                13
  2557. #define CMSG_CTRL_ADD_ATTR_CERT          14
  2558. #define CMSG_CTRL_DEL_ATTR_CERT          15
  2559. #define CMSG_CTRL_KEY_TRANS_DECRYPT      16
  2560. #define CMSG_CTRL_KEY_AGREE_DECRYPT      17
  2561. #define CMSG_CTRL_MAIL_LIST_DECRYPT      18
  2562. #define CMSG_CTRL_VERIFY_SIGNATURE_EX    19
  2563. #define CMSG_CTRL_ADD_CMS_SIGNER_INFO    20
  2564. //+-------------------------------------------------------------------------
  2565. //  CMSG_CTRL_VERIFY_SIGNATURE
  2566. //
  2567. //  Verify the signature of a SIGNED or SIGNED_AND_ENVELOPED
  2568. //  message after it has been decoded.
  2569. //
  2570. //  For a SIGNED_AND_ENVELOPED message, called after
  2571. //  CryptMsgControl(CMSG_CTRL_DECRYPT), if CryptMsgOpenToDecode was called
  2572. //  with a NULL pRecipientInfo.
  2573. //
  2574. //  pvCtrlPara points to a CERT_INFO struct.
  2575. //
  2576. //  The CERT_INFO contains the Issuer and SerialNumber identifying
  2577. //  the Signer of the message. The CERT_INFO also contains the
  2578. //  PublicKeyInfo
  2579. //  used to verify the signature. The cryptographic provider specified
  2580. //  in CryptMsgOpenToDecode is used.
  2581. //
  2582. //  Note, if the message contains CMS signers identified by KEYID, then,
  2583. //  the CERT_INFO's Issuer and SerialNumber is ignored and only the public
  2584. //  key is used to find a signer whose signature verifies.
  2585. //
  2586. //  The following CMSG_CTRL_VERIFY_SIGNATURE_EX should be used instead.
  2587. //--------------------------------------------------------------------------
  2588. //+-------------------------------------------------------------------------
  2589. //  CMSG_CTRL_VERIFY_SIGNATURE_EX
  2590. //
  2591. //  Verify the signature of a SIGNED message after it has been decoded.
  2592. //
  2593. //  pvCtrlPara points to the following CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA.
  2594. //
  2595. //  If hCryptProv is NULL, uses the cryptographic provider specified in
  2596. //  CryptMsgOpenToDecode. If CryptMsgOpenToDecode's hCryptProv is also NULL,
  2597. //  gets default provider according to the signer's public key OID.
  2598. //
  2599. //  dwSignerIndex is the index of the signer to use to verify the signature.
  2600. //
  2601. //  The signer can be a pointer to a CERT_PUBLIC_KEY_INFO, certificate
  2602. //  context or a chain context.
  2603. //
  2604. //  If the signer's HashEncryptionAlgorithm is szOID_PKIX_NO_SIGNATURE, then,
  2605. //  the signature is expected to contain the hash octets. Only dwSignerType
  2606. //  of CMSG_VERIFY_SIGNER_NULL may be specified to verify this no signature
  2607. //  case.
  2608. //--------------------------------------------------------------------------
  2609. typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA {
  2610.     DWORD               cbSize;
  2611.     HCRYPTPROV          hCryptProv;
  2612.     DWORD               dwSignerIndex;
  2613.     DWORD               dwSignerType;
  2614.     void                *pvSigner;
  2615. } CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA, *PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA;
  2616. // Signer Types
  2617. #define CMSG_VERIFY_SIGNER_PUBKEY                   1
  2618.     // pvSigner :: PCERT_PUBLIC_KEY_INFO
  2619. #define CMSG_VERIFY_SIGNER_CERT                     2
  2620.     // pvSigner :: PCCERT_CONTEXT
  2621. #define CMSG_VERIFY_SIGNER_CHAIN                    3
  2622.     // pvSigner :: PCCERT_CHAIN_CONTEXT
  2623. #define CMSG_VERIFY_SIGNER_NULL                     4
  2624.     // pvSigner :: NULL
  2625. //+-------------------------------------------------------------------------
  2626. //  CMSG_CTRL_DECRYPT
  2627. //
  2628. //  Decrypt an ENVELOPED or SIGNED_AND_ENVELOPED message after it has been
  2629. //  decoded.
  2630. //
  2631. //  This decrypt is only applicable to key transport recipients.
  2632. //
  2633. //  hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
  2634. //  0, defaults to AT_KEYEXCHANGE.
  2635. //
  2636. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
  2637. //  to CryptMsgControl, then, the hCryptProv is released on the final
  2638. //  CryptMsgClose. Not released if CryptMsgControl fails.
  2639. //
  2640. //  dwRecipientIndex is the index of the recipient in the message associated
  2641. //  with the hCryptProv's private key.
  2642. //
  2643. //  The dwRecipientIndex is the index of a key transport recipient.
  2644. //
  2645. //  Note, the message can only be decrypted once.
  2646. //--------------------------------------------------------------------------
  2647. typedef struct _CMSG_CTRL_DECRYPT_PARA {
  2648.     DWORD       cbSize;
  2649.     HCRYPTPROV  hCryptProv;
  2650.     DWORD       dwKeySpec;
  2651.     DWORD       dwRecipientIndex;
  2652. } CMSG_CTRL_DECRYPT_PARA, *PCMSG_CTRL_DECRYPT_PARA;
  2653. //+-------------------------------------------------------------------------
  2654. //  CMSG_CTRL_KEY_TRANS_DECRYPT
  2655. //
  2656. //  Decrypt an ENVELOPED message after it has been decoded for a key
  2657. //  transport recipient.
  2658. //
  2659. //  hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
  2660. //  0, defaults to AT_KEYEXCHANGE.
  2661. //
  2662. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
  2663. //  to CryptMsgControl, then, the hCryptProv is released on the final
  2664. //  CryptMsgClose. Not released if CryptMsgControl fails.
  2665. //
  2666. //  pKeyTrans points to the CMSG_KEY_TRANS_RECIPIENT_INFO obtained via
  2667. //  CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM)
  2668. //
  2669. //  dwRecipientIndex is the index of the recipient in the message associated
  2670. //  with the hCryptProv's private key.
  2671. //
  2672. //  Note, the message can only be decrypted once.
  2673. //--------------------------------------------------------------------------
  2674. typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA {
  2675.     DWORD                           cbSize;
  2676.     HCRYPTPROV                      hCryptProv;
  2677.     DWORD                           dwKeySpec;
  2678.     PCMSG_KEY_TRANS_RECIPIENT_INFO  pKeyTrans;
  2679.     DWORD                           dwRecipientIndex;
  2680. } CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA;
  2681. //+-------------------------------------------------------------------------
  2682. //  CMSG_CTRL_KEY_AGREE_DECRYPT
  2683. //
  2684. //  Decrypt an ENVELOPED message after it has been decoded for a key
  2685. //  agreement recipient.
  2686. //
  2687. //  hCryptProv and dwKeySpec specify the private key to use. For dwKeySpec ==
  2688. //  0, defaults to AT_KEYEXCHANGE.
  2689. //
  2690. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
  2691. //  to CryptMsgControl, then, the hCryptProv is released on the final
  2692. //  CryptMsgClose. Not released if CryptMsgControl fails.
  2693. //
  2694. //  pKeyAgree points to the CMSG_KEY_AGREE_RECIPIENT_INFO obtained via
  2695. //  CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM) for dwRecipientIndex.
  2696. //
  2697. //  dwRecipientIndex, dwRecipientEncryptedKeyIndex are the indices of the
  2698. //  recipient's encrypted key in the message associated with the hCryptProv's
  2699. //  private key.
  2700. //
  2701. //  OriginatorPublicKey is the originator's public key obtained from either
  2702. //  the originator's certificate or the CMSG_KEY_AGREE_RECIPIENT_INFO obtained
  2703. //  via the CMSG_CMS_RECIPIENT_INFO_PARAM.
  2704. //
  2705. //  Note, the message can only be decrypted once.
  2706. //--------------------------------------------------------------------------
  2707. typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA {
  2708.     DWORD                           cbSize;
  2709.     HCRYPTPROV                      hCryptProv;
  2710.     DWORD                           dwKeySpec;
  2711.     PCMSG_KEY_AGREE_RECIPIENT_INFO  pKeyAgree;
  2712.     DWORD                           dwRecipientIndex;
  2713.     DWORD                           dwRecipientEncryptedKeyIndex;
  2714.     CRYPT_BIT_BLOB                  OriginatorPublicKey;
  2715. } CMSG_CTRL_KEY_AGREE_DECRYPT_PARA, *PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA;
  2716. //+-------------------------------------------------------------------------
  2717. //  CMSG_CTRL_MAIL_LIST_DECRYPT
  2718. //
  2719. //  Decrypt an ENVELOPED message after it has been decoded for a mail
  2720. //  list recipient.
  2721. //
  2722. //  pMailList points to the CMSG_MAIL_LIST_RECIPIENT_INFO obtained via
  2723. //  CryptMsgGetParam(CMSG_CMS_RECIPIENT_INFO_PARAM) for dwRecipientIndex.
  2724. //
  2725. //  There is 1 choice for the KeyEncryptionKey: an already created CSP key
  2726. //  handle. For the key handle choice, hCryptProv must be nonzero. This key
  2727. //  handle isn't destroyed.
  2728. //
  2729. //  If CMSG_CRYPT_RELEASE_CONTEXT_FLAG is set in the dwFlags passed
  2730. //  to CryptMsgControl, then, the hCryptProv is released on the final
  2731. //  CryptMsgClose. Not released if CryptMsgControl fails.
  2732. //
  2733. //  For RC2 wrap, the effective key length is obtained from the
  2734. //  KeyEncryptionAlgorithm parameters and set on the hKeyEncryptionKey before
  2735. //  decrypting.
  2736. //
  2737. //  Note, the message can only be decrypted once.
  2738. //--------------------------------------------------------------------------
  2739. typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA {
  2740.     DWORD                           cbSize;
  2741.     HCRYPTPROV                      hCryptProv;
  2742.     PCMSG_MAIL_LIST_RECIPIENT_INFO  pMailList;
  2743.     DWORD                           dwRecipientIndex;
  2744.     DWORD                           dwKeyChoice;
  2745.     union {
  2746.         // CMSG_MAIL_LIST_HANDLE_KEY_CHOICE
  2747.         HCRYPTKEY                       hKeyEncryptionKey;
  2748.         // Reserve space for a potential pointer choice
  2749.         void                            *pvKeyEncryptionKey;
  2750.     };
  2751. } CMSG_CTRL_MAIL_LIST_DECRYPT_PARA, *PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA;
  2752. //+-------------------------------------------------------------------------
  2753. //  CMSG_CTRL_VERIFY_HASH
  2754. //
  2755. //  Verify the hash of a HASHED message after it has been decoded.
  2756. //
  2757. //  Only the hCryptMsg parameter is used, to specify the message whose
  2758. //  hash is being verified.
  2759. //--------------------------------------------------------------------------
  2760. //+-------------------------------------------------------------------------
  2761. //  CMSG_CTRL_ADD_SIGNER
  2762. //
  2763. //  Add a signer to a signed-data message.
  2764. //
  2765. //  pvCtrlPara points to a CMSG_SIGNER_ENCODE_INFO.
  2766. //--------------------------------------------------------------------------
  2767. //+-------------------------------------------------------------------------
  2768. //  CMSG_CTRL_ADD_CMS_SIGNER_INFO
  2769. //
  2770. //  Add a signer to a signed-data message.
  2771. //
  2772. //  Differs from the above, CMSG_CTRL_ADD_SIGNER, wherein, the signer info
  2773. //  already contains the signature.
  2774. //
  2775. //  pvCtrlPara points to a CMSG_CMS_SIGNER_INFO.
  2776. //--------------------------------------------------------------------------
  2777. //+-------------------------------------------------------------------------
  2778. //  CMSG_CTRL_DEL_SIGNER
  2779. //
  2780. //  Remove a signer from a signed-data or signed-and-enveloped-data message.
  2781. //
  2782. //  pvCtrlPara points to a DWORD containing the 0-based index of the
  2783. //  signer to be removed.
  2784. //--------------------------------------------------------------------------
  2785. //+-------------------------------------------------------------------------
  2786. //  CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR
  2787. //
  2788. //  Add an unauthenticated attribute to the SignerInfo of a signed-data or
  2789. //  signed-and-enveloped-data message.
  2790. //
  2791. //  The unauthenticated attribute is input in the form of an encoded blob.
  2792. //--------------------------------------------------------------------------
  2793. typedef struct _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA {
  2794.     DWORD               cbSize;
  2795.     DWORD               dwSignerIndex;
  2796.     CRYPT_DATA_BLOB     blob;
  2797. } CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA;
  2798. //+-------------------------------------------------------------------------
  2799. //  CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR
  2800. //
  2801. //  Delete an unauthenticated attribute from the SignerInfo of a signed-data
  2802. //  or signed-and-enveloped-data message.
  2803. //
  2804. //  The unauthenticated attribute to be removed is specified by
  2805. //  a 0-based index.
  2806. //--------------------------------------------------------------------------
  2807. typedef struct _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA {
  2808.     DWORD               cbSize;
  2809.     DWORD               dwSignerIndex;
  2810.     DWORD               dwUnauthAttrIndex;
  2811. } CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA;
  2812. //+-------------------------------------------------------------------------
  2813. //  CMSG_CTRL_ADD_CERT
  2814. //
  2815. //  Add a certificate to a signed-data or signed-and-enveloped-data message.
  2816. //
  2817. //  pvCtrlPara points to a CRYPT_DATA_BLOB containing the certificate's
  2818. //  encoded bytes.
  2819. //--------------------------------------------------------------------------