1/* 2 * Copyright (c) 2003-2004 Kungliga Tekniska Högskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of KTH nor the names of its contributors may be 18 * used to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include "gsskrb5_locl.h" 35#include <err.h> 36#include <getarg.h> 37 38static int version_flag = 0; 39static int help_flag = 0; 40 41static void 42copy_import(void) 43{ 44 gss_cred_id_t cred1, cred2; 45 OM_uint32 maj_stat, min_stat; 46 gss_name_t name1, name2; 47 OM_uint32 lifetime1, lifetime2; 48 gss_cred_usage_t usage1, usage2; 49 gss_OID_set mechs1, mechs2; 50 krb5_ccache id; 51 krb5_error_code ret; 52 krb5_context context; 53 int equal; 54 55 maj_stat = gss_acquire_cred(&min_stat, GSS_C_NO_NAME, GSS_C_INDEFINITE, 56 GSS_C_NO_OID_SET, GSS_C_INITIATE, 57 &cred1, NULL, NULL); 58 if (maj_stat != GSS_S_COMPLETE) 59 errx(1, "gss_acquire_cred"); 60 61 maj_stat = gss_inquire_cred(&min_stat, cred1, &name1, &lifetime1, 62 &usage1, &mechs1); 63 if (maj_stat != GSS_S_COMPLETE) 64 errx(1, "gss_inquire_cred"); 65 66 ret = krb5_init_context(&context); 67 if (ret) 68 errx(1, "krb5_init_context"); 69 70 ret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, &id); 71 if (ret) 72 krb5_err(context, 1, ret, "krb5_cc_new_unique"); 73 74 maj_stat = gss_krb5_copy_ccache(&min_stat, context, cred1, id); 75 if (maj_stat != GSS_S_COMPLETE) 76 errx(1, "gss_krb5_copy_ccache"); 77 78 maj_stat = gss_krb5_import_cred(&min_stat, id, NULL, NULL, &cred2); 79 if (maj_stat != GSS_S_COMPLETE) 80 errx(1, "gss_krb5_import_cred"); 81 82 maj_stat = gss_inquire_cred(&min_stat, cred2, &name2, &lifetime2, 83 &usage2, &mechs2); 84 if (maj_stat != GSS_S_COMPLETE) 85 errx(1, "gss_inquire_cred 2"); 86 87 maj_stat = gss_compare_name(&min_stat, name1, name2, &equal); 88 if (maj_stat != GSS_S_COMPLETE) 89 errx(1, "gss_compare_name"); 90 if (!equal) 91 errx(1, "names not equal"); 92 93 if (lifetime1 != lifetime1) 94 errx(1, "lifetime not equal"); 95 96 if (usage1 != usage1) 97 errx(1, "usage not equal"); 98 99 gss_release_cred(&min_stat, &cred1); 100 gss_release_cred(&min_stat, &cred2); 101 102 gss_release_name(&min_stat, &name1); 103 gss_release_name(&min_stat, &name2); 104 105#if 0 106 compare(mechs1, mechs2); 107#endif 108 109 gss_release_oid_set(&min_stat, &mechs1); 110 gss_release_oid_set(&min_stat, &mechs2); 111 112 krb5_cc_destroy(context, id); 113 krb5_free_context(context); 114} 115 116static struct getargs args[] = { 117 {"version", 0, arg_flag, &version_flag, "print version", NULL }, 118 {"help", 0, arg_flag, &help_flag, NULL, NULL } 119}; 120 121static void 122usage (int ret) 123{ 124 arg_printusage (args, sizeof(args)/sizeof(*args), 125 NULL, ""); 126 exit (ret); 127} 128 129int 130main(int argc, char **argv) 131{ 132 int optidx = 0; 133 134 setprogname(argv[0]); 135 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 136 usage(1); 137 138 if (help_flag) 139 usage (0); 140 141 if(version_flag){ 142 print_version(NULL); 143 exit(0); 144 } 145 146 argc -= optidx; 147 argv += optidx; 148 149 copy_import(); 150 151 return 0; 152} 153