/***********************************************************************\
*                               schannel.d                              *
*                                                                       *
*                       Windows API header module                       *
*                                                                       *
*                 Translated from MinGW Windows headers                 *
*                           by Stewart Gordon                           *
*                                                                       *
*                       Placed into public domain                       *
\***********************************************************************/
module win32.schannel;

import win32.wincrypt;
private import win32.windef;

const DWORD SCHANNEL_CRED_VERSION = 4;
const SCHANNEL_SHUTDOWN           = 1;
/* Comment from MinGW
	? Do these belong here or in wincrypt.h
 */
enum : DWORD {
	AUTHTYPE_CLIENT = 1,
	AUTHTYPE_SERVER = 2
}

const DWORD
	SP_PROT_PCT1_SERVER = 0x01,
	SP_PROT_PCT1_CLIENT = 0x02,
	SP_PROT_SSL2_SERVER = 0x04,
	SP_PROT_SSL2_CLIENT = 0x08,
	SP_PROT_SSL3_SERVER = 0x10,
	SP_PROT_SSL3_CLIENT = 0x20,
	SP_PROT_TLS1_SERVER = 0x40,
	SP_PROT_TLS1_CLIENT = 0x80,
	SP_PROT_PCT1        = SP_PROT_PCT1_CLIENT | SP_PROT_PCT1_SERVER,
	SP_PROT_TLS1        = SP_PROT_TLS1_CLIENT | SP_PROT_TLS1_SERVER,
	SP_PROT_SSL2        = SP_PROT_SSL2_CLIENT | SP_PROT_SSL2_SERVER,
	SP_PROT_SSL3        = SP_PROT_SSL3_CLIENT | SP_PROT_SSL3_SERVER;

const DWORD
	SCH_CRED_NO_SYSTEM_MAPPER                    = 0x0002,
	SCH_CRED_NO_SERVERNAME_CHECK                 = 0x0004,
	SCH_CRED_MANUAL_CRED_VALIDATION              = 0x0008,
	SCH_CRED_NO_DEFAULT_CREDS                    = 0x0010,
	SCH_CRED_AUTO_CRED_VALIDATION                = 0x0020,
	SCH_CRED_USE_DEFAULT_CREDS                   = 0x0040,
	SCH_CRED_REVOCATION_CHECK_END_CERT           = 0x0100,
	SCH_CRED_REVOCATION_CHECK_CHAIN              = 0x0200,
	SCH_CRED_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT = 0x0400,
	SCH_CRED_IGNORE_NO_REVOCATION_CHECK          = 0x0800,
	SCH_CRED_IGNORE_REVOCATION_OFFLINE           = 0x1000;

// No definition - presumably an opaque structure
struct _HMAPPER;

struct SCHANNEL_CRED {
	DWORD           dwVersion = SCHANNEL_CRED_VERSION;
	DWORD           cCreds;
	PCCERT_CONTEXT* paCred;
	HCERTSTORE      hRootStore;
	DWORD           cMappers;
	_HMAPPER**      aphMappers;
	DWORD           cSupportedAlgs;
	ALG_ID*         palgSupportedAlgs;
	DWORD           grbitEnabledProtocols;
	DWORD           dwMinimumCypherStrength;
	DWORD           dwMaximumCypherStrength;
	DWORD           dwSessionLifespan;
	DWORD           dwFlags;
	DWORD           reserved;
}
alias SCHANNEL_CRED* PSCHANNEL_CRED;

struct SecPkgCred_SupportedAlgs {
	DWORD   cSupportedAlgs;
	ALG_ID* palgSupportedAlgs;
}
alias SecPkgCred_SupportedAlgs* PSecPkgCred_SupportedAlgs;

struct SecPkgCred_CypherStrengths {
	DWORD dwMinimumCypherStrength;
	DWORD dwMaximumCypherStrength;
}
alias SecPkgCred_CypherStrengths* PSecPkgCred_CypherStrengths;

struct SecPkgCred_SupportedProtocols {
	DWORD grbitProtocol;
}
alias SecPkgCred_SupportedProtocols* PSecPkgCred_SupportedProtocols;

struct SecPkgContext_IssuerListInfoEx {
	PCERT_NAME_BLOB aIssuers;
	DWORD           cIssuers;
}
alias SecPkgContext_IssuerListInfoEx* PSecPkgContext_IssuerListInfoEx;

struct SecPkgContext_ConnectionInfo {
	DWORD  dwProtocol;
	ALG_ID aiCipher;
	DWORD  dwCipherStrength;
	ALG_ID aiHash;
	DWORD  dwHashStrength;
	ALG_ID aiExch;
	DWORD  dwExchStrength;
}
alias SecPkgContext_ConnectionInfo* PSecPkgContext_ConnectionInfo;
