| /* |
| * 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 2006 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 <sys/tsol/label.h> |
| #include <sys/tsol/label_macro.h> |
| |
| |
| /* |
| * 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 (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); |
| } |