1255e72915d4cbddceb435e13d81601755714e9fSE Android
2255e72915d4cbddceb435e13d81601755714e9fSE Android/* Author : Stephen Smalley, <sds@epoch.ncsc.mil> */
3255e72915d4cbddceb435e13d81601755714e9fSE Android/*
4255e72915d4cbddceb435e13d81601755714e9fSE Android * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
5255e72915d4cbddceb435e13d81601755714e9fSE Android *
6255e72915d4cbddceb435e13d81601755714e9fSE Android *	Support for enhanced MLS infrastructure.
7255e72915d4cbddceb435e13d81601755714e9fSE Android *
8255e72915d4cbddceb435e13d81601755714e9fSE Android * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
9255e72915d4cbddceb435e13d81601755714e9fSE Android *
10255e72915d4cbddceb435e13d81601755714e9fSE Android *  This library is free software; you can redistribute it and/or
11255e72915d4cbddceb435e13d81601755714e9fSE Android *  modify it under the terms of the GNU Lesser General Public
12255e72915d4cbddceb435e13d81601755714e9fSE Android *  License as published by the Free Software Foundation; either
13255e72915d4cbddceb435e13d81601755714e9fSE Android *  version 2.1 of the License, or (at your option) any later version.
14255e72915d4cbddceb435e13d81601755714e9fSE Android *
15255e72915d4cbddceb435e13d81601755714e9fSE Android *  This library is distributed in the hope that it will be useful,
16255e72915d4cbddceb435e13d81601755714e9fSE Android *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17255e72915d4cbddceb435e13d81601755714e9fSE Android *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18255e72915d4cbddceb435e13d81601755714e9fSE Android *  Lesser General Public License for more details.
19255e72915d4cbddceb435e13d81601755714e9fSE Android *
20255e72915d4cbddceb435e13d81601755714e9fSE Android *  You should have received a copy of the GNU Lesser General Public
21255e72915d4cbddceb435e13d81601755714e9fSE Android *  License along with this library; if not, write to the Free Software
22255e72915d4cbddceb435e13d81601755714e9fSE Android *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23255e72915d4cbddceb435e13d81601755714e9fSE Android */
24255e72915d4cbddceb435e13d81601755714e9fSE Android
25255e72915d4cbddceb435e13d81601755714e9fSE Android/* FLASK */
26255e72915d4cbddceb435e13d81601755714e9fSE Android
27255e72915d4cbddceb435e13d81601755714e9fSE Android/*
28255e72915d4cbddceb435e13d81601755714e9fSE Android * Type definitions for the multi-level security (MLS) policy.
29255e72915d4cbddceb435e13d81601755714e9fSE Android */
30255e72915d4cbddceb435e13d81601755714e9fSE Android
31255e72915d4cbddceb435e13d81601755714e9fSE Android#ifndef _SEPOL_POLICYDB_MLS_TYPES_H_
32255e72915d4cbddceb435e13d81601755714e9fSE Android#define _SEPOL_POLICYDB_MLS_TYPES_H_
33255e72915d4cbddceb435e13d81601755714e9fSE Android
34255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdint.h>
35255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdlib.h>
36255e72915d4cbddceb435e13d81601755714e9fSE Android#include <sepol/policydb/ebitmap.h>
37255e72915d4cbddceb435e13d81601755714e9fSE Android#include <sepol/policydb/flask_types.h>
38255e72915d4cbddceb435e13d81601755714e9fSE Android
39255e72915d4cbddceb435e13d81601755714e9fSE Androidtypedef struct mls_level {
40255e72915d4cbddceb435e13d81601755714e9fSE Android	uint32_t sens;		/* sensitivity */
41255e72915d4cbddceb435e13d81601755714e9fSE Android	ebitmap_t cat;		/* category set */
42255e72915d4cbddceb435e13d81601755714e9fSE Android} mls_level_t;
43255e72915d4cbddceb435e13d81601755714e9fSE Android
44255e72915d4cbddceb435e13d81601755714e9fSE Androidtypedef struct mls_range {
45255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_t level[2];	/* low == level[0], high == level[1] */
46255e72915d4cbddceb435e13d81601755714e9fSE Android} mls_range_t;
47255e72915d4cbddceb435e13d81601755714e9fSE Android
48255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline int mls_level_cpy(struct mls_level *dst, struct mls_level *src)
49255e72915d4cbddceb435e13d81601755714e9fSE Android{
50255e72915d4cbddceb435e13d81601755714e9fSE Android
51255e72915d4cbddceb435e13d81601755714e9fSE Android	dst->sens = src->sens;
52255e72915d4cbddceb435e13d81601755714e9fSE Android	if (ebitmap_cpy(&dst->cat, &src->cat) < 0)
53255e72915d4cbddceb435e13d81601755714e9fSE Android		return -1;
54255e72915d4cbddceb435e13d81601755714e9fSE Android	return 0;
55255e72915d4cbddceb435e13d81601755714e9fSE Android}
56255e72915d4cbddceb435e13d81601755714e9fSE Android
57255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline void mls_level_init(struct mls_level *level)
58255e72915d4cbddceb435e13d81601755714e9fSE Android{
59255e72915d4cbddceb435e13d81601755714e9fSE Android
60255e72915d4cbddceb435e13d81601755714e9fSE Android	memset(level, 0, sizeof(mls_level_t));
61255e72915d4cbddceb435e13d81601755714e9fSE Android}
62255e72915d4cbddceb435e13d81601755714e9fSE Android
63255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline void mls_level_destroy(struct mls_level *level)
64255e72915d4cbddceb435e13d81601755714e9fSE Android{
65255e72915d4cbddceb435e13d81601755714e9fSE Android
66255e72915d4cbddceb435e13d81601755714e9fSE Android	if (level == NULL)
67255e72915d4cbddceb435e13d81601755714e9fSE Android		return;
68255e72915d4cbddceb435e13d81601755714e9fSE Android
69255e72915d4cbddceb435e13d81601755714e9fSE Android	ebitmap_destroy(&level->cat);
70255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_init(level);
71255e72915d4cbddceb435e13d81601755714e9fSE Android}
72255e72915d4cbddceb435e13d81601755714e9fSE Android
73255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline int mls_level_eq(const struct mls_level *l1, const struct mls_level *l2)
74255e72915d4cbddceb435e13d81601755714e9fSE Android{
75255e72915d4cbddceb435e13d81601755714e9fSE Android	return ((l1->sens == l2->sens) && ebitmap_cmp(&l1->cat, &l2->cat));
76255e72915d4cbddceb435e13d81601755714e9fSE Android}
77255e72915d4cbddceb435e13d81601755714e9fSE Android
78255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline int mls_level_dom(const struct mls_level *l1, const struct mls_level *l2)
79255e72915d4cbddceb435e13d81601755714e9fSE Android{
80255e72915d4cbddceb435e13d81601755714e9fSE Android	return ((l1->sens >= l2->sens) && ebitmap_contains(&l1->cat, &l2->cat));
81255e72915d4cbddceb435e13d81601755714e9fSE Android}
82255e72915d4cbddceb435e13d81601755714e9fSE Android
83255e72915d4cbddceb435e13d81601755714e9fSE Android#define mls_level_incomp(l1, l2) \
84255e72915d4cbddceb435e13d81601755714e9fSE Android(!mls_level_dom((l1), (l2)) && !mls_level_dom((l2), (l1)))
85255e72915d4cbddceb435e13d81601755714e9fSE Android
86255e72915d4cbddceb435e13d81601755714e9fSE Android#define mls_level_between(l1, l2, l3) \
87255e72915d4cbddceb435e13d81601755714e9fSE Android(mls_level_dom((l1), (l2)) && mls_level_dom((l3), (l1)))
88255e72915d4cbddceb435e13d81601755714e9fSE Android
89255e72915d4cbddceb435e13d81601755714e9fSE Android#define mls_range_contains(r1, r2) \
90255e72915d4cbddceb435e13d81601755714e9fSE Android(mls_level_dom(&(r2).level[0], &(r1).level[0]) && \
91255e72915d4cbddceb435e13d81601755714e9fSE Android mls_level_dom(&(r1).level[1], &(r2).level[1]))
92255e72915d4cbddceb435e13d81601755714e9fSE Android
93255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline int mls_range_cpy(mls_range_t * dst, mls_range_t * src)
94255e72915d4cbddceb435e13d81601755714e9fSE Android{
95255e72915d4cbddceb435e13d81601755714e9fSE Android
96255e72915d4cbddceb435e13d81601755714e9fSE Android	if (mls_level_cpy(&dst->level[0], &src->level[0]) < 0)
97255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err;
98255e72915d4cbddceb435e13d81601755714e9fSE Android
99255e72915d4cbddceb435e13d81601755714e9fSE Android	if (mls_level_cpy(&dst->level[1], &src->level[1]) < 0)
100255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err_destroy;
101255e72915d4cbddceb435e13d81601755714e9fSE Android
102255e72915d4cbddceb435e13d81601755714e9fSE Android	return 0;
103255e72915d4cbddceb435e13d81601755714e9fSE Android
104255e72915d4cbddceb435e13d81601755714e9fSE Android      err_destroy:
105255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_destroy(&dst->level[0]);
106255e72915d4cbddceb435e13d81601755714e9fSE Android
107255e72915d4cbddceb435e13d81601755714e9fSE Android      err:
108255e72915d4cbddceb435e13d81601755714e9fSE Android	return -1;
109255e72915d4cbddceb435e13d81601755714e9fSE Android}
110255e72915d4cbddceb435e13d81601755714e9fSE Android
111255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline void mls_range_init(struct mls_range *r)
112255e72915d4cbddceb435e13d81601755714e9fSE Android{
113255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_init(&r->level[0]);
114255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_init(&r->level[1]);
115255e72915d4cbddceb435e13d81601755714e9fSE Android}
116255e72915d4cbddceb435e13d81601755714e9fSE Android
117255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline void mls_range_destroy(struct mls_range *r)
118255e72915d4cbddceb435e13d81601755714e9fSE Android{
119255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_destroy(&r->level[0]);
120255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_level_destroy(&r->level[1]);
121255e72915d4cbddceb435e13d81601755714e9fSE Android}
122255e72915d4cbddceb435e13d81601755714e9fSE Android
123255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic inline int mls_range_eq(struct mls_range *r1, struct mls_range *r2)
124255e72915d4cbddceb435e13d81601755714e9fSE Android{
125255e72915d4cbddceb435e13d81601755714e9fSE Android	return (mls_level_eq(&r1->level[0], &r2->level[0]) &&
126255e72915d4cbddceb435e13d81601755714e9fSE Android	        mls_level_eq(&r1->level[1], &r2->level[1]));
127255e72915d4cbddceb435e13d81601755714e9fSE Android}
128255e72915d4cbddceb435e13d81601755714e9fSE Android
129255e72915d4cbddceb435e13d81601755714e9fSE Androidtypedef struct mls_semantic_cat {
130255e72915d4cbddceb435e13d81601755714e9fSE Android	uint32_t low;	/* first bit this struct represents */
131255e72915d4cbddceb435e13d81601755714e9fSE Android	uint32_t high;	/* last bit represented - equals low for a single cat */
132255e72915d4cbddceb435e13d81601755714e9fSE Android	struct mls_semantic_cat *next;
133255e72915d4cbddceb435e13d81601755714e9fSE Android} mls_semantic_cat_t;
134255e72915d4cbddceb435e13d81601755714e9fSE Android
135255e72915d4cbddceb435e13d81601755714e9fSE Androidtypedef struct mls_semantic_level {
136255e72915d4cbddceb435e13d81601755714e9fSE Android	uint32_t sens;
137255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_semantic_cat_t *cat;
138255e72915d4cbddceb435e13d81601755714e9fSE Android} mls_semantic_level_t;
139255e72915d4cbddceb435e13d81601755714e9fSE Android
140255e72915d4cbddceb435e13d81601755714e9fSE Androidtypedef struct mls_semantic_range {
141255e72915d4cbddceb435e13d81601755714e9fSE Android	mls_semantic_level_t level[2];
142255e72915d4cbddceb435e13d81601755714e9fSE Android} mls_semantic_range_t;
143255e72915d4cbddceb435e13d81601755714e9fSE Android
144255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void mls_semantic_cat_init(mls_semantic_cat_t *c);
145255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void mls_semantic_cat_destroy(mls_semantic_cat_t *c);
146255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void mls_semantic_level_init(mls_semantic_level_t *l);
147255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void mls_semantic_level_destroy(mls_semantic_level_t *l);
148255e72915d4cbddceb435e13d81601755714e9fSE Androidextern int mls_semantic_level_cpy(mls_semantic_level_t *dst, mls_semantic_level_t *src);
149255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void mls_semantic_range_init(mls_semantic_range_t *r);
150255e72915d4cbddceb435e13d81601755714e9fSE Androidextern void mls_semantic_range_destroy(mls_semantic_range_t *r);
151255e72915d4cbddceb435e13d81601755714e9fSE Androidextern int mls_semantic_range_cpy(mls_semantic_range_t *dst, mls_semantic_range_t *src);
152255e72915d4cbddceb435e13d81601755714e9fSE Android
153255e72915d4cbddceb435e13d81601755714e9fSE Android#endif
154