xref: /freebsd/lib/libgssapi/gss_buffer_set.c (revision 2a63c3be158216222d89a073dcbd6a72ee4aab5a)
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 
3533f12199SDoug Rabson #include <gssapi/gssapi.h>
3633f12199SDoug Rabson #include <errno.h>
3733f12199SDoug Rabson #include <stdlib.h>
3833f12199SDoug Rabson #include <string.h>
3933f12199SDoug Rabson 
4033f12199SDoug Rabson /* RCSID("$Id: gss_buffer_set.c 18885 2006-10-24 21:53:02Z lha $"); */
4133f12199SDoug Rabson 
4233f12199SDoug Rabson OM_uint32
gss_create_empty_buffer_set(OM_uint32 * minor_status,gss_buffer_set_t * buffer_set)4333f12199SDoug Rabson gss_create_empty_buffer_set(OM_uint32 * minor_status,
4433f12199SDoug Rabson     gss_buffer_set_t *buffer_set)
4533f12199SDoug Rabson {
4633f12199SDoug Rabson 	gss_buffer_set_t set;
4733f12199SDoug Rabson 
4833f12199SDoug Rabson 	set = (gss_buffer_set_desc *) malloc(sizeof(*set));
4933f12199SDoug Rabson 	if (set == GSS_C_NO_BUFFER_SET) {
5033f12199SDoug Rabson 		*minor_status = ENOMEM;
5133f12199SDoug Rabson 		return (GSS_S_FAILURE);
5233f12199SDoug Rabson 	}
5333f12199SDoug Rabson 
5433f12199SDoug Rabson 	set->count = 0;
5533f12199SDoug Rabson 	set->elements = NULL;
5633f12199SDoug Rabson 
5733f12199SDoug Rabson 	*buffer_set = set;
5833f12199SDoug Rabson 
5933f12199SDoug Rabson 	*minor_status = 0;
6033f12199SDoug Rabson 	return (GSS_S_COMPLETE);
6133f12199SDoug Rabson }
6233f12199SDoug Rabson 
6333f12199SDoug Rabson OM_uint32
gss_add_buffer_set_member(OM_uint32 * minor_status,const gss_buffer_t member_buffer,gss_buffer_set_t * buffer_set)6433f12199SDoug Rabson gss_add_buffer_set_member(OM_uint32 * minor_status,
6533f12199SDoug Rabson     const gss_buffer_t member_buffer, gss_buffer_set_t *buffer_set)
6633f12199SDoug Rabson {
6733f12199SDoug Rabson 	gss_buffer_set_t set;
6833f12199SDoug Rabson 	gss_buffer_t p;
6933f12199SDoug Rabson 	OM_uint32 ret;
7033f12199SDoug Rabson 
7133f12199SDoug Rabson 	if (*buffer_set == GSS_C_NO_BUFFER_SET) {
7233f12199SDoug Rabson 		ret = gss_create_empty_buffer_set(minor_status,
7333f12199SDoug Rabson 		    buffer_set);
7433f12199SDoug Rabson 		if (ret) {
7533f12199SDoug Rabson 			return (ret);
7633f12199SDoug Rabson 		}
7733f12199SDoug Rabson 	}
7833f12199SDoug Rabson 
7933f12199SDoug Rabson 	set = *buffer_set;
80efa8af7cSPedro F. Giffuni 	set->elements = reallocarray(set->elements, set->count + 1,
81efa8af7cSPedro F. Giffuni 	    sizeof(set->elements[0]));
8233f12199SDoug Rabson 	if (set->elements == NULL) {
8333f12199SDoug Rabson 		*minor_status = ENOMEM;
8433f12199SDoug Rabson 		return (GSS_S_FAILURE);
8533f12199SDoug Rabson 	}
8633f12199SDoug Rabson 
8733f12199SDoug Rabson 	p = &set->elements[set->count];
8833f12199SDoug Rabson 
8933f12199SDoug Rabson 	p->value = malloc(member_buffer->length);
9033f12199SDoug Rabson 	if (p->value == NULL) {
9133f12199SDoug Rabson 		*minor_status = ENOMEM;
9233f12199SDoug Rabson 		return (GSS_S_FAILURE);
9333f12199SDoug Rabson 	}
9433f12199SDoug Rabson 	memcpy(p->value, member_buffer->value, member_buffer->length);
9533f12199SDoug Rabson 	p->length = member_buffer->length;
9633f12199SDoug Rabson 
9733f12199SDoug Rabson 	set->count++;
9833f12199SDoug Rabson 
9933f12199SDoug Rabson 	*minor_status = 0;
10033f12199SDoug Rabson 	return (GSS_S_COMPLETE);
10133f12199SDoug Rabson }
10233f12199SDoug Rabson 
10333f12199SDoug Rabson OM_uint32
gss_release_buffer_set(OM_uint32 * minor_status,gss_buffer_set_t * buffer_set)10433f12199SDoug Rabson gss_release_buffer_set(OM_uint32 * minor_status, gss_buffer_set_t *buffer_set)
10533f12199SDoug Rabson {
10633f12199SDoug Rabson 	size_t i;
10733f12199SDoug Rabson 	OM_uint32 minor;
10833f12199SDoug Rabson 
10933f12199SDoug Rabson 	*minor_status = 0;
11033f12199SDoug Rabson 
11133f12199SDoug Rabson 	if (*buffer_set == GSS_C_NO_BUFFER_SET)
11233f12199SDoug Rabson 		return (GSS_S_COMPLETE);
11333f12199SDoug Rabson 
11433f12199SDoug Rabson 	for (i = 0; i < (*buffer_set)->count; i++)
11533f12199SDoug Rabson 		gss_release_buffer(&minor, &((*buffer_set)->elements[i]));
11633f12199SDoug Rabson 
11733f12199SDoug Rabson 	free((*buffer_set)->elements);
11833f12199SDoug Rabson 
11933f12199SDoug Rabson 	(*buffer_set)->elements = NULL;
12033f12199SDoug Rabson 	(*buffer_set)->count = 0;
12133f12199SDoug Rabson 
12233f12199SDoug Rabson 	free(*buffer_set);
12333f12199SDoug Rabson 	*buffer_set = GSS_C_NO_BUFFER_SET;
12433f12199SDoug Rabson 
12533f12199SDoug Rabson 	return (GSS_S_COMPLETE);
12633f12199SDoug Rabson }
12733f12199SDoug Rabson 
128