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 *hostname, const char *service)
4155682Smarkm{
4255682Smarkm    krb5_auth_context auth_context;
4355682Smarkm    krb5_error_code status;
4455682Smarkm    krb5_principal server;
4555682Smarkm    krb5_data data;
4655682Smarkm    krb5_data packet;
47178825Sdfr    uint32_t len, net_len;
4855682Smarkm
4955682Smarkm    status = krb5_auth_con_init (context, &auth_context);
5055682Smarkm    if (status)
5155682Smarkm	krb5_err (context, 1, status, "krb5_auth_con_init");
5255682Smarkm
5355682Smarkm    status = krb5_auth_con_setaddrs_from_fd (context,
5455682Smarkm					     auth_context,
5555682Smarkm					     &sock);
5655682Smarkm    if (status)
5755682Smarkm	krb5_err (context, 1, status, "krb5_auth_con_setaddrs_from_fd");
5855682Smarkm
5955682Smarkm    status = krb5_sname_to_principal (context,
6055682Smarkm				      hostname,
6155682Smarkm				      service,
6255682Smarkm				      KRB5_NT_SRV_HST,
6355682Smarkm				      &server);
6455682Smarkm    if (status)
6555682Smarkm	krb5_err (context, 1, status, "krb5_sname_to_principal");
6655682Smarkm
6755682Smarkm    status = krb5_sendauth (context,
6855682Smarkm			    &auth_context,
6955682Smarkm			    &sock,
7055682Smarkm			    VERSION,
7155682Smarkm			    NULL,
7255682Smarkm			    server,
7355682Smarkm			    AP_OPTS_MUTUAL_REQUIRED,
7455682Smarkm			    NULL,
7555682Smarkm			    NULL,
7655682Smarkm			    NULL,
7755682Smarkm			    NULL,
7855682Smarkm			    NULL,
7955682Smarkm			    NULL);
8055682Smarkm    if (status)
8155682Smarkm	krb5_err (context, 1, status, "krb5_sendauth");
8255682Smarkm
8355682Smarkm    data.data   = "hej";
8455682Smarkm    data.length = 3;
8555682Smarkm
8655682Smarkm    krb5_data_zero (&packet);
8755682Smarkm
8855682Smarkm    status = krb5_mk_safe (context,
8955682Smarkm			   auth_context,
9055682Smarkm			   &data,
9155682Smarkm			   &packet,
9255682Smarkm			   NULL);
9355682Smarkm    if (status)
9455682Smarkm	krb5_err (context, 1, status, "krb5_mk_safe");
9555682Smarkm
9655682Smarkm    len = packet.length;
9755682Smarkm    net_len = htonl(len);
9855682Smarkm
9955682Smarkm    if (krb5_net_write (context, &sock, &net_len, 4) != 4)
10055682Smarkm	err (1, "krb5_net_write");
10155682Smarkm    if (krb5_net_write (context, &sock, packet.data, len) != len)
10255682Smarkm	err (1, "krb5_net_write");
10355682Smarkm
10455682Smarkm    data.data   = "hemligt";
10555682Smarkm    data.length = 7;
10655682Smarkm
10755682Smarkm    krb5_data_free (&packet);
10855682Smarkm
10955682Smarkm    status = krb5_mk_priv (context,
11055682Smarkm			   auth_context,
11155682Smarkm			   &data,
11255682Smarkm			   &packet,
11355682Smarkm			   NULL);
11455682Smarkm    if (status)
11555682Smarkm	krb5_err (context, 1, status, "krb5_mk_priv");
11655682Smarkm
11755682Smarkm    len = packet.length;
11855682Smarkm    net_len = htonl(len);
11955682Smarkm
12055682Smarkm    if (krb5_net_write (context, &sock, &net_len, 4) != 4)
12155682Smarkm	err (1, "krb5_net_write");
12255682Smarkm    if (krb5_net_write (context, &sock, packet.data, len) != len)
12355682Smarkm	err (1, "krb5_net_write");
12455682Smarkm    return 0;
12555682Smarkm}
12655682Smarkm
12755682Smarkmint
12855682Smarkmmain(int argc, char **argv)
12955682Smarkm{
13055682Smarkm    int port = client_setup(&context, &argc, argv);
13155682Smarkm    return client_doit (argv[argc], port, service, proto);
13255682Smarkm}
133