xref: /illumos-gate/usr/src/lib/libgss/g_inquire_names.c (revision 7d1e83948cb684521e72cab96020be241508f449)
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 
32 #define	MAX_MECH_OID_PAIRS 32
33 
34 /* Last argument new for V2 */
35 OM_uint32
36 gss_inquire_names_for_mech(minor_status, mechanism, name_types)
37 
38 OM_uint32 *		minor_status;
39 const gss_OID 		mechanism;
40 gss_OID_set *		name_types;
41 
42 {
43 	OM_uint32		status;
44 	gss_mechanism		mech;
45 
46 	/* Initialize outputs. */
47 
48 	if (minor_status != NULL)
49 		*minor_status = 0;
50 
51 	if (name_types != NULL)
52 		*name_types = GSS_C_NO_OID_SET;
53 
54 	/* Validate arguments. */
55 
56 	if (minor_status == NULL)
57 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
58 
59 	if (name_types == NULL)
60 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
61 
62 	/*
63 	 * select the approprate underlying mechanism routine and
64 	 * call it.
65 	 */
66 
67 	mech = __gss_get_mechanism(mechanism);
68 
69 	if (mech) {
70 
71 		if (mech->gss_inquire_names_for_mech)
72 			status = mech->gss_inquire_names_for_mech(
73 					mech->context,
74 					minor_status,
75 					mechanism,
76 					name_types);
77 		else
78 			status = GSS_S_UNAVAILABLE;
79 
80 		return (status);
81 	}
82 
83 	return (GSS_S_BAD_MECH);
84 }
85 
86 static OM_uint32 val_inq_mechs4name_args(
87 	OM_uint32 *minor_status,
88 	const gss_name_t input_name,
89 	gss_OID_set *mech_set)
90 {
91 
92 	/* Initialize outputs. */
93 	if (minor_status != NULL)
94 		*minor_status = 0;
95 
96 	if (mech_set != NULL)
97 		*mech_set = GSS_C_NO_OID_SET;
98 
99 	/* Validate arguments. */
100 
101 	if (minor_status == NULL)
102 		return (GSS_S_CALL_INACCESSIBLE_WRITE);
103 
104 	if (input_name == GSS_C_NO_NAME)
105 		return (GSS_S_BAD_NAME);
106 
107 	return (GSS_S_COMPLETE);
108 }
109 
110 OM_uint32
111 gss_inquire_mechs_for_name(minor_status, input_name, mech_set)
112 
113 OM_uint32 *		minor_status;
114 const gss_name_t	input_name;
115 gss_OID_set *		mech_set;
116 
117 {
118 	OM_uint32		status;
119 	static char		*mech_list[MAX_MECH_OID_PAIRS+1];
120 	gss_OID_set		mech_name_types;
121 	int			present;
122 	char 			*mechanism;
123 	gss_OID 		mechOid;
124 	gss_OID 		name_type;
125 	gss_buffer_desc		name_buffer;
126 	int			i;
127 
128 	status = val_inq_mechs4name_args(minor_status, input_name, mech_set);
129 	if (status != GSS_S_COMPLETE)
130 		return (status);
131 
132 	status = gss_create_empty_oid_set(minor_status, mech_set);
133 	if (status != GSS_S_COMPLETE)
134 		return (status);
135 	*mech_list = NULL;
136 	status = __gss_get_mechanisms(mech_list, MAX_MECH_OID_PAIRS+1);
137 	if (status != GSS_S_COMPLETE)
138 		return (status);
139 	for (i = 0; i < MAX_MECH_OID_PAIRS && mech_list[i] != NULL; i++) {
140 		mechanism = mech_list[i];
141 		if (__gss_mech_to_oid(mechanism, &mechOid) == GSS_S_COMPLETE) {
142 			status = gss_inquire_names_for_mech(
143 					minor_status,
144 					mechOid,
145 					&mech_name_types);
146 			if (status == GSS_S_COMPLETE) {
147 				status = gss_display_name(minor_status,
148 							input_name,
149 							&name_buffer,
150 							&name_type);
151 
152 				(void) gss_release_buffer(NULL, &name_buffer);
153 
154 				if (status == GSS_S_COMPLETE && name_type) {
155 					status = gss_test_oid_set_member(
156 							minor_status,
157 							name_type,
158 							mech_name_types,
159 							&present);
160 					if (status == GSS_S_COMPLETE &&
161 						present) {
162 						status = gss_add_oid_set_member(
163 							minor_status,
164 							mechOid,
165 							mech_set);
166 						if (status != GSS_S_COMPLETE) {
167 						(void) gss_release_oid_set(
168 							    minor_status,
169 							    &mech_name_types);
170 						(void) gss_release_oid_set(
171 							    minor_status,
172 							    mech_set);
173 							return (status);
174 						}
175 					}
176 				}
177 				(void) gss_release_oid_set(
178 					minor_status,
179 					&mech_name_types);
180 			}
181 		} else {
182 			(void) gss_release_oid_set(
183 				minor_status,
184 				mech_set);
185 			return (GSS_S_FAILURE);
186 		}
187 	}
188 	return (GSS_S_COMPLETE);
189 }
190