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 }