1 /**
2  * Cryptographic primitives
3  *
4  * Translated from MinGW-w64 Windows headers
5  *
6  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Authors: Aya Partridge
8  * Source: $(DRUNTIMESRC core/sys/windows/_bcrypt.d)
9  */
10 module nulib.system.win32.bcrypt;
11 
12 
13 pragma(lib, "bcrypt");
14 
15 import nulib.system.win32.ntdef, nulib.system.win32.sdkddkver, nulib.system.win32.winbase, nulib.system.win32.windef, nulib.system.win32.winnt;
16 
17 pragma(inline, true)
18 bool BCRYPT_SUCCESS(NTSTATUS Status) @nogc nothrow pure @safe => Status >= 0;
19 
20 enum BCRYPT_OBJECT_ALIGNMENT = 16;
21 
22 enum {
23 	BCRYPT_KDF_HASH = "HASH"w,
24 	BCRYPT_KDF_HMAC = "HMAC"w,
25 	BCRYPT_KDF_TLS_PRF = "TLS_PRF"w,
26 	BCRYPT_KDF_SP80056A_CONCAT = "SP800_56A_CONCAT"w,
27 }
28 static if (NTDDI_VERSION >= NTDDI_WINBLUE)
29 enum {
30 	BCRYPT_KDF_RAW_SECRET = "TRUNCATE"w,
31 }
32 static if (NTDDI_VERSION >= NTDDI_WIN10_RS4)
33 enum {
34 	BCRYPT_KDF_HKDF = "HKDF"w,
35 }
36 
37 enum {
38 	KDF_HASH_ALGORITHM = 0x0,
39 	KDF_SECRET_PREPEND = 0x1,
40 	KDF_SECRET_APPEND = 0x2,
41 	KDF_HMAC_KEY = 0x3,
42 	KDF_TLS_PRF_LABEL = 0x4,
43 	KDF_TLS_PRF_SEED = 0x5,
44 	KDF_SECRET_HANDLE = 0x6,
45 }
46 static if (NTDDI_VERSION >= NTDDI_WIN7)
47 enum {
48 	KDF_TLS_PRF_PROTOCOL = 0x7,
49 	KDF_ALGORITHMID = 0x8,
50 	KDF_PARTYUINFO = 0x9,
51 	KDF_PARTYVINFO = 0xA,
52 	KDF_SUPPPUBINFO = 0xB,
53 	KDF_SUPPPRIVINFO = 0xC,
54 }
55 static if (NTDDI_VERSION >= NTDDI_WIN8)
56 enum {
57 	KDF_LABEL = 0xD,
58 	KDF_CONTEXT = 0xE,
59 	KDF_SALT = 0xF,
60 	KDF_ITERATION_COUNT = 0x10,
61 	KDF_GENERIC_PARAMETER = 0x11,
62 	KDF_KEYBITLENGTH = 0x12,
63 }
64 static if (NTDDI_VERSION >= NTDDI_WIN10_RS4)
65 enum {
66 	KDF_HKDF_SALT = 0x13,
67 	KDF_HKDF_INFO = 0x14,
68 }
69 
70 enum KDF_USE_SECRET_AS_HMAC_KEY_FLAG = 1;
71 
72 enum BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION = 1;
73 
74 enum {
75 	BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG = 0x00000001,
76 	BCRYPT_AUTH_MODE_IN_PROGRESS_FLAG = 0x00000002,
77 }
78 
79 pragma(inline, true)
80 void BCRYPT_INIT_AUTH_MODE_INFO(ref BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO _AUTH_INFO_STRUCT_) @nogc nothrow pure @safe {
81 	(() @trusted => RtlZeroMemory(&_AUTH_INFO_STRUCT_, _AUTH_INFO_STRUCT_.sizeof))();
82 	_AUTH_INFO_STRUCT_.cbSize = _AUTH_INFO_STRUCT_.sizeof;
83 	_AUTH_INFO_STRUCT_.dwInfoVersion = BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION;
84 }
85 
86 enum {
87 	BCRYPT_OPAQUE_KEY_BLOB = "OpaqueKeyBlob"w,
88 	BCRYPT_KEY_DATA_BLOB = "KeyDataBlob"w,
89 }
90 static if (NTDDI_VERSION >= NTDDI_WIN7)
91 enum {
92 	BCRYPT_AES_WRAP_KEY_BLOB = "Rfc3565KeyWrapBlob"w,
93 }
94 
95 enum {
96 	BCRYPT_ALGORITHM_NAME = "AlgorithmName"w,
97 	BCRYPT_AUTH_TAG_LENGTH = "AuthTagLength"w,
98 	BCRYPT_BLOCK_LENGTH = "BlockLength"w,
99 	BCRYPT_BLOCK_SIZE_LIST = "BlockSizeList"w,
100 	BCRYPT_CHAINING_MODE = "ChainingMode"w,
101 	BCRYPT_CHAIN_MODE_CBC = "ChainingModeCBC"w,
102 	BCRYPT_CHAIN_MODE_CCM = "ChainingModeCCM"w,
103 	BCRYPT_CHAIN_MODE_CFB = "ChainingModeCFB"w,
104 	BCRYPT_CHAIN_MODE_ECB = "ChainingModeECB"w,
105 	BCRYPT_CHAIN_MODE_GCM = "ChainingModeGCM"w,
106 	BCRYPT_CHAIN_MODE_NA = "ChainingModeN/A"w,
107 	BCRYPT_EFFECTIVE_KEY_LENGTH = "EffectiveKeyLength"w,
108 	BCRYPT_HASH_BLOCK_LENGTH = "HashBlockLength"w,
109 	BCRYPT_HASH_LENGTH = "HashDigestLength"w,
110 	BCRYPT_HASH_OID_LIST = "HashOIDList"w,
111 	BCRYPT_INITIALIZATION_VECTOR = "IV"w,
112 	BCRYPT_IS_KEYED_HASH = "IsKeyedHash"w,
113 	BCRYPT_IS_REUSABLE_HASH = "IsReusableHash"w,
114 	BCRYPT_KEY_LENGTH = "KeyLength"w,
115 	BCRYPT_KEY_LENGTHS = "KeyLengths"w,
116 	BCRYPT_KEY_OBJECT_LENGTH = "KeyObjectLength"w,
117 	BCRYPT_KEY_STRENGTH = "KeyStrength"w,
118 	BCRYPT_MESSAGE_BLOCK_LENGTH = "MessageBlockLength"w,
119 	BCRYPT_OBJECT_LENGTH = "ObjectLength"w,
120 	BCRYPT_PADDING_SCHEMES = "PaddingSchemes"w,
121 	BCRYPT_PCP_PLATFORM_TYPE_PROPERTY = "PCP_PLATFORM_TYPE"w,
122 	BCRYPT_PCP_PROVIDER_VERSION_PROPERTY = "PCP_PROVIDER_VERSION"w,
123 	BCRYPT_PRIMITIVE_TYPE = "PrimitiveType"w,
124 	BCRYPT_PROVIDER_HANDLE = "ProviderHandle"w,
125 	BCRYPT_PUBLIC_KEY_LENGTH = "PublicKeyLength"w,
126 	BCRYPT_SIGNATURE_LENGTH = "SignatureLength"w,
127 }
128 static if (NTDDI_VERSION >= NTDDI_WINBLUE)
129 enum {
130 	BCRYPT_MULTI_OBJECT_LENGTH = "MultiObjectLength"w,
131 }
132 static if (NTDDI_VERSION >= NTDDI_WIN10_RS4)
133 enum {
134 	BCRYPT_IS_IFX_TPM_WEAK_KEY = "IsIfxTpmWeakKey"w,
135 	BCRYPT_HKDF_HASH_ALGORITHM = "HkdfHashAlgorithm"w,
136 	BCRYPT_HKDF_SALT_AND_FINALIZE = "HkdfSaltAndFinalize"w,
137 	BCRYPT_HKDF_PRK_AND_FINALIZE = "HkdfPrkAndFinalize"w,
138 }
139 static if (NTDDI_VERSION >= NTDDI_WIN11_ZN)
140 enum {
141 	BCRYPT_FUNCTION_NAME_STRING = "FunctionNameString"w,
142 	BCRYPT_CUSTOMIZATION_STRING = "CustomizationString"w,
143 }
144 static if (NTDDI_VERSION >= NTDDI_WIN11_GA)
145 enum {
146 	BCRYPT_CHAIN_MODE_KWP = "ChainingModeKWP"w,
147 }
148 
149 enum {
150 	BCRYPT_SUPPORTED_PAD_ROUTER = 0x00000001,
151 	BCRYPT_SUPPORTED_PAD_PKCS1_ENC = 0x00000002,
152 	BCRYPT_SUPPORTED_PAD_PKCS1_SIG = 0x00000004,
153 	BCRYPT_SUPPORTED_PAD_OAEP = 0x00000008,
154 	BCRYPT_SUPPORTED_PAD_PSS = 0x00000010,
155 }
156 
157 enum BCRYPT_PROV_DISPATCH = 0x00000001;
158 
159 enum BCRYPT_BLOCK_PADDING = 0x00000001;
160 
161 static if (NTDDI_VERSION >= NTDDI_WIN10_CO)
162 enum BCRYPT_GENERATE_IV = 0x00000020;
163 
164 enum {
165 	BCRYPT_PAD_NONE = 0x00000001,
166 	BCRYPT_PAD_PKCS1 = 0x00000002,
167 	BCRYPT_PAD_OAEP = 0x00000004,
168 	BCRYPT_PAD_PSS = 0x00000008,
169 }
170 static if (NTDDI_VERSION >= NTDDI_WINBLUE)
171 enum {
172 	BCRYPT_PAD_PKCS1_OPTIONAL_HASH_OID = 0x00000010,
173 }
174 
175 enum BCRYPTBUFFER_VERSION = 0;
176 
177 struct BCRYPT_KEY_LENGTHS_STRUCT {
178 	ULONG dwMinLength;
179 	ULONG dwMaxLength;
180 	ULONG dwIncrement;
181 }
182 
183 alias BCRYPT_AUTH_TAG_LENGTHS_STRUCT = BCRYPT_KEY_LENGTHS_STRUCT;
184 
185 struct BCRYPT_OID {
186 	ULONG cbOID;
187 	PUCHAR pbOID;
188 }
189 
190 struct BCRYPT_OID_LIST {
191 	ULONG dwOIDCount;
192 	BCRYPT_OID* pOIDs;
193 }
194 
195 struct BCRYPT_PKCS1_PADDING_INFO {
196 	LPCWSTR pszAlgId;
197 }
198 
199 struct BCRYPT_PSS_PADDING_INFO {
200 	LPCWSTR pszAlgId;
201 	ULONG cbSalt;
202 }
203 
204 struct BCRYPT_OAEP_PADDING_INFO {
205 	LPCWSTR pszAlgId;
206 	PUCHAR pbLabel;
207 	ULONG cbLabel;
208 }
209 
210 struct BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO {
211 	ULONG cbSize;
212 	ULONG dwInfoVersion;
213 	PUCHAR pbNonce;
214 	ULONG cbNonce;
215 	PUCHAR pbAuthData;
216 	ULONG cbAuthData;
217 	PUCHAR pbTag;
218 	ULONG cbTag;
219 	PUCHAR pbMacContext;
220 	ULONG cbMacContext;
221 	ULONG cbAAD;
222 	ULONGLONG cbData;
223 	ULONG dwFlags;
224 }
225 alias PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO = BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO*;
226 
227 struct BCryptBuffer {
228 	ULONG cbBuffer;
229 	ULONG BufferType;
230 	PVOID pvBuffer;
231 }
232 alias PBCryptBuffer = BCryptBuffer*;
233 
234 struct BCryptBufferDesc {
235 	ULONG ulVersion;
236 	ULONG cBuffers;
237 	PBCryptBuffer pBuffers;
238 }
239 alias PBCryptBufferDesc = BCryptBufferDesc*;
240 
241 enum {
242 	BCRYPT_PUBLIC_KEY_BLOB = "PUBLICBLOB"w,
243 	BCRYPT_PRIVATE_KEY_BLOB = "PRIVATEBLOB"w,
244 }
245 
246 enum {
247 	BCRYPT_RSAPUBLIC_BLOB = "RSAPUBLICBLOB"w,
248 	BCRYPT_RSAPRIVATE_BLOB = "RSAPRIVATEBLOB"w,
249 	LEGACY_RSAPUBLIC_BLOB = "CAPIPUBLICBLOB"w,
250 	LEGACY_RSAPRIVATE_BLOB = "CAPIPRIVATEBLOB"w,
251 }
252 
253 enum {
254 	BCRYPT_RSAPUBLIC_MAGIC = 0x31415352,
255 	BCRYPT_RSAPRIVATE_MAGIC = 0x32415352,
256 }
257 
258 enum BCRYPT_RSAFULLPRIVATE_BLOB = "RSAFULLPRIVATEBLOB"w;
259 
260 enum BCRYPT_RSAFULLPRIVATE_MAGIC = 0x33415352;
261 
262 static if (NTDDI_VERSION >= NTDDI_WIN8) {
263 	enum BCRYPT_GLOBAL_PARAMETERS = "SecretAgreementParam"w;
264 	enum BCRYPT_PRIVATE_KEY = "PrivKeyVal"w;
265 }
266 
267 enum {
268 	BCRYPT_ECCPUBLIC_BLOB = "ECCPUBLICBLOB"w,
269 	BCRYPT_ECCPRIVATE_BLOB = "ECCPRIVATEBLOB"w,
270 }
271 static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
272 enum {
273 	BCRYPT_ECCFULLPUBLIC_BLOB = "ECCFULLPUBLICBLOB"w,
274 	BCRYPT_ECCFULLPRIVATE_BLOB = "ECCFULLPRIVATEBLOB"w,
275 }
276 
277 static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
278 enum SSL_ECCPUBLIC_BLOB = "SSLECCPUBLICBLOB"w;
279 
280 enum TLS_13_PRE_SHARED_KEY = "TLS13PRESHAREDKEY"w;
281 
282 enum {
283 	BCRYPT_ECDH_PUBLIC_P256_MAGIC = 0x314B4345,
284 	BCRYPT_ECDH_PRIVATE_P256_MAGIC = 0x324B4345,
285 	BCRYPT_ECDH_PUBLIC_P384_MAGIC = 0x334B4345,
286 	BCRYPT_ECDH_PRIVATE_P384_MAGIC = 0x344B4345,
287 	BCRYPT_ECDH_PUBLIC_P521_MAGIC = 0x354B4345,
288 	BCRYPT_ECDH_PRIVATE_P521_MAGIC = 0x364B4345,
289 }
290 static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
291 enum {
292 	BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC = 0x504B4345,
293 	BCRYPT_ECDH_PRIVATE_GENERIC_MAGIC = 0x564B4345,
294 }
295 
296 enum {
297 	BCRYPT_ECDSA_PUBLIC_P256_MAGIC = 0x31534345,
298 	BCRYPT_ECDSA_PRIVATE_P256_MAGIC = 0x32534345,
299 	BCRYPT_ECDSA_PUBLIC_P384_MAGIC = 0x33534345,
300 	BCRYPT_ECDSA_PRIVATE_P384_MAGIC = 0x34534345,
301 	BCRYPT_ECDSA_PUBLIC_P521_MAGIC = 0x35534345,
302 	BCRYPT_ECDSA_PRIVATE_P521_MAGIC = 0x36534345,
303 }
304 static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
305 enum {
306 	BCRYPT_ECDSA_PUBLIC_GENERIC_MAGIC = 0x50444345,
307 	BCRYPT_ECDSA_PRIVATE_GENERIC_MAGIC = 0x56444345,
308 }
309 
310 enum {
311 	BCRYPT_DH_PUBLIC_BLOB = "DHPUBLICBLOB"w,
312 	BCRYPT_DH_PRIVATE_BLOB = "DHPRIVATEBLOB"w,
313 	LEGACY_DH_PUBLIC_BLOB = "CAPIDHPUBLICBLOB"w,
314 	LEGACY_DH_PRIVATE_BLOB = "CAPIDHPRIVATEBLOB"w,
315 }
316 
317 enum {
318 	BCRYPT_DH_PUBLIC_MAGIC = 0x42504844,
319 	BCRYPT_DH_PRIVATE_MAGIC = 0x56504844,
320 }
321 
322 enum {
323 	BCRYPT_DH_PARAMETERS = "DHParameters"w,
324 	BCRYPT_DH_PARAMETERS_MAGIC = 0x4D504844,
325 }
326 
327 enum {
328 	BCRYPT_DSA_PUBLIC_BLOB = "DSAPUBLICBLOB"w,
329 	BCRYPT_DSA_PRIVATE_BLOB = "DSAPRIVATEBLOB"w,
330 	LEGACY_DSA_PUBLIC_BLOB = "CAPIDSAPUBLICBLOB"w,
331 	LEGACY_DSA_PRIVATE_BLOB = "CAPIDSAPRIVATEBLOB"w,
332 	LEGACY_DSA_V2_PUBLIC_BLOB = "V2CAPIDSAPUBLICBLOB"w,
333 	LEGACY_DSA_V2_PRIVATE_BLOB = "V2CAPIDSAPRIVATEBLOB"w,
334 }
335 
336 enum {
337 	BCRYPT_DSA_PUBLIC_MAGIC = 0x42505344,
338 	BCRYPT_DSA_PRIVATE_MAGIC = 0x56505344,
339 	BCRYPT_DSA_PUBLIC_MAGIC_V2 = 0x32425044,
340 	BCRYPT_DSA_PRIVATE_MAGIC_V2 = 0x32565044,
341 }
342 
343 enum {
344 	BCRYPT_KEY_DATA_BLOB_MAGIC = 0x4D42444B,
345 	BCRYPT_KEY_DATA_BLOB_VERSION1 = 0x1,
346 }
347 
348 enum {
349 	BCRYPT_DSA_PARAMETERS = "DSAParameters"w,
350 	BCRYPT_DSA_PARAMETERS_MAGIC = 0x4D505344,
351 	BCRYPT_DSA_PARAMETERS_MAGIC_V2 = 0x324D5044,
352 }
353 
354 enum {
355 	MS_PRIMITIVE_PROVIDER = "Microsoft Primitive Provider"w,
356 	MS_PLATFORM_CRYPTO_PROVIDER = "Microsoft Platform Crypto Provider"w,
357 }
358 
359 enum {
360 	BCRYPT_RSA_ALGORITHM = "RSA"w,
361 	BCRYPT_RSA_SIGN_ALGORITHM = "RSA_SIGN"w,
362 	BCRYPT_DH_ALGORITHM = "DH"w,
363 	BCRYPT_DSA_ALGORITHM = "DSA"w,
364 	BCRYPT_RC2_ALGORITHM = "RC2"w,
365 	BCRYPT_RC4_ALGORITHM = "RC4"w,
366 	BCRYPT_AES_ALGORITHM = "AES"w,
367 	BCRYPT_DES_ALGORITHM = "DES"w,
368 	BCRYPT_DESX_ALGORITHM = "DESX"w,
369 	BCRYPT_3DES_ALGORITHM = "3DES"w,
370 	BCRYPT_3DES_112_ALGORITHM = "3DES_112"w,
371 	BCRYPT_MD2_ALGORITHM = "MD2"w,
372 	BCRYPT_MD4_ALGORITHM = "MD4"w,
373 	BCRYPT_MD5_ALGORITHM = "MD5"w,
374 	BCRYPT_SHA1_ALGORITHM = "SHA1"w,
375 	BCRYPT_SHA256_ALGORITHM = "SHA256"w,
376 	BCRYPT_SHA384_ALGORITHM = "SHA384"w,
377 	BCRYPT_SHA512_ALGORITHM = "SHA512"w,
378 	BCRYPT_AES_GMAC_ALGORITHM = "AES-GMAC"w,
379 	BCRYPT_AES_CMAC_ALGORITHM = "AES-CMAC"w,
380 	BCRYPT_ECDSA_P256_ALGORITHM = "ECDSA_P256"w,
381 	BCRYPT_ECDSA_P384_ALGORITHM = "ECDSA_P384"w,
382 	BCRYPT_ECDSA_P521_ALGORITHM = "ECDSA_P521"w,
383 	BCRYPT_ECDH_P256_ALGORITHM = "ECDH_P256"w,
384 	BCRYPT_ECDH_P384_ALGORITHM = "ECDH_P384"w,
385 	BCRYPT_ECDH_P521_ALGORITHM = "ECDH_P521"w,
386 	BCRYPT_RNG_ALGORITHM = "RNG"w,
387 	BCRYPT_RNG_FIPS186_DSA_ALGORITHM = "FIPS186DSARNG"w,
388 	BCRYPT_RNG_DUAL_EC_ALGORITHM = "DUALECRNG"w,
389 	BCRYPT_SP800108_CTR_HMAC_ALGORITHM = "SP800_108_CTR_HMAC"w,
390 	BCRYPT_SP80056A_CONCAT_ALGORITHM = "SP800_56A_CONCAT"w,
391 	BCRYPT_PBKDF2_ALGORITHM = "PBKDF2"w,
392 	BCRYPT_CAPI_KDF_ALGORITHM = "CAPI_KDF"w,
393 }
394 
395 enum {
396 	BCRYPT_CIPHER_INTERFACE = 0x00000001,
397 	BCRYPT_HASH_INTERFACE = 0x00000002,
398 	BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE = 0x00000003,
399 	BCRYPT_SECRET_AGREEMENT_INTERFACE = 0x00000004,
400 	BCRYPT_SIGNATURE_INTERFACE = 0x00000005,
401 	BCRYPT_RNG_INTERFACE = 0x00000006,
402 	BCRYPT_KEY_DERIVATION_INTERFACE = 0x00000007,
403 }
404 
405 static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
406 enum : BCRYPT_ALG_HANDLE {
407 	BCRYPT_MD2_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000001,
408 	BCRYPT_MD4_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000011,
409 	BCRYPT_MD5_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000021,
410 	BCRYPT_SHA1_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000031,
411 	BCRYPT_SHA256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000041,
412 	BCRYPT_SHA384_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000051,
413 	BCRYPT_SHA512_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000061,
414 	BCRYPT_RC4_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000071,
415 	BCRYPT_RNG_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000081,
416 	BCRYPT_HMAC_MD5_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000091,
417 	BCRYPT_HMAC_SHA1_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000000A1,
418 	BCRYPT_HMAC_SHA256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000000B1,
419 	BCRYPT_HMAC_SHA384_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000000C1,
420 	BCRYPT_HMAC_SHA512_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000000D1,
421 	BCRYPT_RSA_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000000E1,
422 	BCRYPT_ECDSA_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000000F1,
423 
424 	BCRYPT_AES_CMAC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000101,
425 	BCRYPT_AES_GMAC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000111,
426 	BCRYPT_HMAC_MD2_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000121,
427 	BCRYPT_HMAC_MD4_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000131,
428 
429 	BCRYPT_3DES_CBC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000141,
430 	BCRYPT_3DES_ECB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000151,
431 	BCRYPT_3DES_CFB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000161,
432 	BCRYPT_3DES_112_CBC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000171,
433 	BCRYPT_3DES_112_ECB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000181,
434 	BCRYPT_3DES_112_CFB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000191,
435 	BCRYPT_AES_CBC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000001A1,
436 	BCRYPT_AES_ECB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000001B1,
437 	BCRYPT_AES_CFB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000001C1,
438 	BCRYPT_AES_CCM_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000001D1,
439 	BCRYPT_AES_GCM_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000001E1,
440 	BCRYPT_DES_CBC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000001F1,
441 	BCRYPT_DES_ECB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000201,
442 	BCRYPT_DES_CFB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000211,
443 	BCRYPT_DESX_CBC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000221,
444 	BCRYPT_DESX_ECB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000231,
445 	BCRYPT_DESX_CFB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000241,
446 	BCRYPT_RC2_CBC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000251,
447 	BCRYPT_RC2_ECB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000261,
448 	BCRYPT_RC2_CFB_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000271,
449 
450 	BCRYPT_DH_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000281,
451 	BCRYPT_ECDH_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000291,
452 	BCRYPT_ECDH_P256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000002A1,
453 	BCRYPT_ECDH_P384_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000002B1,
454 	BCRYPT_ECDH_P521_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000002C1,
455 	BCRYPT_DSA_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000002D1,
456 	BCRYPT_ECDSA_P256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000002E1,
457 	BCRYPT_ECDSA_P384_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000002F1,
458 	BCRYPT_ECDSA_P521_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000301,
459 	BCRYPT_RSA_SIGN_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000311,
460 
461 	BCRYPT_CAPI_KDF_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000321,
462 	BCRYPT_PBKDF2_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000331,
463 
464 	BCRYPT_SP800108_CTR_HMAC_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000341,
465 	BCRYPT_SP80056A_CONCAT_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000351,
466 
467 	BCRYPT_TLS1_1_KDF_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000361,
468 	BCRYPT_TLS1_2_KDF_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000371,
469 
470 	BCRYPT_XTS_AES_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000381,
471 
472 	BCRYPT_HKDF_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000391,
473 }
474 static if (NTDDI_VERSION >= NTDDI_WIN10_FE)
475 enum {
476 	BCRYPT_CHACHA20_POLY1305_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000003A1,
477 }
478 static if (NTDDI_VERSION >= NTDDI_WIN11_ZN)
479 enum {
480 	BCRYPT_SHA3_256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000003B1,
481 	BCRYPT_SHA3_384_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000003C1,
482 	BCRYPT_SHA3_512_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000003D1,
483 	BCRYPT_HMAC_SHA3_256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000003E1,
484 	BCRYPT_HMAC_SHA3_384_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x000003F1,
485 	BCRYPT_HMAC_SHA3_512_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000401,
486 	BCRYPT_CSHAKE128_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000411,
487 	BCRYPT_CSHAKE256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000421,
488 	BCRYPT_KMAC128_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000431,
489 	BCRYPT_KMAC256_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000441,
490 }
491 static if (NTDDI_VERSION >= NTDDI_WIN11_GA)
492 enum {
493 	BCRYPT_AES_KWP_ALG_HANDLE = cast(BCRYPT_ALG_HANDLE) 0x00000451,
494 }
495 
496 enum {
497 	BCRYPT_ALG_HANDLE_HMAC_FLAG = 0x00000008,
498 	BCRYPT_CAPI_AES_FLAG = 0x00000010,
499 	BCRYPT_HASH_REUSABLE_FLAG = 0x00000020,
500 
501 	BCRYPT_BUFFERS_LOCKED_FLAG = 0x00000040,
502 }
503 
504 enum {
505 	BCRYPT_CIPHER_OPERATION = 0x00000001,
506 	BCRYPT_HASH_OPERATION = 0x00000002,
507 	BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION = 0x00000004,
508 	BCRYPT_SECRET_AGREEMENT_OPERATION = 0x00000008,
509 	BCRYPT_SIGNATURE_OPERATION = 0x00000010,
510 	BCRYPT_RNG_OPERATION = 0x00000020,
511 	BCRYPT_KEY_DERIVATION_OPERATION = 0x00000040,
512 }
513 
514 enum {
515 	BCRYPT_PUBLIC_KEY_FLAG = 0x00000001,
516 	BCRYPT_PRIVATE_KEY_FLAG = 0x00000002,
517 }
518 
519 enum BCRYPT_NO_KEY_VALIDATION = 0x00000008;
520 
521 enum {
522 	BCRYPT_RNG_USE_ENTROPY_IN_BUFFER = 0x00000001,
523 	BCRYPT_USE_SYSTEM_PREFERRED_RNG = 0x00000002,
524 }
525 
526 pragma(inline, true) @nogc nothrow pure @safe {
527 	BCRYPT_INTERFACE_VERSION BCRYPT_MAKE_INTERFACE_VERSION(int major, int minor) =>
528 		BCRYPT_INTERFACE_VERSION(MajorVersion: cast(USHORT)major, MinorVersion: cast(USHORT)minor);
529 	bool BCRYPT_IS_INTERFACE_VERSION_COMPATIBLE(BCRYPT_INTERFACE_VERSION loader, BCRYPT_INTERFACE_VERSION provider) =>
530 		loader.MajorVersion <= provider.MajorVersion;
531 }
532 
533 enum {
534 	BCRYPT_CIPHER_INTERFACE_VERSION_1 = BCRYPT_MAKE_INTERFACE_VERSION(1, 0),
535 	BCRYPT_HASH_INTERFACE_VERSION_1 = BCRYPT_MAKE_INTERFACE_VERSION(1, 0),
536 	BCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE_VERSION_1 = BCRYPT_MAKE_INTERFACE_VERSION(1, 0),
537 	BCRYPT_SECRET_AGREEMENT_INTERFACE_VERSION_1 = BCRYPT_MAKE_INTERFACE_VERSION(1, 0),
538 	BCRYPT_SIGNATURE_INTERFACE_VERSION_1 = BCRYPT_MAKE_INTERFACE_VERSION(1, 0),
539 	BCRYPT_RNG_INTERFACE_VERSION_1 = BCRYPT_MAKE_INTERFACE_VERSION(1, 0),
540 }
541 
542 enum {
543 	CRYPT_MIN_DEPENDENCIES = 0x00000001,
544 	CRYPT_PROCESS_ISOLATE = 0x00010000,
545 }
546 
547 enum {
548 	CRYPT_UM = 0x00000001,
549 	CRYPT_KM = 0x00000002,
550 	CRYPT_MM = 0x00000003,
551 	CRYPT_ANY = 0x00000004,
552 }
553 
554 enum CRYPT_OVERWRITE = 0x00000001;
555 
556 enum {
557 	CRYPT_LOCAL = 0x00000001,
558 	CRYPT_DOMAIN = 0x00000002,
559 }
560 
561 enum {
562 	CRYPT_EXCLUSIVE = 0x00000001,
563 	CRYPT_OVERRIDE = 0x00010000,
564 }
565 
566 enum {
567 	CRYPT_ALL_FUNCTIONS = 0x00000001,
568 	CRYPT_ALL_PROVIDERS = 0x00000002,
569 }
570 
571 enum {
572 	CRYPT_PRIORITY_TOP = 0x00000000,
573 	CRYPT_PRIORITY_BOTTOM = 0xFFFFFFFF,
574 }
575 
576 enum CRYPT_DEFAULT_CONTEXT = "Default"w;
577 
578 alias BCRYPT_HANDLE = PVOID;
579 alias BCRYPT_ALG_HANDLE = PVOID;
580 alias BCRYPT_KEY_HANDLE = PVOID;
581 alias BCRYPT_HASH_HANDLE = PVOID;
582 alias BCRYPT_SECRET_HANDLE = PVOID;
583 
584 struct BCRYPT_KEY_BLOB {
585 	ULONG Magic;
586 }
587 
588 struct BCRYPT_RSAKEY_BLOB {
589 	ULONG Magic;
590 	ULONG BitLength;
591 	ULONG cbPublicExp;
592 	ULONG cbModulus;
593 	ULONG cbPrime1;
594 	ULONG cbPrime2;
595 }
596 
597 struct BCRYPT_ECCKEY_BLOB {
598 	ULONG dwMagic;
599 	ULONG cbKey;
600 }
601 alias PBCRYPT_ECCKEY_BLOB = BCRYPT_ECCKEY_BLOB*;
602 
603 static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) {
604 	struct SSL_ECCKEY_BLOB {
605 		ULONG dwCurveType;
606 		ULONG cbKey;
607 	}
608 	alias PSSL_ECCKEY_BLOB = SSL_ECCKEY_BLOB*;
609 
610 	enum BCRYPT_ECC_FULLKEY_BLOB_V1 = 0x1;
611 
612 	alias ECC_CURVE_TYPE_ENUM = int;
613 	enum : ECC_CURVE_TYPE_ENUM {
614 		BCRYPT_ECC_PRIME_SHORT_WEIERSTRASS_CURVE = 0x1,
615 		BCRYPT_ECC_PRIME_TWISTED_EDWARDS_CURVE = 0x2,
616 		BCRYPT_ECC_PRIME_MONTGOMERY_CURVE = 0x3
617 	}
618 
619 	alias ECC_CURVE_ALG_ID_ENUM = int;
620 	enum : ECC_CURVE_ALG_ID_ENUM {
621 		BCRYPT_NO_CURVE_GENERATION_ALG_ID = 0x0,
622 	}
623 
624 	struct BCRYPT_ECCFULLKEY_BLOB {
625 		ULONG dwMagic;
626 		ULONG dwVersion;
627 		ECC_CURVE_TYPE_ENUM dwCurveType;
628 		ECC_CURVE_ALG_ID_ENUM dwCurveGenerationAlgId;
629 		ULONG cbFieldLength;
630 		ULONG cbSubgroupOrder;
631 		ULONG cbCofactor;
632 		ULONG cbSeed;
633 	}
634 	alias PBCRYPT_ECCFULLKEY_BLOB = BCRYPT_ECCFULLKEY_BLOB*;
635 }
636 
637 struct BCRYPT_DH_KEY_BLOB {
638 	ULONG dwMagic;
639 	ULONG cbKey;
640 }
641 alias PBCRYPT_DH_KEY_BLOB = BCRYPT_DH_KEY_BLOB*;
642 
643 struct BCRYPT_DH_PARAMETER_HEADER {
644 	ULONG cbLength;
645 	ULONG dwMagic;
646 	ULONG cbKeyLength;
647 }
648 
649 struct BCRYPT_DSA_KEY_BLOB {
650 	ULONG dwMagic;
651 	ULONG cbKey;
652 	UCHAR[4] Count;
653 	UCHAR[20] Seed;
654 	UCHAR[20] q;
655 }
656 alias PBCRYPT_DSA_KEY_BLOB = BCRYPT_DSA_KEY_BLOB*;
657 
658 alias HASHALGORITHM_ENUM = int;
659 enum : HASHALGORITHM_ENUM {
660 	DSA_HASH_ALGORITHM_SHA1,
661 	DSA_HASH_ALGORITHM_SHA256,
662 	DSA_HASH_ALGORITHM_SHA512,
663 }
664 
665 alias DSAFIPSVERSION_ENUM = int;
666 enum : DSAFIPSVERSION_ENUM {
667 	DSA_FIPS186_2,
668 	DSA_FIPS186_3,
669 }
670 
671 struct BCRYPT_DSA_KEY_BLOB_V2 {
672 	ULONG dwMagic;
673 	ULONG cbKey;
674 	HASHALGORITHM_ENUM hashAlgorithm;
675 	DSAFIPSVERSION_ENUM standardVersion;
676 	ULONG cbSeedLength;
677 	ULONG cbGroupSize;
678 	UCHAR[4] Count;
679 }
680 alias PBCRYPT_DSA_KEY_BLOB_V2 = BCRYPT_DSA_KEY_BLOB_V2*;
681 
682 struct BCRYPT_KEY_DATA_BLOB_HEADER {
683 	ULONG dwMagic;
684 	ULONG dwVersion;
685 	ULONG cbKeyData;
686 }
687 alias PBCRYPT_KEY_DATA_BLOB_HEADER = BCRYPT_KEY_DATA_BLOB_HEADER*;
688 
689 struct BCRYPT_DSA_PARAMETER_HEADER {
690 	ULONG cbLength;
691 	ULONG dwMagic;
692 	ULONG cbKeyLength;
693 	UCHAR[4] Count;
694 	UCHAR[20] Seed;
695 	UCHAR[20] q;
696 }
697 
698 struct BCRYPT_DSA_PARAMETER_HEADER_V2 {
699 	ULONG cbLength;
700 	ULONG dwMagic;
701 	ULONG cbKeyLength;
702 	HASHALGORITHM_ENUM hashAlgorithm;
703 	DSAFIPSVERSION_ENUM standardVersion;
704 	ULONG cbSeedLength;
705 	ULONG cbGroupSize;
706 	UCHAR[4] Count;
707 }
708 
709 struct BCRYPT_ECC_CURVE_NAMES {
710 	ULONG dwEccCurveNames;
711 	LPWSTR* pEccCurveNames;
712 }
713 
714 alias BCRYPT_HASH_OPERATION_TYPE = int;
715 enum : BCRYPT_HASH_OPERATION_TYPE {
716 	BCRYPT_HASH_OPERATION_HASH_DATA = 1,
717 	BCRYPT_HASH_OPERATION_FINISH_HASH = 2,
718 }
719 
720 struct BCRYPT_MULTI_HASH_OPERATION {
721 	ULONG iHash;
722 	BCRYPT_HASH_OPERATION_TYPE hashOperation;
723 	PUCHAR pbBuffer;
724 	ULONG cbBuffer;
725 }
726 
727 alias BCRYPT_MULTI_OPERATION_TYPE = int;
728 enum : BCRYPT_MULTI_OPERATION_TYPE {
729 	BCRYPT_OPERATION_TYPE_HASH = 1,
730 }
731 
732 struct BCRYPT_MULTI_OBJECT_LENGTH_STRUCT {
733 	ULONG cbPerObject;
734 	ULONG cbPerElement;
735 }
736 
737 struct BCRYPT_ALGORITHM_IDENTIFIER {
738 	LPWSTR pszName;
739 	ULONG dwClass;
740 	ULONG dwFlags;
741 }
742 
743 struct BCRYPT_PROVIDER_NAME {
744 	LPWSTR pszProviderName;
745 }
746 
747 struct BCRYPT_INTERFACE_VERSION {
748 	USHORT MajorVersion;
749 	USHORT MinorVersion;
750 }
751 alias PBCRYPT_INTERFACE_VERSION = BCRYPT_INTERFACE_VERSION*;
752 
753 struct CRYPT_INTERFACE_REG {
754 	ULONG dwInterface;
755 	ULONG dwFlags;
756 	ULONG cFunctions;
757 	PWSTR* rgpszFunctions;
758 }
759 alias PCRYPT_INTERFACE_REG = CRYPT_INTERFACE_REG*;
760 
761 struct CRYPT_IMAGE_REG {
762 	PWSTR pszImage;
763 	ULONG cInterfaces;
764 	PCRYPT_INTERFACE_REG* rgpInterfaces;
765 }
766 alias PCRYPT_IMAGE_REG = CRYPT_IMAGE_REG*;
767 
768 struct CRYPT_PROVIDER_REG {
769 	ULONG cAliases;
770 	PWSTR* rgpszAliases;
771 	PCRYPT_IMAGE_REG pUM;
772 	PCRYPT_IMAGE_REG pKM;
773 }
774 alias PCRYPT_PROVIDER_REG = CRYPT_PROVIDER_REG*;
775 
776 struct CRYPT_PROVIDERS {
777 	ULONG cProviders;
778 	PWSTR* rgpszProviders;
779 }
780 alias PCRYPT_PROVIDERS = CRYPT_PROVIDERS*;
781 
782 struct CRYPT_CONTEXT_CONFIG {
783 	ULONG dwFlags;
784 	ULONG dwReserved;
785 }
786 alias PCRYPT_CONTEXT_CONFIG = CRYPT_CONTEXT_CONFIG*;
787 
788 struct CRYPT_CONTEXT_FUNCTION_CONFIG {
789 	ULONG dwFlags;
790 	ULONG dwReserved;
791 }
792 alias PCRYPT_CONTEXT_FUNCTION_CONFIG = CRYPT_CONTEXT_FUNCTION_CONFIG*;
793 
794 struct CRYPT_CONTEXTS {
795 	ULONG cContexts;
796 	PWSTR* rgpszContexts;
797 }
798 alias PCRYPT_CONTEXTS = CRYPT_CONTEXTS*;
799 
800 struct CRYPT_CONTEXT_FUNCTIONS {
801 	ULONG cFunctions;
802 	PWSTR* rgpszFunctions;
803 }
804 alias PCRYPT_CONTEXT_FUNCTIONS = CRYPT_CONTEXT_FUNCTIONS*;
805 
806 struct CRYPT_CONTEXT_FUNCTION_PROVIDERS {
807 	ULONG cProviders;
808 	PWSTR* rgpszProviders;
809 }
810 alias PCRYPT_CONTEXT_FUNCTION_PROVIDERS = CRYPT_CONTEXT_FUNCTION_PROVIDERS*;
811 
812 struct CRYPT_PROPERTY_REF {
813 	PWSTR pszProperty;
814 	ULONG cbValue;
815 	PUCHAR pbValue;
816 }
817 alias PCRYPT_PROPERTY_REF = CRYPT_PROPERTY_REF*;
818 
819 struct CRYPT_IMAGE_REF {
820 	PWSTR pszImage;
821 	ULONG dwFlags;
822 }
823 alias PCRYPT_IMAGE_REF = CRYPT_IMAGE_REF*;
824 
825 struct CRYPT_PROVIDER_REF {
826 	ULONG dwInterface;
827 	PWSTR pszFunction;
828 	PWSTR pszProvider;
829 	ULONG cProperties;
830 	PCRYPT_PROPERTY_REF* rgpProperties;
831 	PCRYPT_IMAGE_REF pUM;
832 	PCRYPT_IMAGE_REF pKM;
833 }
834 alias PCRYPT_PROVIDER_REF = CRYPT_PROVIDER_REF*;
835 
836 struct CRYPT_PROVIDER_REFS {
837 	ULONG cProviders;
838 	PCRYPT_PROVIDER_REF* rgpProviders;
839 }
840 alias PCRYPT_PROVIDER_REFS = CRYPT_PROVIDER_REFS*;
841 
842 extern(Windows) @nogc nothrow {
843 	NTSTATUS BCryptOpenAlgorithmProvider(scope BCRYPT_ALG_HANDLE* phAlgorithm, scope LPCWSTR pszAlgId, scope LPCWSTR pszImplementation, ULONG dwFlags);
844 	NTSTATUS BCryptEnumAlgorithms(ULONG dwAlgOperations, scope ULONG* pAlgCount, scope BCRYPT_ALGORITHM_IDENTIFIER** ppAlgList, ULONG dwFlags);
845 	NTSTATUS BCryptEnumProviders(scope LPCWSTR pszAlgId, scope ULONG* pImplCount, scope BCRYPT_PROVIDER_NAME** ppImplList, ULONG dwFlags);
846 	NTSTATUS BCryptGetProperty(BCRYPT_HANDLE hObject, scope LPCWSTR pszProperty, scope PUCHAR pbOutput, ULONG cbOutput, scope ULONG* pcbResult, ULONG dwFlags);
847 	NTSTATUS BCryptSetProperty(BCRYPT_HANDLE hObject, scope LPCWSTR pszProperty, scope PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);
848 	NTSTATUS BCryptCloseAlgorithmProvider(BCRYPT_ALG_HANDLE hAlgorithm, ULONG dwFlags);
849 	VOID BCryptFreeBuffer(PVOID pvBuffer);
850 	NTSTATUS BCryptGenerateSymmetricKey(BCRYPT_ALG_HANDLE hAlgorithm, scope BCRYPT_KEY_HANDLE* phKey, scope PUCHAR pbKeyObject, ULONG cbKeyObject, scope PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);
851 	NTSTATUS BCryptGenerateKeyPair(BCRYPT_ALG_HANDLE hAlgorithm, scope BCRYPT_KEY_HANDLE* phKey, ULONG dwLength, ULONG dwFlags);
852 	NTSTATUS BCryptEncrypt(BCRYPT_KEY_HANDLE hKey, scope PUCHAR pbInput, ULONG cbInput, scope VOID* pPaddingInfo, scope PUCHAR pbIV, ULONG cbIV, scope PUCHAR pbOutput, ULONG cbOutput, scope ULONG* pcbResult, ULONG dwFlags);
853 	NTSTATUS BCryptDecrypt(BCRYPT_KEY_HANDLE hKey, scope PUCHAR pbInput, ULONG cbInput, scope VOID* pPaddingInfo, scope PUCHAR pbIV, ULONG cbIV, scope PUCHAR pbOutput, ULONG cbOutput, scope ULONG* pcbResult, ULONG dwFlags);
854 	NTSTATUS BCryptExportKey(BCRYPT_KEY_HANDLE hKey, BCRYPT_KEY_HANDLE hExportKey, scope LPCWSTR pszBlobType, scope PUCHAR pbOutput, ULONG cbOutput, scope ULONG* pcbResult, ULONG dwFlags);
855 	NTSTATUS BCryptImportKey(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE hImportKey, scope LPCWSTR pszBlobType, scope BCRYPT_KEY_HANDLE* phKey, scope PUCHAR pbKeyObject, ULONG cbKeyObject, scope PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);
856 	NTSTATUS BCryptImportKeyPair(BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE hImportKey, scope LPCWSTR pszBlobType, scope BCRYPT_KEY_HANDLE* phKey, scope PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);
857 	NTSTATUS BCryptDuplicateKey(BCRYPT_KEY_HANDLE hKey, scope BCRYPT_KEY_HANDLE* phNewKey, scope PUCHAR pbKeyObject, ULONG cbKeyObject, ULONG dwFlags);
858 	NTSTATUS BCryptFinalizeKeyPair(BCRYPT_KEY_HANDLE hKey, ULONG dwFlags);
859 	NTSTATUS BCryptDestroyKey(BCRYPT_KEY_HANDLE hKey);
860 	NTSTATUS BCryptDestroySecret(BCRYPT_SECRET_HANDLE hSecret);
861 	NTSTATUS BCryptSignHash(BCRYPT_KEY_HANDLE hKey, scope VOID* pPaddingInfo, scope PUCHAR pbInput, ULONG cbInput, scope PUCHAR pbOutput, ULONG cbOutput, scope ULONG* pcbResult, ULONG dwFlags);
862 	NTSTATUS BCryptVerifySignature(BCRYPT_KEY_HANDLE hKey, scope VOID* pPaddingInfo, scope PUCHAR pbHash, ULONG cbHash, scope PUCHAR pbSignature, ULONG cbSignature, ULONG dwFlags);
863 	NTSTATUS BCryptSecretAgreement(BCRYPT_KEY_HANDLE hPrivKey, BCRYPT_KEY_HANDLE hPubKey, scope BCRYPT_SECRET_HANDLE* phAgreedSecret, ULONG dwFlags);
864 	NTSTATUS BCryptDeriveKey(BCRYPT_SECRET_HANDLE hSharedSecret, LPCWSTR pwszKDF, scope BCryptBufferDesc* pParameterList, scope PUCHAR pbDerivedKey, ULONG cbDerivedKey, scope ULONG* pcbResult, ULONG dwFlags);
865 	NTSTATUS BCryptKeyDerivation(BCRYPT_KEY_HANDLE hKey, scope BCryptBufferDesc* pParameterList, scope PUCHAR pbDerivedKey, ULONG cbDerivedKey, scope ULONG* pcbResult, ULONG dwFlags);
866 	NTSTATUS BCryptCreateHash(BCRYPT_ALG_HANDLE hAlgorithm, scope BCRYPT_HASH_HANDLE* phHash, scope PUCHAR pbHashObject, ULONG cbHashObject, scope PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);
867 	NTSTATUS BCryptHashData(BCRYPT_HASH_HANDLE hHash, scope PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);
868 	NTSTATUS BCryptFinishHash(BCRYPT_HASH_HANDLE hHash, scope PUCHAR pbOutput, ULONG cbOutput, ULONG dwFlags);
869 	static if (NTDDI_VERSION >= NTDDI_WINBLUE) {
870 		NTSTATUS BCryptCreateMultiHash(BCRYPT_ALG_HANDLE hAlgorithm, scope BCRYPT_HASH_HANDLE* phHash, ULONG nHashes, scope PUCHAR pbHashObject, ULONG cbHashObject, scope PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);
871 		NTSTATUS BCryptProcessMultiOperations(BCRYPT_HANDLE hObject, BCRYPT_MULTI_OPERATION_TYPE operationType, scope PVOID pOperations, ULONG cbOperations, ULONG dwFlags);
872 	}
873 	NTSTATUS BCryptDuplicateHash(BCRYPT_HASH_HANDLE hHash, scope BCRYPT_HASH_HANDLE* phNewHash, scope PUCHAR pbHashObject, ULONG cbHashObject, ULONG dwFlags);
874 	NTSTATUS BCryptDestroyHash(BCRYPT_HASH_HANDLE hHash);
875 	static if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD) {
876 		NTSTATUS BCryptHash(BCRYPT_ALG_HANDLE hAlgorithm, scope PUCHAR pbSecret, ULONG cbSecret, scope PUCHAR pbInput, ULONG cbInput, scope PUCHAR pbOutput, ULONG cbOutput);
877 	}
878 	NTSTATUS BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, scope PUCHAR pbBuffer, ULONG cbBuffer, ULONG dwFlags);
879 	NTSTATUS BCryptDeriveKeyCapi(BCRYPT_HASH_HANDLE hHash, BCRYPT_ALG_HANDLE hTargetAlg, scope PUCHAR pbDerivedKey, ULONG cbDerivedKey, ULONG dwFlags);
880 	NTSTATUS BCryptDeriveKeyPBKDF2(BCRYPT_ALG_HANDLE hPrf, scope PUCHAR pbPassword, ULONG cbPassword, scope PUCHAR pbSalt, ULONG cbSalt, ULONGLONG cIterations, scope PUCHAR pbDerivedKey, ULONG cbDerivedKey, ULONG dwFlags);
881 	NTSTATUS BCryptResolveProviders(scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, scope LPCWSTR pszProvider, ULONG dwMode, ULONG dwFlags, scope ULONG* pcbBuffer, scope PCRYPT_PROVIDER_REFS* ppBuffer);
882 	NTSTATUS BCryptGetFipsAlgorithmMode(scope BOOLEAN* pfEnabled);
883 	NTSTATUS BCryptQueryProviderRegistration(scope LPCWSTR pszProvider, ULONG dwMode, ULONG dwInterface, scope ULONG* pcbBuffer, scope PCRYPT_PROVIDER_REG* ppBuffer);
884 	NTSTATUS BCryptEnumRegisteredProviders(scope ULONG* pcbBuffer, scope PCRYPT_PROVIDERS* ppBuffer);
885 	NTSTATUS BCryptCreateContext(ULONG dwTable, scope LPCWSTR pszContext, PCRYPT_CONTEXT_CONFIG pConfig);
886 	NTSTATUS BCryptDeleteContext(ULONG dwTable, scope LPCWSTR pszContext);
887 	NTSTATUS BCryptEnumContexts(ULONG dwTable, scope ULONG* pcbBuffer, scope PCRYPT_CONTEXTS* ppBuffer);
888 	NTSTATUS BCryptConfigureContext(ULONG dwTable, scope LPCWSTR pszContext, PCRYPT_CONTEXT_CONFIG pConfig);
889 	NTSTATUS BCryptQueryContextConfiguration(ULONG dwTable, scope LPCWSTR pszContext, scope ULONG* pcbBuffer, scope PCRYPT_CONTEXT_CONFIG* ppBuffer);
890 	NTSTATUS BCryptAddContextFunction(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, ULONG dwPosition);
891 	NTSTATUS BCryptRemoveContextFunction(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction);
892 	NTSTATUS BCryptEnumContextFunctions(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope ULONG* pcbBuffer, scope PCRYPT_CONTEXT_FUNCTIONS* ppBuffer);
893 	NTSTATUS BCryptConfigureContextFunction(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, PCRYPT_CONTEXT_FUNCTION_CONFIG pConfig);
894 	NTSTATUS BCryptQueryContextFunctionConfiguration(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, scope ULONG* pcbBuffer, scope PCRYPT_CONTEXT_FUNCTION_CONFIG* ppBuffer);
895 	NTSTATUS BCryptEnumContextFunctionProviders(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, scope ULONG* pcbBuffer, scope PCRYPT_CONTEXT_FUNCTION_PROVIDERS* ppBuffer);
896 	NTSTATUS BCryptSetContextFunctionProperty(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, LPCWSTR pszProperty, ULONG cbValue, scope PUCHAR pbValue);
897 	NTSTATUS BCryptQueryContextFunctionProperty(ULONG dwTable, scope LPCWSTR pszContext, ULONG dwInterface, scope LPCWSTR pszFunction, LPCWSTR pszProperty, ULONG* pcbValue, scope PUCHAR* ppbValue);
898 	NTSTATUS BCryptUnregisterConfigChangeNotify(HANDLE hEvent);
899 
900 	deprecated("BCryptRegisterConfigChangeNotify is deprecated beginning with Windows 10.")
901 	NTSTATUS BCryptRegisterConfigChangeNotify(scope HANDLE* phEvent);
902 }