xref: /netbsd-src/crypto/external/bsd/heimdal/dist/lib/gssapi/spnego/context_stubs.c (revision d3273b5b76f5afaafe308cead5511dbb8df8c5e9)
1*d3273b5bSchristos /*	$NetBSD: context_stubs.c,v 1.2 2017/01/28 21:31:47 christos Exp $	*/
2ca1c9b0cSelric 
3ca1c9b0cSelric /*
4ca1c9b0cSelric  * Copyright (c) 2004, PADL Software Pty Ltd.
5ca1c9b0cSelric  * All rights reserved.
6ca1c9b0cSelric  *
7ca1c9b0cSelric  * Redistribution and use in source and binary forms, with or without
8ca1c9b0cSelric  * modification, are permitted provided that the following conditions
9ca1c9b0cSelric  * are met:
10ca1c9b0cSelric  *
11ca1c9b0cSelric  * 1. Redistributions of source code must retain the above copyright
12ca1c9b0cSelric  *    notice, this list of conditions and the following disclaimer.
13ca1c9b0cSelric  *
14ca1c9b0cSelric  * 2. Redistributions in binary form must reproduce the above copyright
15ca1c9b0cSelric  *    notice, this list of conditions and the following disclaimer in the
16ca1c9b0cSelric  *    documentation and/or other materials provided with the distribution.
17ca1c9b0cSelric  *
18ca1c9b0cSelric  * 3. Neither the name of PADL Software nor the names of its contributors
19ca1c9b0cSelric  *    may be used to endorse or promote products derived from this software
20ca1c9b0cSelric  *    without specific prior written permission.
21ca1c9b0cSelric  *
22ca1c9b0cSelric  * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
23ca1c9b0cSelric  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24ca1c9b0cSelric  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25ca1c9b0cSelric  * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
26ca1c9b0cSelric  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27ca1c9b0cSelric  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28ca1c9b0cSelric  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29ca1c9b0cSelric  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30ca1c9b0cSelric  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31ca1c9b0cSelric  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32ca1c9b0cSelric  * SUCH DAMAGE.
33ca1c9b0cSelric  */
34ca1c9b0cSelric 
35ca1c9b0cSelric #include "spnego_locl.h"
36ca1c9b0cSelric 
37ca1c9b0cSelric static OM_uint32
spnego_supported_mechs(OM_uint32 * minor_status,gss_OID_set * mechs)38ca1c9b0cSelric spnego_supported_mechs(OM_uint32 *minor_status, gss_OID_set *mechs)
39ca1c9b0cSelric {
40ca1c9b0cSelric     OM_uint32 ret, junk;
41ca1c9b0cSelric     gss_OID_set m;
424f77a458Spettai     size_t i;
43ca1c9b0cSelric 
44ca1c9b0cSelric     ret = gss_indicate_mechs(minor_status, &m);
45ca1c9b0cSelric     if (ret != GSS_S_COMPLETE)
46ca1c9b0cSelric 	return ret;
47ca1c9b0cSelric 
48ca1c9b0cSelric     ret = gss_create_empty_oid_set(minor_status, mechs);
49ca1c9b0cSelric     if (ret != GSS_S_COMPLETE) {
50ca1c9b0cSelric 	gss_release_oid_set(&junk, &m);
51ca1c9b0cSelric 	return ret;
52ca1c9b0cSelric     }
53ca1c9b0cSelric 
54ca1c9b0cSelric     for (i = 0; i < m->count; i++) {
55ca1c9b0cSelric 	if (gss_oid_equal(&m->elements[i], GSS_SPNEGO_MECHANISM))
56ca1c9b0cSelric 	    continue;
57ca1c9b0cSelric 
58ca1c9b0cSelric 	ret = gss_add_oid_set_member(minor_status, &m->elements[i], mechs);
59ca1c9b0cSelric 	if (ret) {
60ca1c9b0cSelric 	    gss_release_oid_set(&junk, &m);
61ca1c9b0cSelric 	    gss_release_oid_set(&junk, mechs);
62ca1c9b0cSelric 	    return ret;
63ca1c9b0cSelric 	}
64ca1c9b0cSelric     }
65ca1c9b0cSelric     gss_release_oid_set(&junk, &m);
66ca1c9b0cSelric     return ret;
67ca1c9b0cSelric }
68ca1c9b0cSelric 
69ca1c9b0cSelric 
70ca1c9b0cSelric 
_gss_spnego_process_context_token(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,const gss_buffer_t token_buffer)71ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_process_context_token
72ca1c9b0cSelric            (OM_uint32 *minor_status,
73b9d004c6Schristos             gss_const_ctx_id_t context_handle,
74ca1c9b0cSelric             const gss_buffer_t token_buffer
75ca1c9b0cSelric            )
76ca1c9b0cSelric {
77ca1c9b0cSelric     gss_ctx_id_t context;
78ca1c9b0cSelric     gssspnego_ctx ctx;
79ca1c9b0cSelric     OM_uint32 ret;
80ca1c9b0cSelric 
81ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT)
82ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
83ca1c9b0cSelric 
84b9d004c6Schristos     context = (gss_ctx_id_t)context_handle;
85ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
86ca1c9b0cSelric 
87ca1c9b0cSelric     HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex);
88ca1c9b0cSelric 
89ca1c9b0cSelric     ret = gss_process_context_token(minor_status,
90ca1c9b0cSelric 				    ctx->negotiated_ctx_id,
91ca1c9b0cSelric 				    token_buffer);
92ca1c9b0cSelric     if (ret != GSS_S_COMPLETE) {
93ca1c9b0cSelric 	HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
94ca1c9b0cSelric 	return ret;
95ca1c9b0cSelric     }
96ca1c9b0cSelric 
97ca1c9b0cSelric     ctx->negotiated_ctx_id = GSS_C_NO_CONTEXT;
98ca1c9b0cSelric 
99ca1c9b0cSelric     return _gss_spnego_internal_delete_sec_context(minor_status,
100ca1c9b0cSelric 					   &context,
101ca1c9b0cSelric 					   GSS_C_NO_BUFFER);
102ca1c9b0cSelric }
103ca1c9b0cSelric 
_gss_spnego_delete_sec_context(OM_uint32 * minor_status,gss_ctx_id_t * context_handle,gss_buffer_t output_token)104ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_delete_sec_context
105ca1c9b0cSelric            (OM_uint32 *minor_status,
106ca1c9b0cSelric             gss_ctx_id_t *context_handle,
107ca1c9b0cSelric             gss_buffer_t output_token
108ca1c9b0cSelric            )
109ca1c9b0cSelric {
110ca1c9b0cSelric     gssspnego_ctx ctx;
111ca1c9b0cSelric 
112ca1c9b0cSelric     if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT)
113ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
114ca1c9b0cSelric 
115ca1c9b0cSelric     ctx = (gssspnego_ctx)*context_handle;
116ca1c9b0cSelric 
117ca1c9b0cSelric     HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex);
118ca1c9b0cSelric 
119ca1c9b0cSelric     return _gss_spnego_internal_delete_sec_context(minor_status,
120ca1c9b0cSelric 						   context_handle,
121ca1c9b0cSelric 						   output_token);
122ca1c9b0cSelric }
123ca1c9b0cSelric 
_gss_spnego_context_time(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,OM_uint32 * time_rec)124ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_context_time
125ca1c9b0cSelric            (OM_uint32 *minor_status,
126b9d004c6Schristos             gss_const_ctx_id_t context_handle,
127ca1c9b0cSelric             OM_uint32 *time_rec
128ca1c9b0cSelric            )
129ca1c9b0cSelric {
130ca1c9b0cSelric     gssspnego_ctx ctx;
131ca1c9b0cSelric     *minor_status = 0;
132ca1c9b0cSelric 
133ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
134ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
135ca1c9b0cSelric     }
136ca1c9b0cSelric 
137ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
138ca1c9b0cSelric 
139ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
140ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
141ca1c9b0cSelric     }
142ca1c9b0cSelric 
143ca1c9b0cSelric     return gss_context_time(minor_status,
144ca1c9b0cSelric 			    ctx->negotiated_ctx_id,
145ca1c9b0cSelric 			    time_rec);
146ca1c9b0cSelric }
147ca1c9b0cSelric 
_gss_spnego_get_mic(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,gss_qop_t qop_req,const gss_buffer_t message_buffer,gss_buffer_t message_token)148ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_get_mic
149ca1c9b0cSelric            (OM_uint32 *minor_status,
150b9d004c6Schristos             gss_const_ctx_id_t context_handle,
151ca1c9b0cSelric             gss_qop_t qop_req,
152ca1c9b0cSelric             const gss_buffer_t message_buffer,
153ca1c9b0cSelric             gss_buffer_t message_token
154ca1c9b0cSelric            )
155ca1c9b0cSelric {
156ca1c9b0cSelric     gssspnego_ctx ctx;
157ca1c9b0cSelric 
158ca1c9b0cSelric     *minor_status = 0;
159ca1c9b0cSelric 
160ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
161ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
162ca1c9b0cSelric     }
163ca1c9b0cSelric 
164ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
165ca1c9b0cSelric 
166ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
167ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
168ca1c9b0cSelric     }
169ca1c9b0cSelric 
170ca1c9b0cSelric     return gss_get_mic(minor_status, ctx->negotiated_ctx_id,
171ca1c9b0cSelric 		       qop_req, message_buffer, message_token);
172ca1c9b0cSelric }
173ca1c9b0cSelric 
_gss_spnego_verify_mic(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,const gss_buffer_t message_buffer,const gss_buffer_t token_buffer,gss_qop_t * qop_state)174ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_verify_mic
175ca1c9b0cSelric            (OM_uint32 * minor_status,
176b9d004c6Schristos             gss_const_ctx_id_t context_handle,
177ca1c9b0cSelric             const gss_buffer_t message_buffer,
178ca1c9b0cSelric             const gss_buffer_t token_buffer,
179ca1c9b0cSelric             gss_qop_t * qop_state
180ca1c9b0cSelric            )
181ca1c9b0cSelric {
182ca1c9b0cSelric     gssspnego_ctx ctx;
183ca1c9b0cSelric 
184ca1c9b0cSelric     *minor_status = 0;
185ca1c9b0cSelric 
186ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
187ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
188ca1c9b0cSelric     }
189ca1c9b0cSelric 
190ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
191ca1c9b0cSelric 
192ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
193ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
194ca1c9b0cSelric     }
195ca1c9b0cSelric 
196ca1c9b0cSelric     return gss_verify_mic(minor_status,
197ca1c9b0cSelric 			  ctx->negotiated_ctx_id,
198ca1c9b0cSelric 			  message_buffer,
199ca1c9b0cSelric 			  token_buffer,
200ca1c9b0cSelric 			  qop_state);
201ca1c9b0cSelric }
202ca1c9b0cSelric 
_gss_spnego_wrap(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,int conf_req_flag,gss_qop_t qop_req,const gss_buffer_t input_message_buffer,int * conf_state,gss_buffer_t output_message_buffer)203ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap
204ca1c9b0cSelric            (OM_uint32 * minor_status,
205b9d004c6Schristos             gss_const_ctx_id_t context_handle,
206ca1c9b0cSelric             int conf_req_flag,
207ca1c9b0cSelric             gss_qop_t qop_req,
208ca1c9b0cSelric             const gss_buffer_t input_message_buffer,
209ca1c9b0cSelric             int * conf_state,
210ca1c9b0cSelric             gss_buffer_t output_message_buffer
211ca1c9b0cSelric            )
212ca1c9b0cSelric {
213ca1c9b0cSelric     gssspnego_ctx ctx;
214ca1c9b0cSelric 
215ca1c9b0cSelric     *minor_status = 0;
216ca1c9b0cSelric 
217ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
218ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
219ca1c9b0cSelric     }
220ca1c9b0cSelric 
221ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
222ca1c9b0cSelric 
223ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
224ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
225ca1c9b0cSelric     }
226ca1c9b0cSelric 
227ca1c9b0cSelric     return gss_wrap(minor_status,
228ca1c9b0cSelric 		    ctx->negotiated_ctx_id,
229ca1c9b0cSelric 		    conf_req_flag,
230ca1c9b0cSelric 		    qop_req,
231ca1c9b0cSelric 		    input_message_buffer,
232ca1c9b0cSelric 		    conf_state,
233ca1c9b0cSelric 		    output_message_buffer);
234ca1c9b0cSelric }
235ca1c9b0cSelric 
_gss_spnego_unwrap(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,const gss_buffer_t input_message_buffer,gss_buffer_t output_message_buffer,int * conf_state,gss_qop_t * qop_state)236ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_unwrap
237ca1c9b0cSelric            (OM_uint32 * minor_status,
238b9d004c6Schristos             gss_const_ctx_id_t context_handle,
239ca1c9b0cSelric             const gss_buffer_t input_message_buffer,
240ca1c9b0cSelric             gss_buffer_t output_message_buffer,
241ca1c9b0cSelric             int * conf_state,
242ca1c9b0cSelric             gss_qop_t * qop_state
243ca1c9b0cSelric            )
244ca1c9b0cSelric {
245ca1c9b0cSelric     gssspnego_ctx ctx;
246ca1c9b0cSelric 
247ca1c9b0cSelric     *minor_status = 0;
248ca1c9b0cSelric 
249ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
250ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
251ca1c9b0cSelric     }
252ca1c9b0cSelric 
253ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
254ca1c9b0cSelric 
255ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
256ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
257ca1c9b0cSelric     }
258ca1c9b0cSelric 
259ca1c9b0cSelric     return gss_unwrap(minor_status,
260ca1c9b0cSelric 		      ctx->negotiated_ctx_id,
261ca1c9b0cSelric 		      input_message_buffer,
262ca1c9b0cSelric 		      output_message_buffer,
263ca1c9b0cSelric 		      conf_state,
264ca1c9b0cSelric 		      qop_state);
265ca1c9b0cSelric }
266ca1c9b0cSelric 
_gss_spnego_compare_name(OM_uint32 * minor_status,gss_const_name_t name1,gss_const_name_t name2,int * name_equal)267ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_compare_name
268ca1c9b0cSelric            (OM_uint32 *minor_status,
269b9d004c6Schristos             gss_const_name_t name1,
270b9d004c6Schristos             gss_const_name_t name2,
271ca1c9b0cSelric             int * name_equal
272ca1c9b0cSelric            )
273ca1c9b0cSelric {
274ca1c9b0cSelric     spnego_name n1 = (spnego_name)name1;
275ca1c9b0cSelric     spnego_name n2 = (spnego_name)name2;
276ca1c9b0cSelric 
277ca1c9b0cSelric     *name_equal = 0;
278ca1c9b0cSelric 
279ca1c9b0cSelric     if (!gss_oid_equal(&n1->type, &n2->type))
280ca1c9b0cSelric 	return GSS_S_COMPLETE;
281ca1c9b0cSelric     if (n1->value.length != n2->value.length)
282ca1c9b0cSelric 	return GSS_S_COMPLETE;
283ca1c9b0cSelric     if (memcmp(n1->value.value, n2->value.value, n2->value.length) != 0)
284ca1c9b0cSelric 	return GSS_S_COMPLETE;
285ca1c9b0cSelric 
286ca1c9b0cSelric     *name_equal = 1;
287ca1c9b0cSelric 
288ca1c9b0cSelric     return GSS_S_COMPLETE;
289ca1c9b0cSelric }
290ca1c9b0cSelric 
_gss_spnego_display_name(OM_uint32 * minor_status,gss_const_name_t input_name,gss_buffer_t output_name_buffer,gss_OID * output_name_type)291ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_display_name
292ca1c9b0cSelric            (OM_uint32 * minor_status,
293b9d004c6Schristos             gss_const_name_t input_name,
294ca1c9b0cSelric             gss_buffer_t output_name_buffer,
295ca1c9b0cSelric             gss_OID * output_name_type
296ca1c9b0cSelric            )
297ca1c9b0cSelric {
298ca1c9b0cSelric     spnego_name name = (spnego_name)input_name;
299ca1c9b0cSelric 
300ca1c9b0cSelric     *minor_status = 0;
301ca1c9b0cSelric 
302ca1c9b0cSelric     if (name == NULL || name->mech == GSS_C_NO_NAME)
303ca1c9b0cSelric 	return GSS_S_FAILURE;
304ca1c9b0cSelric 
305ca1c9b0cSelric     return gss_display_name(minor_status, name->mech,
306ca1c9b0cSelric 			    output_name_buffer, output_name_type);
307ca1c9b0cSelric }
308ca1c9b0cSelric 
_gss_spnego_import_name(OM_uint32 * minor_status,const gss_buffer_t name_buffer,const gss_OID name_type,gss_name_t * output_name)309ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_import_name
310ca1c9b0cSelric            (OM_uint32 * minor_status,
311ca1c9b0cSelric             const gss_buffer_t name_buffer,
312ca1c9b0cSelric             const gss_OID name_type,
313ca1c9b0cSelric             gss_name_t * output_name
314ca1c9b0cSelric            )
315ca1c9b0cSelric {
316ca1c9b0cSelric     spnego_name name;
317ca1c9b0cSelric     OM_uint32 maj_stat;
318ca1c9b0cSelric 
319ca1c9b0cSelric     *minor_status = 0;
320ca1c9b0cSelric 
321ca1c9b0cSelric     name = calloc(1, sizeof(*name));
322ca1c9b0cSelric     if (name == NULL) {
323ca1c9b0cSelric 	*minor_status = ENOMEM;
324ca1c9b0cSelric 	return GSS_S_FAILURE;
325ca1c9b0cSelric     }
326ca1c9b0cSelric 
327ca1c9b0cSelric     maj_stat = _gss_copy_oid(minor_status, name_type, &name->type);
328ca1c9b0cSelric     if (maj_stat) {
329ca1c9b0cSelric 	free(name);
330ca1c9b0cSelric 	return GSS_S_FAILURE;
331ca1c9b0cSelric     }
332ca1c9b0cSelric 
333ca1c9b0cSelric     maj_stat = _gss_copy_buffer(minor_status, name_buffer, &name->value);
334ca1c9b0cSelric     if (maj_stat) {
335ca1c9b0cSelric 	gss_name_t rname = (gss_name_t)name;
336ca1c9b0cSelric 	_gss_spnego_release_name(minor_status, &rname);
337ca1c9b0cSelric 	return GSS_S_FAILURE;
338ca1c9b0cSelric     }
339ca1c9b0cSelric     name->mech = GSS_C_NO_NAME;
340ca1c9b0cSelric     *output_name = (gss_name_t)name;
341ca1c9b0cSelric 
342ca1c9b0cSelric     return GSS_S_COMPLETE;
343ca1c9b0cSelric }
344ca1c9b0cSelric 
_gss_spnego_export_name(OM_uint32 * minor_status,gss_const_name_t input_name,gss_buffer_t exported_name)345ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_name
346ca1c9b0cSelric            (OM_uint32  * minor_status,
347b9d004c6Schristos             gss_const_name_t input_name,
348ca1c9b0cSelric             gss_buffer_t exported_name
349ca1c9b0cSelric            )
350ca1c9b0cSelric {
351ca1c9b0cSelric     spnego_name name;
352ca1c9b0cSelric     *minor_status = 0;
353ca1c9b0cSelric 
354ca1c9b0cSelric     if (input_name == GSS_C_NO_NAME)
355ca1c9b0cSelric 	return GSS_S_BAD_NAME;
356ca1c9b0cSelric 
357ca1c9b0cSelric     name = (spnego_name)input_name;
358ca1c9b0cSelric     if (name->mech == GSS_C_NO_NAME)
359ca1c9b0cSelric 	return GSS_S_BAD_NAME;
360ca1c9b0cSelric 
361ca1c9b0cSelric     return gss_export_name(minor_status, name->mech, exported_name);
362ca1c9b0cSelric }
363ca1c9b0cSelric 
_gss_spnego_release_name(OM_uint32 * minor_status,gss_name_t * input_name)364ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_release_name
365ca1c9b0cSelric            (OM_uint32 * minor_status,
366ca1c9b0cSelric             gss_name_t * input_name
367ca1c9b0cSelric            )
368ca1c9b0cSelric {
369ca1c9b0cSelric     *minor_status = 0;
370ca1c9b0cSelric 
371ca1c9b0cSelric     if (*input_name != GSS_C_NO_NAME) {
372ca1c9b0cSelric 	OM_uint32 junk;
373ca1c9b0cSelric 	spnego_name name = (spnego_name)*input_name;
374ca1c9b0cSelric 	_gss_free_oid(&junk, &name->type);
375ca1c9b0cSelric 	gss_release_buffer(&junk, &name->value);
376ca1c9b0cSelric 	if (name->mech != GSS_C_NO_NAME)
377ca1c9b0cSelric 	    gss_release_name(&junk, &name->mech);
378ca1c9b0cSelric 	free(name);
379ca1c9b0cSelric 
380ca1c9b0cSelric 	*input_name = GSS_C_NO_NAME;
381ca1c9b0cSelric     }
382ca1c9b0cSelric     return GSS_S_COMPLETE;
383ca1c9b0cSelric }
384ca1c9b0cSelric 
_gss_spnego_inquire_context(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,gss_name_t * src_name,gss_name_t * targ_name,OM_uint32 * lifetime_rec,gss_OID * mech_type,OM_uint32 * ctx_flags,int * locally_initiated,int * open_context)385ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context (
386ca1c9b0cSelric             OM_uint32 * minor_status,
387b9d004c6Schristos             gss_const_ctx_id_t context_handle,
388ca1c9b0cSelric             gss_name_t * src_name,
389ca1c9b0cSelric             gss_name_t * targ_name,
390ca1c9b0cSelric             OM_uint32 * lifetime_rec,
391ca1c9b0cSelric             gss_OID * mech_type,
392ca1c9b0cSelric             OM_uint32 * ctx_flags,
393ca1c9b0cSelric             int * locally_initiated,
394ca1c9b0cSelric             int * open_context
395ca1c9b0cSelric            )
396ca1c9b0cSelric {
397ca1c9b0cSelric     gssspnego_ctx ctx;
398ca1c9b0cSelric     OM_uint32 maj_stat, junk;
399ca1c9b0cSelric     gss_name_t src_mn, targ_mn;
400ca1c9b0cSelric 
401ca1c9b0cSelric     *minor_status = 0;
402ca1c9b0cSelric 
403ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT)
404ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
405ca1c9b0cSelric 
406ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
407ca1c9b0cSelric 
408ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)
409ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
410ca1c9b0cSelric 
411ca1c9b0cSelric     maj_stat = gss_inquire_context(minor_status,
412ca1c9b0cSelric 				   ctx->negotiated_ctx_id,
413ca1c9b0cSelric 				   &src_mn,
414ca1c9b0cSelric 				   &targ_mn,
415ca1c9b0cSelric 				   lifetime_rec,
416ca1c9b0cSelric 				   mech_type,
417ca1c9b0cSelric 				   ctx_flags,
418ca1c9b0cSelric 				   locally_initiated,
419ca1c9b0cSelric 				   open_context);
420ca1c9b0cSelric     if (maj_stat != GSS_S_COMPLETE)
421ca1c9b0cSelric 	return maj_stat;
422ca1c9b0cSelric 
423ca1c9b0cSelric     if (src_name) {
424ca1c9b0cSelric 	spnego_name name = calloc(1, sizeof(*name));
425ca1c9b0cSelric 	if (name == NULL)
426ca1c9b0cSelric 	    goto enomem;
427ca1c9b0cSelric 	name->mech = src_mn;
428ca1c9b0cSelric 	*src_name = (gss_name_t)name;
429ca1c9b0cSelric     } else
430ca1c9b0cSelric 	gss_release_name(&junk, &src_mn);
431ca1c9b0cSelric 
432ca1c9b0cSelric     if (targ_name) {
433ca1c9b0cSelric 	spnego_name name = calloc(1, sizeof(*name));
434ca1c9b0cSelric 	if (name == NULL) {
435ca1c9b0cSelric 	    gss_release_name(minor_status, src_name);
436ca1c9b0cSelric 	    goto enomem;
437ca1c9b0cSelric 	}
438ca1c9b0cSelric 	name->mech = targ_mn;
439ca1c9b0cSelric 	*targ_name = (gss_name_t)name;
440ca1c9b0cSelric     } else
441ca1c9b0cSelric 	gss_release_name(&junk, &targ_mn);
442ca1c9b0cSelric 
443ca1c9b0cSelric     return GSS_S_COMPLETE;
444ca1c9b0cSelric 
445ca1c9b0cSelric enomem:
446ca1c9b0cSelric     gss_release_name(&junk, &targ_mn);
447ca1c9b0cSelric     gss_release_name(&junk, &src_mn);
448ca1c9b0cSelric     *minor_status = ENOMEM;
449ca1c9b0cSelric     return GSS_S_FAILURE;
450ca1c9b0cSelric }
451ca1c9b0cSelric 
_gss_spnego_wrap_size_limit(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,int conf_req_flag,gss_qop_t qop_req,OM_uint32 req_output_size,OM_uint32 * max_input_size)452ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap_size_limit (
453ca1c9b0cSelric             OM_uint32 * minor_status,
454b9d004c6Schristos             gss_const_ctx_id_t context_handle,
455ca1c9b0cSelric             int conf_req_flag,
456ca1c9b0cSelric             gss_qop_t qop_req,
457ca1c9b0cSelric             OM_uint32 req_output_size,
458ca1c9b0cSelric             OM_uint32 * max_input_size
459ca1c9b0cSelric            )
460ca1c9b0cSelric {
461ca1c9b0cSelric     gssspnego_ctx ctx;
462ca1c9b0cSelric 
463ca1c9b0cSelric     *minor_status = 0;
464ca1c9b0cSelric 
465ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
466ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
467ca1c9b0cSelric     }
468ca1c9b0cSelric 
469ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
470ca1c9b0cSelric 
471ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
472ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
473ca1c9b0cSelric     }
474ca1c9b0cSelric 
475ca1c9b0cSelric     return gss_wrap_size_limit(minor_status,
476ca1c9b0cSelric 			       ctx->negotiated_ctx_id,
477ca1c9b0cSelric 			       conf_req_flag,
478ca1c9b0cSelric 			       qop_req,
479ca1c9b0cSelric 			       req_output_size,
480ca1c9b0cSelric 			       max_input_size);
481ca1c9b0cSelric }
482ca1c9b0cSelric 
_gss_spnego_export_sec_context(OM_uint32 * minor_status,gss_ctx_id_t * context_handle,gss_buffer_t interprocess_token)483ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_sec_context (
484ca1c9b0cSelric             OM_uint32 * minor_status,
485ca1c9b0cSelric             gss_ctx_id_t * context_handle,
486ca1c9b0cSelric             gss_buffer_t interprocess_token
487ca1c9b0cSelric            )
488ca1c9b0cSelric {
489ca1c9b0cSelric     gssspnego_ctx ctx;
490ca1c9b0cSelric     OM_uint32 ret;
491ca1c9b0cSelric 
492ca1c9b0cSelric     *minor_status = 0;
493ca1c9b0cSelric 
494ca1c9b0cSelric     if (context_handle == NULL) {
495ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
496ca1c9b0cSelric     }
497ca1c9b0cSelric 
498ca1c9b0cSelric     ctx = (gssspnego_ctx)*context_handle;
499ca1c9b0cSelric 
500ca1c9b0cSelric     if (ctx == NULL)
501ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
502ca1c9b0cSelric 
503ca1c9b0cSelric     HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex);
504ca1c9b0cSelric 
505ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
506ca1c9b0cSelric 	HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
507ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
508ca1c9b0cSelric     }
509ca1c9b0cSelric 
510ca1c9b0cSelric     ret = gss_export_sec_context(minor_status,
511ca1c9b0cSelric 				 &ctx->negotiated_ctx_id,
512ca1c9b0cSelric 				 interprocess_token);
513ca1c9b0cSelric     if (ret == GSS_S_COMPLETE) {
514ca1c9b0cSelric 	ret = _gss_spnego_internal_delete_sec_context(minor_status,
515ca1c9b0cSelric 					     context_handle,
516ca1c9b0cSelric 					     GSS_C_NO_BUFFER);
517ca1c9b0cSelric 	if (ret == GSS_S_COMPLETE)
518ca1c9b0cSelric 	    return GSS_S_COMPLETE;
519ca1c9b0cSelric     }
520ca1c9b0cSelric 
521ca1c9b0cSelric     HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
522ca1c9b0cSelric 
523ca1c9b0cSelric     return ret;
524ca1c9b0cSelric }
525ca1c9b0cSelric 
_gss_spnego_import_sec_context(OM_uint32 * minor_status,const gss_buffer_t interprocess_token,gss_ctx_id_t * context_handle)526ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_import_sec_context (
527ca1c9b0cSelric             OM_uint32 * minor_status,
528ca1c9b0cSelric             const gss_buffer_t interprocess_token,
529ca1c9b0cSelric             gss_ctx_id_t *context_handle
530ca1c9b0cSelric            )
531ca1c9b0cSelric {
532ca1c9b0cSelric     OM_uint32 ret, minor;
533ca1c9b0cSelric     gss_ctx_id_t context;
534ca1c9b0cSelric     gssspnego_ctx ctx;
535ca1c9b0cSelric 
536b9d004c6Schristos     *context_handle = GSS_C_NO_CONTEXT;
537ca1c9b0cSelric     ret = _gss_spnego_alloc_sec_context(minor_status, &context);
538ca1c9b0cSelric     if (ret != GSS_S_COMPLETE) {
539ca1c9b0cSelric 	return ret;
540ca1c9b0cSelric     }
541ca1c9b0cSelric     ctx = (gssspnego_ctx)context;
542ca1c9b0cSelric 
543ca1c9b0cSelric     HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex);
544ca1c9b0cSelric 
545ca1c9b0cSelric     ret = gss_import_sec_context(minor_status,
546ca1c9b0cSelric 				 interprocess_token,
547ca1c9b0cSelric 				 &ctx->negotiated_ctx_id);
548ca1c9b0cSelric     if (ret != GSS_S_COMPLETE) {
549b9d004c6Schristos 	_gss_spnego_internal_delete_sec_context(&minor, &context, GSS_C_NO_BUFFER);
550ca1c9b0cSelric 	return ret;
551ca1c9b0cSelric     }
552ca1c9b0cSelric 
553ca1c9b0cSelric     ctx->open = 1;
554ca1c9b0cSelric     /* don't bother filling in the rest of the fields */
555ca1c9b0cSelric 
556ca1c9b0cSelric     HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex);
557ca1c9b0cSelric 
558ca1c9b0cSelric     *context_handle = (gss_ctx_id_t)ctx;
559ca1c9b0cSelric 
560ca1c9b0cSelric     return GSS_S_COMPLETE;
561ca1c9b0cSelric }
562ca1c9b0cSelric 
_gss_spnego_inquire_names_for_mech(OM_uint32 * minor_status,const gss_OID mechanism,gss_OID_set * name_types)563ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_names_for_mech (
564ca1c9b0cSelric             OM_uint32 * minor_status,
565ca1c9b0cSelric             const gss_OID mechanism,
566ca1c9b0cSelric             gss_OID_set * name_types
567ca1c9b0cSelric            )
568ca1c9b0cSelric {
569ca1c9b0cSelric     gss_OID_set mechs, names, n;
570ca1c9b0cSelric     OM_uint32 ret, junk;
5714f77a458Spettai     size_t i, j;
572ca1c9b0cSelric 
573ca1c9b0cSelric     *name_types = NULL;
574ca1c9b0cSelric 
575ca1c9b0cSelric     ret = spnego_supported_mechs(minor_status, &mechs);
576ca1c9b0cSelric     if (ret != GSS_S_COMPLETE)
577ca1c9b0cSelric 	return ret;
578ca1c9b0cSelric 
579ca1c9b0cSelric     ret = gss_create_empty_oid_set(minor_status, &names);
580ca1c9b0cSelric     if (ret != GSS_S_COMPLETE)
581ca1c9b0cSelric 	goto out;
582ca1c9b0cSelric 
583ca1c9b0cSelric     for (i = 0; i < mechs->count; i++) {
584ca1c9b0cSelric 	ret = gss_inquire_names_for_mech(minor_status,
585ca1c9b0cSelric 					 &mechs->elements[i],
586ca1c9b0cSelric 					 &n);
587ca1c9b0cSelric 	if (ret)
588ca1c9b0cSelric 	    continue;
589ca1c9b0cSelric 
590ca1c9b0cSelric 	for (j = 0; j < n->count; j++)
591ca1c9b0cSelric 	    gss_add_oid_set_member(minor_status,
592ca1c9b0cSelric 				   &n->elements[j],
593ca1c9b0cSelric 				   &names);
594ca1c9b0cSelric 	gss_release_oid_set(&junk, &n);
595ca1c9b0cSelric     }
596ca1c9b0cSelric 
597ca1c9b0cSelric     ret = GSS_S_COMPLETE;
598ca1c9b0cSelric     *name_types = names;
599ca1c9b0cSelric out:
600ca1c9b0cSelric 
601ca1c9b0cSelric     gss_release_oid_set(&junk, &mechs);
602ca1c9b0cSelric 
603ca1c9b0cSelric     return ret;
604ca1c9b0cSelric }
605ca1c9b0cSelric 
_gss_spnego_inquire_mechs_for_name(OM_uint32 * minor_status,gss_const_name_t input_name,gss_OID_set * mech_types)606ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_mechs_for_name (
607ca1c9b0cSelric             OM_uint32 * minor_status,
608b9d004c6Schristos             gss_const_name_t input_name,
609ca1c9b0cSelric             gss_OID_set * mech_types
610ca1c9b0cSelric            )
611ca1c9b0cSelric {
612ca1c9b0cSelric     OM_uint32 ret, junk;
613ca1c9b0cSelric 
614ca1c9b0cSelric     ret = gss_create_empty_oid_set(minor_status, mech_types);
615ca1c9b0cSelric     if (ret)
616ca1c9b0cSelric 	return ret;
617ca1c9b0cSelric 
618ca1c9b0cSelric     ret = gss_add_oid_set_member(minor_status,
619ca1c9b0cSelric 				 GSS_SPNEGO_MECHANISM,
620ca1c9b0cSelric 				 mech_types);
621ca1c9b0cSelric     if (ret)
622ca1c9b0cSelric 	gss_release_oid_set(&junk, mech_types);
623ca1c9b0cSelric 
624ca1c9b0cSelric     return ret;
625ca1c9b0cSelric }
626ca1c9b0cSelric 
_gss_spnego_canonicalize_name(OM_uint32 * minor_status,gss_const_name_t input_name,const gss_OID mech_type,gss_name_t * output_name)627ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_canonicalize_name (
628ca1c9b0cSelric             OM_uint32 * minor_status,
629b9d004c6Schristos             gss_const_name_t input_name,
630ca1c9b0cSelric             const gss_OID mech_type,
631ca1c9b0cSelric             gss_name_t * output_name
632ca1c9b0cSelric            )
633ca1c9b0cSelric {
634ca1c9b0cSelric     /* XXX */
635ca1c9b0cSelric     return gss_duplicate_name(minor_status, input_name, output_name);
636ca1c9b0cSelric }
637ca1c9b0cSelric 
_gss_spnego_duplicate_name(OM_uint32 * minor_status,gss_const_name_t src_name,gss_name_t * dest_name)638ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_duplicate_name (
639ca1c9b0cSelric             OM_uint32 * minor_status,
640b9d004c6Schristos             gss_const_name_t src_name,
641ca1c9b0cSelric             gss_name_t * dest_name
642ca1c9b0cSelric            )
643ca1c9b0cSelric {
644ca1c9b0cSelric     return gss_duplicate_name(minor_status, src_name, dest_name);
645ca1c9b0cSelric }
646ca1c9b0cSelric 
647ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV
_gss_spnego_wrap_iov(OM_uint32 * minor_status,gss_ctx_id_t context_handle,int conf_req_flag,gss_qop_t qop_req,int * conf_state,gss_iov_buffer_desc * iov,int iov_count)648ca1c9b0cSelric _gss_spnego_wrap_iov(OM_uint32 * minor_status,
649ca1c9b0cSelric 		     gss_ctx_id_t  context_handle,
650ca1c9b0cSelric 		     int conf_req_flag,
651ca1c9b0cSelric 		     gss_qop_t qop_req,
652ca1c9b0cSelric 		     int * conf_state,
653ca1c9b0cSelric 		     gss_iov_buffer_desc *iov,
654ca1c9b0cSelric 		     int iov_count)
655ca1c9b0cSelric {
656ca1c9b0cSelric     gssspnego_ctx ctx = (gssspnego_ctx)context_handle;
657ca1c9b0cSelric 
658ca1c9b0cSelric     *minor_status = 0;
659ca1c9b0cSelric 
660ca1c9b0cSelric     if (ctx == NULL || ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)
661ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
662ca1c9b0cSelric 
663ca1c9b0cSelric     return gss_wrap_iov(minor_status, ctx->negotiated_ctx_id,
664ca1c9b0cSelric 			conf_req_flag, qop_req, conf_state,
665ca1c9b0cSelric 			iov, iov_count);
666ca1c9b0cSelric }
667ca1c9b0cSelric 
668ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV
_gss_spnego_unwrap_iov(OM_uint32 * minor_status,gss_ctx_id_t context_handle,int * conf_state,gss_qop_t * qop_state,gss_iov_buffer_desc * iov,int iov_count)669ca1c9b0cSelric _gss_spnego_unwrap_iov(OM_uint32 *minor_status,
670ca1c9b0cSelric 		       gss_ctx_id_t context_handle,
671ca1c9b0cSelric 		       int *conf_state,
672ca1c9b0cSelric 		       gss_qop_t *qop_state,
673ca1c9b0cSelric 		       gss_iov_buffer_desc *iov,
674ca1c9b0cSelric 		       int iov_count)
675ca1c9b0cSelric {
676ca1c9b0cSelric     gssspnego_ctx ctx = (gssspnego_ctx)context_handle;
677ca1c9b0cSelric 
678ca1c9b0cSelric     *minor_status = 0;
679ca1c9b0cSelric 
680ca1c9b0cSelric     if (ctx == NULL || ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)
681ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
682ca1c9b0cSelric 
683ca1c9b0cSelric     return gss_unwrap_iov(minor_status,
684ca1c9b0cSelric 			  ctx->negotiated_ctx_id,
685ca1c9b0cSelric 			  conf_state, qop_state,
686ca1c9b0cSelric 			  iov, iov_count);
687ca1c9b0cSelric }
688ca1c9b0cSelric 
689ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV
_gss_spnego_wrap_iov_length(OM_uint32 * minor_status,gss_ctx_id_t context_handle,int conf_req_flag,gss_qop_t qop_req,int * conf_state,gss_iov_buffer_desc * iov,int iov_count)690ca1c9b0cSelric _gss_spnego_wrap_iov_length(OM_uint32 * minor_status,
691ca1c9b0cSelric 			    gss_ctx_id_t context_handle,
692ca1c9b0cSelric 			    int conf_req_flag,
693ca1c9b0cSelric 			    gss_qop_t qop_req,
694ca1c9b0cSelric 			    int *conf_state,
695ca1c9b0cSelric 			    gss_iov_buffer_desc *iov,
696ca1c9b0cSelric 			    int iov_count)
697ca1c9b0cSelric {
698ca1c9b0cSelric     gssspnego_ctx ctx = (gssspnego_ctx)context_handle;
699ca1c9b0cSelric 
700ca1c9b0cSelric     *minor_status = 0;
701ca1c9b0cSelric 
702ca1c9b0cSelric     if (ctx == NULL || ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)
703ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
704ca1c9b0cSelric 
705ca1c9b0cSelric     return gss_wrap_iov_length(minor_status, ctx->negotiated_ctx_id,
706ca1c9b0cSelric 			       conf_req_flag, qop_req, conf_state,
707ca1c9b0cSelric 			       iov, iov_count);
708ca1c9b0cSelric }
709ca1c9b0cSelric 
710ca1c9b0cSelric #if 0
711ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_complete_auth_token
712ca1c9b0cSelric            (OM_uint32 * minor_status,
713b9d004c6Schristos             gss_const_ctx_id_t context_handle,
714ca1c9b0cSelric 	    gss_buffer_t input_message_buffer)
715ca1c9b0cSelric {
716ca1c9b0cSelric     gssspnego_ctx ctx;
717ca1c9b0cSelric 
718ca1c9b0cSelric     *minor_status = 0;
719ca1c9b0cSelric 
720ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
721ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
722ca1c9b0cSelric     }
723ca1c9b0cSelric 
724ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
725ca1c9b0cSelric 
726ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
727ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
728ca1c9b0cSelric     }
729ca1c9b0cSelric 
730ca1c9b0cSelric     return gss_complete_auth_token(minor_status,
731ca1c9b0cSelric 				   ctx->negotiated_ctx_id,
732ca1c9b0cSelric 				   input_message_buffer);
733ca1c9b0cSelric }
734ca1c9b0cSelric #endif
735ca1c9b0cSelric 
_gss_spnego_inquire_sec_context_by_oid(OM_uint32 * minor_status,gss_const_ctx_id_t context_handle,const gss_OID desired_object,gss_buffer_set_t * data_set)736ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_sec_context_by_oid
737ca1c9b0cSelric            (OM_uint32 * minor_status,
738b9d004c6Schristos             gss_const_ctx_id_t context_handle,
739ca1c9b0cSelric             const gss_OID desired_object,
740ca1c9b0cSelric             gss_buffer_set_t *data_set)
741ca1c9b0cSelric {
742ca1c9b0cSelric     gssspnego_ctx ctx;
743ca1c9b0cSelric 
744ca1c9b0cSelric     *minor_status = 0;
745ca1c9b0cSelric 
746ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT) {
747ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
748ca1c9b0cSelric     }
749ca1c9b0cSelric 
750ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
751ca1c9b0cSelric 
752ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
753ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
754ca1c9b0cSelric     }
755ca1c9b0cSelric 
756ca1c9b0cSelric     return gss_inquire_sec_context_by_oid(minor_status,
757ca1c9b0cSelric 					  ctx->negotiated_ctx_id,
758ca1c9b0cSelric 					  desired_object,
759ca1c9b0cSelric 					  data_set);
760ca1c9b0cSelric }
761ca1c9b0cSelric 
_gss_spnego_set_sec_context_option(OM_uint32 * minor_status,gss_ctx_id_t * context_handle,const gss_OID desired_object,const gss_buffer_t value)762ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV _gss_spnego_set_sec_context_option
763ca1c9b0cSelric            (OM_uint32 * minor_status,
764ca1c9b0cSelric             gss_ctx_id_t * context_handle,
765ca1c9b0cSelric             const gss_OID desired_object,
766ca1c9b0cSelric             const gss_buffer_t value)
767ca1c9b0cSelric {
768ca1c9b0cSelric     gssspnego_ctx ctx;
769ca1c9b0cSelric 
770ca1c9b0cSelric     *minor_status = 0;
771ca1c9b0cSelric 
772ca1c9b0cSelric     if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT) {
773ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
774ca1c9b0cSelric     }
775ca1c9b0cSelric 
776ca1c9b0cSelric     ctx = (gssspnego_ctx)*context_handle;
777ca1c9b0cSelric 
778ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT) {
779ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
780ca1c9b0cSelric     }
781ca1c9b0cSelric 
782ca1c9b0cSelric     return gss_set_sec_context_option(minor_status,
783ca1c9b0cSelric 				      &ctx->negotiated_ctx_id,
784ca1c9b0cSelric 				      desired_object,
785ca1c9b0cSelric 				      value);
786ca1c9b0cSelric }
787ca1c9b0cSelric 
788ca1c9b0cSelric 
789ca1c9b0cSelric OM_uint32 GSSAPI_CALLCONV
_gss_spnego_pseudo_random(OM_uint32 * minor_status,gss_ctx_id_t context_handle,int prf_key,const gss_buffer_t prf_in,ssize_t desired_output_len,gss_buffer_t prf_out)790ca1c9b0cSelric _gss_spnego_pseudo_random(OM_uint32 *minor_status,
791ca1c9b0cSelric 			  gss_ctx_id_t context_handle,
792ca1c9b0cSelric 			  int prf_key,
793ca1c9b0cSelric 			  const gss_buffer_t prf_in,
794ca1c9b0cSelric 			  ssize_t desired_output_len,
795ca1c9b0cSelric 			  gss_buffer_t prf_out)
796ca1c9b0cSelric {
797ca1c9b0cSelric     gssspnego_ctx ctx;
798ca1c9b0cSelric 
799ca1c9b0cSelric     *minor_status = 0;
800ca1c9b0cSelric 
801ca1c9b0cSelric     if (context_handle == GSS_C_NO_CONTEXT)
802ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
803ca1c9b0cSelric 
804ca1c9b0cSelric     ctx = (gssspnego_ctx)context_handle;
805ca1c9b0cSelric 
806ca1c9b0cSelric     if (ctx->negotiated_ctx_id == GSS_C_NO_CONTEXT)
807ca1c9b0cSelric 	return GSS_S_NO_CONTEXT;
808ca1c9b0cSelric 
809ca1c9b0cSelric     return gss_pseudo_random(minor_status,
810ca1c9b0cSelric 			     ctx->negotiated_ctx_id,
811ca1c9b0cSelric 			     prf_key,
812ca1c9b0cSelric 			     prf_in,
813ca1c9b0cSelric 			     desired_output_len,
814ca1c9b0cSelric 			     prf_out);
815ca1c9b0cSelric }
816