1331722Seadler/*
2178828Sdfr * Copyright (c) 2004, PADL Software Pty Ltd.
3178828Sdfr * All rights reserved.
4178828Sdfr *
5178828Sdfr * Redistribution and use in source and binary forms, with or without
6178828Sdfr * modification, are permitted provided that the following conditions
7178828Sdfr * are met:
8178828Sdfr *
9178828Sdfr * 1. Redistributions of source code must retain the above copyright
10178828Sdfr *    notice, this list of conditions and the following disclaimer.
11178828Sdfr *
12178828Sdfr * 2. Redistributions in binary form must reproduce the above copyright
13178828Sdfr *    notice, this list of conditions and the following disclaimer in the
14178828Sdfr *    documentation and/or other materials provided with the distribution.
15178828Sdfr *
16178828Sdfr * 3. Neither the name of PADL Software nor the names of its contributors
17178828Sdfr *    may be used to endorse or promote products derived from this software
18178828Sdfr *    without specific prior written permission.
19178828Sdfr *
20178828Sdfr * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
21178828Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22178828Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23178828Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
24178828Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25178828Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26178828Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27178828Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28178828Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29178828Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30178828Sdfr * SUCH DAMAGE.
31178828Sdfr */
32178828Sdfr/* $FreeBSD$ */
33178828Sdfr
34178828Sdfr#include <gssapi/gssapi.h>
35178828Sdfr
36178828Sdfr#include "mech_switch.h"
37178828Sdfr#include "cred.h"
38178828Sdfr#include "name.h"
39178828Sdfr
40178828Sdfr/* RCSID("$Id: gss_inquire_cred_by_oid.c 19960 2007-01-17 15:09:24Z lha $"); */
41178828Sdfr
42178828SdfrOM_uint32
43178828Sdfrgss_inquire_cred_by_oid (OM_uint32 *minor_status,
44178828Sdfr			 const gss_cred_id_t cred_handle,
45178828Sdfr			 const gss_OID desired_object,
46178828Sdfr			 gss_buffer_set_t *data_set)
47178828Sdfr{
48178828Sdfr	struct _gss_cred *cred = (struct _gss_cred *) cred_handle;
49178828Sdfr	OM_uint32		status = GSS_S_COMPLETE;
50178828Sdfr	struct _gss_mechanism_cred *mc;
51178828Sdfr	struct _gss_mech_switch *m;
52178828Sdfr	gss_buffer_set_t set = GSS_C_NO_BUFFER_SET;
53178828Sdfr
54178828Sdfr	*minor_status = 0;
55178828Sdfr	*data_set = GSS_C_NO_BUFFER_SET;
56178828Sdfr
57178828Sdfr	if (cred == NULL)
58178828Sdfr		return GSS_S_NO_CRED;
59178828Sdfr
60178828Sdfr	SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) {
61178828Sdfr		gss_buffer_set_t rset = GSS_C_NO_BUFFER_SET;
62178828Sdfr		size_t i;
63178828Sdfr
64178828Sdfr		m = mc->gmc_mech;
65178828Sdfr		if (m == NULL) {
66178828Sdfr	       		gss_release_buffer_set(minor_status, &set);
67178828Sdfr			*minor_status = 0;
68178828Sdfr			return GSS_S_BAD_MECH;
69178828Sdfr		}
70178828Sdfr
71178828Sdfr		if (m->gm_inquire_cred_by_oid == NULL)
72178828Sdfr			continue;
73178828Sdfr
74178828Sdfr		status = m->gm_inquire_cred_by_oid(minor_status,
75178828Sdfr		    mc->gmc_cred, desired_object, &rset);
76178828Sdfr		if (status != GSS_S_COMPLETE)
77178828Sdfr			continue;
78178828Sdfr
79178828Sdfr		for (i = 0; i < rset->count; i++) {
80178828Sdfr			status = gss_add_buffer_set_member(minor_status,
81178828Sdfr			     &rset->elements[i], &set);
82178828Sdfr			if (status != GSS_S_COMPLETE)
83178828Sdfr				break;
84178828Sdfr		}
85178828Sdfr		gss_release_buffer_set(minor_status, &rset);
86178828Sdfr	}
87178828Sdfr	if (set == GSS_C_NO_BUFFER_SET)
88178828Sdfr		status = GSS_S_FAILURE;
89178828Sdfr	*data_set = set;
90178828Sdfr	*minor_status = 0;
91178828Sdfr	return status;
92178828Sdfr}
93178828Sdfr
94