|
|
/*++
Copyright (c) 1997-2001 Microsoft Corporation
Module Name:
ipsec.h
Abstract:
Generic include file used by components to access the IPSEC driver. Contains the SAAPI IOCTLs and the structures relevant to them.
Author:
Sanjay Anand (SanjayAn) 2-January-1997
Environment:
Kernel mode
Revision History:
--*/ #ifndef _IPSEC_H #define _IPSEC_H
#include <windef.h> #include <winipsec.h>
// // NOTE: all addresses are expected in Network byte order // typedef unsigned long IPAddr; typedef unsigned long IPMask;
// // This should go into a global header //
#define DD_IPSEC_DEVICE_NAME L"\\Device\\IPSEC" #define DD_IPSEC_SYM_NAME L"\\DosDevices\\IPSECDev" #define DD_IPSEC_DOS_NAME L"\\\\.\\IPSECDev"
// // This is the name of the event that will be signaled after any policy changes have been applied. // #define IPSEC_POLICY_CHANGE_NOTIFY L"IPSEC_POLICY_CHANGE_NOTIFY"
// // // IOCTL code definitions and related structures // // All the IOCTLs are synchronous and need administrator privilege // // // #define FSCTL_IPSEC_BASE FILE_DEVICE_NETWORK
#define _IPSEC_CTL_CODE(function, method, access) \ CTL_CODE(FSCTL_IPSEC_BASE, function, method, access)
// // Security Association/Policy APIs implemented as Ioctls // #define IOCTL_IPSEC_ADD_FILTER \ _IPSEC_CTL_CODE(0, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_DELETE_FILTER \ _IPSEC_CTL_CODE(1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_POST_FOR_ACQUIRE_SA \ _IPSEC_CTL_CODE(2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_GET_SPI \ _IPSEC_CTL_CODE(3, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_UPDATE_SA \ _IPSEC_CTL_CODE(4, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_ADD_SA \ _IPSEC_CTL_CODE(5, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_DELETE_SA \ _IPSEC_CTL_CODE(6, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_EXPIRE_SA \ _IPSEC_CTL_CODE(7, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_ENUM_SAS \ _IPSEC_CTL_CODE(8, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_IPSEC_ENUM_FILTERS \ _IPSEC_CTL_CODE(9, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_QUERY_EXPORT \ _IPSEC_CTL_CODE(10, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IPSEC_QUERY_STATS \ _IPSEC_CTL_CODE(11, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IPSEC_QUERY_SPI \ _IPSEC_CTL_CODE(12, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_IPSEC_SET_OPERATION_MODE \ _IPSEC_CTL_CODE(13, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_SET_TCPIP_STATUS \ _IPSEC_CTL_CODE(14, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_REGISTER_PROTOCOL \ _IPSEC_CTL_CODE(15, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_GET_OPERATION_MODE \ _IPSEC_CTL_CODE(16, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_IPSEC_SET_DIAGNOSTIC_MODE \ _IPSEC_CTL_CODE(17, METHOD_BUFFERED, FILE_WRITE_ACCESS)
// // Structures to go with the ioctls above // #define FILTER_FLAGS_PASS_THRU 0x0001 #define FILTER_FLAGS_DROP 0x0002 #define FILTER_FLAGS_INBOUND 0x0004 #define FILTER_FLAGS_OUTBOUND 0x0008 #define FILTER_FLAGS_MANUAL 0x0010
// Flags for DestType in acquire #define IPSEC_BCAST 0x1 #define IPSEC_MCAST 0x2
// // Special constants for ExType member of _IPSEC_FILTER //
#define EXT_NORMAL 0x00 #define EXT_DNS_SERVER 0X01 #define EXT_WINS_SERVER 0X02 #define EXT_DHCP_SERVER 0X03 #define EXT_DEFAULT_GATEWAY 0X04
// The following flag is OR-ed with the above to specify that the // destination address is the special address. If not OR-ed, it this // means the source address is the special address.
#define EXT_DEST 0x80
// // for IOCTL_IPSEC_ADD_FILTER // typedef struct _IPSEC_FILTER { IPAddr SrcAddr; IPMask SrcMask; IPAddr DestAddr; IPMask DestMask; IPAddr TunnelAddr; DWORD Protocol; WORD SrcPort; WORD DestPort; BOOLEAN TunnelFilter; UCHAR ExType; WORD Flags; } IPSEC_FILTER, *PIPSEC_FILTER;
typedef struct _IPSEC_FILTER_INFO { GUID FilterId; // unique identifier to identify a filter GUID PolicyId; // unique identifier to identify a policy entry ULONG Index; // hint on where this entry fits in the ordered list of filters IPSEC_FILTER AssociatedFilter; } IPSEC_FILTER_INFO, *PIPSEC_FILTER_INFO;
typedef struct _IPSEC_ADD_FILTER { DWORD NumEntries; IPSEC_FILTER_INFO pInfo[1]; } IPSEC_ADD_FILTER, *PIPSEC_ADD_FILTER;
// // for IOCTL_IPSEC_DELETE_FILTER // typedef IPSEC_ADD_FILTER IPSEC_DELETE_FILTER, *PIPSEC_DELETE_FILTER;
// // for IOCTL_IPSEC_ENUM_FILTERS // typedef struct _IPSEC_ENUM_FILTERS { DWORD NumEntries; // num entries for which there is space DWORD NumEntriesPresent; // num entries actually present in the driver IPSEC_FILTER_INFO pInfo[1]; } IPSEC_ENUM_FILTERS, *PIPSEC_ENUM_FILTERS;
// // for IOCTL_IPSEC_QUERY_STATS // typedef IPSEC_STATISTICS IPSEC_QUERY_STATS, *PIPSEC_QUERY_STATS;
// // for IOCTL_IPSEC_SET_OPERATION_MODE // & IOCTL_IPSEC_GET_OPERATION_MODE // typedef enum _OPERATION_MODE { IPSEC_BYPASS_MODE = 0, IPSEC_BLOCK_MODE, IPSEC_SECURE_MODE, IPSEC_BOOTTIME_STATEFUL_MODE, IPSEC_OPERATION_MODE_MAX } OPERATION_MODE;
//defines the forwarding behavior to apply in //boot and boottime stateful mode typedef enum _IPSEC_FORWARDING_BEHAVIOR{ IPSEC_FORWARD_BYPASS =0, IPSEC_FORWARD_BLOCK, IPSEC_FORWARD_MAX } IPSEC_FORWARDING_BEHAVIOR;
// Following defines and structs // for boot time security #define EXEMPT_DIRECTION_INBOUND 0x1 #define EXEMPT_DIRECTION_OUTBOUND 0x2 #define EXEMPT_TYPE_PDP 0x1
typedef struct _IPSEC_EXEMPT_ENTRY { ULONG Type; ULONG Size; BYTE Protocol; BYTE Direction; USHORT SrcPort; USHORT DestPort; USHORT Reserved; } IPSEC_EXEMPT_ENTRY, *PIPSEC_EXEMPT_ENTRY;
typedef struct _IPSEC_SET_OPERATION_MODE { OPERATION_MODE OperationMode; } IPSEC_SET_OPERATION_MODE, *PIPSEC_SET_OPERATION_MODE;
typedef struct _IPSEC_GET_OPERATION_MODE { OPERATION_MODE OperationMode; } IPSEC_GET_OPERATION_MODE, * PIPSEC_GET_OPERATION_MODE;
// For IOCTL_IPSEC_SET_DIAGNOSTIC_MODE #define IPSEC_DIAGNOSTIC_DISABLE_LOG 0x00000000 #define IPSEC_DIAGNOSTIC_ENABLE_LOG 0x00000001 #define IPSEC_DIAGNOSTIC_INBOUND 0x00000002 #define IPSEC_DIAGNOSTIC_OUTBOUND 0x00000004 #define IPSEC_DIAGNOSTIC_MAX 0x00000007
typedef struct _IPSEC_SET_DIAGNOSTIC_MODE{ DWORD Mode; DWORD LogInterval; } IPSEC_SET_DIAGNOSTIC_MODE, * PIPSEC_SET_DIAGNOSTIC_MODE;
// For IOCTL_IPSEC_REGISTER_PROTOCOL. //
typedef enum _REGISTER_IPSEC_PROTOCOL { IPSEC_REGISTER_PROTOCOLS = 0, IPSEC_DEREGISTER_PROTOCOLS, REGISTER_IPSEC_PROTOCOL_MAX } REGISTER_IPSEC_PROTOCOL, * PREGISTER_IPSEC_PROTOCOL;
typedef struct _IPSEC_REGISTER_PROTOCOL { REGISTER_IPSEC_PROTOCOL RegisterProtocol; } IPSEC_REGISTER_PROTOCOL, * PIPSEC_REGISTER_PROTOCOL;
// // for IOCTL_IPSEC_SET_TCPIP_STATUS // typedef struct _IPSEC_SET_TCPIP_STATUS { BOOLEAN TcpipStatus; PVOID TcpipFreeBuff; PVOID TcpipAllocBuff; PVOID TcpipGetInfo; PVOID TcpipNdisRequest; PVOID TcpipSetIPSecStatus; PVOID TcpipSetIPSecPtr; PVOID TcpipUnSetIPSecPtr; PVOID TcpipUnSetIPSecSendPtr; PVOID TcpipTCPXsum; PVOID TcpipSendICMPErr; } IPSEC_SET_TCPIP_STATUS, *PIPSEC_SET_TCPIP_STATUS;
// // The base Security Association structure for IOCTL_IPSEC_*_SA // typedef ULONG SPI_TYPE;
typedef enum _Operation { None = 0, Auth, // AH Encrypt, // ESP Compress } OPERATION_E;
// // IPSEC DOI ESP algorithms // typedef enum _ESP_ALGO { IPSEC_ESP_NONE = 0, IPSEC_ESP_DES, IPSEC_ESP_DES_40, IPSEC_ESP_3_DES, IPSEC_ESP_MAX } ESP_ALGO;
// // IPSEC DOI AH algorithms // typedef enum _AH_ALGO { IPSEC_AH_NONE = 0, IPSEC_AH_MD5, IPSEC_AH_SHA, IPSEC_AH_MAX } AH_ALGO;
// // Lifetime structure - 0 => not significant // typedef struct _LIFETIME { ULONG KeyExpirationTime; // lifetime of key - in seconds ULONG KeyExpirationBytes; // max # of KBytes xformed till re-key } LIFETIME, *PLIFETIME;
// // describes generic algorithm properties // typedef struct _ALGO_INFO { ULONG algoIdentifier; // ESP_ALGO or AH_ALGO ULONG algoKeylen; // len in bytes ULONG algoRounds; // # of algo rounds } ALGO_INFO, *PALGO_INFO;
// // Security Association //
// // Flags - not mutually exclusive // typedef ULONG SA_FLAGS;
#define IPSEC_SA_INTERNAL_IOCTL_DELETE 0x10000000
#define MAX_SAS 3 // COMP, ESP, AH #define MAX_OPS MAX_SAS
typedef struct _SECURITY_ASSOCIATION { OPERATION_E Operation; // ordered set of operations SPI_TYPE SPI; // SPI in order of operations in OperationArray ALGO_INFO IntegrityAlgo; // AH ALGO_INFO ConfAlgo; // ESP PVOID CompAlgo; // compression algo info } SECURITY_ASSOCIATION, *PSECURITY_ASSOCIATION;
typedef struct _SA_STRUCT { HANDLE Context; // context of the original ACQUIRE request ULONG NumSAs; // number of SAs following SA_FLAGS Flags; IPAddr TunnelAddr; // Tunnel end IP Addr IPAddr SrcTunnelAddr; // Tunnel src IP Addr LIFETIME Lifetime; IPSEC_FILTER InstantiatedFilter; // the actual addresses for which this SA was setup SECURITY_ASSOCIATION SecAssoc[MAX_SAS]; DWORD dwQMPFSGroup; IKE_COOKIE_PAIR CookiePair; IPSEC_SA_UDP_ENCAP_TYPE EncapType; WORD SrcEncapPort; //Src, Dst encapsulation ports for NAT WORD DestEncapPort; IPAddr PeerPrivateAddr; ULONG KeyLen; // key len in # of chars UCHAR KeyMat[1]; } SA_STRUCT, *PSA_STRUCT;
typedef struct _IPSEC_ADD_UPDATE_SA { SA_STRUCT SAInfo; } IPSEC_ADD_UPDATE_SA, *PIPSEC_ADD_UPDATE_SA;
// // Outbound SAs are typically deleted // typedef struct _IPSEC_DELETE_SA { IPSEC_QM_SA SATemplate; // template used for SA match } IPSEC_DELETE_SA, *PIPSEC_DELETE_SA;
// // Inbound SAs are typically expired // typedef struct _IPSEC_DELETE_INFO { IPAddr DestAddr; IPAddr SrcAddr; SPI_TYPE SPI; } IPSEC_DELETE_INFO, *PIPSEC_DELETE_INFO;
typedef struct _IPSEC_EXPIRE_SA { IPSEC_DELETE_INFO DelInfo; } IPSEC_EXPIRE_SA, *PIPSEC_EXPIRE_SA;
typedef struct _IPSEC_GET_SPI { HANDLE Context; // context to represent this SA negotiation IPSEC_FILTER InstantiatedFilter; // the actual addresses for which this SA was setup SPI_TYPE SPI; // filled out on return } IPSEC_GET_SPI, *PIPSEC_GET_SPI;
typedef IPSEC_GET_SPI IPSEC_SET_SPI, *PIPSEC_SET_SPI;
typedef struct _IPSEC_SA_ALGO_INFO { ALGO_INFO IntegrityAlgo; ALGO_INFO ConfAlgo; ALGO_INFO CompAlgo; } IPSEC_SA_ALGO_INFO, *PIPSEC_SA_ALGO_INFO;
typedef ULONG SA_ENUM_FLAGS;
#define SA_ENUM_FLAGS_INITIATOR 0x00000001 #define SA_ENUM_FLAGS_MTU_BUMPED 0x00000002 #define SA_ENUM_FLAGS_OFFLOADED 0x00000004 #define SA_ENUM_FLAGS_OFFLOAD_FAILED 0x00000008 #define SA_ENUM_FLAGS_OFFLOADABLE 0x00000010 #define SA_ENUM_FLAGS_IN_REKEY 0x00000020
typedef struct _IPSEC_SA_STATS { ULARGE_INTEGER ConfidentialBytesSent; ULARGE_INTEGER ConfidentialBytesReceived; ULARGE_INTEGER AuthenticatedBytesSent; ULARGE_INTEGER AuthenticatedBytesReceived; ULARGE_INTEGER TotalBytesSent; ULARGE_INTEGER TotalBytesReceived; ULARGE_INTEGER OffloadedBytesSent; ULARGE_INTEGER OffloadedBytesReceived; } IPSEC_SA_STATS, *PIPSEC_SA_STATS;
typedef struct _IPSEC_SA_INFO { GUID PolicyId; // unique identifier to identify a policy entry GUID FilterId; LIFETIME Lifetime; IPAddr InboundTunnelAddr; ULONG NumOps; SPI_TYPE InboundSPI[MAX_OPS]; SPI_TYPE OutboundSPI[MAX_OPS]; OPERATION_E Operation[MAX_OPS]; IPSEC_SA_ALGO_INFO AlgoInfo[MAX_OPS]; IPSEC_FILTER AssociatedFilter; DWORD dwQMPFSGroup; IKE_COOKIE_PAIR CookiePair; SA_ENUM_FLAGS EnumFlags; IPSEC_SA_STATS Stats; UDP_ENCAP_INFO EncapInfo; } IPSEC_SA_INFO, *PIPSEC_SA_INFO;
typedef struct _SECURITY_ASSOCIATION_OUT { DWORD Operation; // ordered set of operations SPI_TYPE SPI; // SPI in order of operations in OperationArray ALGO_INFO IntegrityAlgo; // AH ALGO_INFO ConfAlgo; // ESP ALGO_INFO CompAlgo; // compression algo info } SECURITY_ASSOCIATION_OUT, *PSECURITY_ASSOCIATION_OUT;
typedef struct _IPSEC_SA_QUERY_INFO { GUID PolicyId; // unique identifier to identify a policy entry LIFETIME Lifetime; ULONG NumSAs; SECURITY_ASSOCIATION_OUT SecAssoc[MAX_SAS]; IPSEC_FILTER AssociatedFilter; DWORD Flags; IKE_COOKIE_PAIR AssociatedMainMode; } IPSEC_SA_QUERY_INFO, *PIPSEC_SA_QUERY_INFO;
typedef struct _IPSEC_ENUM_SAS { DWORD NumEntries; // num entries for which there is space DWORD NumEntriesPresent; // num entries actually present in the driver DWORD Index; // num entries to skip IPSEC_QM_SA SATemplate; // template used for SA match IPSEC_SA_INFO pInfo[1]; } IPSEC_ENUM_SAS, *PIPSEC_ENUM_SAS;
typedef struct _IPSEC_POST_FOR_ACQUIRE_SA { HANDLE IdentityInfo; // identity of Principal HANDLE Context; // context to represent this SA negotiation GUID PolicyId; // GUID for QM policy IPAddr SrcAddr; IPMask SrcMask; IPAddr DestAddr; IPMask DestMask; IPAddr TunnelAddr; IPAddr InboundTunnelAddr; DWORD Protocol; IKE_COOKIE_PAIR CookiePair; // only used for notify WORD SrcPort; WORD DestPort; BOOLEAN TunnelFilter; // TRUE => this is a tunnel filter UCHAR DestType; WORD SrcEncapPort; WORD DestEncapPort; BYTE Pad1[4]; UCHAR Pad2[2]; } IPSEC_POST_FOR_ACQUIRE_SA, *PIPSEC_POST_FOR_ACQUIRE_SA;
//NB. This must be <= size as the IPSEC_POST_FOR_ACQUIRE_SA typedef struct _IPSEC_POST_EXPIRE_NOTIFY { HANDLE IdentityInfo; // identity of Principal HANDLE Context; // context to represent this SA negotiation SPI_TYPE InboundSpi; SPI_TYPE OutboundSpi; DWORD Flags; IPAddr SrcAddr; IPMask SrcMask; IPAddr DestAddr; IPMask DestMask; IPAddr TunnelAddr; IPAddr InboundTunnelAddr; DWORD Protocol; IKE_COOKIE_PAIR CookiePair; WORD SrcPort; WORD DestPort; BOOLEAN TunnelFilter; // TRUE => this is a tunnel filter WORD SrcEncapPort; WORD DestEncapPort; IPAddr PeerPrivateAddr; UCHAR Pad[3]; } IPSEC_POST_EXPIRE_NOTIFY, *PIPSEC_POST_EXPIRE_NOTIFY;
typedef struct _IPSEC_QUERY_EXPORT { BOOLEAN Export; } IPSEC_QUERY_EXPORT, *PIPSEC_QUERY_EXPORT;
typedef struct _IPSEC_FILTER_SPI { IPSEC_FILTER Filter; SPI_TYPE Spi; DWORD Operation; DWORD Flags; struct _IPSEC_FILTER_SPI *Next; } IPSEC_FILTER_SPI, *PIPSEC_FILTER_SPI;
typedef struct _QOS_FILTER_SPI { IPAddr SrcAddr; IPAddr DestAddr; DWORD Protocol; WORD SrcPort; WORD DestPort; DWORD Operation; DWORD Flags; SPI_TYPE Spi; } QOS_FILTER_SPI, *PQOS_FILTER_SPI;
typedef struct _IPSEC_QUERY_SPI { IPSEC_FILTER Filter; SPI_TYPE Spi; // inbound spi SPI_TYPE OtherSpi; // outbound spi DWORD Operation; } IPSEC_QUERY_SPI, *PIPSEC_QUERY_SPI;
#define IPSEC_NOTIFY_EXPIRE_CONTEXT 0x00000000 #define IPSEC_RPC_CONTEXT 0x00000001
#endif _IPSEC_H
|