1198090Srdivacky/* 2198090Srdivacky * Copyright (c) 2006 Kungliga Tekniska H��gskolan 3198090Srdivacky * (Royal Institute of Technology, Stockholm, Sweden). 4198090Srdivacky * All rights reserved. 5198090Srdivacky * 6198090Srdivacky * Portions Copyright (c) 2009 - 2010 Apple Inc. All rights reserved. 7198090Srdivacky * 8198090Srdivacky * Redistribution and use in source and binary forms, with or without 9198090Srdivacky * modification, are permitted provided that the following conditions 10198090Srdivacky * are met: 11198090Srdivacky * 12198090Srdivacky * 1. Redistributions of source code must retain the above copyright 13198090Srdivacky * notice, this list of conditions and the following disclaimer. 14198090Srdivacky * 15198090Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 16198090Srdivacky * notice, this list of conditions and the following disclaimer in the 17198090Srdivacky * documentation and/or other materials provided with the distribution. 18198090Srdivacky * 19198090Srdivacky * 3. Neither the name of KTH nor the names of its contributors may be 20198090Srdivacky * used to endorse or promote products derived from this software without 21198090Srdivacky * specific prior written permission. 22263508Sdim * 23198090Srdivacky * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 24198090Srdivacky * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25198090Srdivacky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26198090Srdivacky * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 27249423Sdim * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28249423Sdim * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29249423Sdim * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 30218893Sdim * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31198090Srdivacky * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 32198090Srdivacky * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 33251662Sdim * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34251662Sdim */ 35218893Sdim 36218893Sdim#include <config.h> 37204961Srdivacky#include <roken.h> 38204961Srdivacky 39251662Sdim#include <stdio.h> 40263508Sdim#include <gssapi.h> 41204961Srdivacky#include <gssapi_krb5.h> 42249423Sdim#include <gssapi_spnego.h> 43249423Sdim#include <gssapi_ntlm.h> 44249423Sdim#include <err.h> 45202878Srdivacky#include <getarg.h> 46218893Sdim#include <rtbl.h> 47198090Srdivacky#include <gss-commands.h> 48198090Srdivacky 49218893Sdim 50218893Sdimstatic int version_flag = 0; 51218893Sdimstatic int help_flag = 0; 52224145Sdim 53224145Sdimstatic struct getargs args[] = { 54198090Srdivacky {"version", 0, arg_flag, &version_flag, "print version", NULL }, 55263508Sdim {"help", 0, arg_flag, &help_flag, NULL, NULL } 56263508Sdim}; 57263508Sdim 58198090Srdivackystatic void 59198090Srdivackyusage (int ret) 60208599Srdivacky{ 61208599Srdivacky arg_printusage (args, sizeof(args)/sizeof(*args), 62208599Srdivacky NULL, "service@host"); 63208599Srdivacky exit (ret); 64208599Srdivacky} 65234353Sdim 66208599Srdivacky#define COL_OID "OID" 67203954Srdivacky#define COL_NAME "Name" 68202878Srdivacky#define COL_DESC "Description" 69198090Srdivacky#define COL_VALUE "Value" 70226633Sdim#define COL_MECH "Mech" 71226633Sdim#define COL_EXPIRE "Expire" 72198090Srdivacky#define COL_SASL "SASL" 73239462Sdim 74208599Srdivackyint 75208599Srdivackysupported_mechanisms(void *argptr, int argc, char **argv) 76263508Sdim{ 77198090Srdivacky OM_uint32 maj_stat, min_stat; 78263508Sdim gss_OID_set mechs; 79221345Sdim rtbl_t ct; 80221345Sdim size_t i; 81203954Srdivacky 82198090Srdivacky maj_stat = gss_indicate_mechs(&min_stat, &mechs); 83198090Srdivacky if (maj_stat != GSS_S_COMPLETE) 84198090Srdivacky errx(1, "gss_indicate_mechs failed"); 85198090Srdivacky 86204642Srdivacky printf("Supported mechanisms:\n"); 87204642Srdivacky 88204642Srdivacky ct = rtbl_create(); 89234353Sdim if (ct == NULL) 90234353Sdim errx(1, "rtbl_create"); 91239462Sdim 92203954Srdivacky rtbl_set_separator(ct, " "); 93234353Sdim rtbl_add_column(ct, COL_OID, 0); 94249423Sdim rtbl_add_column(ct, COL_NAME, 0); 95218893Sdim rtbl_add_column(ct, COL_DESC, 0); 96218893Sdim rtbl_add_column(ct, COL_SASL, 0); 97218893Sdim 98218893Sdim for (i = 0; i < mechs->count; i++) { 99221345Sdim gss_buffer_desc str, sasl_name, mech_name, mech_desc; 100221345Sdim 101198090Srdivacky maj_stat = gss_oid_to_str(&min_stat, &mechs->elements[i], &str); 102198090Srdivacky if (maj_stat != GSS_S_COMPLETE) 103249423Sdim errx(1, "gss_oid_to_str failed"); 104249423Sdim 105249423Sdim rtbl_add_column_entryv(ct, COL_OID, "%.*s", 106249423Sdim (int)str.length, (char *)str.value); 107234353Sdim gss_release_buffer(&min_stat, &str); 108234353Sdim 109234353Sdim (void)gss_inquire_saslname_for_mech(&min_stat, 110234353Sdim &mechs->elements[i], 111234353Sdim &sasl_name, 112198090Srdivacky &mech_name, 113198090Srdivacky &mech_desc); 114198090Srdivacky 115239462Sdim rtbl_add_column_entryv(ct, COL_NAME, "%.*s", 116198090Srdivacky (int)mech_name.length, (char *)mech_name.value); 117198090Srdivacky rtbl_add_column_entryv(ct, COL_DESC, "%.*s", 118198090Srdivacky (int)mech_desc.length, (char *)mech_desc.value); 119 rtbl_add_column_entryv(ct, COL_SASL, "%.*s", 120 (int)sasl_name.length, (char *)sasl_name.value); 121 122 gss_release_buffer(&min_stat, &mech_name); 123 gss_release_buffer(&min_stat, &mech_desc); 124 gss_release_buffer(&min_stat, &sasl_name); 125 126 } 127 gss_release_oid_set(&min_stat, &mechs); 128 129 rtbl_format(ct, stdout); 130 rtbl_destroy(ct); 131 132 return 0; 133} 134 135static void 136print_mech_attr(const char *mechname, gss_const_OID mech, gss_OID_set set) 137{ 138 gss_buffer_desc name, desc; 139 OM_uint32 major, minor; 140 rtbl_t ct; 141 size_t n; 142 143 ct = rtbl_create(); 144 if (ct == NULL) 145 errx(1, "rtbl_create"); 146 147 rtbl_set_separator(ct, " "); 148 rtbl_add_column(ct, COL_OID, 0); 149 rtbl_add_column(ct, COL_DESC, 0); 150 if (mech) 151 rtbl_add_column(ct, COL_VALUE, 0); 152 153 for (n = 0; n < set->count; n++) { 154 major = gss_display_mech_attr(&minor, &set->elements[n], &name, &desc, NULL); 155 if (major) 156 continue; 157 158 rtbl_add_column_entryv(ct, COL_OID, "%.*s", 159 (int)name.length, (char *)name.value); 160 rtbl_add_column_entryv(ct, COL_DESC, "%.*s", 161 (int)desc.length, (char *)desc.value); 162 if (mech) { 163 gss_buffer_desc value; 164 165 if (gss_mo_get(mech, &set->elements[n], &value) != 0) 166 value.length = 0; 167 168 if (value.length) 169 rtbl_add_column_entryv(ct, COL_VALUE, "%.*s", 170 (int)value.length, (char *)value.value); 171 else 172 rtbl_add_column_entryv(ct, COL_VALUE, "<>"); 173 gss_release_buffer(&minor, &value); 174 } 175 176 gss_release_buffer(&minor, &name); 177 gss_release_buffer(&minor, &desc); 178 } 179 180 printf("attributes for: %s\n", mechname); 181 rtbl_format(ct, stdout); 182 rtbl_destroy(ct); 183} 184 185 186int 187attrs_for_mech(struct attrs_for_mech_options *opt, int argc, char **argv) 188{ 189 gss_OID_set mech_attr = NULL, known_mech_attrs = NULL; 190 gss_OID mech = GSS_C_NO_OID; 191 OM_uint32 major, minor; 192 193 if (opt->mech_string) { 194 mech = gss_name_to_oid(opt->mech_string); 195 if (mech == NULL) 196 errx(1, "mech %s is unknown", opt->mech_string); 197 } 198 199 major = gss_inquire_attrs_for_mech(&minor, mech, &mech_attr, &known_mech_attrs); 200 if (major) 201 errx(1, "gss_inquire_attrs_for_mech"); 202 203 if (mech) { 204 print_mech_attr(opt->mech_string, mech, mech_attr); 205 } 206 207 if (opt->all_flag) { 208 print_mech_attr("all mechs", NULL, known_mech_attrs); 209 } 210 211 gss_release_oid_set(&minor, &mech_attr); 212 gss_release_oid_set(&minor, &known_mech_attrs); 213 214 return 0; 215} 216 217 218/* 219 * 220 */ 221 222int 223help(void *opt, int argc, char **argv) 224{ 225 sl_slc_help(commands, argc, argv); 226 return 0; 227} 228 229int 230main(int argc, char **argv) 231{ 232 int optidx = 0; 233 234 setprogname(argv[0]); 235 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 236 usage(1); 237 238 if (help_flag) 239 usage (0); 240 241 if(version_flag){ 242 print_version(NULL); 243 exit(0); 244 } 245 246 argc -= optidx; 247 argv += optidx; 248 249 if (argc == 0) { 250 help(NULL, argc, argv); 251 return 1; 252 } 253 254 return sl_command (commands, argc, argv); 255} 256