Blame include/libnetlabel.h

Packit 51d0f7
/** @file
Packit 51d0f7
 * NetLabel userspace configuration library API.
Packit 51d0f7
 *
Packit 51d0f7
 * The Linux NetLabel subsystem manages network security labels for explicit
Packit 51d0f7
 * labeling protocols such as CIPSO as well as static security labels for
Packit 51d0f7
 * "unlabeled" network traffic.  More information on NetLabel can be found at
Packit 51d0f7
 * the NetLabel SourceForge project site, http://netlabel.sf.net.
Packit 51d0f7
 *
Packit 51d0f7
 * Author: Paul Moore <paul@paul-moore.com>
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
Packit 51d0f7
/*
Packit 51d0f7
 * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
Packit 51d0f7
 *
Packit 51d0f7
 * This program is free software: you can redistribute it and/or modify
Packit 51d0f7
 * it under the terms of version 2 of the GNU General Public License as
Packit 51d0f7
 * published by the Free Software Foundation.
Packit 51d0f7
 *
Packit 51d0f7
 * This program is distributed in the hope that it will be useful,
Packit 51d0f7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 51d0f7
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 51d0f7
 * GNU General Public License for more details.
Packit 51d0f7
 *
Packit 51d0f7
 * You should have received a copy of the GNU General Public License
Packit 51d0f7
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
Packit 51d0f7
#ifndef _LIBNETLABEL_H
Packit 51d0f7
#define _LIBNETLABEL_H
Packit 51d0f7
Packit 51d0f7
#include <sys/types.h>
Packit 51d0f7
#include <linux/types.h>
Packit 51d0f7
#include <netinet/in.h>
Packit 51d0f7
#include <netlink/netlink.h>
Packit 51d0f7
#include <netlink/msg.h>
Packit 51d0f7
#include <netlink/attr.h>
Packit 51d0f7
Packit 51d0f7
#include <netlabel.h>
Packit 51d0f7
Packit 51d0f7
/*
Packit 51d0f7
 * Types
Packit 51d0f7
 */
Packit 51d0f7
Packit 51d0f7
/* General Types */
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel communications handle
Packit 51d0f7
 *
Packit 51d0f7
 * Handle used for communicating with the NetLabel subsystem in the kernel via
Packit 51d0f7
 * generic netlink.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_handle;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel message
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used for sending and receiving messages with the NetLabel
Packit 51d0f7
 * kernel subsystem.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef struct nl_msg nlbl_msg;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel labeling protocol
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to specify network labeling protocols.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_proto;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel network device
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to specify network interfaces.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef char *nlbl_netdev;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel network address structure
Packit 51d0f7
 * @param type address family
Packit 51d0f7
 * @param addr.v4 IPv4 address
Packit 51d0f7
 * @param addr.v6 IPv6 address
Packit 51d0f7
 * @param mask.v4 IPv4 address mask
Packit 51d0f7
 * @param mask.v6 IPv6 address mask
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent IP addresses.  It can represent both single
Packit 51d0f7
 * hosts and entire networks using both IPv4 and IPv6.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_netaddr {
Packit 51d0f7
	short type;
Packit 51d0f7
	union {
Packit 51d0f7
		struct in_addr v4;
Packit 51d0f7
		struct in6_addr v6;
Packit 51d0f7
	} addr;
Packit 51d0f7
	union {
Packit 51d0f7
		struct in_addr v4;
Packit 51d0f7
		struct in6_addr v6;
Packit 51d0f7
	} mask;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel security label
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent security labels.  NetLabel itself does not
Packit 51d0f7
 * interpret the security labels, the individual LSMs are used to parse and
Packit 51d0f7
 * interpret the security labels.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef char *nlbl_secctx;
Packit 51d0f7
Packit 51d0f7
/* CIPSO Types */
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO Domain Of Interpretation (DOI) value
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent a CIPSO Domian of Interpretation (DOI).
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_cip_doi;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO mapping type
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent the CIPSO security label mapping method.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_cip_mtype;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO tag type
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent CIPSO tag types.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint8_t nlbl_cip_tag;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO tag array
Packit 51d0f7
 * @param array array of tag types
Packit 51d0f7
 * @param size size of array
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent an array of CIPSO tags in decreasing order
Packit 51d0f7
 * of preference.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_cip_tag_a {
Packit 51d0f7
	nlbl_cip_tag *array;
Packit 51d0f7
	size_t size;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO MLS level
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent the CIPSO MLS sensitivity level.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_cip_lvl;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO MLS level array
Packit 51d0f7
 * @param array array of MLS levels
Packit 51d0f7
 * @param size size of array
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent an array of CIPSO MLS sensitivity levels.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_cip_lvl_a {
Packit 51d0f7
	nlbl_cip_lvl *array;
Packit 51d0f7
	size_t size;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO MLS category
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent the CIPSO MLS category/compartment.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_cip_cat;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CIPSO MLS category array
Packit 51d0f7
 * @param array array of MLS categories
Packit 51d0f7
 * @param size size of array
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent an array of CIPSO MLS categories.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_cip_cat_a {
Packit 51d0f7
	nlbl_cip_cat *array;
Packit 51d0f7
	size_t size;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/* CALIPSO Types */
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CALIPSO Domain Of Interpretation (DOI) value
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent a CALIPSO Domian of Interpretation (DOI).
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_clp_doi;
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel CALIPSO mapping type
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to represent the CALIPSO security label mapping method.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
typedef uint32_t nlbl_clp_mtype;
Packit 51d0f7
Packit 51d0f7
/* NetLabel and LSM Mapping Types */
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel IP address selector structure
Packit 51d0f7
 * @param addr IP address
Packit 51d0f7
 * @param proto_type labeling protocol
Packit 51d0f7
 * @param proto.cip_doi CIPSO DOI
Packit 51d0f7
 * @param proto.clp_doi CALIPSO DOI
Packit 51d0f7
 * @param next next address selector
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to map IP addresses to labeling protocol configurations.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_dommap_addr {
Packit 51d0f7
	struct nlbl_netaddr addr;
Packit 51d0f7
	nlbl_proto proto_type;
Packit 51d0f7
	union {
Packit 51d0f7
		nlbl_cip_doi cip_doi;
Packit 51d0f7
		nlbl_clp_doi clp_doi;
Packit 51d0f7
	} proto;
Packit 51d0f7
Packit 51d0f7
	struct nlbl_dommap_addr *next;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel LSM/Domain mapping structure
Packit 51d0f7
 * @param domain LSM domain
Packit 51d0f7
 * @param family address family
Packit 51d0f7
 * @param proto_type labeling protocol
Packit 51d0f7
 * @param proto.cip_doi CIPSO DOI
Packit 51d0f7
 * @param proto.cpl_doi CALIPSO DOI
Packit 51d0f7
 * @param proto.addrsel IP address selector(s)
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to map LSM domains to labeling protocol configurations.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_dommap {
Packit 51d0f7
	char *domain;
Packit 51d0f7
	uint16_t family;
Packit 51d0f7
	nlbl_proto proto_type;
Packit 51d0f7
	union {
Packit 51d0f7
		nlbl_cip_doi cip_doi;
Packit 51d0f7
		nlbl_clp_doi clp_doi;
Packit 51d0f7
		struct nlbl_dommap_addr *addrsel;
Packit 51d0f7
	} proto;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/**
Packit 51d0f7
 * NetLabel network address mapping structure
Packit 51d0f7
 * @param dev network device
Packit 51d0f7
 * @param addr network address
Packit 51d0f7
 * @param label security label
Packit 51d0f7
 *
Packit 51d0f7
 * NetLabel type used to map network interfaces and addresses to security
Packit 51d0f7
 * labels.
Packit 51d0f7
 *
Packit 51d0f7
 */
Packit 51d0f7
struct nlbl_addrmap {
Packit 51d0f7
	nlbl_netdev dev;
Packit 51d0f7
	struct nlbl_netaddr addr;
Packit 51d0f7
	nlbl_secctx label;
Packit 51d0f7
};
Packit 51d0f7
Packit 51d0f7
/*
Packit 51d0f7
 * Functions
Packit 51d0f7
 */
Packit 51d0f7
Packit 51d0f7
/* Initialization and Termination */
Packit 51d0f7
Packit 51d0f7
int nlbl_init(void);
Packit 51d0f7
void nlbl_exit(void);
Packit 51d0f7
Packit 51d0f7
/* Low Level Communications */
Packit 51d0f7
Packit 51d0f7
/* Communications Control */
Packit 51d0f7
void nlbl_comm_timeout(uint32_t seconds);
Packit 51d0f7
Packit 51d0f7
/* Raw NetLabel I/O API */
Packit 51d0f7
struct nlbl_handle *nlbl_comm_open(void);
Packit 51d0f7
int nlbl_comm_close(struct nlbl_handle *hndl);
Packit 51d0f7
int nlbl_comm_recv(struct nlbl_handle *hndl, nlbl_msg **msg);
Packit 51d0f7
int nlbl_comm_recv_raw(struct nlbl_handle *hndl, unsigned char **data);
Packit 51d0f7
int nlbl_comm_send(struct nlbl_handle *hndl, nlbl_msg *msg);
Packit 51d0f7
Packit 51d0f7
/* Message Handling */
Packit 51d0f7
nlbl_msg *nlbl_msg_new(void);
Packit 51d0f7
void nlbl_msg_free(nlbl_msg *msg);
Packit 51d0f7
struct nlmsghdr *nlbl_msg_nlhdr(nlbl_msg *msg);
Packit 51d0f7
struct genlmsghdr *nlbl_msg_genlhdr(nlbl_msg *msg);
Packit 51d0f7
struct nlmsgerr *nlbl_msg_err(nlbl_msg *msg);
Packit 51d0f7
Packit 51d0f7
/* Attribute Handling */
Packit 51d0f7
struct nlattr *nlbl_attr_head(nlbl_msg *msg);
Packit 51d0f7
struct nlattr *nlbl_attr_find(nlbl_msg *msg, int nla_type);
Packit 51d0f7
Packit 51d0f7
/* Configuration Operations */
Packit 51d0f7
Packit 51d0f7
/* Management */
Packit 51d0f7
int nlbl_mgmt_version(struct nlbl_handle *hndl, uint32_t *version);
Packit 51d0f7
int nlbl_mgmt_protocols(struct nlbl_handle *hndl, nlbl_proto **protocols);
Packit 51d0f7
int nlbl_mgmt_add(struct nlbl_handle *hndl,
Packit 51d0f7
		  struct nlbl_dommap *domain,
Packit 51d0f7
		  struct nlbl_netaddr *addr);
Packit 51d0f7
int nlbl_mgmt_adddef(struct nlbl_handle *hndl,
Packit 51d0f7
		     struct nlbl_dommap *domain,
Packit 51d0f7
		     struct nlbl_netaddr *addr);
Packit 51d0f7
int nlbl_mgmt_del(struct nlbl_handle *hndl, char *domain);
Packit 51d0f7
int nlbl_mgmt_deldef(struct nlbl_handle *hndl);
Packit 51d0f7
int nlbl_mgmt_listall(struct nlbl_handle *hndl, struct nlbl_dommap **domains);
Packit 51d0f7
int nlbl_mgmt_listdef(struct nlbl_handle *hndl, uint16_t family,
Packit 51d0f7
		      struct nlbl_dommap *domain);
Packit 51d0f7
Packit 51d0f7
/* Unlabeled Traffic */
Packit 51d0f7
int nlbl_unlbl_accept(struct nlbl_handle *hndl, uint8_t allow_flag);
Packit 51d0f7
int nlbl_unlbl_list(struct nlbl_handle *hndl, uint8_t *allow_flag);
Packit 51d0f7
int nlbl_unlbl_staticadd(struct nlbl_handle *hndl,
Packit 51d0f7
			 nlbl_netdev dev,
Packit 51d0f7
			 struct nlbl_netaddr *addr,
Packit 51d0f7
			 nlbl_secctx label);
Packit 51d0f7
int nlbl_unlbl_staticadddef(struct nlbl_handle *hndl,
Packit 51d0f7
			    struct nlbl_netaddr *addr,
Packit 51d0f7
			    nlbl_secctx label);
Packit 51d0f7
int nlbl_unlbl_staticdel(struct nlbl_handle *hndl,
Packit 51d0f7
			 nlbl_netdev dev,
Packit 51d0f7
			 struct nlbl_netaddr *addr);
Packit 51d0f7
int nlbl_unlbl_staticdeldef(struct nlbl_handle *hndl,
Packit 51d0f7
			    struct nlbl_netaddr *addr);
Packit 51d0f7
int nlbl_unlbl_staticlist(struct nlbl_handle *hndl,
Packit 51d0f7
			  struct nlbl_addrmap **addrs);
Packit 51d0f7
int nlbl_unlbl_staticlistdef(struct nlbl_handle *hndl,
Packit 51d0f7
			     struct nlbl_addrmap **addrs);
Packit 51d0f7
Packit 51d0f7
/* CIPSO Protocol */
Packit 51d0f7
int nlbl_cipso_add_trans(struct nlbl_handle *hndl,
Packit 51d0f7
			 nlbl_cip_doi doi,
Packit 51d0f7
			 struct nlbl_cip_tag_a *tags,
Packit 51d0f7
			 struct nlbl_cip_lvl_a *lvls,
Packit 51d0f7
			 struct nlbl_cip_cat_a *cats);
Packit 51d0f7
int nlbl_cipso_add_pass(struct nlbl_handle *hndl,
Packit 51d0f7
			nlbl_cip_doi doi,
Packit 51d0f7
			struct nlbl_cip_tag_a *tags);
Packit 51d0f7
int nlbl_cipso_add_local(struct nlbl_handle *hndl, nlbl_cip_doi doi);
Packit 51d0f7
int nlbl_cipso_del(struct nlbl_handle *hndl, nlbl_cip_doi doi);
Packit 51d0f7
int nlbl_cipso_list(struct nlbl_handle *hndl,
Packit 51d0f7
		    nlbl_cip_doi doi,
Packit 51d0f7
		    nlbl_cip_mtype *mtype,
Packit 51d0f7
		    struct nlbl_cip_tag_a *tags,
Packit 51d0f7
		    struct nlbl_cip_lvl_a *lvls,
Packit 51d0f7
		    struct nlbl_cip_cat_a *cats);
Packit 51d0f7
int nlbl_cipso_listall(struct nlbl_handle *hndl,
Packit 51d0f7
		       nlbl_cip_doi **dois,
Packit 51d0f7
		       nlbl_cip_mtype **mtypes);
Packit 51d0f7
/* CALIPSO Protocol */
Packit 51d0f7
int nlbl_calipso_add_pass(struct nlbl_handle *hndl,
Packit 51d0f7
			  nlbl_clp_doi doi);
Packit 51d0f7
int nlbl_calipso_del(struct nlbl_handle *hndl, nlbl_clp_doi doi);
Packit 51d0f7
int nlbl_calipso_list(struct nlbl_handle *hndl,
Packit 51d0f7
		      nlbl_clp_doi doi,
Packit 51d0f7
		      nlbl_clp_mtype *mtype);
Packit 51d0f7
int nlbl_calipso_listall(struct nlbl_handle *hndl,
Packit 51d0f7
			 nlbl_clp_doi **dois,
Packit 51d0f7
			 nlbl_clp_mtype **mtypes);
Packit 51d0f7
Packit 51d0f7
#endif