Home | History | Annotate | Line # | Download | only in krb5
      1 /*	$NetBSD: test_acquire_cred.c,v 1.2 2017/01/28 21:31:46 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2003-2005 Kungliga Tekniska Hgskolan
      5  * (Royal Institute of Technology, Stockholm, Sweden).
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  *
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * 3. Neither the name of KTH nor the names of its contributors may be
     20  *    used to endorse or promote products derived from this software without
     21  *    specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     24  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     26  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
     27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     30  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     32  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     33  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 #include "gsskrb5_locl.h"
     37 #include <err.h>
     38 
     39 static void
     40 print_time(OM_uint32 time_rec)
     41 {
     42     if (time_rec == GSS_C_INDEFINITE) {
     43 	printf("cred never expire\n");
     44     } else {
     45 	time_t t = time_rec + time(NULL);
     46 	printf("expiration time: %s", ctime(&t));
     47     }
     48 }
     49 
     50 static void
     51 test_add(gss_cred_id_t cred_handle)
     52 {
     53     OM_uint32 major_status, minor_status;
     54     gss_cred_id_t copy_cred;
     55     OM_uint32 time_rec;
     56 
     57     major_status = gss_add_cred (&minor_status,
     58 				 cred_handle,
     59 				 GSS_C_NO_NAME,
     60 				 GSS_KRB5_MECHANISM,
     61 				 GSS_C_INITIATE,
     62 				 0,
     63 				 0,
     64 				 &copy_cred,
     65 				 NULL,
     66 				 &time_rec,
     67 				 NULL);
     68 
     69     if (GSS_ERROR(major_status))
     70 	errx(1, "add_cred failed");
     71 
     72     print_time(time_rec);
     73 
     74     major_status = gss_release_cred(&minor_status,
     75 				    &copy_cred);
     76     if (GSS_ERROR(major_status))
     77 	errx(1, "release_cred failed");
     78 }
     79 
     80 static void
     81 copy_cred(void)
     82 {
     83     OM_uint32 major_status, minor_status;
     84     gss_cred_id_t cred_handle;
     85     OM_uint32 time_rec;
     86 
     87     major_status = gss_acquire_cred(&minor_status,
     88 				    GSS_C_NO_NAME,
     89 				    0,
     90 				    NULL,
     91 				    GSS_C_INITIATE,
     92 				    &cred_handle,
     93 				    NULL,
     94 				    &time_rec);
     95     if (GSS_ERROR(major_status))
     96 	errx(1, "acquire_cred failed");
     97 
     98     print_time(time_rec);
     99 
    100     test_add(cred_handle);
    101     test_add(cred_handle);
    102     test_add(cred_handle);
    103 
    104     major_status = gss_release_cred(&minor_status,
    105 				    &cred_handle);
    106     if (GSS_ERROR(major_status))
    107 	errx(1, "release_cred failed");
    108 }
    109 
    110 static void
    111 acquire_cred_service(const char *service)
    112 {
    113     OM_uint32 major_status, minor_status;
    114     gss_cred_id_t cred_handle;
    115     OM_uint32 time_rec;
    116     gss_buffer_desc name_buffer;
    117     gss_name_t name;
    118 
    119     name_buffer.value = rk_UNCONST(service);
    120     name_buffer.length = strlen(service);
    121 
    122     major_status = gss_import_name(&minor_status,
    123 				   &name_buffer,
    124 				   GSS_C_NT_HOSTBASED_SERVICE,
    125 				   &name);
    126     if (GSS_ERROR(major_status))
    127 	errx(1, "import_name failed");
    128 
    129 
    130     major_status = gss_acquire_cred(&minor_status,
    131 				    name,
    132 				    0,
    133 				    NULL,
    134 				    GSS_C_ACCEPT,
    135 				    &cred_handle,
    136 				    NULL,
    137 				    &time_rec);
    138     if (GSS_ERROR(major_status))
    139 	errx(1, "acquire_cred failed");
    140 
    141     print_time(time_rec);
    142 
    143     major_status = gss_release_cred(&minor_status,
    144 				    &cred_handle);
    145     if (GSS_ERROR(major_status))
    146 	errx(1, "release_cred failed");
    147 
    148 
    149     major_status = gss_release_name(&minor_status,
    150 				    &name);
    151     if (GSS_ERROR(major_status))
    152 	errx(1, "release_name failed");
    153 
    154 }
    155 
    156 int
    157 main(int argc, char **argv)
    158 {
    159     copy_cred();
    160 
    161     acquire_cred_service("host (at) xen2-heimdal-linux.lab.it.su.se");
    162 
    163     return 0;
    164 }
    165