45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER START
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The contents of this file are subject to the terms of the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Common Development and Distribution License (the "License").
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You may not use this file except in compliance with the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or http://www.opensolaris.org/os/licensing.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * See the License for the specific language governing permissions
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and limitations under the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * When distributing Covered Code, include this CDDL HEADER in each
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If applicable, add the following below this CDDL HEADER, with the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fields enclosed by brackets "[]" replaced with your own identifying
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * information: Portions Copyright [yyyy] [name of copyright owner]
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER END
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
42096647a1cb1ee493b238f2713f001b8b039514Tony Nguyen * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Use is subject to license terms.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Miscellaneous user interfaces to trusted label functions.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <ctype.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdlib.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <strings.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/mman.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <tsol/label.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include "labeld.h"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include "clnt.h"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/tsol/label_macro.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <secdb.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <user_attr.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic bslabel_t slow, shigh; /* static Admin Low and High SLs */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic bclear_t clow, chigh; /* static Admin Low and High CLRs */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic char color[MAXCOLOR];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define incall callp->param.acall.cargs.inset_arg
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define inret callp->param.aret.rvals.inset_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * blinset - Check in a label set.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry label = Sensitivity Label to check.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * id = Label set identifier of set to check.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit None.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If label set unavailable, or server failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, If label not in label set.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 1, If label is in the label set.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls __call_labeld(BLINSET), BLTYPE, BSLLOW, BSLHIGH.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses slow, shigh.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkblinset(const bslabel_t *label, const set_id *id)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (id->type == SYSTEM_ACCREDITATION_RANGE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(&slow, SUN_SL_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* initialize static labels. */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BSLLOW(&slow);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BSLHIGH(&shigh);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (BLTYPE(label, SUN_SL_ID) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (BLEQUAL(label, &slow) || BLEQUAL(label, &shigh)))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (id->type == USER_ACCREDITATION_RANGE ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk id->type == SYSTEM_ACCREDITATION_RANGE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(inset_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = BLINSET;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk incall.label = *label;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk incall.type = id->type;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (__call_labeld(&callp, &bufsize, &datasize) != SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* process error */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (inret.inset);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Only System and User Accreditation Ranges presently
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * implemented.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef incall
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef inret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define slvcall callp->param.acall.cargs.slvalid_arg
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define slvret callp->param.aret.rvals.slvalid_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * bslvalid - Check Sensitivity Label for validity.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry label = Sensitivity Label to check.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit None.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If unable to access label encodings file, or server failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, If label not valid.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 1, If label is valid.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls __call_labeld(BSLVALID), BLTYPE, BSLLOW, BSLHIGH.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses slow, shigh.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkbslvalid(const bslabel_t *label)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(slvalid_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(&slow, SUN_SL_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* initialize static labels. */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BSLLOW(&slow);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BSLHIGH(&shigh);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (BLTYPE(label, SUN_SL_ID) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (BLEQUAL(label, &slow) || BLEQUAL(label, &shigh))) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = BSLVALID;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slvcall.label = *label;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (__call_labeld(&callp, &bufsize, &datasize) != SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* process error */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (slvret.valid);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef slvcall
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef slvret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define clrvcall callp->param.acall.cargs.clrvalid_arg
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define clrvret callp->param.aret.rvals.clrvalid_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * bclearvalid - Check Clearance for validity.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry clearance = Clearance to check.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit None.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If unable to access label encodings file, or server failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, If label not valid.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 1, If label is valid.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls __call_labeld(BCLEARVALID), BLTYPE, BCLEARLOW, BCLEARHIGH.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses clow, chigh.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkbclearvalid(const bclear_t *clearance)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(clrvalid_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!BLTYPE(&clow, SUN_CLR_ID)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* initialize static labels. */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BCLEARLOW(&clow);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk BCLEARHIGH(&chigh);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (BLTYPE(clearance, SUN_CLR_ID) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (BLEQUAL(clearance, &clow) || BLEQUAL(clearance, &chigh))) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = BCLEARVALID;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk clrvcall.clear = *clearance;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (__call_labeld(&callp, &bufsize, &datasize) != SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* process error */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (clrvret.valid);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef clrvcall
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef clrvret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define inforet callp->param.aret.rvals.info_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * labelinfo - Get information about the label encodings file.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry info = Address of label_info structure to update.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit info = Updated.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If unable to access label encodings file, or server failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 1, If successful.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls __call_labeld(LABELINFO).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpklabelinfo(struct label_info *info)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(info_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rval;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = LABELINFO;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((rval = __call_labeld(&callp, &bufsize, &datasize)) != SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* process error */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *info = inforet.info;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef inforet
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define lvret callp->param.aret.rvals.vers_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * labelvers - Get version string of the label encodings file.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry version = Address of string pointer to return.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * len = Length of string if pre-allocated.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit version = Updated.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns -1, If unable to access label encodings file, or server failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * 0, If unable to allocate version string,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or pre-allocated version string to short
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * (and **version = '\0').
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * length (including null) of version string, If successful.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls __call_labeld(LABELVERS)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * malloc, strlen.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkssize_t
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpklabelvers(char **version, size_t len)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(vers_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t ver_len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = LABELVERS;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (__call_labeld(&callp, &bufsize, &datasize) != SUCCESS) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* unpack length */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ver_len = strlen(lvret.vers) + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*version == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((*version = malloc(ver_len)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (ver_len > len) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk **version = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strcpy(*version, lvret.vers);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (ver_len);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* labelvers */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef lvret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define ccall callp->param.acall.cargs.color_arg
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define cret callp->param.aret.rvals.color_ret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * bltocolor - get ASCII color name of label.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry label = Sensitivity Level of color to get.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * size = Size of the color_name array.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * color_name = Storage for ASCII color name string to be returned.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit None.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns NULL, If error (label encodings file not accessible,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * invalid label, no color for this label).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Address of color_name parameter containing ASCII color name
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * defined for the label.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls __call_labeld(BLTOCOLOR), strlen.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkchar *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkbltocolor_r(const blevel_t *label, size_t size, char *color_name)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk labeld_data_t *callp = &call;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t bufsize = sizeof (labeld_data_t);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t datasize = CALL_SIZE(color_call_t, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *colorp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk call.callop = BLTOCOLOR;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ccall.label = *label;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((__call_labeld(&callp, &bufsize, &datasize) != SUCCESS) ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (callp->reterr != 0) ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strlen(cret.color) >= size)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk colorp = strcpy(color_name, cret.color);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (callp != &call)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* release return buffer */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) munmap((void *)callp, bufsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (colorp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* bltocolor_r */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef ccall
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#undef cret
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * bltocolor - get ASCII color name of label.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry label = Sensitivity Level of color to get.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit None.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns NULL, If error (label encodings file not accessible,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * invalid label, no color for this label).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Address of statically allocated string containing ASCII
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * color name defined for the classification contained
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * in label.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Uses color.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Calls bltocolor_r.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkchar *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkbltocolor(const blevel_t *label)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (bltocolor_r(label, sizeof (color), color));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} /* bltocolor */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkblevel_t *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkblabel_alloc(void)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (m_label_alloc(MAC_LABEL));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkvoid
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkblabel_free(blevel_t *label_p)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(label_p);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
42096647a1cb1ee493b238f2713f001b8b039514Tony Nguyensize32_t
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkblabel_size(void)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sizeof (blevel_t));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * getuserrange - get label range for user
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Entry username of user
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Exit None.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Returns NULL, If memory allocation failure or userdefs failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * otherwise returns the allocates m_range_t with the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * user's min and max labels set.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkm_range_t *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkgetuserrange(const char *username)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *kv_str = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk userattr_t *userp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk m_range_t *range;
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica m_label_t *def_min, *def_clr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Get some memory
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((range = malloc(sizeof (m_range_t))) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((range->lower_bound = m_label_alloc(MAC_LABEL)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(range);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica def_min = range->lower_bound;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((range->upper_bound = m_label_alloc(USER_CLEAR)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk m_label_free(range->lower_bound);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(range);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica def_clr = range->upper_bound;
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica /* If the user has an explicit min_label or clearance, use it. */
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica if ((userp = getusernam(username)) != NULL) {
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica if ((kv_str = kva_match(userp->attr, USERATTR_MINLABEL))
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica != NULL) {
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica (void) str_to_label(kv_str, &range->lower_bound,
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica MAC_LABEL, L_NO_CORRECTION, NULL);
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica def_min = NULL; /* don't get default later */
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica }
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica if ((kv_str = kva_match(userp->attr, USERATTR_CLEARANCE))
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica != NULL) {
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica (void) str_to_label(kv_str, &range->upper_bound,
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica USER_CLEAR, L_NO_CORRECTION, NULL);
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica def_clr = NULL; /* don't get default later */
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica }
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica free_userattr(userp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica if (def_min || def_clr) {
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica /* Need to use system default clearance and/or min_label */
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica if ((userdefs(def_min, def_clr)) == -1) {
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica m_label_free(range->lower_bound);
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica m_label_free(range->upper_bound);
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica free(range);
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica return (NULL);
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
aa2e15f6ec88d9bf4f2dee6bfbb3307b2da8adb4rica
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (range);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}