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