/base/Windows/Inc/WinCrypt.h

# · C Header · 16033 lines · 6243 code · 1680 blank · 8110 comment · 19 complexity · a72a15fd90017887e75ef0fd62f33083 MD5 · raw file

Large files are truncated click here to view the full file

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992-1999.
  5. //
  6. // File: wincrypt.h
  7. //
  8. // Contents: Cryptographic API Prototypes and Definitions
  9. //
  10. //----------------------------------------------------------------------------
  11. #ifndef __WINCRYPT_H__
  12. #define __WINCRYPT_H__
  13. #if defined (_MSC_VER)
  14. #if ( _MSC_VER >= 800 )
  15. #if _MSC_VER >= 1200
  16. #pragma warning(push)
  17. #endif
  18. #pragma warning(disable:4201) /* Nameless struct/union */
  19. #endif
  20. #if (_MSC_VER > 1020)
  21. #pragma once
  22. #endif
  23. #endif
  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif
  27. #ifndef _HRESULT_DEFINED
  28. #define _HRESULT_DEFINED
  29. typedef LONG HRESULT;
  30. #endif // !_HRESULT_DEFINED
  31. #ifndef WINADVAPI
  32. #define WINADVAPI
  33. #endif
  34. #ifndef WINAPI
  35. #define WINAPI __stdcall
  36. #endif
  37. #ifndef CALLBACK
  38. #define CALLBACK __stdcall
  39. #endif
  40. #ifndef DECLSPEC_IMPORT
  41. #define DECLSPEC_IMPORT
  42. #endif
  43. #ifndef CONST
  44. #define CONST const
  45. #endif
  46. #ifndef IN
  47. #define IN
  48. #endif
  49. #ifndef OUT
  50. #define OUT
  51. #endif
  52. #ifndef OPTIONAL
  53. #define OPTIONAL
  54. #endif
  55. #if !defined(_CRYPT32_)
  56. #define WINCRYPT32API DECLSPEC_IMPORT
  57. #else
  58. #define WINCRYPT32API
  59. #endif
  60. #if !defined(_CRYPT32STRING_)
  61. # define WINCRYPT32STRINGAPI WINCRYPT32API
  62. #else
  63. # define WINCRYPT32STRINGAPI
  64. #endif
  65. //
  66. // Algorithm IDs and Flags
  67. //
  68. // ALG_ID crackers
  69. #define GET_ALG_CLASS(x) (x & (7 << 13))
  70. #define GET_ALG_TYPE(x) (x & (15 << 9))
  71. #define GET_ALG_SID(x) (x & (511))
  72. // Algorithm classes
  73. #define ALG_CLASS_ANY (0)
  74. #define ALG_CLASS_SIGNATURE (1 << 13)
  75. #define ALG_CLASS_MSG_ENCRYPT (2 << 13)
  76. #define ALG_CLASS_DATA_ENCRYPT (3 << 13)
  77. #define ALG_CLASS_HASH (4 << 13)
  78. #define ALG_CLASS_KEY_EXCHANGE (5 << 13)
  79. #define ALG_CLASS_ALL (7 << 13)
  80. // Algorithm types
  81. #define ALG_TYPE_ANY (0)
  82. #define ALG_TYPE_DSS (1 << 9)
  83. #define ALG_TYPE_RSA (2 << 9)
  84. #define ALG_TYPE_BLOCK (3 << 9)
  85. #define ALG_TYPE_STREAM (4 << 9)
  86. #define ALG_TYPE_DH (5 << 9)
  87. #define ALG_TYPE_SECURECHANNEL (6 << 9)
  88. // Generic sub-ids
  89. #define ALG_SID_ANY (0)
  90. // Some RSA sub-ids
  91. #define ALG_SID_RSA_ANY 0
  92. #define ALG_SID_RSA_PKCS 1
  93. #define ALG_SID_RSA_MSATWORK 2
  94. #define ALG_SID_RSA_ENTRUST 3
  95. #define ALG_SID_RSA_PGP 4
  96. // Some DSS sub-ids
  97. //
  98. #define ALG_SID_DSS_ANY 0
  99. #define ALG_SID_DSS_PKCS 1
  100. #define ALG_SID_DSS_DMS 2
  101. // Block cipher sub ids
  102. // DES sub_ids
  103. #define ALG_SID_DES 1
  104. #define ALG_SID_3DES 3
  105. #define ALG_SID_DESX 4
  106. #define ALG_SID_IDEA 5
  107. #define ALG_SID_CAST 6
  108. #define ALG_SID_SAFERSK64 7
  109. #define ALG_SID_SAFERSK128 8
  110. #define ALG_SID_3DES_112 9
  111. #define ALG_SID_CYLINK_MEK 12
  112. #define ALG_SID_RC5 13
  113. #define ALG_SID_AES_128 14
  114. #define ALG_SID_AES_192 15
  115. #define ALG_SID_AES_256 16
  116. #define ALG_SID_AES 17
  117. // Fortezza sub-ids
  118. #define ALG_SID_SKIPJACK 10
  119. #define ALG_SID_TEK 11
  120. // KP_MODE
  121. #define CRYPT_MODE_CBCI 6 // ANSI CBC Interleaved
  122. #define CRYPT_MODE_CFBP 7 // ANSI CFB Pipelined
  123. #define CRYPT_MODE_OFBP 8 // ANSI OFB Pipelined
  124. #define CRYPT_MODE_CBCOFM 9 // ANSI CBC + OF Masking
  125. #define CRYPT_MODE_CBCOFMI 10 // ANSI CBC + OFM Interleaved
  126. // RC2 sub-ids
  127. #define ALG_SID_RC2 2
  128. // Stream cipher sub-ids
  129. #define ALG_SID_RC4 1
  130. #define ALG_SID_SEAL 2
  131. // Diffie-Hellman sub-ids
  132. #define ALG_SID_DH_SANDF 1
  133. #define ALG_SID_DH_EPHEM 2
  134. #define ALG_SID_AGREED_KEY_ANY 3
  135. #define ALG_SID_KEA 4
  136. // Hash sub ids
  137. #define ALG_SID_MD2 1
  138. #define ALG_SID_MD4 2
  139. #define ALG_SID_MD5 3
  140. #define ALG_SID_SHA 4
  141. #define ALG_SID_SHA1 4
  142. #define ALG_SID_MAC 5
  143. #define ALG_SID_RIPEMD 6
  144. #define ALG_SID_RIPEMD160 7
  145. #define ALG_SID_SSL3SHAMD5 8
  146. #define ALG_SID_HMAC 9
  147. #define ALG_SID_TLS1PRF 10
  148. #define ALG_SID_HASH_REPLACE_OWF 11
  149. #define ALG_SID_SHA_256 12
  150. #define ALG_SID_SHA_384 13
  151. #define ALG_SID_SHA_512 14
  152. // secure channel sub ids
  153. #define ALG_SID_SSL3_MASTER 1
  154. #define ALG_SID_SCHANNEL_MASTER_HASH 2
  155. #define ALG_SID_SCHANNEL_MAC_KEY 3
  156. #define ALG_SID_PCT1_MASTER 4
  157. #define ALG_SID_SSL2_MASTER 5
  158. #define ALG_SID_TLS1_MASTER 6
  159. #define ALG_SID_SCHANNEL_ENC_KEY 7
  160. // Our silly example sub-id
  161. #define ALG_SID_EXAMPLE 80
  162. #ifndef ALGIDDEF
  163. #define ALGIDDEF
  164. typedef unsigned int ALG_ID;
  165. #endif
  166. // algorithm identifier definitions
  167. #define CALG_MD2 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2)
  168. #define CALG_MD4 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4)
  169. #define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)
  170. #define CALG_SHA (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA)
  171. #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
  172. #define CALG_MAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC)
  173. #define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY)
  174. #define CALG_DSS_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY)
  175. #define CALG_NO_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | ALG_SID_ANY)
  176. #define CALG_RSA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA_ANY)
  177. #define CALG_DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DES)
  178. #define CALG_3DES_112 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES_112)
  179. #define CALG_3DES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES)
  180. #define CALG_DESX (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DESX)
  181. #define CALG_RC2 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC2)
  182. #define CALG_RC4 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_RC4)
  183. #define CALG_SEAL (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_SEAL)
  184. #define CALG_DH_SF (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_SANDF)
  185. #define CALG_DH_EPHEM (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_EPHEM)
  186. #define CALG_AGREEDKEY_ANY (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_AGREED_KEY_ANY)
  187. #define CALG_KEA_KEYX (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_KEA)
  188. #define CALG_HUGHES_MD5 (ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_ANY|ALG_SID_MD5)
  189. #define CALG_SKIPJACK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_SKIPJACK)
  190. #define CALG_TEK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_TEK)
  191. #define CALG_CYLINK_MEK (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_CYLINK_MEK)
  192. #define CALG_SSL3_SHAMD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SSL3SHAMD5)
  193. #define CALG_SSL3_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL3_MASTER)
  194. #define CALG_SCHANNEL_MASTER_HASH (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MASTER_HASH)
  195. #define CALG_SCHANNEL_MAC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MAC_KEY)
  196. #define CALG_SCHANNEL_ENC_KEY (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_ENC_KEY)
  197. #define CALG_PCT1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_PCT1_MASTER)
  198. #define CALG_SSL2_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL2_MASTER)
  199. #define CALG_TLS1_MASTER (ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_TLS1_MASTER)
  200. #define CALG_RC5 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_RC5)
  201. #define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC)
  202. #define CALG_TLS1PRF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF)
  203. #define CALG_HASH_REPLACE_OWF (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HASH_REPLACE_OWF)
  204. #define CALG_AES_128 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_128)
  205. #define CALG_AES_192 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_192)
  206. #define CALG_AES_256 (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES_256)
  207. #define CALG_AES (ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_AES)
  208. #define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256)
  209. #define CALG_SHA_384 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_384)
  210. #define CALG_SHA_512 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_512)
  211. typedef ULONG_PTR HCRYPTPROV;
  212. typedef ULONG_PTR HCRYPTKEY;
  213. typedef ULONG_PTR HCRYPTHASH;
  214. // dwFlags definitions for CryptAcquireContext
  215. #define CRYPT_VERIFYCONTEXT 0xF0000000
  216. #define CRYPT_NEWKEYSET 0x00000008
  217. #define CRYPT_DELETEKEYSET 0x00000010
  218. #define CRYPT_MACHINE_KEYSET 0x00000020
  219. #define CRYPT_SILENT 0x00000040
  220. // dwFlag definitions for CryptGenKey
  221. #define CRYPT_EXPORTABLE 0x00000001
  222. #define CRYPT_USER_PROTECTED 0x00000002
  223. #define CRYPT_CREATE_SALT 0x00000004
  224. #define CRYPT_UPDATE_KEY 0x00000008
  225. #define CRYPT_NO_SALT 0x00000010
  226. #define CRYPT_PREGEN 0x00000040
  227. #define CRYPT_RECIPIENT 0x00000010
  228. #define CRYPT_INITIATOR 0x00000040
  229. #define CRYPT_ONLINE 0x00000080
  230. #define CRYPT_SF 0x00000100
  231. #define CRYPT_CREATE_IV 0x00000200
  232. #define CRYPT_KEK 0x00000400
  233. #define CRYPT_DATA_KEY 0x00000800
  234. #define CRYPT_VOLATILE 0x00001000
  235. #define CRYPT_SGCKEY 0x00002000
  236. #define CRYPT_ARCHIVABLE 0x00004000
  237. #define RSA1024BIT_KEY 0x04000000
  238. // dwFlags definitions for CryptDeriveKey
  239. #define CRYPT_SERVER 0x00000400
  240. #define KEY_LENGTH_MASK 0xFFFF0000
  241. // dwFlag definitions for CryptExportKey
  242. #define CRYPT_Y_ONLY 0x00000001
  243. #define CRYPT_SSL2_FALLBACK 0x00000002
  244. #define CRYPT_DESTROYKEY 0x00000004
  245. #define CRYPT_OAEP 0x00000040 // used with RSA encryptions/decryptions
  246. // CryptExportKey, CryptImportKey,
  247. // CryptEncrypt and CryptDecrypt
  248. #define CRYPT_BLOB_VER3 0x00000080 // export version 3 of a blob type
  249. #define CRYPT_IPSEC_HMAC_KEY 0x00000100 // CryptImportKey only
  250. // dwFlags definitions for CryptDecrypt
  251. // See also CRYPT_OAEP, above.
  252. // Note, the following flag is not supported for CryptEncrypt
  253. #define CRYPT_DECRYPT_RSA_NO_PADDING_CHECK 0x00000020
  254. // dwFlags definitions for CryptCreateHash
  255. #define CRYPT_SECRETDIGEST 0x00000001
  256. // dwFlags definitions for CryptHashData
  257. #define CRYPT_OWF_REPL_LM_HASH 0x00000001 // this is only for the OWF replacement CSP
  258. // dwFlags definitions for CryptHashSessionKey
  259. #define CRYPT_LITTLE_ENDIAN 0x00000001
  260. // dwFlags definitions for CryptSignHash and CryptVerifySignature
  261. #define CRYPT_NOHASHOID 0x00000001
  262. #define CRYPT_TYPE2_FORMAT 0x00000002
  263. #define CRYPT_X931_FORMAT 0x00000004
  264. // dwFlag definitions for CryptSetProviderEx and CryptGetDefaultProvider
  265. #define CRYPT_MACHINE_DEFAULT 0x00000001
  266. #define CRYPT_USER_DEFAULT 0x00000002
  267. #define CRYPT_DELETE_DEFAULT 0x00000004
  268. // exported key blob definitions
  269. #define SIMPLEBLOB 0x1
  270. #define PUBLICKEYBLOB 0x6
  271. #define PRIVATEKEYBLOB 0x7
  272. #define PLAINTEXTKEYBLOB 0x8
  273. #define OPAQUEKEYBLOB 0x9
  274. #define PUBLICKEYBLOBEX 0xA
  275. #define SYMMETRICWRAPKEYBLOB 0xB
  276. #define AT_KEYEXCHANGE 1
  277. #define AT_SIGNATURE 2
  278. #define CRYPT_USERDATA 1
  279. // dwParam
  280. #define KP_IV 1 // Initialization vector
  281. #define KP_SALT 2 // Salt value
  282. #define KP_PADDING 3 // Padding values
  283. #define KP_MODE 4 // Mode of the cipher
  284. #define KP_MODE_BITS 5 // Number of bits to feedback
  285. #define KP_PERMISSIONS 6 // Key permissions DWORD
  286. #define KP_ALGID 7 // Key algorithm
  287. #define KP_BLOCKLEN 8 // Block size of the cipher
  288. #define KP_KEYLEN 9 // Length of key in bits
  289. #define KP_SALT_EX 10 // Length of salt in bytes
  290. #define KP_P 11 // DSS/Diffie-Hellman P value
  291. #define KP_G 12 // DSS/Diffie-Hellman G value
  292. #define KP_Q 13 // DSS Q value
  293. #define KP_X 14 // Diffie-Hellman X value
  294. #define KP_Y 15 // Y value
  295. #define KP_RA 16 // Fortezza RA value
  296. #define KP_RB 17 // Fortezza RB value
  297. #define KP_INFO 18 // for putting information into an RSA envelope
  298. #define KP_EFFECTIVE_KEYLEN 19 // setting and getting RC2 effective key length
  299. #define KP_SCHANNEL_ALG 20 // for setting the Secure Channel algorithms
  300. #define KP_CLIENT_RANDOM 21 // for setting the Secure Channel client random data
  301. #define KP_SERVER_RANDOM 22 // for setting the Secure Channel server random data
  302. #define KP_RP 23
  303. #define KP_PRECOMP_MD5 24
  304. #define KP_PRECOMP_SHA 25
  305. #define KP_CERTIFICATE 26 // for setting Secure Channel certificate data (PCT1)
  306. #define KP_CLEAR_KEY 27 // for setting Secure Channel clear key data (PCT1)
  307. #define KP_PUB_EX_LEN 28
  308. #define KP_PUB_EX_VAL 29
  309. #define KP_KEYVAL 30
  310. #define KP_ADMIN_PIN 31
  311. #define KP_KEYEXCHANGE_PIN 32
  312. #define KP_SIGNATURE_PIN 33
  313. #define KP_PREHASH 34
  314. #define KP_ROUNDS 35
  315. #define KP_OAEP_PARAMS 36 // for setting OAEP params on RSA keys
  316. #define KP_CMS_KEY_INFO 37
  317. #define KP_CMS_DH_KEY_INFO 38
  318. #define KP_PUB_PARAMS 39 // for setting public parameters
  319. #define KP_VERIFY_PARAMS 40 // for verifying DSA and DH parameters
  320. #define KP_HIGHEST_VERSION 41 // for TLS protocol version setting
  321. #define KP_GET_USE_COUNT 42 // for use with PP_CRYPT_COUNT_KEY_USE contexts
  322. // KP_PADDING
  323. #define PKCS5_PADDING 1 // PKCS 5 (sec 6.2) padding method
  324. #define RANDOM_PADDING 2
  325. #define ZERO_PADDING 3
  326. // KP_MODE
  327. #define CRYPT_MODE_CBC 1 // Cipher block chaining
  328. #define CRYPT_MODE_ECB 2 // Electronic code book
  329. #define CRYPT_MODE_OFB 3 // Output feedback mode
  330. #define CRYPT_MODE_CFB 4 // Cipher feedback mode
  331. #define CRYPT_MODE_CTS 5 // Ciphertext stealing mode
  332. // KP_PERMISSIONS
  333. #define CRYPT_ENCRYPT 0x0001 // Allow encryption
  334. #define CRYPT_DECRYPT 0x0002 // Allow decryption
  335. #define CRYPT_EXPORT 0x0004 // Allow key to be exported
  336. #define CRYPT_READ 0x0008 // Allow parameters to be read
  337. #define CRYPT_WRITE 0x0010 // Allow parameters to be set
  338. #define CRYPT_MAC 0x0020 // Allow MACs to be used with key
  339. #define CRYPT_EXPORT_KEY 0x0040 // Allow key to be used for exporting keys
  340. #define CRYPT_IMPORT_KEY 0x0080 // Allow key to be used for importing keys
  341. #define CRYPT_ARCHIVE 0x0100 // Allow key to be exported at creation only
  342. #define HP_ALGID 0x0001 // Hash algorithm
  343. #define HP_HASHVAL 0x0002 // Hash value
  344. #define HP_HASHSIZE 0x0004 // Hash value size
  345. #define HP_HMAC_INFO 0x0005 // information for creating an HMAC
  346. #define HP_TLS1PRF_LABEL 0x0006 // label for TLS1 PRF
  347. #define HP_TLS1PRF_SEED 0x0007 // seed for TLS1 PRF
  348. #define CRYPT_FAILED FALSE
  349. #define CRYPT_SUCCEED TRUE
  350. #define RCRYPT_SUCCEEDED(rt) ((rt) == CRYPT_SUCCEED)
  351. #define RCRYPT_FAILED(rt) ((rt) == CRYPT_FAILED)
  352. //
  353. // CryptGetProvParam
  354. //
  355. #define PP_ENUMALGS 1
  356. #define PP_ENUMCONTAINERS 2
  357. #define PP_IMPTYPE 3
  358. #define PP_NAME 4
  359. #define PP_VERSION 5
  360. #define PP_CONTAINER 6
  361. #define PP_CHANGE_PASSWORD 7
  362. #define PP_KEYSET_SEC_DESCR 8 // get/set security descriptor of keyset
  363. #define PP_CERTCHAIN 9 // for retrieving certificates from tokens
  364. #define PP_KEY_TYPE_SUBTYPE 10
  365. #define PP_PROVTYPE 16
  366. #define PP_KEYSTORAGE 17
  367. #define PP_APPLI_CERT 18
  368. #define PP_SYM_KEYSIZE 19
  369. #define PP_SESSION_KEYSIZE 20
  370. #define PP_UI_PROMPT 21
  371. #define PP_ENUMALGS_EX 22
  372. #define PP_ENUMMANDROOTS 25
  373. #define PP_ENUMELECTROOTS 26
  374. #define PP_KEYSET_TYPE 27
  375. #define PP_ADMIN_PIN 31
  376. #define PP_KEYEXCHANGE_PIN 32
  377. #define PP_SIGNATURE_PIN 33
  378. #define PP_SIG_KEYSIZE_INC 34
  379. #define PP_KEYX_KEYSIZE_INC 35
  380. #define PP_UNIQUE_CONTAINER 36
  381. #define PP_SGC_INFO 37
  382. #define PP_USE_HARDWARE_RNG 38
  383. #define PP_KEYSPEC 39
  384. #define PP_ENUMEX_SIGNING_PROT 40
  385. #define PP_CRYPT_COUNT_KEY_USE 41
  386. #define CRYPT_FIRST 1
  387. #define CRYPT_NEXT 2
  388. #define CRYPT_SGC_ENUM 4
  389. #define CRYPT_IMPL_HARDWARE 1
  390. #define CRYPT_IMPL_SOFTWARE 2
  391. #define CRYPT_IMPL_MIXED 3
  392. #define CRYPT_IMPL_UNKNOWN 4
  393. #define CRYPT_IMPL_REMOVABLE 8
  394. // key storage flags
  395. #define CRYPT_SEC_DESCR 0x00000001
  396. #define CRYPT_PSTORE 0x00000002
  397. #define CRYPT_UI_PROMPT 0x00000004
  398. // protocol flags
  399. #define CRYPT_FLAG_PCT1 0x0001
  400. #define CRYPT_FLAG_SSL2 0x0002
  401. #define CRYPT_FLAG_SSL3 0x0004
  402. #define CRYPT_FLAG_TLS1 0x0008
  403. #define CRYPT_FLAG_IPSEC 0x0010
  404. #define CRYPT_FLAG_SIGNING 0x0020
  405. // SGC flags
  406. #define CRYPT_SGC 0x0001
  407. #define CRYPT_FASTSGC 0x0002
  408. //
  409. // CryptSetProvParam
  410. //
  411. #define PP_CLIENT_HWND 1
  412. #define PP_CONTEXT_INFO 11
  413. #define PP_KEYEXCHANGE_KEYSIZE 12
  414. #define PP_SIGNATURE_KEYSIZE 13
  415. #define PP_KEYEXCHANGE_ALG 14
  416. #define PP_SIGNATURE_ALG 15
  417. #define PP_DELETEKEY 24
  418. #define PROV_RSA_FULL 1
  419. #define PROV_RSA_SIG 2
  420. #define PROV_DSS 3
  421. #define PROV_FORTEZZA 4
  422. #define PROV_MS_EXCHANGE 5
  423. #define PROV_SSL 6
  424. #define PROV_RSA_SCHANNEL 12
  425. #define PROV_DSS_DH 13
  426. #define PROV_EC_ECDSA_SIG 14
  427. #define PROV_EC_ECNRA_SIG 15
  428. #define PROV_EC_ECDSA_FULL 16
  429. #define PROV_EC_ECNRA_FULL 17
  430. #define PROV_DH_SCHANNEL 18
  431. #define PROV_SPYRUS_LYNKS 20
  432. #define PROV_RNG 21
  433. #define PROV_INTEL_SEC 22
  434. #define PROV_REPLACE_OWF 23
  435. #define PROV_RSA_AES 24
  436. //
  437. // Provider friendly names
  438. //
  439. #define MS_DEF_PROV_A "Microsoft Base Cryptographic Provider v1.0"
  440. #define MS_DEF_PROV_W L"Microsoft Base Cryptographic Provider v1.0"
  441. #ifdef UNICODE
  442. #define MS_DEF_PROV MS_DEF_PROV_W
  443. #else
  444. #define MS_DEF_PROV MS_DEF_PROV_A
  445. #endif
  446. #define MS_ENHANCED_PROV_A "Microsoft Enhanced Cryptographic Provider v1.0"
  447. #define MS_ENHANCED_PROV_W L"Microsoft Enhanced Cryptographic Provider v1.0"
  448. #ifdef UNICODE
  449. #define MS_ENHANCED_PROV MS_ENHANCED_PROV_W
  450. #else
  451. #define MS_ENHANCED_PROV MS_ENHANCED_PROV_A
  452. #endif
  453. #define MS_STRONG_PROV_A "Microsoft Strong Cryptographic Provider"
  454. #define MS_STRONG_PROV_W L"Microsoft Strong Cryptographic Provider"
  455. #ifdef UNICODE
  456. #define MS_STRONG_PROV MS_STRONG_PROV_W
  457. #else
  458. #define MS_STRONG_PROV MS_STRONG_PROV_A
  459. #endif
  460. #define MS_DEF_RSA_SIG_PROV_A "Microsoft RSA Signature Cryptographic Provider"
  461. #define MS_DEF_RSA_SIG_PROV_W L"Microsoft RSA Signature Cryptographic Provider"
  462. #ifdef UNICODE
  463. #define MS_DEF_RSA_SIG_PROV MS_DEF_RSA_SIG_PROV_W
  464. #else
  465. #define MS_DEF_RSA_SIG_PROV MS_DEF_RSA_SIG_PROV_A
  466. #endif
  467. #define MS_DEF_RSA_SCHANNEL_PROV_A "Microsoft RSA SChannel Cryptographic Provider"
  468. #define MS_DEF_RSA_SCHANNEL_PROV_W L"Microsoft RSA SChannel Cryptographic Provider"
  469. #ifdef UNICODE
  470. #define MS_DEF_RSA_SCHANNEL_PROV MS_DEF_RSA_SCHANNEL_PROV_W
  471. #else
  472. #define MS_DEF_RSA_SCHANNEL_PROV MS_DEF_RSA_SCHANNEL_PROV_A
  473. #endif
  474. #define MS_DEF_DSS_PROV_A "Microsoft Base DSS Cryptographic Provider"
  475. #define MS_DEF_DSS_PROV_W L"Microsoft Base DSS Cryptographic Provider"
  476. #ifdef UNICODE
  477. #define MS_DEF_DSS_PROV MS_DEF_DSS_PROV_W
  478. #else
  479. #define MS_DEF_DSS_PROV MS_DEF_DSS_PROV_A
  480. #endif
  481. #define MS_DEF_DSS_DH_PROV_A "Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"
  482. #define MS_DEF_DSS_DH_PROV_W L"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"
  483. #ifdef UNICODE
  484. #define MS_DEF_DSS_DH_PROV MS_DEF_DSS_DH_PROV_W
  485. #else
  486. #define MS_DEF_DSS_DH_PROV MS_DEF_DSS_DH_PROV_A
  487. #endif
  488. #define MS_ENH_DSS_DH_PROV_A "Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider"
  489. #define MS_ENH_DSS_DH_PROV_W L"Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider"
  490. #ifdef UNICODE
  491. #define MS_ENH_DSS_DH_PROV MS_ENH_DSS_DH_PROV_W
  492. #else
  493. #define MS_ENH_DSS_DH_PROV MS_ENH_DSS_DH_PROV_A
  494. #endif
  495. #define MS_DEF_DH_SCHANNEL_PROV_A "Microsoft DH SChannel Cryptographic Provider"
  496. #define MS_DEF_DH_SCHANNEL_PROV_W L"Microsoft DH SChannel Cryptographic Provider"
  497. #ifdef UNICODE
  498. #define MS_DEF_DH_SCHANNEL_PROV MS_DEF_DH_SCHANNEL_PROV_W
  499. #else
  500. #define MS_DEF_DH_SCHANNEL_PROV MS_DEF_DH_SCHANNEL_PROV_A
  501. #endif
  502. #define MS_SCARD_PROV_A "Microsoft Base Smart Card Crypto Provider"
  503. #define MS_SCARD_PROV_W L"Microsoft Base Smart Card Crypto Provider"
  504. #ifdef UNICODE
  505. #define MS_SCARD_PROV MS_SCARD_PROV_W
  506. #else
  507. #define MS_SCARD_PROV MS_SCARD_PROV_A
  508. #endif
  509. #define MS_ENH_RSA_AES_PROV_A "Microsoft Enhanced RSA and AES Cryptographic Provider"
  510. #define MS_ENH_RSA_AES_PROV_W L"Microsoft Enhanced RSA and AES Cryptographic Provider"
  511. #ifdef UNICODE
  512. #define MS_ENH_RSA_AES_PROV MS_ENH_RSA_AES_PROV_W
  513. #else
  514. #define MS_ENH_RSA_AES_PROV MS_ENH_RSA_AES_PROV_A
  515. #endif
  516. #define MAXUIDLEN 64
  517. // Exponentiation Offload Reg Location
  518. #define EXPO_OFFLOAD_REG_VALUE "ExpoOffload"
  519. #define EXPO_OFFLOAD_FUNC_NAME "OffloadModExpo"
  520. //
  521. // Registry key in which the following private key-related
  522. // values are created.
  523. //
  524. #define szKEY_CRYPTOAPI_PRIVATE_KEY_OPTIONS \
  525. "Software\\Policies\\Microsoft\\Cryptography"
  526. //
  527. // Registry value for controlling Data Protection API (DPAPI) UI settings.
  528. //
  529. #define szFORCE_KEY_PROTECTION "ForceKeyProtection"
  530. #define dwFORCE_KEY_PROTECTION_DISABLED 0x0
  531. #define dwFORCE_KEY_PROTECTION_USER_SELECT 0x1
  532. #define dwFORCE_KEY_PROTECTION_HIGH 0x2
  533. //
  534. // Registry values for enabling and controlling the caching (and timeout)
  535. // of private keys. This feature is useful only for UI-protected private
  536. // keys.
  537. //
  538. // Note that in Windows 2000 and later, private keys, once read from storage,
  539. // are cached in the associated HCRYPTPROV structure for subsequent use.
  540. //
  541. // In .NET Server and XP SP1, new key caching behavior is available. Keys
  542. // that have been read from storage and cached may now be considered "stale"
  543. // if a period of time has elapsed since the key was last used. This forces
  544. // the key to be re-read from storage (which will make the DPAPI UI appear
  545. // again).
  546. //
  547. // To enable the new behavior, create the registry DWORD value
  548. // szKEY_CACHE_ENABLED and set it to 1. The registry DWORD value
  549. // szKEY_CACHE_SECONDS must also be created and set to the number of seconds
  550. // that a cached private key may still be considered usable.
  551. //
  552. #define szKEY_CACHE_ENABLED "CachePrivateKeys"
  553. #define szKEY_CACHE_SECONDS "PrivateKeyLifetimeSeconds"
  554. #define CUR_BLOB_VERSION 2
  555. // structure for use with CryptSetKeyParam for CMS keys
  556. // DO NOT USE THIS STRUCTURE!!!!!
  557. typedef struct _CMS_KEY_INFO {
  558. DWORD dwVersion; // sizeof(CMS_KEY_INFO)
  559. ALG_ID Algid; // algorithmm id for the key to be converted
  560. BYTE *pbOID; // pointer to OID to hash in with Z
  561. DWORD cbOID; // length of OID to hash in with Z
  562. } CMS_KEY_INFO, *PCMS_KEY_INFO;
  563. // structure for use with CryptSetHashParam with CALG_HMAC
  564. typedef struct _HMAC_Info {
  565. ALG_ID HashAlgid;
  566. BYTE *pbInnerString;
  567. DWORD cbInnerString;
  568. BYTE *pbOuterString;
  569. DWORD cbOuterString;
  570. } HMAC_INFO, *PHMAC_INFO;
  571. // structure for use with CryptSetKeyParam with KP_SCHANNEL_ALG
  572. typedef struct _SCHANNEL_ALG {
  573. DWORD dwUse;
  574. ALG_ID Algid;
  575. DWORD cBits;
  576. DWORD dwFlags;
  577. DWORD dwReserved;
  578. } SCHANNEL_ALG, *PSCHANNEL_ALG;
  579. // uses of algortihms for SCHANNEL_ALG structure
  580. #define SCHANNEL_MAC_KEY 0x00000000
  581. #define SCHANNEL_ENC_KEY 0x00000001
  582. // uses of dwFlags SCHANNEL_ALG structure
  583. #define INTERNATIONAL_USAGE 0x00000001
  584. typedef struct _PROV_ENUMALGS {
  585. ALG_ID aiAlgid;
  586. DWORD dwBitLen;
  587. DWORD dwNameLen;
  588. CHAR szName[20];
  589. } PROV_ENUMALGS;
  590. typedef struct _PROV_ENUMALGS_EX {
  591. ALG_ID aiAlgid;
  592. DWORD dwDefaultLen;
  593. DWORD dwMinLen;
  594. DWORD dwMaxLen;
  595. DWORD dwProtocols;
  596. DWORD dwNameLen;
  597. CHAR szName[20];
  598. DWORD dwLongNameLen;
  599. CHAR szLongName[40];
  600. } PROV_ENUMALGS_EX;
  601. typedef struct _PUBLICKEYSTRUC {
  602. BYTE bType;
  603. BYTE bVersion;
  604. WORD reserved;
  605. ALG_ID aiKeyAlg;
  606. } BLOBHEADER, PUBLICKEYSTRUC;
  607. typedef struct _RSAPUBKEY {
  608. DWORD magic; // Has to be RSA1
  609. DWORD bitlen; // # of bits in modulus
  610. DWORD pubexp; // public exponent
  611. // Modulus data follows
  612. } RSAPUBKEY;
  613. typedef struct _PUBKEY {
  614. DWORD magic;
  615. DWORD bitlen; // # of bits in modulus
  616. } DHPUBKEY, DSSPUBKEY, KEAPUBKEY, TEKPUBKEY;
  617. typedef struct _DSSSEED {
  618. DWORD counter;
  619. BYTE seed[20];
  620. } DSSSEED;
  621. typedef struct _PUBKEYVER3 {
  622. DWORD magic;
  623. DWORD bitlenP; // # of bits in prime modulus
  624. DWORD bitlenQ; // # of bits in prime q, 0 if not available
  625. DWORD bitlenJ; // # of bits in (p-1)/q, 0 if not available
  626. DSSSEED DSSSeed;
  627. } DHPUBKEY_VER3, DSSPUBKEY_VER3;
  628. typedef struct _PRIVKEYVER3 {
  629. DWORD magic;
  630. DWORD bitlenP; // # of bits in prime modulus
  631. DWORD bitlenQ; // # of bits in prime q, 0 if not available
  632. DWORD bitlenJ; // # of bits in (p-1)/q, 0 if not available
  633. DWORD bitlenX; // # of bits in X
  634. DSSSEED DSSSeed;
  635. } DHPRIVKEY_VER3, DSSPRIVKEY_VER3;
  636. typedef struct _KEY_TYPE_SUBTYPE {
  637. DWORD dwKeySpec;
  638. GUID Type;
  639. GUID Subtype;
  640. } KEY_TYPE_SUBTYPE, *PKEY_TYPE_SUBTYPE;
  641. typedef struct _CERT_FORTEZZA_DATA_PROP {
  642. unsigned char SerialNumber[8];
  643. int CertIndex;
  644. unsigned char CertLabel[36];
  645. } CERT_FORTEZZA_DATA_PROP;
  646. //+-------------------------------------------------------------------------
  647. // CRYPTOAPI BLOB definitions
  648. //--------------------------------------------------------------------------
  649. typedef struct _CRYPTOAPI_BLOB {
  650. DWORD cbData;
  651. BYTE *pbData;
  652. } CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB,
  653. CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB,
  654. CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB,
  655. CERT_NAME_BLOB, *PCERT_NAME_BLOB,
  656. CERT_RDN_VALUE_BLOB, *PCERT_RDN_VALUE_BLOB,
  657. CERT_BLOB, *PCERT_BLOB,
  658. CRL_BLOB, *PCRL_BLOB,
  659. DATA_BLOB, *PDATA_BLOB,
  660. CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB,
  661. CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB,
  662. CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB,
  663. CRYPT_DER_BLOB, *PCRYPT_DER_BLOB,
  664. CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;
  665. // structure for use with CryptSetKeyParam for CMS keys
  666. typedef struct _CMS_DH_KEY_INFO {
  667. DWORD dwVersion; // sizeof(CMS_DH_KEY_INFO)
  668. ALG_ID Algid; // algorithmm id for the key to be converted
  669. LPSTR pszContentEncObjId; // pointer to OID to hash in with Z
  670. CRYPT_DATA_BLOB PubInfo; // OPTIONAL - public information
  671. void *pReserved; // reserved - should be NULL
  672. } CMS_DH_KEY_INFO, *PCMS_DH_KEY_INFO;
  673. WINADVAPI
  674. BOOL
  675. WINAPI
  676. CryptAcquireContextA(
  677. HCRYPTPROV *phProv,
  678. LPCSTR szContainer,
  679. LPCSTR szProvider,
  680. DWORD dwProvType,
  681. DWORD dwFlags
  682. );
  683. WINADVAPI
  684. BOOL
  685. WINAPI
  686. CryptAcquireContextW(
  687. HCRYPTPROV *phProv,
  688. LPCWSTR szContainer,
  689. LPCWSTR szProvider,
  690. DWORD dwProvType,
  691. DWORD dwFlags
  692. );
  693. #ifdef UNICODE
  694. #define CryptAcquireContext CryptAcquireContextW
  695. #else
  696. #define CryptAcquireContext CryptAcquireContextA
  697. #endif // !UNICODE
  698. WINADVAPI
  699. BOOL
  700. WINAPI
  701. CryptReleaseContext(
  702. HCRYPTPROV hProv,
  703. DWORD dwFlags
  704. );
  705. WINADVAPI
  706. BOOL
  707. WINAPI
  708. CryptGenKey(
  709. HCRYPTPROV hProv,
  710. ALG_ID Algid,
  711. DWORD dwFlags,
  712. HCRYPTKEY *phKey
  713. );
  714. WINADVAPI
  715. BOOL
  716. WINAPI
  717. CryptDeriveKey(
  718. HCRYPTPROV hProv,
  719. ALG_ID Algid,
  720. HCRYPTHASH hBaseData,
  721. DWORD dwFlags,
  722. HCRYPTKEY *phKey
  723. );
  724. WINADVAPI
  725. BOOL
  726. WINAPI
  727. CryptDestroyKey(
  728. HCRYPTKEY hKey
  729. );
  730. WINADVAPI
  731. BOOL
  732. WINAPI
  733. CryptSetKeyParam(
  734. HCRYPTKEY hKey,
  735. DWORD dwParam,
  736. CONST BYTE *pbData,
  737. DWORD dwFlags
  738. );
  739. WINADVAPI
  740. BOOL
  741. WINAPI
  742. CryptGetKeyParam(
  743. HCRYPTKEY hKey,
  744. DWORD dwParam,
  745. BYTE *pbData,
  746. DWORD *pdwDataLen,
  747. DWORD dwFlags
  748. );
  749. WINADVAPI
  750. BOOL
  751. WINAPI
  752. CryptSetHashParam(
  753. HCRYPTHASH hHash,
  754. DWORD dwParam,
  755. CONST BYTE *pbData,
  756. DWORD dwFlags
  757. );
  758. WINADVAPI
  759. BOOL
  760. WINAPI
  761. CryptGetHashParam(
  762. HCRYPTHASH hHash,
  763. DWORD dwParam,
  764. BYTE *pbData,
  765. DWORD *pdwDataLen,
  766. DWORD dwFlags
  767. );
  768. WINADVAPI
  769. BOOL
  770. WINAPI
  771. CryptSetProvParam(
  772. HCRYPTPROV hProv,
  773. DWORD dwParam,
  774. CONST BYTE *pbData,
  775. DWORD dwFlags
  776. );
  777. WINADVAPI
  778. BOOL
  779. WINAPI
  780. CryptGetProvParam(
  781. HCRYPTPROV hProv,
  782. DWORD dwParam,
  783. BYTE *pbData,
  784. DWORD *pdwDataLen,
  785. DWORD dwFlags
  786. );
  787. WINADVAPI
  788. BOOL
  789. WINAPI
  790. CryptGenRandom(
  791. HCRYPTPROV hProv,
  792. DWORD dwLen,
  793. BYTE *pbBuffer
  794. );
  795. WINADVAPI
  796. BOOL
  797. WINAPI
  798. CryptGetUserKey(
  799. HCRYPTPROV hProv,
  800. DWORD dwKeySpec,
  801. HCRYPTKEY *phUserKey
  802. );
  803. WINADVAPI
  804. BOOL
  805. WINAPI
  806. CryptExportKey(
  807. HCRYPTKEY hKey,
  808. HCRYPTKEY hExpKey,
  809. DWORD dwBlobType,
  810. DWORD dwFlags,
  811. BYTE *pbData,
  812. DWORD *pdwDataLen
  813. );
  814. WINADVAPI
  815. BOOL
  816. WINAPI
  817. CryptImportKey(
  818. HCRYPTPROV hProv,
  819. CONST BYTE *pbData,
  820. DWORD dwDataLen,
  821. HCRYPTKEY hPubKey,
  822. DWORD dwFlags,
  823. HCRYPTKEY *phKey
  824. );
  825. WINADVAPI
  826. BOOL
  827. WINAPI
  828. CryptEncrypt(
  829. HCRYPTKEY hKey,
  830. HCRYPTHASH hHash,
  831. BOOL Final,
  832. DWORD dwFlags,
  833. BYTE *pbData,
  834. DWORD *pdwDataLen,
  835. DWORD dwBufLen
  836. );
  837. WINADVAPI
  838. BOOL
  839. WINAPI
  840. CryptDecrypt(
  841. HCRYPTKEY hKey,
  842. HCRYPTHASH hHash,
  843. BOOL Final,
  844. DWORD dwFlags,
  845. BYTE *pbData,
  846. DWORD *pdwDataLen
  847. );
  848. WINADVAPI
  849. BOOL
  850. WINAPI
  851. CryptCreateHash(
  852. HCRYPTPROV hProv,
  853. ALG_ID Algid,
  854. HCRYPTKEY hKey,
  855. DWORD dwFlags,
  856. HCRYPTHASH *phHash
  857. );
  858. WINADVAPI
  859. BOOL
  860. WINAPI
  861. CryptHashData(
  862. HCRYPTHASH hHash,
  863. CONST BYTE *pbData,
  864. DWORD dwDataLen,
  865. DWORD dwFlags
  866. );
  867. WINADVAPI
  868. BOOL
  869. WINAPI
  870. CryptHashSessionKey(
  871. HCRYPTHASH hHash,
  872. HCRYPTKEY hKey,
  873. DWORD dwFlags
  874. );
  875. WINADVAPI
  876. BOOL
  877. WINAPI
  878. CryptDestroyHash(
  879. HCRYPTHASH hHash
  880. );
  881. WINADVAPI
  882. BOOL
  883. WINAPI
  884. CryptSignHashA(
  885. HCRYPTHASH hHash,
  886. DWORD dwKeySpec,
  887. LPCSTR szDescription,
  888. DWORD dwFlags,
  889. BYTE *pbSignature,
  890. DWORD *pdwSigLen
  891. );
  892. WINADVAPI
  893. BOOL
  894. WINAPI
  895. CryptSignHashW(
  896. HCRYPTHASH hHash,
  897. DWORD dwKeySpec,
  898. LPCWSTR szDescription,
  899. DWORD dwFlags,
  900. BYTE *pbSignature,
  901. DWORD *pdwSigLen
  902. );
  903. #ifdef UNICODE
  904. #define CryptSignHash CryptSignHashW
  905. #else
  906. #define CryptSignHash CryptSignHashA
  907. #endif // !UNICODE
  908. WINADVAPI
  909. BOOL
  910. WINAPI
  911. CryptVerifySignatureA(
  912. HCRYPTHASH hHash,
  913. CONST BYTE *pbSignature,
  914. DWORD dwSigLen,
  915. HCRYPTKEY hPubKey,
  916. LPCSTR szDescription,
  917. DWORD dwFlags
  918. );
  919. WINADVAPI
  920. BOOL
  921. WINAPI
  922. CryptVerifySignatureW(
  923. HCRYPTHASH hHash,
  924. CONST BYTE *pbSignature,
  925. DWORD dwSigLen,
  926. HCRYPTKEY hPubKey,
  927. LPCWSTR szDescription,
  928. DWORD dwFlags
  929. );
  930. #ifdef UNICODE
  931. #define CryptVerifySignature CryptVerifySignatureW
  932. #else
  933. #define CryptVerifySignature CryptVerifySignatureA
  934. #endif // !UNICODE
  935. WINADVAPI
  936. BOOL
  937. WINAPI
  938. CryptSetProviderA(
  939. LPCSTR pszProvName,
  940. DWORD dwProvType
  941. );
  942. WINADVAPI
  943. BOOL
  944. WINAPI
  945. CryptSetProviderW(
  946. LPCWSTR pszProvName,
  947. DWORD dwProvType
  948. );
  949. #ifdef UNICODE
  950. #define CryptSetProvider CryptSetProviderW
  951. #else
  952. #define CryptSetProvider CryptSetProviderA
  953. #endif // !UNICODE
  954. WINADVAPI
  955. BOOL
  956. WINAPI
  957. CryptSetProviderExA(
  958. LPCSTR pszProvName,
  959. DWORD dwProvType,
  960. DWORD *pdwReserved,
  961. DWORD dwFlags
  962. );
  963. WINADVAPI
  964. BOOL
  965. WINAPI
  966. CryptSetProviderExW(
  967. LPCWSTR pszProvName,
  968. DWORD dwProvType,
  969. DWORD *pdwReserved,
  970. DWORD dwFlags
  971. );
  972. #ifdef UNICODE
  973. #define CryptSetProviderEx CryptSetProviderExW
  974. #else
  975. #define CryptSetProviderEx CryptSetProviderExA
  976. #endif // !UNICODE
  977. WINADVAPI
  978. BOOL
  979. WINAPI
  980. CryptGetDefaultProviderA(
  981. DWORD dwProvType,
  982. DWORD *pdwReserved,
  983. DWORD dwFlags,
  984. LPSTR pszProvName,
  985. DWORD *pcbProvName
  986. );
  987. WINADVAPI
  988. BOOL
  989. WINAPI
  990. CryptGetDefaultProviderW(
  991. DWORD dwProvType,
  992. DWORD *pdwReserved,
  993. DWORD dwFlags,
  994. LPWSTR pszProvName,
  995. DWORD *pcbProvName
  996. );
  997. #ifdef UNICODE
  998. #define CryptGetDefaultProvider CryptGetDefaultProviderW
  999. #else
  1000. #define CryptGetDefaultProvider CryptGetDefaultProviderA
  1001. #endif // !UNICODE
  1002. WINADVAPI
  1003. BOOL
  1004. WINAPI
  1005. CryptEnumProviderTypesA(
  1006. DWORD dwIndex,
  1007. DWORD *pdwReserved,
  1008. DWORD dwFlags,
  1009. DWORD *pdwProvType,
  1010. LPSTR szTypeName,
  1011. DWORD *pcbTypeName
  1012. );
  1013. WINADVAPI
  1014. BOOL
  1015. WINAPI
  1016. CryptEnumProviderTypesW(
  1017. DWORD dwIndex,
  1018. DWORD *pdwReserved,
  1019. DWORD dwFlags,
  1020. DWORD *pdwProvType,
  1021. LPWSTR szTypeName,
  1022. DWORD *pcbTypeName
  1023. );
  1024. #ifdef UNICODE
  1025. #define CryptEnumProviderTypes CryptEnumProviderTypesW
  1026. #else
  1027. #define CryptEnumProviderTypes CryptEnumProviderTypesA
  1028. #endif // !UNICODE
  1029. WINADVAPI
  1030. BOOL
  1031. WINAPI
  1032. CryptEnumProvidersA(
  1033. DWORD dwIndex,
  1034. DWORD *pdwReserved,
  1035. DWORD dwFlags,
  1036. DWORD *pdwProvType,
  1037. LPSTR szProvName,
  1038. DWORD *pcbProvName
  1039. );
  1040. WINADVAPI
  1041. BOOL
  1042. WINAPI
  1043. CryptEnumProvidersW(
  1044. DWORD dwIndex,
  1045. DWORD *pdwReserved,
  1046. DWORD dwFlags,
  1047. DWORD *pdwProvType,
  1048. LPWSTR szProvName,
  1049. DWORD *pcbProvName
  1050. );
  1051. #ifdef UNICODE
  1052. #define CryptEnumProviders CryptEnumProvidersW
  1053. #else
  1054. #define CryptEnumProviders CryptEnumProvidersA
  1055. #endif // !UNICODE
  1056. WINADVAPI
  1057. BOOL
  1058. WINAPI
  1059. CryptContextAddRef(
  1060. HCRYPTPROV hProv,
  1061. DWORD *pdwReserved,
  1062. DWORD dwFlags
  1063. );
  1064. WINADVAPI
  1065. BOOL
  1066. WINAPI
  1067. CryptDuplicateKey(
  1068. HCRYPTKEY hKey,
  1069. DWORD *pdwReserved,
  1070. DWORD dwFlags,
  1071. HCRYPTKEY *phKey
  1072. );
  1073. WINADVAPI
  1074. BOOL
  1075. WINAPI
  1076. CryptDuplicateHash(
  1077. HCRYPTHASH hHash,
  1078. DWORD *pdwReserved,
  1079. DWORD dwFlags,
  1080. HCRYPTHASH *phHash
  1081. );
  1082. //
  1083. // This function is provided in Microsoft Windows 2000 as a means of
  1084. // installing the 128-bit encryption provider. This function is unavailable
  1085. // in Microsoft Windows XP, because Windows XP ships with the 128-bit
  1086. // encryption provider.
  1087. //
  1088. BOOL
  1089. __cdecl
  1090. GetEncSChannel(
  1091. BYTE **pData,
  1092. DWORD *dwDecSize
  1093. );
  1094. //+-------------------------------------------------------------------------
  1095. // In a CRYPT_BIT_BLOB the last byte may contain 0-7 unused bits. Therefore, the
  1096. // overall bit length is cbData * 8 - cUnusedBits.
  1097. //--------------------------------------------------------------------------
  1098. typedef struct _CRYPT_BIT_BLOB {
  1099. DWORD cbData;
  1100. BYTE *pbData;
  1101. DWORD cUnusedBits;
  1102. } CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB;
  1103. //+-------------------------------------------------------------------------
  1104. // Type used for any algorithm
  1105. //
  1106. // Where the Parameters CRYPT_OBJID_BLOB is in its encoded representation. For most
  1107. // algorithm types, the Parameters CRYPT_OBJID_BLOB is NULL (Parameters.cbData = 0).
  1108. //--------------------------------------------------------------------------
  1109. typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
  1110. LPSTR pszObjId;
  1111. CRYPT_OBJID_BLOB Parameters;
  1112. } CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;
  1113. // Following are the definitions of various algorithm object identifiers
  1114. // RSA
  1115. #define szOID_RSA "1.2.840.113549"
  1116. #define szOID_PKCS "1.2.840.113549.1"
  1117. #define szOID_RSA_HASH "1.2.840.113549.2"
  1118. #define szOID_RSA_ENCRYPT "1.2.840.113549.3"
  1119. #define szOID_PKCS_1 "1.2.840.113549.1.1"
  1120. #define szOID_PKCS_2 "1.2.840.113549.1.2"
  1121. #define szOID_PKCS_3 "1.2.840.113549.1.3"
  1122. #define szOID_PKCS_4 "1.2.840.113549.1.4"
  1123. #define szOID_PKCS_5 "1.2.840.113549.1.5"
  1124. #define szOID_PKCS_6 "1.2.840.113549.1.6"
  1125. #define szOID_PKCS_7 "1.2.840.113549.1.7"
  1126. #define szOID_PKCS_8 "1.2.840.113549.1.8"
  1127. #define szOID_PKCS_9 "1.2.840.113549.1.9"
  1128. #define szOID_PKCS_10 "1.2.840.113549.1.10"
  1129. #define szOID_PKCS_12 "1.2.840.113549.1.12"
  1130. #define szOID_RSA_RSA "1.2.840.113549.1.1.1"
  1131. #define szOID_RSA_MD2RSA "1.2.840.113549.1.1.2"
  1132. #define szOID_RSA_MD4RSA "1.2.840.113549.1.1.3"
  1133. #define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4"
  1134. #define szOID_RSA_SHA1RSA "1.2.840.113549.1.1.5"
  1135. #define szOID_RSA_SETOAEP_RSA "1.2.840.113549.1.1.6"
  1136. #define szOID_RSA_DH "1.2.840.113549.1.3.1"
  1137. #define szOID_RSA_data "1.2.840.113549.1.7.1"
  1138. #define szOID_RSA_signedData "1.2.840.113549.1.7.2"
  1139. #define szOID_RSA_envelopedData "1.2.840.113549.1.7.3"
  1140. #define szOID_RSA_signEnvData "1.2.840.113549.1.7.4"
  1141. #define szOID_RSA_digestedData "1.2.840.113549.1.7.5"
  1142. #define szOID_RSA_hashedData "1.2.840.113549.1.7.5"
  1143. #define szOID_RSA_encryptedData "1.2.840.113549.1.7.6"
  1144. #define szOID_RSA_emailAddr "1.2.840.113549.1.9.1"
  1145. #define szOID_RSA_unstructName "1.2.840.113549.1.9.2"
  1146. #define szOID_RSA_contentType "1.2.840.113549.1.9.3"
  1147. #define szOID_RSA_messageDigest "1.2.840.113549.1.9.4"
  1148. #define szOID_RSA_signingTime "1.2.840.113549.1.9.5"
  1149. #define szOID_RSA_counterSign "1.2.840.113549.1.9.6"
  1150. #define szOID_RSA_challengePwd "1.2.840.113549.1.9.7"
  1151. #define szOID_RSA_unstructAddr "1.2.840.113549.1.9.8"
  1152. #define szOID_RSA_extCertAttrs "1.2.840.113549.1.9.9"
  1153. #define szOID_RSA_certExtensions "1.2.840.113549.1.9.14"
  1154. #define szOID_RSA_SMIMECapabilities "1.2.840.113549.1.9.15"
  1155. #define szOID_RSA_preferSignedData "1.2.840.113549.1.9.15.1"
  1156. #define szOID_RSA_SMIMEalg "1.2.840.113549.1.9.16.3"
  1157. #define szOID_RSA_SMIMEalgESDH "1.2.840.113549.1.9.16.3.5"
  1158. #define szOID_RSA_SMIMEalgCMS3DESwrap "1.2.840.113549.1.9.16.3.6"
  1159. #define szOID_RSA_SMIMEalgCMSRC2wrap "1.2.840.113549.1.9.16.3.7"
  1160. #define szOID_RSA_MD2 "1.2.840.113549.2.2"
  1161. #define szOID_RSA_MD4 "1.2.840.113549.2.4"
  1162. #define szOID_RSA_MD5 "1.2.840.113549.2.5"
  1163. #define szOID_RSA_RC2CBC "1.2.840.113549.3.2"
  1164. #define szOID_RSA_RC4 "1.2.840.113549.3.4"
  1165. #define szOID_RSA_DES_EDE3_CBC "1.2.840.113549.3.7"
  1166. #define szOID_RSA_RC5_CBCPad "1.2.840.113549.3.9"
  1167. #define szOID_ANSI_X942 "1.2.840.10046"
  1168. #define szOID_ANSI_X942_DH "1.2.840.10046.2.1"
  1169. #define szOID_X957 "1.2.840.10040"
  1170. #define szOID_X957_DSA "1.2.840.10040.4.1"
  1171. #define szOID_X957_SHA1DSA "1.2.840.10040.4.3"
  1172. // ITU-T UsefulDefinitions
  1173. #define szOID_DS "2.5"
  1174. #define szOID_DSALG "2.5.8"
  1175. #define szOID_DSALG_CRPT "2.5.8.1"
  1176. #define szOID_DSALG_HASH "2.5.8.2"
  1177. #define szOID_DSALG_SIGN "2.5.8.3"
  1178. #define szOID_DSALG_RSA "2.5.8.1.1"
  1179. // NIST OSE Implementors' Workshop (OIW)
  1180. // http://nemo.ncsl.nist.gov/oiw/agreements/stable/OSI/12s_9506.w51
  1181. // http://nemo.ncsl.nist.gov/oiw/agreements/working/OSI/12w_9503.w51
  1182. #define szOID_OIW "1.3.14"
  1183. // NIST OSE Implementors' Workshop (OIW) Security SIG algorithm identifiers
  1184. #define szOID_OIWSEC "1.3.14.3.2"
  1185. #define szOID_OIWSEC_md4RSA "1.3.14.3.2.2"
  1186. #define szOID_OIWSEC_md5RSA "1.3.14.3.2.3"
  1187. #define szOID_OIWSEC_md4RSA2 "1.3.14.3.2.4"
  1188. #define szOID_OIWSEC_desECB "1.3.14.3.2.6"
  1189. #define szOID_OIWSEC_desCBC "1.3.14.3.2.7"
  1190. #define szOID_OIWSEC_desOFB "1.3.14.3.2.8"
  1191. #define szOID_OIWSEC_desCFB "1.3.14.3.2.9"
  1192. #define szOID_OIWSEC_desMAC "1.3.14.3.2.10"
  1193. #define szOID_OIWSEC_rsaSign "1.3.14.3.2.11"
  1194. #define szOID_OIWSEC_dsa "1.3.14.3.2.12"
  1195. #define szOID_OIWSEC_shaDSA "1.3.14.3.2.13"
  1196. #define szOID_OIWSEC_mdc2RSA "1.3.14.3.2.14"
  1197. #define szOID_OIWSEC_shaRSA "1.3.14.3.2.15"
  1198. #define szOID_OIWSEC_dhCommMod "1.3.14.3.2.16"
  1199. #define szOID_OIWSEC_desEDE "1.3.14.3.2.17"
  1200. #define szOID_OIWSEC_sha "1.3.14.3.2.18"
  1201. #define szOID_OIWSEC_mdc2 "1.3.14.3.2.19"
  1202. #define szOID_OIWSEC_dsaComm "1.3.14.3.2.20"
  1203. #define szOID_OIWSEC_dsaCommSHA "1.3.14.3.2.21"
  1204. #define szOID_OIWSEC_rsaXchg "1.3.14.3.2.22"
  1205. #define szOID_OIWSEC_keyHashSeal "1.3.14.3.2.23"
  1206. #define szOID_OIWSEC_md2RSASign "1.3.14.3.2.24"
  1207. #define szOID_OIWSEC_md5RSASign "1.3.14.3.2.25"
  1208. #define szOID_OIWSEC_sha1 "1.3.14.3.2.26"
  1209. #define szOID_OIWSEC_dsaSHA1 "1.3.14.3.2.27"
  1210. #define szOID_OIWSEC_dsaCommSHA1 "1.3.14.3.2.28"
  1211. #define szOID_OIWSEC_sha1RSASign "1.3.14.3.2.29"
  1212. // NIST OSE Implementors' Workshop (OIW) Directory SIG algorithm identifiers
  1213. #define szOID_OIWDIR "1.3.14.7.2"
  1214. #define szOID_OIWDIR_CRPT "1.3.14.7.2.1"
  1215. #define szOID_OIWDIR_HASH "1.3.14.7.2.2"
  1216. #define szOID_OIWDIR_SIGN "1.3.14.7.2.3"
  1217. #define szOID_OIWDIR_md2 "1.3.14.7.2.2.1"
  1218. #define szOID_OIWDIR_md2RSA "1.3.14.7.2.3.1"
  1219. // INFOSEC Algorithms
  1220. // joint-iso-ccitt(2) country(16) us(840) organization(1) us-government(101) dod(2) id-infosec(1)
  1221. #define szOID_INFOSEC "2.16.840.1.101.2.1"
  1222. #define szOID_INFOSEC_sdnsSignature "2.16.840.1.101.2.1.1.1"
  1223. #define szOID_INFOSEC_mosaicSignature "2.16.840.1.101.2.1.1.2"
  1224. #define szOID_INFOSEC_sdnsConfidentiality "2.16.840.1.101.2.1.1.3"
  1225. #define szOID_INFOSEC_mosaicConfidentiality "2.16.840.1.101.2.1.1.4"
  1226. #define szOID_INFOSEC_sdnsIntegrity "2.16.840.1.101.2.1.1.5"
  1227. #define szOID_INFOSEC_mosaicIntegrity "2.16.840.1.101.2.1.1.6"
  1228. #define szOID_INFOSEC_sdnsTokenProtection "2.16.840.1.101.2.1.1.7"
  1229. #define szOID_INFOSEC_mosaicTokenProtection "2.16.840.1.101.2.1.1.8"
  1230. #define szOID_INFOSEC_sdnsKeyManagement "2.16.840.1.101.2.1.1.9"
  1231. #define szOID_INFOSEC_mosaicKeyManagement "2.16.840.1.101.2.1.1.10"
  1232. #define szOID_INFOSEC_sdnsKMandSig "2.16.840.1.101.2.1.1.11"
  1233. #define szOID_INFOSEC_mosaicKMandSig "2.16.840.1.101.2.1.1.12"
  1234. #define szOID_INFOSEC_SuiteASignature "2.16.840.1.101.2.1.1.13"
  1235. #define szOID_INFOSEC_SuiteAConfidentiality "2.16.840.1.101.2.1.1.14"
  1236. #define szOID_INFOSEC_SuiteAIntegrity "2.16.840.1.101.2.1.1.15"
  1237. #define szOID_INFOSEC_SuiteATokenProtection "2.16.840.1.101.2.1.1.16"
  1238. #define szOID_INFOSEC_SuiteAKeyManagement "2.16.840.1.101.2.1.1.17"
  1239. #define szOID_INFOSEC_SuiteAKMandSig "2.16.840.1.101.2.1.1.18"
  1240. #define szOID_INFOSEC_mosaicUpdatedSig "2.16.840.1.101.2.1.1.19"
  1241. #define szOID_INFOSEC_mosaicKMandUpdSig "2.16.840.1.101.2.1.1.20"
  1242. #define szOID_INFOSEC_mosaicUpdatedInteg "2.16.840.1.101.2.1.1.21"
  1243. typedef struct _CRYPT_OBJID_TABLE {
  1244. DWORD dwAlgId;
  1245. LPCSTR pszObjId;
  1246. } CRYPT_OBJID_TABLE, *PCRYPT_OBJID_TABLE;
  1247. //+-------------------------------------------------------------------------
  1248. // PKCS #1 HashInfo (DigestInfo)
  1249. //--------------------------------------------------------------------------
  1250. typedef struct _CRYPT_HASH_INFO {
  1251. CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
  1252. CRYPT_HASH_BLOB Hash;
  1253. } CRYPT_HASH_INFO, *PCRYPT_HASH_INFO;
  1254. //+-------------------------------------------------------------------------
  1255. // Type used for an extension to an encoded content
  1256. //
  1257. // Where the Value's CRYPT_OBJID_BLOB is in its encoded representation.
  1258. //--------------------------------------------------------------------------
  1259. typedef struct _CERT_EXTENSION {
  1260. LPSTR pszObjId;
  1261. BOOL fCritical;
  1262. CRYPT_OBJID_BLOB Value;
  1263. } CERT_EXTENSION, *PCERT_EXTENSION;
  1264. //+-------------------------------------------------------------------------
  1265. // AttributeTypeValue
  1266. //
  1267. // Where the Value's CRYPT_OBJID_BLOB is in its encoded representation.
  1268. //--------------------------------------------------------------------------
  1269. typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
  1270. LPSTR pszObjId;
  1271. CRYPT_OBJID_BLOB Value;
  1272. } CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE;
  1273. //+-------------------------------------------------------------------------
  1274. // Attributes
  1275. //
  1276. // Where the Value's PATTR_BLOBs are in their encoded representation.
  1277. //--------------------------------------------------------------------------
  1278. typedef struct _CRYPT_ATTRIBUTE {
  1279. LPSTR pszObjId;
  1280. DWORD cValue;
  1281. PCRYPT_ATTR_BLOB rgValue;
  1282. } CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;
  1283. typedef struct _CRYPT_ATTRIBUTES {
  1284. IN DWORD cAttr;
  1285. IN PCRYPT_ATTRIBUTE rgAttr;
  1286. } CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
  1287. //+-------------------------------------------------------------------------
  1288. // Attributes making up a Relative Distinguished Name (CERT_RDN)
  1289. //
  1290. // The interpretation of the Value depends on the dwValueType.
  1291. // See below for a list of the types.
  1292. //--------------------------------------------------------------------------
  1293. typedef struct _CERT_RDN_ATTR {
  1294. LPSTR pszObjId;
  1295. DWORD dwValueType;
  1296. CERT_RDN_VALUE_BLOB Value;
  1297. } CERT_RDN_ATTR, *PCERT_RDN_ATTR;
  1298. //+-------------------------------------------------------------------------
  1299. // CERT_RDN attribute Object Identifiers
  1300. //--------------------------------------------------------------------------
  1301. // Labeling attribute types:
  1302. #define szOID_COMMON_NAME "2.5.4.3" // case-ignore string
  1303. #define szOID_SUR_NAME "2.5.4.4" // case-ignore string
  1304. #define szOID_DEVICE_SERIAL_NUMBER "2.5.4.5" // printable string
  1305. // Geographic attribute types:
  1306. #define szOID_COUNTRY_NAME "2.5.4.6" // printable 2char string
  1307. #define szOID_LOCALITY_NAME "2.5.4.7" // case-ignore string
  1308. #define szOID_STATE_OR_PROVINCE_NAME "2.5.4.8" // case-ignore string
  1309. #define szOID_STREET_ADDRESS "2.5.4.9" // case-ignore string
  1310. // Organizational attribute types:
  1311. #define szOID_ORGANIZATION_NAME "2.5.4.10" // case-ignore string
  1312. #define szOID_ORGANIZATIONAL_UNIT_NAME "2.5.4.11" // case-ignore string
  1313. #define szOID_TITLE "2.5.4.12" // case-ignore string
  1314. // Explanatory attribute types:
  1315. #define szOID_DESCRIPTION "2.5.4.13" // case-ignore string
  1316. #define szOID_SEARCH_GUIDE "2.5.4.14"
  1317. #define szOID_BUSINESS_CATEGORY "2.5.4.15" // case-ignore string
  1318. // Postal addressing attribute types:
  1319. #define szOID_POSTAL_ADDRESS "2.5.4.16"
  1320. #define szOID_POSTAL_CODE "2.5.4.17" // case-ignore string
  1321. #define szOID_POST_OFFICE_BOX "2.5.4.18" // case-ignore string
  1322. #define szOID_PHYSICAL_DELIVERY_OFFICE_NAME "2.5.4.19" // case-ignore string
  1323. // Telecommunications addressing attribute types:
  1324. #define szOID_TELEPHONE_NUMBER "2.5.4.20" // telephone number
  1325. #define szOID_TELEX_NUMBER "2.5.4.21"
  1326. #define szOID_TELE