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