/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" /* * bl.c - Binary label operations for kernel and user. * * These routines initialize, compare, set and extract portions * of binary labels. */ #include #include /* * bltype - Check the type of a label structure. * * Entry label = Address of the label to check. * type = Label type to check: * SUN_SL_ID = Sensitivity Label, * SUN_SL_UN = Undefined Sensitivity Label structure, * SUN_IL_ID = Information Label, * SUN_IL_UN = Undefined Information Label structure, * SUN_CLR_ID = Clearance, or * SUN_CLR_UN = Undefined Clearance structure. * * Exit None. * * Returns True if the label is the type requested, * otherwise false. * * Calls BLTYPE. */ int bltype(const void *label, uint8_t type) { return (BLTYPE(label, type)); } /* * blequal - Compare two labels for Classification and Compartments set * equality. * * Entry label1, label2 = label levels to compare. * * Exit None. * * Returns True if labels equal, * otherwise false. * * Calls BLEQUAL. */ int blequal(const m_label_t *label1, const m_label_t *label2) { return (BLEQUAL(label1, label2)); } /* * bldominates - Compare two labels for Classification and Compartments * sets dominance. * * Entry label1, label2 = labels levels to compare. * * Exit None. * * Returns True if label1 dominates label2, * otherwise false. * * Calls BLDOMINATES. */ int bldominates(const m_label_t *label1, const m_label_t *label2) { return (BLDOMINATES(label1, label2)); } /* * blstrictdom - Compare two labels for Classification and Compartments * sets strict dominance. * * Entry label1, label2 = labels levels to compare. * * Exit None. * * Returns True if label1 dominates and is not equal to label2, * otherwise false. * * Calls BLSTRICTDOM. */ int blstrictdom(const m_label_t *label1, const m_label_t *label2) { return (BLSTRICTDOM(label1, label2)); } /* * blinrange - Compare a label's classification and compartments set to * be within a lower and upper bound (range). * * Entry label = label level to compare. * range = level range to compare against. * * Exit None. * * Returns True if label is within the range, * otherwise false. * * Calls BLINRANGE. */ int blinrange(const m_label_t *label, const m_range_t *range) { return (BLDOMINATES((label), ((range)->lower_bound)) && BLDOMINATES(((range)->upper_bound), (label))); } /* * This is the TS8 version which is used in the kernel */ int _blinrange(const m_label_t *label, const brange_t *range) { return (BLINRANGE(label, range)); } #ifdef _KERNEL /* * blinlset - Check if the label belongs to the set * * Entry label = label level to compare. * lset = label set to compare against. * * Exit None. * * Returns True if label is an element of the set, * otherwise false. * */ int blinlset(const m_label_t *label, const blset_t lset) { int i; for (i = 0; i < NSLS_MAX; i++) { if (!BLTYPE(&lset[i], SUN_SL_ID)) return (B_FALSE); if (BLEQUAL(label, &lset[i])) return (B_TRUE); } return (B_FALSE); } #endif /* _KERNEL */ /* * blmaximum - Least Upper Bound of two levels. * * Entry label1, label2 = levels to bound. * * Exit label1 replaced by the LUB of label1 and label2. * * Returns None. * * Calls BLMAXIMUM. */ void blmaximum(m_label_t *label1, const m_label_t *label2) { BLMAXIMUM(label1, label2); } /* * blminimum - Greatest Lower Bound of two levels. * * Entry label1, label2 = levels to bound. * * Exit label1 replaced by the GLB of label1 and label2. * * Returns None. * * Calls BLMINIMUM. */ void blminimum(m_label_t *label1, const m_label_t *label2) { BLMINIMUM(label1, label2); } /* * bsllow - Initialize an admin_low Sensitivity Label. * * Entry label = Sensitivity Label structure to be initialized. * * Exit label = Initialized to the admin_low Sensitivity Label. * * Returns None. * * Calls BSLLOW. */ void bsllow(bslabel_t *label) { BSLLOW(label); } /* * bslhigh - Initialize an admin_high Sensitivity Label. * * Entry label = Sensitivity Label structure to be initialized. * * Exit label = Initialized to the admin_high Sensitivity Label. * * Returns None. * * Calls BSLHIGH. */ void bslhigh(bslabel_t *label) { BSLHIGH(label); } /* * bclearlow - Initialize an admin_low Clearance. * * Entry clearance = Clearnace structure to be initialized. * * Exit clearance = Initialized to the admin_low Clearance. * * Returns None. * * Calls BCLEARLOW. */ void bclearlow(bclear_t *clearance) { BCLEARLOW(clearance); } /* * bclearhigh - Initialize an admin_high Clearance. * * Entry clearance = Clearance structure to be initialized. * * Exit clearance = Initialized to the admin_high Clearance. * * Returns None. * * Calls BCLEARHIGH. */ void bclearhigh(bclear_t *clearance) { BCLEARHIGH(clearance); } /* * bslundef - Initialize an undefined Sensitivity Label. * * Entry label = Sensitivity Label structure to be initialized. * * Exit label = Initialized to undefined Sensitivity Label. * * Returns None. * * Calls BSLUNDEF. */ void bslundef(bslabel_t *label) { BSLUNDEF(label); } /* * bclearundef - Initialize an undefined Clearance. * * Entry clearance = Clearance structure to be initialized. * * Exit clearance = Initialized to undefined Clearance. * * Returns None. * * Calls BCLEARUNDEF. */ void bclearundef(bclear_t *clearance) { BCLEARUNDEF(clearance); } /* * setbltype - Set the type of a label structure. * * Entry label = Address of the label to set. * type = Label type to set: * SUN_SL_ID = Sensitivity Label, * SUN_SL_UN = Undefined Sensitivity Label structure, * SUN_IL_ID = Information Label, * SUN_IL_UN = Undefined Information Label structure, * SUN_CLR_ID = Clearance, or * SUN_CLR_UN = Undefined Clearance structure. * * Exit label = Type set to specified type. * * Returns None. * * Calls SETBLTYPE. */ void setbltype(void *label, uint8_t type) { SETBLTYPE(label, type); } /* * Returns B_TRUE if the label is invalid (initialized to all zeros). */ boolean_t bisinvalid(const void *label) { return (GETBLTYPE(label) == SUN_INVALID_ID); }