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