481 lines
14 KiB
C
481 lines
14 KiB
C
/*++
|
|
|
|
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)
|
|
|
|
|
|
//
|
|
// 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
|
|
|
|
//
|
|
// 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 Pad[1];
|
|
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
|
|
//
|
|
typedef enum _OPERATION_MODE {
|
|
IPSEC_BYPASS_MODE = 0,
|
|
IPSEC_BLOCK_MODE,
|
|
IPSEC_SECURE_MODE,
|
|
IPSEC_OPERATION_MODE_MAX
|
|
} OPERATION_MODE;
|
|
|
|
|
|
typedef struct _IPSEC_SET_OPERATION_MODE {
|
|
OPERATION_MODE OperationMode;
|
|
} IPSEC_SET_OPERATION_MODE, *PIPSEC_SET_OPERATION_MODE;
|
|
|
|
|
|
//
|
|
// For IOCTL_IPSEC_REGISTER_PROTOCOL.
|
|
//
|
|
|
|
typedef enum _REGISTER_PROTOCOL {
|
|
IPSEC_REGISTER_PROTOCOLS = 0,
|
|
IPSEC_DEREGISTER_PROTOCOLS,
|
|
REGISTER_PROTOCOL_MAX
|
|
} REGISTER_PROTOCOL, * PREGISTER_PROTOCOL;
|
|
|
|
|
|
typedef struct _IPSEC_REGISTER_PROTOCOL {
|
|
REGISTER_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;
|
|
} 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 0x00000008
|
|
|
|
#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
|
|
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;
|
|
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;
|
|
} 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;
|
|
UCHAR Pad[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
|
|
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
|
|
|