mirror of https://github.com/UMSKT/xpmgr.git
1179 lines
44 KiB
Plaintext
1179 lines
44 KiB
Plaintext
/*
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
SYNOPSIS
|
|
|
|
Defines data types used by the IKE keying module.
|
|
*/
|
|
|
|
#include "winerror.h"
|
|
|
|
import "fwptypes.idl";
|
|
|
|
cpp_quote("#if _MSC_VER >= 800")
|
|
cpp_quote("#if _MSC_VER >= 1200")
|
|
cpp_quote("#pragma warning(push)")
|
|
cpp_quote("#endif")
|
|
cpp_quote("#pragma warning(disable:4201)")
|
|
cpp_quote("#endif")
|
|
|
|
typedef struct IPSEC_V4_UDP_ENCAPSULATION0_ IPSEC_V4_UDP_ENCAPSULATION0;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Definitions for building IKE, Authip policies.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef [v1_enum] enum IKEEXT_KEY_MODULE_TYPE_
|
|
{
|
|
IKEEXT_KEY_MODULE_IKE,
|
|
IKEEXT_KEY_MODULE_AUTHIP,
|
|
IKEEXT_KEY_MODULE_IKEV2,
|
|
IKEEXT_KEY_MODULE_MAX
|
|
} IKEEXT_KEY_MODULE_TYPE;
|
|
|
|
// Type of authentication method
|
|
typedef [v1_enum] enum IKEEXT_AUTHENTICATION_METHOD_TYPE_
|
|
{
|
|
IKEEXT_PRESHARED_KEY,
|
|
IKEEXT_CERTIFICATE,
|
|
IKEEXT_KERBEROS,
|
|
IKEEXT_ANONYMOUS,
|
|
IKEEXT_SSL,
|
|
IKEEXT_NTLM_V2,
|
|
IKEEXT_IPV6_CGA,
|
|
IKEEXT_CERTIFICATE_ECDSA_P256,
|
|
IKEEXT_CERTIFICATE_ECDSA_P384,
|
|
IKEEXT_SSL_ECDSA_P256,
|
|
IKEEXT_SSL_ECDSA_P384,
|
|
IKEEXT_EAP,
|
|
IKEEXT_AUTHENTICATION_METHOD_TYPE_MAX
|
|
} IKEEXT_AUTHENTICATION_METHOD_TYPE;
|
|
|
|
// Type of impersonation to perform while authentication. Ike can only perform
|
|
// machine authentication, so this should be set to IKEEXT_IMPERSONATION_NONE
|
|
// when specifying IKE policy. For Authip policy, specify
|
|
// IKEEXT_IMPERSONATION_SOCKET_PRINCIPAL to enable impersonation.
|
|
typedef [v1_enum] enum IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE_
|
|
{
|
|
IKEEXT_IMPERSONATION_NONE,
|
|
IKEEXT_IMPERSONATION_SOCKET_PRINCIPAL,
|
|
IKEEXT_IMPERSONATION_MAX
|
|
} IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE;
|
|
|
|
// Stores information needed for preshared key authentication
|
|
typedef struct IKEEXT_PRESHARED_KEY_AUTHENTICATION0__
|
|
{
|
|
// The preshared key
|
|
FWP_BYTE_BLOB presharedKey;
|
|
} IKEEXT_PRESHARED_KEY_AUTHENTICATION0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Use PSK for authenticating local entity to remote entity only
|
|
cpp_quote("#define IKEEXT_PSK_FLAG_LOCAL_AUTH_ONLY (0x00000001)")
|
|
// Use PSK for authenticating remote entity to local entity only
|
|
cpp_quote("#define IKEEXT_PSK_FLAG_REMOTE_AUTH_ONLY (0x00000002)")
|
|
|
|
|
|
typedef struct IKEEXT_PRESHARED_KEY_AUTHENTICATION1__
|
|
{
|
|
// The preshared key
|
|
FWP_BYTE_BLOB presharedKey;
|
|
// Flags
|
|
UINT32 flags;
|
|
} IKEEXT_PRESHARED_KEY_AUTHENTICATION1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
//////////
|
|
// Flags specifying certificate root characteristics.
|
|
//////////
|
|
|
|
// Enable certificate to account mapping for this root.
|
|
cpp_quote("#define IKEEXT_CERT_FLAG_ENABLE_ACCOUNT_MAPPING (0x00000001)")
|
|
// Do not send a Cert request payload for this root.
|
|
cpp_quote("#define IKEEXT_CERT_FLAG_DISABLE_REQUEST_PAYLOAD (0x00000002)")
|
|
// Enable NAP certificate handling
|
|
cpp_quote("#define IKEEXT_CERT_FLAG_USE_NAP_CERTIFICATE (0x00000004)")
|
|
// The corresponding CA could be an intermediate CA and need not be a ROOT CA.
|
|
// If this flag is not specified, the name will have to refer to a ROOT CA.
|
|
cpp_quote("#define IKEEXT_CERT_FLAG_INTERMEDIATE_CA (0x00000008)")
|
|
// If certificate to account mapping is enabled, this flag allows IKE to ignore
|
|
// mapping failures on initiator. Not applicable for Authip. Can be set only
|
|
// if IKEEXT_CERT_FLAG_ENABLE_ACCOUNT_MAPPING is also specified. By default IKE
|
|
// will not ignore cert-mapping failures even on initiator.
|
|
cpp_quote("#define IKEEXT_CERT_FLAG_IGNORE_INIT_CERT_MAP_FAILURE (0x00000010)")
|
|
//If this flag is specified, then NAP certs are preferred for
|
|
//local cert selection
|
|
cpp_quote("#define IKEEXT_CERT_FLAG_PREFER_NAP_CERTIFICATE_OUTBOUND (0x00000020)")
|
|
|
|
|
|
typedef struct IKEEXT_CERT_ROOT_CONFIG0_
|
|
{
|
|
// X509/ASN.1 encoded name of the certificate root. Should be empty when
|
|
// specifying Enterprise or trusted root store config.
|
|
FWP_BYTE_BLOB certData;
|
|
// Flags
|
|
UINT32 flags;
|
|
} IKEEXT_CERT_ROOT_CONFIG0;
|
|
|
|
//////////
|
|
// Flags specifying certificate authentication characteristics.
|
|
//////////
|
|
|
|
// Enable SSL one way authentication
|
|
cpp_quote("#define IKEEXT_CERT_AUTH_FLAG_SSL_ONE_WAY (0x00000001)")
|
|
|
|
// Disable CRL checking. By default weak CRL checking is enabled. Weak checking
|
|
// means that a certificate will be rejected if and only if CRL is successfully
|
|
// looked up and the certificate is found to be revoked.
|
|
cpp_quote("#define IKEEXT_CERT_AUTH_FLAG_DISABLE_CRL_CHECK (0x00000002)")
|
|
|
|
// Enable strong CRL checking. Strong checking means that a certificate will be
|
|
// rejected if certificate is found to be revoked, or if any other error
|
|
// (for ex: CRL could not be retrieved) takes place while performing the
|
|
// revokation checking. By default weak CRL checking is enabled.
|
|
cpp_quote("#define IKEEXT_CERT_AUTH_ENABLE_CRL_CHECK_STRONG (0x00000004)")
|
|
|
|
// SSL validation requires certain EKUs, like server auth EKU from a server.
|
|
// This disables the server auth EKU check, but still performs the other
|
|
// IKE-style certificate verification
|
|
cpp_quote("#define IKEEXT_CERT_AUTH_DISABLE_SSL_CERT_VALIDATION (0x00000008)")
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Allow lookup of peer certificate information from an HTTP URL. Only supported
|
|
// by IKEv2.
|
|
cpp_quote("#define IKEEXT_CERT_AUTH_ALLOW_HTTP_CERT_LOOKUP (0x00000010)")
|
|
|
|
// The URL specified in the certificate authentication policy points to an
|
|
// encoded certificate-bundle. If this flag is not specifed, IKEv2 will assume
|
|
// that the URL points to an encoded certificate. Only supported by IKEv2.
|
|
cpp_quote("#define IKEEXT_CERT_AUTH_URL_CONTAINS_BUNDLE (0x00000020)")
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Type of certificate configuration
|
|
typedef [v1_enum] enum IKEEXT_CERT_CONFIG_TYPE_
|
|
{
|
|
// Use an explicit trust list for authentication
|
|
IKEEXT_CERT_CONFIG_EXPLICIT_TRUST_LIST,
|
|
// Use the enterprise store as the trust list for authentication
|
|
IKEEXT_CERT_CONFIG_ENTERPRISE_STORE,
|
|
// Use the trusted root CA store as the trust list for authentication
|
|
IKEEXT_CERT_CONFIG_TRUSTED_ROOT_STORE,
|
|
// No Cert auth in direction (inbound/outbound) in which config applies
|
|
IKEEXT_CERT_CONFIG_UNSPECIFIED,
|
|
// Not a valid type -- used for parameter validation only.
|
|
IKEEXT_CERT_CONFIG_TYPE_MAX
|
|
} IKEEXT_CERT_CONFIG_TYPE;
|
|
|
|
// Type used to specify various parameters for authentication with certificates.
|
|
typedef struct IKEEXT_CERTIFICATE_AUTHENTICATION0_
|
|
{
|
|
// Certificate configuration type for inbound peer cert verification.
|
|
IKEEXT_CERT_CONFIG_TYPE inboundConfigType;
|
|
// Configuration for inbound peer cert verification. It is a union of
|
|
// explicit trust list, enterprise store, or trusted root store config
|
|
// depending on the configType.
|
|
[switch_type(IKEEXT_CERT_CONFIG_TYPE), switch_is(inboundConfigType)]
|
|
union
|
|
{
|
|
[case(IKEEXT_CERT_CONFIG_EXPLICIT_TRUST_LIST)]
|
|
// Explicit trust list for verifying the peer certificate chain.
|
|
struct
|
|
{
|
|
UINT32 inboundRootArraySize;
|
|
[size_is(inboundRootArraySize), unique]
|
|
IKEEXT_CERT_ROOT_CONFIG0* inboundRootArray;
|
|
};
|
|
[case(IKEEXT_CERT_CONFIG_ENTERPRISE_STORE)]
|
|
// Enterprise store config for verifying the peer certificate chain.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* inboundEnterpriseStoreConfig;
|
|
[case(IKEEXT_CERT_CONFIG_TRUSTED_ROOT_STORE)]
|
|
// Trusted root store config for verifying the peer certificate chain.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* inboundTrustedRootStoreConfig;
|
|
};
|
|
|
|
// Certificate configuration type for outbound local cert selection.
|
|
IKEEXT_CERT_CONFIG_TYPE outboundConfigType;
|
|
// Configuration for outbound local cert selection. It is a union of
|
|
// explicit trust list, enterprise store, or trusted root store config
|
|
// depending on the configType.
|
|
[switch_type(IKEEXT_CERT_CONFIG_TYPE), switch_is(outboundConfigType)]
|
|
union
|
|
{
|
|
[case(IKEEXT_CERT_CONFIG_EXPLICIT_TRUST_LIST)]
|
|
// Explicit trust list for selecting a certificate chain to send to the
|
|
// peer.
|
|
struct
|
|
{
|
|
UINT32 outboundRootArraySize;
|
|
[size_is(outboundRootArraySize), unique]
|
|
IKEEXT_CERT_ROOT_CONFIG0* outboundRootArray;
|
|
};
|
|
[case(IKEEXT_CERT_CONFIG_ENTERPRISE_STORE)]
|
|
// Enterprise store config for selecting a certificate chain to send to
|
|
// the peer.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* outboundEnterpriseStoreConfig;
|
|
[case(IKEEXT_CERT_CONFIG_TRUSTED_ROOT_STORE)]
|
|
// Trusted root store config for selecting a certificate chain to send
|
|
// to the peer.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* outboundTrustedRootStoreConfig;
|
|
};
|
|
// Flags
|
|
UINT32 flags;
|
|
} IKEEXT_CERTIFICATE_AUTHENTICATION0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Version-1 of type used to specify various parameters for authentication with
|
|
// certificates.
|
|
typedef struct IKEEXT_CERTIFICATE_AUTHENTICATION1_
|
|
{
|
|
// Certificate configuration type for inbound peer cert verification.
|
|
IKEEXT_CERT_CONFIG_TYPE inboundConfigType;
|
|
// Configuration for inbound peer cert verification. It is a union of
|
|
// explicit trust list, enterprise store, or trusted root store config
|
|
// depending on the configType.
|
|
[switch_type(IKEEXT_CERT_CONFIG_TYPE), switch_is(inboundConfigType)]
|
|
union
|
|
{
|
|
[case(IKEEXT_CERT_CONFIG_EXPLICIT_TRUST_LIST)]
|
|
// Explicit trust list for verifying the peer certificate chain.
|
|
struct
|
|
{
|
|
UINT32 inboundRootArraySize;
|
|
[size_is(inboundRootArraySize), unique]
|
|
IKEEXT_CERT_ROOT_CONFIG0* inboundRootArray;
|
|
};
|
|
[case(IKEEXT_CERT_CONFIG_ENTERPRISE_STORE)]
|
|
// Enterprise store config for verifying the peer certificate chain.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* inboundEnterpriseStoreConfig;
|
|
[case(IKEEXT_CERT_CONFIG_TRUSTED_ROOT_STORE)]
|
|
// Trusted root store config for verifying the peer certificate chain.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* inboundTrustedRootStoreConfig;
|
|
[case(IKEEXT_CERT_CONFIG_UNSPECIFIED)];
|
|
};
|
|
|
|
// Certificate configuration type for outbound local cert selection.
|
|
IKEEXT_CERT_CONFIG_TYPE outboundConfigType;
|
|
// Configuration for outbound local cert selection. It is a union of
|
|
// explicit trust list, enterprise store, or trusted root store config
|
|
// depending on the configType.
|
|
[switch_type(IKEEXT_CERT_CONFIG_TYPE), switch_is(outboundConfigType)]
|
|
union
|
|
{
|
|
[case(IKEEXT_CERT_CONFIG_EXPLICIT_TRUST_LIST)]
|
|
// Explicit trust list for selecting a certificate chain to send to the
|
|
// peer.
|
|
struct
|
|
{
|
|
UINT32 outboundRootArraySize;
|
|
[size_is(outboundRootArraySize), unique]
|
|
IKEEXT_CERT_ROOT_CONFIG0* outboundRootArray;
|
|
};
|
|
[case(IKEEXT_CERT_CONFIG_ENTERPRISE_STORE)]
|
|
// Enterprise store config for selecting a certificate chain to send to
|
|
// the peer.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* outboundEnterpriseStoreConfig;
|
|
[case(IKEEXT_CERT_CONFIG_TRUSTED_ROOT_STORE)]
|
|
// Trusted root store config for selecting a certificate chain to send
|
|
// to the peer.
|
|
[unique] IKEEXT_CERT_ROOT_CONFIG0* outboundTrustedRootStoreConfig;
|
|
[case(IKEEXT_CERT_CONFIG_UNSPECIFIED)];
|
|
};
|
|
// Flags
|
|
UINT32 flags;
|
|
|
|
// HTTP URL pointing to an encoded certificate or certificate-bundle, that
|
|
// will be used by IKEv2 for authenticating local machine to a peer.
|
|
// Only supported by IKEv2.
|
|
FWP_BYTE_BLOB localCertLocationUrl;
|
|
} IKEEXT_CERTIFICATE_AUTHENTICATION1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Type used to specify various parameters for IPV6 CGA authentication.
|
|
typedef struct IKEEXT_IPV6_CGA_AUTHENTICATION0_
|
|
{
|
|
// Key container name of the public key/private key pair that was used to
|
|
// generate the CGA. Same semantics as CRYPT_KEY_PROV_INFO->pwszContainerName
|
|
[string, ref] wchar_t* keyContainerName;
|
|
// Name of the CSP that stores the key container. If NULL, default provider
|
|
// will be used. Same semantics as CRYPT_KEY_PROV_INFO->pwszProvName.
|
|
[string, unique] wchar_t* cspName;
|
|
// Type of the CSP that stores the key container. Same semantics as
|
|
// CRYPT_KEY_PROV_INFO->dwProvType
|
|
UINT32 cspType;
|
|
// Modifier used during CGA generation. See CGA RFC for more information.
|
|
FWP_BYTE_ARRAY16 cgaModifier;
|
|
// Collision count used during CGA generation. See CGA RFC for more information.
|
|
BYTE cgaCollisionCount;
|
|
} IKEEXT_IPV6_CGA_AUTHENTICATION0;
|
|
|
|
// Disable initiator generation of peer token from the peer's name string
|
|
cpp_quote("#define IKEEXT_KERB_AUTH_DISABLE_INITIATOR_TOKEN_GENERATION (0x00000001)")
|
|
// Refuse connections if the peer is using explicit credentials
|
|
cpp_quote("#define IKEEXT_KERB_AUTH_DONT_ACCEPT_EXPLICIT_CREDENTIALS (0x00000002)")
|
|
|
|
|
|
// Stores information needed for kerberos authentication
|
|
typedef struct IKEEXT_KERBEROS_AUTHENTICATION0__
|
|
{
|
|
UINT32 flags;
|
|
} IKEEXT_KERBEROS_AUTHENTICATION0;
|
|
|
|
|
|
// Refuse connections if the peer is using explicit credentials
|
|
cpp_quote("#define IKEEXT_NTLM_V2_AUTH_DONT_ACCEPT_EXPLICIT_CREDENTIALS (0x00000001)")
|
|
// Stores information needed for ntlmV2 authentication
|
|
typedef struct IKEEXT_NTLM_V2_AUTHENTICATION0__
|
|
{
|
|
UINT32 flags;
|
|
} IKEEXT_NTLM_V2_AUTHENTICATION0;
|
|
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Use EAP for authenticating local entity to remote entity only
|
|
cpp_quote("#define IKEEXT_EAP_FLAG_LOCAL_AUTH_ONLY (0x00000001)")
|
|
// Use EAP for authenticating remote entity to local entity only
|
|
cpp_quote("#define IKEEXT_EAP_FLAG_REMOTE_AUTH_ONLY (0x00000002)")
|
|
|
|
// Stores information needed for EAP authentication
|
|
typedef struct IKEEXT_EAP_AUTHENTICATION0__
|
|
{
|
|
UINT32 flags;
|
|
} IKEEXT_EAP_AUTHENTICATION0;
|
|
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Type specifying various parameters for IKE/Authip authentication
|
|
typedef struct IKEEXT_AUTHENTICATION_METHOD0_
|
|
{
|
|
// Type of authentication method
|
|
IKEEXT_AUTHENTICATION_METHOD_TYPE authenticationMethodType;
|
|
// Tagged union containing parameters specific to the authentication method
|
|
// type.
|
|
[switch_type(IKEEXT_AUTHENTICATION_METHOD_TYPE),
|
|
switch_is(authenticationMethodType)]
|
|
union
|
|
{
|
|
[case(IKEEXT_PRESHARED_KEY)]
|
|
IKEEXT_PRESHARED_KEY_AUTHENTICATION0 presharedKeyAuthentication;
|
|
[case(IKEEXT_CERTIFICATE,
|
|
IKEEXT_CERTIFICATE_ECDSA_P256,
|
|
IKEEXT_CERTIFICATE_ECDSA_P384)]
|
|
IKEEXT_CERTIFICATE_AUTHENTICATION0 certificateAuthentication;
|
|
[case(IKEEXT_KERBEROS)]
|
|
IKEEXT_KERBEROS_AUTHENTICATION0 kerberosAuthentication;
|
|
[case(IKEEXT_NTLM_V2)]
|
|
IKEEXT_NTLM_V2_AUTHENTICATION0 ntlmV2Authentication;
|
|
[case(IKEEXT_ANONYMOUS)];
|
|
[case(IKEEXT_SSL,
|
|
IKEEXT_SSL_ECDSA_P256,
|
|
IKEEXT_SSL_ECDSA_P384)]
|
|
IKEEXT_CERTIFICATE_AUTHENTICATION0 sslAuthentication;
|
|
[case(IKEEXT_IPV6_CGA)]
|
|
IKEEXT_IPV6_CGA_AUTHENTICATION0 cgaAuthentication;
|
|
};
|
|
} IKEEXT_AUTHENTICATION_METHOD0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Version-1 of type specifying various parameters for IKE/Authip authentication
|
|
typedef struct IKEEXT_AUTHENTICATION_METHOD1_
|
|
{
|
|
// Type of authentication method
|
|
IKEEXT_AUTHENTICATION_METHOD_TYPE authenticationMethodType;
|
|
// Tagged union containing parameters specific to the authentication method
|
|
// type.
|
|
[switch_type(IKEEXT_AUTHENTICATION_METHOD_TYPE),
|
|
switch_is(authenticationMethodType)]
|
|
union
|
|
{
|
|
[case(IKEEXT_PRESHARED_KEY)]
|
|
IKEEXT_PRESHARED_KEY_AUTHENTICATION1 presharedKeyAuthentication;
|
|
[case(IKEEXT_CERTIFICATE,
|
|
IKEEXT_CERTIFICATE_ECDSA_P256,
|
|
IKEEXT_CERTIFICATE_ECDSA_P384)]
|
|
IKEEXT_CERTIFICATE_AUTHENTICATION1 certificateAuthentication;
|
|
[case(IKEEXT_KERBEROS)]
|
|
IKEEXT_KERBEROS_AUTHENTICATION0 kerberosAuthentication;
|
|
[case(IKEEXT_NTLM_V2)]
|
|
IKEEXT_NTLM_V2_AUTHENTICATION0 ntlmV2Authentication;
|
|
[case(IKEEXT_ANONYMOUS)];
|
|
[case(IKEEXT_SSL,
|
|
IKEEXT_SSL_ECDSA_P256,
|
|
IKEEXT_SSL_ECDSA_P384)]
|
|
IKEEXT_CERTIFICATE_AUTHENTICATION1 sslAuthentication;
|
|
[case(IKEEXT_IPV6_CGA)]
|
|
IKEEXT_IPV6_CGA_AUTHENTICATION0 cgaAuthentication;
|
|
[case(IKEEXT_EAP)]
|
|
IKEEXT_EAP_AUTHENTICATION0 eapAuthentication;
|
|
};
|
|
} IKEEXT_AUTHENTICATION_METHOD1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Type of encryption algorithm used for encrypting the IKE/Authip messages
|
|
typedef [v1_enum] enum IKEEXT_CIPHER_TYPE_
|
|
{
|
|
IKEEXT_CIPHER_DES,
|
|
IKEEXT_CIPHER_3DES,
|
|
IKEEXT_CIPHER_AES_128,
|
|
IKEEXT_CIPHER_AES_192,
|
|
IKEEXT_CIPHER_AES_256,
|
|
IKEEXT_CIPHER_TYPE_MAX
|
|
} IKEEXT_CIPHER_TYPE;
|
|
|
|
// Stores information about the IKE/Authip encryption algorithm
|
|
typedef struct IKEEXT_CIPHER_ALGORITHM0_
|
|
{
|
|
// The type of encryption algorithm
|
|
IKEEXT_CIPHER_TYPE algoIdentifier;
|
|
// length of the encryption key
|
|
UINT32 keyLen;
|
|
// Number of rounds in the encryption algorithm
|
|
UINT32 rounds;
|
|
} IKEEXT_CIPHER_ALGORITHM0;
|
|
|
|
// Type of hash algorithm used for integrity protection of IKE/Authip messages
|
|
typedef [v1_enum] enum IKEEXT_INTEGRITY_TYPE_
|
|
{
|
|
IKEEXT_INTEGRITY_MD5,
|
|
IKEEXT_INTEGRITY_SHA1,
|
|
IKEEXT_INTEGRITY_SHA_256,
|
|
IKEEXT_INTEGRITY_SHA_384,
|
|
IKEEXT_INTEGRITY_TYPE_MAX
|
|
} IKEEXT_INTEGRITY_TYPE;
|
|
|
|
// Stores the IKE/Authip hash algorithm
|
|
typedef struct IKEEXT_INTEGRITY_ALGORITHM0_
|
|
{
|
|
// The type of hash algorithm
|
|
IKEEXT_INTEGRITY_TYPE algoIdentifier;
|
|
} IKEEXT_INTEGRITY_ALGORITHM0;
|
|
|
|
// Type of Diffie Hellman group used for IKE/Authip key generation
|
|
typedef [v1_enum] enum IKEEXT_DH_GROUP_
|
|
{
|
|
IKEEXT_DH_GROUP_NONE,
|
|
IKEEXT_DH_GROUP_1,
|
|
IKEEXT_DH_GROUP_2,
|
|
IKEEXT_DH_GROUP_2048,
|
|
IKEEXT_DH_ECP_256,
|
|
IKEEXT_DH_ECP_384,
|
|
IKEEXT_DH_GROUP_MAX
|
|
} IKEEXT_DH_GROUP;
|
|
|
|
// Type used to store an IKE/Authip main mode proposal. The proposal describes
|
|
// the various parameters of the IKE/Authip main mode SA that is potentially
|
|
// generated from this proposal.
|
|
typedef struct IKEEXT_PROPOSAL0_
|
|
{
|
|
// Parameters for the encryption algorithm
|
|
IKEEXT_CIPHER_ALGORITHM0 cipherAlgorithm;
|
|
// Parameters for the hash algorithm
|
|
IKEEXT_INTEGRITY_ALGORITHM0 integrityAlgorithm;
|
|
// Main mode SA Lifetime in seconds
|
|
UINT32 maxLifetimeSeconds;
|
|
// The Diffie Hellman group
|
|
IKEEXT_DH_GROUP dhGroup;
|
|
// Maximum number of IPsec quick mode SAs that can be generated from this
|
|
// main mode SA. O means infinite.
|
|
UINT32 quickModeLimit;
|
|
} IKEEXT_PROPOSAL0;
|
|
|
|
//////////
|
|
// Flags specifying IKE/Authip main mode policy characteristics.
|
|
//////////
|
|
|
|
// Disable special diagnostics mode for IKE/Authip. This will prevent IKE, AuthIp
|
|
// from accepting unauthenticated notifies from peer, or sending MS_STATUS
|
|
// notifies to peer.
|
|
cpp_quote("#define IKEEXT_POLICY_FLAG_DISABLE_DIAGNOSTICS (0x00000001)")
|
|
// Disable SA verification of machine LUID
|
|
cpp_quote("#define IKEEXT_POLICY_FLAG_NO_MACHINE_LUID_VERIFY (0x00000002)")
|
|
// Disable SA verification of machine impersonation LUID
|
|
cpp_quote("#define IKEEXT_POLICY_FLAG_NO_IMPERSONATION_LUID_VERIFY (0x00000004)")
|
|
// AuthIP only: allow responder to accept any DH proposal (including NO dh)
|
|
// regardless of what is configured in policy
|
|
cpp_quote("#define IKEEXT_POLICY_FLAG_ENABLE_OPTIONAL_DH (0x00000008)")
|
|
|
|
// Type used to store the IKE/Authip main mode negotiation policy
|
|
typedef struct IKEEXT_POLICY0_
|
|
{
|
|
// Lifetime in seconds of the IPsec soft SA
|
|
UINT32 softExpirationTime;
|
|
// number of authentication methods
|
|
UINT32 numAuthenticationMethods;
|
|
// Array of acceptable authentication methods
|
|
[size_is(numAuthenticationMethods), ref]
|
|
IKEEXT_AUTHENTICATION_METHOD0* authenticationMethods;
|
|
// Type of impersonation. Applies only to Authip.
|
|
IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE initiatorImpersonationType;
|
|
// Number of main mode proposals
|
|
UINT32 numIkeProposals;
|
|
// Array of main mode proposals
|
|
[size_is(numIkeProposals), ref] IKEEXT_PROPOSAL0* ikeProposals;
|
|
// Flags
|
|
UINT32 flags;
|
|
// Maximum number of dynamic IPsec filters (per remote IP address and per
|
|
// transport layer) that is allowed to be added for any SA negotiated using
|
|
// this policy. This throttle prevents an attacker from making IKE, Authip
|
|
// add too many dynamic filters. If this is set to 0, then dynamic filter
|
|
// addition will be disabled.
|
|
UINT32 maxDynamicFilters;
|
|
} IKEEXT_POLICY0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Version-1 of type used to store the IKE/Authip main mode negotiation policy
|
|
typedef struct IKEEXT_POLICY1_
|
|
{
|
|
// Lifetime in seconds of the IPsec soft SA
|
|
UINT32 softExpirationTime;
|
|
// number of authentication methods
|
|
UINT32 numAuthenticationMethods;
|
|
// Array of acceptable authentication methods
|
|
[size_is(numAuthenticationMethods), ref]
|
|
IKEEXT_AUTHENTICATION_METHOD1* authenticationMethods;
|
|
// Type of impersonation. Applies only to Authip.
|
|
IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE initiatorImpersonationType;
|
|
// Number of main mode proposals
|
|
UINT32 numIkeProposals;
|
|
// Array of main mode proposals
|
|
[size_is(numIkeProposals), ref] IKEEXT_PROPOSAL0* ikeProposals;
|
|
// Flags
|
|
UINT32 flags;
|
|
// Maximum number of dynamic IPsec filters (per remote IP address and per
|
|
// transport layer) that is allowed to be added for any SA negotiated using
|
|
// this policy. This throttle prevents an attacker from making IKE, Authip
|
|
// add too many dynamic filters. If this is set to 0, then dynamic filter
|
|
// addition will be disabled.
|
|
UINT32 maxDynamicFilters;
|
|
// Duration of time (in seconds) IKEv2 request will be retransmitted before giving up
|
|
// Must be set to atleast 120 seconds (or 2mins)
|
|
// Applies to IkeV2 only.
|
|
UINT32 retransmitDurationSecs;
|
|
} IKEEXT_POLICY1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Type used to store Authip's extended mode negotiation policy.
|
|
typedef struct IKEEXT_EM_POLICY0_
|
|
{
|
|
// Number of authentication methods in the array
|
|
UINT32 numAuthenticationMethods;
|
|
// Array of acceptable authentication methods
|
|
[size_is(numAuthenticationMethods), ref]
|
|
IKEEXT_AUTHENTICATION_METHOD0* authenticationMethods;
|
|
// Type of impersonation. Applies only to Authip.
|
|
IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE initiatorImpersonationType;
|
|
|
|
} IKEEXT_EM_POLICY0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Version-1 of type used to store Authip's extended mode negotiation policy.
|
|
typedef struct IKEEXT_EM_POLICY1_
|
|
{
|
|
// Number of authentication methods in the array
|
|
UINT32 numAuthenticationMethods;
|
|
// Array of acceptable authentication methods
|
|
[size_is(numAuthenticationMethods), ref]
|
|
IKEEXT_AUTHENTICATION_METHOD1* authenticationMethods;
|
|
// Type of impersonation. Applies only to Authip.
|
|
IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE initiatorImpersonationType;
|
|
} IKEEXT_EM_POLICY1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Definitions for retrieving IKE statistics.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//Number of WinError failure codes specific to IKE
|
|
cpp_quote("#define IKEEXT_ERROR_CODE_COUNT \
|
|
(ERROR_IPSEC_IKE_NEG_STATUS_END - ERROR_IPSEC_IKE_NEG_STATUS_BEGIN)")
|
|
#define IKEEXT_ERROR_CODE_COUNT \
|
|
(ERROR_IPSEC_IKE_NEG_STATUS_END - ERROR_IPSEC_IKE_NEG_STATUS_BEGIN)
|
|
|
|
// Various statistics specific to the keying module (IKE or Authip) and
|
|
// specific to the IP version
|
|
typedef struct IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS0_
|
|
{
|
|
// Following statistics are Main Mode specific
|
|
|
|
// Current number of active Main Mode SAs
|
|
UINT32 currentActiveMainModes;
|
|
// Total number of Main Mode negotiations.
|
|
UINT32 totalMainModesStarted;
|
|
// Total number of successful Main Mode negotiations
|
|
UINT32 totalSuccessfulMainModes;
|
|
// Total number of failed Main Mode negotiations
|
|
UINT32 totalFailedMainModes;
|
|
// Total number of Main Mode negotiations that were externally intiated by
|
|
// a peer (responder)
|
|
UINT32 totalResponderMainModes;
|
|
// Current number of newly created responder Main Modes that are still in
|
|
// the initial state.
|
|
UINT32 currentNewResponderMainModes;
|
|
|
|
// Following statistics are Quick Mode specific
|
|
|
|
// Current number of active Quick Mode SAs
|
|
UINT32 currentActiveQuickModes;
|
|
// Total number of Quick Mode negotiations.
|
|
UINT32 totalQuickModesStarted;
|
|
// Total number of successful Quick Mode negotiations
|
|
UINT32 totalSuccessfulQuickModes;
|
|
// Total number of failed Quick Mode negotiations
|
|
UINT32 totalFailedQuickModes;
|
|
|
|
// Total number of acquires received from BFE.
|
|
UINT32 totalAcquires;
|
|
// Total number of acquires that were internally reinitiated.
|
|
UINT32 totalReinitAcquires;
|
|
|
|
// Following statistics are applicable only to Authip
|
|
|
|
// Current number of active extended mode SAs
|
|
UINT32 currentActiveExtendedModes;
|
|
// Total number of extended mode negotiations.
|
|
UINT32 totalExtendedModesStarted;
|
|
// Total number of successful extended mode negotiations.
|
|
UINT32 totalSuccessfulExtendedModes;
|
|
// Total number of failed extended mode negotiations.
|
|
UINT32 totalFailedExtendedModes;
|
|
// Total number of successful extended mode negotiations that used
|
|
// impersonation
|
|
UINT32 totalImpersonationExtendedModes;
|
|
// Total number of successful Main Mode negotiations that used impersonation
|
|
UINT32 totalImpersonationMainModes;
|
|
} IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Various statistics specific to the keying module (IKE,Authip and IkeV2) and
|
|
// specific to the IP version
|
|
typedef struct IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS1_
|
|
{
|
|
// Following statistics are Main Mode specific
|
|
|
|
// Current number of active Main Mode SAs
|
|
UINT32 currentActiveMainModes;
|
|
// Total number of Main Mode negotiations.
|
|
UINT32 totalMainModesStarted;
|
|
// Total number of successful Main Mode negotiations
|
|
UINT32 totalSuccessfulMainModes;
|
|
// Total number of failed Main Mode negotiations
|
|
UINT32 totalFailedMainModes;
|
|
// Total number of Main Mode negotiations that were externally intiated by
|
|
// a peer (responder)
|
|
UINT32 totalResponderMainModes;
|
|
// Current number of newly created responder Main Modes that are still in
|
|
// the initial state.
|
|
UINT32 currentNewResponderMainModes;
|
|
|
|
// Following statistics are Quick Mode specific
|
|
|
|
// Current number of active Quick Mode SAs
|
|
UINT32 currentActiveQuickModes;
|
|
// Total number of Quick Mode negotiations.
|
|
UINT32 totalQuickModesStarted;
|
|
// Total number of successful Quick Mode negotiations
|
|
UINT32 totalSuccessfulQuickModes;
|
|
// Total number of failed Quick Mode negotiations
|
|
UINT32 totalFailedQuickModes;
|
|
|
|
// Total number of acquires received from BFE.
|
|
UINT32 totalAcquires;
|
|
// Total number of acquires that were internally reinitiated.
|
|
UINT32 totalReinitAcquires;
|
|
|
|
// Following statistics are applicable only to Authip
|
|
|
|
// Current number of active extended mode SAs
|
|
UINT32 currentActiveExtendedModes;
|
|
// Total number of extended mode negotiations.
|
|
UINT32 totalExtendedModesStarted;
|
|
// Total number of successful extended mode negotiations.
|
|
UINT32 totalSuccessfulExtendedModes;
|
|
// Total number of failed extended mode negotiations.
|
|
UINT32 totalFailedExtendedModes;
|
|
// Total number of successful extended mode negotiations that used
|
|
// impersonation
|
|
UINT32 totalImpersonationExtendedModes;
|
|
// Total number of successful Main Mode negotiations that used impersonation
|
|
UINT32 totalImpersonationMainModes;
|
|
} IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
|
|
// Various statistics specific to the keying module (IKE or Authip)
|
|
typedef struct IKEEXT_KEYMODULE_STATISTICS0_
|
|
{
|
|
// IPv4 specific statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS0 v4Statistics;
|
|
// IPv6 specific statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS0 v6Statistics;
|
|
// Table containing the frequencies of various IKE Win32 error codes
|
|
// (ranging from ERROR_IPSEC_IKE_NEG_STATUS_BEGIN to
|
|
// ERROR_IPSEC_IKE_NEG_STATUS_END) encountered during negotiations.
|
|
UINT32 errorFrequencyTable[IKEEXT_ERROR_CODE_COUNT];
|
|
// Current Main Mode negotiation time (in msecs)
|
|
UINT32 mainModeNegotiationTime;
|
|
// Current Quick Mode negotiation time (in msecs)
|
|
UINT32 quickModeNegotiationTime;
|
|
// Current extended mode negotiation time (in msecs) (applicable to Authip
|
|
// only)
|
|
UINT32 extendedModeNegotiationTime;
|
|
} IKEEXT_KEYMODULE_STATISTICS0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Various statistics specific to the keying module (IKE, Authip or IkeV2)
|
|
typedef struct IKEEXT_KEYMODULE_STATISTICS1_
|
|
{
|
|
// IPv4 specific statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS1 v4Statistics;
|
|
// IPv6 specific statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_KEYMODULE_STATISTICS1 v6Statistics;
|
|
// Table containing the frequencies of various IKE Win32 error codes
|
|
// (ranging from ERROR_IPSEC_IKE_NEG_STATUS_BEGIN to
|
|
// ERROR_IPSEC_IKE_NEG_STATUS_END) encountered during negotiations.
|
|
UINT32 errorFrequencyTable[IKEEXT_ERROR_CODE_COUNT];
|
|
// Current Main Mode negotiation time (in msecs)
|
|
UINT32 mainModeNegotiationTime;
|
|
// Current Quick Mode negotiation time (in msecs)
|
|
UINT32 quickModeNegotiationTime;
|
|
// Current extended mode negotiation time (in msecs) (applicable to Authip
|
|
// only)
|
|
UINT32 extendedModeNegotiationTime;
|
|
} IKEEXT_KEYMODULE_STATISTICS1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Various statistics common to IKE and Authip and specific to the protocol
|
|
// (IPv4 or IPv6)
|
|
typedef struct IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS0_
|
|
{
|
|
// Total number of UDP 500/4500 socket receive failures.
|
|
UINT32 totalSocketReceiveFailures;
|
|
// Total number of UDP 500/4500 socket send failures.
|
|
UINT32 totalSocketSendFailures;
|
|
} IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Various statistics common to IKE ,Authip and IkeV1 specific to the protocol
|
|
// (IPv4 or IPv6)
|
|
typedef struct IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS1_
|
|
{
|
|
// Total number of UDP 500/4500 socket receive failures.
|
|
UINT32 totalSocketReceiveFailures;
|
|
// Total number of UDP 500/4500 socket send failures.
|
|
UINT32 totalSocketSendFailures;
|
|
} IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Various statistics common to IKE and Authip.
|
|
typedef struct IKEEXT_COMMON_STATISTICS0_
|
|
{
|
|
// IPv4 specific common statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS0 v4Statistics;
|
|
// IPv6 specific common statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS0 v6Statistics;
|
|
// Total number of packets received.
|
|
UINT32 totalPacketsReceived;
|
|
// Total number of invalid packets received.
|
|
UINT32 totalInvalidPacketsReceived;
|
|
// Current number of workitems that are queued and waiting to be processed.
|
|
UINT32 currentQueuedWorkitems;
|
|
} IKEEXT_COMMON_STATISTICS0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Various statistics common to IKE ,Authip and IkeV2.
|
|
typedef struct IKEEXT_COMMON_STATISTICS1_
|
|
{
|
|
// IPv4 specific common statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS1 v4Statistics;
|
|
// IPv6 specific common statistics
|
|
IKEEXT_IP_VERSION_SPECIFIC_COMMON_STATISTICS1 v6Statistics;
|
|
// Total number of packets received.
|
|
UINT32 totalPacketsReceived;
|
|
// Total number of invalid packets received.
|
|
UINT32 totalInvalidPacketsReceived;
|
|
// Current number of workitems that are queued and waiting to be processed.
|
|
UINT32 currentQueuedWorkitems;
|
|
} IKEEXT_COMMON_STATISTICS1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Various statistics for IKE and Authip together
|
|
typedef struct IKEEXT_STATISTICS0_
|
|
{
|
|
// Statistics specific to IKE
|
|
IKEEXT_KEYMODULE_STATISTICS0 ikeStatistics;
|
|
// Statistics specific to Authip
|
|
IKEEXT_KEYMODULE_STATISTICS0 authipStatistics;
|
|
// Statistics common to IKE and Authip
|
|
IKEEXT_COMMON_STATISTICS0 commonStatistics;
|
|
} IKEEXT_STATISTICS0;
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Various statistics for IKE ,Authip and IkeV2 together
|
|
typedef struct IKEEXT_STATISTICS1_
|
|
{
|
|
// Statistics specific to IKE
|
|
IKEEXT_KEYMODULE_STATISTICS1 ikeStatistics;
|
|
// Statistics specific to Authip
|
|
IKEEXT_KEYMODULE_STATISTICS1 authipStatistics;
|
|
// Statistics specific to IkeV2
|
|
IKEEXT_KEYMODULE_STATISTICS1 ikeV2Statistics;
|
|
// Statistics common to IKE and Authip
|
|
IKEEXT_COMMON_STATISTICS1 commonStatistics;
|
|
} IKEEXT_STATISTICS1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Definitions for retrieving IKE SA details.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Type describing the IKE/Authip traffic
|
|
typedef struct IKEEXT_TRAFFIC0_
|
|
{
|
|
// IP version
|
|
FWP_IP_VERSION ipVersion;
|
|
// Tagged union containing the local address of the traffic
|
|
[switch_type(FWP_IP_VERSION), switch_is(ipVersion)] union
|
|
{
|
|
[case(FWP_IP_VERSION_V4)]
|
|
UINT32 localV4Address;
|
|
[case(FWP_IP_VERSION_V6)]
|
|
UINT8 localV6Address[16];
|
|
};
|
|
// Tagged union containing the remote address of the traffic
|
|
[switch_type(FWP_IP_VERSION), switch_is(ipVersion)] union
|
|
{
|
|
[case(FWP_IP_VERSION_V4)]
|
|
UINT32 remoteV4Address;
|
|
[case(FWP_IP_VERSION_V6)]
|
|
UINT8 remoteV6Address[16];
|
|
};
|
|
|
|
// Filter ID from QM policy of matching EM filter
|
|
// FWPM_LAYER_IPSEC_XX
|
|
UINT64 authIpFilterId;
|
|
|
|
} IKEEXT_TRAFFIC0;
|
|
|
|
// Type used to store an IKE/Authip cookie
|
|
typedef UINT64 IKEEXT_COOKIE;
|
|
|
|
// Type used to store a pair of IKE/Authip cookies
|
|
typedef struct IKEEXT_COOKIE_PAIR0_
|
|
{
|
|
// Initiator cookie
|
|
IKEEXT_COOKIE initiator;
|
|
// Responder cookie
|
|
IKEEXT_COOKIE responder;
|
|
} IKEEXT_COOKIE_PAIR0;
|
|
|
|
// Certificate is a NAP (health) certificate
|
|
cpp_quote("#define IKEEXT_CERT_CREDENTIAL_FLAG_NAP_CERT (0x00000001)")
|
|
|
|
|
|
// Type used to store credential information specific to certificate
|
|
// authentication
|
|
typedef struct IKEEXT_CERTIFICATE_CREDENTIAL0_
|
|
{
|
|
// Encoded subject name of the certificate used for authentication
|
|
FWP_BYTE_BLOB subjectName;
|
|
// SHA thumbprint of the certificate
|
|
FWP_BYTE_BLOB certHash;
|
|
// Flags
|
|
UINT32 flags;
|
|
} IKEEXT_CERTIFICATE_CREDENTIAL0;
|
|
|
|
// Type used to store credential name information
|
|
typedef struct IKEEXT_NAME_CREDENTIAL0_
|
|
{
|
|
// Name of the principal
|
|
[string, ref] wchar_t* principalName;
|
|
} IKEEXT_NAME_CREDENTIAL0;
|
|
|
|
// Type used to store credential information used for the authentication
|
|
typedef struct IKEEXT_CREDENTIAL0_
|
|
{
|
|
// Type of authentication method
|
|
IKEEXT_AUTHENTICATION_METHOD_TYPE authenticationMethodType;
|
|
// Tagged union containing credential information specific to the
|
|
// authentication method type.
|
|
// Type of impersonation.
|
|
IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE impersonationType;
|
|
|
|
[switch_type(IKEEXT_AUTHENTICATION_METHOD_TYPE),
|
|
switch_is(authenticationMethodType)] union
|
|
{
|
|
[case(IKEEXT_PRESHARED_KEY)]
|
|
[unique] IKEEXT_PRESHARED_KEY_AUTHENTICATION0* presharedKey;
|
|
[case(IKEEXT_CERTIFICATE,
|
|
IKEEXT_CERTIFICATE_ECDSA_P256,
|
|
IKEEXT_CERTIFICATE_ECDSA_P384,
|
|
IKEEXT_SSL,
|
|
IKEEXT_SSL_ECDSA_P256,
|
|
IKEEXT_SSL_ECDSA_P384,
|
|
IKEEXT_IPV6_CGA
|
|
)]
|
|
[unique] IKEEXT_CERTIFICATE_CREDENTIAL0* certificate;
|
|
[case(IKEEXT_KERBEROS,
|
|
IKEEXT_EAP,
|
|
IKEEXT_NTLM_V2)]
|
|
[unique] IKEEXT_NAME_CREDENTIAL0* name;
|
|
[case(IKEEXT_ANONYMOUS)];
|
|
};
|
|
} IKEEXT_CREDENTIAL0;
|
|
|
|
// Type used to store credential information used for the authentication
|
|
typedef struct IKEEXT_CREDENTIAL_PAIR0_
|
|
{
|
|
// Local credentials used for authentication
|
|
IKEEXT_CREDENTIAL0 localCredentials;
|
|
// Peer credentials used for authentication
|
|
IKEEXT_CREDENTIAL0 peerCredentials;
|
|
} IKEEXT_CREDENTIAL_PAIR0;
|
|
|
|
|
|
// Used to store multiple credential pairs. IKE has only 1 pair. AuthIp
|
|
// will have 1 or 2. IKEv2 can also have 1 or 2 (depending on if EAP was
|
|
// enabled). The MM auth is always index 0. EM auth, if it occurs is index 1.
|
|
typedef struct IKEEXT_CREDENTIALS0_
|
|
{
|
|
UINT32 numCredentials;
|
|
[size_is(numCredentials), ref] IKEEXT_CREDENTIAL_PAIR0* credentials;
|
|
|
|
} IKEEXT_CREDENTIALS0;
|
|
|
|
|
|
// Type used to store information returned when enumerating IKE, Authip SAs.
|
|
typedef struct IKEEXT_SA_DETAILS0_
|
|
{
|
|
// LUID identifying the SA.
|
|
UINT64 saId;
|
|
// Key module type
|
|
IKEEXT_KEY_MODULE_TYPE keyModuleType;
|
|
// IP version
|
|
FWP_IP_VERSION ipVersion;
|
|
// If a NAT was detected, this stores the UDP ports corresponding to the
|
|
// main mode.
|
|
[switch_type(FWP_IP_VERSION), switch_is(ipVersion)] union
|
|
{
|
|
[case(FWP_IP_VERSION_V4)]
|
|
[unique] IPSEC_V4_UDP_ENCAPSULATION0* v4UdpEncapsulation;
|
|
[case(FWP_IP_VERSION_V6)];
|
|
};
|
|
// The traffic corresponding to this SA
|
|
IKEEXT_TRAFFIC0 ikeTraffic;
|
|
// The main mode proposal corresponding to this SA
|
|
IKEEXT_PROPOSAL0 ikeProposal;
|
|
// SA cookies
|
|
IKEEXT_COOKIE_PAIR0 cookiePair;
|
|
// Credential information for the SA
|
|
IKEEXT_CREDENTIALS0 ikeCredentials;
|
|
// GUID of the main mode policy provider context corresponding to this SA.
|
|
GUID ikePolicyKey;
|
|
// ID/Handle to virtual interface tunneling state. Currently this is specific
|
|
// to IKEv2.
|
|
UINT64 virtualIfTunnelId;
|
|
} IKEEXT_SA_DETAILS0;
|
|
|
|
|
|
cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
// Type used to store credential information specific to certificate
|
|
// authentication
|
|
typedef struct IKEEXT_CERTIFICATE_CREDENTIAL1_
|
|
{
|
|
// Encoded subject name of the certificate used for authentication
|
|
FWP_BYTE_BLOB subjectName;
|
|
// SHA thumbprint of the certificate
|
|
FWP_BYTE_BLOB certHash;
|
|
// Flags
|
|
UINT32 flags;
|
|
// Encoded certificate
|
|
FWP_BYTE_BLOB certificate;
|
|
} IKEEXT_CERTIFICATE_CREDENTIAL1;
|
|
|
|
|
|
// Type used to store credential information used for the authentication
|
|
typedef struct IKEEXT_CREDENTIAL1_
|
|
{
|
|
// Type of authentication method
|
|
IKEEXT_AUTHENTICATION_METHOD_TYPE authenticationMethodType;
|
|
// Tagged union containing credential information specific to the
|
|
// authentication method type.
|
|
// Type of impersonation.
|
|
IKEEXT_AUTHENTICATION_IMPERSONATION_TYPE impersonationType;
|
|
|
|
[switch_type(IKEEXT_AUTHENTICATION_METHOD_TYPE),
|
|
switch_is(authenticationMethodType)] union
|
|
{
|
|
[case(IKEEXT_PRESHARED_KEY)]
|
|
[unique] IKEEXT_PRESHARED_KEY_AUTHENTICATION1* presharedKey;
|
|
[case(IKEEXT_CERTIFICATE,
|
|
IKEEXT_CERTIFICATE_ECDSA_P256,
|
|
IKEEXT_CERTIFICATE_ECDSA_P384,
|
|
IKEEXT_SSL,
|
|
IKEEXT_SSL_ECDSA_P256,
|
|
IKEEXT_SSL_ECDSA_P384,
|
|
IKEEXT_IPV6_CGA
|
|
)]
|
|
[unique] IKEEXT_CERTIFICATE_CREDENTIAL1* certificate;
|
|
[case(IKEEXT_KERBEROS,
|
|
IKEEXT_EAP,
|
|
IKEEXT_NTLM_V2)]
|
|
[unique] IKEEXT_NAME_CREDENTIAL0* name;
|
|
[case(IKEEXT_ANONYMOUS)];
|
|
};
|
|
} IKEEXT_CREDENTIAL1;
|
|
|
|
// Type used to store credential information used for the authentication
|
|
typedef struct IKEEXT_CREDENTIAL_PAIR1_
|
|
{
|
|
// Local credentials used for authentication
|
|
IKEEXT_CREDENTIAL1 localCredentials;
|
|
// Peer credentials used for authentication
|
|
IKEEXT_CREDENTIAL1 peerCredentials;
|
|
} IKEEXT_CREDENTIAL_PAIR1;
|
|
|
|
|
|
// Used to store multiple credential pairs. IKE has only 1 pair. AuthIp
|
|
// will have 1 or 2. IKEv2 can also have 1 or 2 (depending on if EAP was
|
|
// enabled). The MM auth is always index 0. EM auth, if it occurs is index 1.
|
|
typedef struct IKEEXT_CREDENTIALS1_
|
|
{
|
|
UINT32 numCredentials;
|
|
[size_is(numCredentials), ref] IKEEXT_CREDENTIAL_PAIR1* credentials;
|
|
|
|
} IKEEXT_CREDENTIALS1;
|
|
|
|
|
|
// Type used to store information returned when enumerating IKE, Authip SAs.
|
|
typedef struct IKEEXT_SA_DETAILS1_
|
|
{
|
|
// LUID identifying the SA.
|
|
UINT64 saId;
|
|
// Key module type
|
|
IKEEXT_KEY_MODULE_TYPE keyModuleType;
|
|
// IP version
|
|
FWP_IP_VERSION ipVersion;
|
|
// If a NAT was detected, this stores the UDP ports corresponding to the
|
|
// main mode.
|
|
[switch_type(FWP_IP_VERSION), switch_is(ipVersion)] union
|
|
{
|
|
[case(FWP_IP_VERSION_V4)]
|
|
[unique] IPSEC_V4_UDP_ENCAPSULATION0* v4UdpEncapsulation;
|
|
[case(FWP_IP_VERSION_V6)];
|
|
};
|
|
// The traffic corresponding to this SA
|
|
IKEEXT_TRAFFIC0 ikeTraffic;
|
|
// The main mode proposal corresponding to this SA
|
|
IKEEXT_PROPOSAL0 ikeProposal;
|
|
// SA cookies
|
|
IKEEXT_COOKIE_PAIR0 cookiePair;
|
|
// Credential information for the SA
|
|
IKEEXT_CREDENTIALS1 ikeCredentials;
|
|
// GUID of the main mode policy provider context corresponding to this SA.
|
|
GUID ikePolicyKey;
|
|
// ID/Handle to virtual interface tunneling state. Currently this is specific
|
|
// to IKEv2.
|
|
UINT64 virtualIfTunnelId;
|
|
// Key derived from authentications so external apps can cryptographically bind
|
|
// their exchanges with the this SA
|
|
FWP_BYTE_BLOB correlationKey;
|
|
} IKEEXT_SA_DETAILS1;
|
|
cpp_quote("#endif // (NTDDI_VERSION >= NTDDI_WIN7)")
|
|
|
|
// Enumeration template used for enumerating IKE SAs
|
|
typedef struct IKEEXT_SA_ENUM_TEMPLATE0_
|
|
{
|
|
// If not empty, only SAs whose local address is on the specified subnet
|
|
// will be returned. May be of type FWP_UINT32, FWP_BYTE_ARRAY16_TYPE,
|
|
// FWP_V4_ADDR_MASK, or FWP_V6_ADDR_MASK.
|
|
FWP_CONDITION_VALUE0 localSubNet;
|
|
// If not empty, only SAs whose remote address is on the specified subnet
|
|
// will be returned. May be of type FWP_UINT32, FWP_BYTE_ARRAY16_TYPE,
|
|
// FWP_V4_ADDR_MASK, or FWP_V6_ADDR_MASK.
|
|
FWP_CONDITION_VALUE0 remoteSubNet;
|
|
// If not zero-length, only SAs with a matching local main mode SHA
|
|
// thumbprint will be returned.
|
|
FWP_BYTE_BLOB localMainModeCertHash;
|
|
} IKEEXT_SA_ENUM_TEMPLATE0;
|
|
|
|
// IKE main mode states
|
|
typedef [v1_enum] enum IKEEXT_MM_SA_STATE_
|
|
{
|
|
// Initial state. No MM packets have been sent to the peer yet.
|
|
IKEEXT_MM_SA_STATE_NONE,
|
|
// First roundtrip packet has been sent to the peer.
|
|
IKEEXT_MM_SA_STATE_SA_SENT,
|
|
// Second roundtrip packet has been sent to the peer, for SSPI auth.
|
|
IKEEXT_MM_SA_STATE_SSPI_SENT,
|
|
// Second roundtrip packet has been sent to the peer.
|
|
IKEEXT_MM_SA_STATE_FINAL,
|
|
// Final roundtrip packet has been sent to the peer.
|
|
IKEEXT_MM_SA_STATE_FINAL_SENT,
|
|
// MM has been completed.
|
|
IKEEXT_MM_SA_STATE_COMPLETE,
|
|
// Invalid value.
|
|
IKEEXT_MM_SA_STATE_MAX
|
|
} IKEEXT_MM_SA_STATE;
|
|
|
|
// IKE quick mode states
|
|
typedef [v1_enum] enum IKEEXT_QM_SA_STATE_
|
|
{
|
|
// Initial state. No QM packets have been sent to the peer yet.
|
|
IKEEXT_QM_SA_STATE_NONE,
|
|
// State corresponding to the first QM roundtrip
|
|
IKEEXT_QM_SA_STATE_INITIAL,
|
|
// State corresponding to the final QM roundtrip
|
|
IKEEXT_QM_SA_STATE_FINAL,
|
|
// QM has been completed.
|
|
IKEEXT_QM_SA_STATE_COMPLETE,
|
|
// Invalid value.
|
|
IKEEXT_QM_SA_STATE_MAX
|
|
} IKEEXT_QM_SA_STATE;
|
|
|
|
// IKE extended mode states
|
|
typedef [v1_enum] enum IKEEXT_EM_SA_STATE_
|
|
{
|
|
// Initial state. No EM packets have been sent to the peer yet.
|
|
IKEEXT_EM_SA_STATE_NONE,
|
|
// State corresponding to the first EM roundtrip
|
|
IKEEXT_EM_SA_STATE_SENT_ATTS,
|
|
// State corresponding to the second EM roundtrip
|
|
IKEEXT_EM_SA_STATE_SSPI_SENT,
|
|
// State corresponding to the final EM roundtrip
|
|
IKEEXT_EM_SA_STATE_AUTH_COMPLETE,
|
|
// State corresponding to the final EM roundtrip
|
|
IKEEXT_EM_SA_STATE_FINAL,
|
|
// EM has been completed
|
|
IKEEXT_EM_SA_STATE_COMPLETE,
|
|
// Invalid value.
|
|
IKEEXT_EM_SA_STATE_MAX
|
|
} IKEEXT_EM_SA_STATE;
|
|
|
|
// IKE main mode or quick mode SA role
|
|
typedef [v1_enum] enum IKEEXT_SA_ROLE_
|
|
{
|
|
// SA is initiator
|
|
IKEEXT_SA_ROLE_INITIATOR,
|
|
// SA is responder
|
|
IKEEXT_SA_ROLE_RESPONDER,
|
|
// Invalid value.
|
|
IKEEXT_SA_ROLE_MAX
|
|
} IKEEXT_SA_ROLE;
|
|
|
|
cpp_quote("#if _MSC_VER >= 800")
|
|
cpp_quote("#if _MSC_VER >= 1200")
|
|
cpp_quote("#pragma warning(pop)")
|
|
cpp_quote("#else")
|
|
cpp_quote("#pragma warning(default:4201)")
|
|
cpp_quote("#endif")
|
|
cpp_quote("#endif")
|
|
|