xref: /freebsd-src/crypto/heimdal/lib/gssapi/test_names.c (revision c19800e8cd5640693f36f2040db4ab5e8d738146)
1*c19800e8SDoug Rabson /*
2*c19800e8SDoug Rabson  * Copyright (c) 2006 Kungliga Tekniska H�gskolan
3*c19800e8SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
4*c19800e8SDoug Rabson  * All rights reserved.
5*c19800e8SDoug Rabson  *
6*c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
7*c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
8*c19800e8SDoug Rabson  * are met:
9*c19800e8SDoug Rabson  *
10*c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
11*c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
12*c19800e8SDoug Rabson  *
13*c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
14*c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
15*c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
16*c19800e8SDoug Rabson  *
17*c19800e8SDoug Rabson  * 3. Neither the name of KTH nor the names of its contributors may be
18*c19800e8SDoug Rabson  *    used to endorse or promote products derived from this software without
19*c19800e8SDoug Rabson  *    specific prior written permission.
20*c19800e8SDoug Rabson  *
21*c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22*c19800e8SDoug Rabson  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23*c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24*c19800e8SDoug Rabson  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25*c19800e8SDoug Rabson  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26*c19800e8SDoug Rabson  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27*c19800e8SDoug Rabson  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28*c19800e8SDoug Rabson  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29*c19800e8SDoug Rabson  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30*c19800e8SDoug Rabson  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31*c19800e8SDoug Rabson  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*c19800e8SDoug Rabson  */
33*c19800e8SDoug Rabson 
34*c19800e8SDoug Rabson #ifdef HAVE_CONFIG_H
35*c19800e8SDoug Rabson #include <config.h>
36*c19800e8SDoug Rabson #endif
37*c19800e8SDoug Rabson 
38*c19800e8SDoug Rabson #include <stdio.h>
39*c19800e8SDoug Rabson #include <stdlib.h>
40*c19800e8SDoug Rabson #include <string.h>
41*c19800e8SDoug Rabson #include <stdarg.h>
42*c19800e8SDoug Rabson #include <gssapi.h>
43*c19800e8SDoug Rabson #include <err.h>
44*c19800e8SDoug Rabson #include <roken.h>
45*c19800e8SDoug Rabson #include <getarg.h>
46*c19800e8SDoug Rabson 
47*c19800e8SDoug Rabson RCSID("$Id: test_names.c 17856 2006-07-20 05:13:25Z lha $");
48*c19800e8SDoug Rabson 
49*c19800e8SDoug Rabson static void
50*c19800e8SDoug Rabson gss_print_errors (int min_stat)
51*c19800e8SDoug Rabson {
52*c19800e8SDoug Rabson     OM_uint32 new_stat;
53*c19800e8SDoug Rabson     OM_uint32 msg_ctx = 0;
54*c19800e8SDoug Rabson     gss_buffer_desc status_string;
55*c19800e8SDoug Rabson     OM_uint32 ret;
56*c19800e8SDoug Rabson 
57*c19800e8SDoug Rabson     do {
58*c19800e8SDoug Rabson 	ret = gss_display_status (&new_stat,
59*c19800e8SDoug Rabson 				  min_stat,
60*c19800e8SDoug Rabson 				  GSS_C_MECH_CODE,
61*c19800e8SDoug Rabson 				  GSS_C_NO_OID,
62*c19800e8SDoug Rabson 				  &msg_ctx,
63*c19800e8SDoug Rabson 				  &status_string);
64*c19800e8SDoug Rabson 	if (!GSS_ERROR(ret)) {
65*c19800e8SDoug Rabson 	    fprintf (stderr, "%s\n", (char *)status_string.value);
66*c19800e8SDoug Rabson 	    gss_release_buffer (&new_stat, &status_string);
67*c19800e8SDoug Rabson 	}
68*c19800e8SDoug Rabson     } while (!GSS_ERROR(ret) && msg_ctx != 0);
69*c19800e8SDoug Rabson }
70*c19800e8SDoug Rabson 
71*c19800e8SDoug Rabson static void
72*c19800e8SDoug Rabson gss_err(int exitval, int status, const char *fmt, ...)
73*c19800e8SDoug Rabson {
74*c19800e8SDoug Rabson     va_list args;
75*c19800e8SDoug Rabson 
76*c19800e8SDoug Rabson     va_start(args, fmt);
77*c19800e8SDoug Rabson     vwarnx (fmt, args);
78*c19800e8SDoug Rabson     gss_print_errors (status);
79*c19800e8SDoug Rabson     va_end(args);
80*c19800e8SDoug Rabson     exit (exitval);
81*c19800e8SDoug Rabson }
82*c19800e8SDoug Rabson 
83*c19800e8SDoug Rabson static int version_flag = 0;
84*c19800e8SDoug Rabson static int help_flag	= 0;
85*c19800e8SDoug Rabson 
86*c19800e8SDoug Rabson static struct getargs args[] = {
87*c19800e8SDoug Rabson     {"version",	0,	arg_flag,	&version_flag, "print version", NULL },
88*c19800e8SDoug Rabson     {"help",	0,	arg_flag,	&help_flag,  NULL, NULL }
89*c19800e8SDoug Rabson };
90*c19800e8SDoug Rabson 
91*c19800e8SDoug Rabson static void
92*c19800e8SDoug Rabson usage (int ret)
93*c19800e8SDoug Rabson {
94*c19800e8SDoug Rabson     arg_printusage (args, sizeof(args)/sizeof(*args),
95*c19800e8SDoug Rabson 		    NULL, "service@host");
96*c19800e8SDoug Rabson     exit (ret);
97*c19800e8SDoug Rabson }
98*c19800e8SDoug Rabson 
99*c19800e8SDoug Rabson 
100*c19800e8SDoug Rabson int
101*c19800e8SDoug Rabson main(int argc, char **argv)
102*c19800e8SDoug Rabson {
103*c19800e8SDoug Rabson     gss_buffer_desc name_buffer;
104*c19800e8SDoug Rabson     OM_uint32 maj_stat, min_stat;
105*c19800e8SDoug Rabson     gss_name_t name, MNname, MNname2;
106*c19800e8SDoug Rabson     int optidx = 0;
107*c19800e8SDoug Rabson     char *str;
108*c19800e8SDoug Rabson     int len, equal;
109*c19800e8SDoug Rabson 
110*c19800e8SDoug Rabson     setprogname(argv[0]);
111*c19800e8SDoug Rabson     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
112*c19800e8SDoug Rabson 	usage(1);
113*c19800e8SDoug Rabson 
114*c19800e8SDoug Rabson     if (help_flag)
115*c19800e8SDoug Rabson 	usage (0);
116*c19800e8SDoug Rabson 
117*c19800e8SDoug Rabson     if(version_flag){
118*c19800e8SDoug Rabson 	print_version(NULL);
119*c19800e8SDoug Rabson 	exit(0);
120*c19800e8SDoug Rabson     }
121*c19800e8SDoug Rabson 
122*c19800e8SDoug Rabson     argc -= optidx;
123*c19800e8SDoug Rabson     argv += optidx;
124*c19800e8SDoug Rabson 
125*c19800e8SDoug Rabson     /*
126*c19800e8SDoug Rabson      * test import/export
127*c19800e8SDoug Rabson      */
128*c19800e8SDoug Rabson 
129*c19800e8SDoug Rabson     len = asprintf(&str, "ftp@freeze-arrow.mit.edu");
130*c19800e8SDoug Rabson     if (len == -1)
131*c19800e8SDoug Rabson 	errx(1, "asprintf");
132*c19800e8SDoug Rabson 
133*c19800e8SDoug Rabson     name_buffer.value = str;
134*c19800e8SDoug Rabson     name_buffer.length = len;
135*c19800e8SDoug Rabson 
136*c19800e8SDoug Rabson     maj_stat = gss_import_name(&min_stat, &name_buffer,
137*c19800e8SDoug Rabson 			       GSS_C_NT_HOSTBASED_SERVICE,
138*c19800e8SDoug Rabson 			       &name);
139*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
140*c19800e8SDoug Rabson 	gss_err(1, min_stat, "import name error");
141*c19800e8SDoug Rabson     free(str);
142*c19800e8SDoug Rabson 
143*c19800e8SDoug Rabson     maj_stat = gss_canonicalize_name (&min_stat,
144*c19800e8SDoug Rabson 				      name,
145*c19800e8SDoug Rabson 				      GSS_KRB5_MECHANISM,
146*c19800e8SDoug Rabson 				      &MNname);
147*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
148*c19800e8SDoug Rabson 	gss_err(1, min_stat, "canonicalize name error");
149*c19800e8SDoug Rabson 
150*c19800e8SDoug Rabson     maj_stat = gss_export_name(&min_stat,
151*c19800e8SDoug Rabson 			       MNname,
152*c19800e8SDoug Rabson 			       &name_buffer);
153*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
154*c19800e8SDoug Rabson 	gss_err(1, min_stat, "export name error (KRB5)");
155*c19800e8SDoug Rabson 
156*c19800e8SDoug Rabson     /*
157*c19800e8SDoug Rabson      * Import the exported name and compare
158*c19800e8SDoug Rabson      */
159*c19800e8SDoug Rabson 
160*c19800e8SDoug Rabson     maj_stat = gss_import_name(&min_stat, &name_buffer,
161*c19800e8SDoug Rabson 			       GSS_C_NT_EXPORT_NAME,
162*c19800e8SDoug Rabson 			       &MNname2);
163*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
164*c19800e8SDoug Rabson 	gss_err(1, min_stat, "import name error (exported KRB5 name)");
165*c19800e8SDoug Rabson 
166*c19800e8SDoug Rabson 
167*c19800e8SDoug Rabson     maj_stat = gss_compare_name(&min_stat, MNname, MNname2, &equal);
168*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
169*c19800e8SDoug Rabson 	errx(1, "gss_compare_name");
170*c19800e8SDoug Rabson     if (!equal)
171*c19800e8SDoug Rabson 	errx(1, "names not equal");
172*c19800e8SDoug Rabson 
173*c19800e8SDoug Rabson     gss_release_name(&min_stat, &MNname2);
174*c19800e8SDoug Rabson     gss_release_buffer(&min_stat, &name_buffer);
175*c19800e8SDoug Rabson     gss_release_name(&min_stat, &MNname);
176*c19800e8SDoug Rabson     gss_release_name(&min_stat, &name);
177*c19800e8SDoug Rabson 
178*c19800e8SDoug Rabson     /*
179*c19800e8SDoug Rabson      * Import oid less name and compare to mech name.
180*c19800e8SDoug Rabson      * Dovecot SASL lib does this.
181*c19800e8SDoug Rabson      */
182*c19800e8SDoug Rabson 
183*c19800e8SDoug Rabson     len = asprintf(&str, "lha");
184*c19800e8SDoug Rabson     if (len == -1)
185*c19800e8SDoug Rabson 	errx(1, "asprintf");
186*c19800e8SDoug Rabson 
187*c19800e8SDoug Rabson     name_buffer.value = str;
188*c19800e8SDoug Rabson     name_buffer.length = len;
189*c19800e8SDoug Rabson 
190*c19800e8SDoug Rabson     maj_stat = gss_import_name(&min_stat, &name_buffer,
191*c19800e8SDoug Rabson 			       GSS_C_NO_OID,
192*c19800e8SDoug Rabson 			       &name);
193*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
194*c19800e8SDoug Rabson 	gss_err(1, min_stat, "import (no oid) name error");
195*c19800e8SDoug Rabson 
196*c19800e8SDoug Rabson     maj_stat = gss_import_name(&min_stat, &name_buffer,
197*c19800e8SDoug Rabson 			       GSS_KRB5_NT_USER_NAME,
198*c19800e8SDoug Rabson 			       &MNname);
199*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
200*c19800e8SDoug Rabson 	gss_err(1, min_stat, "import (krb5 mn) name error");
201*c19800e8SDoug Rabson 
202*c19800e8SDoug Rabson     free(str);
203*c19800e8SDoug Rabson 
204*c19800e8SDoug Rabson     maj_stat = gss_compare_name(&min_stat, name, MNname, &equal);
205*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
206*c19800e8SDoug Rabson 	errx(1, "gss_compare_name");
207*c19800e8SDoug Rabson     if (!equal)
208*c19800e8SDoug Rabson 	errx(1, "names not equal");
209*c19800e8SDoug Rabson 
210*c19800e8SDoug Rabson     gss_release_name(&min_stat, &MNname);
211*c19800e8SDoug Rabson     gss_release_name(&min_stat, &name);
212*c19800e8SDoug Rabson 
213*c19800e8SDoug Rabson #if 0
214*c19800e8SDoug Rabson     maj_stat = gss_canonicalize_name (&min_stat,
215*c19800e8SDoug Rabson 				      name,
216*c19800e8SDoug Rabson 				      GSS_SPNEGO_MECHANISM,
217*c19800e8SDoug Rabson 				      &MNname);
218*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
219*c19800e8SDoug Rabson 	gss_err(1, min_stat, "canonicalize name error");
220*c19800e8SDoug Rabson 
221*c19800e8SDoug Rabson 
222*c19800e8SDoug Rabson     maj_stat = gss_export_name(&maj_stat,
223*c19800e8SDoug Rabson 			       MNname,
224*c19800e8SDoug Rabson 			       &name_buffer);
225*c19800e8SDoug Rabson     if (maj_stat != GSS_S_COMPLETE)
226*c19800e8SDoug Rabson 	gss_err(1, min_stat, "export name error (SPNEGO)");
227*c19800e8SDoug Rabson 
228*c19800e8SDoug Rabson     gss_release_name(&min_stat, &MNname);
229*c19800e8SDoug Rabson     gss_release_buffer(&min_stat, &name_buffer);
230*c19800e8SDoug Rabson #endif
231*c19800e8SDoug Rabson 
232*c19800e8SDoug Rabson     return 0;
233*c19800e8SDoug Rabson }
234