155682Smarkm/*
2233294Sstas * Copyright (c) 1997 - 1999 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 *service)
4155682Smarkm{
4255682Smarkm    krb5_auth_context auth_context;
4355682Smarkm    krb5_error_code status;
4455682Smarkm    krb5_principal server;
4555682Smarkm    krb5_ticket *ticket;
4655682Smarkm    char *name;
4755682Smarkm    char hostname[MAXHOSTNAMELEN];
4855682Smarkm    krb5_data packet;
4955682Smarkm    krb5_data data;
50178825Sdfr    uint32_t len, net_len;
5155682Smarkm    ssize_t n;
5255682Smarkm
5355682Smarkm    status = krb5_auth_con_init (context, &auth_context);
5455682Smarkm    if (status)
5555682Smarkm	krb5_err (context, 1, status, "krb5_auth_con_init");
5655682Smarkm
5755682Smarkm    status = krb5_auth_con_setaddrs_from_fd (context,
5855682Smarkm					     auth_context,
5955682Smarkm					     &sock);
6055682Smarkm
6155682Smarkm    if (status)
6255682Smarkm	krb5_err (context, 1, status, "krb5_auth_con_setaddrs_from_fd");
6355682Smarkm
6455682Smarkm    if(gethostname (hostname, sizeof(hostname)) < 0)
6555682Smarkm	krb5_err (context, 1, errno, "gethostname");
6655682Smarkm
6755682Smarkm    status = krb5_sname_to_principal (context,
6855682Smarkm				      hostname,
6955682Smarkm				      service,
7055682Smarkm				      KRB5_NT_SRV_HST,
7155682Smarkm				      &server);
7255682Smarkm    if (status)
7355682Smarkm	krb5_err (context, 1, status, "krb5_sname_to_principal");
7455682Smarkm
7555682Smarkm    status = krb5_recvauth (context,
7655682Smarkm			    &auth_context,
7755682Smarkm			    &sock,
7855682Smarkm			    VERSION,
7955682Smarkm			    server,
8055682Smarkm			    0,
81178825Sdfr			    keytab,
8255682Smarkm			    &ticket);
8355682Smarkm    if (status)
8455682Smarkm	krb5_err (context, 1, status, "krb5_recvauth");
8555682Smarkm
8655682Smarkm    status = krb5_unparse_name (context,
8755682Smarkm				ticket->client,
8855682Smarkm				&name);
8955682Smarkm    if (status)
9055682Smarkm	krb5_err (context, 1, status, "krb5_unparse_name");
9155682Smarkm
9255682Smarkm    fprintf (stderr, "User is `%s'\n", name);
9355682Smarkm    free (name);
9455682Smarkm
9555682Smarkm    krb5_data_zero (&data);
9655682Smarkm    krb5_data_zero (&packet);
9755682Smarkm
9855682Smarkm    n = krb5_net_read (context, &sock, &net_len, 4);
9955682Smarkm    if (n == 0)
10055682Smarkm	krb5_errx (context, 1, "EOF in krb5_net_read");
10155682Smarkm    if (n < 0)
10255682Smarkm	krb5_err (context, 1, errno, "krb5_net_read");
10355682Smarkm
10455682Smarkm    len = ntohl(net_len);
10555682Smarkm
10655682Smarkm    krb5_data_alloc (&packet, len);
10755682Smarkm
10855682Smarkm    n = krb5_net_read (context, &sock, packet.data, len);
10955682Smarkm    if (n == 0)
11055682Smarkm	krb5_errx (context, 1, "EOF in krb5_net_read");
11155682Smarkm    if (n < 0)
11255682Smarkm	krb5_err (context, 1, errno, "krb5_net_read");
113233294Sstas
11455682Smarkm    status = krb5_rd_safe (context,
11555682Smarkm			   auth_context,
11655682Smarkm			   &packet,
11755682Smarkm			   &data,
11855682Smarkm			   NULL);
11955682Smarkm    if (status)
12055682Smarkm	krb5_err (context, 1, status, "krb5_rd_safe");
12155682Smarkm
12255682Smarkm    fprintf (stderr, "safe packet: %.*s\n", (int)data.length,
12355682Smarkm	    (char *)data.data);
12455682Smarkm
12555682Smarkm    n = krb5_net_read (context, &sock, &net_len, 4);
12655682Smarkm    if (n == 0)
12755682Smarkm	krb5_errx (context, 1, "EOF in krb5_net_read");
12855682Smarkm    if (n < 0)
12955682Smarkm	krb5_err (context, 1, errno, "krb5_net_read");
13055682Smarkm
13155682Smarkm    len = ntohl(net_len);
13255682Smarkm
13355682Smarkm    krb5_data_alloc (&packet, len);
13455682Smarkm
13555682Smarkm    n = krb5_net_read (context, &sock, packet.data, len);
13655682Smarkm    if (n == 0)
13755682Smarkm	krb5_errx (context, 1, "EOF in krb5_net_read");
13855682Smarkm    if (n < 0)
13955682Smarkm	krb5_err (context, 1, errno, "krb5_net_read");
140233294Sstas
14155682Smarkm    status = krb5_rd_priv (context,
14255682Smarkm			   auth_context,
14355682Smarkm			   &packet,
14455682Smarkm			   &data,
14555682Smarkm			   NULL);
14655682Smarkm    if (status)
14755682Smarkm	krb5_err (context, 1, status, "krb5_rd_priv");
14855682Smarkm
14955682Smarkm    fprintf (stderr, "priv packet: %.*s\n", (int)data.length,
15055682Smarkm	    (char *)data.data);
15155682Smarkm
15255682Smarkm    return 0;
15355682Smarkm}
15455682Smarkm
15555682Smarkmstatic int
15655682Smarkmdoit (int port, const char *service)
15755682Smarkm{
158233294Sstas    mini_inetd (port, NULL);
15955682Smarkm
16055682Smarkm    return proto (STDIN_FILENO, service);
16155682Smarkm}
16255682Smarkm
16355682Smarkmint
16455682Smarkmmain(int argc, char **argv)
16555682Smarkm{
16655682Smarkm    int port = server_setup(&context, argc, argv);
16755682Smarkm    return doit (port, service);
16855682Smarkm}
169