bcrypt.h
Upload User: jxhysc
Upload Date: 2007-08-26
Package Size: 12k
Code Size: 52k
Development Platform:

Visual C++

  1. //+---------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright (C) Microsoft Corporation, 2004.
  5. //
  6. //  File:       bcrypt.h
  7. //
  8. //  Contents:   Cryptographic Primitive API Prototypes and Definitions
  9. //
  10. //----------------------------------------------------------------------------
  11. #ifndef __BCRYPT_H__
  12. #define __BCRYPT_H__
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. #ifndef WINAPI
  17. #define WINAPI __stdcall
  18. #endif
  19. #ifndef _NTDEF_
  20. typedef __success(return >= 0) LONG NTSTATUS, *PNTSTATUS;
  21. #endif
  22. #ifndef CONST
  23. #define CONST const
  24. #endif
  25. #ifndef IN
  26. #define IN
  27. #endif
  28. #ifndef OUT
  29. #define OUT
  30. #endif
  31. #ifndef OPTIONAL
  32. #define OPTIONAL
  33. #endif
  34. #if !defined(__midl)
  35. #define BCRYPT_STRUCT_ALIGNMENT __declspec(align(BCRYPT_OBJECT_ALIGNMENT))
  36. #else
  37. #define BCRYPT_STRUCT_ALIGNMENT
  38. #endif /*!defined(__midl)*/
  39. //
  40. //  Alignment macros
  41. //
  42. // BCRYPT_OBJECT_ALIGNMENT must be a power of 2
  43. #if defined(_IA64_) || defined(_AMD64_)
  44.  #define BCRYPT_OBJECT_ALIGNMENT    8
  45. #else
  46.  #define BCRYPT_OBJECT_ALIGNMENT    4
  47. #endif
  48. #if !defined(__midl)
  49. #define BCRYPT_STRUCT_ALIGNMENT __declspec(align(BCRYPT_OBJECT_ALIGNMENT))
  50. #else
  51. #define BCRYPT_STRUCT_ALIGNMENT
  52. #endif /*!defined(__midl)*/
  53. //
  54. // DeriveKey KDF Types
  55. //
  56. #define BCRYPT_KDF_HASH     L"HASH"
  57. #define BCRYPT_KDF_HMAC     L"HMAC"
  58. #define BCRYPT_KDF_TLS_PRF  L"TLS_PRF"
  59. //
  60. // DeriveKey KDF BufferTypes
  61. //
  62. // For BCRYPT_KDF_HASH and BCRYPT_KDF_HMAC operations, there may be an arbitrary
  63. // number of KDF_SECRET_PREPEND and KDF_SECRET_APPEND buffertypes in the
  64. // parameter list.  The BufferTypes are processed in order of appearence 
  65. // within the parameter list.
  66. //
  67. #define KDF_HASH_ALGORITHM  0x0
  68. #define KDF_SECRET_PREPEND  0x1
  69. #define KDF_SECRET_APPEND   0x2
  70. #define KDF_HMAC_KEY        0x3
  71. #define KDF_TLS_PRF_LABEL   0x4
  72. #define KDF_TLS_PRF_SEED    0x5
  73. #define KDF_SECRET_HANDLE   0x6
  74. //
  75. // DeriveKey Flags:
  76. //
  77. // KDF_USE_SECRET_AS_HMAC_KEY_FLAG causes the secret agreement to serve also
  78. // as the HMAC key.  If this flag is used, the KDF_HMAC_KEY parameter should 
  79. // NOT be specified.
  80. //
  81. #define KDF_USE_SECRET_AS_HMAC_KEY_FLAG 0x1
  82. //
  83. // BCrypt structs
  84. //
  85. typedef struct __BCRYPT_KEY_LENGTHS_STRUCT
  86. {
  87.     ULONG   dwMinLength;
  88.     ULONG   dwMaxLength;
  89.     ULONG   dwIncrement;
  90. } BCRYPT_KEY_LENGTHS_STRUCT;
  91. #pragma pack(push, BCRYPT_OBJECT_ALIGNMENT)
  92. typedef BCRYPT_STRUCT_ALIGNMENT struct _BCRYPT_OID
  93. {
  94.     ULONG   cbOID;
  95.     PUCHAR  pbOID;
  96. } BCRYPT_OID;
  97. typedef BCRYPT_STRUCT_ALIGNMENT struct _BCRYPT_OID_LIST
  98. {
  99.     ULONG       dwOIDCount;
  100.     BCRYPT_OID  *pOIDs;
  101. } BCRYPT_OID_LIST;
  102. #pragma pack(pop)
  103. typedef struct _BCRYPT_PKCS1_PADDING_INFO
  104. {
  105.     LPCWSTR pszAlgId;
  106. } BCRYPT_PKCS1_PADDING_INFO;
  107. typedef struct _BCRYPT_PSS_PADDING_INFO
  108. {
  109.     LPCWSTR pszAlgId;
  110.     ULONG   cbSalt;
  111. } BCRYPT_PSS_PADDING_INFO;
  112. typedef struct _BCRYPT_OAEP_PADDING_INFO
  113. {
  114.     LPCWSTR pszAlgId;
  115.     PUCHAR   pbLabel;
  116.     ULONG   cbLabel;
  117. } BCRYPT_OAEP_PADDING_INFO;
  118. #define BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION  1
  119. #define BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG   0x00000001
  120. #define BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG   0x00000002
  121. typedef struct _BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO
  122. {
  123.     ULONG   cbSize;
  124.     ULONG   dwInfoVersion;
  125.     PUCHAR  pbNonce;
  126.     ULONG   cbNonce;
  127.     PUCHAR  pbAuthData;
  128.     ULONG   cbAuthData;
  129.     PUCHAR  pbTag;
  130.     ULONG   cbTag;
  131.     PUCHAR  pbMacContext;
  132.     ULONG   cbMacContext;
  133.     ULONG   cbAAD;
  134.     ULONG   cbData;
  135.     ULONG   dwFlags;
  136. } BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO, *PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO;
  137. #define BCRYPT_INIT_AUTH_MODE_INFO(_AUTH_INFO_STRUCT_)    
  138.             RtlZeroMemory((&_AUTH_INFO_STRUCT_), sizeof(BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO));  
  139.             (_AUTH_INFO_STRUCT_).cbSize = sizeof(BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO);          
  140.             (_AUTH_INFO_STRUCT_).dwInfoVersion = BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION;
  141. //
  142. // BCrypt String Properties
  143. //
  144. // BCrypt(Import/Export)Key BLOB types
  145. #define BCRYPT_OPAQUE_KEY_BLOB      L"OpaqueKeyBlob"
  146. #define BCRYPT_KEY_DATA_BLOB        L"KeyDataBlob"
  147. // BCryptGetProperty strings
  148. #define BCRYPT_OBJECT_LENGTH        L"ObjectLength"
  149. #define BCRYPT_ALGORITHM_NAME       L"AlgorithmName"
  150. #define BCRYPT_PROVIDER_HANDLE      L"ProviderHandle"
  151. #define BCRYPT_CHAINING_MODE        L"ChainingMode"
  152. #define BCRYPT_BLOCK_LENGTH         L"BlockLength"
  153. #define BCRYPT_KEY_LENGTH           L"KeyLength"
  154. #define BCRYPT_KEY_OBJECT_LENGTH    L"KeyObjectLength"
  155. #define BCRYPT_KEY_STRENGTH         L"KeyStrength"
  156. #define BCRYPT_KEY_LENGTHS          L"KeyLengths"
  157. #define BCRYPT_BLOCK_SIZE_LIST      L"BlockSizeList"
  158. #define BCRYPT_EFFECTIVE_KEY_LENGTH L"EffectiveKeyLength"
  159. #define BCRYPT_HASH_LENGTH          L"HashDigestLength"
  160. #define BCRYPT_HASH_OID_LIST        L"HashOIDList"
  161. #define BCRYPT_PADDING_SCHEMES      L"PaddingSchemes"
  162. #define BCRYPT_SIGNATURE_LENGTH     L"SignatureLength"
  163. #define BCRYPT_HASH_BLOCK_LENGTH    L"HashBlockLength"
  164. #define BCRYPT_AUTH_TAG_LENGTH      L"AuthTagLength"
  165. // BCryptSetProperty strings
  166. #define BCRYPT_INITIALIZATION_VECTOR    L"IV"
  167. // Property Strings
  168. #define BCRYPT_CHAIN_MODE_NA        L"ChainingModeN/A"
  169. #define BCRYPT_CHAIN_MODE_CBC       L"ChainingModeCBC"
  170. #define BCRYPT_CHAIN_MODE_ECB       L"ChainingModeECB"
  171. #define BCRYPT_CHAIN_MODE_CFB       L"ChainingModeCFB"
  172. #define BCRYPT_CHAIN_MODE_CCM       L"ChainingModeCCM"
  173. #define BCRYPT_CHAIN_MODE_GCM       L"ChainingModeGCM"
  174. // Supported RSA Padding Types
  175. #define BCRYPT_SUPPORTED_PAD_ROUTER     0x00000001
  176. #define BCRYPT_SUPPORTED_PAD_PKCS1_ENC  0x00000002
  177. #define BCRYPT_SUPPORTED_PAD_PKCS1_SIG  0x00000004
  178. #define BCRYPT_SUPPORTED_PAD_OAEP       0x00000008
  179. #define BCRYPT_SUPPORTED_PAD_PSS        0x00000010
  180. //
  181. //      BCrypt Flags
  182. //
  183. #define BCRYPT_PROV_DISPATCH        0x00000001  // BCryptOpenAlgorithmProvider
  184. #define BCRYPT_BLOCK_PADDING        0x00000001  // BCryptEncrypt/Decrypt
  185. // RSA padding schemes
  186. #define BCRYPT_PAD_NONE             0x00000001
  187. #define BCRYPT_PAD_PKCS1            0x00000002  // BCryptEncrypt/Decrypt BCryptSignHash/VerifySignature
  188. #define BCRYPT_PAD_OAEP             0x00000004  // BCryptEncrypt/Decrypt
  189. #define BCRYPT_PAD_PSS              0x00000008  // BCryptSignHash/VerifySignature
  190. #define BCRYPTBUFFER_VERSION        0
  191. typedef struct _BCryptBuffer {
  192.     ULONG   cbBuffer;             // Length of buffer, in bytes
  193.     ULONG   BufferType;           // Buffer type
  194.     PVOID   pvBuffer;             // Pointer to buffer
  195. } BCryptBuffer, * PBCryptBuffer;
  196. typedef struct _BCryptBufferDesc {
  197.     ULONG   ulVersion;            // Version number
  198.     ULONG   cBuffers;             // Number of buffers
  199.     PBCryptBuffer pBuffers;       // Pointer to array of buffers
  200. } BCryptBufferDesc, * PBCryptBufferDesc;
  201. //
  202. // Primitive handles
  203. //
  204. typedef PVOID BCRYPT_HANDLE;
  205. typedef PVOID BCRYPT_ALG_HANDLE;
  206. typedef PVOID BCRYPT_KEY_HANDLE;
  207. typedef PVOID BCRYPT_HASH_HANDLE;
  208. typedef PVOID BCRYPT_SECRET_HANDLE;
  209. //
  210. // Structures used to represent key blobs.
  211. //
  212. #define BCRYPT_PUBLIC_KEY_BLOB       L"PUBLICBLOB"
  213. #define BCRYPT_PRIVATE_KEY_BLOB      L"PRIVATEBLOB"
  214. typedef struct _BCRYPT_KEY_BLOB
  215. {
  216.     ULONG   Magic;
  217. } BCRYPT_KEY_BLOB;
  218. // The BCRYPT_RSAPUBLIC_BLOB and BCRYPT_RSAPRIVATE_BLOB blob types are used
  219. // to transport plaintext RSA keys. These blob types will be supported by
  220. // all RSA primitive providers.
  221. // The BCRYPT_RSAPRIVATE_BLOB includes the following values:
  222. // Public Exponent
  223. // Modulus
  224. // Prime1
  225. // Prime2
  226. #define BCRYPT_RSAPUBLIC_BLOB       L"RSAPUBLICBLOB"
  227. #define BCRYPT_RSAPRIVATE_BLOB      L"RSAPRIVATEBLOB"
  228. #define LEGACY_RSAPUBLIC_BLOB       L"CAPIPUBLICBLOB"
  229. #define LEGACY_RSAPRIVATE_BLOB      L"CAPIPRIVATEBLOB"
  230. #define BCRYPT_RSAPUBLIC_MAGIC      0x31415352  // RSA1
  231. #define BCRYPT_RSAPRIVATE_MAGIC     0x32415352  // RSA2
  232. typedef struct _BCRYPT_RSAKEY_BLOB
  233. {
  234.     ULONG   Magic;
  235.     ULONG   BitLength;
  236.     ULONG   cbPublicExp;
  237.     ULONG   cbModulus;
  238.     ULONG   cbPrime1;
  239.     ULONG   cbPrime2;
  240. } BCRYPT_RSAKEY_BLOB;
  241. // The BCRYPT_RSAFULLPRIVATE_BLOB blob type is used to transport
  242. // plaintext private RSA keys.  It includes the following values:
  243. // Public Exponent
  244. // Modulus
  245. // Prime1
  246. // Prime2
  247. // Private Exponent mod (Prime1 - 1)
  248. // Private Exponent mod (Prime2 - 1)
  249. // Inverse of Prime2 mod Prime1
  250. // PrivateExponent
  251. #define BCRYPT_RSAFULLPRIVATE_BLOB      L"RSAFULLPRIVATEBLOB"
  252. #define BCRYPT_RSAFULLPRIVATE_MAGIC     0x33415352  // RSA3
  253. // The BCRYPT_ECCPUBLIC_BLOB and BCRYPT_ECCPRIVATE_BLOB blob types are used
  254. // to transport plaintext ECC keys. These blob types will be supported by
  255. // all ECC primitive providers.
  256. #define BCRYPT_ECCPUBLIC_BLOB           L"ECCPUBLICBLOB"
  257. #define BCRYPT_ECCPRIVATE_BLOB          L"ECCPRIVATEBLOB"
  258. #define BCRYPT_ECDH_PUBLIC_P256_MAGIC   0x314B4345  // ECK1
  259. #define BCRYPT_ECDH_PRIVATE_P256_MAGIC  0x324B4345  // ECK2
  260. #define BCRYPT_ECDH_PUBLIC_P384_MAGIC   0x334B4345  // ECK3
  261. #define BCRYPT_ECDH_PRIVATE_P384_MAGIC  0x344B4345  // ECK4
  262. #define BCRYPT_ECDH_PUBLIC_P521_MAGIC   0x354B4345  // ECK5
  263. #define BCRYPT_ECDH_PRIVATE_P521_MAGIC  0x364B4345  // ECK6
  264. #define BCRYPT_ECDSA_PUBLIC_P256_MAGIC  0x31534345  // ECS1
  265. #define BCRYPT_ECDSA_PRIVATE_P256_MAGIC 0x32534345  // ECS2
  266. #define BCRYPT_ECDSA_PUBLIC_P384_MAGIC  0x33534345  // ECS3
  267. #define BCRYPT_ECDSA_PRIVATE_P384_MAGIC 0x34534345  // ECS4
  268. #define BCRYPT_ECDSA_PUBLIC_P521_MAGIC  0x35534345  // ECS5
  269. #define BCRYPT_ECDSA_PRIVATE_P521_MAGIC 0x36534345  // ECS6
  270. typedef struct _BCRYPT_ECCKEY_BLOB
  271. {
  272.     ULONG   dwMagic;
  273.     ULONG   cbKey;
  274. } BCRYPT_ECCKEY_BLOB, *PBCRYPT_ECCKEY_BLOB;
  275. // The BCRYPT_DH_PUBLIC_BLOB and BCRYPT_DH_PRIVATE_BLOB blob types are used
  276. // to transport plaintext DH keys. These blob types will be supported by
  277. // all DH primitive providers.
  278. #define BCRYPT_DH_PUBLIC_BLOB           L"DHPUBLICBLOB"
  279. #define BCRYPT_DH_PRIVATE_BLOB          L"DHPRIVATEBLOB"
  280. #define LEGACY_DH_PUBLIC_BLOB           L"CAPIDHPUBLICBLOB"
  281. #define LEGACY_DH_PRIVATE_BLOB          L"CAPIDHPRIVATEBLOB"
  282. #define BCRYPT_DH_PUBLIC_MAGIC          0x42504844  // DHPB
  283. #define BCRYPT_DH_PRIVATE_MAGIC         0x56504844  // DHPV
  284. typedef struct _BCRYPT_DH_KEY_BLOB
  285. {
  286.     ULONG   dwMagic;
  287.     ULONG   cbKey;
  288. } BCRYPT_DH_KEY_BLOB, *PBCRYPT_DH_KEY_BLOB;
  289. // Property Strings for DH
  290. #define BCRYPT_DH_PARAMETERS            L"DHParameters"
  291. #define BCRYPT_DH_PARAMETERS_MAGIC      0x4d504844  // DHPM
  292. typedef __struct_bcount(cbLength) struct _BCRYPT_DH_PARAMETER_HEADER
  293. {
  294.     ULONG           cbLength;
  295.     ULONG           dwMagic;
  296.     ULONG           cbKeyLength;
  297. } BCRYPT_DH_PARAMETER_HEADER;
  298. // The BCRYPT_DSA_PUBLIC_BLOB and BCRYPT_DSA_PRIVATE_BLOB blob types are used
  299. // to transport plaintext DSA keys. These blob types will be supported by
  300. // all DSA primitive providers.
  301. #define BCRYPT_DSA_PUBLIC_BLOB          L"DSAPUBLICBLOB"
  302. #define BCRYPT_DSA_PRIVATE_BLOB         L"DSAPRIVATEBLOB"
  303. #define LEGACY_DSA_PUBLIC_BLOB          L"CAPIDSAPUBLICBLOB"
  304. #define LEGACY_DSA_PRIVATE_BLOB         L"CAPIDSAPRIVATEBLOB"
  305. #define LEGACY_DSA_V2_PRIVATE_BLOB      L"V2CAPIDSAPRIVATEBLOB"
  306. #define BCRYPT_DSA_PUBLIC_MAGIC         0x42505344  // DSPB
  307. #define BCRYPT_DSA_PRIVATE_MAGIC        0x56505344  // DSPV
  308. typedef struct _BCRYPT_DSA_KEY_BLOB
  309. {
  310.     ULONG   dwMagic;
  311.     ULONG   cbKey;
  312.     UCHAR   Count[4];
  313.     UCHAR   Seed[20];
  314.     UCHAR   q[20];
  315. } BCRYPT_DSA_KEY_BLOB, *PBCRYPT_DSA_KEY_BLOB;
  316. typedef struct _BCRYPT_KEY_DATA_BLOB_HEADER
  317. {
  318.     ULONG   dwMagic;
  319.     ULONG   dwVersion;
  320.     ULONG   cbKeyData;
  321. } BCRYPT_KEY_DATA_BLOB_HEADER, *PBCRYPT_KEY_DATA_BLOB_HEADER;
  322. #define BCRYPT_KEY_DATA_BLOB_MAGIC       0x4d42444b //Key Data Blob Magic (KDBM)
  323. #define BCRYPT_KEY_DATA_BLOB_VERSION1    0x1
  324. // Property Strings for DSA
  325. #define BCRYPT_DSA_PARAMETERS       L"DSAParameters"
  326. #define BCRYPT_DSA_PARAMETERS_MAGIC 0x4d505344  // DSPM
  327. typedef struct _BCRYPT_DSA_PARAMETER_HEADER
  328. {
  329.     ULONG           cbLength;
  330.     ULONG           dwMagic;
  331.     ULONG           cbKeyLength;
  332.     UCHAR           Count[4];
  333.     UCHAR           Seed[20];
  334.     UCHAR           q[20];
  335. } BCRYPT_DSA_PARAMETER_HEADER;
  336. //
  337. // Microsoft built-in providers.
  338. //
  339. #define MS_PRIMITIVE_PROVIDER                   L"Microsoft Primitive Provider"
  340. //
  341. // Common algorithm identifiers.
  342. //
  343. #define BCRYPT_RSA_ALGORITHM                    L"RSA"
  344. #define BCRYPT_RSA_SIGN_ALGORITHM               L"RSA_SIGN"
  345. #define BCRYPT_DH_ALGORITHM                     L"DH"
  346. #define BCRYPT_DSA_ALGORITHM                    L"DSA"
  347. #define BCRYPT_RC2_ALGORITHM                    L"RC2"
  348. #define BCRYPT_RC4_ALGORITHM                    L"RC4"
  349. #define BCRYPT_AES_ALGORITHM                    L"AES"
  350. #define BCRYPT_DES_ALGORITHM                    L"DES"
  351. #define BCRYPT_DESX_ALGORITHM                   L"DESX"
  352. #define BCRYPT_3DES_ALGORITHM                   L"3DES"
  353. #define BCRYPT_3DES_112_ALGORITHM               L"3DES_112"
  354. #define BCRYPT_MD2_ALGORITHM                    L"MD2"
  355. #define BCRYPT_MD4_ALGORITHM                    L"MD4"
  356. #define BCRYPT_MD5_ALGORITHM                    L"MD5"
  357. #define BCRYPT_SHA1_ALGORITHM                   L"SHA1"
  358. #define BCRYPT_SHA256_ALGORITHM                 L"SHA256"
  359. #define BCRYPT_SHA384_ALGORITHM                 L"SHA384"
  360. #define BCRYPT_SHA512_ALGORITHM                 L"SHA512"
  361. #define BCRYPT_AES_GMAC_ALGORITHM               L"AES-GMAC"
  362. #define BCRYPT_ECDSA_P256_ALGORITHM             L"ECDSA_P256"
  363. #define BCRYPT_ECDSA_P384_ALGORITHM             L"ECDSA_P384"
  364. #define BCRYPT_ECDSA_P521_ALGORITHM             L"ECDSA_P521"
  365. #define BCRYPT_ECDH_P256_ALGORITHM              L"ECDH_P256"
  366. #define BCRYPT_ECDH_P384_ALGORITHM              L"ECDH_P384"
  367. #define BCRYPT_ECDH_P521_ALGORITHM              L"ECDH_P521"
  368. #define BCRYPT_RNG_ALGORITHM                    L"RNG"
  369. #define BCRYPT_RNG_FIPS186_DSA_ALGORITHM        L"FIPS186DSARNG"
  370. #define BCRYPT_RNG_DUAL_EC_ALGORITHM            L"DUALECRNG"
  371. //
  372. // Interfaces
  373. //
  374. #define BCRYPT_CIPHER_INTERFACE                 0x00000001
  375. #define BCRYPT_HASH_INTERFACE                   0x00000002
  376. #define BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE  0x00000003
  377. #define BCRYPT_SECRET_AGREEMENT_INTERFACE       0x00000004
  378. #define BCRYPT_SIGNATURE_INTERFACE              0x00000005
  379. #define BCRYPT_RNG_INTERFACE                    0x00000006
  380. //
  381. // Primitive algorithm provider functions.
  382. //
  383. #define BCRYPT_ALG_HANDLE_HMAC_FLAG     0x00000008
  384. NTSTATUS
  385. WINAPI
  386. BCryptOpenAlgorithmProvider(
  387.     __out       BCRYPT_ALG_HANDLE   *phAlgorithm,
  388.     __in        LPCWSTR pszAlgId,
  389.     __in_opt    LPCWSTR pszImplementation,
  390.     __in        ULONG   dwFlags);
  391. typedef NTSTATUS
  392. (WINAPI * BCryptOpenAlgorithmProviderFn)(
  393.     __out   BCRYPT_ALG_HANDLE   *phAlgorithm,
  394.     __in    LPCWSTR pszAlgId,
  395.     __in    ULONG   dwFlags);
  396. // AlgOperations flags for use with BCryptEnumAlgorithms()
  397. #define BCRYPT_CIPHER_OPERATION                 0x00000001
  398. #define BCRYPT_HASH_OPERATION                   0x00000002
  399. #define BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION  0x00000004
  400. #define BCRYPT_SECRET_AGREEMENT_OPERATION       0x00000008
  401. #define BCRYPT_SIGNATURE_OPERATION              0x00000010
  402. #define BCRYPT_RNG_OPERATION                    0x00000020
  403. // USE EXTREME CAUTION: editing comments that contain "certenrolls_*" tokens
  404. // could break building CertEnroll idl files:
  405. // certenrolls_begin -- BCRYPT_ALGORITHM_IDENTIFIER
  406. typedef struct _BCRYPT_ALGORITHM_IDENTIFIER
  407. {
  408.     LPWSTR  pszName;
  409.     ULONG   dwClass;
  410.     ULONG   dwFlags;
  411. } BCRYPT_ALGORITHM_IDENTIFIER;
  412. // certenrolls_end
  413. NTSTATUS
  414. WINAPI
  415. BCryptEnumAlgorithms(
  416.     __in    ULONG   dwAlgOperations,
  417.     __out   ULONG   *pAlgCount,
  418.     __out   BCRYPT_ALGORITHM_IDENTIFIER **ppAlgList,
  419.     __in    ULONG   dwFlags);
  420. typedef struct _BCRYPT_PROVIDER_NAME
  421. {
  422.     LPWSTR  pszProviderName;
  423. } BCRYPT_PROVIDER_NAME;
  424. NTSTATUS
  425. WINAPI
  426. BCryptEnumProviders(
  427.     __in    LPCWSTR pszAlgId,
  428.     __out   ULONG   *pImplCount,
  429.     __out   BCRYPT_PROVIDER_NAME    **ppImplList,
  430.     __in    ULONG   dwFlags);
  431. // Flags for use with BCryptGetProperty and BCryptSetProperty
  432. #define BCRYPT_PUBLIC_KEY_FLAG                  0x00000001
  433. #define BCRYPT_PRIVATE_KEY_FLAG                 0x00000002
  434. NTSTATUS
  435. WINAPI
  436. BCryptGetProperty(
  437.     __in                                        BCRYPT_HANDLE   hObject,
  438.     __in                                        LPCWSTR pszProperty,
  439.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  440.     __in                                        ULONG   cbOutput,
  441.     __out                                       ULONG   *pcbResult,
  442.     __in                                        ULONG   dwFlags);
  443. // @@BEGIN_DDKSPLIT
  444. typedef NTSTATUS
  445. (WINAPI * BCryptGetPropertyFn)(
  446.     __in                                        BCRYPT_HANDLE   hObject,
  447.     __in                                        LPCWSTR pszProperty,
  448.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  449.     __in                                        ULONG   cbOutput,
  450.     __out                                       ULONG   *pcbResult,
  451.     __in                                        ULONG   dwFlags);
  452. // @@END_DDKSPLIT
  453. NTSTATUS
  454. WINAPI
  455. BCryptSetProperty(
  456.     __inout                 BCRYPT_HANDLE   hObject,
  457.     __in                    LPCWSTR pszProperty,
  458.     __in_bcount(cbInput)    PUCHAR   pbInput,
  459.     __in                    ULONG   cbInput,
  460.     __in                    ULONG   dwFlags);
  461. // @@BEGIN_DDKSPLIT
  462. typedef NTSTATUS
  463. (WINAPI * BCryptSetPropertyFn)(
  464.     __inout                 BCRYPT_HANDLE   hObject,
  465.     __in                    LPCWSTR pszProperty,
  466.     __in_bcount(cbInput)    PUCHAR   pbInput,
  467.     __in                    ULONG   cbInput,
  468.     __in                    ULONG   dwFlags);
  469. // @@END_DDKSPLIT
  470. NTSTATUS
  471. WINAPI
  472. BCryptCloseAlgorithmProvider(
  473.     __inout BCRYPT_ALG_HANDLE   hAlgorithm,
  474.     __in    ULONG   dwFlags);
  475. // @@BEGIN_DDKSPLIT
  476. typedef NTSTATUS
  477. (WINAPI * BCryptCloseAlgorithmProviderFn)(
  478.     __inout BCRYPT_ALG_HANDLE   hAlgorithm,
  479.     __in    ULONG   dwFlags);
  480. // @@END_DDKSPLIT
  481. VOID
  482. WINAPI
  483. BCryptFreeBuffer(
  484.     __deref PVOID   pvBuffer);
  485. // @@BEGIN_DDKSPLIT
  486. typedef VOID
  487. (WINAPI * BCryptFreeBufferFn)(
  488.     __deref PVOID   pvBuffer);
  489. // @@END_DDKSPLIT
  490. //
  491. // Primitive encryption functions.
  492. //
  493. NTSTATUS
  494. WINAPI
  495. BCryptGenerateSymmetricKey(
  496.     __inout                         BCRYPT_ALG_HANDLE   hAlgorithm,
  497.     __out                           BCRYPT_KEY_HANDLE   *phKey,
  498.     __out_bcount_full(cbKeyObject)  PUCHAR   pbKeyObject,
  499.     __in                            ULONG   cbKeyObject,
  500.     __in_bcount(cbSecret)           PUCHAR   pbSecret,
  501.     __in                            ULONG   cbSecret,
  502.     __in                            ULONG   dwFlags);
  503. // @@BEGIN_DDKSPLIT
  504. typedef NTSTATUS
  505. (WINAPI * BCryptGenerateSymmetricKeyFn)(
  506.     __inout                         BCRYPT_ALG_HANDLE   hAlgorithm,
  507.     __out                           BCRYPT_KEY_HANDLE   *phKey,
  508.     __out_bcount_full(cbKeyObject)  PUCHAR   pbKeyObject,
  509.     __in                            ULONG   cbKeyObject,
  510.     __in_bcount(cbSecret)           PUCHAR   pbSecret,
  511.     __in                            ULONG   cbSecret,
  512.     __in                            ULONG   dwFlags);
  513. // @@END_DDKSPLIT
  514. NTSTATUS
  515. WINAPI
  516. BCryptGenerateKeyPair(
  517.     __inout BCRYPT_ALG_HANDLE   hAlgorithm,
  518.     __out   BCRYPT_KEY_HANDLE   *phKey,
  519.     __in    ULONG   dwLength,
  520.     __in    ULONG   dwFlags);
  521. // @@BEGIN_DDKSPLIT
  522. typedef NTSTATUS
  523. (WINAPI * BCryptGenerateKeyPairFn)(
  524.     __inout BCRYPT_ALG_HANDLE   hAlgorithm,
  525.     __out   BCRYPT_KEY_HANDLE   *phKey,
  526.     __in    ULONG   dwLength,
  527.     __in    ULONG   dwFlags);
  528. // @@END_DDKSPLIT
  529. NTSTATUS
  530. WINAPI
  531. BCryptEncrypt(
  532.     __inout                                     BCRYPT_KEY_HANDLE hKey,
  533.     __in_bcount(cbInput)                        PUCHAR   pbInput,
  534.     __in                                        ULONG   cbInput,
  535.     __in_opt                                    VOID    *pPaddingInfo,
  536.     __inout_bcount_opt(cbIV)                    PUCHAR   pbIV,
  537.     __in                                        ULONG   cbIV,
  538.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  539.     __in                                        ULONG   cbOutput,
  540.     __out                                       ULONG   *pcbResult,
  541.     __in                                        ULONG   dwFlags);
  542. // @@BEGIN_DDKSPLIT
  543. typedef NTSTATUS
  544. (WINAPI * BCryptEncryptFn)(
  545.     __inout                                     BCRYPT_KEY_HANDLE   hKey,
  546.     __in_bcount(cbInput)                        PUCHAR   pbInput,
  547.     __in                                        ULONG   cbInput,
  548.     __in_opt                                    VOID    *pPaddingInfo,
  549.     __inout_bcount_opt(cbIV)                    PUCHAR   pbIV,
  550.     __in                                        ULONG   cbIV,
  551.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  552.     __in                                        ULONG   cbOutput,
  553.     __out                                       ULONG   *pcbResult,
  554.     __in                                        ULONG   dwFlags);
  555. // @@END_DDKSPLIT
  556. NTSTATUS
  557. WINAPI
  558. BCryptDecrypt(
  559.     __inout                                     BCRYPT_KEY_HANDLE   hKey,
  560.     __in_bcount(cbInput)                        PUCHAR   pbInput,
  561.     __in                                        ULONG   cbInput,
  562.     __in_opt                                    VOID    *pPaddingInfo,
  563.     __inout_bcount_opt(cbIV)                    PUCHAR   pbIV,
  564.     __in                                        ULONG   cbIV,
  565.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  566.     __in                                        ULONG   cbOutput,
  567.     __out                                       ULONG   *pcbResult,
  568.     __in                                        ULONG   dwFlags);
  569. // @@BEGIN_DDKSPLIT
  570. typedef NTSTATUS
  571. (WINAPI * BCryptDecryptFn)(
  572.     __inout                                     BCRYPT_KEY_HANDLE   hKey,
  573.     __in_bcount(cbInput)                        PUCHAR   pbInput,
  574.     __in                                        ULONG   cbInput,
  575.     __in_opt                                    VOID    *pPaddingInfo,
  576.     __inout_bcount_opt(cbIV)                    PUCHAR   pbIV,
  577.     __in                                        ULONG   cbIV,
  578.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  579.     __in                                        ULONG   cbOutput,
  580.     __out                                       ULONG   *pcbResult,
  581.     __in                                        ULONG   dwFlags);
  582. // @@END_DDKSPLIT
  583. NTSTATUS
  584. WINAPI
  585. BCryptExportKey(
  586.     __in                                        BCRYPT_KEY_HANDLE   hKey,
  587.     __in_opt                                    BCRYPT_KEY_HANDLE   hExportKey,
  588.     __in                                        LPCWSTR pszBlobType,
  589.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  590.     __in                                        ULONG   cbOutput,
  591.     __out                                       ULONG   *pcbResult,
  592.     __in                                        ULONG   dwFlags);
  593. // @@BEGIN_DDKSPLIT
  594. typedef NTSTATUS
  595. (WINAPI * BCryptExportKeyFn)(
  596.     __in                                        BCRYPT_KEY_HANDLE   hKey,
  597.     __in_opt                                    BCRYPT_KEY_HANDLE   hExportKey,
  598.     __in                                        LPCWSTR pszBlobType,
  599.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  600.     __in                                        ULONG   cbOutput,
  601.     __out                                       ULONG   *pcbResult,
  602.     __in                                        ULONG   dwFlags);
  603. // @@END_DDKSPLIT
  604. NTSTATUS
  605. WINAPI
  606. BCryptImportKey(
  607.     __in                            BCRYPT_ALG_HANDLE hAlgorithm,
  608.     __in_opt                        BCRYPT_KEY_HANDLE hImportKey,
  609.     __in                            LPCWSTR pszBlobType,
  610.     __out                           BCRYPT_KEY_HANDLE *phKey,
  611.     __out_bcount_full(cbKeyObject)  PUCHAR   pbKeyObject,
  612.     __in                            ULONG   cbKeyObject,
  613.     __in_bcount(cbInput)            PUCHAR   pbInput,
  614.     __in                            ULONG   cbInput,
  615.     __in                            ULONG   dwFlags);
  616. // @@BEGIN_DDKSPLIT
  617. typedef NTSTATUS
  618. (WINAPI * BCryptImportKeyFn)(
  619.     __in                            BCRYPT_ALG_HANDLE hAlgorithm,
  620.     __in_opt                        BCRYPT_KEY_HANDLE hImportKey,
  621.     __in                            LPCWSTR pszBlobType,
  622.     __out                           BCRYPT_KEY_HANDLE *phKey,
  623.     __out_bcount_full(cbKeyObject)  PUCHAR   pbKeyObject,
  624.     __in                            ULONG   cbKeyObject,
  625.     __in_bcount(cbInput)            PUCHAR   pbInput,
  626.     __in                            ULONG   cbInput,
  627.     __in                            ULONG   dwFlags);
  628. // @@END_DDKSPLIT
  629. #define BCRYPT_NO_KEY_VALIDATION    0x00000008
  630. NTSTATUS
  631. WINAPI
  632. BCryptImportKeyPair(
  633.     __in                            BCRYPT_ALG_HANDLE hAlgorithm,
  634.     __in_opt                        BCRYPT_KEY_HANDLE hImportKey,
  635.     __in                            LPCWSTR pszBlobType,
  636.     __out                           BCRYPT_KEY_HANDLE *phKey,
  637.     __in_bcount(cbInput)            PUCHAR   pbInput,
  638.     __in                            ULONG   cbInput,
  639.     __in                            ULONG   dwFlags);
  640. // @@BEGIN_DDKSPLIT
  641. typedef NTSTATUS
  642. (WINAPI * BCryptImportKeyPairFn)(
  643.     __in                            BCRYPT_ALG_HANDLE hAlgorithm,
  644.     __in_opt                        BCRYPT_KEY_HANDLE hImportKey,
  645.     __in                            LPCWSTR pszBlobType,
  646.     __out                           BCRYPT_KEY_HANDLE *phKey,
  647.     __in_bcount(cbInput)            PUCHAR   pbInput,
  648.     __in                            ULONG   cbInput,
  649.     __in                            ULONG   dwFlags);
  650. // @@END_DDKSPLIT
  651. NTSTATUS
  652. WINAPI
  653. BCryptDuplicateKey(
  654.     __in                            BCRYPT_KEY_HANDLE   hKey,
  655.     __out                           BCRYPT_KEY_HANDLE   *phNewKey,
  656.     __out_bcount_full(cbKeyObject)  PUCHAR   pbKeyObject,
  657.     __in                            ULONG   cbKeyObject,
  658.     __in                            ULONG   dwFlags);
  659. // @@BEGIN_DDKSPLIT
  660. typedef NTSTATUS
  661. (WINAPI * BCryptDuplicateKeyFn)(
  662.     __in                            BCRYPT_KEY_HANDLE   hKey,
  663.     __out                           BCRYPT_KEY_HANDLE   *phNewKey,
  664.     __out_bcount_full(cbKeyObject)  PUCHAR   pbKeyObject,
  665.     __in                            ULONG   cbKeyObject,
  666.     __in                            ULONG   dwFlags);
  667. // @@END_DDKSPLIT
  668. NTSTATUS
  669. WINAPI
  670. BCryptFinalizeKeyPair(
  671.     __inout BCRYPT_KEY_HANDLE   hKey,
  672.     __in    ULONG   dwFlags);
  673. // @@BEGIN_DDKSPLIT
  674. typedef NTSTATUS
  675. (WINAPI * BCryptFinalizeKeyPairFn)(
  676.     __inout BCRYPT_KEY_HANDLE   hKey,
  677.     __in    ULONG   dwFlags);
  678. // @@END_DDKSPLIT
  679. NTSTATUS
  680. WINAPI
  681. BCryptDestroyKey(
  682.     __inout BCRYPT_KEY_HANDLE   hKey);
  683. // @@BEGIN_DDKSPLIT
  684. typedef NTSTATUS
  685. (WINAPI * BCryptDestroyKeyFn)(
  686.     __inout BCRYPT_KEY_HANDLE hKey);
  687. // @@END_DDKSPLIT
  688. NTSTATUS
  689. WINAPI
  690. BCryptDestroySecret(
  691.     __inout BCRYPT_SECRET_HANDLE   hSecret);
  692. // @@BEGIN_DDKSPLIT
  693. typedef NTSTATUS
  694. (WINAPI * BCryptDestroySecretFn)(
  695.     __inout BCRYPT_SECRET_HANDLE hSecret);
  696. // @@END_DDKSPLIT
  697. NTSTATUS
  698. WINAPI
  699. BCryptSignHash(
  700.     __in                                        BCRYPT_KEY_HANDLE   hKey,
  701.     __in_opt                                    VOID    *pPaddingInfo,
  702.     __in_bcount(cbInput)                        PUCHAR   pbInput,
  703.     __in                                        ULONG   cbInput,
  704.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  705.     __in                                        ULONG   cbOutput,
  706.     __out                                       ULONG   *pcbResult,
  707.     __in                                        ULONG   dwFlags);
  708. // @@BEGIN_DDKSPLIT
  709. typedef NTSTATUS
  710. (WINAPI * BCryptSignHashFn)(
  711.     __in                                        BCRYPT_KEY_HANDLE   hKey,
  712.     __in_opt                                    VOID    *pPaddingInfo,
  713.     __in_bcount(cbInput)                        PUCHAR   pbInput,
  714.     __in                                        ULONG   cbInput,
  715.     __out_bcount_part_opt(cbOutput, *pcbResult) PUCHAR   pbOutput,
  716.     __in                                        ULONG   cbOutput,
  717.     __out                                       ULONG   *pcbResult,
  718.     __in                                        ULONG   dwFlags);
  719. // @@END_DDKSPLIT
  720. NTSTATUS
  721. WINAPI
  722. BCryptVerifySignature(
  723.     __in                        BCRYPT_KEY_HANDLE   hKey,
  724.     __in_opt                    VOID    *pPaddingInfo,
  725.     __in_bcount(cbHash)         PUCHAR   pbHash,
  726.     __in                        ULONG   cbHash,
  727.     __in_bcount(cbSignature)    PUCHAR   pbSignature,
  728.     __in                        ULONG   cbSignature,
  729.     __in                        ULONG   dwFlags);
  730. // @@BEGIN_DDKSPLIT
  731. typedef NTSTATUS
  732. (WINAPI * BCryptVerifySignatureFn)(
  733.     __in                        BCRYPT_KEY_HANDLE   hKey,
  734.     __in_opt                    VOID    *pPaddingInfo,
  735.     __in_bcount(cbHash)         PUCHAR   pbHash,
  736.     __in                        ULONG   cbHash,
  737.     __in_bcount(cbSignature)    PUCHAR   pbSignature,
  738.     __in                        ULONG   cbSignature,
  739.     __in                        ULONG   dwFlags);
  740. // @@END_DDKSPLIT
  741. NTSTATUS
  742. WINAPI
  743. BCryptSecretAgreement(
  744.     __in    BCRYPT_KEY_HANDLE       hPrivKey,
  745.     __in    BCRYPT_KEY_HANDLE       hPubKey,
  746.     __out   BCRYPT_SECRET_HANDLE    *phAgreedSecret,
  747.     __in    ULONG                   dwFlags);
  748. // @@BEGIN_DDKSPLIT
  749. typedef NTSTATUS
  750. (WINAPI * BCryptSecretAgreementFn)(
  751.     __in    BCRYPT_KEY_HANDLE       hPrivKey,
  752.     __in    BCRYPT_KEY_HANDLE       hPubKey,
  753.     __out   BCRYPT_SECRET_HANDLE    *phAgreedSecret,
  754.     __in    ULONG                   dwFlags);
  755. // @@END_DDKSPLIT
  756. NTSTATUS
  757. WINAPI
  758. BCryptDeriveKey(
  759.     __in        BCRYPT_SECRET_HANDLE hSharedSecret,
  760.     __in        LPCWSTR              pwszKDF,
  761.     __in_opt    BCryptBufferDesc     *pParameterList,
  762.     __out_bcount_part_opt(cbDerivedKey, *pcbResult) PUCHAR pbDerivedKey,
  763.     __in        ULONG                cbDerivedKey,
  764.     __out       ULONG                *pcbResult,
  765.     __in        ULONG                dwFlags);
  766. // @@BEGIN_DDKSPLIT
  767. typedef NTSTATUS
  768. (WINAPI * BCryptDeriveKeyFn)(
  769.     __in        BCRYPT_SECRET_HANDLE hSharedSecret,
  770.     __in        LPCWSTR              pwszKDF,
  771.     __in_opt    BCryptBufferDesc     *pParameterList,
  772.     __out_bcount_part_opt(cbDerivedKey, *pcbResult) PUCHAR pbDerivedKey,
  773.     __in        ULONG                cbDerivedKey,
  774.     __out       ULONG                *pcbResult,
  775.     __in        ULONG                dwFlags);
  776. // @@END_DDKSPLIT
  777. //
  778. // Primitive hashing functions.
  779. //
  780. NTSTATUS
  781. WINAPI
  782. BCryptCreateHash(
  783.     __inout                         BCRYPT_ALG_HANDLE   hAlgorithm,
  784.     __out                           BCRYPT_HASH_HANDLE  *phHash,
  785.     __out_bcount_full(cbHashObject) PUCHAR   pbHashObject,
  786.     __in                            ULONG   cbHashObject,
  787.     __in_bcount_opt(cbSecret)       PUCHAR   pbSecret,   // optional
  788.     __in                            ULONG   cbSecret,   // optional
  789.     __in                            ULONG   dwFlags);
  790. // @@BEGIN_DDKSPLIT
  791. typedef NTSTATUS
  792. (WINAPI * BCryptCreateHashFn)(
  793.     __inout                          BCRYPT_ALG_HANDLE   hAlgorithm,
  794.     __out                           BCRYPT_HASH_HANDLE  *phHash,
  795.     __out_bcount_full(cbHashObject) PUCHAR   pbHashObject,
  796.     __in                            ULONG   cbHashObject,
  797.     __in_bcount_opt(cbSecret)       PUCHAR   pbSecret,   // optional
  798.     __in                            ULONG   cbSecret,   // optional
  799.     __in                            ULONG   dwFlags);
  800. // @@END_DDKSPLIT
  801. NTSTATUS
  802. WINAPI
  803. BCryptHashData(
  804.     __inout                 BCRYPT_HASH_HANDLE  hHash,
  805.     __in_bcount(cbInput)    PUCHAR   pbInput,
  806.     __in                    ULONG   cbInput,
  807.     __in                    ULONG   dwFlags);
  808. // @@BEGIN_DDKSPLIT
  809. typedef NTSTATUS
  810. (WINAPI * BCryptHashDataFn)(
  811.     __inout                 BCRYPT_HASH_HANDLE hHash,
  812.     __in_bcount(cbInput)    PUCHAR   pbInput,
  813.     __in                    ULONG   cbInput,
  814.     __in                    ULONG   dwFlags);
  815. // @@END_DDKSPLIT
  816. NTSTATUS
  817. WINAPI
  818. BCryptFinishHash(
  819.     __inout                     BCRYPT_HASH_HANDLE hHash,
  820.     __out_bcount_full(cbOutput) PUCHAR   pbOutput,
  821.     __in                        ULONG   cbOutput,
  822.     __in                        ULONG   dwFlags);
  823. // @@BEGIN_DDKSPLIT
  824. typedef NTSTATUS
  825. (WINAPI * BCryptFinishHashFn)(
  826.     __inout                     BCRYPT_HASH_HANDLE  hHash,
  827.     __out_bcount_full(cbOutput) PUCHAR   pbOutput,
  828.     __in                        ULONG   cbOutput,
  829.     __in                        ULONG   dwFlags);
  830. // @@END_DDKSPLIT
  831. NTSTATUS
  832. WINAPI
  833. BCryptDuplicateHash(
  834.     __in                            BCRYPT_HASH_HANDLE  hHash,
  835.     __out                           BCRYPT_HASH_HANDLE  *phNewHash,
  836.     __out_bcount_full(cbHashObject) PUCHAR   pbHashObject,
  837.     __in                            ULONG   cbHashObject,
  838.     __in                            ULONG   dwFlags);
  839. // @@BEGIN_DDKSPLIT
  840. typedef NTSTATUS
  841. (WINAPI * BCryptDuplicateHashFn)(
  842.     __in                            BCRYPT_HASH_HANDLE hHash,
  843.     __out                           BCRYPT_HASH_HANDLE * phNewHash,
  844.     __out_bcount_full(cbHashObject) PUCHAR pbHashObject,
  845.     __in                            ULONG   cbHashObject,
  846.     __in                            ULONG   dwFlags);
  847. // @@END_DDKSPLIT
  848. NTSTATUS
  849. WINAPI
  850. BCryptDestroyHash(
  851.     __inout BCRYPT_HASH_HANDLE  hHash);
  852. // @@BEGIN_DDKSPLIT
  853. typedef NTSTATUS
  854. (WINAPI * BCryptDestroyHashFn)(
  855.     __inout BCRYPT_HASH_HANDLE  hHash);
  856. // @@END_DDKSPLIT
  857. //
  858. // Primitive random number generation.
  859. //
  860. // Flags to BCryptGenRandom
  861. #define BCRYPT_RNG_USE_ENTROPY_IN_BUFFER    0x00000001
  862. #define BCRYPT_USE_SYSTEM_PREFERRED_RNG     0x00000002
  863. NTSTATUS
  864. WINAPI
  865. BCryptGenRandom(
  866.     __inout                         BCRYPT_ALG_HANDLE   hAlgorithm,
  867.     __inout_bcount_full(cbBuffer)   PUCHAR  pbBuffer,
  868.     __in                            ULONG   cbBuffer,
  869.     __in                            ULONG   dwFlags);
  870. // @@BEGIN_DDKSPLIT
  871. typedef NTSTATUS
  872. (WINAPI * BCryptGenRandomFn)(
  873.     __inout                         BCRYPT_ALG_HANDLE   hAlgorithm,
  874.     __inout_bcount_full(cbBuffer)   PUCHAR   pbBuffer,
  875.     __in                            ULONG   cbBuffer,
  876.     __in                            ULONG   dwFlags);
  877. // @@END_DDKSPLIT
  878. //
  879. // Interface version control...
  880. //
  881. typedef struct _BCRYPT_INTERFACE_VERSION
  882. {
  883.     USHORT MajorVersion;
  884.     USHORT MinorVersion;
  885. } BCRYPT_INTERFACE_VERSION, *PBCRYPT_INTERFACE_VERSION;
  886. #define BCRYPT_MAKE_INTERFACE_VERSION(major,minor) {(USHORT)major, (USHORT)minor}
  887. #define BCRYPT_IS_INTERFACE_VERSION_COMPATIBLE(loader, provider)    
  888.     ((loader).MajorVersion <= (provider).MajorVersion)
  889. //
  890. // Primitive provider interfaces.
  891. //
  892. #define BCRYPT_CIPHER_INTERFACE_VERSION_1    BCRYPT_MAKE_INTERFACE_VERSION(1,0)
  893. // @@BEGIN_DDKSPLIT
  894. typedef struct _BCRYPT_CIPHER_FUNCTION_TABLE
  895. {
  896.     BCRYPT_INTERFACE_VERSION        Version;
  897.     BCryptOpenAlgorithmProviderFn   OpenAlgorithmProvider;
  898.     BCryptGetPropertyFn             GetProperty;
  899.     BCryptSetPropertyFn             SetProperty;
  900.     BCryptCloseAlgorithmProviderFn  CloseAlgorithmProvider;
  901.     BCryptGenerateSymmetricKeyFn    GenerateKey;
  902.     BCryptEncryptFn                 Encrypt;
  903.     BCryptDecryptFn                 Decrypt;
  904.     BCryptImportKeyFn               ImportKey;
  905.     BCryptExportKeyFn               ExportKey;
  906.     BCryptDuplicateKeyFn            DuplicateKey;
  907.     BCryptDestroyKeyFn              DestroyKey;
  908. } BCRYPT_CIPHER_FUNCTION_TABLE;
  909. NTSTATUS
  910. WINAPI
  911. GetCipherInterface(
  912.     __in    LPCWSTR pszProviderName,
  913.     __in    LPCWSTR pszAlgId,
  914.     __out   BCRYPT_CIPHER_FUNCTION_TABLE **ppFunctionTable,
  915.     __in    ULONG dwFlags);
  916. typedef NTSTATUS
  917. (WINAPI * GetCipherInterfaceFn)(
  918.     __in    LPCWSTR pszProviderName,
  919.     __in    LPCWSTR pszAlgId,
  920.     __out   BCRYPT_CIPHER_FUNCTION_TABLE **ppFunctionTable,
  921.     __in    ULONG dwFlags);
  922. // @@END_DDKSPLIT
  923. #define BCRYPT_HASH_INTERFACE_VERSION_1    BCRYPT_MAKE_INTERFACE_VERSION(1,0)
  924. // @@BEGIN_DDKSPLIT
  925. typedef struct _BCRYPT_HASH_FUNCTION_TABLE
  926. {
  927.     BCRYPT_INTERFACE_VERSION        Version;
  928.     BCryptOpenAlgorithmProviderFn   OpenAlgorithmProvider;
  929.     BCryptGetPropertyFn             GetProperty;
  930.     BCryptSetPropertyFn             SetProperty;
  931.     BCryptCloseAlgorithmProviderFn  CloseAlgorithmProvider;
  932.     BCryptCreateHashFn              CreateHash;
  933.     BCryptHashDataFn                HashData;
  934.     BCryptFinishHashFn              FinishHash;
  935.     BCryptDuplicateHashFn           DuplicateHash;
  936.     BCryptDestroyHashFn             DestroyHash;
  937. } BCRYPT_HASH_FUNCTION_TABLE;
  938. NTSTATUS
  939. WINAPI
  940. GetHashInterface(
  941.     __in    LPCWSTR pszProviderName,
  942.     __in    LPCWSTR pszAlgId,
  943.     __out   BCRYPT_HASH_FUNCTION_TABLE **ppFunctionTable,
  944.     __in    ULONG   dwFlags);
  945. typedef NTSTATUS
  946. (WINAPI * GetHashInterfaceFn)(
  947.     __in    LPCWSTR pszProviderName,
  948.     __in    LPCWSTR pszAlgId,
  949.     __out   BCRYPT_HASH_FUNCTION_TABLE **ppFunctionTable,
  950.     __in    ULONG dwFlags);
  951. // @@END_DDKSPLIT
  952. #define BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE_VERSION_1    BCRYPT_MAKE_INTERFACE_VERSION(1,0)
  953. // @@BEGIN_DDKSPLIT
  954. typedef struct _BCRYPT_ASYMMETRIC_ENCRYPTION_FUNCTION_TABLE
  955. {
  956.     BCRYPT_INTERFACE_VERSION        Version;
  957.     BCryptOpenAlgorithmProviderFn   OpenAlgorithmProvider;
  958.     BCryptGetPropertyFn             GetProperty;
  959.     BCryptSetPropertyFn             SetProperty;
  960.     BCryptCloseAlgorithmProviderFn  CloseAlgorithmProvider;
  961.     BCryptGenerateKeyPairFn         GenerateKeyPair;
  962.     BCryptFinalizeKeyPairFn         FinalizeKeyPair;
  963.     BCryptEncryptFn                 Encrypt;
  964.     BCryptDecryptFn                 Decrypt;
  965.     BCryptImportKeyPairFn           ImportKeyPair;
  966.     BCryptExportKeyFn               ExportKey;
  967.     BCryptDestroyKeyFn              DestroyKey;
  968.     BCryptSignHashFn                SignHash;
  969.     BCryptVerifySignatureFn         VerifySignature;
  970. } BCRYPT_ASYMMETRIC_ENCRYPTION_FUNCTION_TABLE;
  971. NTSTATUS
  972. WINAPI
  973. GetAsymmetricEncryptionInterface(
  974.     __in    LPCWSTR pszProviderName,
  975.     __in    LPCWSTR pszAlgId,
  976.     __out   BCRYPT_ASYMMETRIC_ENCRYPTION_FUNCTION_TABLE **ppFunctionTable,
  977.     __in    ULONG   dwFlags);
  978. typedef NTSTATUS
  979. (WINAPI * GetAsymmetricEncryptionInterfaceFn)(
  980.     __in    LPCWSTR pszProviderName,
  981.     __in    LPCWSTR pszAlgId,
  982.     __out   BCRYPT_ASYMMETRIC_ENCRYPTION_FUNCTION_TABLE **ppFunctionTable,
  983.     __in    ULONG dwFlags);
  984. // @@END_DDKSPLIT
  985. #define BCRYPT_SECRET_AGREEMENT_INTERFACE_VERSION_1    BCRYPT_MAKE_INTERFACE_VERSION(1,0)
  986. // @@BEGIN_DDKSPLIT
  987. typedef struct _BCRYPT_SECRET_AGREEMENT_FUNCTION_TABLE
  988. {
  989.     BCRYPT_INTERFACE_VERSION        Version;
  990.     BCryptOpenAlgorithmProviderFn   OpenAlgorithmProvider;
  991.     BCryptGetPropertyFn             GetProperty;
  992.     BCryptSetPropertyFn             SetProperty;
  993.     BCryptCloseAlgorithmProviderFn  CloseAlgorithmProvider;
  994.     BCryptSecretAgreementFn         SecretAgreement;
  995.     BCryptDeriveKeyFn               DeriveKey;
  996.     BCryptDestroySecretFn           DestroySecret;
  997.     BCryptGenerateKeyPairFn         GenerateKeyPair;
  998.     BCryptFinalizeKeyPairFn         FinalizeKeyPair;
  999.     BCryptImportKeyPairFn           ImportKeyPair;
  1000.     BCryptExportKeyFn               ExportKey;
  1001.     BCryptDestroyKeyFn              DestroyKey;
  1002. } BCRYPT_SECRET_AGREEMENT_FUNCTION_TABLE;
  1003. NTSTATUS
  1004. WINAPI
  1005. GetSecretAgreementInterface(
  1006.     __in    LPCWSTR pszProviderName,
  1007.     __in    LPCWSTR pszAlgId,
  1008.     __out   BCRYPT_SECRET_AGREEMENT_FUNCTION_TABLE **ppFunctionTable,
  1009.     __in    ULONG   dwFlags);
  1010. typedef NTSTATUS
  1011. (WINAPI * GetSecretAgreementInterfaceFn)(
  1012.     __in    LPCWSTR pszProviderName,
  1013.     __in    LPCWSTR pszAlgId,
  1014.     __out   BCRYPT_SECRET_AGREEMENT_FUNCTION_TABLE **ppFunctionTable,
  1015.     __in    ULONG dwFlags);
  1016. // @@END_DDKSPLIT
  1017. #define BCRYPT_SIGNATURE_INTERFACE_VERSION_1    BCRYPT_MAKE_INTERFACE_VERSION(1,0)
  1018. // @@BEGIN_DDKSPLIT
  1019. typedef struct _BCRYPT_SIGNATURE_FUNCTION_TABLE
  1020. {
  1021.     BCRYPT_INTERFACE_VERSION        Version;
  1022.     BCryptOpenAlgorithmProviderFn   OpenAlgorithmProvider;
  1023.     BCryptGetPropertyFn             GetProperty;
  1024.     BCryptSetPropertyFn             SetProperty;
  1025.     BCryptCloseAlgorithmProviderFn  CloseAlgorithmProvider;
  1026.     BCryptGenerateKeyPairFn         GenerateKeyPair;
  1027.     BCryptFinalizeKeyPairFn         FinalizeKeyPair;
  1028.     BCryptSignHashFn                SignHash;
  1029.     BCryptVerifySignatureFn         VerifySignature;
  1030.     BCryptImportKeyPairFn           ImportKeyPair;
  1031.     BCryptExportKeyFn               ExportKey;
  1032.     BCryptDestroyKeyFn              DestroyKey;
  1033. } BCRYPT_SIGNATURE_FUNCTION_TABLE;
  1034. NTSTATUS
  1035. WINAPI
  1036. GetSignatureInterface(
  1037.     __in    LPCWSTR pszProviderName,
  1038.     __in    LPCWSTR pszAlgId,
  1039.     __out   BCRYPT_SIGNATURE_FUNCTION_TABLE **ppFunctionTable,
  1040.     __in    ULONG   dwFlags);
  1041. typedef NTSTATUS
  1042. (WINAPI * GetSignatureInterfaceFn)(
  1043.     __in    LPCWSTR pszProviderName,
  1044.     __in    LPCWSTR pszAlgId,
  1045.     __out   BCRYPT_SIGNATURE_FUNCTION_TABLE **ppFunctionTable,
  1046.     __in    ULONG dwFlags);
  1047. // @@END_DDKSPLIT
  1048. #define BCRYPT_RNG_INTERFACE_VERSION_1    BCRYPT_MAKE_INTERFACE_VERSION(1,0)
  1049. // @@BEGIN_DDKSPLIT
  1050. typedef struct _BCRYPT_RNG_FUNCTION_TABLE
  1051. {
  1052.     BCRYPT_INTERFACE_VERSION        Version;
  1053.     BCryptOpenAlgorithmProviderFn   OpenAlgorithmProvider;
  1054.     BCryptGetPropertyFn             GetProperty;
  1055.     BCryptSetPropertyFn             SetProperty;
  1056.     BCryptCloseAlgorithmProviderFn  CloseAlgorithmProvider;
  1057.     BCryptGenRandomFn               GenRandom;
  1058. } BCRYPT_RNG_FUNCTION_TABLE;
  1059. NTSTATUS
  1060. WINAPI
  1061. GetRngInterface(
  1062.     __in    LPCWSTR pszProviderName,
  1063.     __out   BCRYPT_RNG_FUNCTION_TABLE   **ppFunctionTable,
  1064.     __in    ULONG   dwFlags);
  1065. typedef NTSTATUS
  1066. (WINAPI * GetRngInterfaceFn)(
  1067.     __in    LPCWSTR pszProviderName,
  1068.     __out   BCRYPT_RNG_FUNCTION_TABLE **ppFunctionTable,
  1069.     __in    ULONG dwFlags);
  1070. // @@END_DDKSPLIT
  1071. //////////////////////////////////////////////////////////////////////////////
  1072. // CryptoConfig Definitions //////////////////////////////////////////////////
  1073. //////////////////////////////////////////////////////////////////////////////
  1074. // Interface registration flags
  1075. #define CRYPT_MIN_DEPENDENCIES      (0x00000001)
  1076. #define CRYPT_PROCESS_ISOLATE       (0x00010000) // User-mode only
  1077. // Processor modes supported by a provider
  1078. //
  1079. // (Valid for BCryptQueryProviderRegistration and BCryptResolveProviders):
  1080. //
  1081. #define CRYPT_UM                    (0x00000001)    // User mode only
  1082. #define CRYPT_KM                    (0x00000002)    // Kernel mode only
  1083. #define CRYPT_MM                    (0x00000003)    // Multi-mode: Must support BOTH UM and KM
  1084. //
  1085. // (Valid only for BCryptQueryProviderRegistration):
  1086. //
  1087. #define CRYPT_ANY                   (0x00000004)    // Wildcard: Either UM, or KM, or both
  1088. // Write behavior flags
  1089. #define CRYPT_OVERWRITE             (0x00000001)
  1090. // Configuration tables
  1091. #define CRYPT_LOCAL                 (0x00000001)
  1092. #define CRYPT_DOMAIN                (0x00000002)
  1093. // Context configuration flags
  1094. #define CRYPT_EXCLUSIVE             (0x00000001)
  1095. #define CRYPT_OVERRIDE              (0x00010000) // Enterprise table only
  1096. // Resolution and enumeration flags
  1097. #define CRYPT_ALL_FUNCTIONS         (0x00000001)
  1098. #define CRYPT_ALL_PROVIDERS         (0x00000002)
  1099. // Priority list positions
  1100. #define CRYPT_PRIORITY_TOP          (0x00000000)
  1101. #define CRYPT_PRIORITY_BOTTOM       (0xFFFFFFFF)
  1102. // Default system-wide context
  1103. #define CRYPT_DEFAULT_CONTEXT       L"Default"
  1104. //////////////////////////////////////////////////////////////////////////////
  1105. // CryptoConfig Structures ///////////////////////////////////////////////////
  1106. //////////////////////////////////////////////////////////////////////////////
  1107. //
  1108. // Provider Registration Structures
  1109. //
  1110. typedef struct _CRYPT_INTERFACE_REG
  1111. {
  1112.     ULONG dwInterface;
  1113.     ULONG dwFlags;
  1114.     ULONG cFunctions;
  1115.     PWSTR *rgpszFunctions;
  1116. }
  1117. CRYPT_INTERFACE_REG, *PCRYPT_INTERFACE_REG;
  1118. typedef struct _CRYPT_IMAGE_REG
  1119. {
  1120.     PWSTR pszImage;
  1121.     ULONG cInterfaces;
  1122.     PCRYPT_INTERFACE_REG *rgpInterfaces;
  1123. }
  1124. CRYPT_IMAGE_REG, *PCRYPT_IMAGE_REG;
  1125. typedef struct _CRYPT_PROVIDER_REG
  1126. {
  1127.     ULONG cAliases;
  1128.     PWSTR *rgpszAliases;
  1129.     
  1130.     PCRYPT_IMAGE_REG pUM;
  1131.     PCRYPT_IMAGE_REG pKM;
  1132. }
  1133. CRYPT_PROVIDER_REG, *PCRYPT_PROVIDER_REG;
  1134. typedef struct _CRYPT_PROVIDERS
  1135. {
  1136.     ULONG cProviders;
  1137.     PWSTR *rgpszProviders;
  1138. }
  1139. CRYPT_PROVIDERS, *PCRYPT_PROVIDERS;
  1140. //
  1141. // Context Configuration Structures
  1142. //
  1143. typedef struct _CRYPT_CONTEXT_CONFIG
  1144. {
  1145.     ULONG dwFlags;
  1146.     ULONG dwReserved;
  1147. }
  1148. CRYPT_CONTEXT_CONFIG, *PCRYPT_CONTEXT_CONFIG;
  1149. typedef struct _CRYPT_CONTEXT_FUNCTION_CONFIG
  1150. {
  1151.     ULONG dwFlags;
  1152.     ULONG dwReserved;
  1153. }
  1154. CRYPT_CONTEXT_FUNCTION_CONFIG, *PCRYPT_CONTEXT_FUNCTION_CONFIG;
  1155. typedef struct _CRYPT_CONTEXTS
  1156. {
  1157.     ULONG cContexts;
  1158.     PWSTR *rgpszContexts;
  1159. }
  1160. CRYPT_CONTEXTS, *PCRYPT_CONTEXTS;
  1161. typedef struct _CRYPT_CONTEXT_FUNCTIONS
  1162. {
  1163.     ULONG cFunctions;
  1164.     PWSTR *rgpszFunctions;
  1165. }
  1166. CRYPT_CONTEXT_FUNCTIONS, *PCRYPT_CONTEXT_FUNCTIONS;
  1167. typedef struct _CRYPT_CONTEXT_FUNCTION_PROVIDERS
  1168. {
  1169.     ULONG cProviders;
  1170.     PWSTR *rgpszProviders;
  1171. }
  1172. CRYPT_CONTEXT_FUNCTION_PROVIDERS, *PCRYPT_CONTEXT_FUNCTION_PROVIDERS;
  1173. //
  1174. // Provider Resolution Structures
  1175. //
  1176. typedef struct _CRYPT_PROPERTY_REF
  1177. {
  1178.     PWSTR pszProperty;
  1179.     ULONG cbValue;
  1180.     PUCHAR pbValue;
  1181. }
  1182. CRYPT_PROPERTY_REF, *PCRYPT_PROPERTY_REF;
  1183. typedef struct _CRYPT_IMAGE_REF
  1184. {
  1185.     PWSTR pszImage;
  1186.     ULONG dwFlags;
  1187. }
  1188. CRYPT_IMAGE_REF, *PCRYPT_IMAGE_REF;
  1189. typedef struct _CRYPT_PROVIDER_REF
  1190. {
  1191.     ULONG dwInterface;
  1192.     PWSTR pszFunction;
  1193.     PWSTR pszProvider;
  1194.     ULONG cProperties;
  1195.     PCRYPT_PROPERTY_REF *rgpProperties;
  1196.     PCRYPT_IMAGE_REF pUM;
  1197.     PCRYPT_IMAGE_REF pKM;
  1198. }
  1199. CRYPT_PROVIDER_REF, *PCRYPT_PROVIDER_REF;
  1200. typedef struct _CRYPT_PROVIDER_REFS
  1201. {
  1202.     ULONG cProviders;
  1203.     PCRYPT_PROVIDER_REF *rgpProviders;
  1204. }
  1205. CRYPT_PROVIDER_REFS, *PCRYPT_PROVIDER_REFS;
  1206. //////////////////////////////////////////////////////////////////////////////
  1207. // CryptoConfig Functions ////////////////////////////////////////////////////
  1208. //////////////////////////////////////////////////////////////////////////////
  1209. #ifndef KERNEL_MODE_CNG
  1210. // @@BEGIN_DDKSPLIT
  1211. //
  1212. // Provider Registration Functions
  1213. //
  1214. NTSTATUS
  1215. WINAPI
  1216. BCryptRegisterProvider(
  1217.     __in LPCWSTR pszProvider,
  1218.     __in ULONG dwFlags,
  1219.     __in PCRYPT_PROVIDER_REG pReg);
  1220. NTSTATUS
  1221. WINAPI
  1222. BCryptUnregisterProvider(
  1223.     __in LPCWSTR pszProvider);
  1224. // @@END_DDKSPLIT
  1225. NTSTATUS
  1226. WINAPI
  1227. BCryptQueryProviderRegistration(
  1228.     __in LPCWSTR pszProvider,
  1229.     __in ULONG dwMode,
  1230.     __in ULONG dwInterface,
  1231.     __inout ULONG* pcbBuffer,
  1232.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_PROVIDER_REG *ppBuffer);
  1233. NTSTATUS
  1234. WINAPI
  1235. BCryptEnumRegisteredProviders(
  1236.     __inout ULONG* pcbBuffer,
  1237.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_PROVIDERS *ppBuffer);
  1238. //
  1239. // Context Configuration Functions
  1240. //
  1241. NTSTATUS
  1242. WINAPI
  1243. BCryptCreateContext(
  1244.     __in ULONG dwTable,
  1245.     __in LPCWSTR pszContext,
  1246.     __in_opt PCRYPT_CONTEXT_CONFIG pConfig); // Optional
  1247. NTSTATUS
  1248. WINAPI
  1249. BCryptDeleteContext(
  1250.     __in ULONG dwTable,
  1251.     __in LPCWSTR pszContext);
  1252. NTSTATUS
  1253. WINAPI
  1254. BCryptEnumContexts(
  1255.     __in ULONG dwTable,
  1256.     __inout ULONG* pcbBuffer,
  1257.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_CONTEXTS *ppBuffer);
  1258. NTSTATUS
  1259. WINAPI
  1260. BCryptConfigureContext(
  1261.     __in ULONG dwTable,
  1262.     __in LPCWSTR pszContext,
  1263.     __in PCRYPT_CONTEXT_CONFIG pConfig);
  1264. NTSTATUS
  1265. WINAPI
  1266. BCryptQueryContextConfiguration(
  1267.     __in ULONG dwTable,
  1268.     __in LPCWSTR pszContext,
  1269.     __inout ULONG* pcbBuffer,
  1270.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_CONTEXT_CONFIG *ppBuffer);
  1271. NTSTATUS
  1272. WINAPI
  1273. BCryptAddContextFunction(
  1274.     __in ULONG dwTable,
  1275.     __in LPCWSTR pszContext,
  1276.     __in ULONG dwInterface,
  1277.     __in LPCWSTR pszFunction,
  1278.     __in ULONG dwPosition);
  1279. NTSTATUS
  1280. WINAPI
  1281. BCryptRemoveContextFunction(
  1282.     __in ULONG dwTable,
  1283.     __in LPCWSTR pszContext,
  1284.     __in ULONG dwInterface,
  1285.     __in LPCWSTR pszFunction);
  1286. NTSTATUS
  1287. WINAPI
  1288. BCryptEnumContextFunctions(
  1289.     __in ULONG dwTable,
  1290.     __in LPCWSTR pszContext,
  1291.     __in ULONG dwInterface,
  1292.     __inout ULONG* pcbBuffer,
  1293.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_CONTEXT_FUNCTIONS *ppBuffer);
  1294. NTSTATUS
  1295. WINAPI
  1296. BCryptConfigureContextFunction(
  1297.     __in ULONG dwTable,
  1298.     __in LPCWSTR pszContext,
  1299.     __in ULONG dwInterface,
  1300.     __in LPCWSTR pszFunction,
  1301.     __in PCRYPT_CONTEXT_FUNCTION_CONFIG pConfig);
  1302. NTSTATUS
  1303. WINAPI
  1304. BCryptQueryContextFunctionConfiguration(
  1305.     __in ULONG dwTable,
  1306.     __in LPCWSTR pszContext,
  1307.     __in ULONG dwInterface,
  1308.     __in LPCWSTR pszFunction,
  1309.     __inout ULONG* pcbBuffer,
  1310.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_CONTEXT_FUNCTION_CONFIG *ppBuffer);
  1311. // @@BEGIN_DDKSPLIT
  1312. NTSTATUS
  1313. WINAPI
  1314. BCryptAddContextFunctionProvider(
  1315.     __in ULONG dwTable,
  1316.     __in LPCWSTR pszContext,
  1317.     __in ULONG dwInterface,
  1318.     __in LPCWSTR pszFunction,
  1319.     __in LPCWSTR pszProvider,
  1320.     __in ULONG dwPosition);
  1321. NTSTATUS
  1322. WINAPI
  1323. BCryptRemoveContextFunctionProvider(
  1324.     __in ULONG dwTable,
  1325.     __in LPCWSTR pszContext,
  1326.     __in ULONG dwInterface,
  1327.     __in LPCWSTR pszFunction,
  1328.     __in LPCWSTR pszProvider);
  1329. // @@END_DDKSPLIT
  1330. NTSTATUS
  1331. WINAPI
  1332. BCryptEnumContextFunctionProviders(
  1333.     __in ULONG dwTable,
  1334.     __in LPCWSTR pszContext,
  1335.     __in ULONG dwInterface,
  1336.     __in LPCWSTR pszFunction,
  1337.     __inout ULONG* pcbBuffer,
  1338.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_CONTEXT_FUNCTION_PROVIDERS *ppBuffer);
  1339. NTSTATUS
  1340. WINAPI
  1341. BCryptSetContextFunctionProperty(
  1342.     __in ULONG dwTable,
  1343.     __in LPCWSTR pszContext,
  1344.     __in ULONG dwInterface,
  1345.     __in LPCWSTR pszFunction,
  1346.     __in LPCWSTR pszProperty,
  1347.     __in ULONG cbValue,
  1348.     __in_bcount_opt(cbValue) PUCHAR pbValue);
  1349. NTSTATUS
  1350. WINAPI
  1351. BCryptQueryContextFunctionProperty(
  1352.     __in ULONG dwTable,
  1353.     __in LPCWSTR pszContext,
  1354.     __in ULONG dwInterface,
  1355.     __in LPCWSTR pszFunction,
  1356.     __in LPCWSTR pszProperty,
  1357.     __inout ULONG* pcbValue,
  1358.     __deref_opt_inout_bcount_part_opt(*pcbValue, *pcbValue) PUCHAR *ppbValue);
  1359. #endif //#ifndef KERNEL_MODE_CNG
  1360. //
  1361. // Configuration Change Notification Functions
  1362. //
  1363. #ifdef KERNEL_MODE_CNG
  1364. NTSTATUS
  1365. WINAPI
  1366. BCryptRegisterConfigChangeNotify(
  1367.     __in PRKEVENT pEvent);
  1368. #else
  1369. NTSTATUS
  1370. WINAPI
  1371. BCryptRegisterConfigChangeNotify(
  1372.     __out HANDLE *phEvent);
  1373. #endif
  1374. #ifdef KERNEL_MODE_CNG
  1375. NTSTATUS
  1376. WINAPI
  1377. BCryptUnregisterConfigChangeNotify(
  1378.     __in PRKEVENT pEvent);
  1379. #else
  1380. NTSTATUS
  1381. WINAPI
  1382. BCryptUnregisterConfigChangeNotify(
  1383.     __in HANDLE hEvent);
  1384. #endif
  1385. //
  1386. // Provider Resolution Functions
  1387. //
  1388. NTSTATUS WINAPI
  1389. BCryptResolveProviders(
  1390.     __in_opt LPCWSTR pszContext,
  1391.     __in_opt ULONG dwInterface,
  1392.     __in_opt LPCWSTR pszFunction,
  1393.     __in_opt LPCWSTR pszProvider,
  1394.     __in ULONG dwMode,
  1395.     __in ULONG dwFlags,
  1396.     __inout ULONG* pcbBuffer,
  1397.     __deref_opt_inout_bcount_part_opt(*pcbBuffer, *pcbBuffer) PCRYPT_PROVIDER_REFS *ppBuffer);
  1398. //
  1399. // Miscellaneous queries about the crypto environment
  1400. //
  1401. NTSTATUS
  1402. WINAPI
  1403. BCryptGetFipsAlgorithmMode(
  1404.     __out BOOLEAN *pfEnabled
  1405.     );
  1406. #ifdef __cplusplus
  1407. }
  1408. #endif
  1409. #endif // __BCRYPT_H__