Line data Source code
1 : /*- 2 : * Copyright (c) 2005 Doug Rabson 3 : * All rights reserved. 4 : * 5 : * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 6 : * 7 : * Redistribution and use in source and binary forms, with or without 8 : * modification, are permitted provided that the following conditions 9 : * are met: 10 : * 1. Redistributions of source code must retain the above copyright 11 : * notice, this list of conditions and the following disclaimer. 12 : * 2. Redistributions in binary form must reproduce the above copyright 13 : * notice, this list of conditions and the following disclaimer in the 14 : * documentation and/or other materials provided with the distribution. 15 : * 16 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 : * SUCH DAMAGE. 27 : * 28 : * $FreeBSD: src/lib/libgssapi/gss_canonicalize_name.c,v 1.1 2005/12/29 14:40:20 dfr Exp $ 29 : */ 30 : 31 : #include "mech_locl.h" 32 : 33 : /** 34 : * gss_canonicalize_name takes a Internal Name (IN) and converts in into a 35 : * mechanism specific Mechanism Name (MN). 36 : * 37 : * The input name may multiple name, or generic name types. 38 : * 39 : * If the input_name if of the GSS_C_NT_USER_NAME, and the Kerberos 40 : * mechanism is specified, the resulting MN type is a 41 : * GSS_KRB5_NT_PRINCIPAL_NAME. 42 : * 43 : * For more information about @ref internalVSmechname. 44 : * 45 : * @param minor_status minor status code. 46 : * @param input_name name to covert, unchanged by gss_canonicalize_name(). 47 : * @param mech_type the type to convert Name too. 48 : * @param output_name the resulting type, release with 49 : * gss_release_name(), independent of input_name. 50 : * 51 : * @returns a gss_error code, see gss_display_status() about printing 52 : * the error code. 53 : * 54 : * @ingroup gssapi 55 : */ 56 : 57 : GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL 58 0 : gss_canonicalize_name(OM_uint32 *minor_status, 59 : gss_const_name_t input_name, 60 : const gss_OID mech_type, 61 : gss_name_t *output_name) 62 : { 63 0 : OM_uint32 major_status; 64 0 : struct _gss_name *name = (struct _gss_name *) input_name; 65 0 : struct _gss_mechanism_name *mn; 66 0 : gssapi_mech_interface m; 67 0 : gss_name_t new_canonical_name; 68 : 69 0 : *minor_status = 0; 70 0 : *output_name = GSS_C_NO_NAME; 71 : 72 0 : if ((m = __gss_get_mechanism(mech_type)) == NULL || 73 0 : (m->gm_flags & GM_USE_MG_NAME)) 74 0 : return GSS_S_BAD_MECH; 75 : 76 0 : major_status = _gss_find_mn(minor_status, name, mech_type, &mn); 77 0 : if (major_status) 78 0 : return major_status; 79 0 : if (mn == NULL) 80 0 : return GSS_S_BAD_NAME; 81 : 82 0 : m = mn->gmn_mech; 83 0 : major_status = m->gm_canonicalize_name(minor_status, 84 0 : mn->gmn_name, mech_type, &new_canonical_name); 85 0 : if (major_status) { 86 0 : _gss_mg_error(m, *minor_status); 87 0 : return (major_status); 88 : } 89 : 90 : /* 91 : * Now we make a new name and mark it as an MN. 92 : */ 93 0 : *minor_status = 0; 94 0 : name = _gss_create_name(new_canonical_name, m); 95 0 : if (!name) { 96 0 : m->gm_release_name(minor_status, &new_canonical_name); 97 0 : *minor_status = ENOMEM; 98 0 : return (GSS_S_FAILURE); 99 : } 100 : 101 0 : *output_name = (gss_name_t) name; 102 : 103 0 : return (GSS_S_COMPLETE); 104 : }