xref: /freebsd/crypto/heimdal/lib/gssapi/test_acquire_cred.c (revision 8fc257994d0ce2396196d7a06d50d20c8015f4b7)
1 /*
2  * Copyright (c) 2003-2007 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 #ifdef HAVE_CONFIG_H
35 #include <config.h>
36 #endif
37 
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <stdarg.h>
42 #include <gssapi.h>
43 #include <err.h>
44 #include <roken.h>
45 #include <getarg.h>
46 
47 #include "test_common.h"
48 
49 RCSID("$Id: test_acquire_cred.c 22129 2007-12-04 01:13:13Z lha $");
50 
51 static void
52 print_time(OM_uint32 time_rec)
53 {
54     if (time_rec == GSS_C_INDEFINITE) {
55 	printf("cred never expire\n");
56     } else {
57 	time_t t = time_rec + time(NULL);
58 	printf("expiration time: %s", ctime(&t));
59     }
60 }
61 
62 #if 0
63 
64 static void
65 test_add(gss_cred_id_t cred_handle)
66 {
67     OM_uint32 major_status, minor_status;
68     gss_cred_id_t copy_cred;
69     OM_uint32 time_rec;
70 
71     major_status = gss_add_cred (&minor_status,
72 				 cred_handle,
73 				 GSS_C_NO_NAME,
74 				 GSS_KRB5_MECHANISM,
75 				 GSS_C_INITIATE,
76 				 0,
77 				 0,
78 				 &copy_cred,
79 				 NULL,
80 				 &time_rec,
81 				 NULL);
82 
83     if (GSS_ERROR(major_status))
84 	errx(1, "add_cred failed");
85 
86     print_time(time_rec);
87 
88     major_status = gss_release_cred(&minor_status,
89 				    &copy_cred);
90     if (GSS_ERROR(major_status))
91 	errx(1, "release_cred failed");
92 }
93 
94 static void
95 copy_cred(void)
96 {
97     OM_uint32 major_status, minor_status;
98     gss_cred_id_t cred_handle;
99     OM_uint32 time_rec;
100 
101     major_status = gss_acquire_cred(&minor_status,
102 				    GSS_C_NO_NAME,
103 				    0,
104 				    NULL,
105 				    GSS_C_INITIATE,
106 				    &cred_handle,
107 				    NULL,
108 				    &time_rec);
109     if (GSS_ERROR(major_status))
110 	errx(1, "acquire_cred failed");
111 
112     print_time(time_rec);
113 
114     test_add(cred_handle);
115     test_add(cred_handle);
116     test_add(cred_handle);
117 
118     major_status = gss_release_cred(&minor_status,
119 				    &cred_handle);
120     if (GSS_ERROR(major_status))
121 	errx(1, "release_cred failed");
122 }
123 #endif
124 
125 static void
126 acquire_cred_service(const char *service,
127 		     gss_OID nametype,
128 		     int flags)
129 {
130     OM_uint32 major_status, minor_status;
131     gss_cred_id_t cred_handle;
132     OM_uint32 time_rec;
133     gss_buffer_desc name_buffer;
134     gss_name_t name = GSS_C_NO_NAME;
135 
136     if (service) {
137 	name_buffer.value = rk_UNCONST(service);
138 	name_buffer.length = strlen(service);
139 
140 	major_status = gss_import_name(&minor_status,
141 				       &name_buffer,
142 				       nametype,
143 				       &name);
144 	if (GSS_ERROR(major_status))
145 	    errx(1, "import_name failed");
146     }
147 
148     major_status = gss_acquire_cred(&minor_status,
149 				    name,
150 				    0,
151 				    NULL,
152 				    flags,
153 				    &cred_handle,
154 				    NULL,
155 				    &time_rec);
156     if (GSS_ERROR(major_status)) {
157 	warnx("acquire_cred failed: %s",
158 	     gssapi_err(major_status, minor_status, GSS_C_NO_OID));
159     } else {
160 	print_time(time_rec);
161 	gss_release_cred(&minor_status, &cred_handle);
162     }
163 
164     if (name != GSS_C_NO_NAME)
165 	gss_release_name(&minor_status, &name);
166 
167     if (GSS_ERROR(major_status))
168 	exit(1);
169 }
170 
171 static int version_flag = 0;
172 static int help_flag	= 0;
173 static char *acquire_name;
174 static char *acquire_type;
175 static char *name_type;
176 static char *ccache;
177 
178 static struct getargs args[] = {
179     {"acquire-name", 0,	arg_string,	&acquire_name, "name", NULL },
180     {"acquire-type", 0,	arg_string,	&acquire_type, "type", NULL },
181     {"ccache", 0,	arg_string,	&ccache, "name", NULL },
182     {"name-type", 0,	arg_string,	&name_type, "type", NULL },
183     {"version",	0,	arg_flag,	&version_flag, "print version", NULL },
184     {"help",	0,	arg_flag,	&help_flag,  NULL, NULL }
185 };
186 
187 static void
188 usage (int ret)
189 {
190     arg_printusage (args, sizeof(args)/sizeof(*args), NULL, "");
191     exit (ret);
192 }
193 
194 int
195 main(int argc, char **argv)
196 {
197     int optidx = 0;
198     OM_uint32 flag;
199     gss_OID type;
200 
201     setprogname(argv[0]);
202     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
203 	usage(1);
204 
205     if (help_flag)
206 	usage (0);
207 
208     if(version_flag){
209 	print_version(NULL);
210 	exit(0);
211     }
212 
213     argc -= optidx;
214     argv += optidx;
215 
216     if (argc != 0)
217 	usage(1);
218 
219     if (acquire_type) {
220 	if (strcasecmp(acquire_type, "both") == 0)
221 	    flag = GSS_C_BOTH;
222 	else if (strcasecmp(acquire_type, "accept") == 0)
223 	    flag = GSS_C_ACCEPT;
224 	else if (strcasecmp(acquire_type, "initiate") == 0)
225 	    flag = GSS_C_INITIATE;
226 	else
227 	    errx(1, "unknown type %s", acquire_type);
228     } else
229 	flag = GSS_C_ACCEPT;
230 
231     if (name_type) {
232 	if (strcasecmp("hostbased-service", name_type) == 0)
233 	    type = GSS_C_NT_HOSTBASED_SERVICE;
234 	else if (strcasecmp("user-name", name_type) == 0)
235 	    type = GSS_C_NT_USER_NAME;
236 	else
237 	    errx(1, "unknown name type %s", name_type);
238     } else
239 	type = GSS_C_NT_HOSTBASED_SERVICE;
240 
241     if (ccache) {
242 	OM_uint32 major_status, minor_status;
243 	major_status = gss_krb5_ccache_name(&minor_status,
244 					    ccache, NULL);
245 	if (GSS_ERROR(major_status))
246 	    errx(1, "gss_krb5_ccache_name %s",
247 		 gssapi_err(major_status, minor_status, GSS_C_NO_OID));
248     }
249 
250     acquire_cred_service(acquire_name, type, flag);
251 
252     return 0;
253 }
254