linux/include/net/cipso_ipv4.h
<<
>>
Prefs
   1/*
   2 * CIPSO - Commercial IP Security Option
   3 *
   4 * This is an implementation of the CIPSO 2.2 protocol as specified in
   5 * draft-ietf-cipso-ipsecurity-01.txt with additional tag types as found in
   6 * FIPS-188, copies of both documents can be found in the Documentation
   7 * directory.  While CIPSO never became a full IETF RFC standard many vendors
   8 * have chosen to adopt the protocol and over the years it has become a
   9 * de-facto standard for labeled networking.
  10 *
  11 * Author: Paul Moore <paul@paul-moore.com>
  12 *
  13 */
  14
  15/*
  16 * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
  17 *
  18 * This program is free software;  you can redistribute it and/or modify
  19 * it under the terms of the GNU General Public License as published by
  20 * the Free Software Foundation; either version 2 of the License, or
  21 * (at your option) any later version.
  22 *
  23 * This program is distributed in the hope that it will be useful,
  24 * but WITHOUT ANY WARRANTY;  without even the implied warranty of
  25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  26 * the GNU General Public License for more details.
  27 *
  28 * You should have received a copy of the GNU General Public License
  29 * along with this program;  if not, see <http://www.gnu.org/licenses/>.
  30 *
  31 */
  32
  33#ifndef _CIPSO_IPV4_H
  34#define _CIPSO_IPV4_H
  35
  36#include <linux/types.h>
  37#include <linux/rcupdate.h>
  38#include <linux/list.h>
  39#include <linux/net.h>
  40#include <linux/skbuff.h>
  41#include <net/netlabel.h>
  42#include <net/request_sock.h>
  43#include <linux/atomic.h>
  44#include <asm/unaligned.h>
  45
  46/* known doi values */
  47#define CIPSO_V4_DOI_UNKNOWN          0x00000000
  48
  49/* standard tag types */
  50#define CIPSO_V4_TAG_INVALID          0
  51#define CIPSO_V4_TAG_RBITMAP          1
  52#define CIPSO_V4_TAG_ENUM             2
  53#define CIPSO_V4_TAG_RANGE            5
  54#define CIPSO_V4_TAG_PBITMAP          6
  55#define CIPSO_V4_TAG_FREEFORM         7
  56
  57/* non-standard tag types (tags > 127) */
  58#define CIPSO_V4_TAG_LOCAL            128
  59
  60/* doi mapping types */
  61#define CIPSO_V4_MAP_UNKNOWN          0
  62#define CIPSO_V4_MAP_TRANS            1
  63#define CIPSO_V4_MAP_PASS             2
  64#define CIPSO_V4_MAP_LOCAL            3
  65
  66/* limits */
  67#define CIPSO_V4_MAX_REM_LVLS         255
  68#define CIPSO_V4_INV_LVL              0x80000000
  69#define CIPSO_V4_MAX_LOC_LVLS         (CIPSO_V4_INV_LVL - 1)
  70#define CIPSO_V4_MAX_REM_CATS         65534
  71#define CIPSO_V4_INV_CAT              0x80000000
  72#define CIPSO_V4_MAX_LOC_CATS         (CIPSO_V4_INV_CAT - 1)
  73
  74/*
  75 * CIPSO DOI definitions
  76 */
  77
  78/* DOI definition struct */
  79#define CIPSO_V4_TAG_MAXCNT           5
  80struct cipso_v4_doi {
  81        u32 doi;
  82        u32 type;
  83        union {
  84                struct cipso_v4_std_map_tbl *std;
  85        } map;
  86        u8 tags[CIPSO_V4_TAG_MAXCNT];
  87
  88        atomic_t refcount;
  89        struct list_head list;
  90        struct rcu_head rcu;
  91};
  92
  93/* Standard CIPSO mapping table */
  94/* NOTE: the highest order bit (i.e. 0x80000000) is an 'invalid' flag, if the
  95 *       bit is set then consider that value as unspecified, meaning the
  96 *       mapping for that particular level/category is invalid */
  97struct cipso_v4_std_map_tbl {
  98        struct {
  99                u32 *cipso;
 100                u32 *local;
 101                u32 cipso_size;
 102                u32 local_size;
 103        } lvl;
 104        struct {
 105                u32 *cipso;
 106                u32 *local;
 107                u32 cipso_size;
 108                u32 local_size;
 109        } cat;
 110};
 111
 112/*
 113 * Sysctl Variables
 114 */
 115
 116#ifdef CONFIG_NETLABEL
 117extern int cipso_v4_cache_enabled;
 118extern int cipso_v4_cache_bucketsize;
 119extern int cipso_v4_rbm_optfmt;
 120extern int cipso_v4_rbm_strictvalid;
 121#endif
 122
 123/*
 124 * DOI List Functions
 125 */
 126
 127#ifdef CONFIG_NETLABEL
 128int cipso_v4_doi_add(struct cipso_v4_doi *doi_def,
 129                     struct netlbl_audit *audit_info);
 130void cipso_v4_doi_free(struct cipso_v4_doi *doi_def);
 131int cipso_v4_doi_remove(u32 doi, struct netlbl_audit *audit_info);
 132struct cipso_v4_doi *cipso_v4_doi_getdef(u32 doi);
 133void cipso_v4_doi_putdef(struct cipso_v4_doi *doi_def);
 134int cipso_v4_doi_walk(u32 *skip_cnt,
 135                     int (*callback) (struct cipso_v4_doi *doi_def, void *arg),
 136                     void *cb_arg);
 137#else
 138static inline int cipso_v4_doi_add(struct cipso_v4_doi *doi_def,
 139                                   struct netlbl_audit *audit_info)
 140{
 141        return -ENOSYS;
 142}
 143
 144static inline void cipso_v4_doi_free(struct cipso_v4_doi *doi_def)
 145{
 146        return;
 147}
 148
 149static inline int cipso_v4_doi_remove(u32 doi,
 150                                      struct netlbl_audit *audit_info)
 151{
 152        return 0;
 153}
 154
 155static inline struct cipso_v4_doi *cipso_v4_doi_getdef(u32 doi)
 156{
 157        return NULL;
 158}
 159
 160static inline int cipso_v4_doi_walk(u32 *skip_cnt,
 161                     int (*callback) (struct cipso_v4_doi *doi_def, void *arg),
 162                     void *cb_arg)
 163{
 164        return 0;
 165}
 166
 167static inline int cipso_v4_doi_domhsh_add(struct cipso_v4_doi *doi_def,
 168                                          const char *domain)
 169{
 170        return -ENOSYS;
 171}
 172
 173static inline int cipso_v4_doi_domhsh_remove(struct cipso_v4_doi *doi_def,
 174                                             const char *domain)
 175{
 176        return 0;
 177}
 178#endif /* CONFIG_NETLABEL */
 179
 180/*
 181 * Label Mapping Cache Functions
 182 */
 183
 184#ifdef CONFIG_NETLABEL
 185void cipso_v4_cache_invalidate(void);
 186int cipso_v4_cache_add(const unsigned char *cipso_ptr,
 187                       const struct netlbl_lsm_secattr *secattr);
 188#else
 189static inline void cipso_v4_cache_invalidate(void)
 190{
 191        return;
 192}
 193
 194static inline int cipso_v4_cache_add(const unsigned char *cipso_ptr,
 195                                     const struct netlbl_lsm_secattr *secattr)
 196{
 197        return 0;
 198}
 199#endif /* CONFIG_NETLABEL */
 200
 201/*
 202 * Protocol Handling Functions
 203 */
 204
 205#ifdef CONFIG_NETLABEL
 206void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway);
 207int cipso_v4_getattr(const unsigned char *cipso,
 208                     struct netlbl_lsm_secattr *secattr);
 209int cipso_v4_sock_setattr(struct sock *sk,
 210                          const struct cipso_v4_doi *doi_def,
 211                          const struct netlbl_lsm_secattr *secattr);
 212void cipso_v4_sock_delattr(struct sock *sk);
 213int cipso_v4_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr);
 214int cipso_v4_req_setattr(struct request_sock *req,
 215                         const struct cipso_v4_doi *doi_def,
 216                         const struct netlbl_lsm_secattr *secattr);
 217void cipso_v4_req_delattr(struct request_sock *req);
 218int cipso_v4_skbuff_setattr(struct sk_buff *skb,
 219                            const struct cipso_v4_doi *doi_def,
 220                            const struct netlbl_lsm_secattr *secattr);
 221int cipso_v4_skbuff_delattr(struct sk_buff *skb);
 222int cipso_v4_skbuff_getattr(const struct sk_buff *skb,
 223                            struct netlbl_lsm_secattr *secattr);
 224unsigned char *cipso_v4_optptr(const struct sk_buff *skb);
 225int cipso_v4_validate(const struct sk_buff *skb, unsigned char **option);
 226#else
 227static inline void cipso_v4_error(struct sk_buff *skb,
 228                                  int error,
 229                                  u32 gateway)
 230{
 231        return;
 232}
 233
 234static inline int cipso_v4_getattr(const unsigned char *cipso,
 235                                   struct netlbl_lsm_secattr *secattr)
 236{
 237        return -ENOSYS;
 238}
 239
 240static inline int cipso_v4_sock_setattr(struct sock *sk,
 241                                      const struct cipso_v4_doi *doi_def,
 242                                      const struct netlbl_lsm_secattr *secattr)
 243{
 244        return -ENOSYS;
 245}
 246
 247static inline void cipso_v4_sock_delattr(struct sock *sk)
 248{
 249}
 250
 251static inline int cipso_v4_sock_getattr(struct sock *sk,
 252                                        struct netlbl_lsm_secattr *secattr)
 253{
 254        return -ENOSYS;
 255}
 256
 257static inline int cipso_v4_req_setattr(struct request_sock *req,
 258                                       const struct cipso_v4_doi *doi_def,
 259                                       const struct netlbl_lsm_secattr *secattr)
 260{
 261        return -ENOSYS;
 262}
 263
 264static inline void cipso_v4_req_delattr(struct request_sock *req)
 265{
 266        return;
 267}
 268
 269static inline int cipso_v4_skbuff_setattr(struct sk_buff *skb,
 270                                      const struct cipso_v4_doi *doi_def,
 271                                      const struct netlbl_lsm_secattr *secattr)
 272{
 273        return -ENOSYS;
 274}
 275
 276static inline int cipso_v4_skbuff_delattr(struct sk_buff *skb)
 277{
 278        return -ENOSYS;
 279}
 280
 281static inline int cipso_v4_skbuff_getattr(const struct sk_buff *skb,
 282                                          struct netlbl_lsm_secattr *secattr)
 283{
 284        return -ENOSYS;
 285}
 286
 287static inline unsigned char *cipso_v4_optptr(const struct sk_buff *skb)
 288{
 289        return NULL;
 290}
 291
 292static inline int cipso_v4_validate(const struct sk_buff *skb,
 293                                    unsigned char **option)
 294{
 295        unsigned char *opt = *option;
 296        unsigned char err_offset = 0;
 297        u8 opt_len = opt[1];
 298        u8 opt_iter;
 299        u8 tag_len;
 300
 301        if (opt_len < 8) {
 302                err_offset = 1;
 303                goto out;
 304        }
 305
 306        if (get_unaligned_be32(&opt[2]) == 0) {
 307                err_offset = 2;
 308                goto out;
 309        }
 310
 311        for (opt_iter = 6; opt_iter < opt_len;) {
 312                tag_len = opt[opt_iter + 1];
 313                if ((tag_len == 0) || (tag_len > (opt_len - opt_iter))) {
 314                        err_offset = opt_iter + 1;
 315                        goto out;
 316                }
 317                opt_iter += tag_len;
 318        }
 319
 320out:
 321        *option = opt + err_offset;
 322        return err_offset;
 323
 324}
 325#endif /* CONFIG_NETLABEL */
 326
 327#endif /* _CIPSO_IPV4_H */
 328