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