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" 35233294Sstas#include <gssapi/gssapi.h> 36233294Sstas#include <gssapi/gssapi_krb5.h> 37233294Sstas#include <gssapi/gssapi_spnego.h> 3855682Smarkm#include "gss_common.h" 39233294SstasRCSID("$Id$"); 4055682Smarkm 4155682Smarkmvoid 4255682Smarkmwrite_token (int sock, gss_buffer_t buf) 4355682Smarkm{ 44178825Sdfr uint32_t len, net_len; 4555682Smarkm OM_uint32 min_stat; 4655682Smarkm 4755682Smarkm len = buf->length; 4855682Smarkm 4955682Smarkm net_len = htonl(len); 5055682Smarkm 5172445Sassar if (net_write (sock, &net_len, 4) != 4) 5255682Smarkm err (1, "write"); 5372445Sassar if (net_write (sock, buf->value, len) != len) 5455682Smarkm err (1, "write"); 5555682Smarkm 5655682Smarkm gss_release_buffer (&min_stat, buf); 5755682Smarkm} 5855682Smarkm 5972445Sassarstatic void 6072445Sassarenet_read(int fd, void *buf, size_t len) 6172445Sassar{ 6272445Sassar ssize_t ret; 6372445Sassar 6472445Sassar ret = net_read (fd, buf, len); 6572445Sassar if (ret == 0) 6672445Sassar errx (1, "EOF in read"); 6772445Sassar else if (ret < 0) 6872445Sassar errx (1, "read"); 6972445Sassar} 7072445Sassar 7155682Smarkmvoid 7255682Smarkmread_token (int sock, gss_buffer_t buf) 7355682Smarkm{ 74178825Sdfr uint32_t len, net_len; 7555682Smarkm 7672445Sassar enet_read (sock, &net_len, 4); 7755682Smarkm len = ntohl(net_len); 7855682Smarkm buf->length = len; 7972445Sassar buf->value = emalloc(len); 8072445Sassar enet_read (sock, buf->value, len); 8155682Smarkm} 8255682Smarkm 8355682Smarkmvoid 8455682Smarkmgss_print_errors (int min_stat) 8555682Smarkm{ 8655682Smarkm OM_uint32 new_stat; 8755682Smarkm OM_uint32 msg_ctx = 0; 8855682Smarkm gss_buffer_desc status_string; 8955682Smarkm OM_uint32 ret; 9055682Smarkm 9155682Smarkm do { 9255682Smarkm ret = gss_display_status (&new_stat, 9355682Smarkm min_stat, 9455682Smarkm GSS_C_MECH_CODE, 9555682Smarkm GSS_C_NO_OID, 9655682Smarkm &msg_ctx, 9755682Smarkm &status_string); 98233294Sstas fprintf (stderr, "%.*s\n", (int)status_string.length, 99178825Sdfr (char *)status_string.value); 10055682Smarkm gss_release_buffer (&new_stat, &status_string); 10155682Smarkm } while (!GSS_ERROR(ret) && msg_ctx != 0); 10255682Smarkm} 10355682Smarkm 10455682Smarkmvoid 10555682Smarkmgss_verr(int exitval, int status, const char *fmt, va_list ap) 10655682Smarkm{ 10755682Smarkm vwarnx (fmt, ap); 10855682Smarkm gss_print_errors (status); 10955682Smarkm exit (exitval); 11055682Smarkm} 11155682Smarkm 11255682Smarkmvoid 11355682Smarkmgss_err(int exitval, int status, const char *fmt, ...) 11455682Smarkm{ 11555682Smarkm va_list args; 11655682Smarkm 11755682Smarkm va_start(args, fmt); 11855682Smarkm gss_verr (exitval, status, fmt, args); 11955682Smarkm va_end(args); 12055682Smarkm} 12155682Smarkm 122178825Sdfrgss_OID 123178825Sdfrselect_mech(const char *mech) 124178825Sdfr{ 125178825Sdfr if (strcasecmp(mech, "krb5") == 0) 126178825Sdfr return GSS_KRB5_MECHANISM; 127178825Sdfr else if (strcasecmp(mech, "spnego") == 0) 128178825Sdfr return GSS_SPNEGO_MECHANISM; 129178825Sdfr else if (strcasecmp(mech, "no-oid") == 0) 130178825Sdfr return GSS_C_NO_OID; 131178825Sdfr else 132178825Sdfr errx (1, "Unknown mechanism '%s' (spnego, krb5, no-oid)", mech); 133178825Sdfr} 134178825Sdfr 135178825Sdfrvoid 136178825Sdfrprint_gss_name(const char *prefix, gss_name_t name) 137178825Sdfr{ 138178825Sdfr OM_uint32 maj_stat, min_stat; 139178825Sdfr gss_buffer_desc name_token; 140178825Sdfr 141178825Sdfr maj_stat = gss_display_name (&min_stat, 142178825Sdfr name, 143178825Sdfr &name_token, 144178825Sdfr NULL); 145178825Sdfr if (GSS_ERROR(maj_stat)) 146178825Sdfr gss_err (1, min_stat, "gss_display_name"); 147178825Sdfr 148178825Sdfr fprintf (stderr, "%s `%.*s'\n", prefix, 149178825Sdfr (int)name_token.length, 150178825Sdfr (char *)name_token.value); 151178825Sdfr 152178825Sdfr gss_release_buffer (&min_stat, &name_token); 153178825Sdfr 154178825Sdfr} 155