1141296Sdas/*
2141296Sdas * Copyright (c) 1997 - 1999 Kungliga Tekniska H�gskolan
32116Sjkh * (Royal Institute of Technology, Stockholm, Sweden).
42116Sjkh * All rights reserved.
52116Sjkh *
62116Sjkh * Redistribution and use in source and binary forms, with or without
7141296Sdas * modification, are permitted provided that the following conditions
82116Sjkh * are met:
9141296Sdas *
102116Sjkh * 1. Redistributions of source code must retain the above copyright
112116Sjkh *    notice, this list of conditions and the following disclaimer.
122116Sjkh *
132116Sjkh * 2. Redistributions in binary form must reproduce the above copyright
14176408Sbde *    notice, this list of conditions and the following disclaimer in the
15176408Sbde *    documentation and/or other materials provided with the distribution.
162116Sjkh *
172116Sjkh * 3. Neither the name of the Institute nor the names of its contributors
182116Sjkh *    may be used to endorse or promote products derived from this software
192116Sjkh *    without specific prior written permission.
202116Sjkh *
21141296Sdas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
222116Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
232116Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
242116Sjkh * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
252116Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
262116Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
272116Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
282116Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
292116Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
302116Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31141296Sdas * SUCH DAMAGE.
322116Sjkh */
332116Sjkh
34141296Sdas#include "test_locl.h"
35141296SdasRCSID("$Id: tcp_client.c 17450 2006-05-05 11:11:43Z lha $");
36141296Sdas
372116Sjkhkrb5_context context;
38151698Sbde
39141296Sdasstatic int
402116Sjkhproto (int sock, const char *hostname, const char *service)
412116Sjkh{
422116Sjkh    krb5_auth_context auth_context;
43151698Sbde    krb5_error_code status;
44151698Sbde    krb5_principal server;
45151698Sbde    krb5_data data;
46151698Sbde    krb5_data packet;
47151698Sbde    uint32_t len, net_len;
48151698Sbde
49151698Sbde    status = krb5_auth_con_init (context, &auth_context);
50151698Sbde    if (status)
51151698Sbde	krb5_err (context, 1, status, "krb5_auth_con_init");
52151698Sbde
53151698Sbde    status = krb5_auth_con_setaddrs_from_fd (context,
542116Sjkh					     auth_context,
552116Sjkh					     &sock);
562116Sjkh    if (status)
572116Sjkh	krb5_err (context, 1, status, "krb5_auth_con_setaddrs_from_fd");
582116Sjkh
598870Srgrimes    status = krb5_sname_to_principal (context,
602116Sjkh				      hostname,
612116Sjkh				      service,
622116Sjkh				      KRB5_NT_SRV_HST,
632116Sjkh				      &server);
642116Sjkh    if (status)
652116Sjkh	krb5_err (context, 1, status, "krb5_sname_to_principal");
662116Sjkh
672116Sjkh    status = krb5_sendauth (context,
6897413Salfred			    &auth_context,
6997413Salfred			    &sock,
702116Sjkh			    VERSION,
71151698Sbde			    NULL,
72151698Sbde			    server,
732116Sjkh			    AP_OPTS_MUTUAL_REQUIRED,
74176408Sbde			    NULL,
75176408Sbde			    NULL,
76175665Sbde			    NULL,
77151698Sbde			    NULL,
78151698Sbde			    NULL,
792116Sjkh			    NULL);
80    if (status)
81	krb5_err (context, 1, status, "krb5_sendauth");
82
83    data.data   = "hej";
84    data.length = 3;
85
86    krb5_data_zero (&packet);
87
88    status = krb5_mk_safe (context,
89			   auth_context,
90			   &data,
91			   &packet,
92			   NULL);
93    if (status)
94	krb5_err (context, 1, status, "krb5_mk_safe");
95
96    len = packet.length;
97    net_len = htonl(len);
98
99    if (krb5_net_write (context, &sock, &net_len, 4) != 4)
100	err (1, "krb5_net_write");
101    if (krb5_net_write (context, &sock, packet.data, len) != len)
102	err (1, "krb5_net_write");
103
104    data.data   = "hemligt";
105    data.length = 7;
106
107    krb5_data_free (&packet);
108
109    status = krb5_mk_priv (context,
110			   auth_context,
111			   &data,
112			   &packet,
113			   NULL);
114    if (status)
115	krb5_err (context, 1, status, "krb5_mk_priv");
116
117    len = packet.length;
118    net_len = htonl(len);
119
120    if (krb5_net_write (context, &sock, &net_len, 4) != 4)
121	err (1, "krb5_net_write");
122    if (krb5_net_write (context, &sock, packet.data, len) != len)
123	err (1, "krb5_net_write");
124    return 0;
125}
126
127int
128main(int argc, char **argv)
129{
130    int port = client_setup(&context, &argc, argv);
131    return client_doit (argv[argc], port, service, proto);
132}
133