e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh/*
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * CDDL HEADER START
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh *
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * The contents of this file are subject to the terms of the
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * Common Development and Distribution License (the "License").
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * You may not use this file except in compliance with the License.
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh *
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * or http://www.opensolaris.org/os/licensing.
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * See the License for the specific language governing permissions
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * and limitations under the License.
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh *
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * When distributing Covered Code, include this CDDL HEADER in each
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * If applicable, add the following below this CDDL HEADER, with the
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * fields enclosed by brackets "[]" replaced with your own identifying
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * information: Portions Copyright [yyyy] [name of copyright owner]
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh *
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * CDDL HEADER END
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh */
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh/*
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh */
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh/*
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh * glue routine for gss_export_sec_context
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh */
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#ifndef LEAN_CLIENT
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#include <mglueP.h>
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#include "gssapiP_generic.h"
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#include <stdio.h>
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering#include <errno.h>
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering#ifdef HAVE_STDLIB_H
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#include <stdlib.h>
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#endif
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh#include <string.h>
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walshstatic OM_uint32 val_exp_sec_ctx_args(
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh OM_uint32 *minor_status,
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh gss_ctx_id_t *context_handle,
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh gss_buffer_t interprocess_token)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh{
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh /* Initialize outputs. */
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (minor_status != NULL)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh *minor_status = 0;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (interprocess_token != GSS_C_NO_BUFFER) {
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh interprocess_token->length = 0;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh interprocess_token->value = NULL;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh }
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh /* Validate arguments. */
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (minor_status == NULL)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_CALL_INACCESSIBLE_WRITE);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering if (interprocess_token == GSS_C_NO_BUFFER)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_CALL_INACCESSIBLE_WRITE);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_COMPLETE);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh}
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J WalshOM_uint32
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walshgss_export_sec_context(minor_status,
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh context_handle,
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering interprocess_token)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J WalshOM_uint32 *minor_status;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poetteringgss_ctx_id_t *context_handle;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poetteringgss_buffer_t interprocess_token;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering{
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh OM_uint32 status;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering OM_uint32 length;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh gss_union_ctx_id_t ctx;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh gss_mechanism mech;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh gss_buffer_desc token;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering char *buf;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh status = val_exp_sec_ctx_args(minor_status,
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering context_handle, interprocess_token);
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering if (status != GSS_S_COMPLETE)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (status);
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering /*
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering * select the approprate underlying mechanism routine and
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering * call it.
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering */
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering ctx = (gss_union_ctx_id_t)*context_handle;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh mech = __gss_get_mechanism(ctx->mech_type);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (!mech)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_BAD_MECH);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (!mech->gss_export_sec_context)
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_UNAVAILABLE);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh status = mech->gss_export_sec_context(minor_status,
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh &ctx->internal_ctx_id, &token);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh if (status != GSS_S_COMPLETE) {
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering map_error(minor_status, mech);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (status);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering }
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering length = token.length + 4 + ctx->mech_type->length;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh interprocess_token->length = length;
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering interprocess_token->value = malloc(length);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering if (interprocess_token->value == 0) {
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering (void) gss_release_buffer(minor_status, &token);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh return (GSS_S_FAILURE);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering }
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering buf = interprocess_token->value;
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering length = ctx->mech_type->length;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh buf[3] = (unsigned char) (length & 0xFF);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering length >>= 8;
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering buf[2] = (unsigned char) (length & 0xFF);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering length >>= 8;
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh buf[1] = (unsigned char) (length & 0xFF);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering length >>= 8;
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering buf[0] = (unsigned char) (length & 0xFF);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering (void) memcpy(buf+4, ctx->mech_type->elements,
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh (size_t)ctx->mech_type->length);
c3090674833c8bd34fbdb0e743f1c47d85dd14fbLennart Poettering (void) memcpy(buf+4+ctx->mech_type->length, token.value, token.length);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh (void) gss_release_buffer(minor_status, &token);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh free(ctx->mech_type->elements);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh free(ctx->mech_type);
e2417e4143bb892e4599b01de7b031763421bb64Daniel J Walsh free(ctx);
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering *context_handle = 0;
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering return (GSS_S_COMPLETE);
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering}
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering#endif /* LEAN_CLIENT */
cad45ba11ec3572296361f53f5852ffb97a97fa3Lennart Poettering