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