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