uu_client.c revision 72445
1248557Sray/*
2248557Sray * Copyright (c) 1997 - 2000 Kungliga Tekniska H�gskolan
3248557Sray * (Royal Institute of Technology, Stockholm, Sweden).
4259345Sian * All rights reserved.
5248557Sray *
6248557Sray * Redistribution and use in source and binary forms, with or without
7248557Sray * modification, are permitted provided that the following conditions
8248557Sray * are met:
9248557Sray *
10248557Sray * 1. Redistributions of source code must retain the above copyright
11248557Sray *    notice, this list of conditions and the following disclaimer.
12248557Sray *
13248557Sray * 2. Redistributions in binary form must reproduce the above copyright
14248557Sray *    notice, this list of conditions and the following disclaimer in the
15248557Sray *    documentation and/or other materials provided with the distribution.
16248557Sray *
17248557Sray * 3. Neither the name of the Institute nor the names of its contributors
18248557Sray *    may be used to endorse or promote products derived from this software
19248557Sray *    without specific prior written permission.
20248557Sray *
21248557Sray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22248557Sray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23248557Sray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24248557Sray * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25248557Sray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26248557Sray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27248557Sray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28248557Sray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29248557Sray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30248557Sray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31248557Sray * SUCH DAMAGE.
32248557Sray */
33248557Sray
34248557Sray#include "test_locl.h"
35259345SianRCSID("$Id: uu_client.c,v 1.7 2000/12/31 07:41:39 assar Exp $");
36259345Sian
37259345Siankrb5_context context;
38248557Sray
39248557Sraystatic int
40248557Srayproto (int sock, const char *hostname, const char *service)
41248557Sray{
42248557Sray    struct sockaddr_in remote, local;
43248557Sray    socklen_t addrlen;
44248557Sray    krb5_address remote_addr, local_addr;
45248557Sray    krb5_context context;
46248557Sray    krb5_ccache ccache;
47248557Sray    krb5_auth_context auth_context;
48248557Sray    krb5_error_code status;
49248557Sray    krb5_principal client;
50248557Sray    krb5_data data;
51248557Sray    krb5_data packet;
52248557Sray    krb5_creds mcred, cred;
53248557Sray
54248557Sray    addrlen = sizeof(local);
55248557Sray    if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0
56248557Sray	|| addrlen != sizeof(local))
57248557Sray	err (1, "getsockname(%s)", hostname);
58259345Sian
59248557Sray    addrlen = sizeof(remote);
60248557Sray    if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0
61248557Sray	|| addrlen != sizeof(remote))
62248557Sray	err (1, "getpeername(%s)", hostname);
63266371Sian
64259345Sian    status = krb5_init_context(&context);
65248557Sray    if (status)
66248557Sray	errx(1, "krb5_init_context failed: %d", status);
67259345Sian
68259345Sian    status = krb5_cc_default (context, &ccache);
69259345Sian    if (status)
70259345Sian	krb5_err(context, 1, status, "krb5_cc_default");
71259345Sian
72259345Sian    status = krb5_auth_con_init (context, &auth_context);
73259345Sian    if (status)
74259345Sian	krb5_err(context, 1, status, "krb5_auth_con_init");
75259345Sian
76259345Sian    local_addr.addr_type = AF_INET;
77259345Sian    local_addr.address.length = sizeof(local.sin_addr);
78259345Sian    local_addr.address.data   = &local.sin_addr;
79259345Sian
80259345Sian    remote_addr.addr_type = AF_INET;
81259345Sian    remote_addr.address.length = sizeof(remote.sin_addr);
82259345Sian    remote_addr.address.data   = &remote.sin_addr;
83259345Sian
84259345Sian    status = krb5_auth_con_setaddrs (context,
85259345Sian				     auth_context,
86259345Sian				     &local_addr,
87259345Sian				     &remote_addr);
88259345Sian    if (status)
89259345Sian	krb5_err(context, 1, status, "krb5_auth_con_setaddr");
90259345Sian
91259345Sian    status = krb5_cc_get_principal(context, ccache, &client);
92259345Sian    if(status)
93259345Sian	krb5_err(context, 1, status, "krb5_cc_get_principal");
94259345Sian    status = krb5_make_principal(context, &mcred.server,
95259345Sian				 *krb5_princ_realm(context, client),
96259345Sian				 "krbtgt",
97259345Sian				 *krb5_princ_realm(context, client),
98259345Sian				 NULL);
99259345Sian    if(status)
100259345Sian	krb5_err(context, 1, status, "krb5_make_principal");
101259345Sian
102259345Sian    status = krb5_cc_retrieve_cred(context, ccache, 0, &mcred, &cred);
103259345Sian    if(status)
104259345Sian	krb5_err(context, 1, status, "krb5_cc_retrieve_cred");
105259345Sian
106259345Sian    {
107259345Sian	char *client_name;
108259345Sian	krb5_data data;
109259345Sian	status = krb5_unparse_name(context, cred.client, &client_name);
110259345Sian	if(status)
111259345Sian	    krb5_err(context, 1, status, "krb5_unparse_name");
112259345Sian	data.data = client_name;
113259345Sian	data.length = strlen(client_name) + 1;
114259345Sian	status = krb5_write_message(context, &sock, &data);
115259345Sian	if(status)
116259345Sian	    krb5_err(context, 1, status, "krb5_write_message");
117259345Sian	free(client_name);
118259345Sian    }
119259345Sian
120259345Sian    status = krb5_write_message(context, &sock, &cred.ticket);
121259345Sian    if(status)
122259345Sian	krb5_err(context, 1, status, "krb5_write_message");
123259345Sian
124259345Sian    status = krb5_auth_con_setuserkey(context, auth_context, &cred.session);
125259345Sian    if(status)
126259345Sian	krb5_err(context, 1, status, "krb5_auth_con_setuserkey");
127259345Sian
128259345Sian    status = krb5_recvauth(context, &auth_context, &sock,
129259345Sian			   VERSION, client, 0, NULL, NULL);
130259345Sian
131259345Sian    if (status)
132259345Sian	krb5_err(context, 1, status, "krb5_recvauth");
133259345Sian
134259345Sian    data.data   = "hej";
135248557Sray    data.length = 3;
136259345Sian
137259345Sian    krb5_data_zero (&packet);
138259345Sian
139259345Sian    status = krb5_mk_safe (context,
140259345Sian			   auth_context,
141259345Sian			   &data,
142259345Sian			   &packet,
143259345Sian			   NULL);
144259345Sian    if (status)
145248557Sray	krb5_err(context, 1, status, "krb5_mk_safe");
146248557Sray
147259345Sian    status = krb5_write_message(context, &sock, &packet);
148259345Sian    if(status)
149259345Sian	krb5_err(context, 1, status, "krb5_write_message");
150259345Sian
151259345Sian    data.data   = "hemligt";
152259345Sian    data.length = 7;
153259345Sian
154259345Sian    krb5_data_free (&packet);
155259345Sian
156259345Sian    status = krb5_mk_priv (context,
157259345Sian			   auth_context,
158248557Sray			   &data,
159248557Sray			   &packet,
160259345Sian			   NULL);
161259345Sian    if (status)
162259345Sian	krb5_err(context, 1, status, "krb5_mk_priv");
163248557Sray
164266152Sian    status = krb5_write_message(context, &sock, &packet);
165266152Sian    if(status)
166266152Sian	krb5_err(context, 1, status, "krb5_write_message");
167259345Sian    return 0;
168259345Sian}
169259345Sian
170259345Sianint
171259345Sianmain(int argc, char **argv)
172259345Sian{
173248557Sray    int port = client_setup(&context, &argc, argv);
174259345Sian    return client_doit (argv[argc], port, service, proto);
175259345Sian}
176259345Sian