Path: blob/main/crypto/heimdal/lib/gssapi/test_names.c
34889 views
/*1* Copyright (c) 2006 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 int version_flag = 0;84static int help_flag = 0;8586static struct getargs args[] = {87{"version", 0, arg_flag, &version_flag, "print version", NULL },88{"help", 0, arg_flag, &help_flag, NULL, NULL }89};9091static void92usage (int ret)93{94arg_printusage (args, sizeof(args)/sizeof(*args),95NULL, "service@host");96exit (ret);97}9899100int101main(int argc, char **argv)102{103gss_buffer_desc name_buffer;104OM_uint32 maj_stat, min_stat;105gss_name_t name, MNname, MNname2;106int optidx = 0;107char *str;108int len, equal;109110setprogname(argv[0]);111if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))112usage(1);113114if (help_flag)115usage (0);116117if(version_flag){118print_version(NULL);119exit(0);120}121122argc -= optidx;123argv += optidx;124125gsskrb5_set_default_realm("MIT.EDU");126127/*128* test import/export129*/130131str = NULL;132len = asprintf(&str, "[email protected]");133if (len < 0 || str == NULL)134errx(1, "asprintf");135136name_buffer.value = str;137name_buffer.length = len;138139maj_stat = gss_import_name(&min_stat, &name_buffer,140GSS_C_NT_HOSTBASED_SERVICE,141&name);142if (maj_stat != GSS_S_COMPLETE)143gss_err(1, min_stat, "import name error");144free(str);145146maj_stat = gss_canonicalize_name (&min_stat,147name,148GSS_KRB5_MECHANISM,149&MNname);150if (maj_stat != GSS_S_COMPLETE)151gss_err(1, min_stat, "canonicalize name error");152153maj_stat = gss_export_name(&min_stat,154MNname,155&name_buffer);156if (maj_stat != GSS_S_COMPLETE)157gss_err(1, min_stat, "export name error (KRB5)");158159/*160* Import the exported name and compare161*/162163maj_stat = gss_import_name(&min_stat, &name_buffer,164GSS_C_NT_EXPORT_NAME,165&MNname2);166if (maj_stat != GSS_S_COMPLETE)167gss_err(1, min_stat, "import name error (exported KRB5 name)");168169170maj_stat = gss_compare_name(&min_stat, MNname, MNname2, &equal);171if (maj_stat != GSS_S_COMPLETE)172errx(1, "gss_compare_name");173if (!equal)174errx(1, "names not equal");175176gss_release_name(&min_stat, &MNname2);177gss_release_buffer(&min_stat, &name_buffer);178gss_release_name(&min_stat, &MNname);179gss_release_name(&min_stat, &name);180181/*182* Import oid less name and compare to mech name.183* Dovecot SASL lib does this.184*/185186str = NULL;187len = asprintf(&str, "lha");188if (len < 0 || str == NULL)189errx(1, "asprintf");190191name_buffer.value = str;192name_buffer.length = len;193194maj_stat = gss_import_name(&min_stat, &name_buffer,195GSS_C_NO_OID,196&name);197if (maj_stat != GSS_S_COMPLETE)198gss_err(1, min_stat, "import (no oid) name error");199200maj_stat = gss_import_name(&min_stat, &name_buffer,201GSS_KRB5_NT_USER_NAME,202&MNname);203if (maj_stat != GSS_S_COMPLETE)204gss_err(1, min_stat, "import (krb5 mn) name error");205206free(str);207208maj_stat = gss_compare_name(&min_stat, name, MNname, &equal);209if (maj_stat != GSS_S_COMPLETE)210errx(1, "gss_compare_name");211if (!equal)212errx(1, "names not equal");213214gss_release_name(&min_stat, &MNname);215gss_release_name(&min_stat, &name);216217#if 0218maj_stat = gss_canonicalize_name (&min_stat,219name,220GSS_SPNEGO_MECHANISM,221&MNname);222if (maj_stat != GSS_S_COMPLETE)223gss_err(1, min_stat, "canonicalize name error");224225226maj_stat = gss_export_name(&maj_stat,227MNname,228&name_buffer);229if (maj_stat != GSS_S_COMPLETE)230gss_err(1, min_stat, "export name error (SPNEGO)");231232gss_release_name(&min_stat, &MNname);233gss_release_buffer(&min_stat, &name_buffer);234#endif235236return 0;237}238239240