xref: /illumos-gate/usr/src/lib/libgss/g_process_context.c (revision 571575105382b90dc07db52b51d687862849dd05)
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 gss_process_context
28   */
29  
30  #include <mechglueP.h>
31  
32  OM_uint32
33  gss_process_context_token(minor_status,
34  				context_handle,
35  				token_buffer)
36  
37  OM_uint32 *			minor_status;
38  const gss_ctx_id_t		context_handle;
39  gss_buffer_t			token_buffer;
40  
41  {
42  	OM_uint32		status;
43  	gss_union_ctx_id_t	ctx;
44  	gss_mechanism		mech;
45  
46  	if (minor_status == NULL)
47  		return (GSS_S_CALL_INACCESSIBLE_WRITE);
48  	*minor_status = 0;
49  
50  	if (context_handle == GSS_C_NO_CONTEXT)
51  		return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT);
52  
53  	if (token_buffer == GSS_C_NO_BUFFER)
54  		return (GSS_S_CALL_INACCESSIBLE_READ);
55  
56  	if (GSS_EMPTY_BUFFER(token_buffer))
57  		return (GSS_S_CALL_INACCESSIBLE_READ);
58  
59  	/*
60  	 * select the approprate underlying mechanism routine and
61  	 * call it.
62  	 */
63  
64  	ctx = (gss_union_ctx_id_t) context_handle;
65  	mech = __gss_get_mechanism(ctx->mech_type);
66  
67  	if (mech) {
68  
69  		if (mech->gss_process_context_token)
70  			status = mech->gss_process_context_token(
71  							mech->context,
72  							minor_status,
73  							ctx->internal_ctx_id,
74  							token_buffer);
75  		else
76  			status = GSS_S_UNAVAILABLE;
77  
78  		return (status);
79  	}
80  
81  	return (GSS_S_BAD_MECH);
82  }
83