xref: /freebsd/crypto/heimdal/lib/krb5/test_princ.c (revision 8ddb146abcdf061be9f2c0db7e391697dafad85c)
1 /*
2  * Copyright (c) 2003 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 #include "krb5_locl.h"
34 #include <err.h>
35 
36 /*
37  * Check that a closed cc still keeps it data and that it's no longer
38  * there when it's destroyed.
39  */
40 
41 static void
42 test_princ(krb5_context context)
43 {
44     const char *princ = "lha@SU.SE";
45     const char *princ_short = "lha";
46     const char *noquote;
47     krb5_error_code ret;
48     char *princ_unparsed;
49     char *princ_reformed = NULL;
50     const char *realm;
51 
52     krb5_principal p, p2;
53 
54     ret = krb5_parse_name(context, princ, &p);
55     if (ret)
56 	krb5_err(context, 1, ret, "krb5_parse_name");
57 
58     ret = krb5_unparse_name(context, p, &princ_unparsed);
59     if (ret)
60 	krb5_err(context, 1, ret, "krb5_parse_name");
61 
62     if (strcmp(princ, princ_unparsed)) {
63 	krb5_errx(context, 1, "%s != %s", princ, princ_unparsed);
64     }
65 
66     free(princ_unparsed);
67 
68     ret = krb5_unparse_name_flags(context, p,
69 				  KRB5_PRINCIPAL_UNPARSE_NO_REALM,
70 				  &princ_unparsed);
71     if (ret)
72 	krb5_err(context, 1, ret, "krb5_parse_name");
73 
74     if (strcmp(princ_short, princ_unparsed))
75 	krb5_errx(context, 1, "%s != %s", princ_short, princ_unparsed);
76     free(princ_unparsed);
77 
78     realm = krb5_principal_get_realm(context, p);
79 
80     if (asprintf(&princ_reformed, "%s@%s", princ_short, realm) < 0 || princ_reformed == NULL)
81 	errx(1, "malloc");
82 
83     ret = krb5_parse_name(context, princ_reformed, &p2);
84     free(princ_reformed);
85     if (ret)
86 	krb5_err(context, 1, ret, "krb5_parse_name");
87 
88     if (!krb5_principal_compare(context, p, p2)) {
89 	krb5_errx(context, 1, "p != p2");
90     }
91 
92     krb5_free_principal(context, p2);
93 
94     ret = krb5_set_default_realm(context, "SU.SE");
95     if (ret)
96 	krb5_err(context, 1, ret, "krb5_parse_name");
97 
98     ret = krb5_unparse_name_flags(context, p,
99 				  KRB5_PRINCIPAL_UNPARSE_SHORT,
100 				  &princ_unparsed);
101     if (ret)
102 	krb5_err(context, 1, ret, "krb5_parse_name");
103 
104     if (strcmp(princ_short, princ_unparsed))
105 	krb5_errx(context, 1, "'%s' != '%s'", princ_short, princ_unparsed);
106     free(princ_unparsed);
107 
108     ret = krb5_parse_name(context, princ_short, &p2);
109     if (ret)
110 	krb5_err(context, 1, ret, "krb5_parse_name");
111 
112     if (!krb5_principal_compare(context, p, p2))
113 	krb5_errx(context, 1, "p != p2");
114     krb5_free_principal(context, p2);
115 
116     ret = krb5_unparse_name(context, p, &princ_unparsed);
117     if (ret)
118 	krb5_err(context, 1, ret, "krb5_parse_name");
119 
120     if (strcmp(princ, princ_unparsed))
121 	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
122     free(princ_unparsed);
123 
124     ret = krb5_set_default_realm(context, "SAMBA.ORG");
125     if (ret)
126 	krb5_err(context, 1, ret, "krb5_parse_name");
127 
128     ret = krb5_parse_name(context, princ_short, &p2);
129     if (ret)
130 	krb5_err(context, 1, ret, "krb5_parse_name");
131 
132     if (krb5_principal_compare(context, p, p2))
133 	krb5_errx(context, 1, "p == p2");
134 
135     if (!krb5_principal_compare_any_realm(context, p, p2))
136 	krb5_errx(context, 1, "(ignoring realms) p != p2");
137 
138     ret = krb5_unparse_name(context, p2, &princ_unparsed);
139     if (ret)
140 	krb5_err(context, 1, ret, "krb5_parse_name");
141 
142     if (strcmp(princ, princ_unparsed) == 0)
143 	krb5_errx(context, 1, "%s == %s", princ, princ_unparsed);
144     free(princ_unparsed);
145 
146     krb5_free_principal(context, p2);
147 
148     ret = krb5_parse_name(context, princ, &p2);
149     if (ret)
150 	krb5_err(context, 1, ret, "krb5_parse_name");
151 
152     if (!krb5_principal_compare(context, p, p2))
153 	krb5_errx(context, 1, "p != p2");
154 
155     ret = krb5_unparse_name(context, p2, &princ_unparsed);
156     if (ret)
157 	krb5_err(context, 1, ret, "krb5_parse_name");
158 
159     if (strcmp(princ, princ_unparsed))
160 	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
161     free(princ_unparsed);
162 
163     krb5_free_principal(context, p2);
164 
165     ret = krb5_unparse_name_flags(context, p,
166 				  KRB5_PRINCIPAL_UNPARSE_SHORT,
167 				  &princ_unparsed);
168     if (ret)
169 	krb5_err(context, 1, ret, "krb5_unparse_name_short");
170 
171     if (strcmp(princ, princ_unparsed) != 0)
172 	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
173     free(princ_unparsed);
174 
175     ret = krb5_unparse_name(context, p, &princ_unparsed);
176     if (ret)
177 	krb5_err(context, 1, ret, "krb5_unparse_name_short");
178 
179     if (strcmp(princ, princ_unparsed))
180 	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
181     free(princ_unparsed);
182 
183     ret = krb5_parse_name_flags(context, princ,
184 				KRB5_PRINCIPAL_PARSE_NO_REALM,
185 				&p2);
186     if (!ret)
187 	krb5_err(context, 1, ret, "Should have failed to parse %s a "
188 		 "short name", princ);
189 
190     ret = krb5_parse_name_flags(context, princ_short,
191 				KRB5_PRINCIPAL_PARSE_NO_REALM,
192 				&p2);
193     if (ret)
194 	krb5_err(context, 1, ret, "krb5_parse_name");
195 
196     ret = krb5_unparse_name_flags(context, p2,
197 				  KRB5_PRINCIPAL_UNPARSE_NO_REALM,
198 				  &princ_unparsed);
199     krb5_free_principal(context, p2);
200     if (ret)
201 	krb5_err(context, 1, ret, "krb5_unparse_name_norealm");
202 
203     if (strcmp(princ_short, princ_unparsed))
204 	krb5_errx(context, 1, "'%s' != '%s'", princ_short, princ_unparsed);
205     free(princ_unparsed);
206 
207     ret = krb5_parse_name_flags(context, princ_short,
208 				KRB5_PRINCIPAL_PARSE_REQUIRE_REALM,
209 				&p2);
210     if (!ret)
211 	krb5_err(context, 1, ret, "Should have failed to parse %s "
212 		 "because it lacked a realm", princ_short);
213 
214     ret = krb5_parse_name_flags(context, princ,
215 				KRB5_PRINCIPAL_PARSE_REQUIRE_REALM,
216 				&p2);
217     if (ret)
218 	krb5_err(context, 1, ret, "krb5_parse_name");
219 
220     if (!krb5_principal_compare(context, p, p2))
221 	krb5_errx(context, 1, "p != p2");
222 
223     ret = krb5_unparse_name_flags(context, p2,
224 				  KRB5_PRINCIPAL_UNPARSE_NO_REALM,
225 				  &princ_unparsed);
226     krb5_free_principal(context, p2);
227     if (ret)
228 	krb5_err(context, 1, ret, "krb5_unparse_name_norealm");
229 
230     if (strcmp(princ_short, princ_unparsed))
231 	krb5_errx(context, 1, "'%s' != '%s'", princ_short, princ_unparsed);
232     free(princ_unparsed);
233 
234     krb5_free_principal(context, p);
235 
236     /* test quoting */
237 
238     princ = "test\\ principal@SU.SE";
239     noquote = "test principal@SU.SE";
240 
241     ret = krb5_parse_name_flags(context, princ, 0, &p);
242     if (ret)
243 	krb5_err(context, 1, ret, "krb5_parse_name");
244 
245     ret = krb5_unparse_name_flags(context, p, 0, &princ_unparsed);
246     if (ret)
247 	krb5_err(context, 1, ret, "krb5_unparse_name_flags");
248 
249     if (strcmp(princ, princ_unparsed))
250 	krb5_errx(context, 1, "q '%s' != '%s'", princ, princ_unparsed);
251     free(princ_unparsed);
252 
253     ret = krb5_unparse_name_flags(context, p, KRB5_PRINCIPAL_UNPARSE_DISPLAY,
254 				  &princ_unparsed);
255     if (ret)
256 	krb5_err(context, 1, ret, "krb5_unparse_name_flags");
257 
258     if (strcmp(noquote, princ_unparsed))
259 	krb5_errx(context, 1, "nq '%s' != '%s'", noquote, princ_unparsed);
260     free(princ_unparsed);
261 
262     krb5_free_principal(context, p);
263 }
264 
265 static void
266 test_enterprise(krb5_context context)
267 {
268     krb5_error_code ret;
269     char *unparsed;
270     krb5_principal p;
271 
272     ret = krb5_set_default_realm(context, "SAMBA.ORG");
273     if (ret)
274 	krb5_err(context, 1, ret, "krb5_parse_name");
275 
276     ret = krb5_parse_name_flags(context, "lha@su.se@WIN.SU.SE",
277 				KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
278     if (ret)
279 	krb5_err(context, 1, ret, "krb5_parse_name_flags");
280 
281     ret = krb5_unparse_name(context, p, &unparsed);
282     if (ret)
283 	krb5_err(context, 1, ret, "krb5_unparse_name");
284 
285     krb5_free_principal(context, p);
286 
287     if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0)
288 	krb5_errx(context, 1, "enterprise name failed 1");
289     free(unparsed);
290 
291     /*
292      *
293      */
294 
295     ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE",
296 				KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
297     if (ret)
298 	krb5_err(context, 1, ret, "krb5_parse_name_flags");
299 
300     ret = krb5_unparse_name(context, p, &unparsed);
301     if (ret)
302 	krb5_err(context, 1, ret, "krb5_unparse_name");
303 
304     krb5_free_principal(context, p);
305     if (strcmp(unparsed, "lha\\@su.se\\@WIN.SU.SE@SAMBA.ORG") != 0)
306 	krb5_errx(context, 1, "enterprise name failed 2: %s", unparsed);
307     free(unparsed);
308 
309     /*
310      *
311      */
312 
313     ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE", 0, &p);
314     if (ret)
315 	krb5_err(context, 1, ret, "krb5_parse_name_flags");
316 
317     ret = krb5_unparse_name(context, p, &unparsed);
318     if (ret)
319 	krb5_err(context, 1, ret, "krb5_unparse_name");
320 
321     krb5_free_principal(context, p);
322     if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0)
323 	krb5_errx(context, 1, "enterprise name failed 3");
324     free(unparsed);
325 
326     /*
327      *
328      */
329 
330     ret = krb5_parse_name_flags(context, "lha@su.se",
331 				KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
332     if (ret)
333 	krb5_err(context, 1, ret, "krb5_parse_name_flags");
334 
335     ret = krb5_unparse_name(context, p, &unparsed);
336     if (ret)
337 	krb5_err(context, 1, ret, "krb5_unparse_name");
338 
339     krb5_free_principal(context, p);
340     if (strcmp(unparsed, "lha\\@su.se@SAMBA.ORG") != 0)
341 	krb5_errx(context, 1, "enterprise name failed 2: %s", unparsed);
342     free(unparsed);
343 }
344 
345 
346 int
347 main(int argc, char **argv)
348 {
349     krb5_context context;
350     krb5_error_code ret;
351 
352     setprogname(argv[0]);
353 
354     ret = krb5_init_context(&context);
355     if (ret)
356 	errx (1, "krb5_init_context failed: %d", ret);
357 
358     test_princ(context);
359 
360     test_enterprise(context);
361 
362     krb5_free_context(context);
363 
364     return 0;
365 }
366