headers: Update bcrypt.h header file.

Changes:
  * Add BCryptCreateMultiHash, BCryptProcessMultiOperations and BCryptHash function declarations.
  * Add related symbols of those functions.
  * Relocate duplicate BCryptUnregisterConfigChangeNotify function declaration.

Signed-off-by: Biswapriyo Nath <nathbappai@gmail.com>
Signed-off-by: Liu Hao <lh_mouse@126.com>
diff --git a/mingw-w64-headers/include/bcrypt.h b/mingw-w64-headers/include/bcrypt.h
index 006181c..6369fd1 100644
--- a/mingw-w64-headers/include/bcrypt.h
+++ b/mingw-w64-headers/include/bcrypt.h
@@ -55,6 +55,14 @@
 #define BCRYPT_KDF_TLS_PRF L"TLS_PRF"
 #define BCRYPT_KDF_SP80056A_CONCAT L"SP800_56A_CONCAT"
 
+#if NTDDI_VERSION >= NTDDI_WINBLUE
+#define BCRYPT_KDF_RAW_SECRET L"TRUNCATE"
+#endif
+
+#if NTDDI_VERSION >= NTDDI_WIN10_RS4
+#define BCRYPT_KDF_HKDF L"HKDF"
+#endif
+
 #define KDF_HASH_ALGORITHM 0x0
 #define KDF_SECRET_PREPEND 0x1
 #define KDF_SECRET_APPEND 0x2
@@ -62,18 +70,26 @@
 #define KDF_TLS_PRF_LABEL 0x4
 #define KDF_TLS_PRF_SEED 0x5
 #define KDF_SECRET_HANDLE 0x6
+#if NTDDI_VERSION >= NTDDI_WIN7
 #define KDF_TLS_PRF_PROTOCOL 0x7
 #define KDF_ALGORITHMID 0x8
 #define KDF_PARTYUINFO 0x9
 #define KDF_PARTYVINFO 0xa
 #define KDF_SUPPPUBINFO 0xb
 #define KDF_SUPPPRIVINFO 0xc
+#endif
+#if NTDDI_VERSION >= NTDDI_WIN8
 #define KDF_LABEL 0xd
 #define KDF_CONTEXT 0xe
 #define KDF_SALT 0xf
 #define KDF_ITERATION_COUNT 0x10
 #define KDF_GENERIC_PARAMETER 0x11
 #define KDF_KEYBITLENGTH 0x12
+#endif
+#if NTDDI_VERSION >= NTDDI_WIN10_RS4
+#define KDF_HKDF_SALT 0x13
+#define KDF_HKDF_INFO 0x14
+#endif
 
 #define KDF_USE_SECRET_AS_HMAC_KEY_FLAG 1
 
@@ -89,7 +105,9 @@
 
 #define BCRYPT_OPAQUE_KEY_BLOB L"OpaqueKeyBlob"
 #define BCRYPT_KEY_DATA_BLOB L"KeyDataBlob"
+#if NTDDI_VERSION >= NTDDI_WIN7
 #define BCRYPT_AES_WRAP_KEY_BLOB L"Rfc3565KeyWrapBlob"
+#endif
 
 #define BCRYPT_ALGORITHM_NAME L"AlgorithmName"
 #define BCRYPT_AUTH_TAG_LENGTH L"AuthTagLength"
@@ -120,7 +138,17 @@
 #define BCRYPT_PCP_PROVIDER_VERSION_PROPERTY L"PCP_PROVIDER_VERSION"
 #define BCRYPT_PRIMITIVE_TYPE L"PrimitiveType"
 #define BCRYPT_PROVIDER_HANDLE L"ProviderHandle"
+#define BCRYPT_PUBLIC_KEY_LENGTH L"PublicKeyLength"
 #define BCRYPT_SIGNATURE_LENGTH L"SignatureLength"
+#if (NTDDI_VERSION > NTDDI_WINBLUE || (NTDDI_VERSION == NTDDI_WINBLUE && defined(WINBLUE_KBSPRING14)))
+#define BCRYPT_MULTI_OBJECT_LENGTH L"MultiObjectLength"
+#endif
+#if NTDDI_VERSION >= NTDDI_WIN10_RS4
+#define BCRYPT_IS_IFX_TPM_WEAK_KEY L"IsIfxTpmWeakKey"
+#define BCRYPT_HKDF_HASH_ALGORITHM L"HkdfHashAlgorithm"
+#define BCRYPT_HKDF_SALT_AND_FINALIZE L"HkdfSaltAndFinalize"
+#define BCRYPT_HKDF_PRK_AND_FINALIZE L"HkdfPrkAndFinalize"
+#endif
 
 #define BCRYPT_SUPPORTED_PAD_ROUTER 0x00000001
 #define BCRYPT_SUPPORTED_PAD_PKCS1_ENC 0x00000002
@@ -136,6 +164,9 @@
 #define BCRYPT_PAD_PKCS1 0x00000002
 #define BCRYPT_PAD_OAEP 0x00000004
 #define BCRYPT_PAD_PSS 0x00000008
+#if NTDDI_VERSION >= NTDDI_WINBLUE
+#define BCRYPT_PAD_PKCS1_OPTIONAL_HASH_OID 0x00000010
+#endif
 
 #define BCRYPTBUFFER_VERSION 0
 
@@ -220,18 +251,30 @@
 
 #define BCRYPT_RSAFULLPRIVATE_MAGIC 0x33415352
 
+#if NTDDI_VERSION >= NTDDI_WIN8
 #define BCRYPT_GLOBAL_PARAMETERS L"SecretAgreementParam"
 #define BCRYPT_PRIVATE_KEY L"PrivKeyVal"
+#endif
 
 #define BCRYPT_ECCPUBLIC_BLOB L"ECCPUBLICBLOB"
 #define BCRYPT_ECCPRIVATE_BLOB L"ECCPRIVATEBLOB"
 
+#if NTDDI_VERSION >= NTDDI_WINTHRESHOLD
+#define BCRYPT_ECCFULLPUBLIC_BLOB L"ECCFULLPUBLICBLOB"
+#define BCRYPT_ECCFULLPRIVATE_BLOB L"ECCFULLPRIVATEBLOB"
+#define SSL_ECCPUBLIC_BLOB L"SSLECCPUBLICBLOB"
+#endif
+
 #define BCRYPT_ECDH_PUBLIC_P256_MAGIC 0x314b4345
 #define BCRYPT_ECDH_PRIVATE_P256_MAGIC 0x324b4345
 #define BCRYPT_ECDH_PUBLIC_P384_MAGIC 0x334b4345
 #define BCRYPT_ECDH_PRIVATE_P384_MAGIC 0x344b4345
 #define BCRYPT_ECDH_PUBLIC_P521_MAGIC 0x354b4345
 #define BCRYPT_ECDH_PRIVATE_P521_MAGIC 0x364b4345
+#if NTDDI_VERSION >= NTDDI_WINTHRESHOLD
+#define BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC 0x504B4345
+#define BCRYPT_ECDH_PRIVATE_GENERIC_MAGIC 0x564B4345
+#endif
 
 #define BCRYPT_ECDSA_PUBLIC_P256_MAGIC 0x31534345
 #define BCRYPT_ECDSA_PRIVATE_P256_MAGIC 0x32534345
@@ -239,6 +282,10 @@
 #define BCRYPT_ECDSA_PRIVATE_P384_MAGIC 0x34534345
 #define BCRYPT_ECDSA_PUBLIC_P521_MAGIC 0x35534345
 #define BCRYPT_ECDSA_PRIVATE_P521_MAGIC 0x36534345
+#if NTDDI_VERSION >= NTDDI_WINTHRESHOLD
+#define BCRYPT_ECDSA_PUBLIC_GENERIC_MAGIC 0x50444345
+#define BCRYPT_ECDSA_PRIVATE_GENERIC_MAGIC 0x56444345
+#endif
 
 #define BCRYPT_DH_PUBLIC_BLOB L"DHPUBLICBLOB"
 #define BCRYPT_DH_PRIVATE_BLOB L"DHPRIVATEBLOB"
@@ -460,6 +507,32 @@
     UCHAR Count[4];
   } BCRYPT_DSA_PARAMETER_HEADER_V2;
 
+  typedef struct _BCRYPT_ECC_CURVE_NAMES {
+    ULONG dwEccCurveNames;
+    LPWSTR *pEccCurveNames;
+  } BCRYPT_ECC_CURVE_NAMES;
+
+  typedef enum {
+    BCRYPT_HASH_OPERATION_HASH_DATA = 1,
+    BCRYPT_HASH_OPERATION_FINISH_HASH = 2
+  } BCRYPT_HASH_OPERATION_TYPE;
+
+  typedef struct _BCRYPT_MULTI_HASH_OPERATION {
+    ULONG iHash;
+    BCRYPT_HASH_OPERATION_TYPE hashOperation;
+    PUCHAR pbBuffer;
+    ULONG cbBuffer;
+  } BCRYPT_MULTI_HASH_OPERATION;
+
+  typedef enum {
+    BCRYPT_OPERATION_TYPE_HASH = 1
+  } BCRYPT_MULTI_OPERATION_TYPE;
+
+  typedef struct _BCRYPT_MULTI_OBJECT_LENGTH_STRUCT {
+    ULONG cbPerObject;
+    ULONG cbPerElement;
+  } BCRYPT_MULTI_OBJECT_LENGTH_STRUCT;
+
   typedef struct _BCRYPT_ALGORITHM_IDENTIFIER {
     LPWSTR pszName;
     ULONG dwClass;
@@ -577,8 +650,15 @@
   NTSTATUS WINAPI BCryptCreateHash (BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_HASH_HANDLE *phHash, PUCHAR pbHashObject, ULONG cbHashObject, PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);
   NTSTATUS WINAPI BCryptHashData (BCRYPT_HASH_HANDLE hHash, PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);
   NTSTATUS WINAPI BCryptFinishHash (BCRYPT_HASH_HANDLE hHash, PUCHAR pbOutput, ULONG cbOutput, ULONG dwFlags);
+#if (NTDDI_VERSION > NTDDI_WINBLUE || (NTDDI_VERSION == NTDDI_WINBLUE && defined(WINBLUE_KBSPRING14)))
+  NTSTATUS WINAPI BCryptCreateMultiHash (BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_HASH_HANDLE *phHash, ULONG nHashes, PUCHAR pbHashObject, ULONG cbHashObject, PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);
+  NTSTATUS WINAPI BCryptProcessMultiOperations (BCRYPT_HANDLE hObject, BCRYPT_MULTI_OPERATION_TYPE operationType, PVOID pOperations, ULONG cbOperations, ULONG dwFlags);
+#endif
   NTSTATUS WINAPI BCryptDuplicateHash (BCRYPT_HASH_HANDLE hHash, BCRYPT_HASH_HANDLE *phNewHash, PUCHAR pbHashObject, ULONG cbHashObject, ULONG dwFlags);
   NTSTATUS WINAPI BCryptDestroyHash (BCRYPT_HASH_HANDLE hHash);
+#if NTDDI_VERSION >= NTDDI_WINTHRESHOLD
+  NTSTATUS WINAPI BCryptHash (BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbSecret, ULONG cbSecret, PUCHAR pbInput, ULONG cbInput, PUCHAR pbOutput, ULONG cbOutput);
+#endif
   NTSTATUS WINAPI BCryptGenRandom (BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, ULONG cbBuffer, ULONG dwFlags);
   NTSTATUS WINAPI BCryptDeriveKeyCapi (BCRYPT_HASH_HANDLE hHash, BCRYPT_ALG_HANDLE hTargetAlg, PUCHAR pbDerivedKey, ULONG cbDerivedKey, ULONG dwFlags);
   NTSTATUS WINAPI BCryptDeriveKeyPBKDF2 (BCRYPT_ALG_HANDLE hPrf, PUCHAR pbPassword, ULONG cbPassword, PUCHAR pbSalt, ULONG cbSalt, ULONGLONG cIterations, PUCHAR pbDerivedKey, ULONG cbDerivedKey, ULONG dwFlags);
@@ -603,10 +683,10 @@
   NTSTATUS WINAPI BCryptSetContextFunctionProperty (ULONG dwTable, LPCWSTR pszContext, ULONG dwInterface, LPCWSTR pszFunction, LPCWSTR pszProperty, ULONG cbValue, PUCHAR pbValue);
   NTSTATUS WINAPI BCryptQueryContextFunctionProperty (ULONG dwTable, LPCWSTR pszContext, ULONG dwInterface, LPCWSTR pszFunction, LPCWSTR pszProperty, ULONG *pcbValue, PUCHAR *ppbValue);
   NTSTATUS WINAPI BCryptRegisterConfigChangeNotify (HANDLE *phEvent);
+  NTSTATUS WINAPI BCryptUnregisterConfigChangeNotify (HANDLE hEvent);
 #else
   NTSTATUS WINAPI BCryptRegisterConfigChangeNotify (PRKEVENT pEvent);
   NTSTATUS WINAPI BCryptUnregisterConfigChangeNotify (PRKEVENT pEvent);
-  NTSTATUS WINAPI BCryptUnregisterConfigChangeNotify (HANDLE hEvent);
 #endif
 #endif