155682Smarkm/*
2233294Sstas * Copyright (c) 1997 - 2000 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
955682Smarkm *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
2055682Smarkm *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "test_locl.h"
35233294SstasRCSID("$Id$");
3655682Smarkm
3755682Smarkmkrb5_context context;
3855682Smarkm
3955682Smarkmstatic int
4055682Smarkmproto (int sock, const char *hostname, const char *service)
4155682Smarkm{
4255682Smarkm    struct sockaddr_in remote, local;
4372445Sassar    socklen_t addrlen;
4455682Smarkm    krb5_address remote_addr, local_addr;
4555682Smarkm    krb5_context context;
4655682Smarkm    krb5_ccache ccache;
4755682Smarkm    krb5_auth_context auth_context;
4855682Smarkm    krb5_error_code status;
4955682Smarkm    krb5_principal client;
5055682Smarkm    krb5_data data;
5155682Smarkm    krb5_data packet;
5255682Smarkm    krb5_creds mcred, cred;
53178825Sdfr    krb5_ticket *ticket;
5455682Smarkm
5555682Smarkm    addrlen = sizeof(local);
5655682Smarkm    if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0
5755682Smarkm	|| addrlen != sizeof(local))
5855682Smarkm	err (1, "getsockname(%s)", hostname);
5955682Smarkm
6055682Smarkm    addrlen = sizeof(remote);
6155682Smarkm    if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0
6255682Smarkm	|| addrlen != sizeof(remote))
6355682Smarkm	err (1, "getpeername(%s)", hostname);
6455682Smarkm
6555682Smarkm    status = krb5_init_context(&context);
6655682Smarkm    if (status)
6772445Sassar	errx(1, "krb5_init_context failed: %d", status);
6855682Smarkm
6955682Smarkm    status = krb5_cc_default (context, &ccache);
7055682Smarkm    if (status)
7155682Smarkm	krb5_err(context, 1, status, "krb5_cc_default");
7255682Smarkm
7355682Smarkm    status = krb5_auth_con_init (context, &auth_context);
7455682Smarkm    if (status)
7555682Smarkm	krb5_err(context, 1, status, "krb5_auth_con_init");
7655682Smarkm
7755682Smarkm    local_addr.addr_type = AF_INET;
7855682Smarkm    local_addr.address.length = sizeof(local.sin_addr);
7955682Smarkm    local_addr.address.data   = &local.sin_addr;
8055682Smarkm
8155682Smarkm    remote_addr.addr_type = AF_INET;
8255682Smarkm    remote_addr.address.length = sizeof(remote.sin_addr);
8355682Smarkm    remote_addr.address.data   = &remote.sin_addr;
8455682Smarkm
8555682Smarkm    status = krb5_auth_con_setaddrs (context,
8655682Smarkm				     auth_context,
8755682Smarkm				     &local_addr,
8855682Smarkm				     &remote_addr);
8955682Smarkm    if (status)
9055682Smarkm	krb5_err(context, 1, status, "krb5_auth_con_setaddr");
9155682Smarkm
92178825Sdfr    krb5_cc_clear_mcred(&mcred);
93178825Sdfr
9455682Smarkm    status = krb5_cc_get_principal(context, ccache, &client);
9555682Smarkm    if(status)
9655682Smarkm	krb5_err(context, 1, status, "krb5_cc_get_principal");
9755682Smarkm    status = krb5_make_principal(context, &mcred.server,
98233294Sstas				 krb5_principal_get_realm(context, client),
99233294Sstas				 "krbtgt",
100233294Sstas				 krb5_principal_get_realm(context, client),
10155682Smarkm				 NULL);
10255682Smarkm    if(status)
10355682Smarkm	krb5_err(context, 1, status, "krb5_make_principal");
104178825Sdfr    mcred.client = client;
105233294Sstas
10655682Smarkm    status = krb5_cc_retrieve_cred(context, ccache, 0, &mcred, &cred);
10755682Smarkm    if(status)
10855682Smarkm	krb5_err(context, 1, status, "krb5_cc_retrieve_cred");
10955682Smarkm
11055682Smarkm    {
11155682Smarkm	char *client_name;
11255682Smarkm	krb5_data data;
11355682Smarkm	status = krb5_unparse_name(context, cred.client, &client_name);
11455682Smarkm	if(status)
11555682Smarkm	    krb5_err(context, 1, status, "krb5_unparse_name");
11655682Smarkm	data.data = client_name;
11755682Smarkm	data.length = strlen(client_name) + 1;
11855682Smarkm	status = krb5_write_message(context, &sock, &data);
11955682Smarkm	if(status)
12055682Smarkm	    krb5_err(context, 1, status, "krb5_write_message");
12155682Smarkm	free(client_name);
12255682Smarkm    }
12355682Smarkm
12455682Smarkm    status = krb5_write_message(context, &sock, &cred.ticket);
12555682Smarkm    if(status)
12655682Smarkm	krb5_err(context, 1, status, "krb5_write_message");
12755682Smarkm
12855682Smarkm    status = krb5_auth_con_setuserkey(context, auth_context, &cred.session);
12955682Smarkm    if(status)
13055682Smarkm	krb5_err(context, 1, status, "krb5_auth_con_setuserkey");
131233294Sstas
132233294Sstas    status = krb5_recvauth(context, &auth_context, &sock,
133178825Sdfr			   VERSION, client, 0, NULL, &ticket);
13455682Smarkm
13555682Smarkm    if (status)
13655682Smarkm	krb5_err(context, 1, status, "krb5_recvauth");
137233294Sstas
138178825Sdfr    if (ticket->ticket.authorization_data) {
139178825Sdfr	AuthorizationData *authz;
140178825Sdfr	int i;
141178825Sdfr
142178825Sdfr	printf("Authorization data:\n");
143178825Sdfr
144178825Sdfr	authz = ticket->ticket.authorization_data;
145178825Sdfr	for (i = 0; i < authz->len; i++) {
146178825Sdfr	    printf("\ttype %d, length %lu\n",
147178825Sdfr		   authz->val[i].ad_type,
148178825Sdfr		   (unsigned long)authz->val[i].ad_data.length);
149178825Sdfr	}
150178825Sdfr    }
151178825Sdfr
15255682Smarkm    data.data   = "hej";
15355682Smarkm    data.length = 3;
15455682Smarkm
15555682Smarkm    krb5_data_zero (&packet);
15655682Smarkm
15755682Smarkm    status = krb5_mk_safe (context,
15855682Smarkm			   auth_context,
15955682Smarkm			   &data,
16055682Smarkm			   &packet,
16155682Smarkm			   NULL);
16255682Smarkm    if (status)
16355682Smarkm	krb5_err(context, 1, status, "krb5_mk_safe");
16455682Smarkm
16555682Smarkm    status = krb5_write_message(context, &sock, &packet);
16655682Smarkm    if(status)
16755682Smarkm	krb5_err(context, 1, status, "krb5_write_message");
16855682Smarkm
16955682Smarkm    data.data   = "hemligt";
17055682Smarkm    data.length = 7;
17155682Smarkm
17255682Smarkm    krb5_data_free (&packet);
17355682Smarkm
17455682Smarkm    status = krb5_mk_priv (context,
17555682Smarkm			   auth_context,
17655682Smarkm			   &data,
17755682Smarkm			   &packet,
17855682Smarkm			   NULL);
17955682Smarkm    if (status)
18055682Smarkm	krb5_err(context, 1, status, "krb5_mk_priv");
18155682Smarkm
18255682Smarkm    status = krb5_write_message(context, &sock, &packet);
18355682Smarkm    if(status)
18455682Smarkm	krb5_err(context, 1, status, "krb5_write_message");
18555682Smarkm    return 0;
18655682Smarkm}
18755682Smarkm
18855682Smarkmint
18955682Smarkmmain(int argc, char **argv)
19055682Smarkm{
19155682Smarkm    int port = client_setup(&context, &argc, argv);
19255682Smarkm    return client_doit (argv[argc], port, service, proto);
19355682Smarkm}
194