winapi_ui_automation/shared/
bcrypt.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Cryptographic Primitive API Prototypes and Definitions
7use shared::minwindef::{PUCHAR, UCHAR, ULONG, USHORT};
8use um::winnt::{BOOLEAN, HANDLE, LONG, LPCWSTR, LPWSTR, PVOID, PWSTR, ULONGLONG, VOID};
9pub type NTSTATUS = LONG;
10pub type PNTSTATUS = *mut NTSTATUS;
11#[inline]
12pub fn BCRYPT_SUCCESS(Status: NTSTATUS) -> bool {
13    Status >= 0
14}
15pub const BCRYPT_OBJECT_ALIGNMENT: usize = 16;
16pub const BCRYPT_KDF_HASH: &'static str = "HASH";
17pub const BCRYPT_KDF_HMAC: &'static str = "HMAC";
18pub const BCRYPT_KDF_TLS_PRF: &'static str = "TLS_PRF";
19pub const BCRYPT_KDF_SP80056A_CONCAT: &'static str = "SP800_56A_CONCAT";
20pub const BCRYPT_KDF_RAW_SECRET: &'static str = "TRUNCATE";
21pub const KDF_HASH_ALGORITHM: ULONG = 0x0;
22pub const KDF_SECRET_PREPEND: ULONG = 0x1;
23pub const KDF_SECRET_APPEND: ULONG = 0x2;
24pub const KDF_HMAC_KEY: ULONG = 0x3;
25pub const KDF_TLS_PRF_LABEL: ULONG = 0x4;
26pub const KDF_TLS_PRF_SEED: ULONG = 0x5;
27pub const KDF_SECRET_HANDLE: ULONG = 0x6;
28pub const KDF_TLS_PRF_PROTOCOL: ULONG = 0x7;
29pub const KDF_ALGORITHMID: ULONG = 0x8;
30pub const KDF_PARTYUINFO: ULONG = 0x9;
31pub const KDF_PARTYVINFO: ULONG = 0xA;
32pub const KDF_SUPPPUBINFO: ULONG = 0xB;
33pub const KDF_SUPPPRIVINFO: ULONG = 0xC;
34pub const KDF_LABEL: ULONG = 0xD;
35pub const KDF_CONTEXT: ULONG = 0xE;
36pub const KDF_SALT: ULONG = 0xF;
37pub const KDF_ITERATION_COUNT: ULONG = 0x10;
38pub const KDF_GENERIC_PARAMETER: ULONG = 0x11;
39pub const KDF_KEYBITLENGTH: ULONG = 0x12;
40pub const KDF_USE_SECRET_AS_HMAC_KEY_FLAG: ULONG = 0x1;
41STRUCT!{struct BCRYPT_KEY_LENGTHS_STRUCT {
42    dwMinLength: ULONG,
43    dwMaxLength: ULONG,
44    dwIncrement: ULONG,
45}}
46pub type BCRYPT_AUTH_TAG_LENGTHS_STRUCT = BCRYPT_KEY_LENGTHS_STRUCT;
47STRUCT!{struct BCRYPT_OID {
48    cbOID: ULONG,
49    pbOID: PUCHAR,
50}}
51STRUCT!{struct BCRYPT_OID_LIST {
52    dwOIDCount: ULONG,
53    pOIDs: *mut BCRYPT_OID,
54}}
55STRUCT!{struct BCRYPT_PKCS1_PADDING_INFO {
56    pszAlgId: LPCWSTR,
57}}
58STRUCT!{struct BCRYPT_PSS_PADDING_INFO {
59    pszAlgId: LPCWSTR,
60    cbSalt: ULONG,
61}}
62STRUCT!{struct BCRYPT_OAEP_PADDING_INFO {
63    pszAlgId: LPCWSTR,
64    pbLabel: PUCHAR,
65    cbLabel: ULONG,
66}}
67pub const BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION: ULONG = 1;
68pub const BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG: ULONG = 0x00000001;
69pub const BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG: ULONG = 0x00000002;
70STRUCT!{struct BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO {
71    cbSize: ULONG,
72    dwInfoVersion: ULONG,
73    pbNonce: PUCHAR,
74    cbNonce: ULONG,
75    pbAuthData: PUCHAR,
76    cbAuthData: ULONG,
77    pbTag: PUCHAR,
78    cbTag: ULONG,
79    pbMacContext: PUCHAR,
80    cbMacContext: ULONG,
81    cbAAD: ULONG,
82    cbData: ULONGLONG,
83    dwFlags: ULONG,
84}}
85pub type PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = *mut BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO;
86pub const BCRYPT_OPAQUE_KEY_BLOB: &'static str = "OpaqueKeyBlob";
87pub const BCRYPT_KEY_DATA_BLOB: &'static str = "KeyDataBlob";
88pub const BCRYPT_AES_WRAP_KEY_BLOB: &'static str = "Rfc3565KeyWrapBlob";
89pub const BCRYPT_OBJECT_LENGTH: &'static str = "ObjectLength";
90pub const BCRYPT_ALGORITHM_NAME: &'static str = "AlgorithmName";
91pub const BCRYPT_PROVIDER_HANDLE: &'static str = "ProviderHandle";
92pub const BCRYPT_CHAINING_MODE: &'static str = "ChainingMode";
93pub const BCRYPT_BLOCK_LENGTH: &'static str = "BlockLength";
94pub const BCRYPT_KEY_LENGTH: &'static str = "KeyLength";
95pub const BCRYPT_KEY_OBJECT_LENGTH: &'static str = "KeyObjectLength";
96pub const BCRYPT_KEY_STRENGTH: &'static str = "KeyStrength";
97pub const BCRYPT_KEY_LENGTHS: &'static str = "KeyLengths";
98pub const BCRYPT_BLOCK_SIZE_LIST: &'static str = "BlockSizeList";
99pub const BCRYPT_EFFECTIVE_KEY_LENGTH: &'static str = "EffectiveKeyLength";
100pub const BCRYPT_HASH_LENGTH: &'static str = "HashDigestLength";
101pub const BCRYPT_HASH_OID_LIST: &'static str = "HashOIDList";
102pub const BCRYPT_PADDING_SCHEMES: &'static str = "PaddingSchemes";
103pub const BCRYPT_SIGNATURE_LENGTH: &'static str = "SignatureLength";
104pub const BCRYPT_HASH_BLOCK_LENGTH: &'static str = "HashBlockLength";
105pub const BCRYPT_AUTH_TAG_LENGTH: &'static str = "AuthTagLength";
106pub const BCRYPT_PRIMITIVE_TYPE: &'static str = "PrimitiveType";
107pub const BCRYPT_IS_KEYED_HASH: &'static str = "IsKeyedHash";
108pub const BCRYPT_IS_REUSABLE_HASH: &'static str = "IsReusableHash";
109pub const BCRYPT_MESSAGE_BLOCK_LENGTH: &'static str = "MessageBlockLength";
110pub const BCRYPT_PUBLIC_KEY_LENGTH: &'static str = "PublicKeyLength";
111pub const BCRYPT_PCP_PLATFORM_TYPE_PROPERTY: &'static str = "PCP_PLATFORM_TYPE";
112pub const BCRYPT_PCP_PROVIDER_VERSION_PROPERTY: &'static str = "PCP_PROVIDER_VERSION";
113pub const BCRYPT_MULTI_OBJECT_LENGTH: &'static str = "MultiObjectLength";
114pub const BCRYPT_INITIALIZATION_VECTOR: &'static str = "IV";
115pub const BCRYPT_CHAIN_MODE_NA: &'static str = "ChainingModeN/A";
116pub const BCRYPT_CHAIN_MODE_CBC: &'static str = "ChainingModeCBC";
117pub const BCRYPT_CHAIN_MODE_ECB: &'static str = "ChainingModeECB";
118pub const BCRYPT_CHAIN_MODE_CFB: &'static str = "ChainingModeCFB";
119pub const BCRYPT_CHAIN_MODE_CCM: &'static str = "ChainingModeCCM";
120pub const BCRYPT_CHAIN_MODE_GCM: &'static str = "ChainingModeGCM";
121pub const BCRYPT_PROV_DISPATCH: ULONG = 0x00000001;
122pub const BCRYPT_BLOCK_PADDING: ULONG = 0x00000001;
123pub const BCRYPT_PAD_NONE: ULONG = 0x00000001;
124pub const BCRYPT_PAD_PKCS1: ULONG = 0x00000002;
125pub const BCRYPT_PAD_OAEP: ULONG = 0x00000004;
126pub const BCRYPT_PAD_PSS: ULONG = 0x00000008;
127pub const BCRYPT_PAD_PKCS1_OPTIONAL_HASH_OID: ULONG = 0x00000010;
128pub const BCRYPTBUFFER_VERSION: ULONG = 0;
129STRUCT!{struct BCryptBuffer {
130    cbBuffer: ULONG,
131    BufferType: ULONG,
132    pvBuffer: PVOID,
133}}
134pub type PBCryptBuffer = *mut BCryptBuffer;
135STRUCT!{struct BCryptBufferDesc {
136    ulVersion: ULONG,
137    cBuffers: ULONG,
138    pBuffers: PBCryptBuffer,
139}}
140pub type PBCryptBufferDesc = *mut BCryptBufferDesc;
141pub type BCRYPT_HANDLE = PVOID;
142pub type BCRYPT_ALG_HANDLE = PVOID;
143pub type BCRYPT_KEY_HANDLE = PVOID;
144pub type BCRYPT_HASH_HANDLE = PVOID;
145pub type BCRYPT_SECRET_HANDLE = PVOID;
146pub const BCRYPT_PUBLIC_KEY_BLOB: &'static str = "PUBLICBLOB";
147pub const BCRYPT_PRIVATE_KEY_BLOB: &'static str = "PRIVATEBLOB";
148STRUCT!{struct BCRYPT_KEY_BLOB {
149    Magic: ULONG,
150}}
151pub const BCRYPT_RSAPUBLIC_BLOB: &'static str = "RSAPUBLICBLOB";
152pub const BCRYPT_RSAPRIVATE_BLOB: &'static str = "RSAPRIVATEBLOB";
153pub const LEGACY_RSAPUBLIC_BLOB: &'static str = "CAPIPUBLICBLOB";
154pub const LEGACY_RSAPRIVATE_BLOB: &'static str = "CAPIPRIVATEBLOB";
155pub const BCRYPT_RSAPUBLIC_MAGIC: ULONG = 0x31415352;
156pub const BCRYPT_RSAPRIVATE_MAGIC: ULONG = 0x32415352;
157STRUCT!{struct BCRYPT_RSAKEY_BLOB {
158    Magic: ULONG,
159    BitLength: ULONG,
160    cbPublicExp: ULONG,
161    cbModulus: ULONG,
162    cbPrime1: ULONG,
163    cbPrime2: ULONG,
164}}
165pub const BCRYPT_RSAFULLPRIVATE_BLOB: &'static str = "RSAFULLPRIVATEBLOB";
166pub const BCRYPT_RSAFULLPRIVATE_MAGIC: ULONG = 0x33415352;
167pub const BCRYPT_GLOBAL_PARAMETERS: &'static str = "SecretAgreementParam";
168pub const BCRYPT_PRIVATE_KEY: &'static str = "PrivKeyVal";
169pub const BCRYPT_ECCPUBLIC_BLOB: &'static str = "ECCPUBLICBLOB";
170pub const BCRYPT_ECCPRIVATE_BLOB: &'static str = "ECCPRIVATEBLOB";
171pub const BCRYPT_ECCFULLPUBLIC_BLOB: &'static str = "ECCFULLPUBLICBLOB";
172pub const BCRYPT_ECCFULLPRIVATE_BLOB: &'static str = "ECCFULLPRIVATEBLOB";
173pub const SSL_ECCPUBLIC_BLOB: &'static str = "SSLECCPUBLICBLOB";
174pub const BCRYPT_ECDH_PUBLIC_P256_MAGIC: ULONG = 0x314B4345;
175pub const BCRYPT_ECDH_PRIVATE_P256_MAGIC: ULONG = 0x324B4345;
176pub const BCRYPT_ECDH_PUBLIC_P384_MAGIC: ULONG = 0x334B4345;
177pub const BCRYPT_ECDH_PRIVATE_P384_MAGIC: ULONG = 0x344B4345;
178pub const BCRYPT_ECDH_PUBLIC_P521_MAGIC: ULONG = 0x354B4345;
179pub const BCRYPT_ECDH_PRIVATE_P521_MAGIC: ULONG = 0x364B4345;
180pub const BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC: ULONG = 0x504B4345;
181pub const BCRYPT_ECDH_PRIVATE_GENERIC_MAGIC: ULONG = 0x564B4345;
182pub const BCRYPT_ECDSA_PUBLIC_P256_MAGIC: ULONG = 0x31534345;
183pub const BCRYPT_ECDSA_PRIVATE_P256_MAGIC: ULONG = 0x32534345;
184pub const BCRYPT_ECDSA_PUBLIC_P384_MAGIC: ULONG = 0x33534345;
185pub const BCRYPT_ECDSA_PRIVATE_P384_MAGIC: ULONG = 0x34534345;
186pub const BCRYPT_ECDSA_PUBLIC_P521_MAGIC: ULONG = 0x35534345;
187pub const BCRYPT_ECDSA_PRIVATE_P521_MAGIC: ULONG = 0x36534345;
188pub const BCRYPT_ECDSA_PUBLIC_GENERIC_MAGIC: ULONG = 0x50444345;
189pub const BCRYPT_ECDSA_PRIVATE_GENERIC_MAGIC: ULONG = 0x56444345;
190STRUCT!{struct BCRYPT_ECCKEY_BLOB {
191    dwMagic: ULONG,
192    cbKey: ULONG,
193}}
194pub type PBCRYPT_ECCKEY_BLOB = *mut BCRYPT_ECCKEY_BLOB;
195STRUCT!{struct SSL_ECCKEY_BLOB {
196    dwCurveType: ULONG,
197    cbKey: ULONG,
198}}
199pub type PSSL_ECCKEY_BLOB = *mut SSL_ECCKEY_BLOB;
200pub const BCRYPT_ECC_FULLKEY_BLOB_V1: ULONG = 0x1;
201ENUM!{enum ECC_CURVE_TYPE_ENUM {
202    BCRYPT_ECC_PRIME_SHORT_WEIERSTRASS_CURVE = 0x1,
203    BCRYPT_ECC_PRIME_TWISTED_EDWARDS_CURVE = 0x2,
204    BCRYPT_ECC_PRIME_MONTGOMERY_CURVE = 0x3,
205}}
206ENUM!{enum ECC_CURVE_ALG_ID_ENUM {
207    BCRYPT_NO_CURVE_GENERATION_ALG_ID = 0x0,
208}}
209STRUCT!{struct BCRYPT_ECCFULLKEY_BLOB {
210    dwMagic: ULONG,
211    dwVersion: ULONG,
212    dwCurveType: ECC_CURVE_TYPE_ENUM,
213    dwCurveGenerationAlgId: ECC_CURVE_ALG_ID_ENUM,
214    cbFieldLength: ULONG,
215    cbSubgroupOrder: ULONG,
216    cbCofactor: ULONG,
217    cbSeed: ULONG,
218}}
219pub type PBCRYPT_ECCFULLKEY_BLOB = *mut BCRYPT_ECCFULLKEY_BLOB;
220pub const BCRYPT_DH_PUBLIC_BLOB: &'static str = "DHPUBLICBLOB";
221pub const BCRYPT_DH_PRIVATE_BLOB: &'static str = "DHPRIVATEBLOB";
222pub const LEGACY_DH_PUBLIC_BLOB: &'static str = "CAPIDHPUBLICBLOB";
223pub const LEGACY_DH_PRIVATE_BLOB: &'static str = "CAPIDHPRIVATEBLOB";
224pub const BCRYPT_DH_PUBLIC_MAGIC: ULONG = 0x42504844;
225pub const BCRYPT_DH_PRIVATE_MAGIC: ULONG = 0x56504844;
226STRUCT!{struct BCRYPT_DH_KEY_BLOB {
227    dwMagic: ULONG,
228    cbKey: ULONG,
229}}
230pub type PBCRYPT_DH_KEY_BLOB = *mut BCRYPT_DH_KEY_BLOB;
231pub const BCRYPT_DH_PARAMETERS: &'static str = "DHParameters";
232pub const BCRYPT_DH_PARAMETERS_MAGIC: ULONG = 0x4d504844;
233STRUCT!{struct BCRYPT_DH_PARAMETER_HEADER {
234    cbLength: ULONG,
235    dwMagic: ULONG,
236    cbKeyLength: ULONG,
237}}
238pub const BCRYPT_DSA_PUBLIC_BLOB: &'static str = "DSAPUBLICBLOB";
239pub const BCRYPT_DSA_PRIVATE_BLOB: &'static str = "DSAPRIVATEBLOB";
240pub const LEGACY_DSA_PUBLIC_BLOB: &'static str = "CAPIDSAPUBLICBLOB";
241pub const LEGACY_DSA_PRIVATE_BLOB: &'static str = "CAPIDSAPRIVATEBLOB";
242pub const LEGACY_DSA_V2_PUBLIC_BLOB: &'static str = "V2CAPIDSAPUBLICBLOB";
243pub const LEGACY_DSA_V2_PRIVATE_BLOB: &'static str = "V2CAPIDSAPRIVATEBLOB";
244pub const BCRYPT_DSA_PUBLIC_MAGIC: ULONG = 0x42505344;
245pub const BCRYPT_DSA_PRIVATE_MAGIC: ULONG = 0x56505344;
246pub const BCRYPT_DSA_PUBLIC_MAGIC_V2: ULONG = 0x32425044;
247pub const BCRYPT_DSA_PRIVATE_MAGIC_V2: ULONG = 0x32565044;
248STRUCT!{struct BCRYPT_DSA_KEY_BLOB {
249    dwMagic: ULONG,
250    cbKey: ULONG,
251    Count: [UCHAR; 4],
252    Seed: [UCHAR; 20],
253    q: [UCHAR; 20],
254}}
255pub type PBCRYPT_DSA_KEY_BLOB = *mut BCRYPT_DSA_KEY_BLOB;
256ENUM!{enum HASHALGORITHM_ENUM {
257    DSA_HASH_ALGORITHM_SHA1,
258    DSA_HASH_ALGORITHM_SHA256,
259    DSA_HASH_ALGORITHM_SHA512,
260}}
261ENUM!{enum DSAFIPSVERSION_ENUM {
262    DSA_FIPS186_2,
263    DSA_FIPS186_3,
264}}
265STRUCT!{struct BCRYPT_DSA_KEY_BLOB_V2 {
266    dwMagic: ULONG,
267    cbKey: ULONG,
268    hashAlgorithm: HASHALGORITHM_ENUM,
269    standardVersion: DSAFIPSVERSION_ENUM,
270    cbSeedLength: ULONG,
271    cbGroupSize: ULONG,
272    Count: [UCHAR; 4],
273}}
274pub type PBCRYPT_DSA_KEY_BLOB_V2 = *mut BCRYPT_DSA_KEY_BLOB_V2;
275STRUCT!{struct BCRYPT_KEY_DATA_BLOB_HEADER {
276    dwMagic: ULONG,
277    dwVersion: ULONG,
278    cbKeyData: ULONG,
279}}
280pub type PBCRYPT_KEY_DATA_BLOB_HEADER = *mut BCRYPT_KEY_DATA_BLOB_HEADER;
281pub const BCRYPT_KEY_DATA_BLOB_MAGIC: ULONG = 0x4d42444b;
282pub const BCRYPT_KEY_DATA_BLOB_VERSION1: ULONG = 0x1;
283pub const BCRYPT_DSA_PARAMETERS: &'static str = "DSAParameters";
284pub const BCRYPT_DSA_PARAMETERS_MAGIC: ULONG = 0x4d505344;
285pub const BCRYPT_DSA_PARAMETERS_MAGIC_V2: ULONG = 0x324d5044;
286STRUCT!{struct BCRYPT_DSA_PARAMETER_HEADER {
287    cbLength: ULONG,
288    dwMagic: ULONG,
289    cbKeyLength: ULONG,
290    Count: [UCHAR; 4],
291    Seed: [UCHAR; 20],
292    q: [UCHAR; 20],
293}}
294STRUCT!{struct BCRYPT_DSA_PARAMETER_HEADER_V2 {
295    cbLength: ULONG,
296    dwMagic: ULONG,
297    cbKeyLength: ULONG,
298    hashAlgorithm: HASHALGORITHM_ENUM,
299    standardVersion: DSAFIPSVERSION_ENUM,
300    cbSeedLength: ULONG,
301    cbGroupSize: ULONG,
302    Count: [UCHAR; 4],
303}}
304pub const BCRYPT_ECC_PARAMETERS: &'static str = "ECCParameters";
305pub const BCRYPT_ECC_CURVE_NAME: &'static str = "ECCCurveName";
306pub const BCRYPT_ECC_CURVE_NAME_LIST: &'static str = "ECCCurveNameList";
307pub const BCRYPT_ECC_PARAMETERS_MAGIC: ULONG = 0x50434345;
308STRUCT!{struct BCRYPT_ECC_CURVE_NAMES {
309    dwEccCurveNames: ULONG,
310    pEccCurveNames: LPWSTR,
311}}
312pub const BCRYPT_ECC_CURVE_BRAINPOOLP160R1: &'static str = "brainpoolP160r1";
313pub const BCRYPT_ECC_CURVE_BRAINPOOLP160T1: &'static str = "brainpoolP160t1";
314pub const BCRYPT_ECC_CURVE_BRAINPOOLP192R1: &'static str = "brainpoolP192r1";
315pub const BCRYPT_ECC_CURVE_BRAINPOOLP192T1: &'static str = "brainpoolP192t1";
316pub const BCRYPT_ECC_CURVE_BRAINPOOLP224R1: &'static str = "brainpoolP224r1";
317pub const BCRYPT_ECC_CURVE_BRAINPOOLP224T1: &'static str = "brainpoolP224t1";
318pub const BCRYPT_ECC_CURVE_BRAINPOOLP256R1: &'static str = "brainpoolP256r1";
319pub const BCRYPT_ECC_CURVE_BRAINPOOLP256T1: &'static str = "brainpoolP256t1";
320pub const BCRYPT_ECC_CURVE_BRAINPOOLP320R1: &'static str = "brainpoolP320r1";
321pub const BCRYPT_ECC_CURVE_BRAINPOOLP320T1: &'static str = "brainpoolP320t1";
322pub const BCRYPT_ECC_CURVE_BRAINPOOLP384R1: &'static str = "brainpoolP384r1";
323pub const BCRYPT_ECC_CURVE_BRAINPOOLP384T1: &'static str = "brainpoolP384t1";
324pub const BCRYPT_ECC_CURVE_BRAINPOOLP512R1: &'static str = "brainpoolP512r1";
325pub const BCRYPT_ECC_CURVE_BRAINPOOLP512T1: &'static str = "brainpoolP512t1";
326pub const BCRYPT_ECC_CURVE_25519: &'static str = "curve25519";
327pub const BCRYPT_ECC_CURVE_EC192WAPI: &'static str = "ec192wapi";
328pub const BCRYPT_ECC_CURVE_NISTP192: &'static str = "nistP192";
329pub const BCRYPT_ECC_CURVE_NISTP224: &'static str = "nistP224";
330pub const BCRYPT_ECC_CURVE_NISTP256: &'static str = "nistP256";
331pub const BCRYPT_ECC_CURVE_NISTP384: &'static str = "nistP384";
332pub const BCRYPT_ECC_CURVE_NISTP521: &'static str = "nistP521";
333pub const BCRYPT_ECC_CURVE_NUMSP256T1: &'static str = "numsP256t1";
334pub const BCRYPT_ECC_CURVE_NUMSP384T1: &'static str = "numsP384t1";
335pub const BCRYPT_ECC_CURVE_NUMSP512T1: &'static str = "numsP512t1";
336pub const BCRYPT_ECC_CURVE_SECP160K1: &'static str = "secP160k1";
337pub const BCRYPT_ECC_CURVE_SECP160R1: &'static str = "secP160r1";
338pub const BCRYPT_ECC_CURVE_SECP160R2: &'static str = "secP160r2";
339pub const BCRYPT_ECC_CURVE_SECP192K1: &'static str = "secP192k1";
340pub const BCRYPT_ECC_CURVE_SECP192R1: &'static str = "secP192r1";
341pub const BCRYPT_ECC_CURVE_SECP224K1: &'static str = "secP224k1";
342pub const BCRYPT_ECC_CURVE_SECP224R1: &'static str = "secP224r1";
343pub const BCRYPT_ECC_CURVE_SECP256K1: &'static str = "secP256k1";
344pub const BCRYPT_ECC_CURVE_SECP256R1: &'static str = "secP256r1";
345pub const BCRYPT_ECC_CURVE_SECP384R1: &'static str = "secP384r1";
346pub const BCRYPT_ECC_CURVE_SECP521R1: &'static str = "secP521r1";
347pub const BCRYPT_ECC_CURVE_WTLS7: &'static str = "wtls7";
348pub const BCRYPT_ECC_CURVE_WTLS9: &'static str = "wtls9";
349pub const BCRYPT_ECC_CURVE_WTLS12: &'static str = "wtls12";
350pub const BCRYPT_ECC_CURVE_X962P192V1: &'static str = "x962P192v1";
351pub const BCRYPT_ECC_CURVE_X962P192V2: &'static str = "x962P192v2";
352pub const BCRYPT_ECC_CURVE_X962P192V3: &'static str = "x962P192v3";
353pub const BCRYPT_ECC_CURVE_X962P239V1: &'static str = "x962P239v1";
354pub const BCRYPT_ECC_CURVE_X962P239V2: &'static str = "x962P239v2";
355pub const BCRYPT_ECC_CURVE_X962P239V3: &'static str = "x962P239v3";
356pub const BCRYPT_ECC_CURVE_X962P256V1: &'static str = "x962P256v1";
357ENUM!{enum BCRYPT_HASH_OPERATION_TYPE {
358    BCRYPT_HASH_OPERATION_HASH_DATA = 1,
359    BCRYPT_HASH_OPERATION_FINISH_HASH = 2,
360}}
361STRUCT!{struct BCRYPT_MULTI_HASH_OPERATION {
362    iHash: ULONG,
363    hashOperation: BCRYPT_HASH_OPERATION_TYPE,
364    pbBuffer: PUCHAR,
365    cbBuffer: ULONG,
366}}
367ENUM!{enum BCRYPT_MULTI_OPERATION_TYPE {
368    BCRYPT_OPERATION_TYPE_HASH = 1,
369}}
370STRUCT!{struct BCRYPT_MULTI_OBJECT_LENGTH_STRUCT {
371    cbPerObject: ULONG,
372    cbPerElement: ULONG,
373}}
374pub const MS_PRIMITIVE_PROVIDER: &'static str = "Microsoft Primitive Provider";
375pub const MS_PLATFORM_CRYPTO_PROVIDER: &'static str = "Microsoft Platform Crypto Provider";
376pub const BCRYPT_RSA_ALGORITHM: &'static str = "RSA";
377pub const BCRYPT_RSA_SIGN_ALGORITHM: &'static str = "RSA_SIGN";
378pub const BCRYPT_DH_ALGORITHM: &'static str = "DH";
379pub const BCRYPT_DSA_ALGORITHM: &'static str = "DSA";
380pub const BCRYPT_RC2_ALGORITHM: &'static str = "RC2";
381pub const BCRYPT_RC4_ALGORITHM: &'static str = "RC4";
382pub const BCRYPT_AES_ALGORITHM: &'static str = "AES";
383pub const BCRYPT_DES_ALGORITHM: &'static str = "DES";
384pub const BCRYPT_DESX_ALGORITHM: &'static str = "DESX";
385pub const BCRYPT_3DES_ALGORITHM: &'static str = "3DES";
386pub const BCRYPT_3DES_112_ALGORITHM: &'static str = "3DES_112";
387pub const BCRYPT_MD2_ALGORITHM: &'static str = "MD2";
388pub const BCRYPT_MD4_ALGORITHM: &'static str = "MD4";
389pub const BCRYPT_MD5_ALGORITHM: &'static str = "MD5";
390pub const BCRYPT_SHA1_ALGORITHM: &'static str = "SHA1";
391pub const BCRYPT_SHA256_ALGORITHM: &'static str = "SHA256";
392pub const BCRYPT_SHA384_ALGORITHM: &'static str = "SHA384";
393pub const BCRYPT_SHA512_ALGORITHM: &'static str = "SHA512";
394pub const BCRYPT_AES_GMAC_ALGORITHM: &'static str = "AES-GMAC";
395pub const BCRYPT_AES_CMAC_ALGORITHM: &'static str = "AES-CMAC";
396pub const BCRYPT_ECDSA_P256_ALGORITHM: &'static str = "ECDSA_P256";
397pub const BCRYPT_ECDSA_P384_ALGORITHM: &'static str = "ECDSA_P384";
398pub const BCRYPT_ECDSA_P521_ALGORITHM: &'static str = "ECDSA_P521";
399pub const BCRYPT_ECDH_P256_ALGORITHM: &'static str = "ECDH_P256";
400pub const BCRYPT_ECDH_P384_ALGORITHM: &'static str = "ECDH_P384";
401pub const BCRYPT_ECDH_P521_ALGORITHM: &'static str = "ECDH_P521";
402pub const BCRYPT_RNG_ALGORITHM: &'static str = "RNG";
403pub const BCRYPT_RNG_FIPS186_DSA_ALGORITHM: &'static str = "FIPS186DSARNG";
404pub const BCRYPT_RNG_DUAL_EC_ALGORITHM: &'static str = "DUALECRNG";
405pub const BCRYPT_SP800108_CTR_HMAC_ALGORITHM: &'static str = "SP800_108_CTR_HMAC";
406pub const BCRYPT_SP80056A_CONCAT_ALGORITHM: &'static str = "SP800_56A_CONCAT";
407pub const BCRYPT_PBKDF2_ALGORITHM: &'static str = "PBKDF2";
408pub const BCRYPT_CAPI_KDF_ALGORITHM: &'static str = "CAPI_KDF";
409pub const BCRYPT_TLS1_1_KDF_ALGORITHM: &'static str = "TLS1_1_KDF";
410pub const BCRYPT_TLS1_2_KDF_ALGORITHM: &'static str = "TLS1_2_KDF";
411pub const BCRYPT_ECDSA_ALGORITHM: &'static str = "ECDSA";
412pub const BCRYPT_ECDH_ALGORITHM: &'static str = "ECDH";
413pub const BCRYPT_XTS_AES_ALGORITHM: &'static str = "XTS-AES";
414pub const BCRYPT_CIPHER_INTERFACE: ULONG = 0x00000001;
415pub const BCRYPT_HASH_INTERFACE: ULONG = 0x00000002;
416pub const BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE: ULONG = 0x00000003;
417pub const BCRYPT_SECRET_AGREEMENT_INTERFACE: ULONG = 0x00000004;
418pub const BCRYPT_SIGNATURE_INTERFACE: ULONG = 0x00000005;
419pub const BCRYPT_RNG_INTERFACE: ULONG = 0x00000006;
420pub const BCRYPT_KEY_DERIVATION_INTERFACE: ULONG = 0x00000007;
421pub const BCRYPT_MD2_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000001 as BCRYPT_ALG_HANDLE;
422pub const BCRYPT_MD4_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000011 as BCRYPT_ALG_HANDLE;
423pub const BCRYPT_MD5_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000021 as BCRYPT_ALG_HANDLE;
424pub const BCRYPT_SHA1_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000031 as BCRYPT_ALG_HANDLE;
425pub const BCRYPT_SHA256_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000041 as BCRYPT_ALG_HANDLE;
426pub const BCRYPT_SHA384_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000051 as BCRYPT_ALG_HANDLE;
427pub const BCRYPT_SHA512_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000061 as BCRYPT_ALG_HANDLE;
428pub const BCRYPT_RC4_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000071 as BCRYPT_ALG_HANDLE;
429pub const BCRYPT_RNG_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000081 as BCRYPT_ALG_HANDLE;
430pub const BCRYPT_HMAC_MD5_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000091 as BCRYPT_ALG_HANDLE;
431pub const BCRYPT_HMAC_SHA1_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000000a1 as BCRYPT_ALG_HANDLE;
432pub const BCRYPT_HMAC_SHA256_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000000b1 as BCRYPT_ALG_HANDLE;
433pub const BCRYPT_HMAC_SHA384_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000000c1 as BCRYPT_ALG_HANDLE;
434pub const BCRYPT_HMAC_SHA512_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000000d1 as BCRYPT_ALG_HANDLE;
435pub const BCRYPT_RSA_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000000e1 as BCRYPT_ALG_HANDLE;
436pub const BCRYPT_ECDSA_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000000f1 as BCRYPT_ALG_HANDLE;
437pub const BCRYPT_AES_CMAC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000101 as BCRYPT_ALG_HANDLE;
438pub const BCRYPT_AES_GMAC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000111 as BCRYPT_ALG_HANDLE;
439pub const BCRYPT_HMAC_MD2_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000121 as BCRYPT_ALG_HANDLE;
440pub const BCRYPT_HMAC_MD4_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000131 as BCRYPT_ALG_HANDLE;
441pub const BCRYPT_3DES_CBC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000141 as BCRYPT_ALG_HANDLE;
442pub const BCRYPT_3DES_ECB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000151 as BCRYPT_ALG_HANDLE;
443pub const BCRYPT_3DES_CFB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000161 as BCRYPT_ALG_HANDLE;
444pub const BCRYPT_3DES_112_CBC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000171 as BCRYPT_ALG_HANDLE;
445pub const BCRYPT_3DES_112_ECB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000181 as BCRYPT_ALG_HANDLE;
446pub const BCRYPT_3DES_112_CFB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000191 as BCRYPT_ALG_HANDLE;
447pub const BCRYPT_AES_CBC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000001a1 as BCRYPT_ALG_HANDLE;
448pub const BCRYPT_AES_ECB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000001b1 as BCRYPT_ALG_HANDLE;
449pub const BCRYPT_AES_CFB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000001c1 as BCRYPT_ALG_HANDLE;
450pub const BCRYPT_AES_CCM_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000001d1 as BCRYPT_ALG_HANDLE;
451pub const BCRYPT_AES_GCM_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000001e1 as BCRYPT_ALG_HANDLE;
452pub const BCRYPT_DES_CBC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000001f1 as BCRYPT_ALG_HANDLE;
453pub const BCRYPT_DES_ECB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000201 as BCRYPT_ALG_HANDLE;
454pub const BCRYPT_DES_CFB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000211 as BCRYPT_ALG_HANDLE;
455pub const BCRYPT_DESX_CBC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000221 as BCRYPT_ALG_HANDLE;
456pub const BCRYPT_DESX_ECB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000231 as BCRYPT_ALG_HANDLE;
457pub const BCRYPT_DESX_CFB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000241 as BCRYPT_ALG_HANDLE;
458pub const BCRYPT_RC2_CBC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000251 as BCRYPT_ALG_HANDLE;
459pub const BCRYPT_RC2_ECB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000261 as BCRYPT_ALG_HANDLE;
460pub const BCRYPT_RC2_CFB_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000271 as BCRYPT_ALG_HANDLE;
461pub const BCRYPT_DH_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000281 as BCRYPT_ALG_HANDLE;
462pub const BCRYPT_ECDH_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000291 as BCRYPT_ALG_HANDLE;
463pub const BCRYPT_ECDH_P256_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000002a1 as BCRYPT_ALG_HANDLE;
464pub const BCRYPT_ECDH_P384_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000002b1 as BCRYPT_ALG_HANDLE;
465pub const BCRYPT_ECDH_P521_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000002c1 as BCRYPT_ALG_HANDLE;
466pub const BCRYPT_DSA_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000002d1 as BCRYPT_ALG_HANDLE;
467pub const BCRYPT_ECDSA_P256_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000002e1 as BCRYPT_ALG_HANDLE;
468pub const BCRYPT_ECDSA_P384_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x000002f1 as BCRYPT_ALG_HANDLE;
469pub const BCRYPT_ECDSA_P521_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000301 as BCRYPT_ALG_HANDLE;
470pub const BCRYPT_RSA_SIGN_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000311 as BCRYPT_ALG_HANDLE;
471pub const BCRYPT_CAPI_KDF_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000321 as BCRYPT_ALG_HANDLE;
472pub const BCRYPT_PBKDF2_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000331 as BCRYPT_ALG_HANDLE;
473pub const BCRYPT_SP800108_CTR_HMAC_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000341 as BCRYPT_ALG_HANDLE;
474pub const BCRYPT_SP80056A_CONCAT_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000351 as BCRYPT_ALG_HANDLE;
475pub const BCRYPT_TLS1_1_KDF_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000361 as BCRYPT_ALG_HANDLE;
476pub const BCRYPT_TLS1_2_KDF_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000371 as BCRYPT_ALG_HANDLE;
477pub const BCRYPT_XTS_AES_ALG_HANDLE: BCRYPT_ALG_HANDLE = 0x00000381 as BCRYPT_ALG_HANDLE;
478pub const BCRYPT_ALG_HANDLE_HMAC_FLAG: ULONG = 0x00000008;
479pub const BCRYPT_CAPI_AES_FLAG: ULONG = 0x00000010;
480pub const BCRYPT_HASH_REUSABLE_FLAG: ULONG = 0x00000020;
481pub const BCRYPT_BUFFERS_LOCKED_FLAG: ULONG = 0x00000040;
482pub const BCRYPT_EXTENDED_KEYSIZE: ULONG = 0x00000080;
483pub const BCRYPT_ENABLE_INCOMPATIBLE_FIPS_CHECKS: ULONG = 0x00000100;
484extern "system" {
485    pub fn BCryptOpenAlgorithmProvider(
486        phAlgorithm: *mut BCRYPT_ALG_HANDLE,
487        pszAlgId: LPCWSTR,
488        pszImplementation: LPCWSTR,
489        dwFlags: ULONG,
490    ) -> NTSTATUS;
491}
492pub const BCRYPT_CIPHER_OPERATION: ULONG = 0x00000001;
493pub const BCRYPT_HASH_OPERATION: ULONG = 0x00000002;
494pub const BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION: ULONG = 0x00000004;
495pub const BCRYPT_SECRET_AGREEMENT_OPERATION: ULONG = 0x00000008;
496pub const BCRYPT_SIGNATURE_OPERATION: ULONG = 0x00000010;
497pub const BCRYPT_RNG_OPERATION: ULONG = 0x00000020;
498pub const BCRYPT_KEY_DERIVATION_OPERATION: ULONG = 0x00000040;
499STRUCT!{struct BCRYPT_ALGORITHM_IDENTIFIER {
500    pszName: LPWSTR,
501    dwClass: ULONG,
502    dwFlags: ULONG,
503}}
504extern "system" {
505    pub fn BCryptEnumAlgorithms(
506        dwAlgOperations: ULONG,
507        pAlgCount: *mut ULONG,
508        ppAlgList: *mut *mut BCRYPT_ALGORITHM_IDENTIFIER,
509        dwFlags: ULONG,
510    ) -> NTSTATUS;
511}
512STRUCT!{struct BCRYPT_PROVIDER_NAME {
513    pszProviderName: LPWSTR,
514}}
515extern "system" {
516    pub fn BCryptEnumProviders(
517        pszAlgId: LPCWSTR,
518        pImplCount: *mut ULONG,
519        ppImplList: *mut *mut BCRYPT_PROVIDER_NAME,
520        dwFlags: ULONG,
521    ) -> NTSTATUS;
522}
523pub const BCRYPT_PUBLIC_KEY_FLAG: ULONG = 0x00000001;
524pub const BCRYPT_PRIVATE_KEY_FLAG: ULONG = 0x00000002;
525extern "system" {
526    pub fn BCryptGetProperty(
527        hObject: BCRYPT_HANDLE,
528        pszProperty: LPCWSTR,
529        pbOutput: PUCHAR,
530        cbOutput: ULONG,
531        pcbResult: *mut ULONG,
532        dwFlags: ULONG,
533    ) -> NTSTATUS;
534    pub fn BCryptSetProperty(
535        hObject: BCRYPT_HANDLE,
536        pszProperty: LPCWSTR,
537        pbInput: PUCHAR,
538        cbInput: ULONG,
539        dwFlags: ULONG,
540    ) -> NTSTATUS;
541    pub fn BCryptCloseAlgorithmProvider(
542        hAlgorithm: BCRYPT_ALG_HANDLE,
543        dwFlags: ULONG,
544    ) -> NTSTATUS;
545    pub fn BCryptFreeBuffer(
546        pvBuffer: PVOID,
547    );
548    pub fn BCryptGenerateSymmetricKey(
549        hAlgorithm: BCRYPT_ALG_HANDLE,
550        phKey: *mut BCRYPT_KEY_HANDLE,
551        pbKeyObject: PUCHAR,
552        cbKeyObject: ULONG,
553        pbSecret: PUCHAR,
554        cbSecret: ULONG,
555        dwFlags: ULONG,
556    ) -> NTSTATUS;
557    pub fn BCryptGenerateKeyPair(
558        hAlgorithm: BCRYPT_ALG_HANDLE,
559        phKey: *mut BCRYPT_KEY_HANDLE,
560        dwLength: ULONG,
561        dwFlags: ULONG,
562    ) -> NTSTATUS;
563    pub fn BCryptEncrypt(
564        hKey: BCRYPT_KEY_HANDLE,
565        pbInput: PUCHAR,
566        cbInput: ULONG,
567        pPaddingInfo: *mut VOID,
568        pbIV: PUCHAR,
569        cbIV: ULONG,
570        pbOutput: PUCHAR,
571        cbOutput: ULONG,
572        pcbResult: *mut ULONG,
573        dwFlags: ULONG,
574    ) -> NTSTATUS;
575    pub fn BCryptDecrypt(
576        hKey: BCRYPT_KEY_HANDLE,
577        pbInput: PUCHAR,
578        cbInput: ULONG,
579        pPaddingInfo: *mut VOID,
580        pbIV: PUCHAR,
581        cbIV: ULONG,
582        pbOutput: PUCHAR,
583        cbOutput: ULONG,
584        pcbResult: *mut ULONG,
585        dwFlags: ULONG,
586    ) -> NTSTATUS;
587    pub fn BCryptExportKey(
588        hKey: BCRYPT_KEY_HANDLE,
589        hExportKey: BCRYPT_KEY_HANDLE,
590        pszBlobType: LPCWSTR,
591        pbOutput: PUCHAR,
592        cbOutput: ULONG,
593        pcbResult: *mut ULONG,
594        dwFlags: ULONG,
595    ) -> NTSTATUS;
596    pub fn BCryptImportKey(
597        hAlgorithm: BCRYPT_ALG_HANDLE,
598        hImportKey: BCRYPT_KEY_HANDLE,
599        pszBlobType: LPCWSTR,
600        phKey: *mut BCRYPT_KEY_HANDLE,
601        pbKeyObject: PUCHAR,
602        cbKeyObject: ULONG,
603        pbInput: PUCHAR,
604        cbInput: ULONG,
605        dwFlags: ULONG,
606    ) -> NTSTATUS;
607}
608pub const BCRYPT_NO_KEY_VALIDATION: ULONG = 0x00000008;
609extern "system" {
610    pub fn BCryptImportKeyPair(
611        hAlgorithm: BCRYPT_ALG_HANDLE,
612        hImportKey: BCRYPT_KEY_HANDLE,
613        pszBlobType: LPCWSTR,
614        phKey: *mut BCRYPT_KEY_HANDLE,
615        pbInput: PUCHAR,
616        cbInput: ULONG,
617        dwFlags: ULONG,
618    ) -> NTSTATUS;
619    pub fn BCryptDuplicateKey(
620        hKey: BCRYPT_KEY_HANDLE,
621        phNewKey: *mut BCRYPT_KEY_HANDLE,
622        pbKeyObject: PUCHAR,
623        cbKeyObject: ULONG,
624        dwFlags: ULONG,
625    ) -> NTSTATUS;
626    pub fn BCryptFinalizeKeyPair(
627        hKey: BCRYPT_KEY_HANDLE,
628        dwFlags: ULONG,
629    ) -> NTSTATUS;
630    pub fn BCryptDestroyKey(
631        hKey: BCRYPT_KEY_HANDLE,
632    ) -> NTSTATUS;
633    pub fn BCryptDestroySecret(
634        hSecret: BCRYPT_SECRET_HANDLE,
635    ) -> NTSTATUS;
636    pub fn BCryptSignHash(
637        hKey: BCRYPT_KEY_HANDLE,
638        pPaddingInfo: *mut VOID,
639        pbInput: PUCHAR,
640        cbInput: ULONG,
641        pbOutput: PUCHAR,
642        cbOutput: ULONG,
643        pcbResult: *mut ULONG,
644        dwFlags: ULONG,
645    ) -> NTSTATUS;
646    pub fn BCryptVerifySignature(
647        hKey: BCRYPT_KEY_HANDLE,
648        pPaddingInfo: *mut VOID,
649        pbHash: PUCHAR,
650        cbHash: ULONG,
651        pbSignature: PUCHAR,
652        cbSignature: ULONG,
653        dwFlags: ULONG,
654    ) -> NTSTATUS;
655    pub fn BCryptSecretAgreement(
656        hPrivKey: BCRYPT_KEY_HANDLE,
657        hPubKey: BCRYPT_KEY_HANDLE,
658        phAgreedSecret: *mut BCRYPT_SECRET_HANDLE,
659        dwFlags: ULONG,
660    ) -> NTSTATUS;
661    pub fn BCryptDeriveKey(
662        hSharedSecret: BCRYPT_SECRET_HANDLE,
663        pwszKDF: LPCWSTR,
664        pParameterList: *mut BCryptBufferDesc,
665        pbDerivedKey: PUCHAR,
666        cbDerivedKey: ULONG,
667        pcbResult: *mut ULONG,
668        dwFlags: ULONG,
669    ) -> NTSTATUS;
670    pub fn BCryptKeyDerivation(
671        hKey: BCRYPT_KEY_HANDLE,
672        pParameterList: *mut BCryptBufferDesc,
673        pbDerivedKey: PUCHAR,
674        cbDerivedKey: ULONG,
675        pcbResult: *mut ULONG,
676        dwFlags: ULONG,
677    ) -> NTSTATUS;
678    pub fn BCryptCreateHash(
679        hAlgorithm: BCRYPT_ALG_HANDLE,
680        phHash: *mut BCRYPT_HASH_HANDLE,
681        pbHashObject: PUCHAR,
682        cbHashObject: ULONG,
683        pbSecret: PUCHAR,
684        cbSecret: ULONG,
685        dwFlags: ULONG,
686    ) -> NTSTATUS;
687    pub fn BCryptHashData(
688        hHash: BCRYPT_HASH_HANDLE,
689        pbInput: PUCHAR,
690        cbInput: ULONG,
691        dwFlags: ULONG,
692    ) -> NTSTATUS;
693    pub fn BCryptFinishHash(
694        hHash: BCRYPT_HASH_HANDLE,
695        pbOutput: PUCHAR,
696        cbOutput: ULONG,
697        dwFlags: ULONG,
698    ) -> NTSTATUS;
699    pub fn BCryptCreateMultiHash(
700        hAlgorithm: BCRYPT_ALG_HANDLE,
701        phHash: *mut BCRYPT_HASH_HANDLE,
702        nHashes: ULONG,
703        pbHashObject: PUCHAR,
704        cbHashObject: ULONG,
705        pbSecret: PUCHAR,
706        cbSecret: ULONG,
707        dwFlags: ULONG,
708    ) -> NTSTATUS;
709    pub fn BCryptProcessMultiOperations(
710        hObject: BCRYPT_HANDLE,
711        operationType: BCRYPT_MULTI_OPERATION_TYPE,
712        pOperations: PVOID,
713        cbOperations: ULONG,
714        dwFlags: ULONG,
715    ) -> NTSTATUS;
716    pub fn BCryptDuplicateHash(
717        hHash: BCRYPT_HASH_HANDLE,
718        phNewHash: *mut BCRYPT_HASH_HANDLE,
719        pbHashObject: PUCHAR,
720        cbHashObject: ULONG,
721        dwFlags: ULONG,
722    ) -> NTSTATUS;
723    pub fn BCryptDestroyHash(
724        hHash: BCRYPT_HASH_HANDLE,
725    ) -> NTSTATUS;
726    pub fn BCryptHash(
727        hAlgorithm: BCRYPT_ALG_HANDLE,
728        pbSecret: PUCHAR,
729        cbSecret: ULONG,
730        pbInput: PUCHAR,
731        cbInput: ULONG,
732        pbOutput: PUCHAR,
733        cbOutput: ULONG,
734    ) -> NTSTATUS;
735}
736pub const BCRYPT_RNG_USE_ENTROPY_IN_BUFFER: ULONG = 0x00000001;
737pub const BCRYPT_USE_SYSTEM_PREFERRED_RNG: ULONG = 0x00000002;
738extern "system" {
739    pub fn BCryptGenRandom(
740        hAlgorithm: BCRYPT_ALG_HANDLE,
741        pbBuffer: PUCHAR,
742        cbBuffer: ULONG,
743        dwFlags: ULONG,
744    ) -> NTSTATUS;
745    pub fn BCryptDeriveKeyCapi(
746        hHash: BCRYPT_HASH_HANDLE,
747        hTargetAlg: BCRYPT_ALG_HANDLE,
748        pbDerivedKey: PUCHAR,
749        cbDerivedKey: ULONG,
750        dwFlags: ULONG,
751    ) -> NTSTATUS;
752    pub fn BCryptDeriveKeyPBKDF2(
753        hPrf: BCRYPT_ALG_HANDLE,
754        pbPassword: PUCHAR,
755        cbPassword: ULONG,
756        pbSalt: PUCHAR,
757        cbSalt: ULONG,
758        cIterations: ULONGLONG,
759        pbDerivedKey: PUCHAR,
760        cbDerivedKey: ULONG,
761        dwFlags: ULONG,
762    ) -> NTSTATUS;
763}
764STRUCT!{struct BCRYPT_INTERFACE_VERSION {
765    MajorVersion: USHORT,
766    MinorVersion: USHORT,
767}}
768pub type PBCRYPT_INTERFACE_VERSION = *mut BCRYPT_INTERFACE_VERSION;
769#[inline]
770pub fn BCRYPT_IS_INTERFACE_VERSION_COMPATIBLE(
771    loader: BCRYPT_INTERFACE_VERSION,
772    provider: BCRYPT_INTERFACE_VERSION,
773) -> bool {
774    loader.MajorVersion <= provider.MajorVersion
775}
776pub const BCRYPT_CIPHER_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION =
777    BCRYPT_MAKE_INTERFACE_VERSION!(1, 0);
778pub const BCRYPT_HASH_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION =
779    BCRYPT_MAKE_INTERFACE_VERSION!(1, 0);
780pub const BCRYPT_HASH_INTERFACE_MAJORVERSION_2: USHORT = 2;
781pub const BCRYPT_HASH_INTERFACE_VERSION_2: BCRYPT_INTERFACE_VERSION =
782    BCRYPT_MAKE_INTERFACE_VERSION!(BCRYPT_HASH_INTERFACE_MAJORVERSION_2, 0);
783pub const BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION =
784    BCRYPT_MAKE_INTERFACE_VERSION!(1, 0);
785pub const BCRYPT_SECRET_AGREEMENT_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION =
786    BCRYPT_MAKE_INTERFACE_VERSION!(1, 0);
787pub const BCRYPT_SIGNATURE_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION =
788    BCRYPT_MAKE_INTERFACE_VERSION!(1, 0);
789pub const BCRYPT_RNG_INTERFACE_VERSION_1: BCRYPT_INTERFACE_VERSION =
790    BCRYPT_MAKE_INTERFACE_VERSION!(1, 0);
791pub const CRYPT_MIN_DEPENDENCIES: ULONG = 0x00000001;
792pub const CRYPT_PROCESS_ISOLATE: ULONG = 0x00010000;
793pub const CRYPT_UM: ULONG = 0x00000001;
794pub const CRYPT_KM: ULONG = 0x00000002;
795pub const CRYPT_MM: ULONG = 0x00000003;
796pub const CRYPT_ANY: ULONG = 0x00000004;
797pub const CRYPT_OVERWRITE: ULONG = 0x00000001;
798pub const CRYPT_LOCAL: ULONG = 0x00000001;
799pub const CRYPT_DOMAIN: ULONG = 0x00000002;
800pub const CRYPT_EXCLUSIVE: ULONG = 0x00000001;
801pub const CRYPT_OVERRIDE: ULONG = 0x00010000;
802pub const CRYPT_ALL_FUNCTIONS: ULONG = 0x00000001;
803pub const CRYPT_ALL_PROVIDERS: ULONG = 0x00000002;
804pub const CRYPT_PRIORITY_TOP: ULONG = 0x00000000;
805pub const CRYPT_PRIORITY_BOTTOM: ULONG = 0xFFFFFFFF;
806pub const CRYPT_DEFAULT_CONTEXT: &'static str = "Default";
807STRUCT!{struct CRYPT_INTERFACE_REG {
808    dwInterface: ULONG,
809    dwFlags: ULONG,
810    cFunctions: ULONG,
811    rgpszFunctions: *mut PWSTR,
812}}
813pub type PCRYPT_INTERFACE_REG = *mut CRYPT_INTERFACE_REG;
814STRUCT!{struct CRYPT_IMAGE_REG {
815    pszImage: PWSTR,
816    cInterfaces: ULONG,
817    rgpInterfaces: *mut PCRYPT_INTERFACE_REG,
818}}
819pub type PCRYPT_IMAGE_REG = *mut CRYPT_IMAGE_REG;
820STRUCT!{struct CRYPT_PROVIDER_REG {
821    cAliases: ULONG,
822    rgpszAliases: *mut PWSTR,
823    pUM: PCRYPT_IMAGE_REG,
824    pKM: PCRYPT_IMAGE_REG,
825}}
826pub type PCRYPT_PROVIDER_REG = *mut CRYPT_PROVIDER_REG;
827STRUCT!{struct CRYPT_PROVIDERS {
828    cProviders: ULONG,
829    rgpszProviders: *mut PWSTR,
830}}
831pub type PCRYPT_PROVIDERS = *mut CRYPT_PROVIDERS;
832STRUCT!{struct CRYPT_CONTEXT_CONFIG {
833    dwFlags: ULONG,
834    dwReserved: ULONG,
835}}
836pub type PCRYPT_CONTEXT_CONFIG = *mut CRYPT_CONTEXT_CONFIG;
837STRUCT!{struct CRYPT_CONTEXT_FUNCTION_CONFIG {
838    dwFlags: ULONG,
839    dwReserved: ULONG,
840}}
841pub type PCRYPT_CONTEXT_FUNCTION_CONFIG = *mut CRYPT_CONTEXT_FUNCTION_CONFIG;
842STRUCT!{struct CRYPT_CONTEXTS {
843    cContexts: ULONG,
844    rgpszContexts: *mut PWSTR,
845}}
846pub type PCRYPT_CONTEXTS = *mut CRYPT_CONTEXTS;
847STRUCT!{struct CRYPT_CONTEXT_FUNCTIONS {
848    cFunctions: ULONG,
849    rgpszFunctions: *mut PWSTR,
850}}
851pub type PCRYPT_CONTEXT_FUNCTIONS = *mut CRYPT_CONTEXT_FUNCTIONS;
852STRUCT!{struct CRYPT_CONTEXT_FUNCTION_PROVIDERS {
853    cProviders: ULONG,
854    rgpszProviders: *mut PWSTR,
855}}
856pub type PCRYPT_CONTEXT_FUNCTION_PROVIDERS = *mut CRYPT_CONTEXT_FUNCTION_PROVIDERS;
857STRUCT!{struct CRYPT_PROPERTY_REF {
858    pszProperty: PWSTR,
859    cbValue: ULONG,
860    pbValue: PUCHAR,
861}}
862pub type PCRYPT_PROPERTY_REF = *mut CRYPT_PROPERTY_REF;
863STRUCT!{struct CRYPT_IMAGE_REF {
864    pszImage: PWSTR,
865    dwFlags: ULONG,
866}}
867pub type PCRYPT_IMAGE_REF = *mut CRYPT_IMAGE_REF;
868STRUCT!{struct CRYPT_PROVIDER_REF {
869    dwInterface: ULONG,
870    pszFunction: PWSTR,
871    pszProvider: PWSTR,
872    cProperties: ULONG,
873    rgpProperties: *mut PCRYPT_PROPERTY_REF,
874    pUM: PCRYPT_IMAGE_REF,
875    pKM: PCRYPT_IMAGE_REF,
876}}
877pub type PCRYPT_PROVIDER_REF = *mut CRYPT_PROVIDER_REF;
878STRUCT!{struct CRYPT_PROVIDER_REFS {
879    cProviders: ULONG,
880    rgpProviders: *mut PCRYPT_PROVIDER_REF,
881}}
882pub type PCRYPT_PROVIDER_REFS = *mut CRYPT_PROVIDER_REFS;
883extern "system" {
884    pub fn BCryptQueryProviderRegistration(
885        pszProvider: LPCWSTR,
886        dwMode: ULONG,
887        dwInterface: ULONG,
888        pcbBuffer: *mut ULONG,
889        ppBuffer: *mut PCRYPT_PROVIDER_REG,
890    ) -> NTSTATUS;
891    pub fn BCryptEnumRegisteredProviders(
892        pcbBuffer: *mut ULONG,
893        ppBuffer: *mut PCRYPT_PROVIDERS,
894    ) -> NTSTATUS;
895    pub fn BCryptCreateContext(
896        dwTable: ULONG,
897        pszContext: LPCWSTR,
898        pConfig: PCRYPT_CONTEXT_CONFIG,
899    ) -> NTSTATUS;
900    pub fn BCryptDeleteContext(
901        dwTable: ULONG,
902        pszContext: LPCWSTR,
903    ) -> NTSTATUS;
904    pub fn BCryptEnumContexts(
905        dwTable: ULONG,
906        pcbBuffer: *mut ULONG,
907        ppBuffer: *mut PCRYPT_CONTEXTS,
908    ) -> NTSTATUS;
909    pub fn BCryptConfigureContext(
910        dwTable: ULONG,
911        pszContext: LPCWSTR,
912        pConfig: PCRYPT_CONTEXT_CONFIG,
913    ) -> NTSTATUS;
914    pub fn BCryptQueryContextConfiguration(
915        dwTable: ULONG,
916        pszContext: LPCWSTR,
917        pcbBuffer: *mut ULONG,
918        ppBuffer: *mut PCRYPT_CONTEXT_CONFIG,
919    ) -> NTSTATUS;
920    pub fn BCryptAddContextFunction(
921        dwTable: ULONG,
922        pszContext: LPCWSTR,
923        dwInterface: ULONG,
924        pszFunction: LPCWSTR,
925        dwPosition: ULONG,
926    ) -> NTSTATUS;
927    pub fn BCryptRemoveContextFunction(
928        dwTable: ULONG,
929        pszContext: LPCWSTR,
930        dwInterface: ULONG,
931        pszFunction: LPCWSTR,
932    ) -> NTSTATUS;
933    pub fn BCryptEnumContextFunctions(
934        dwTable: ULONG,
935        pszContext: LPCWSTR,
936        dwInterface: ULONG,
937        pcbBuffer: *mut ULONG,
938        ppBuffer: *mut PCRYPT_CONTEXT_FUNCTIONS,
939    ) -> NTSTATUS;
940    pub fn BCryptConfigureContextFunction(
941        dwTable: ULONG,
942        pszContext: LPCWSTR,
943        dwInterface: ULONG,
944        pszFunction: LPCWSTR,
945        pConfig: PCRYPT_CONTEXT_FUNCTION_CONFIG,
946    ) -> NTSTATUS;
947    pub fn BCryptQueryContextFunctionConfiguration(
948        dwTable: ULONG,
949        pszContext: LPCWSTR,
950        dwInterface: ULONG,
951        pszFunction: LPCWSTR,
952        pcbBuffer: *mut ULONG,
953        ppBuffer: *mut PCRYPT_CONTEXT_FUNCTION_CONFIG,
954    ) -> NTSTATUS;
955    pub fn BCryptEnumContextFunctionProviders(
956        dwTable: ULONG,
957        pszContext: LPCWSTR,
958        dwInterface: ULONG,
959        pszFunction: LPCWSTR,
960        pcbBuffer: *mut ULONG,
961        ppBuffer: *mut PCRYPT_CONTEXT_FUNCTION_PROVIDERS,
962    ) -> NTSTATUS;
963    pub fn BCryptSetContextFunctionProperty(
964        dwTable: ULONG,
965        pszContext: LPCWSTR,
966        dwInterface: ULONG,
967        pszFunction: LPCWSTR,
968        pszProperty: LPCWSTR,
969        cbValue: ULONG,
970        pbValue: PUCHAR,
971    ) -> NTSTATUS;
972    pub fn BCryptQueryContextFunctionProperty(
973        dwTable: ULONG,
974        pszContext: LPCWSTR,
975        dwInterface: ULONG,
976        pszFunction: LPCWSTR,
977        pszProperty: LPCWSTR,
978        pcbValue: *mut ULONG,
979        ppbValue: *mut PUCHAR,
980    ) -> NTSTATUS;
981    pub fn BCryptRegisterConfigChangeNotify(
982        phEvent: *mut HANDLE,
983    ) -> NTSTATUS;
984    pub fn BCryptUnregisterConfigChangeNotify(
985        hEvent: HANDLE,
986    ) -> NTSTATUS;
987    pub fn BCryptResolveProviders(
988        pszContext: LPCWSTR,
989        dwInterface: ULONG,
990        pszFunction: LPCWSTR,
991        pszProvider: LPCWSTR,
992        dwMode: ULONG,
993        dwFlags: ULONG,
994        pcbBuffer: *mut ULONG,
995        ppBuffer: *mut PCRYPT_PROVIDER_REFS,
996    ) -> NTSTATUS;
997    pub fn BCryptGetFipsAlgorithmMode(
998        pfEnabled: *mut BOOLEAN,
999    ) -> NTSTATUS;
1000    pub fn CngGetFipsAlgorithmMode() -> BOOLEAN;
1001}