Home | History | Annotate | Download | only in libgss
      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 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*
     27  *  glue routine for gss_inquire_context
     28  */
     29 
     30 #include <mechglueP.h>
     31 #include <stdlib.h>
     32 
     33 static OM_uint32
     34 val_inq_ctx_args(
     35 	OM_uint32 *minor_status,
     36 	gss_ctx_id_t context_handle,
     37 	gss_name_t *src_name,
     38 	gss_name_t *targ_name,
     39 	gss_OID *mech_type)
     40 {
     41 
     42 	/* Initialize outputs. */
     43 
     44 	if (minor_status != NULL)
     45 		*minor_status = 0;
     46 
     47 	if (src_name != NULL)
     48 		*src_name = GSS_C_NO_NAME;
     49 
     50 	if (targ_name != NULL)
     51 		*targ_name = GSS_C_NO_NAME;
     52 
     53 	if (mech_type != NULL)
     54 		*mech_type = GSS_C_NO_OID;
     55 
     56 	/* Validate arguments. */
     57 
     58 	if (minor_status == NULL)
     59 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
     60 
     61 	if (context_handle == GSS_C_NO_CONTEXT)
     62 		return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT);
     63 
     64 	return (GSS_S_COMPLETE);
     65 }
     66 
     67 /* Last argument new for V2 */
     68 OM_uint32
     69 gss_inquire_context(
     70 		minor_status,
     71 		context_handle,
     72 		src_name,
     73 		targ_name,
     74 		lifetime_rec,
     75 		mech_type,
     76 		ctx_flags,
     77 		locally_initiated,
     78 		open)
     79 
     80 OM_uint32 *minor_status;
     81 const gss_ctx_id_t context_handle;
     82 gss_name_t *src_name;
     83 gss_name_t *targ_name;
     84 OM_uint32 *lifetime_rec;
     85 gss_OID *mech_type;
     86 OM_uint32 *ctx_flags;
     87 int *locally_initiated;
     88 int *open;
     89 
     90 {
     91 	gss_union_ctx_id_t	ctx;
     92 	gss_mechanism		mech;
     93 	OM_uint32		status, temp_minor;
     94 	gss_name_t localTargName = NULL, localSourceName = NULL;
     95 
     96 	status = val_inq_ctx_args(minor_status,
     97 				context_handle,
     98 				src_name,
     99 				targ_name,
    100 				mech_type);
    101 	if (status != GSS_S_COMPLETE)
    102 		return (status);
    103 
    104 	/*
    105 	 * select the approprate underlying mechanism routine and
    106 	 * call it.
    107 	 */
    108 
    109 	ctx = (gss_union_ctx_id_t)context_handle;
    110 	mech = __gss_get_mechanism(ctx->mech_type);
    111 
    112 	if (!mech || !mech->gss_inquire_context || !mech->gss_display_name ||
    113 		!mech->gss_release_name) {
    114 		return (GSS_S_UNAVAILABLE);
    115 	}
    116 
    117 	status = mech->gss_inquire_context(
    118 				mech->context,
    119 				minor_status,
    120 				ctx->internal_ctx_id,
    121 				(src_name ? &localSourceName : NULL),
    122 				(targ_name ? &localTargName : NULL),
    123 				lifetime_rec,
    124 				NULL,
    125 				ctx_flags,
    126 				locally_initiated,
    127 				open);
    128 
    129 	if (status != GSS_S_COMPLETE) {
    130 		return (status);
    131 	}
    132 
    133 	/* need to convert names */
    134 	if (src_name) {
    135 		status = __gss_convert_name_to_union_name(minor_status, mech,
    136 						localSourceName, src_name);
    137 		if (status != GSS_S_COMPLETE) {
    138 			if (localTargName)
    139 				mech->gss_release_name(mech->context,
    140 						&temp_minor, &localTargName);
    141 			return (status);
    142 		}
    143 	}
    144 
    145 	if (targ_name) {
    146 		status = __gss_convert_name_to_union_name(minor_status, mech,
    147 						localTargName, targ_name);
    148 
    149 		if (status != GSS_S_COMPLETE) {
    150 			if (src_name)
    151 				(void) gss_release_name(&temp_minor, src_name);
    152 
    153 			return (status);
    154 		}
    155 	}
    156 
    157 	/* spec says mech type must point to static storage */
    158 	if (mech_type)
    159 		*mech_type = &mech->mech_type;
    160 	return (GSS_S_COMPLETE);
    161 }
    162