LCOV - code coverage report
Current view: top level - netinet - ip_ipsp.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 9 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 3 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: ip_ipsp.h,v 1.193 2018/08/28 15:15:02 mpi Exp $       */
       2             : /*
       3             :  * The authors of this code are John Ioannidis (ji@tla.org),
       4             :  * Angelos D. Keromytis (kermit@csd.uch.gr),
       5             :  * Niels Provos (provos@physnet.uni-hamburg.de) and
       6             :  * Niklas Hallqvist (niklas@appli.se).
       7             :  *
       8             :  * The original version of this code was written by John Ioannidis
       9             :  * for BSD/OS in Athens, Greece, in November 1995.
      10             :  *
      11             :  * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
      12             :  * by Angelos D. Keromytis.
      13             :  *
      14             :  * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
      15             :  * and Niels Provos.
      16             :  *
      17             :  * Additional features in 1999 by Angelos D. Keromytis and Niklas Hallqvist.
      18             :  *
      19             :  * Copyright (c) 1995, 1996, 1997, 1998, 1999 by John Ioannidis,
      20             :  * Angelos D. Keromytis and Niels Provos.
      21             :  * Copyright (c) 1999 Niklas Hallqvist.
      22             :  * Copyright (c) 2001, Angelos D. Keromytis.
      23             :  *
      24             :  * Permission to use, copy, and modify this software with or without fee
      25             :  * is hereby granted, provided that this entire notice is included in
      26             :  * all copies of any software which is or includes a copy or
      27             :  * modification of this software.
      28             :  * You may use this code under the GNU public license if you so wish. Please
      29             :  * contribute changes back to the authors under this freer than GPL license
      30             :  * so that we may further the use of strong encryption without limitations to
      31             :  * all.
      32             :  *
      33             :  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
      34             :  * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
      35             :  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
      36             :  * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
      37             :  * PURPOSE.
      38             :  */
      39             : 
      40             : #ifndef _NETINET_IPSP_H_
      41             : #define _NETINET_IPSP_H_
      42             : 
      43             : /* IPSP global definitions. */
      44             : 
      45             : #include <sys/types.h>
      46             : #include <netinet/in.h>
      47             : 
      48             : union sockaddr_union {
      49             :         struct sockaddr         sa;
      50             :         struct sockaddr_in      sin;
      51             :         struct sockaddr_in6     sin6;
      52             : };
      53             : 
      54             : #define AH_HMAC_MAX_HASHLEN     32      /* 256 bits of authenticator for SHA512 */
      55             : #define AH_HMAC_RPLENGTH        4       /* 32 bits of replay counter */
      56             : #define AH_HMAC_INITIAL_RPL     1       /* Replay counter initial value */
      57             : 
      58             : /* Authenticator lengths */
      59             : #define AH_MD5_ALEN             16
      60             : #define AH_SHA1_ALEN            20
      61             : #define AH_RMD160_ALEN          20
      62             : #define AH_SHA2_256_ALEN        32
      63             : #define AH_SHA2_384_ALEN        48
      64             : #define AH_SHA2_512_ALEN        64
      65             : #define AH_ALEN_MAX             64      /* Keep updated */
      66             : 
      67             : /* Reserved SPI numbers */
      68             : #define SPI_LOCAL_USE           0
      69             : #define SPI_RESERVED_MIN        1
      70             : #define SPI_RESERVED_MAX        255
      71             : 
      72             : /* Reserved CPI numbers */
      73             : #define CPI_RESERVED_MIN        1
      74             : #define CPI_RESERVED_MAX        255
      75             : #define CPI_PRIVATE_MIN         61440
      76             : #define CPI_PRIVATE_MAX         65535
      77             : 
      78             : /* sysctl default values */
      79             : #define IPSEC_DEFAULT_EMBRYONIC_SA_TIMEOUT      60      /* 1 minute */
      80             : #define IPSEC_DEFAULT_PFS                       1
      81             : #define IPSEC_DEFAULT_SOFT_ALLOCATIONS          0
      82             : #define IPSEC_DEFAULT_EXP_ALLOCATIONS           0
      83             : #define IPSEC_DEFAULT_SOFT_BYTES                0
      84             : #define IPSEC_DEFAULT_EXP_BYTES                 0
      85             : #define IPSEC_DEFAULT_SOFT_TIMEOUT              80000
      86             : #define IPSEC_DEFAULT_EXP_TIMEOUT               86400
      87             : #define IPSEC_DEFAULT_SOFT_FIRST_USE            3600
      88             : #define IPSEC_DEFAULT_EXP_FIRST_USE             7200
      89             : #define IPSEC_DEFAULT_DEF_ENC                   "aes"
      90             : #define IPSEC_DEFAULT_DEF_AUTH                  "hmac-sha1"
      91             : #define IPSEC_DEFAULT_EXPIRE_ACQUIRE            30
      92             : #define IPSEC_DEFAULT_DEF_COMP                  "deflate"
      93             : 
      94             : struct sockaddr_encap {
      95             :         u_int8_t        sen_len;                /* length */
      96             :         u_int8_t        sen_family;             /* PF_KEY */
      97             :         u_int16_t       sen_type;               /* see SENT_* */
      98             :         union {
      99             :                 struct {                                /* SENT_IP4 */
     100             :                         u_int8_t        Direction;
     101             :                         struct in_addr  Src;
     102             :                         struct in_addr  Dst;
     103             :                         u_int8_t        Proto;
     104             :                         u_int16_t       Sport;
     105             :                         u_int16_t       Dport;
     106             :                 } Sip4;
     107             : 
     108             :                 struct {                                /* SENT_IP6 */
     109             :                         u_int8_t        Direction;
     110             :                         struct in6_addr Src;
     111             :                         struct in6_addr Dst;
     112             :                         u_int8_t        Proto;
     113             :                         u_int16_t       Sport;
     114             :                         u_int16_t       Dport;
     115             :                 } Sip6;
     116             : 
     117             :                 struct ipsec_policy     *PolicyHead;    /* SENT_IPSP */
     118             :         } Sen;
     119             : };
     120             : 
     121             : #define IPSP_DIRECTION_IN       0x1
     122             : #define IPSP_DIRECTION_OUT      0x2
     123             : 
     124             : struct ipsecstat {
     125             :         uint64_t        ipsec_tunnels;          /* Number of active tunnels */
     126             :         uint64_t        ipsec_prevtunnels;      /* Past number of tunnels */
     127             :         uint64_t        ipsec_ipackets;         /* Input IPsec packets */
     128             :         uint64_t        ipsec_opackets;         /* Output IPsec packets */
     129             :         uint64_t        ipsec_ibytes;           /* Input bytes */
     130             :         uint64_t        ipsec_obytes;           /* Output bytes */
     131             :         uint64_t        ipsec_idecompbytes;     /* Input bytes, decompressed */
     132             :         uint64_t        ipsec_ouncompbytes;     /* Output bytes, uncompressed */
     133             :         uint64_t        ipsec_idrops;           /* Dropped on input */
     134             :         uint64_t        ipsec_odrops;           /* Dropped on output */
     135             :         uint64_t        ipsec_crypto;           /* Crypto processing failure */
     136             :         uint64_t        ipsec_notdb;            /* Expired while in crypto */
     137             :         uint64_t        ipsec_noxform;          /* Crypto error */
     138             : };
     139             : 
     140             : struct tdb_data {
     141             :         uint64_t        tdd_ipackets;           /* Input IPsec packets */
     142             :         uint64_t        tdd_opackets;           /* Output IPsec packets */
     143             :         uint64_t        tdd_ibytes;             /* Input bytes */
     144             :         uint64_t        tdd_obytes;             /* Output bytes */
     145             :         uint64_t        tdd_idrops;             /* Dropped on input */
     146             :         uint64_t        tdd_odrops;             /* Dropped on output */
     147             :         uint64_t        tdd_idecompbytes;       /* Input bytes, decompressed */
     148             :         uint64_t        tdd_ouncompbytes;       /* Output bytes, uncompressed */
     149             : };
     150             : 
     151             : #ifdef _KERNEL
     152             : 
     153             : #include <sys/timeout.h>
     154             : #include <sys/tree.h>
     155             : #include <sys/queue.h>
     156             : #include <net/radix.h>
     157             : #include <sys/percpu.h>
     158             : 
     159             : enum ipsec_counters {
     160             :         ipsec_tunnels,
     161             :         ipsec_prevtunnels,
     162             :         ipsec_ipackets,
     163             :         ipsec_opackets,
     164             :         ipsec_ibytes,
     165             :         ipsec_obytes,
     166             :         ipsec_idecompbytes,
     167             :         ipsec_ouncompbytes,
     168             :         ipsec_idrops,
     169             :         ipsec_odrops,
     170             :         ipsec_crypto,
     171             :         ipsec_notdb,
     172             :         ipsec_noxform,
     173             :         ipsec_ncounters
     174             : };
     175             : 
     176             : extern struct cpumem *ipseccounters;
     177             : 
     178             : static inline void
     179           0 : ipsecstat_inc(enum ipsec_counters c)
     180             : {
     181           0 :         counters_inc(ipseccounters, c);
     182           0 : }
     183             : 
     184             : static inline void
     185           0 : ipsecstat_dec(enum ipsec_counters c)
     186             : {
     187           0 :         counters_dec(ipseccounters, c);
     188           0 : }
     189             : 
     190             : static inline void
     191           0 : ipsecstat_add(enum ipsec_counters c, uint64_t v)
     192             : {
     193           0 :         counters_add(ipseccounters, c, v);
     194           0 : }
     195             : 
     196             : struct m_tag;
     197             : 
     198             : #define sen_data                Sen.Data
     199             : #define sen_ip_src              Sen.Sip4.Src
     200             : #define sen_ip_dst              Sen.Sip4.Dst
     201             : #define sen_proto               Sen.Sip4.Proto
     202             : #define sen_sport               Sen.Sip4.Sport
     203             : #define sen_dport               Sen.Sip4.Dport
     204             : #define sen_direction           Sen.Sip4.Direction
     205             : #define sen_ip6_src             Sen.Sip6.Src
     206             : #define sen_ip6_dst             Sen.Sip6.Dst
     207             : #define sen_ip6_proto           Sen.Sip6.Proto
     208             : #define sen_ip6_sport           Sen.Sip6.Sport
     209             : #define sen_ip6_dport           Sen.Sip6.Dport
     210             : #define sen_ip6_direction       Sen.Sip6.Direction
     211             : #define sen_ipsp                Sen.PolicyHead
     212             : 
     213             : /*
     214             :  * The "type" is really part of the address as far as the routing
     215             :  * system is concerned. By using only one bit in the type field
     216             :  * for each type, we sort-of make sure that different types of
     217             :  * encapsulation addresses won't be matched against the wrong type.
     218             :  *
     219             :  */
     220             : 
     221             : #define SENT_IP4        0x0001          /* data is two struct in_addr */
     222             : #define SENT_IPSP       0x0002          /* data as in IP4/6 plus SPI */
     223             : #define SENT_IP6        0x0004
     224             : 
     225             : #define SENT_LEN        sizeof(struct sockaddr_encap)
     226             : 
     227             : struct ipsec_id {
     228             :         u_int16_t       type;           /* Subtype of data */
     229             :         int16_t         len;            /* Length of data following */
     230             : };
     231             : 
     232             : struct ipsec_ids {
     233             :         RBT_ENTRY(ipsec_ids)    id_node_id;
     234             :         RBT_ENTRY(ipsec_ids)    id_node_flow;
     235             :         struct ipsec_id         *id_local;
     236             :         struct ipsec_id         *id_remote;
     237             :         u_int32_t               id_flow;
     238             :         int                     id_refcount;
     239             :         struct timeout          id_timeout;
     240             : };
     241             : RBT_HEAD(ipsec_ids_flows, ipsec_ids);
     242             : RBT_HEAD(ipsec_ids_tree, ipsec_ids);
     243             : 
     244             : struct ipsec_acquire {
     245             :         union sockaddr_union            ipa_addr;
     246             :         u_int32_t                       ipa_seq;
     247             :         struct sockaddr_encap           ipa_info;
     248             :         struct sockaddr_encap           ipa_mask;
     249             :         struct timeout                  ipa_timeout;
     250             :         struct ipsec_policy             *ipa_policy;
     251             :         struct inpcb                    *ipa_pcb;
     252             :         TAILQ_ENTRY(ipsec_acquire)      ipa_ipo_next;
     253             :         TAILQ_ENTRY(ipsec_acquire)      ipa_next;
     254             : };
     255             : 
     256             : struct ipsec_policy {
     257             :         struct radix_node       ipo_nodes[2];   /* radix tree glue */
     258             :         struct sockaddr_encap   ipo_addr;
     259             :         struct sockaddr_encap   ipo_mask;
     260             : 
     261             :         union sockaddr_union    ipo_src;        /* Local address to use */
     262             :         union sockaddr_union    ipo_dst;        /* Remote gateway -- if it's zeroed:
     263             :                                                  * - on output, we try to
     264             :                                                  * contact the remote host
     265             :                                                  * directly (if needed).  
     266             :                                                  * - on input, we accept on if
     267             :                                                  * the inner source is the
     268             :                                                  * same as the outer source
     269             :                                                  * address, or if transport
     270             :                                                  * mode was used.
     271             :                                                  */
     272             : 
     273             :         u_int64_t               ipo_last_searched;      /* Timestamp of last lookup */
     274             : 
     275             :         u_int8_t                ipo_flags;      /* See IPSP_POLICY_* definitions */
     276             :         u_int8_t                ipo_type;       /* USE/ACQUIRE/... */
     277             :         u_int8_t                ipo_sproto;     /* ESP/AH; if zero, use system dflts */
     278             :         u_int                   ipo_rdomain;
     279             : 
     280             :         int                     ipo_ref_count;
     281             : 
     282             :         struct tdb              *ipo_tdb;               /* Cached entry */
     283             : 
     284             :         struct ipsec_ids        *ipo_ids;
     285             : 
     286             :         TAILQ_HEAD(ipo_acquires_head, ipsec_acquire) ipo_acquires; /* List of acquires */
     287             :         TAILQ_ENTRY(ipsec_policy)       ipo_tdb_next;   /* List TDB policies */
     288             :         TAILQ_ENTRY(ipsec_policy)       ipo_list;       /* List of all policies */
     289             : };
     290             : 
     291             : #define IPSP_POLICY_NONE        0x0000  /* No flags set */
     292             : #define IPSP_POLICY_STATIC      0x0002  /* Static policy */
     293             : 
     294             : #define IPSP_IPSEC_USE          0       /* Use if existing, don't acquire */
     295             : #define IPSP_IPSEC_ACQUIRE      1       /* Try acquire, let packet through */
     296             : #define IPSP_IPSEC_REQUIRE      2       /* Require SA */
     297             : #define IPSP_PERMIT             3       /* Permit traffic through */
     298             : #define IPSP_DENY               4       /* Deny traffic */
     299             : #define IPSP_IPSEC_DONTACQ      5       /* Require, but don't acquire */
     300             : 
     301             : /* Identity types */
     302             : #define IPSP_IDENTITY_NONE              0
     303             : #define IPSP_IDENTITY_PREFIX            1
     304             : #define IPSP_IDENTITY_FQDN              2
     305             : #define IPSP_IDENTITY_USERFQDN          3
     306             : 
     307             : struct tdb {                            /* tunnel descriptor block */
     308             :         /*
     309             :          * Each TDB is on three hash tables: one keyed on dst/spi/sproto,
     310             :          * one keyed on dst/sproto, and one keyed on src/sproto. The first
     311             :          * is used for finding a specific TDB, the second for finding TDBs
     312             :          * for outgoing policy matching, and the third for incoming
     313             :          * policy matching. The following three fields maintain the hash
     314             :          * queues in those three tables.
     315             :          */
     316             :         struct tdb      *tdb_hnext;     /* dst/spi/sproto table */
     317             :         struct tdb      *tdb_dnext;     /* dst/sproto table */
     318             :         struct tdb      *tdb_snext;     /* src/sproto table */
     319             :         struct tdb      *tdb_inext;
     320             :         struct tdb      *tdb_onext;
     321             : 
     322             :         struct xformsw          *tdb_xform;             /* Transform to use */
     323             :         struct enc_xform        *tdb_encalgxform;       /* Enc algorithm */
     324             :         struct auth_hash        *tdb_authalgxform;      /* Auth algorithm */
     325             :         struct comp_algo        *tdb_compalgxform;      /* Compression algo */
     326             : 
     327             : #define TDBF_UNIQUE             0x00001 /* This should not be used by others */
     328             : #define TDBF_TIMER              0x00002 /* Absolute expiration timer in use */
     329             : #define TDBF_BYTES              0x00004 /* Check the byte counters */
     330             : #define TDBF_ALLOCATIONS        0x00008 /* Check the flows counters */
     331             : #define TDBF_INVALID            0x00010 /* This SPI is not valid yet/anymore */
     332             : #define TDBF_FIRSTUSE           0x00020 /* Expire after first use */
     333             : #define TDBF_SOFT_TIMER         0x00080 /* Soft expiration */
     334             : #define TDBF_SOFT_BYTES         0x00100 /* Soft expiration */
     335             : #define TDBF_SOFT_ALLOCATIONS   0x00200 /* Soft expiration */
     336             : #define TDBF_SOFT_FIRSTUSE      0x00400 /* Soft expiration */
     337             : #define TDBF_PFS                0x00800 /* Ask for PFS from Key Mgmt. */
     338             : #define TDBF_TUNNELING          0x01000 /* Force IP-IP encapsulation */
     339             : #define TDBF_USEDTUNNEL         0x10000 /* Appended a tunnel header in past */
     340             : #define TDBF_UDPENCAP           0x20000 /* UDP encapsulation */
     341             : #define TDBF_PFSYNC             0x40000 /* TDB will be synced */
     342             : #define TDBF_PFSYNC_RPL         0x80000 /* Replay counter should be bumped */
     343             : #define TDBF_ESN                0x100000 /* 64-bit sequence numbers (ESN) */
     344             : 
     345             :         u_int32_t       tdb_flags;      /* Flags related to this TDB */
     346             : 
     347             :         struct timeout  tdb_timer_tmo;
     348             :         struct timeout  tdb_first_tmo;
     349             :         struct timeout  tdb_stimer_tmo;
     350             :         struct timeout  tdb_sfirst_tmo;
     351             : 
     352             :         u_int32_t       tdb_seq;                /* Tracking number for PFKEY */
     353             :         u_int32_t       tdb_exp_allocations;    /* Expire after so many flows */
     354             :         u_int32_t       tdb_soft_allocations;   /* Expiration warning */
     355             :         u_int32_t       tdb_cur_allocations;    /* Total number of allocs */
     356             : 
     357             :         u_int64_t       tdb_exp_bytes;  /* Expire after so many bytes passed */
     358             :         u_int64_t       tdb_soft_bytes; /* Expiration warning */
     359             :         u_int64_t       tdb_cur_bytes;  /* Current count of bytes */
     360             : 
     361             :         u_int64_t       tdb_exp_timeout;        /* When does the SPI expire */
     362             :         u_int64_t       tdb_soft_timeout;       /* Send soft-expire warning */
     363             :         u_int64_t       tdb_established;        /* When was SPI established */
     364             : 
     365             :         u_int64_t       tdb_first_use;          /* When was it first used */
     366             :         u_int64_t       tdb_soft_first_use;     /* Soft warning */
     367             :         u_int64_t       tdb_exp_first_use;      /* Expire if tdb_first_use +
     368             :                                                  * tdb_exp_first_use <= curtime
     369             :                                                  */
     370             : 
     371             :         u_int64_t       tdb_last_used;  /* When was this SA last used */
     372             :         u_int64_t       tdb_last_marked;/* Last SKIPCRYPTO status change */
     373             : 
     374             :         struct tdb_data tdb_data;       /* stats about this TDB */
     375             :         u_int64_t       tdb_cryptoid;   /* Crypto session ID */
     376             : 
     377             :         u_int32_t       tdb_spi;        /* SPI */
     378             :         u_int16_t       tdb_amxkeylen;  /* Raw authentication key length */
     379             :         u_int16_t       tdb_emxkeylen;  /* Raw encryption key length */
     380             :         u_int16_t       tdb_ivlen;      /* IV length */
     381             :         u_int8_t        tdb_sproto;     /* IPsec protocol */
     382             :         u_int8_t        tdb_wnd;        /* Replay window */
     383             :         u_int8_t        tdb_satype;     /* SA type (RFC2367, PF_KEY) */
     384             :         u_int8_t        tdb_updates;    /* pfsync update counter */
     385             : 
     386             :         union sockaddr_union    tdb_dst;        /* Destination address */
     387             :         union sockaddr_union    tdb_src;        /* Source address */
     388             : 
     389             :         u_int8_t        *tdb_amxkey;    /* Raw authentication key */
     390             :         u_int8_t        *tdb_emxkey;    /* Raw encryption key */
     391             : 
     392             : #define TDB_REPLAYWASTE 32
     393             : #define TDB_REPLAYMAX   (2100+TDB_REPLAYWASTE)
     394             : 
     395             :         u_int64_t       tdb_rpl;        /* Replay counter */
     396             :         u_int32_t       tdb_seen[howmany(TDB_REPLAYMAX, 32)]; /* Anti-replay window */
     397             : 
     398             :         u_int8_t        tdb_iv[4];      /* Used for HALF-IV ESP */
     399             : 
     400             :         struct ipsec_ids        *tdb_ids;       /* Src/Dst ID for this SA */
     401             :         int             tdb_ids_swapped;        /* XXX */
     402             : 
     403             :         u_int32_t       tdb_mtu;        /* MTU at this point in the chain */
     404             :         u_int64_t       tdb_mtutimeout; /* When to ignore this entry */
     405             : 
     406             :         u_int16_t       tdb_udpencap_port;      /* Peer UDP port */
     407             : 
     408             :         u_int16_t       tdb_tag;                /* Packet filter tag */
     409             :         u_int32_t       tdb_tap;                /* Alternate enc(4) interface */
     410             : 
     411             :         u_int           tdb_rdomain;            /* Routing domain */
     412             : 
     413             :         struct sockaddr_encap   tdb_filter; /* What traffic is acceptable */
     414             :         struct sockaddr_encap   tdb_filtermask; /* And the mask */
     415             : 
     416             :         TAILQ_HEAD(tdb_policy_head, ipsec_policy)       tdb_policy_head;
     417             :         TAILQ_ENTRY(tdb)        tdb_sync_entry;
     418             : };
     419             : #define tdb_ipackets            tdb_data.tdd_ipackets
     420             : #define tdb_opackets            tdb_data.tdd_opackets
     421             : #define tdb_ibytes              tdb_data.tdd_ibytes
     422             : #define tdb_obytes              tdb_data.tdd_obytes
     423             : #define tdb_idrops              tdb_data.tdd_idrops
     424             : #define tdb_odrops              tdb_data.tdd_odrops
     425             : #define tdb_idecompbytes        tdb_data.tdd_idecompbytes
     426             : #define tdb_ouncompbytes        tdb_data.tdd_ouncompbytes
     427             : 
     428             : 
     429             : struct tdb_ident {
     430             :         u_int32_t spi;
     431             :         union sockaddr_union dst;
     432             :         u_int8_t proto;
     433             :         u_int rdomain;
     434             : };
     435             : 
     436             : struct tdb_crypto {
     437             :         u_int32_t               tc_spi;
     438             :         union sockaddr_union    tc_dst;
     439             :         u_int8_t                tc_proto;
     440             :         int                     tc_protoff;
     441             :         int                     tc_skip;
     442             :         u_int                   tc_rdomain;
     443             : };
     444             : 
     445             : struct ipsecinit {
     446             :         u_int8_t        *ii_enckey;
     447             :         u_int8_t        *ii_authkey;
     448             :         u_int16_t       ii_enckeylen;
     449             :         u_int16_t       ii_authkeylen;
     450             :         u_int8_t        ii_encalg;
     451             :         u_int8_t        ii_authalg;
     452             :         u_int8_t        ii_compalg;
     453             : };
     454             : 
     455             : /* xform IDs */
     456             : #define XF_IP4          1       /* IP inside IP */
     457             : #define XF_AH           2       /* AH */
     458             : #define XF_ESP          3       /* ESP */
     459             : #define XF_TCPSIGNATURE 5       /* TCP MD5 Signature option, RFC 2358 */
     460             : #define XF_IPCOMP       6       /* IPCOMP */
     461             : 
     462             : /* xform attributes */
     463             : #define XFT_AUTH        0x0001
     464             : #define XFT_CONF        0x0100
     465             : #define XFT_COMP        0x1000
     466             : 
     467             : #define IPSEC_ZEROES_SIZE       256     /* Larger than an IP6 extension hdr. */
     468             : 
     469             : struct xformsw {
     470             :         u_short xf_type;                /* Unique ID of xform */
     471             :         u_short xf_flags;               /* flags (see below) */
     472             :         char    *xf_name;               /* human-readable name */
     473             :         int     (*xf_attach)(void);     /* called at config time */
     474             :         int     (*xf_init)(struct tdb *, struct xformsw *, struct ipsecinit *);
     475             :         int     (*xf_zeroize)(struct tdb *); /* termination */
     476             :         int     (*xf_input)(struct mbuf *, struct tdb *, int, int); /* input */
     477             :         int     (*xf_output)(struct mbuf *, struct tdb *, struct mbuf **,
     478             :             int, int);        /* output */
     479             : };
     480             : 
     481             : extern int ipsec_in_use;
     482             : extern u_int64_t ipsec_last_added;
     483             : extern int ipsec_policy_pool_initialized;
     484             : extern int encdebug;                    /* enable message reporting */
     485             : 
     486             : extern int ipsec_keep_invalid;          /* lifetime of embryonic SAs (in sec) */
     487             : extern int ipsec_require_pfs;           /* use Perfect Forward Secrecy */
     488             : extern int ipsec_expire_acquire;        /* wait for security assoc. (in sec) */
     489             : extern int ipsec_soft_allocations;      /* flows/SA before renegotiation */
     490             : extern int ipsec_exp_allocations;       /* num. of flows/SA before it expires */
     491             : extern int ipsec_soft_bytes;            /* bytes/SA before renegotiation */
     492             : extern int ipsec_exp_bytes;             /* num of bytes/SA before it expires */
     493             : extern int ipsec_soft_timeout;          /* seconds/SA before renegotiation */
     494             : extern int ipsec_exp_timeout;           /* seconds/SA before it expires */
     495             : extern int ipsec_soft_first_use;        /* seconds between 1st asso & renego */
     496             : extern int ipsec_exp_first_use;         /* seconds between 1st asso & expire */     
     497             : 
     498             : /*
     499             :  * Names for IPsec sysctl objects
     500             :  */
     501             : #define IPSEC_ENCDEBUG                  IPCTL_ENCDEBUG                  /* 12 */
     502             : #define IPSEC_STATS                     IPCTL_IPSEC_STATS               /* 13 */
     503             : #define IPSEC_EXPIRE_ACQUIRE            IPCTL_IPSEC_EXPIRE_ACQUIRE      /* 14 */
     504             : #define IPSEC_EMBRYONIC_SA_TIMEOUT      IPCTL_IPSEC_EMBRYONIC_SA_TIMEOUT/* 15 */
     505             : #define IPSEC_REQUIRE_PFS               IPCTL_IPSEC_REQUIRE_PFS         /* 16 */
     506             : #define IPSEC_SOFT_ALLOCATIONS          IPCTL_IPSEC_SOFT_ALLOCATIONS    /* 17 */
     507             : #define IPSEC_ALLOCATIONS               IPCTL_IPSEC_ALLOCATIONS         /* 18 */
     508             : #define IPSEC_SOFT_BYTES                IPCTL_IPSEC_SOFT_BYTES          /* 19 */
     509             : #define IPSEC_BYTES                     IPCTL_IPSEC_BYTES               /* 20 */
     510             : #define IPSEC_TIMEOUT                   IPCTL_IPSEC_TIMEOUT             /* 21 */
     511             : #define IPSEC_SOFT_TIMEOUT              IPCTL_IPSEC_SOFT_TIMEOUT        /* 22 */
     512             : #define IPSEC_SOFT_FIRSTUSE             IPCTL_IPSEC_SOFT_FIRSTUSE       /* 23 */
     513             : #define IPSEC_FIRSTUSE                  IPCTL_IPSEC_FIRSTUSE            /* 24 */
     514             : #define IPSEC_MAXID     25
     515             : 
     516             : #define IPSECCTL_VARS { \
     517             :         NULL, \
     518             :         NULL, \
     519             :         NULL, \
     520             :         NULL, \
     521             :         NULL, \
     522             :         NULL, \
     523             :         NULL, \
     524             :         NULL, \
     525             :         NULL, \
     526             :         NULL, \
     527             :         NULL, \
     528             :         NULL, \
     529             :         &encdebug, \
     530             :         NULL, /* ipsecstat */ \
     531             :         &ipsec_expire_acquire, \
     532             :         &ipsec_keep_invalid, \
     533             :         &ipsec_require_pfs, \
     534             :         &ipsec_soft_allocations, \
     535             :         &ipsec_exp_allocations, \
     536             :         &ipsec_soft_bytes, \
     537             :         &ipsec_exp_bytes, \
     538             :         &ipsec_exp_timeout, \
     539             :         &ipsec_soft_timeout, \
     540             :         &ipsec_soft_first_use, \
     541             :         &ipsec_exp_first_use, \
     542             : }
     543             : 
     544             : extern char ipsec_def_enc[];
     545             : extern char ipsec_def_auth[];
     546             : extern char ipsec_def_comp[];
     547             : 
     548             : extern struct enc_xform enc_xform_des;
     549             : extern struct enc_xform enc_xform_3des;
     550             : extern struct enc_xform enc_xform_blf;
     551             : extern struct enc_xform enc_xform_cast5;
     552             : 
     553             : extern struct auth_hash auth_hash_hmac_md5_96;
     554             : extern struct auth_hash auth_hash_hmac_sha1_96;
     555             : extern struct auth_hash auth_hash_hmac_ripemd_160_96;
     556             : 
     557             : extern struct comp_algo comp_algo_deflate;
     558             : 
     559             : extern TAILQ_HEAD(ipsec_policy_head, ipsec_policy) ipsec_policy_head;
     560             : 
     561             : struct cryptop;
     562             : 
     563             : /* Misc. */
     564             : #ifdef ENCDEBUG
     565             : const char *ipsp_address(union sockaddr_union *, char *, socklen_t);
     566             : #endif /* ENCDEBUG */
     567             : 
     568             : /* SPD tables */
     569             : struct radix_node_head *spd_table_add(unsigned int);
     570             : struct radix_node_head *spd_table_get(unsigned int);
     571             : int spd_table_walk(unsigned int,
     572             :     int (*walker)(struct ipsec_policy *, void *, unsigned int), void *);
     573             : 
     574             : /* TDB management routines */
     575             : uint32_t reserve_spi(u_int, u_int32_t, u_int32_t, union sockaddr_union *,
     576             :                 union sockaddr_union *, u_int8_t, int *);
     577             : struct  tdb *gettdb(u_int, u_int32_t, union sockaddr_union *, u_int8_t);
     578             : struct  tdb *gettdbbydst(u_int, union sockaddr_union *, u_int8_t,
     579             :                 struct ipsec_ids *,
     580             :                 struct sockaddr_encap *, struct sockaddr_encap *);
     581             : struct  tdb *gettdbbysrc(u_int, union sockaddr_union *, u_int8_t,
     582             :                 struct ipsec_ids *,
     583             :                 struct sockaddr_encap *, struct sockaddr_encap *);
     584             : struct  tdb *gettdbbysrcdst(u_int, u_int32_t, union sockaddr_union *,
     585             :                 union sockaddr_union *, u_int8_t);
     586             : void    puttdb(struct tdb *);
     587             : void    tdb_delete(struct tdb *);
     588             : struct  tdb *tdb_alloc(u_int);
     589             : void    tdb_free(struct tdb *);
     590             : int     tdb_init(struct tdb *, u_int16_t, struct ipsecinit *);
     591             : void    tdb_unlink(struct tdb *);
     592             : int     tdb_walk(u_int, int (*)(struct tdb *, void *, int), void *);
     593             : 
     594             : /* XF_IP4 */
     595             : int     ipe4_attach(void);
     596             : int     ipe4_init(struct tdb *, struct xformsw *, struct ipsecinit *);
     597             : int     ipe4_zeroize(struct tdb *);
     598             : int     ipe4_input(struct mbuf *, struct tdb *, int, int);
     599             : 
     600             : /* XF_AH */
     601             : int     ah_attach(void);
     602             : int     ah_init(struct tdb *, struct xformsw *, struct ipsecinit *);
     603             : int     ah_zeroize(struct tdb *);
     604             : int     ah_input(struct mbuf *, struct tdb *, int, int);
     605             : int     ah_input_cb(struct tdb *, struct tdb_crypto *, struct mbuf *, int);
     606             : int     ah_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
     607             : int     ah_output_cb(struct tdb *, struct tdb_crypto *, struct mbuf *, int,
     608             :             int);
     609             : int     ah_sysctl(int *, u_int, void *, size_t *, void *, size_t);
     610             : 
     611             : int     ah4_input(struct mbuf **, int *, int, int);
     612             : void    ah4_ctlinput(int, struct sockaddr *, u_int, void *);
     613             : void    udpencap_ctlinput(int, struct sockaddr *, u_int, void *);
     614             : 
     615             : #ifdef INET6
     616             : int     ah6_input(struct mbuf **, int *, int, int);
     617             : #endif /* INET6 */
     618             : 
     619             : /* XF_ESP */
     620             : int     esp_attach(void);
     621             : int     esp_init(struct tdb *, struct xformsw *, struct ipsecinit *);
     622             : int     esp_zeroize(struct tdb *);
     623             : int     esp_input(struct mbuf *, struct tdb *, int, int);
     624             : int     esp_input_cb(struct tdb *, struct tdb_crypto *, struct mbuf *, int);
     625             : int     esp_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
     626             : int     esp_output_cb(struct tdb *, struct tdb_crypto *, struct mbuf *, int,
     627             :             int);
     628             : int     esp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
     629             : 
     630             : int     esp4_input(struct mbuf **, int *, int, int);
     631             : void    esp4_ctlinput(int, struct sockaddr *, u_int, void *);
     632             : 
     633             : #ifdef INET6
     634             : int     esp6_input(struct mbuf **, int *, int, int);
     635             : #endif /* INET6 */
     636             : 
     637             : /* XF_IPCOMP */
     638             : int     ipcomp_attach(void);
     639             : int     ipcomp_init(struct tdb *, struct xformsw *, struct ipsecinit *);
     640             : int     ipcomp_zeroize(struct tdb *);
     641             : int     ipcomp_input(struct mbuf *, struct tdb *, int, int);
     642             : int     ipcomp_input_cb(struct tdb *, struct tdb_crypto *, struct mbuf *, int);
     643             : int     ipcomp_output(struct mbuf *, struct tdb *, struct mbuf **, int, int);
     644             : int     ipcomp_output_cb(struct tdb *, struct tdb_crypto *, struct mbuf *, int,
     645             :             int);
     646             : int     ipcomp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
     647             : int     ipcomp4_input(struct mbuf **, int *, int, int);
     648             : #ifdef INET6
     649             : int     ipcomp6_input(struct mbuf **, int *, int, int);
     650             : #endif /* INET6 */
     651             : 
     652             : /* XF_TCPSIGNATURE */
     653             : int     tcp_signature_tdb_attach(void);
     654             : int     tcp_signature_tdb_init(struct tdb *, struct xformsw *,
     655             :             struct ipsecinit *);
     656             : int     tcp_signature_tdb_zeroize(struct tdb *);
     657             : int     tcp_signature_tdb_input(struct mbuf *, struct tdb *, int, int);
     658             : int     tcp_signature_tdb_output(struct mbuf *, struct tdb *, struct mbuf **,
     659             :           int, int);
     660             : 
     661             : /* Replay window */
     662             : int     checkreplaywindow(struct tdb *, u_int32_t, u_int32_t *, int);
     663             : 
     664             : /* Packet processing */
     665             : int     ipsp_process_packet(struct mbuf *, struct tdb *, int, int);
     666             : int     ipsp_process_done(struct mbuf *, struct tdb *);
     667             : struct  tdb *ipsp_spd_lookup(struct mbuf *, int, int, int *, int,
     668             :             struct tdb *, struct inpcb *, u_int32_t);
     669             : struct  tdb *ipsp_spd_inp(struct mbuf *, int, int, int *, int,
     670             :             struct tdb *, struct inpcb *, struct ipsec_policy *);
     671             : int     ipsp_is_unspecified(union sockaddr_union);
     672             : int     ipsp_aux_match(struct tdb *, struct ipsec_ids *,
     673             :             struct sockaddr_encap *, struct sockaddr_encap *);
     674             : int     ipsp_ids_match(struct ipsec_ids *, struct ipsec_ids *);
     675             : struct ipsec_ids *ipsp_ids_insert(struct ipsec_ids *);
     676             : struct ipsec_ids *ipsp_ids_lookup(u_int32_t);
     677             : void    ipsp_ids_free(struct ipsec_ids *);
     678             : 
     679             : void    ipsec_init(void);
     680             : int     ipsec_sysctl(int *, u_int, void *, size_t *, void *, size_t);
     681             : int     ipsec_common_input(struct mbuf *, int, int, int, int, int);
     682             : void    ipsec_input_cb(struct cryptop *);
     683             : void    ipsec_output_cb(struct cryptop *);
     684             : int     ipsec_common_input_cb(struct mbuf *, struct tdb *, int, int);
     685             : int     ipsec_delete_policy(struct ipsec_policy *);
     686             : ssize_t ipsec_hdrsz(struct tdb *);
     687             : void    ipsec_adjust_mtu(struct mbuf *, u_int32_t);
     688             : struct  ipsec_acquire *ipsec_get_acquire(u_int32_t);
     689             : int     ipsec_forward_check(struct mbuf *, int, int);
     690             : int     ipsec_local_check(struct mbuf *, int, int, int);
     691             : 
     692             : #endif /* _KERNEL */
     693             : #endif /* _NETINET_IPSP_H_ */

Generated by: LCOV version 1.13