Home | History | Annotate | Download | only in tsol
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     27 
     28 /*
     29  *	bl.c - Binary label operations for kernel and user.
     30  *
     31  *		These routines initialize, compare, set and extract portions
     32  *	of binary labels.
     33  */
     34 
     35 #include <sys/tsol/label.h>
     36 #include <sys/tsol/label_macro.h>
     37 
     38 
     39 /*
     40  *	bltype - Check the type of a label structure.
     41  *
     42  *	Entry	label = Address of the label to check.
     43  *		type = Label type to check:
     44  *			SUN_SL_ID = Sensitivity Label,
     45  *			SUN_SL_UN = Undefined Sensitivity Label structure,
     46  *			SUN_IL_ID = Information Label,
     47  *			SUN_IL_UN = Undefined Information Label structure,
     48  *			SUN_CLR_ID = Clearance, or
     49  *			SUN_CLR_UN = Undefined Clearance structure.
     50  *
     51  *	Exit	None.
     52  *
     53  *	Returns	True if the label is the type requested,
     54  *			otherwise false.
     55  *
     56  *	Calls	BLTYPE.
     57  */
     58 
     59 int
     60 bltype(const void *label, uint8_t type)
     61 {
     62 
     63 	return (BLTYPE(label, type));
     64 }
     65 
     66 
     67 /*
     68  *	blequal - Compare two labels for Classification and Compartments set
     69  *			equality.
     70  *
     71  *	Entry	label1, label2 = label levels to compare.
     72  *
     73  *	Exit	None.
     74  *
     75  *	Returns	True if labels equal,
     76  *			otherwise false.
     77  *
     78  *	Calls	BLEQUAL.
     79  */
     80 
     81 int
     82 blequal(const m_label_t *label1, const m_label_t *label2)
     83 {
     84 
     85 	return (BLEQUAL(label1, label2));
     86 }
     87 
     88 
     89 /*
     90  *	bldominates - Compare two labels for Classification and Compartments
     91  *			sets dominance.
     92  *
     93  *	Entry	label1, label2 = labels levels to compare.
     94  *
     95  *	Exit	None.
     96  *
     97  *	Returns	True if label1 dominates label2,
     98  *			otherwise false.
     99  *
    100  *	Calls	BLDOMINATES.
    101  */
    102 
    103 int
    104 bldominates(const m_label_t *label1, const m_label_t *label2)
    105 {
    106 
    107 	return (BLDOMINATES(label1, label2));
    108 }
    109 
    110 
    111 /*
    112  *	blstrictdom - Compare two labels for Classification and Compartments
    113  *			sets strict dominance.
    114  *
    115  *	Entry	label1, label2 = labels levels to compare.
    116  *
    117  *	Exit	None.
    118  *
    119  *	Returns	True if label1 dominates and is not equal to label2,
    120  *			otherwise false.
    121  *
    122  *	Calls	BLSTRICTDOM.
    123  */
    124 
    125 int
    126 blstrictdom(const m_label_t *label1, const m_label_t *label2)
    127 {
    128 
    129 	return (BLSTRICTDOM(label1, label2));
    130 }
    131 
    132 
    133 /*
    134  *	blinrange - Compare a label's classification and compartments set to
    135  *		    be within a lower and upper bound (range).
    136  *
    137  *	Entry	label = label level to compare.
    138  *		range = level range to compare against.
    139  *
    140  *	Exit	None.
    141  *
    142  *	Returns	True if label is within the range,
    143  *			otherwise false.
    144  *
    145  *	Calls BLINRANGE.
    146  */
    147 
    148 int
    149 blinrange(const m_label_t *label, const m_range_t *range)
    150 {
    151 	return (BLDOMINATES((label), ((range)->lower_bound)) &&
    152 	    BLDOMINATES(((range)->upper_bound), (label)));
    153 }
    154 
    155 /*
    156  * This is the TS8 version which is used in the kernel
    157  */
    158 
    159 int
    160 _blinrange(const m_label_t *label, const brange_t *range)
    161 {
    162 	return (BLINRANGE(label, range));
    163 }
    164 
    165 #ifdef _KERNEL
    166 /*
    167  *	blinlset - Check if the label belongs to the set
    168  *
    169  *	Entry	label = label level to compare.
    170  *		lset = label set to compare against.
    171  *
    172  *	Exit	None.
    173  *
    174  *	Returns	True if label is an element of the set,
    175  *			otherwise false.
    176  *
    177  */
    178 
    179 int
    180 blinlset(const m_label_t *label, const blset_t lset)
    181 {
    182 	int i;
    183 
    184 	for (i = 0; i < NSLS_MAX; i++) {
    185 		if (!BLTYPE(&lset[i], SUN_SL_ID))
    186 			return (B_FALSE);
    187 		if (BLEQUAL(label, &lset[i]))
    188 			return (B_TRUE);
    189 	}
    190 	return (B_FALSE);
    191 }
    192 #endif /* _KERNEL */
    193 
    194 
    195 /*
    196  *	blmaximum - Least Upper Bound of two levels.
    197  *
    198  *	Entry	label1, label2 = levels to bound.
    199  *
    200  *	Exit	label1 replaced by the LUB of label1 and label2.
    201  *
    202  *	Returns	None.
    203  *
    204  *	Calls	BLMAXIMUM.
    205  */
    206 
    207 void
    208 blmaximum(m_label_t *label1, const m_label_t *label2)
    209 {
    210 
    211 	BLMAXIMUM(label1, label2);
    212 }
    213 
    214 
    215 /*
    216  *	blminimum - Greatest Lower Bound of two levels.
    217  *
    218  *	Entry	label1, label2 = levels to bound.
    219  *
    220  *	Exit	label1 replaced by the GLB of label1 and label2.
    221  *
    222  *	Returns	None.
    223  *
    224  *	Calls	BLMINIMUM.
    225  */
    226 
    227 void
    228 blminimum(m_label_t *label1, const m_label_t *label2)
    229 {
    230 
    231 	BLMINIMUM(label1, label2);
    232 }
    233 
    234 
    235 /*
    236  *	bsllow - Initialize an admin_low Sensitivity Label.
    237  *
    238  *	Entry	label = Sensitivity Label structure to be initialized.
    239  *
    240  *	Exit	label = Initialized to the admin_low Sensitivity Label.
    241  *
    242  *	Returns	None.
    243  *
    244  *	Calls	BSLLOW.
    245  */
    246 
    247 void
    248 bsllow(bslabel_t *label)
    249 {
    250 
    251 	BSLLOW(label);
    252 }
    253 
    254 
    255 /*
    256  *	bslhigh - Initialize an admin_high Sensitivity Label.
    257  *
    258  *	Entry	label = Sensitivity Label structure to be initialized.
    259  *
    260  *	Exit	label = Initialized to the admin_high Sensitivity Label.
    261  *
    262  *	Returns	None.
    263  *
    264  *	Calls	BSLHIGH.
    265  */
    266 
    267 void
    268 bslhigh(bslabel_t *label)
    269 {
    270 
    271 	BSLHIGH(label);
    272 }
    273 
    274 /*
    275  *	bclearlow - Initialize an admin_low Clearance.
    276  *
    277  *	Entry	clearance = Clearnace structure to be initialized.
    278  *
    279  *	Exit	clearance = Initialized to the admin_low Clearance.
    280  *
    281  *	Returns	None.
    282  *
    283  *	Calls	BCLEARLOW.
    284  */
    285 
    286 void
    287 bclearlow(bclear_t *clearance)
    288 {
    289 
    290 	BCLEARLOW(clearance);
    291 }
    292 
    293 
    294 /*
    295  *	bclearhigh - Initialize an admin_high Clearance.
    296  *
    297  *	Entry	clearance = Clearance structure to be initialized.
    298  *
    299  *	Exit	clearance = Initialized to the admin_high Clearance.
    300  *
    301  *	Returns	None.
    302  *
    303  *	Calls	BCLEARHIGH.
    304  */
    305 
    306 void
    307 bclearhigh(bclear_t *clearance)
    308 {
    309 
    310 	BCLEARHIGH(clearance);
    311 }
    312 
    313 /*
    314  *	bslundef - Initialize an undefined Sensitivity Label.
    315  *
    316  *	Entry	label = Sensitivity Label structure to be initialized.
    317  *
    318  *	Exit	label = Initialized to undefined Sensitivity Label.
    319  *
    320  *	Returns	None.
    321  *
    322  *	Calls	BSLUNDEF.
    323  */
    324 
    325 void
    326 bslundef(bslabel_t *label)
    327 {
    328 
    329 	BSLUNDEF(label);
    330 }
    331 
    332 
    333 /*
    334  *	bclearundef - Initialize an undefined Clearance.
    335  *
    336  *	Entry	clearance = Clearance structure to be initialized.
    337  *
    338  *	Exit	clearance = Initialized to undefined Clearance.
    339  *
    340  *	Returns	None.
    341  *
    342  *	Calls	BCLEARUNDEF.
    343  */
    344 
    345 void
    346 bclearundef(bclear_t *clearance)
    347 {
    348 
    349 	BCLEARUNDEF(clearance);
    350 }
    351 
    352 
    353 /*
    354  *	setbltype - Set the type of a label structure.
    355  *
    356  *	Entry	label = Address of the label to set.
    357  *		type = Label type to set:
    358  *			SUN_SL_ID = Sensitivity Label,
    359  *			SUN_SL_UN = Undefined Sensitivity Label structure,
    360  *			SUN_IL_ID = Information Label,
    361  *			SUN_IL_UN = Undefined Information Label structure,
    362  *			SUN_CLR_ID = Clearance, or
    363  *			SUN_CLR_UN = Undefined Clearance structure.
    364  *
    365  *	Exit	label = Type set to specified type.
    366  *
    367  *	Returns	None.
    368  *
    369  *	Calls	SETBLTYPE.
    370  */
    371 
    372 void
    373 setbltype(void *label, uint8_t type)
    374 {
    375 
    376 	SETBLTYPE(label, type);
    377 }
    378 
    379 /*
    380  * Returns B_TRUE if the label is invalid (initialized to all zeros).
    381  */
    382 boolean_t
    383 bisinvalid(const void *label)
    384 {
    385 	return (GETBLTYPE(label) == SUN_INVALID_ID);
    386 }
    387