/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

#ifndef _INC_BCRYPT
#define _INC_BCRYPT
#if (_WIN32_WINNT >= 0x0600)

#if !defined (_NTDEF_) && !defined (_NTSTATUS_PSDK)
#define _NTSTATUS_PSDK
  typedef LONG NTSTATUS,*PNTSTATUS;
#endif

#define BCRYPT_CIPHER_OPERATION                 0x00000001
#define BCRYPT_HASH_OPERATION                   0x00000002
#define BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION  0x00000004
#define BCRYPT_SECRET_AGREEMENT_OPERATION       0x00000008
#define BCRYPT_SIGNATURE_OPERATION              0x00000010
#define BCRYPT_RNG_OPERATION                    0x00000020

#define BCRYPT_KEY_DATA_BLOB_MAGIC              0x4d42444b
#define BCRYPT_KEY_DATA_BLOB_VERSION1           1

#define BCRYPT_DH_PARAMETERS_MAGIC              0x4d504844

#define BCRYPT_DSA_PUBLIC_MAGIC                 0x42505344
#define BCRYPT_DSA_PRIVATE_MAGIC                0x56505344

#define BCRYPT_DSA_PARAMETERS_MAGIC             0x4d505344

#define BCRYPT_ALGORITHM_NAME                   L"AlgorithmName"
#define BCRYPT_AUTH_TAG_LENGTH                  L"AuthTagLength"
#define BCRYPT_BLOCK_LENGTH                     L"BlockLength"
#define BCRYPT_BLOCK_SIZE_LIST                  L"BlockSizeList"
#define BCRYPT_CHAINING_MODE                    L"ChainingMode"
#define BCRYPT_CHAIN_MODE_CBC                   L"ChainingModeCBC"
#define BCRYPT_CHAIN_MODE_CCM                   L"ChainingModeCCM"
#define BCRYPT_CHAIN_MODE_CFB                   L"ChainingModeCFB"
#define BCRYPT_CHAIN_MODE_ECB                   L"ChainingModeECB"
#define BCRYPT_CHAIN_MODE_GCM                   L"ChainingModeGCM"
#define BCRYPT_CHAIN_MODE_NA                    L"ChainingModeN/A"
#define BCRYPT_DH_PARAMETERS                    L"DHParameters"
#define BCRYPT_DSA_PARAMETERS                   L"DSAParameters"
#define BCRYPT_EFFECTIVE_KEY_LENGTH             L"EffectiveKeyLength"
#define BCRYPT_HASH_BLOCK_LENGTH                L"HashBlockLength"
#define BCRYPT_HASH_LENGTH                      L"HashDigestLength"
#define BCRYPT_HASH_OID_LIST                    L"HashOIDList"
#define BCRYPT_INITIALIZATION_VECTOR            L"IV"
#define BCRYPT_KEY_LENGTH                       L"KeyLength"
#define BCRYPT_KEY_LENGTHS                      L"KeyLengths"
#define BCRYPT_KEY_OBJECT_LENGTH                L"KeyObjectLength"
#define BCRYPT_KEY_STRENGTH                     L"KeyStrength"
#define BCRYPT_OBJECT_LENGTH                    L"ObjectLength"
#define BCRYPT_PADDING_SCHEMES                  L"PaddingSchemes"
#define BCRYPT_SUPPORTED_PAD_ROUTER             0x00000001
#define BCRYPT_SUPPORTED_PAD_PKCS1_ENC          0x00000002
#define BCRYPT_SUPPORTED_PAD_PKCS1_SIG          0x00000004
#define BCRYPT_SUPPORTED_PAD_OAEP               0x00000008
#define BCRYPT_SUPPORTED_PAD_PSS                0x00000010
#define BCRYPT_PROVIDER_HANDLE                  L"ProviderHandle"
#define BCRYPT_SIGNATURE_LENGTH                 L"SignatureLength"

#define KDF_HASH_ALGORITHM                      0
#define KDF_SECRET_PREPEND                      1
#define KDF_SECRET_APPEND                       2
#define KDF_HMAC_KEY                            3
#define KDF_TLS_PRF_LABEL                       4
#define KDF_TLS_PRF_SEED                        5
#define KDF_SECRET_HANDLE                       6

#define BCRYPT_KDF_HASH (L"HASH")
#define BCRYPT_KDF_HASH (L"HASH")
#define BCRYPT_KDF_TLS_PRF (L"TLS_PRF")
#define BCRYPT_KDF_SP80056A_CONCAT (L"SP800_56A_CONCAT")

#define CRYPT_ALL_FUNCTIONS 1
#define CRYPT_ALL_PROVIDERS 2

#ifndef __BCRYPT_KEY_HANDLE_DEFINED__
#define __BCRYPT_KEY_HANDLE_DEFINED__
/*also in cryptxml.h*/
typedef LPVOID BCRYPT_KEY_HANDLE;
#endif /*__BCRYPT_KEY_HANDLE_DEFINED__*/
typedef LPVOID BCRYPT_ALG_HANDLE;
typedef LPVOID BCRYPT_HASH_HANDLE;
typedef LPVOID BCRYPT_SECRET_HANDLE;
typedef LPVOID BCRYPT_HANDLE;

typedef struct _BCRYPT_ALGORITHM_IDENTIFIER {
  LPWSTR pszName;
  ULONG  dwClass;
  ULONG  dwFlags;
} BCRYPT_ALGORITHM_IDENTIFIER;

typedef struct _BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO {
  ULONG     cbSize;
  ULONG     dwInfoVersion;
  PUCHAR    pbNonce;
  ULONG     cbNonce;
  PUCHAR    pbAuthData;
  ULONG     cbAuthData;
  PUCHAR    pbTag;
  ULONG     cbTag;
  PUCHAR    pbMacContext;
  ULONG     cbMacContext;
  ULONG     cbAAD;
  ULONGLONG cbData;
  ULONG     dwFlags;
} BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO, *PBCRYPT_AUTHENTICATED_CIPHER_MODE_INFO;

typedef struct _BCRYPT_DH_KEY_BLOB {
  ULONG dwMagic;
  ULONG cbKey;
} BCRYPT_DH_KEY_BLOB, *PBCRYPT_DH_KEY_BLOB;

typedef struct _BCRYPT_DH_PARAMETER_HEADER {
  ULONG cbLength;
  ULONG dwMagic;
  ULONG cbKeyLength;
} BCRYPT_DH_PARAMETER_HEADER;

typedef struct _BCRYPT_DSA_KEY_BLOB {
  ULONG dwMagic;
  ULONG cbKey;
  UCHAR Count[4];
  UCHAR Seed[20];
  UCHAR q[20];
} BCRYPT_DSA_KEY_BLOB, *PBCRYPT_DSA_KEY_BLOB;

typedef struct _BCRYPT_DSA_PARAMETER_HEADER {
  ULONG cbLength;
  ULONG dwMagic;
  ULONG cbKeyLength;
  UCHAR Count[4];
  UCHAR Seed[20];
  UCHAR q[20];
} BCRYPT_DSA_PARAMETER_HEADER, *PBCRYPT_DSA_PARAMETER_HEADER;

typedef struct _BCRYPT_ECCKEY_BLOB {
  ULONG Magic;
  ULONG cbKey;
} BCRYPT_ECCKEY_BLOB, *PBCRYPT_ECCKEY_BLOB;

typedef struct _BCRYPT_INTERFACE_VERSION {
  USHORT MajorVersion;
  USHORT MinorVersion;
} BCRYPT_INTERFACE_VERSION, *PBCRYPT_INTERFACE_VERSION;

typedef struct _BCRYPT_KEY_BLOB {
  ULONG Magic;
} BCRYPT_KEY_BLOB;

typedef struct _BCRYPT_KEY_DATA_BLOB_HEADER {
  ULONG dwMagic;
  ULONG dwVersion;
  ULONG cbKeyData;
} BCRYPT_KEY_DATA_BLOB_HEADER, *PBCRYPT_KEY_DATA_BLOB_HEADER;

typedef struct __BCRYPT_KEY_LENGTHS_STRUCT {
  ULONG dwMinLength;
  ULONG dwMaxLength;
  ULONG dwIncrement;
} BCRYPT_KEY_LENGTHS_STRUCT, BCRYPT_AUTH_TAG_LENGTHS_STRUCT;

typedef struct _BCRYPT_OAEP_PADDING_INFO {
  LPCWSTR pszAlgId;
  PUCHAR  pbLabel;
  ULONG   cbLabel;
} BCRYPT_OAEP_PADDING_INFO;

typedef struct _BCRYPT_OID {
  ULONG  cbOID;
  PUCHAR pbOID;
} BCRYPT_OID;

typedef struct _BCRYPT_OID_LIST {
  ULONG      dwOIDCount;
  BCRYPT_OID *pOIDs;
} BCRYPT_OID_LIST;

typedef struct _BCRYPT_PKCS1_PADDING_INFO {
  LPCWSTR pszAlgId;
} BCRYPT_PKCS1_PADDING_INFO;

typedef struct _BCRYPT_PROVIDER_NAME {
  LPWSTR pszProviderName;
} BCRYPT_PROVIDER_NAME;

typedef struct _BCRYPT_PSS_PADDING_INFO {
  LPCWSTR pszAlgId;
  ULONG   cbSalt;
} BCRYPT_PSS_PADDING_INFO;

typedef struct _BCRYPT_RSAKEY_BLOB {
  ULONG Magic;
  ULONG BitLength;
  ULONG cbPublicExp;
  ULONG cbModulus;
  ULONG cbPrime1;
  ULONG cbPrime2;
} BCRYPT_RSAKEY_BLOB;

typedef struct _BCryptBuffer {
  ULONG cbBuffer;
  ULONG BufferType;
  PVOID pvBuffer;
} BCryptBuffer, *PBCryptBuffer;

typedef struct _BCryptBufferDesc {
  ULONG         ulVersion;
  ULONG         cBuffers;
  PBCryptBuffer pBuffers;
} BCryptBufferDesc, *PBCryptBufferDesc;

typedef struct _CRYPT_CONTEXTS {
  ULONG cContexts;
  PWSTR rgpszContexts;
} CRYPT_CONTEXTS, *PCRYPT_CONTEXTS;

typedef struct _CRYPT_CONTEXT_CONFIG {
  ULONG dwFlags;
} CRYPT_CONTEXT_CONFIG, *PCRYPT_CONTEXT_CONFIG;

typedef struct _CRYPT_CONTEXT_FUNCTIONS {
  ULONG cFunctions;
  PWSTR rgpszFunctions;
} CRYPT_CONTEXT_FUNCTIONS, *PCRYPT_CONTEXT_FUNCTIONS;

typedef struct _CRYPT_CONTEXT_FUNCTION_CONFIG {
  ULONG dwFlags;
} CRYPT_CONTEXT_FUNCTION_CONFIG, *PCRYPT_CONTEXT_FUNCTION_CONFIG;

typedef struct _CRYPT_CONTEXT_FUNCTION_PROVIDERS {
  ULONG cProviders;
  PWSTR *rgpszProviders;
} CRYPT_CONTEXT_FUNCTION_PROVIDERS, *PCRYPT_CONTEXT_FUNCTION_PROVIDERS;

typedef struct _CRYPT_INTERFACE_REG {
  ULONG dwInterface;
  ULONG dwFlags;
  ULONG cFunctions;
  PWSTR *rgpszFunctions;
} CRYPT_INTERFACE_REG, *PCRYPT_INTERFACE_REG;

typedef struct _CRYPT_IMAGE_REG {
  PWSTR                pszImage;
  ULONG                cInterfaces;
  PCRYPT_INTERFACE_REG *rgpInterfaces;
} CRYPT_IMAGE_REG, *PCRYPT_IMAGE_REG;

typedef struct _CRYPT_IMAGE_REF {
  PWSTR pszImage;
  ULONG dwFlags;
} CRYPT_IMAGE_REF, *PCRYPT_IMAGE_REF;

typedef struct _CRYPT_PROPERTY_REF {
  PWSTR  pszProperty;
  ULONG  cbValue;
  PUCHAR pbValue;
} CRYPT_PROPERTY_REF, *PCRYPT_PROPERTY_REF;

typedef struct _CRYPT_PROVIDERS {
  ULONG cProviders;
  PWSTR *rgpszProviders;
} CRYPT_PROVIDERS, *PCRYPT_PROVIDERS;

typedef struct _CRYPT_PROVIDER_REG {
  ULONG            cAliases;
  PWSTR            *rgpszAliases;
  PCRYPT_IMAGE_REG pUM;
  PCRYPT_IMAGE_REG pKM;
} CRYPT_PROVIDER_REG, *PCRYPT_PROVIDER_REG;

typedef struct _CRYPT_PROVIDER_REF {
  ULONG               dwInterface;
  PWSTR               pszFunction;
  PWSTR               pszProvider;
  ULONG               cProperties;
  PCRYPT_PROPERTY_REF *rgpProperties;
  PCRYPT_IMAGE_REF    pUM;
  PCRYPT_IMAGE_REF    pKM;
} CRYPT_PROVIDER_REF, *PCRYPT_PROVIDER_REF;

typedef struct _CRYPT_PROVIDER_REFS {
  ULONG               cProviders;
  PCRYPT_PROVIDER_REF *rgpProviders;
} CRYPT_PROVIDER_REFS, *PCRYPT_PROVIDER_REFS;

NTSTATUS WINAPI BCryptAddContextFunction(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  ULONG dwPosition
);

NTSTATUS WINAPI BCryptCloseAlgorithmProvider(
  BCRYPT_ALG_HANDLE hAlgorithm,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptConfigureContext(
  ULONG dwTable,
  LPCWSTR pszContext,
  PCRYPT_CONTEXT_CONFIG pConfig
);

NTSTATUS WINAPI BCryptConfigureContextFunction(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  PCRYPT_CONTEXT_FUNCTION_CONFIG pConfig
);

NTSTATUS WINAPI BCryptCreateContext(
  ULONG dwTable,
  LPCWSTR pszContext,
  PCRYPT_CONTEXT_CONFIG pConfig
);

NTSTATUS WINAPI BCryptCreateHash(
  BCRYPT_ALG_HANDLE hAlgorithm,
  BCRYPT_HASH_HANDLE *phHash,
  PUCHAR pbHashObject,
  ULONG cbHashObject,
  PUCHAR pbSecret,
  ULONG cbSecret,
  ULONG dwFlags
);

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
);

NTSTATUS WINAPI BCryptDeleteContext(
  ULONG dwTable,
  LPCWSTR pszContext
);

NTSTATUS WINAPI BCryptDeriveKey(
  BCRYPT_SECRET_HANDLE hSharedSecret,
  LPCWSTR pwszKDF,
  BCryptBufferDesc *pParameterList,
  PUCHAR pbDerivedKey,
  ULONG cbDerivedKey,
  ULONG *pcbResult,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptDestroyHash(
  BCRYPT_HASH_HANDLE hHash
);

NTSTATUS WINAPI BCryptDestroyKey(
  BCRYPT_KEY_HANDLE hKey
);

NTSTATUS WINAPI BCryptDuplicateHash(
  BCRYPT_HASH_HANDLE hHash,
  BCRYPT_HASH_HANDLE *phNewHash,
  PUCHAR pbHashObject,
  ULONG cbHashObject,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptDuplicateKey(
  BCRYPT_KEY_HANDLE hKey,
  BCRYPT_KEY_HANDLE *phNewKey,
  PUCHAR pbKeyObject,
  ULONG cbKeyObject,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptEnumAlgorithms(
  ULONG dwAlgOperations,
  ULONG *pAlgCount,
  BCRYPT_ALGORITHM_IDENTIFIER **ppAlgList,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptEnumContexts(
  ULONG dwTable,
  ULONG *pcbBuffer,
  PCRYPT_CONTEXTS *ppBuffer
);

NTSTATUS WINAPI BCryptEnumContextFunctions(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  ULONG *pcbBuffer,
  PCRYPT_CONTEXT_FUNCTIONS *ppBuffer
);

NTSTATUS WINAPI BCryptEnumContextFunctionProviders(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  ULONG *pcbBuffer,
  PCRYPT_CONTEXT_FUNCTION_PROVIDERS *ppBuffer
);

NTSTATUS WINAPI BCryptEnumProviders(
  LPCWSTR pszAlgId,
  ULONG *pImplCount,
  BCRYPT_PROVIDER_NAME **ppImplList,
  ULONG dwFlags
);
NTSTATUS WINAPI BCryptEnumRegisteredProviders(
  ULONG *pcbBuffer,
  PCRYPT_PROVIDERS *ppBuffer
);

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
);

NTSTATUS WINAPI BCryptExportKey(
  BCRYPT_KEY_HANDLE hKey,
  BCRYPT_KEY_HANDLE hExportKey,
  LPCWSTR pszBlobType,
  PUCHAR pbOutput,
  ULONG cbOutput,
  ULONG *pcbResult,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptFinishHash(
  BCRYPT_HASH_HANDLE hHash,
  PUCHAR pbOutput,
  ULONG cbOutput,
  ULONG dwFlags
);
VOID WINAPI BCryptFreeBuffer(
  PVOID pvBuffer
);

NTSTATUS WINAPI BCryptGenerateKeyPair(
  BCRYPT_ALG_HANDLE hAlgorithm,
  BCRYPT_KEY_HANDLE *phKey,
  ULONG dwLength,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptGenerateSymmetricKey(
  BCRYPT_ALG_HANDLE hAlgorithm,
  BCRYPT_KEY_HANDLE *phKey,
  PUCHAR pbKeyObject,
  ULONG cbKeyObject,
  PUCHAR pbSecret,
  ULONG cbSecret,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptGenRandom(
  BCRYPT_ALG_HANDLE hAlgorithm,
  PUCHAR pbBuffer,
  ULONG cbBuffer,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptGetFipsAlgorithmMode(
  BOOLEAN *pfEnabled
);

NTSTATUS WINAPI BCryptGetProperty(
  BCRYPT_HANDLE hObject,
  LPCWSTR pszProperty,
  PUCHAR pbOutput,
  ULONG cbOutput,
  ULONG *pcbResult,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptHashData(
  BCRYPT_HASH_HANDLE hHash,
  PUCHAR pbInput,
  ULONG cbInput,
  ULONG dwFlags
);

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
);

NTSTATUS WINAPI BCryptImportKeyPair(
  BCRYPT_ALG_HANDLE hAlgorithm,
  BCRYPT_KEY_HANDLE hImportKey,
  LPCWSTR pszBlobType,
  BCRYPT_KEY_HANDLE *phKey,
  PUCHAR pbInput,
  ULONG cbInput,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptFinalizeKeyPair(
  BCRYPT_KEY_HANDLE hKey,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptOpenAlgorithmProvider(
  BCRYPT_ALG_HANDLE *phAlgorithm,
  LPCWSTR pszAlgId,
  LPCWSTR pszImplementation,
  DWORD dwFlags
);

NTSTATUS WINAPI BCryptQueryContextConfiguration(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG *pcbBuffer,
  PCRYPT_CONTEXT_CONFIG *ppBuffer
);

NTSTATUS WINAPI BCryptQueryContextFunctionConfiguration(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  ULONG *pcbBuffer,
  PCRYPT_CONTEXT_FUNCTION_CONFIG *ppBuffer
);

NTSTATUS WINAPI BCryptQueryContextFunctionProperty(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  LPCWSTR pszProperty,
  ULONG *pcbValue,
  PUCHAR *ppbValue
);

NTSTATUS WINAPI BCryptQueryProviderRegistration(
  LPCWSTR pszProvider,
  ULONG dwMode,
  ULONG dwInterface,
  ULONG *pcbBuffer,
  PCRYPT_PROVIDER_REG *ppBuffer
);

/* Kernel mode
NTSTATUS WINAPI BCryptRegisterConfigChangeNotify(
  PRKEVENT phEvent
);

NTSTATUS WINAPI BCryptUnregisterConfigChangeNotify(
  PRKEVENT hEvent
);
*/

NTSTATUS WINAPI BCryptRegisterConfigChangeNotify(
  HANDLE *phEvent
);

NTSTATUS WINAPI BCryptUnregisterConfigChangeNotify(
  HANDLE hEvent
);

NTSTATUS WINAPI BCryptRemoveContextFunction(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction
);

NTSTATUS WINAPI BCryptResolveProviders(
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  LPCWSTR pszProvider,
  ULONG dwMode,
  ULONG dwFlags,
  ULONG *pcbBuffer,
  PCRYPT_PROVIDER_REFS *ppBuffer
);

NTSTATUS WINAPI BCryptSecretAgreement(
  BCRYPT_KEY_HANDLE hPrivKey,
  BCRYPT_KEY_HANDLE hPubKey,
  BCRYPT_SECRET_HANDLE *phSecret,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptSetContextFunctionProperty(
  ULONG dwTable,
  LPCWSTR pszContext,
  ULONG dwInterface,
  LPCWSTR pszFunction,
  LPCWSTR pszProperty,
  ULONG cbValue,
  PUCHAR pbValue
);

NTSTATUS WINAPI BCryptSetProperty(
  BCRYPT_HANDLE hObject,
  LPCWSTR pszProperty,
  PUCHAR pbInput,
  ULONG cbInput,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptSignHash(
  BCRYPT_KEY_HANDLE hKey,
  VOID *pPaddingInfo,
  PBYTE pbInput,
  DWORD cbInput,
  PBYTE pbOutput,
  DWORD cbOutput,
  DWORD *pcbResult,
  ULONG dwFlags
);

NTSTATUS WINAPI BCryptVerifySignature(
  BCRYPT_KEY_HANDLE hKey,
  VOID *pPaddingInfo,
  PUCHAR pbHash,
  ULONG cbHash,
  PUCHAR pbSignature,
  ULONG cbSignature,
  ULONG dwFlags
);

#endif /*(_WIN32_WINNT >= 0x0600)*/
#endif /*_INC_BCRYPT*/
