zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

bcrypt.h (33108B) - Raw


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