Path: blob/main/crypto/heimdal/lib/gssapi/test_cred.c
34889 views
/*1* Copyright (c) 2003-2004 Kungliga Tekniska Högskolan2* (Royal Institute of Technology, Stockholm, Sweden).3* All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8*9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11*12* 2. Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in the14* documentation and/or other materials provided with the distribution.15*16* 3. Neither the name of KTH nor the names of its contributors may be17* used to endorse or promote products derived from this software without18* specific prior written permission.19*20* THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR23* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE24* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR25* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF26* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR27* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,28* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR29* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF30* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.31*/3233#ifdef HAVE_CONFIG_H34#include <config.h>35#endif3637#include <roken.h>38#include <stdio.h>39#include <stdlib.h>40#include <string.h>41#include <stdarg.h>42#include <gssapi.h>43#include <gssapi_krb5.h>44#include <gssapi_spnego.h>45#include <err.h>46#include <getarg.h>4748static void49gss_print_errors (int min_stat)50{51OM_uint32 new_stat;52OM_uint32 msg_ctx = 0;53gss_buffer_desc status_string;54OM_uint32 ret;5556do {57ret = gss_display_status (&new_stat,58min_stat,59GSS_C_MECH_CODE,60GSS_C_NO_OID,61&msg_ctx,62&status_string);63if (!GSS_ERROR(ret)) {64fprintf (stderr, "%.*s\n", (int)status_string.length,65(char *)status_string.value);66gss_release_buffer (&new_stat, &status_string);67}68} while (!GSS_ERROR(ret) && msg_ctx != 0);69}7071static void72gss_err(int exitval, int status, const char *fmt, ...)73{74va_list args;7576va_start(args, fmt);77vwarnx (fmt, args);78gss_print_errors (status);79va_end(args);80exit (exitval);81}8283static void84acquire_release_loop(gss_name_t name, int counter, gss_cred_usage_t usage)85{86OM_uint32 maj_stat, min_stat;87gss_cred_id_t cred;88int i;8990for (i = 0; i < counter; i++) {91maj_stat = gss_acquire_cred(&min_stat, name,92GSS_C_INDEFINITE,93GSS_C_NO_OID_SET,94usage,95&cred,96NULL,97NULL);98if (maj_stat != GSS_S_COMPLETE)99gss_err(1, min_stat, "aquire %d %d != GSS_S_COMPLETE",100i, (int)maj_stat);101102maj_stat = gss_release_cred(&min_stat, &cred);103if (maj_stat != GSS_S_COMPLETE)104gss_err(1, min_stat, "release %d %d != GSS_S_COMPLETE",105i, (int)maj_stat);106}107}108109110static void111acquire_add_release_add(gss_name_t name, gss_cred_usage_t usage)112{113OM_uint32 maj_stat, min_stat;114gss_cred_id_t cred, cred2, cred3;115116maj_stat = gss_acquire_cred(&min_stat, name,117GSS_C_INDEFINITE,118GSS_C_NO_OID_SET,119usage,120&cred,121NULL,122NULL);123if (maj_stat != GSS_S_COMPLETE)124gss_err(1, min_stat, "aquire %d != GSS_S_COMPLETE", (int)maj_stat);125126maj_stat = gss_add_cred(&min_stat,127cred,128GSS_C_NO_NAME,129GSS_KRB5_MECHANISM,130usage,131GSS_C_INDEFINITE,132GSS_C_INDEFINITE,133&cred2,134NULL,135NULL,136NULL);137138if (maj_stat != GSS_S_COMPLETE)139gss_err(1, min_stat, "add_cred %d != GSS_S_COMPLETE", (int)maj_stat);140141maj_stat = gss_release_cred(&min_stat, &cred);142if (maj_stat != GSS_S_COMPLETE)143gss_err(1, min_stat, "release %d != GSS_S_COMPLETE", (int)maj_stat);144145maj_stat = gss_add_cred(&min_stat,146cred2,147GSS_C_NO_NAME,148GSS_KRB5_MECHANISM,149GSS_C_BOTH,150GSS_C_INDEFINITE,151GSS_C_INDEFINITE,152&cred3,153NULL,154NULL,155NULL);156157maj_stat = gss_release_cred(&min_stat, &cred2);158if (maj_stat != GSS_S_COMPLETE)159gss_err(1, min_stat, "release 2 %d != GSS_S_COMPLETE", (int)maj_stat);160161maj_stat = gss_release_cred(&min_stat, &cred3);162if (maj_stat != GSS_S_COMPLETE)163gss_err(1, min_stat, "release 2 %d != GSS_S_COMPLETE", (int)maj_stat);164}165166static int version_flag = 0;167static int help_flag = 0;168169static struct getargs args[] = {170{"version", 0, arg_flag, &version_flag, "print version", NULL },171{"help", 0, arg_flag, &help_flag, NULL, NULL }172};173174static void175usage (int ret)176{177arg_printusage (args, sizeof(args)/sizeof(*args),178NULL, "service@host");179exit (ret);180}181182183int184main(int argc, char **argv)185{186struct gss_buffer_desc_struct name_buffer;187OM_uint32 maj_stat, min_stat;188gss_name_t name;189int optidx = 0;190191setprogname(argv[0]);192if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))193usage(1);194195if (help_flag)196usage (0);197198if(version_flag){199print_version(NULL);200exit(0);201}202203argc -= optidx;204argv += optidx;205206if (argc < 1)207errx(1, "argc < 1");208209name_buffer.value = argv[0];210name_buffer.length = strlen(argv[0]);211212maj_stat = gss_import_name(&min_stat, &name_buffer,213GSS_C_NT_HOSTBASED_SERVICE,214&name);215if (maj_stat != GSS_S_COMPLETE)216errx(1, "import name error");217218acquire_release_loop(name, 100, GSS_C_ACCEPT);219acquire_release_loop(name, 100, GSS_C_INITIATE);220acquire_release_loop(name, 100, GSS_C_BOTH);221222acquire_add_release_add(name, GSS_C_ACCEPT);223acquire_add_release_add(name, GSS_C_INITIATE);224acquire_add_release_add(name, GSS_C_BOTH);225226gss_release_name(&min_stat, &name);227228return 0;229}230231232