1 /*	$NetBSD: test_acquire_cred.c,v 1.1.1.1 2011/04/13 18:14:45 elric Exp $	*/
2 
3 /*
4  * Copyright (c) 2003-2005 Kungliga Tekniska Högskolan
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@xen2-heimdal-linux.lab.it.su.se");
162 
163     return 0;
164 }
165