nt_gss_common.c revision 178825
155682Smarkm/* 255682Smarkm * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska H�gskolan 355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 455682Smarkm * All rights reserved. 555682Smarkm * 655682Smarkm * Redistribution and use in source and binary forms, with or without 755682Smarkm * modification, are permitted provided that the following conditions 855682Smarkm * are met: 955682Smarkm * 1055682Smarkm * 1. Redistributions of source code must retain the above copyright 1155682Smarkm * notice, this list of conditions and the following disclaimer. 1255682Smarkm * 1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1455682Smarkm * notice, this list of conditions and the following disclaimer in the 1555682Smarkm * documentation and/or other materials provided with the distribution. 1655682Smarkm * 1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1855682Smarkm * may be used to endorse or promote products derived from this software 1955682Smarkm * without specific prior written permission. 2055682Smarkm * 2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455682Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155682Smarkm * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include "test_locl.h" 3555682Smarkm#include <gssapi.h> 3655682Smarkm#include "nt_gss_common.h" 3755682Smarkm 38178825SdfrRCSID("$Id: nt_gss_common.c 17450 2006-05-05 11:11:43Z lha $"); 3955682Smarkm 4055682Smarkm/* 4155682Smarkm * These are functions that are needed to interoperate with the 4255682Smarkm * `Sample SSPI Code' in Windows 2000 RC1 SDK. 4355682Smarkm */ 4455682Smarkm 4555682Smarkm/* 4655682Smarkm * Write the `gss_buffer_t' in `buf' onto the fd `sock', but remember that 4755682Smarkm * the length is written in little-endian-order. 4855682Smarkm */ 4955682Smarkm 5055682Smarkmvoid 5155682Smarkmnt_write_token (int sock, gss_buffer_t buf) 5255682Smarkm{ 5355682Smarkm unsigned char net_len[4]; 54178825Sdfr uint32_t len; 5555682Smarkm OM_uint32 min_stat; 5655682Smarkm 5755682Smarkm len = buf->length; 5855682Smarkm 5955682Smarkm net_len[0] = (len >> 0) & 0xFF; 6055682Smarkm net_len[1] = (len >> 8) & 0xFF; 6155682Smarkm net_len[2] = (len >> 16) & 0xFF; 6255682Smarkm net_len[3] = (len >> 24) & 0xFF; 6355682Smarkm 6455682Smarkm if (write (sock, net_len, 4) != 4) 6555682Smarkm err (1, "write"); 6655682Smarkm if (write (sock, buf->value, len) != len) 6755682Smarkm err (1, "write"); 6855682Smarkm 6955682Smarkm gss_release_buffer (&min_stat, buf); 7055682Smarkm} 7155682Smarkm 7255682Smarkm/* 7355682Smarkm * 7455682Smarkm */ 7555682Smarkm 7655682Smarkmvoid 7755682Smarkmnt_read_token (int sock, gss_buffer_t buf) 7855682Smarkm{ 7955682Smarkm unsigned char net_len[4]; 80178825Sdfr uint32_t len; 8155682Smarkm 8255682Smarkm if (read(sock, net_len, 4) != 4) 8355682Smarkm err (1, "read"); 8455682Smarkm len = (net_len[0] << 0) 8555682Smarkm | (net_len[1] << 8) 8655682Smarkm | (net_len[2] << 16) 8755682Smarkm | (net_len[3] << 24); 8855682Smarkm 8955682Smarkm buf->length = len; 9055682Smarkm buf->value = malloc(len); 9155682Smarkm if (read (sock, buf->value, len) != len) 9255682Smarkm err (1, "read"); 9355682Smarkm} 9455682Smarkm 9555682Smarkmvoid 9655682Smarkmgss_print_errors (int min_stat) 9755682Smarkm{ 9855682Smarkm OM_uint32 new_stat; 9955682Smarkm OM_uint32 msg_ctx = 0; 10055682Smarkm gss_buffer_desc status_string; 10155682Smarkm OM_uint32 ret; 10255682Smarkm 10355682Smarkm do { 10455682Smarkm ret = gss_display_status (&new_stat, 10555682Smarkm min_stat, 10655682Smarkm GSS_C_MECH_CODE, 10755682Smarkm GSS_C_NO_OID, 10855682Smarkm &msg_ctx, 10955682Smarkm &status_string); 11055682Smarkm fprintf (stderr, "%s\n", (char *)status_string.value); 11155682Smarkm gss_release_buffer (&new_stat, &status_string); 11255682Smarkm } while (!GSS_ERROR(ret) && msg_ctx != 0); 11355682Smarkm} 11455682Smarkm 11555682Smarkmvoid 11655682Smarkmgss_verr(int exitval, int status, const char *fmt, va_list ap) 11755682Smarkm{ 11855682Smarkm vwarnx (fmt, ap); 11955682Smarkm gss_print_errors (status); 12055682Smarkm exit (exitval); 12155682Smarkm} 12255682Smarkm 12355682Smarkmvoid 12455682Smarkmgss_err(int exitval, int status, const char *fmt, ...) 12555682Smarkm{ 12655682Smarkm va_list args; 12755682Smarkm 12855682Smarkm va_start(args, fmt); 12955682Smarkm gss_verr (exitval, status, fmt, args); 13055682Smarkm va_end(args); 13155682Smarkm} 132