/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_NCRYPT
#define _INC_NCRYPT
#if (_WIN32_WINNT >= 0x0600)

#ifdef __cplusplus
extern "C" {
#endif

#define NCRYPTBUFFER_SSL_CLIENT_RANDOM 20
#define NCRYPTBUFFER_SSL_SERVER_RANDOM 21
#define NCRYPTBUFFER_SSL_HIGHEST_VERSION 22
#define NCRYPTBUFFER_SSL_CLEAR_KEY 23
#define NCRYPTBUFFER_SSL_KEY_ARG_DATA 24
#define NCRYPTBUFFER_PKCS_OID 40
#define NCRYPTBUFFER_PKCS_ALG_OID 41
#define NCRYPTBUFFER_PKCS_ALG_PARAM 42
#define NCRYPTBUFFER_PKCS_ALG_ID 43
#define NCRYPTBUFFER_PKCS_ATTRS 44
#define NCRYPTBUFFER_PKCS_KEY_NAME 45
#define NCRYPTBUFFER_PKCS_SECRET 46
#define NCRYPTBUFFER_CERT_BLOB 47

#ifndef __SECSTATUS_DEFINED__
  typedef LONG SECURITY_STATUS;
#define __SECSTATUS_DEFINED__
#endif

#ifndef __NCRYPT_KEY_HANDLE__
#define __NCRYPT_KEY_HANDLE__
/*in wincrypt.h too*/
typedef ULONG_PTR NCRYPT_KEY_HANDLE;
#endif

typedef ULONG_PTR NCRYPT_PROV_HANDLE;
typedef ULONG_PTR NCRYPT_SECRET_HANDLE;
typedef ULONG_PTR NCRYPT_HANDLE;

#ifndef __HCRYPTKEY__
#define __HCRYPTKEY__
/* In wincrypt.h too */
  typedef ULONG_PTR HCRYPTPROV;
  typedef ULONG_PTR HCRYPTKEY;
#endif

typedef struct _NCryptBuffer {
  ULONG cbBuffer;
  ULONG BufferType;
  PVOID pvBuffer;
} NCryptBuffer, *PNCryptBuffer;

typedef struct _NCryptBufferDesc {
  ULONG         ulVersion;
  ULONG         cBuffers;
  PNCryptBuffer pBuffers;
} NCryptBufferDesc, *PNCryptBufferDesc;

typedef struct __NCRYPT_SUPPORTED_LENGTHS {
  DWORD dwMinLength;
  DWORD dwMaxLength;
  DWORD dwIncrement;
  DWORD dwDefaultLength;
} NCRYPT_SUPPORTED_LENGTHS;

#define NCRYPT_UI_PROTECT_KEY_FLAG 0x00000001
#define NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG 0x00000002

typedef struct __NCRYPT_UI_POLICY {
  DWORD   dwVersion;
  DWORD   dwFlags;
  LPCWSTR pszCreationTitle;
  LPCWSTR pszFriendlyName;
  LPCWSTR pszDescription;
} NCRYPT_UI_POLICY;

typedef struct __NCRYPT_UI_POLICY_BLOB {
  DWORD dwVersion;
  DWORD dwFlags;
  DWORD cbCreationTitle;
  DWORD cbFriendlyName;
  DWORD cbDescription;
} NCRYPT_UI_POLICY_BLOB;

typedef struct NCryptKeyName {
  LPWSTR pszName;
  LPWSTR pszAlgid;
  DWORD  dwLegacyKeySpec;
  DWORD  dwFlags;
} NCryptKeyName;

#define NCRYPT_ASYMMETRIC_ENCRYPTION_INTERFACE 0x00000003
#define NCRYPT_SECRET_AGREEMENT_INTERFACE 0x00000004
#define NCRYPT_SIGNATURE_INTERFACE 0x00000005

#define NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION 0x00000004
#define NCRYPT_SECRET_AGREEMENT_OPERATION 0x00000008
#define NCRYPT_SIGNATURE_OPERATION 0x00000010

typedef struct _NCryptAlgorithmName {
  LPWSTR pszName;
  DWORD  dwClass;
  DWORD  dwAlgOperations;
  DWORD  dwFlags;
} NCryptAlgorithmName;

typedef struct NCryptProviderName {
  LPWSTR pszName;
  LPWSTR pszComment;
} NCryptProviderName;

SECURITY_STATUS WINAPI NCryptExportKey(
  NCRYPT_KEY_HANDLE hKey,
  NCRYPT_KEY_HANDLE hExportKey,
  LPCWSTR pszBlobType,
  NCryptBufferDesc *pParameterList,
  PBYTE pbOutput,
  DWORD cbOutput,
  DWORD *pcbResult,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptCreatePersistedKey(
  NCRYPT_PROV_HANDLE hProvider,
  NCRYPT_KEY_HANDLE *phKey,
  LPCWSTR pszAlgId,
  LPCWSTR pszKeyName,
  DWORD dwLegacyKeySpec,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptDecrypt(
  NCRYPT_KEY_HANDLE hKey,
  PBYTE pbInput,
  DWORD cbInput,
  VOID *pPaddingInfo,
  PBYTE pbOutput,
  DWORD cbOutput,
  DWORD *pcbResult,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptDeleteKey(
  NCRYPT_KEY_HANDLE hKey,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptDeriveKey(
  NCRYPT_SECRET_HANDLE hSharedSecret,
  LPCWSTR pwszKDF,
  NCryptBufferDesc *pParameterList,
  PBYTE pbDerivedKey,
  DWORD cbDerivedKey,
  DWORD *pcbResult,
  ULONG dwFlags
);

SECURITY_STATUS WINAPI NCryptEncrypt(
  NCRYPT_KEY_HANDLE hKey,
  PBYTE pbInput,
  DWORD cbInput,
  VOID *pPaddingInfo,
  PBYTE pbOutput,
  DWORD cbOutput,
  DWORD *pcbResult,
  DWORD dwFlags
);

#define NCRYPT_CIPHER_OPERATION 0x00000001
#define NCRYPT_HASH_OPERATION 0x00000002
#define NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION 0x00000004
#define NCRYPT_SECRET_AGREEMENT_OPERATION 0x00000008
#define NCRYPT_SIGNATURE_OPERATION 0x00000010
#define NCRYPT_RNG_OPERATION 0x00000020

SECURITY_STATUS WINAPI NCryptEnumAlgorithms(
  NCRYPT_PROV_HANDLE hProvider,
  DWORD dwAlgOperations,
  DWORD *pdwAlgCount,
  NCryptAlgorithmName **ppAlgList,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptEnumKeys(
  NCRYPT_PROV_HANDLE hProvider,
  LPCWSTR pszScope,
  NCryptKeyName **ppKeyName,
  PVOID *ppEnumState,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptEnumStorageProviders(
  DWORD *pdwProviderCount,
  NCryptProviderName **ppProviderList,
  DWORD dwFlags
);

SECURITY_STATUS NCryptFinalizeKey(
  NCRYPT_KEY_HANDLE hKey,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptFreeBuffer(
  PVOID pvInput
);

SECURITY_STATUS WINAPI NCryptFreeObject(
  NCRYPT_HANDLE hObject
);

SECURITY_STATUS WINAPI NCryptGetProperty(
  NCRYPT_HANDLE hObject,
  LPCWSTR pszProperty,
  PBYTE pbOutput,
  DWORD cbOutput,
  DWORD *pcbResult,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptImportKey(
  NCRYPT_PROV_HANDLE hProvider,
  NCRYPT_KEY_HANDLE hImportKey,
  LPCWSTR pszBlobType,
  NCryptBufferDesc *pParameterList,
  NCRYPT_KEY_HANDLE *phKey,
  PBYTE pbData,
  DWORD cbData,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptIsAlgSupported(
  NCRYPT_PROV_HANDLE hProvider,
  LPCWSTR pszAlgId,
  DWORD dwFlags
);

WINBOOL WINAPI NCryptIsKeyHandle(
  NCRYPT_KEY_HANDLE hKey
);

SECURITY_STATUS WINAPI NCryptNotifyChangeKey(
  NCRYPT_PROV_HANDLE hProvider,
  HANDLE *phEvent,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptOpenKey(
  NCRYPT_PROV_HANDLE hProvider,
  NCRYPT_KEY_HANDLE *phKey,
  LPCWSTR pszKeyName,
  DWORD dwLegacyKeySpec,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptOpenStorageProvider(
  NCRYPT_PROV_HANDLE *phProvider,
  LPCWSTR pszProviderName,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptSecretAgreement(
  NCRYPT_KEY_HANDLE hPrivKey,
  NCRYPT_KEY_HANDLE hPubKey,
  NCRYPT_SECRET_HANDLE *phSecret,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptSetProperty(
  NCRYPT_HANDLE hObject,
  LPCWSTR pszProperty,
  PBYTE pbInput,
  DWORD cbInput,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptSignHash(
  NCRYPT_KEY_HANDLE hKey,
  VOID *pPaddingInfo,
  PBYTE pbHashValue,
  DWORD cbHashValue,
  PBYTE pbSignature,
  DWORD cbSignature,
  DWORD *pcbResult,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptTranslateHandle(
  NCRYPT_PROV_HANDLE *phProvider,
  NCRYPT_KEY_HANDLE *phKey,
  HCRYPTPROV hLegacyProv,
  HCRYPTKEY hLegacyKey,
  DWORD dwLegacyKeySpec,
  DWORD dwFlags
);

SECURITY_STATUS WINAPI NCryptVerifySignature(
  NCRYPT_KEY_HANDLE hKey,
  VOID *pPaddingInfo,
  PBYTE pbHashValue,
  DWORD cbHashValue,
  PBYTE pbSignature,
  DWORD cbSignature,
  DWORD dwFlags
);

#ifdef __cplusplus
}
#endif
#endif /*(_WIN32_WINNT >= 0x0600)*/
#endif /*_INC_NCRYPT*/