xref: /minix3/crypto/external/bsd/heimdal/dist/lib/krb5/test_x500.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1 /*	$NetBSD: test_x500.c,v 1.1.1.1 2014/04/24 12:45:51 pettai Exp $	*/
2 
3 /*
4  * Copyright (c) 2011 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  *
40  */
41 
42 static void
check_linear(krb5_context context,const char * client_realm,const char * server_realm,const char * realm,...)43 check_linear(krb5_context context,
44 	     const char *client_realm,
45 	     const char *server_realm,
46 	     const char *realm,
47 	     ...)
48 {
49     unsigned int num_inrealms = 0, num_realms = 0, n;
50     char **inrealms = NULL;
51     char **realms = NULL;
52     krb5_error_code ret;
53     krb5_data tr;
54     va_list va;
55 
56     krb5_data_zero(&tr);
57 
58     va_start(va, realm);
59 
60     while (realm) {
61 	inrealms = erealloc(inrealms, (num_inrealms + 2) * sizeof(inrealms[0]));
62 	inrealms[num_inrealms] = rk_UNCONST(realm);
63 	num_inrealms++;
64 	realm = va_arg(va, const char *);
65     }
66     if (inrealms)
67 	inrealms[num_inrealms] = NULL;
68 
69     ret = krb5_domain_x500_encode(inrealms, num_inrealms, &tr);
70     if (ret)
71 	krb5_err(context, 1, ret, "krb5_domain_x500_encode");
72 
73     ret = krb5_domain_x500_decode(context, tr,
74 				  &realms, &num_realms,
75 				  client_realm, server_realm);
76     if (ret)
77 	krb5_err(context, 1, ret, "krb5_domain_x500_decode");
78 
79     krb5_data_free(&tr);
80 
81     if (num_inrealms != num_realms)
82 	errx(1, "num_inrealms != num_realms");
83 
84     for(n = 0; n < num_realms; n++)
85 	free(realms[n]);
86     free(realms);
87 
88     free(inrealms);
89 }
90 
91 
92 int
main(int argc,char ** argv)93 main(int argc, char **argv)
94 {
95     krb5_context context;
96     krb5_error_code ret;
97 
98     setprogname(argv[0]);
99 
100     ret = krb5_init_context(&context);
101     if (ret)
102 	errx(1, "krb5_init_context");
103 
104 
105     check_linear(context, "KTH1.SE", "KTH1.SE", NULL);
106     check_linear(context, "KTH1.SE", "KTH2.SE", NULL);
107     check_linear(context, "KTH1.SE", "KTH3.SE", "KTH2.SE", NULL);
108     check_linear(context, "KTH1.SE", "KTH4.SE", "KTH3.SE", "KTH2.SE", NULL);
109     check_linear(context, "KTH1.SE", "KTH5.SE", "KTH4.SE", "KTH3.SE", "KTH2.SE", NULL);
110 
111     return 0;
112 }
113