s4:torture: Adapt KDC canon test to Heimdal upstream changes
[samba.git] / source4 / heimdal / appl / test / uu_client.c
1 /*
2  * Copyright (c) 1997 - 2000 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 the Institute nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #include "test_locl.h"
35 RCSID("$Id$");
36
37 krb5_context context;
38
39 static int
40 proto (int sock, const char *hostname, const char *service)
41 {
42     struct sockaddr_storage remote, local;
43     socklen_t addrlen;
44     krb5_address remote_addr, local_addr;
45     krb5_context context;
46     krb5_ccache ccache;
47     krb5_auth_context auth_context;
48     krb5_error_code status;
49     krb5_principal client;
50     krb5_data data;
51     krb5_data packet;
52     krb5_creds mcred, cred;
53     krb5_ticket *ticket;
54
55     addrlen = sizeof(local);
56     if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0
57         || addrlen > sizeof(local))
58         err (1, "getsockname(%s)", hostname);
59
60     addrlen = sizeof(remote);
61     if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0
62         || addrlen > sizeof(remote))
63         err (1, "getpeername(%s)", hostname);
64
65     status = krb5_init_context(&context);
66     if (status)
67         errx(1, "krb5_init_context failed: %d", status);
68
69     status = krb5_cc_default (context, &ccache);
70     if (status)
71         krb5_err(context, 1, status, "krb5_cc_default");
72
73     status = krb5_auth_con_init (context, &auth_context);
74     if (status)
75         krb5_err(context, 1, status, "krb5_auth_con_init");
76
77     status = krb5_sockaddr2address (context, (struct sockaddr *)&local, &local_addr);
78     if (status)
79         krb5_err(context, 1, status, "krb5_sockaddr2address(local)");
80     status = krb5_sockaddr2address (context, (struct sockaddr *)&remote, &remote_addr);
81     if (status)
82         krb5_err(context, 1, status, "krb5_sockaddr2address(remote)");
83
84     status = krb5_auth_con_setaddrs (context,
85                                      auth_context,
86                                      &local_addr,
87                                      &remote_addr);
88     if (status)
89         krb5_err(context, 1, status, "krb5_auth_con_setaddr");
90
91     krb5_cc_clear_mcred(&mcred);
92
93     status = krb5_cc_get_principal(context, ccache, &client);
94     if(status)
95         krb5_err(context, 1, status, "krb5_cc_get_principal");
96     status = krb5_make_principal(context, &mcred.server,
97                                  krb5_principal_get_realm(context, client),
98                                  "krbtgt",
99                                  krb5_principal_get_realm(context, client),
100                                  NULL);
101     if(status)
102         krb5_err(context, 1, status, "krb5_make_principal");
103     mcred.client = client;
104
105     status = krb5_cc_retrieve_cred(context, ccache, 0, &mcred, &cred);
106     if(status)
107         krb5_err(context, 1, status, "krb5_cc_retrieve_cred");
108
109     {
110         char *client_name;
111         krb5_data data;
112         status = krb5_unparse_name(context, cred.client, &client_name);
113         if(status)
114             krb5_err(context, 1, status, "krb5_unparse_name");
115         data.data = client_name;
116         data.length = strlen(client_name) + 1;
117         status = krb5_write_message(context, &sock, &data);
118         if(status)
119             krb5_err(context, 1, status, "krb5_write_message");
120         free(client_name);
121     }
122
123     status = krb5_write_message(context, &sock, &cred.ticket);
124     if(status)
125         krb5_err(context, 1, status, "krb5_write_message");
126
127     status = krb5_auth_con_setuserkey(context, auth_context, &cred.session);
128     if(status)
129         krb5_err(context, 1, status, "krb5_auth_con_setuserkey");
130
131     status = krb5_recvauth(context, &auth_context, &sock,
132                            VERSION, client, 0, NULL, &ticket);
133
134     if (status)
135         krb5_err(context, 1, status, "krb5_recvauth");
136
137     if (ticket->ticket.authorization_data) {
138         AuthorizationData *authz;
139         int i;
140
141         printf("Authorization data:\n");
142
143         authz = ticket->ticket.authorization_data;
144         for (i = 0; i < authz->len; i++) {
145             printf("\ttype %d, length %lu\n",
146                    authz->val[i].ad_type,
147                    (unsigned long)authz->val[i].ad_data.length);
148         }
149     }
150
151     data.data   = "hej";
152     data.length = 3;
153
154     krb5_data_zero (&packet);
155
156     status = krb5_mk_safe (context,
157                            auth_context,
158                            &data,
159                            &packet,
160                            NULL);
161     if (status)
162         krb5_err(context, 1, status, "krb5_mk_safe");
163
164     status = krb5_write_message(context, &sock, &packet);
165     if(status)
166         krb5_err(context, 1, status, "krb5_write_message");
167
168     data.data   = "hemligt";
169     data.length = 7;
170
171     krb5_data_free (&packet);
172
173     status = krb5_mk_priv (context,
174                            auth_context,
175                            &data,
176                            &packet,
177                            NULL);
178     if (status)
179         krb5_err(context, 1, status, "krb5_mk_priv");
180
181     status = krb5_write_message(context, &sock, &packet);
182     if(status)
183         krb5_err(context, 1, status, "krb5_write_message");
184     return 0;
185 }
186
187 int
188 main(int argc, char **argv)
189 {
190     int port = client_setup(&context, &argc, argv);
191     return client_doit (argv[argc], port, service, proto);
192 }