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