/**
 * 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)

#ifndef _NTDEF_
  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*/
