1 /* 2 * Copyright (c) 1997 - 1999 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 *service) 41 { 42 krb5_auth_context auth_context; 43 krb5_error_code status; 44 krb5_principal server; 45 krb5_ticket *ticket; 46 char *name; 47 char hostname[MAXHOSTNAMELEN]; 48 krb5_data packet; 49 krb5_data data; 50 uint32_t len, net_len; 51 ssize_t n; 52 53 status = krb5_auth_con_init (context, &auth_context); 54 if (status) 55 krb5_err (context, 1, status, "krb5_auth_con_init"); 56 57 status = krb5_auth_con_setaddrs_from_fd (context, 58 auth_context, 59 &sock); 60 61 if (status) 62 krb5_err (context, 1, status, "krb5_auth_con_setaddrs_from_fd"); 63 64 if(gethostname (hostname, sizeof(hostname)) < 0) 65 krb5_err (context, 1, errno, "gethostname"); 66 67 status = krb5_sname_to_principal (context, 68 hostname, 69 service, 70 KRB5_NT_SRV_HST, 71 &server); 72 if (status) 73 krb5_err (context, 1, status, "krb5_sname_to_principal"); 74 75 status = krb5_recvauth (context, 76 &auth_context, 77 &sock, 78 VERSION, 79 server, 80 0, 81 keytab, 82 &ticket); 83 if (status) 84 krb5_err (context, 1, status, "krb5_recvauth"); 85 86 status = krb5_unparse_name (context, 87 ticket->client, 88 &name); 89 if (status) 90 krb5_err (context, 1, status, "krb5_unparse_name"); 91 92 fprintf (stderr, "User is `%s'\n", name); 93 free (name); 94 95 krb5_data_zero (&data); 96 krb5_data_zero (&packet); 97 98 n = krb5_net_read (context, &sock, &net_len, 4); 99 if (n == 0) 100 krb5_errx (context, 1, "EOF in krb5_net_read"); 101 if (n < 0) 102 krb5_err (context, 1, errno, "krb5_net_read"); 103 104 len = ntohl(net_len); 105 106 krb5_data_alloc (&packet, len); 107 108 n = krb5_net_read (context, &sock, packet.data, len); 109 if (n == 0) 110 krb5_errx (context, 1, "EOF in krb5_net_read"); 111 if (n < 0) 112 krb5_err (context, 1, errno, "krb5_net_read"); 113 114 status = krb5_rd_safe (context, 115 auth_context, 116 &packet, 117 &data, 118 NULL); 119 if (status) 120 krb5_err (context, 1, status, "krb5_rd_safe"); 121 122 fprintf (stderr, "safe packet: %.*s\n", (int)data.length, 123 (char *)data.data); 124 125 n = krb5_net_read (context, &sock, &net_len, 4); 126 if (n == 0) 127 krb5_errx (context, 1, "EOF in krb5_net_read"); 128 if (n < 0) 129 krb5_err (context, 1, errno, "krb5_net_read"); 130 131 len = ntohl(net_len); 132 133 krb5_data_alloc (&packet, len); 134 135 n = krb5_net_read (context, &sock, packet.data, len); 136 if (n == 0) 137 krb5_errx (context, 1, "EOF in krb5_net_read"); 138 if (n < 0) 139 krb5_err (context, 1, errno, "krb5_net_read"); 140 141 status = krb5_rd_priv (context, 142 auth_context, 143 &packet, 144 &data, 145 NULL); 146 if (status) 147 krb5_err (context, 1, status, "krb5_rd_priv"); 148 149 fprintf (stderr, "priv packet: %.*s\n", (int)data.length, 150 (char *)data.data); 151 152 return 0; 153 } 154 155 static int 156 doit (int port, const char *service) 157 { 158 mini_inetd (port, NULL); 159 160 return proto (STDIN_FILENO, service); 161 } 162 163 int 164 main(int argc, char **argv) 165 { 166 int port = server_setup(&context, argc, argv); 167 return doit (port, service); 168 } 169