1*c19800e8SDoug Rabson /* 2*c19800e8SDoug Rabson * Copyright (c) 2006 Kungliga Tekniska H�gskolan 3*c19800e8SDoug Rabson * (Royal Institute of Technology, Stockholm, Sweden). 4*c19800e8SDoug Rabson * All rights reserved. 5*c19800e8SDoug Rabson * 6*c19800e8SDoug Rabson * Redistribution and use in source and binary forms, with or without 7*c19800e8SDoug Rabson * modification, are permitted provided that the following conditions 8*c19800e8SDoug Rabson * are met: 9*c19800e8SDoug Rabson * 10*c19800e8SDoug Rabson * 1. Redistributions of source code must retain the above copyright 11*c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer. 12*c19800e8SDoug Rabson * 13*c19800e8SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 14*c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer in the 15*c19800e8SDoug Rabson * documentation and/or other materials provided with the distribution. 16*c19800e8SDoug Rabson * 17*c19800e8SDoug Rabson * 3. Neither the name of KTH nor the names of its contributors may be 18*c19800e8SDoug Rabson * used to endorse or promote products derived from this software without 19*c19800e8SDoug Rabson * specific prior written permission. 20*c19800e8SDoug Rabson * 21*c19800e8SDoug Rabson * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22*c19800e8SDoug Rabson * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23*c19800e8SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24*c19800e8SDoug Rabson * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25*c19800e8SDoug Rabson * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26*c19800e8SDoug Rabson * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27*c19800e8SDoug Rabson * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28*c19800e8SDoug Rabson * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29*c19800e8SDoug Rabson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30*c19800e8SDoug Rabson * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31*c19800e8SDoug Rabson * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32*c19800e8SDoug Rabson */ 33*c19800e8SDoug Rabson 34*c19800e8SDoug Rabson #ifdef HAVE_CONFIG_H 35*c19800e8SDoug Rabson #include <config.h> 36*c19800e8SDoug Rabson #endif 37*c19800e8SDoug Rabson 38*c19800e8SDoug Rabson #include <stdio.h> 39*c19800e8SDoug Rabson #include <stdlib.h> 40*c19800e8SDoug Rabson #include <string.h> 41*c19800e8SDoug Rabson #include <stdarg.h> 42*c19800e8SDoug Rabson #include <gssapi.h> 43*c19800e8SDoug Rabson #include <err.h> 44*c19800e8SDoug Rabson #include <roken.h> 45*c19800e8SDoug Rabson #include <getarg.h> 46*c19800e8SDoug Rabson 47*c19800e8SDoug Rabson RCSID("$Id: test_names.c 17856 2006-07-20 05:13:25Z lha $"); 48*c19800e8SDoug Rabson 49*c19800e8SDoug Rabson static void 50*c19800e8SDoug Rabson gss_print_errors (int min_stat) 51*c19800e8SDoug Rabson { 52*c19800e8SDoug Rabson OM_uint32 new_stat; 53*c19800e8SDoug Rabson OM_uint32 msg_ctx = 0; 54*c19800e8SDoug Rabson gss_buffer_desc status_string; 55*c19800e8SDoug Rabson OM_uint32 ret; 56*c19800e8SDoug Rabson 57*c19800e8SDoug Rabson do { 58*c19800e8SDoug Rabson ret = gss_display_status (&new_stat, 59*c19800e8SDoug Rabson min_stat, 60*c19800e8SDoug Rabson GSS_C_MECH_CODE, 61*c19800e8SDoug Rabson GSS_C_NO_OID, 62*c19800e8SDoug Rabson &msg_ctx, 63*c19800e8SDoug Rabson &status_string); 64*c19800e8SDoug Rabson if (!GSS_ERROR(ret)) { 65*c19800e8SDoug Rabson fprintf (stderr, "%s\n", (char *)status_string.value); 66*c19800e8SDoug Rabson gss_release_buffer (&new_stat, &status_string); 67*c19800e8SDoug Rabson } 68*c19800e8SDoug Rabson } while (!GSS_ERROR(ret) && msg_ctx != 0); 69*c19800e8SDoug Rabson } 70*c19800e8SDoug Rabson 71*c19800e8SDoug Rabson static void 72*c19800e8SDoug Rabson gss_err(int exitval, int status, const char *fmt, ...) 73*c19800e8SDoug Rabson { 74*c19800e8SDoug Rabson va_list args; 75*c19800e8SDoug Rabson 76*c19800e8SDoug Rabson va_start(args, fmt); 77*c19800e8SDoug Rabson vwarnx (fmt, args); 78*c19800e8SDoug Rabson gss_print_errors (status); 79*c19800e8SDoug Rabson va_end(args); 80*c19800e8SDoug Rabson exit (exitval); 81*c19800e8SDoug Rabson } 82*c19800e8SDoug Rabson 83*c19800e8SDoug Rabson static int version_flag = 0; 84*c19800e8SDoug Rabson static int help_flag = 0; 85*c19800e8SDoug Rabson 86*c19800e8SDoug Rabson static struct getargs args[] = { 87*c19800e8SDoug Rabson {"version", 0, arg_flag, &version_flag, "print version", NULL }, 88*c19800e8SDoug Rabson {"help", 0, arg_flag, &help_flag, NULL, NULL } 89*c19800e8SDoug Rabson }; 90*c19800e8SDoug Rabson 91*c19800e8SDoug Rabson static void 92*c19800e8SDoug Rabson usage (int ret) 93*c19800e8SDoug Rabson { 94*c19800e8SDoug Rabson arg_printusage (args, sizeof(args)/sizeof(*args), 95*c19800e8SDoug Rabson NULL, "service@host"); 96*c19800e8SDoug Rabson exit (ret); 97*c19800e8SDoug Rabson } 98*c19800e8SDoug Rabson 99*c19800e8SDoug Rabson 100*c19800e8SDoug Rabson int 101*c19800e8SDoug Rabson main(int argc, char **argv) 102*c19800e8SDoug Rabson { 103*c19800e8SDoug Rabson gss_buffer_desc name_buffer; 104*c19800e8SDoug Rabson OM_uint32 maj_stat, min_stat; 105*c19800e8SDoug Rabson gss_name_t name, MNname, MNname2; 106*c19800e8SDoug Rabson int optidx = 0; 107*c19800e8SDoug Rabson char *str; 108*c19800e8SDoug Rabson int len, equal; 109*c19800e8SDoug Rabson 110*c19800e8SDoug Rabson setprogname(argv[0]); 111*c19800e8SDoug Rabson if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 112*c19800e8SDoug Rabson usage(1); 113*c19800e8SDoug Rabson 114*c19800e8SDoug Rabson if (help_flag) 115*c19800e8SDoug Rabson usage (0); 116*c19800e8SDoug Rabson 117*c19800e8SDoug Rabson if(version_flag){ 118*c19800e8SDoug Rabson print_version(NULL); 119*c19800e8SDoug Rabson exit(0); 120*c19800e8SDoug Rabson } 121*c19800e8SDoug Rabson 122*c19800e8SDoug Rabson argc -= optidx; 123*c19800e8SDoug Rabson argv += optidx; 124*c19800e8SDoug Rabson 125*c19800e8SDoug Rabson /* 126*c19800e8SDoug Rabson * test import/export 127*c19800e8SDoug Rabson */ 128*c19800e8SDoug Rabson 129*c19800e8SDoug Rabson len = asprintf(&str, "ftp@freeze-arrow.mit.edu"); 130*c19800e8SDoug Rabson if (len == -1) 131*c19800e8SDoug Rabson errx(1, "asprintf"); 132*c19800e8SDoug Rabson 133*c19800e8SDoug Rabson name_buffer.value = str; 134*c19800e8SDoug Rabson name_buffer.length = len; 135*c19800e8SDoug Rabson 136*c19800e8SDoug Rabson maj_stat = gss_import_name(&min_stat, &name_buffer, 137*c19800e8SDoug Rabson GSS_C_NT_HOSTBASED_SERVICE, 138*c19800e8SDoug Rabson &name); 139*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 140*c19800e8SDoug Rabson gss_err(1, min_stat, "import name error"); 141*c19800e8SDoug Rabson free(str); 142*c19800e8SDoug Rabson 143*c19800e8SDoug Rabson maj_stat = gss_canonicalize_name (&min_stat, 144*c19800e8SDoug Rabson name, 145*c19800e8SDoug Rabson GSS_KRB5_MECHANISM, 146*c19800e8SDoug Rabson &MNname); 147*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 148*c19800e8SDoug Rabson gss_err(1, min_stat, "canonicalize name error"); 149*c19800e8SDoug Rabson 150*c19800e8SDoug Rabson maj_stat = gss_export_name(&min_stat, 151*c19800e8SDoug Rabson MNname, 152*c19800e8SDoug Rabson &name_buffer); 153*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 154*c19800e8SDoug Rabson gss_err(1, min_stat, "export name error (KRB5)"); 155*c19800e8SDoug Rabson 156*c19800e8SDoug Rabson /* 157*c19800e8SDoug Rabson * Import the exported name and compare 158*c19800e8SDoug Rabson */ 159*c19800e8SDoug Rabson 160*c19800e8SDoug Rabson maj_stat = gss_import_name(&min_stat, &name_buffer, 161*c19800e8SDoug Rabson GSS_C_NT_EXPORT_NAME, 162*c19800e8SDoug Rabson &MNname2); 163*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 164*c19800e8SDoug Rabson gss_err(1, min_stat, "import name error (exported KRB5 name)"); 165*c19800e8SDoug Rabson 166*c19800e8SDoug Rabson 167*c19800e8SDoug Rabson maj_stat = gss_compare_name(&min_stat, MNname, MNname2, &equal); 168*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 169*c19800e8SDoug Rabson errx(1, "gss_compare_name"); 170*c19800e8SDoug Rabson if (!equal) 171*c19800e8SDoug Rabson errx(1, "names not equal"); 172*c19800e8SDoug Rabson 173*c19800e8SDoug Rabson gss_release_name(&min_stat, &MNname2); 174*c19800e8SDoug Rabson gss_release_buffer(&min_stat, &name_buffer); 175*c19800e8SDoug Rabson gss_release_name(&min_stat, &MNname); 176*c19800e8SDoug Rabson gss_release_name(&min_stat, &name); 177*c19800e8SDoug Rabson 178*c19800e8SDoug Rabson /* 179*c19800e8SDoug Rabson * Import oid less name and compare to mech name. 180*c19800e8SDoug Rabson * Dovecot SASL lib does this. 181*c19800e8SDoug Rabson */ 182*c19800e8SDoug Rabson 183*c19800e8SDoug Rabson len = asprintf(&str, "lha"); 184*c19800e8SDoug Rabson if (len == -1) 185*c19800e8SDoug Rabson errx(1, "asprintf"); 186*c19800e8SDoug Rabson 187*c19800e8SDoug Rabson name_buffer.value = str; 188*c19800e8SDoug Rabson name_buffer.length = len; 189*c19800e8SDoug Rabson 190*c19800e8SDoug Rabson maj_stat = gss_import_name(&min_stat, &name_buffer, 191*c19800e8SDoug Rabson GSS_C_NO_OID, 192*c19800e8SDoug Rabson &name); 193*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 194*c19800e8SDoug Rabson gss_err(1, min_stat, "import (no oid) name error"); 195*c19800e8SDoug Rabson 196*c19800e8SDoug Rabson maj_stat = gss_import_name(&min_stat, &name_buffer, 197*c19800e8SDoug Rabson GSS_KRB5_NT_USER_NAME, 198*c19800e8SDoug Rabson &MNname); 199*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 200*c19800e8SDoug Rabson gss_err(1, min_stat, "import (krb5 mn) name error"); 201*c19800e8SDoug Rabson 202*c19800e8SDoug Rabson free(str); 203*c19800e8SDoug Rabson 204*c19800e8SDoug Rabson maj_stat = gss_compare_name(&min_stat, name, MNname, &equal); 205*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 206*c19800e8SDoug Rabson errx(1, "gss_compare_name"); 207*c19800e8SDoug Rabson if (!equal) 208*c19800e8SDoug Rabson errx(1, "names not equal"); 209*c19800e8SDoug Rabson 210*c19800e8SDoug Rabson gss_release_name(&min_stat, &MNname); 211*c19800e8SDoug Rabson gss_release_name(&min_stat, &name); 212*c19800e8SDoug Rabson 213*c19800e8SDoug Rabson #if 0 214*c19800e8SDoug Rabson maj_stat = gss_canonicalize_name (&min_stat, 215*c19800e8SDoug Rabson name, 216*c19800e8SDoug Rabson GSS_SPNEGO_MECHANISM, 217*c19800e8SDoug Rabson &MNname); 218*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 219*c19800e8SDoug Rabson gss_err(1, min_stat, "canonicalize name error"); 220*c19800e8SDoug Rabson 221*c19800e8SDoug Rabson 222*c19800e8SDoug Rabson maj_stat = gss_export_name(&maj_stat, 223*c19800e8SDoug Rabson MNname, 224*c19800e8SDoug Rabson &name_buffer); 225*c19800e8SDoug Rabson if (maj_stat != GSS_S_COMPLETE) 226*c19800e8SDoug Rabson gss_err(1, min_stat, "export name error (SPNEGO)"); 227*c19800e8SDoug Rabson 228*c19800e8SDoug Rabson gss_release_name(&min_stat, &MNname); 229*c19800e8SDoug Rabson gss_release_buffer(&min_stat, &name_buffer); 230*c19800e8SDoug Rabson #endif 231*c19800e8SDoug Rabson 232*c19800e8SDoug Rabson return 0; 233*c19800e8SDoug Rabson } 234