1*8a16b7a1SPedro F. Giffuni /*- 2*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*8a16b7a1SPedro F. Giffuni * 433f12199SDoug Rabson * Copyright (c) 2004, PADL Software Pty Ltd. 533f12199SDoug Rabson * All rights reserved. 633f12199SDoug Rabson * 733f12199SDoug Rabson * Redistribution and use in source and binary forms, with or without 833f12199SDoug Rabson * modification, are permitted provided that the following conditions 933f12199SDoug Rabson * are met: 1033f12199SDoug Rabson * 1133f12199SDoug Rabson * 1. Redistributions of source code must retain the above copyright 1233f12199SDoug Rabson * notice, this list of conditions and the following disclaimer. 1333f12199SDoug Rabson * 1433f12199SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 1533f12199SDoug Rabson * notice, this list of conditions and the following disclaimer in the 1633f12199SDoug Rabson * documentation and/or other materials provided with the distribution. 1733f12199SDoug Rabson * 1833f12199SDoug Rabson * 3. Neither the name of PADL Software nor the names of its contributors 1933f12199SDoug Rabson * may be used to endorse or promote products derived from this software 2033f12199SDoug Rabson * without specific prior written permission. 2133f12199SDoug Rabson * 2233f12199SDoug Rabson * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND 2333f12199SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2433f12199SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2533f12199SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE 2633f12199SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2733f12199SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2833f12199SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2933f12199SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3033f12199SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3133f12199SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3233f12199SDoug Rabson * SUCH DAMAGE. 3333f12199SDoug Rabson */ 3433f12199SDoug Rabson /* $FreeBSD$ */ 3533f12199SDoug Rabson /* RCSID("$Id: gss_set_sec_context_option.c 19928 2007-01-16 10:37:54Z lha $"); */ 3633f12199SDoug Rabson 3733f12199SDoug Rabson #include <gssapi/gssapi.h> 3833f12199SDoug Rabson 3933f12199SDoug Rabson #include "mech_switch.h" 4033f12199SDoug Rabson #include "context.h" 4133f12199SDoug Rabson 4233f12199SDoug Rabson OM_uint32 4333f12199SDoug Rabson gss_set_sec_context_option (OM_uint32 *minor_status, 4433f12199SDoug Rabson gss_ctx_id_t *context_handle, 4533f12199SDoug Rabson const gss_OID object, 4633f12199SDoug Rabson const gss_buffer_t value) 4733f12199SDoug Rabson { 4833f12199SDoug Rabson struct _gss_context *ctx; 4933f12199SDoug Rabson OM_uint32 major_status; 5033f12199SDoug Rabson struct _gss_mech_switch *m; 5133f12199SDoug Rabson int one_ok = 0; 5233f12199SDoug Rabson 5333f12199SDoug Rabson *minor_status = 0; 5433f12199SDoug Rabson 5533f12199SDoug Rabson if (context_handle == NULL) { 5633f12199SDoug Rabson _gss_load_mech(); 5733f12199SDoug Rabson major_status = GSS_S_BAD_MECH; 5833f12199SDoug Rabson SLIST_FOREACH(m, &_gss_mechs, gm_link) { 5933f12199SDoug Rabson if (!m->gm_set_sec_context_option) 6033f12199SDoug Rabson continue; 6133f12199SDoug Rabson major_status = m->gm_set_sec_context_option( 6233f12199SDoug Rabson minor_status, 6333f12199SDoug Rabson NULL, object, value); 6433f12199SDoug Rabson if (major_status == GSS_S_COMPLETE) 6533f12199SDoug Rabson one_ok = 1; 6633f12199SDoug Rabson } 6733f12199SDoug Rabson if (one_ok) { 6833f12199SDoug Rabson *minor_status = 0; 6933f12199SDoug Rabson return (GSS_S_COMPLETE); 7033f12199SDoug Rabson } 7133f12199SDoug Rabson return (major_status); 7233f12199SDoug Rabson } 7333f12199SDoug Rabson 7433f12199SDoug Rabson ctx = (struct _gss_context *) *context_handle; 7533f12199SDoug Rabson 7633f12199SDoug Rabson if (ctx == NULL) 7733f12199SDoug Rabson return (GSS_S_NO_CONTEXT); 7833f12199SDoug Rabson 7933f12199SDoug Rabson m = ctx->gc_mech; 8033f12199SDoug Rabson 8133f12199SDoug Rabson if (m == NULL) 8233f12199SDoug Rabson return (GSS_S_BAD_MECH); 8333f12199SDoug Rabson 8433f12199SDoug Rabson if (m->gm_set_sec_context_option != NULL) { 8533f12199SDoug Rabson major_status = m->gm_set_sec_context_option(minor_status, 8633f12199SDoug Rabson &ctx->gc_ctx, object, value); 8733f12199SDoug Rabson if (major_status != GSS_S_COMPLETE) 8833f12199SDoug Rabson _gss_mg_error(m, major_status, *minor_status); 8933f12199SDoug Rabson } else 9033f12199SDoug Rabson major_status = (GSS_S_BAD_MECH); 9133f12199SDoug Rabson 9233f12199SDoug Rabson return (major_status); 9333f12199SDoug Rabson } 9433f12199SDoug Rabson 95