xref: /titanic_51/usr/src/uts/common/sys/tsol/label_macro.h (revision ad4023c40b055806dce2bde9ee9e87e5016b5135)
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 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_LABEL_MACRO_H
27 #define	_LABEL_MACRO_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #include <sys/types.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 /* PRIVATE ONLY TO THE LABEL LIBRARY.  DO NOT USE ELSEWHERE */
38 
39 /* Actual Binary Label Structure Definitions */
40 
41 typedef int16_t	_Classification;
42 typedef struct {
43 	union {
44 		uint8_t		class_ar[2];
45 		_Classification	class_chunk;
46 	} class_u;
47 } Classification_t;
48 
49 typedef struct {
50 	uint32_t c1;
51 	uint32_t c2;
52 	uint32_t c3;
53 	uint32_t c4;
54 	uint32_t c5;
55 	uint32_t c6;
56 	uint32_t c7;
57 	uint32_t c8;
58 } Compartments_t;
59 
60 typedef struct {
61 	uint32_t m1;
62 	uint32_t m2;
63 	uint32_t m3;
64 	uint32_t m4;
65 	uint32_t m5;
66 	uint32_t m6;
67 	uint32_t m7;
68 	uint32_t m8;
69 } Markings_t;
70 
71 typedef struct _mac_label_impl {
72 	uint8_t id;		/* Magic to say label type */
73 	uint8_t _c_len;		/* Number of Compartment words */
74 	Classification_t classification;
75 	Compartments_t compartments;
76 } _mac_label_impl_t;
77 
78 typedef _mac_label_impl_t	_blevel_impl_t,		/* compatibility */
79 				_bslabel_impl_t,	/* Sensitivity Label */
80 				_bclear_impl_t;		/* Clearance */
81 
82 typedef struct _binary_information_label_impl {	/* Information Label */
83 	_mac_label_impl_t	binformation_level;
84 	Markings_t markings;
85 } _bilabel_impl_t;
86 
87 typedef struct _binary_cmw_label_impl {		/* CMW Label */
88 	_bslabel_impl_t bcl_sensitivity_label;
89 	_bilabel_impl_t bcl_information_label;
90 } _bclabel_impl_t;
91 
92 typedef struct _binary_level_range_impl {	/* Level Range */
93 	_mac_label_impl_t lower_bound;
94 	_mac_label_impl_t upper_bound;
95 } _brange_impl_t, brange_t;
96 
97 /* Label Identifier Types */
98 
99 #define	SUN_MAC_ID	0x41	/* MAC label, legacy SUN_SL_ID */
100 #define	SUN_UCLR_ID	0x49	/* User Clearance, legacy SUN_CLR_ID */
101 
102 #define	_C_LEN		8	/* number of compartments words */
103 
104 /* m_label_t macros */
105 #define	_MTYPE(l, t) \
106 	(((_mac_label_impl_t *)(l))->id == (t))
107 
108 #define	_MSETTYPE(l, t) \
109 	(((_mac_label_impl_t *)(l))->id = (t))
110 
111 #define	_MGETTYPE(l)	(((_mac_label_impl_t *)(l))->id)
112 
113 #define	_MEQUAL(l1, l2) \
114 	(LCLASS(l1) == LCLASS(l2) && \
115 	(l1)->_comps.c1 == (l2)->_comps.c1 && \
116 	(l1)->_comps.c2 == (l2)->_comps.c2 && \
117 	(l1)->_comps.c3 == (l2)->_comps.c3 && \
118 	(l1)->_comps.c4 == (l2)->_comps.c4 && \
119 	(l1)->_comps.c5 == (l2)->_comps.c5 && \
120 	(l1)->_comps.c6 == (l2)->_comps.c6 && \
121 	(l1)->_comps.c7 == (l2)->_comps.c7 && \
122 	(l1)->_comps.c8 == (l2)->_comps.c8)
123 
124 #define	SUN_INVALID_ID	0	/* uninitialized label */
125 #define	SUN_CMW_ID	0x83	/* 104 - total bytes in CMW Label */
126 #define	SUN_SL_ID	0x41	/* 36 - total bytes in Sensitivity Label */
127 #define	SUN_SL_UN	0xF1	/* undefined Sensitivity Label */
128 #define	SUN_IL_ID	0x42	/* 68 - total bytes in Information Label */
129 #define	SUN_IL_UN	0x73	/* undefined Information Label */
130 #define	SUN_CLR_ID	0x49	/* 36 - total bytes in Clearance */
131 #define	SUN_CLR_UN	0xF9	/* undefined Clearance */
132 
133 #define	_bcl_sl		bcl_sensitivity_label
134 #define	_bcl_il		bcl_information_label
135 #define	_bslev_il	binformation_level
136 
137 #define	_lclass		classification
138 #ifdef	_BIG_ENDIAN
139 #define	LCLASS(slp)	((slp)->_lclass.class_u.class_chunk)
140 #define	LCLASS_SET(slp, l)	((slp)->_lclass.class_u.class_chunk = (l))
141 #else
142 #define	LCLASS(slp)	\
143 	((_Classification)(((slp)->_lclass.class_u.class_ar[0] << 8) | \
144 	(slp)->_lclass.class_u.class_ar[1]))
145 #define	LCLASS_SET(slp, l)	\
146 	((slp)->_lclass.class_u.class_ar[0] = (uint8_t)((l)>> 8), \
147 	(slp)->_lclass.class_u.class_ar[1] = (uint8_t)(l))
148 #endif	/* _BIG_ENDIAN */
149 #define	_comps		compartments
150 
151 #define	_iid		_bslev_il.id
152 #define	_i_c_len		_bslev_il._c_len
153 #define	_iclass		_bslev_il._lclass
154 #ifdef	_BIG_ENDIAN
155 #define	ICLASS(ilp)	((ilp)->_iclass.class_u.class_chunk)
156 #define	ICLASS_SET(ilp, l)	((ilp)->_iclass.class_u.class_chunk = (l))
157 #else
158 #define	ICLASS(ilp)	\
159 	((_Classification)(((ilp)->_iclass.class_u.class_ar[0] << 8) | \
160 	(ilp)->_iclass.class_u.class_ar[1]))
161 #define	ICLASS_SET(ilp, l)	\
162 	((ilp)->_iclass.class_u.class_ar[0] = (uint8_t)((l)>> 8), \
163 	(ilp)->_iclass.class_u.class_ar[1] = (uint8_t)(l))
164 #endif	/* _BIG_ENDIAN */
165 #define	_icomps		_bslev_il._comps
166 #define	_imarks		markings
167 
168 /* Manifest Constant Values */
169 
170 #define	LOW_CLASS	0	/* Admin_Low classification value */
171 #define	HIGH_CLASS	0x7FFF	/* Admin_High classification value */
172 #define	EMPTY_SET	0	/* Empty compartments and markings set */
173 #define	UNIVERSAL_SET	0xFFFFFFFFU	/* Universal compartments and */
174 					/* markings set */
175 
176 /* Construct initial labels */
177 
178 #define	_LOW_LABEL(l, t) \
179 	((l)->id = t, (l)->_c_len = _C_LEN, LCLASS_SET(l, LOW_CLASS), \
180 	(l)->_comps.c1 = (l)->_comps.c2 = (l)->_comps.c3 = (l)->_comps.c4 = \
181 	(l)->_comps.c5 = (l)->_comps.c6 = (l)->_comps.c7 = (l)->_comps.c8 = \
182 	EMPTY_SET)
183 
184 #define	_HIGH_LABEL(l, t) \
185 	((l)->id = t, (l)->_c_len = _C_LEN, LCLASS_SET(l, HIGH_CLASS), \
186 	(l)->_comps.c1 = (l)->_comps.c2 = (l)->_comps.c3 = (l)->_comps.c4 = \
187 	(l)->_comps.c5 = (l)->_comps.c6 = (l)->_comps.c7 = (l)->_comps.c8 = \
188 	UNIVERSAL_SET)
189 
190 /* Macro equivalents */
191 
192 /* Is this memory a properly formatted label of type t? */
193 #define	BLTYPE(l, t) \
194 	((t) == SUN_CMW_ID ? \
195 	(((_bclabel_impl_t *)(l))->_bcl_sl.id == SUN_SL_ID || \
196 	((_bclabel_impl_t *)(l))->_bcl_sl.id == SUN_SL_UN) && \
197 	(((_bclabel_impl_t *)(l))->_bcl_il._iid == SUN_IL_ID || \
198 	((_bclabel_impl_t *)(l))->_bcl_il._iid == SUN_IL_UN) : \
199 	((_mac_label_impl_t *)(l))->id == (t))
200 
201 /* Are the levels of these labels equal? */
202 #define	BLEQUAL(l1, l2) \
203 	_BLEQUAL((_mac_label_impl_t *)(l1), (_mac_label_impl_t *)(l2))
204 
205 #define	_BLEQUAL(l1, l2) \
206 	(LCLASS(l1) == LCLASS(l2) && \
207 	(l1)->_comps.c1 == (l2)->_comps.c1 && \
208 	(l1)->_comps.c2 == (l2)->_comps.c2 && \
209 	(l1)->_comps.c3 == (l2)->_comps.c3 && \
210 	(l1)->_comps.c4 == (l2)->_comps.c4 && \
211 	(l1)->_comps.c5 == (l2)->_comps.c5 && \
212 	(l1)->_comps.c6 == (l2)->_comps.c6 && \
213 	(l1)->_comps.c7 == (l2)->_comps.c7 && \
214 	(l1)->_comps.c8 == (l2)->_comps.c8)
215 
216 /* Does the level of l1 dominate that of l2? */
217 #define	BLDOMINATES(l1, l2) \
218 	_BLDOMINATES((_mac_label_impl_t *)(l1), (_mac_label_impl_t *)(l2))
219 
220 #define	_BLDOMINATES(l1, l2) (LCLASS(l1) >= LCLASS(l2) && \
221 	(l2)->_comps.c1 == ((l1)->_comps.c1 & (l2)->_comps.c1) && \
222 	(l2)->_comps.c2 == ((l1)->_comps.c2 & (l2)->_comps.c2) && \
223 	(l2)->_comps.c3 == ((l1)->_comps.c3 & (l2)->_comps.c3) && \
224 	(l2)->_comps.c4 == ((l1)->_comps.c4 & (l2)->_comps.c4) && \
225 	(l2)->_comps.c5 == ((l1)->_comps.c5 & (l2)->_comps.c5) && \
226 	(l2)->_comps.c6 == ((l1)->_comps.c6 & (l2)->_comps.c6) && \
227 	(l2)->_comps.c7 == ((l1)->_comps.c7 & (l2)->_comps.c7) && \
228 	(l2)->_comps.c8 == ((l1)->_comps.c8 & (l2)->_comps.c8))
229 
230 /* Does the level of l1 strictly dominate that of l2? */
231 #define	BLSTRICTDOM(l1, l2) (!BLEQUAL(l1, l2) && BLDOMINATES(l1, l2))
232 
233 /* Is the level of l within the range r? */
234 #define	BLINRANGE(l, r)\
235 	(BLDOMINATES((l), &((r)->lower_bound)) && \
236 	BLDOMINATES(&((r)->upper_bound), (l)))
237 
238 /* Least Upper Bound level l1 and l2 replacing l1 with the result. */
239 #define	BLMAXIMUM(l1, l2) \
240 	_BLMAXIMUM((_mac_label_impl_t *)(l1), (_mac_label_impl_t *)(l2))
241 
242 #define	_BLMAXIMUM(l1, l2)\
243 	(((l1)->_lclass = (LCLASS(l1) < LCLASS(l2)) ? \
244 	(l2)->_lclass : (l1)->_lclass), \
245 	(l1)->_comps.c1 |= (l2)->_comps.c1, \
246 	(l1)->_comps.c2 |= (l2)->_comps.c2, \
247 	(l1)->_comps.c3 |= (l2)->_comps.c3, \
248 	(l1)->_comps.c4 |= (l2)->_comps.c4, \
249 	(l1)->_comps.c5 |= (l2)->_comps.c5, \
250 	(l1)->_comps.c6 |= (l2)->_comps.c6, \
251 	(l1)->_comps.c7 |= (l2)->_comps.c7, \
252 	(l1)->_comps.c8 |= (l2)->_comps.c8)
253 
254 /* Greatest Lower Bound level l1 and l2 replacing l1 with the result. */
255 #define	BLMINIMUM(l1, l2) \
256 	_BLMINIMUM((_mac_label_impl_t *)(l1), (_mac_label_impl_t *)(l2))
257 
258 #define	_BLMINIMUM(l1, l2)\
259 	(((l1)->_lclass = (LCLASS(l1) > LCLASS(l2)) ? \
260 	(l2)->_lclass : (l1)->_lclass), \
261 	(l1)->_comps.c1 &= (l2)->_comps.c1, \
262 	(l1)->_comps.c2 &= (l2)->_comps.c2, \
263 	(l1)->_comps.c3 &= (l2)->_comps.c3, \
264 	(l1)->_comps.c4 &= (l2)->_comps.c4, \
265 	(l1)->_comps.c5 &= (l2)->_comps.c5, \
266 	(l1)->_comps.c6 &= (l2)->_comps.c6, \
267 	(l1)->_comps.c7 &= (l2)->_comps.c7, \
268 	(l1)->_comps.c8 &= (l2)->_comps.c8)
269 
270 /* Create Manifest Labels */
271 
272 /* Write a System_Low CMW Label into this memory. */
273 #define	BCLLOW(l) (BSLLOW(BCLTOSL(l)), BILLOW(BCLTOIL(l)))
274 
275 /* Write a System_Low Sensitivity Label into this memory. */
276 #define	BSLLOW(l) _BSLLOW((_bslabel_impl_t *)(l))
277 
278 #define	_BSLLOW(l) \
279 	((l)->id = SUN_SL_ID, (l)->_c_len = _C_LEN, LCLASS_SET(l, LOW_CLASS), \
280 	(l)->_comps.c1 = (l)->_comps.c2 = (l)->_comps.c3 = (l)->_comps.c4 = \
281 	(l)->_comps.c5 = (l)->_comps.c6 = (l)->_comps.c7 = (l)->_comps.c8 = \
282 	EMPTY_SET)
283 
284 /* Write a System_High Sensitivity Label into this memory. */
285 #define	BSLHIGH(l) _BSLHIGH((_bslabel_impl_t *)(l))
286 
287 #define	_BSLHIGH(l) \
288 	((l)->id = SUN_SL_ID, (l)->_c_len = _C_LEN, LCLASS_SET(l, HIGH_CLASS), \
289 	(l)->_comps.c1 = (l)->_comps.c2 = (l)->_comps.c3 = (l)->_comps.c4 = \
290 	(l)->_comps.c5 = (l)->_comps.c6 = (l)->_comps.c7 = (l)->_comps.c8 = \
291 	UNIVERSAL_SET)
292 
293 /* Write a System_Low Information Label into this memory. */
294 #define	BILLOW(l) _BILLOW((_bilabel_impl_t *)(l))
295 
296 #define	_BILLOW(l) \
297 	((l)->_iid = SUN_IL_ID, (l)->_i_c_len = _C_LEN, \
298 	ICLASS_SET(l, LOW_CLASS), \
299 	(l)->_icomps.c1 = (l)->_icomps.c2 = (l)->_icomps.c3 = \
300 	(l)->_icomps.c4 = (l)->_icomps.c5 = (l)->_icomps.c6 = \
301 	(l)->_icomps.c7 = (l)->_icomps.c8 = EMPTY_SET, \
302 	(l)->_imarks.m1 = (l)->_imarks.m2 = (l)->_imarks.m3 = \
303 	(l)->_imarks.m4 = (l)->_imarks.m5 = (l)->_imarks.m6 = \
304 	(l)->_imarks.m7 = (l)->_imarks.m8 = EMPTY_SET)
305 
306 
307 /* Write a System_Low Sensitivity Label into this memory. */
308 #define	BCLEARLOW(l) _BCLEARLOW((_bclear_impl_t *)(l))
309 
310 #define	_BCLEARLOW(c) \
311 	((c)->id = SUN_CLR_ID, (c)->_c_len = _C_LEN, \
312 	LCLASS_SET(c, LOW_CLASS), \
313 	(c)->_comps.c1 = (c)->_comps.c2 = (c)->_comps.c3 = (c)->_comps.c4 = \
314 	(c)->_comps.c5 = (c)->_comps.c6 = (c)->_comps.c7 = (c)->_comps.c8 = \
315 	EMPTY_SET)
316 
317 /* Write a System_High Sensitivity Label into this memory. */
318 #define	BCLEARHIGH(l) _BCLEARHIGH((_bclear_impl_t *)(l))
319 
320 #define	_BCLEARHIGH(c) \
321 	((c)->id = SUN_CLR_ID, (c)->_c_len = _C_LEN, \
322 	LCLASS_SET(c, HIGH_CLASS), \
323 	(c)->_comps.c1 = (c)->_comps.c2 = (c)->_comps.c3 = (c)->_comps.c4 = \
324 	(c)->_comps.c5 = (c)->_comps.c6 = (c)->_comps.c7 = (c)->_comps.c8 = \
325 	UNIVERSAL_SET)
326 
327 /* Write an undefined Sensitivity Label into this memory. */
328 #define	BSLUNDEF(l) (((_bslabel_impl_t *)(l))->id = SUN_SL_UN)
329 
330 /* Write an undefined Clearance into this memory. */
331 #define	BCLEARUNDEF(c) (((_bclear_impl_t *)(c))->id = SUN_CLR_UN)
332 
333 /* Retrieve the Sensitivity Label portion of a CMW Label */
334 #define	BCLTOSL(l) ((bslabel_t *)&((_bclabel_impl_t *)(l))->_bcl_sl)
335 
336 /* Retrieve the Information Label portion of a CMW Label */
337 #define	BCLTOIL(l) ((_bilabel_impl_t *)&((_bclabel_impl_t *)(l))->_bcl_il)
338 
339 /* Copy the Sensitivity Label portion from a CMW Label */
340 #define	GETCSL(l1, l2) \
341 	(*((_bslabel_impl_t *)(l1)) = ((_bclabel_impl_t *)(l2))->_bcl_sl)
342 
343 /* Replace the Sensitivity Label portion of a CMW Label */
344 #define	SETCSL(l1, l2) \
345 	(((_bclabel_impl_t *)(l1))->_bcl_sl = *((_bslabel_impl_t *)(l2)))
346 
347 /* Set type of this memory to the label type 't' */
348 #define	SETBLTYPE(l, t) (((_bclabel_impl_t *)(l))->_bcl_sl.id = (t))
349 
350 #define	GETBLTYPE(l)	(((const _bclabel_impl_t *)(l))->_bcl_sl.id)
351 
352 #ifdef	__cplusplus
353 }
354 #endif
355 
356 #endif	/* !_LABEL_MACRO_H */
357