gss_inquire_cred.c revision 303975
168349Sobrien/*- 2133359Sobrien * Copyright (c) 2005 Doug Rabson 3133359Sobrien * All rights reserved. 4133359Sobrien * 5133359Sobrien * Redistribution and use in source and binary forms, with or without 6133359Sobrien * modification, are permitted provided that the following conditions 7133359Sobrien * are met: 8133359Sobrien * 1. Redistributions of source code must retain the above copyright 9133359Sobrien * notice, this list of conditions and the following disclaimer. 10133359Sobrien * 2. Redistributions in binary form must reproduce the above copyright 11133359Sobrien * notice, this list of conditions and the following disclaimer in the 12133359Sobrien * documentation and/or other materials provided with the distribution. 13133359Sobrien * 14133359Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15133359Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16133359Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17133359Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18133359Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19133359Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20133359Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21133359Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22133359Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23133359Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24133359Sobrien * SUCH DAMAGE. 25133359Sobrien * 26133359Sobrien * $FreeBSD: releng/11.0/lib/libgssapi/gss_inquire_cred.c 178828 2008-05-07 13:53:12Z dfr $ 27133359Sobrien */ 28133359Sobrien 2968349Sobrien#include <gssapi/gssapi.h> 3068349Sobrien#include <stdlib.h> 3168349Sobrien#include <string.h> 3280588Sobrien#include <errno.h> 33133359Sobrien 34175296Sobrien#include "mech_switch.h" 3568349Sobrien#include "name.h" 3684685Sobrien#include "cred.h" 3784685Sobrien 3884685Sobrien#define AUSAGE 1 3968349Sobrien#define IUSAGE 2 40169942Sobrien 4168349Sobrienstatic void 42103373Sobrienupdateusage(gss_cred_usage_t usage, int *usagemask) 43133359Sobrien{ 44133359Sobrien if (usage == GSS_C_BOTH) 4574784Sobrien *usagemask |= AUSAGE | IUSAGE; 4674784Sobrien else if (usage == GSS_C_ACCEPT) 4774784Sobrien *usagemask |= AUSAGE; 4868349Sobrien else if (usage == GSS_C_INITIATE) 4968349Sobrien *usagemask |= IUSAGE; 50175296Sobrien} 5168349Sobrien 5268349SobrienOM_uint32 5368349Sobriengss_inquire_cred(OM_uint32 *minor_status, 5468349Sobrien const gss_cred_id_t cred_handle, 5568349Sobrien gss_name_t *name_ret, 5668349Sobrien OM_uint32 *lifetime, 5775937Sobrien gss_cred_usage_t *cred_usage, 5875937Sobrien gss_OID_set *mechanisms) 5975937Sobrien{ 6075937Sobrien OM_uint32 major_status; 6175937Sobrien struct _gss_mech_switch *m; 6275937Sobrien struct _gss_cred *cred = (struct _gss_cred *) cred_handle; 6375937Sobrien struct _gss_name *name; 6475937Sobrien struct _gss_mechanism_name *mn; 6575937Sobrien OM_uint32 min_lifetime; 6668349Sobrien int found = 0; 6775937Sobrien int usagemask = 0; 6875937Sobrien gss_cred_usage_t usage; 6975937Sobrien 7068349Sobrien _gss_load_mech(); 7175937Sobrien 7275937Sobrien *minor_status = 0; 7375937Sobrien if (name_ret) 7475937Sobrien *name_ret = GSS_C_NO_NAME; 75133359Sobrien if (lifetime) 76133359Sobrien *lifetime = 0; 7768349Sobrien if (cred_usage) 7868349Sobrien *cred_usage = 0; 79159764Sobrien if (mechanisms) 80159764Sobrien *mechanisms = GSS_C_NO_OID_SET; 81159764Sobrien 82159764Sobrien if (name_ret) { 83159764Sobrien name = malloc(sizeof(struct _gss_name)); 84159764Sobrien if (name == NULL) { 85169962Sobrien *minor_status = ENOMEM; 86169962Sobrien return (GSS_S_FAILURE); 87169962Sobrien } 88169962Sobrien memset(name, 0, sizeof(struct _gss_name)); 89169942Sobrien SLIST_INIT(&name->gn_mn); 90169962Sobrien } else { 91133359Sobrien name = NULL; 92159764Sobrien } 93169962Sobrien 94159764Sobrien if (mechanisms) { 95169942Sobrien major_status = gss_create_empty_oid_set(minor_status, 96159764Sobrien mechanisms); 97133359Sobrien if (major_status) { 98159764Sobrien if (name) free(name); 99159764Sobrien return (major_status); 100133359Sobrien } 101133359Sobrien } 102133359Sobrien 103133359Sobrien min_lifetime = GSS_C_INDEFINITE; 104133359Sobrien if (cred) { 105133359Sobrien struct _gss_mechanism_cred *mc; 106169942Sobrien 107139368Sobrien SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { 108133359Sobrien gss_name_t mc_name; 109133359Sobrien OM_uint32 mc_lifetime; 110133359Sobrien 111133359Sobrien major_status = mc->gmc_mech->gm_inquire_cred(minor_status, 112169942Sobrien mc->gmc_cred, &mc_name, &mc_lifetime, &usage, NULL); 113139368Sobrien if (major_status) 114175296Sobrien continue; 11568349Sobrien 116133359Sobrien updateusage(usage, &usagemask); 117133359Sobrien if (name && mc_name) { 11868349Sobrien mn = malloc(sizeof(struct _gss_mechanism_name)); 119159764Sobrien if (!mn) { 12080588Sobrien mc->gmc_mech->gm_release_name(minor_status, 12174784Sobrien &mc_name); 122103373Sobrien continue; 12380588Sobrien } 12480588Sobrien mn->gmn_mech = mc->gmc_mech; 125103373Sobrien mn->gmn_mech_oid = mc->gmc_mech_oid; 12680588Sobrien mn->gmn_name = mc_name; 12780588Sobrien SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); 128133359Sobrien } else if (mc_name) { 129133359Sobrien mc->gmc_mech->gm_release_name(minor_status, 13080588Sobrien &mc_name); 13180588Sobrien } 13280588Sobrien 13380588Sobrien if (mc_lifetime < min_lifetime) 13480588Sobrien min_lifetime = mc_lifetime; 13580588Sobrien 13680588Sobrien if (mechanisms) 137133359Sobrien gss_add_oid_set_member(minor_status, 138133359Sobrien mc->gmc_mech_oid, mechanisms); 13980588Sobrien found++; 14080588Sobrien } 141133359Sobrien } else { 142133359Sobrien SLIST_FOREACH(m, &_gss_mechs, gm_link) { 143133359Sobrien gss_name_t mc_name; 144133359Sobrien OM_uint32 mc_lifetime; 145133359Sobrien 146133359Sobrien major_status = m->gm_inquire_cred(minor_status, 147133359Sobrien GSS_C_NO_CREDENTIAL, &mc_name, &mc_lifetime, 148133359Sobrien &usage, NULL); 149133359Sobrien if (major_status) 15080588Sobrien continue; 15180588Sobrien 15280588Sobrien updateusage(usage, &usagemask); 153169962Sobrien if (name && mc_name) { 154169962Sobrien mn = malloc( 155169962Sobrien sizeof(struct _gss_mechanism_name)); 156169962Sobrien if (!mn) { 157169962Sobrien m->gm_release_name( 158169962Sobrien minor_status, &mc_name); 159169962Sobrien continue; 160169962Sobrien } 161169962Sobrien mn->gmn_mech = m; 162169962Sobrien mn->gmn_mech_oid = &m->gm_mech_oid; 163169962Sobrien mn->gmn_name = mc_name; 164169962Sobrien SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); 165169962Sobrien } else if (mc_name) { 166169962Sobrien m->gm_release_name(minor_status, 167169962Sobrien &mc_name); 168169962Sobrien } 169169962Sobrien 170169962Sobrien if (mc_lifetime < min_lifetime) 171169962Sobrien min_lifetime = mc_lifetime; 172169962Sobrien 173169962Sobrien if (mechanisms) 174169962Sobrien gss_add_oid_set_member(minor_status, 175169962Sobrien &m->gm_mech_oid, mechanisms); 176169962Sobrien found++; 177169962Sobrien } 178169962Sobrien } 179169962Sobrien 180169962Sobrien if (found == 0) { 181169962Sobrien gss_name_t n = (gss_name_t)name; 182169962Sobrien if (n) 183169962Sobrien gss_release_name(minor_status, &n); 184169962Sobrien gss_release_oid_set(minor_status, mechanisms); 185169962Sobrien *minor_status = 0; 186169962Sobrien return (GSS_S_NO_CRED); 187169962Sobrien } 188169962Sobrien 189169962Sobrien *minor_status = 0; 190169962Sobrien if (name_ret) 191169962Sobrien *name_ret = (gss_name_t) name; 192169962Sobrien if (lifetime) 193175296Sobrien *lifetime = min_lifetime; 194175296Sobrien if (cred_usage) { 195175296Sobrien if ((usagemask & (AUSAGE|IUSAGE)) == (AUSAGE|IUSAGE)) 196175296Sobrien *cred_usage = GSS_C_BOTH; 197175296Sobrien else if (usagemask & IUSAGE) 198175296Sobrien *cred_usage = GSS_C_INITIATE; 199169962Sobrien else if (usagemask & AUSAGE) 200169962Sobrien *cred_usage = GSS_C_ACCEPT; 201169962Sobrien } 202169962Sobrien return (GSS_S_COMPLETE); 20380588Sobrien} 204169962Sobrien