Path: blob/main/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred.c
34907 views
/*-1* Copyright (c) 2005 Doug Rabson2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*25* $FreeBSD: src/lib/libgssapi/gss_inquire_cred.c,v 1.1 2005/12/29 14:40:20 dfr Exp $26*/2728#include "mech_locl.h"2930#define AUSAGE 131#define IUSAGE 23233static void34updateusage(gss_cred_usage_t usage, int *usagemask)35{36if (usage == GSS_C_BOTH)37*usagemask |= AUSAGE | IUSAGE;38else if (usage == GSS_C_ACCEPT)39*usagemask |= AUSAGE;40else if (usage == GSS_C_INITIATE)41*usagemask |= IUSAGE;42}4344GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL45gss_inquire_cred(OM_uint32 *minor_status,46const gss_cred_id_t cred_handle,47gss_name_t *name_ret,48OM_uint32 *lifetime,49gss_cred_usage_t *cred_usage,50gss_OID_set *mechanisms)51{52OM_uint32 major_status;53struct _gss_mech_switch *m;54struct _gss_cred *cred = (struct _gss_cred *) cred_handle;55struct _gss_name *name;56struct _gss_mechanism_name *mn;57OM_uint32 min_lifetime;58int found = 0;59int usagemask = 0;60gss_cred_usage_t usage;6162_gss_load_mech();6364*minor_status = 0;65if (name_ret)66*name_ret = GSS_C_NO_NAME;67if (lifetime)68*lifetime = 0;69if (cred_usage)70*cred_usage = 0;71if (mechanisms)72*mechanisms = GSS_C_NO_OID_SET;7374if (name_ret) {75name = calloc(1, sizeof(*name));76if (name == NULL) {77*minor_status = ENOMEM;78return (GSS_S_FAILURE);79}80HEIM_SLIST_INIT(&name->gn_mn);81} else {82name = NULL;83}8485if (mechanisms) {86major_status = gss_create_empty_oid_set(minor_status,87mechanisms);88if (major_status) {89if (name) free(name);90return (major_status);91}92}9394min_lifetime = GSS_C_INDEFINITE;95if (cred) {96struct _gss_mechanism_cred *mc;9798HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) {99gss_name_t mc_name;100OM_uint32 mc_lifetime;101102major_status = mc->gmc_mech->gm_inquire_cred(minor_status,103mc->gmc_cred, &mc_name, &mc_lifetime, &usage, NULL);104if (major_status)105continue;106107updateusage(usage, &usagemask);108if (name) {109mn = malloc(sizeof(struct _gss_mechanism_name));110if (!mn) {111mc->gmc_mech->gm_release_name(minor_status,112&mc_name);113continue;114}115mn->gmn_mech = mc->gmc_mech;116mn->gmn_mech_oid = mc->gmc_mech_oid;117mn->gmn_name = mc_name;118HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link);119} else {120mc->gmc_mech->gm_release_name(minor_status,121&mc_name);122}123124if (mc_lifetime < min_lifetime)125min_lifetime = mc_lifetime;126127if (mechanisms)128gss_add_oid_set_member(minor_status,129mc->gmc_mech_oid, mechanisms);130found++;131}132} else {133HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) {134gss_name_t mc_name;135OM_uint32 mc_lifetime;136137major_status = m->gm_mech.gm_inquire_cred(minor_status,138GSS_C_NO_CREDENTIAL, &mc_name, &mc_lifetime,139&usage, NULL);140if (major_status)141continue;142143updateusage(usage, &usagemask);144if (name && mc_name) {145mn = malloc(146sizeof(struct _gss_mechanism_name));147if (!mn) {148m->gm_mech.gm_release_name(149minor_status, &mc_name);150continue;151}152mn->gmn_mech = &m->gm_mech;153mn->gmn_mech_oid = &m->gm_mech_oid;154mn->gmn_name = mc_name;155HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link);156} else if (mc_name) {157m->gm_mech.gm_release_name(minor_status,158&mc_name);159}160161if (mc_lifetime < min_lifetime)162min_lifetime = mc_lifetime;163164if (mechanisms)165gss_add_oid_set_member(minor_status,166&m->gm_mech_oid, mechanisms);167found++;168}169}170171if (found == 0) {172gss_name_t n = (gss_name_t)name;173if (n)174gss_release_name(minor_status, &n);175gss_release_oid_set(minor_status, mechanisms);176*minor_status = 0;177return (GSS_S_NO_CRED);178}179180*minor_status = 0;181if (name_ret)182*name_ret = (gss_name_t) name;183if (lifetime)184*lifetime = min_lifetime;185if (cred_usage) {186if ((usagemask & (AUSAGE|IUSAGE)) == (AUSAGE|IUSAGE))187*cred_usage = GSS_C_BOTH;188else if (usagemask & IUSAGE)189*cred_usage = GSS_C_INITIATE;190else if (usagemask & AUSAGE)191*cred_usage = GSS_C_ACCEPT;192}193return (GSS_S_COMPLETE);194}195196197