1178825Sdfr/* 2178825Sdfr * Copyright (c) 2003-2004 Kungliga Tekniska H�gskolan 3178825Sdfr * (Royal Institute of Technology, Stockholm, Sweden). 4178825Sdfr * All rights reserved. 5178825Sdfr * 6178825Sdfr * Redistribution and use in source and binary forms, with or without 7178825Sdfr * modification, are permitted provided that the following conditions 8178825Sdfr * are met: 9178825Sdfr * 10178825Sdfr * 1. Redistributions of source code must retain the above copyright 11178825Sdfr * notice, this list of conditions and the following disclaimer. 12178825Sdfr * 13178825Sdfr * 2. Redistributions in binary form must reproduce the above copyright 14178825Sdfr * notice, this list of conditions and the following disclaimer in the 15178825Sdfr * documentation and/or other materials provided with the distribution. 16178825Sdfr * 17178825Sdfr * 3. Neither the name of KTH nor the names of its contributors may be 18178825Sdfr * used to endorse or promote products derived from this software without 19178825Sdfr * specific prior written permission. 20178825Sdfr * 21178825Sdfr * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22178825Sdfr * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24178825Sdfr * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25178825Sdfr * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26178825Sdfr * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27178825Sdfr * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28178825Sdfr * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29178825Sdfr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30178825Sdfr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31178825Sdfr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32178825Sdfr */ 33178825Sdfr 34178825Sdfr#ifdef HAVE_CONFIG_H 35178825Sdfr#include <config.h> 36178825Sdfr#endif 37178825Sdfr 38178825Sdfr#include <stdio.h> 39178825Sdfr#include <stdlib.h> 40178825Sdfr#include <string.h> 41178825Sdfr#include <stdarg.h> 42178825Sdfr#include <gssapi.h> 43178825Sdfr#include <krb5.h> 44178825Sdfr#include <err.h> 45178825Sdfr#include <roken.h> 46178825Sdfr#include <getarg.h> 47178825Sdfr 48178825SdfrRCSID("$Id: test_kcred.c 20694 2007-05-30 13:58:46Z lha $"); 49178825Sdfr 50178825Sdfrstatic int version_flag = 0; 51178825Sdfrstatic int help_flag = 0; 52178825Sdfr 53178825Sdfrstatic void 54178825Sdfrcopy_import(void) 55178825Sdfr{ 56178825Sdfr gss_cred_id_t cred1, cred2; 57178825Sdfr OM_uint32 maj_stat, min_stat; 58178825Sdfr gss_name_t name1, name2; 59178825Sdfr OM_uint32 lifetime1, lifetime2; 60178825Sdfr gss_cred_usage_t usage1, usage2; 61178825Sdfr gss_OID_set mechs1, mechs2; 62178825Sdfr krb5_ccache id; 63178825Sdfr krb5_error_code ret; 64178825Sdfr krb5_context context; 65178825Sdfr int equal; 66178825Sdfr 67178825Sdfr maj_stat = gss_acquire_cred(&min_stat, GSS_C_NO_NAME, GSS_C_INDEFINITE, 68178825Sdfr GSS_C_NO_OID_SET, GSS_C_INITIATE, 69178825Sdfr &cred1, NULL, NULL); 70178825Sdfr if (maj_stat != GSS_S_COMPLETE) 71178825Sdfr errx(1, "gss_acquire_cred"); 72178825Sdfr 73178825Sdfr maj_stat = gss_inquire_cred(&min_stat, cred1, &name1, &lifetime1, 74178825Sdfr &usage1, &mechs1); 75178825Sdfr if (maj_stat != GSS_S_COMPLETE) 76178825Sdfr errx(1, "gss_inquire_cred"); 77178825Sdfr 78178825Sdfr ret = krb5_init_context(&context); 79178825Sdfr if (ret) 80178825Sdfr errx(1, "krb5_init_context"); 81178825Sdfr 82178825Sdfr ret = krb5_cc_gen_new(context, &krb5_mcc_ops, &id); 83178825Sdfr if (ret) 84178825Sdfr krb5_err(context, 1, ret, "krb5_cc_gen_new"); 85178825Sdfr 86178825Sdfr maj_stat = gss_krb5_copy_ccache(&min_stat, cred1, id); 87178825Sdfr if (maj_stat != GSS_S_COMPLETE) 88178825Sdfr errx(1, "gss_krb5_copy_ccache"); 89178825Sdfr 90178825Sdfr maj_stat = gss_krb5_import_cred(&min_stat, id, NULL, NULL, &cred2); 91178825Sdfr if (maj_stat != GSS_S_COMPLETE) 92178825Sdfr errx(1, "gss_krb5_import_cred"); 93178825Sdfr 94178825Sdfr maj_stat = gss_inquire_cred(&min_stat, cred2, &name2, &lifetime2, 95178825Sdfr &usage2, &mechs2); 96178825Sdfr if (maj_stat != GSS_S_COMPLETE) 97178825Sdfr errx(1, "gss_inquire_cred 2"); 98178825Sdfr 99178825Sdfr maj_stat = gss_compare_name(&min_stat, name1, name2, &equal); 100178825Sdfr if (maj_stat != GSS_S_COMPLETE) 101178825Sdfr errx(1, "gss_compare_name"); 102178825Sdfr if (!equal) 103178825Sdfr errx(1, "names not equal"); 104178825Sdfr 105178825Sdfr if (lifetime1 != lifetime2) 106178825Sdfr errx(1, "lifetime not equal %lu != %lu", 107178825Sdfr (unsigned long)lifetime1, (unsigned long)lifetime2); 108178825Sdfr 109178825Sdfr if (usage1 != usage2) { 110178825Sdfr /* as long any of them is both are everything it ok */ 111178825Sdfr if (usage1 != GSS_C_BOTH && usage2 != GSS_C_BOTH) 112178825Sdfr errx(1, "usages disjoined"); 113178825Sdfr } 114178825Sdfr 115178825Sdfr gss_release_name(&min_stat, &name2); 116178825Sdfr gss_release_oid_set(&min_stat, &mechs2); 117178825Sdfr 118178825Sdfr maj_stat = gss_inquire_cred(&min_stat, cred2, &name2, &lifetime2, 119178825Sdfr &usage2, &mechs2); 120178825Sdfr if (maj_stat != GSS_S_COMPLETE) 121178825Sdfr errx(1, "gss_inquire_cred"); 122178825Sdfr 123178825Sdfr maj_stat = gss_compare_name(&min_stat, name1, name2, &equal); 124178825Sdfr if (maj_stat != GSS_S_COMPLETE) 125178825Sdfr errx(1, "gss_compare_name"); 126178825Sdfr if (!equal) 127178825Sdfr errx(1, "names not equal"); 128178825Sdfr 129178825Sdfr if (lifetime1 != lifetime2) 130178825Sdfr errx(1, "lifetime not equal %lu != %lu", 131178825Sdfr (unsigned long)lifetime1, (unsigned long)lifetime2); 132178825Sdfr 133178825Sdfr gss_release_cred(&min_stat, &cred1); 134178825Sdfr gss_release_cred(&min_stat, &cred2); 135178825Sdfr 136178825Sdfr gss_release_name(&min_stat, &name1); 137178825Sdfr gss_release_name(&min_stat, &name2); 138178825Sdfr 139178825Sdfr#if 0 140178825Sdfr compare(mechs1, mechs2); 141178825Sdfr#endif 142178825Sdfr 143178825Sdfr gss_release_oid_set(&min_stat, &mechs1); 144178825Sdfr gss_release_oid_set(&min_stat, &mechs2); 145178825Sdfr 146178825Sdfr krb5_cc_destroy(context, id); 147178825Sdfr krb5_free_context(context); 148178825Sdfr} 149178825Sdfr 150178825Sdfrstatic struct getargs args[] = { 151178825Sdfr {"version", 0, arg_flag, &version_flag, "print version", NULL }, 152178825Sdfr {"help", 0, arg_flag, &help_flag, NULL, NULL } 153178825Sdfr}; 154178825Sdfr 155178825Sdfrstatic void 156178825Sdfrusage (int ret) 157178825Sdfr{ 158178825Sdfr arg_printusage (args, sizeof(args)/sizeof(*args), 159178825Sdfr NULL, ""); 160178825Sdfr exit (ret); 161178825Sdfr} 162178825Sdfr 163178825Sdfrint 164178825Sdfrmain(int argc, char **argv) 165178825Sdfr{ 166178825Sdfr int optidx = 0; 167178825Sdfr 168178825Sdfr setprogname(argv[0]); 169178825Sdfr if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 170178825Sdfr usage(1); 171178825Sdfr 172178825Sdfr if (help_flag) 173178825Sdfr usage (0); 174178825Sdfr 175178825Sdfr if(version_flag){ 176178825Sdfr print_version(NULL); 177178825Sdfr exit(0); 178178825Sdfr } 179178825Sdfr 180178825Sdfr argc -= optidx; 181178825Sdfr argv += optidx; 182178825Sdfr 183178825Sdfr copy_import(); 184178825Sdfr 185178825Sdfr return 0; 186178825Sdfr} 187