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, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 /*
     30  *  glue routine for gss_inquire_context
     31  */
     32 
     33 #include <mechglueP.h>
     34 
     35 #define	MAX_MECH_OID_PAIRS 32
     36 
     37 /* Last argument new for V2 */
     38 OM_uint32
     39 gss_inquire_names_for_mech(minor_status, mechanism, name_types)
     40 
     41 OM_uint32 *		minor_status;
     42 const gss_OID 		mechanism;
     43 gss_OID_set *		name_types;
     44 
     45 {
     46 	OM_uint32		status;
     47 	gss_mechanism		mech;
     48 
     49 	if (minor_status == NULL)
     50 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
     51 	*minor_status = 0;
     52 
     53 	if (name_types == NULL)
     54 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
     55 
     56 	/*
     57 	 * select the approprate underlying mechanism routine and
     58 	 * call it.
     59 	 */
     60 
     61 	mech = __gss_get_mechanism(mechanism);
     62 
     63 	if (mech) {
     64 
     65 		if (mech->gss_inquire_names_for_mech)
     66 			status = mech->gss_inquire_names_for_mech(
     67 					mech->context,
     68 					minor_status,
     69 					mechanism,
     70 					name_types);
     71 		else
     72 			status = GSS_S_UNAVAILABLE;
     73 
     74 		return (status);
     75 	}
     76 
     77 	return (GSS_S_BAD_MECH);
     78 }
     79 
     80 OM_uint32
     81 gss_inquire_mechs_for_name(minor_status, input_name, mech_set)
     82 
     83 OM_uint32 *		minor_status;
     84 const gss_name_t	input_name;
     85 gss_OID_set *		mech_set;
     86 
     87 {
     88 	OM_uint32		status;
     89 	static char		*mech_list[MAX_MECH_OID_PAIRS+1];
     90 	gss_OID_set		mech_name_types;
     91 	int			present;
     92 	char 			*mechanism;
     93 	gss_OID 		mechOid;
     94 	gss_OID 		name_type;
     95 	gss_buffer_desc		name_buffer;
     96 	int			i;
     97 
     98 	if (minor_status == NULL)
     99 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
    100 	*minor_status = 0;
    101 
    102 	if (input_name == NULL)
    103 		return (GSS_S_BAD_NAME);
    104 
    105 	status = gss_create_empty_oid_set(minor_status, mech_set);
    106 	if (status != GSS_S_COMPLETE)
    107 		return (status);
    108 	*mech_list = NULL;
    109 	status = __gss_get_mechanisms(mech_list, MAX_MECH_OID_PAIRS+1);
    110 	if (status != GSS_S_COMPLETE)
    111 		return (status);
    112 	for (i = 0; i < MAX_MECH_OID_PAIRS && mech_list[i] != NULL; i++) {
    113 		mechanism = mech_list[i];
    114 		if (__gss_mech_to_oid(mechanism, &mechOid) == GSS_S_COMPLETE) {
    115 			status = gss_inquire_names_for_mech(
    116 					minor_status,
    117 					mechOid,
    118 					&mech_name_types);
    119 			if (status == GSS_S_COMPLETE) {
    120 				status = gss_display_name(minor_status,
    121 							input_name,
    122 							&name_buffer,
    123 							&name_type);
    124 
    125 				(void) gss_release_buffer(NULL, &name_buffer);
    126 
    127 				if (status == GSS_S_COMPLETE && name_type) {
    128 					status = gss_test_oid_set_member(
    129 							minor_status,
    130 							name_type,
    131 							mech_name_types,
    132 							&present);
    133 					if (status == GSS_S_COMPLETE &&
    134 						present) {
    135 						status = gss_add_oid_set_member(
    136 							minor_status,
    137 							mechOid,
    138 							mech_set);
    139 						if (status != GSS_S_COMPLETE) {
    140 						(void) gss_release_oid_set(
    141 							    minor_status,
    142 							    &mech_name_types);
    143 						(void) gss_release_oid_set(
    144 							    minor_status,
    145 							    mech_set);
    146 							return (status);
    147 						}
    148 					}
    149 				}
    150 				(void) gss_release_oid_set(
    151 					minor_status,
    152 					&mech_name_types);
    153 			}
    154 		} else {
    155 			(void) gss_release_oid_set(
    156 				minor_status,
    157 				mech_set);
    158 			return (GSS_S_FAILURE);
    159 		}
    160 	}
    161 	return (GSS_S_COMPLETE);
    162 }
    163