Path: blob/main/crypto/heimdal/lib/gssapi/test_context.c
34889 views
/*1* Copyright (c) 2006 - 2008 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#include "krb5/gsskrb5_locl.h"34#include <err.h>35#include <getarg.h>36#include <gssapi.h>37#include <gssapi_krb5.h>38#include <gssapi_spnego.h>39#include <gssapi_ntlm.h>40#include "test_common.h"4142static char *type_string;43static char *mech_string;44static char *ret_mech_string;45static char *client_name;46static char *client_password;47static int dns_canon_flag = -1;48static int mutual_auth_flag = 0;49static int dce_style_flag = 0;50static int wrapunwrap_flag = 0;51static int iov_flag = 0;52static int getverifymic_flag = 0;53static int deleg_flag = 0;54static int policy_deleg_flag = 0;55static int server_no_deleg_flag = 0;56static int ei_flag = 0;57static char *gsskrb5_acceptor_identity = NULL;58static char *session_enctype_string = NULL;59static int client_time_offset = 0;60static int server_time_offset = 0;61static int max_loops = 0;62static char *limit_enctype_string = NULL;63static int version_flag = 0;64static int verbose_flag = 0;65static int help_flag = 0;6667static krb5_context context;68static krb5_enctype limit_enctype = 0;6970static struct {71const char *name;72gss_OID oid;73} o2n[] = {74{ "krb5", NULL /* GSS_KRB5_MECHANISM */ },75{ "spnego", NULL /* GSS_SPNEGO_MECHANISM */ },76{ "ntlm", NULL /* GSS_NTLM_MECHANISM */ },77{ "sasl-digest-md5", NULL /* GSS_SASL_DIGEST_MD5_MECHANISM */ }78};7980static void81init_o2n(void)82{83o2n[0].oid = GSS_KRB5_MECHANISM;84o2n[1].oid = GSS_SPNEGO_MECHANISM;85o2n[2].oid = GSS_NTLM_MECHANISM;86o2n[3].oid = GSS_SASL_DIGEST_MD5_MECHANISM;87}8889static gss_OID90string_to_oid(const char *name)91{92int i;93for (i = 0; i < sizeof(o2n)/sizeof(o2n[0]); i++)94if (strcasecmp(name, o2n[i].name) == 0)95return o2n[i].oid;96errx(1, "name '%s' not unknown", name);97}9899static const char *100oid_to_string(const gss_OID oid)101{102int i;103for (i = 0; i < sizeof(o2n)/sizeof(o2n[0]); i++)104if (gss_oid_equal(oid, o2n[i].oid))105return o2n[i].name;106return "unknown oid";107}108109static void110loop(gss_OID mechoid,111gss_OID nameoid, const char *target,112gss_cred_id_t init_cred,113gss_ctx_id_t *sctx, gss_ctx_id_t *cctx,114gss_OID *actual_mech,115gss_cred_id_t *deleg_cred)116{117int server_done = 0, client_done = 0;118int num_loops = 0;119OM_uint32 maj_stat, min_stat;120gss_name_t gss_target_name;121gss_buffer_desc input_token, output_token;122OM_uint32 flags = 0, ret_cflags, ret_sflags;123gss_OID actual_mech_client;124gss_OID actual_mech_server;125126*actual_mech = GSS_C_NO_OID;127128flags |= GSS_C_INTEG_FLAG;129flags |= GSS_C_CONF_FLAG;130131if (mutual_auth_flag)132flags |= GSS_C_MUTUAL_FLAG;133if (dce_style_flag)134flags |= GSS_C_DCE_STYLE;135if (deleg_flag)136flags |= GSS_C_DELEG_FLAG;137if (policy_deleg_flag)138flags |= GSS_C_DELEG_POLICY_FLAG;139140input_token.value = rk_UNCONST(target);141input_token.length = strlen(target);142143maj_stat = gss_import_name(&min_stat,144&input_token,145nameoid,146&gss_target_name);147if (GSS_ERROR(maj_stat))148err(1, "import name creds failed with: %d", maj_stat);149150input_token.length = 0;151input_token.value = NULL;152153while (!server_done || !client_done) {154num_loops++;155156gsskrb5_set_time_offset(client_time_offset);157158maj_stat = gss_init_sec_context(&min_stat,159init_cred,160cctx,161gss_target_name,162mechoid,163flags,1640,165NULL,166&input_token,167&actual_mech_client,168&output_token,169&ret_cflags,170NULL);171if (GSS_ERROR(maj_stat))172errx(1, "init_sec_context: %s",173gssapi_err(maj_stat, min_stat, mechoid));174if (maj_stat & GSS_S_CONTINUE_NEEDED)175;176else177client_done = 1;178179gsskrb5_get_time_offset(&client_time_offset);180181if (client_done && server_done)182break;183184if (input_token.length != 0)185gss_release_buffer(&min_stat, &input_token);186187gsskrb5_set_time_offset(server_time_offset);188189maj_stat = gss_accept_sec_context(&min_stat,190sctx,191GSS_C_NO_CREDENTIAL,192&output_token,193GSS_C_NO_CHANNEL_BINDINGS,194NULL,195&actual_mech_server,196&input_token,197&ret_sflags,198NULL,199deleg_cred);200if (GSS_ERROR(maj_stat))201errx(1, "accept_sec_context: %s",202gssapi_err(maj_stat, min_stat, actual_mech_server));203204gsskrb5_get_time_offset(&server_time_offset);205206if (output_token.length != 0)207gss_release_buffer(&min_stat, &output_token);208209if (maj_stat & GSS_S_CONTINUE_NEEDED)210;211else212server_done = 1;213}214if (output_token.length != 0)215gss_release_buffer(&min_stat, &output_token);216if (input_token.length != 0)217gss_release_buffer(&min_stat, &input_token);218gss_release_name(&min_stat, &gss_target_name);219220if (deleg_flag || policy_deleg_flag) {221if (server_no_deleg_flag) {222if (*deleg_cred != GSS_C_NO_CREDENTIAL)223errx(1, "got delegated cred but didn't expect one");224} else if (*deleg_cred == GSS_C_NO_CREDENTIAL)225errx(1, "asked for delegarated cred but did get one");226} else if (*deleg_cred != GSS_C_NO_CREDENTIAL)227errx(1, "got deleg_cred cred but didn't ask");228229if (gss_oid_equal(actual_mech_server, actual_mech_client) == 0)230errx(1, "mech mismatch");231*actual_mech = actual_mech_server;232233if (max_loops && num_loops > max_loops)234errx(1, "num loops %d was lager then max loops %d",235num_loops, max_loops);236237if (verbose_flag) {238printf("server time offset: %d\n", server_time_offset);239printf("client time offset: %d\n", client_time_offset);240printf("num loops %d\n", num_loops);241}242}243244static void245wrapunwrap(gss_ctx_id_t cctx, gss_ctx_id_t sctx, int flags, gss_OID mechoid)246{247gss_buffer_desc input_token, output_token, output_token2;248OM_uint32 min_stat, maj_stat;249gss_qop_t qop_state;250int conf_state;251252input_token.value = "foo";253input_token.length = 3;254255maj_stat = gss_wrap(&min_stat, cctx, flags, 0, &input_token,256&conf_state, &output_token);257if (maj_stat != GSS_S_COMPLETE)258errx(1, "gss_wrap failed: %s",259gssapi_err(maj_stat, min_stat, mechoid));260261maj_stat = gss_unwrap(&min_stat, sctx, &output_token,262&output_token2, &conf_state, &qop_state);263if (maj_stat != GSS_S_COMPLETE)264errx(1, "gss_unwrap failed: %s",265gssapi_err(maj_stat, min_stat, mechoid));266267gss_release_buffer(&min_stat, &output_token);268gss_release_buffer(&min_stat, &output_token2);269270#if 0 /* doesn't work for NTLM yet */271if (!!conf_state != !!flags)272errx(1, "conf_state mismatch");273#endif274}275276#define USE_CONF 1277#define USE_HEADER_ONLY 2278#define USE_SIGN_ONLY 4279#define FORCE_IOV 8280281static void282wrapunwrap_iov(gss_ctx_id_t cctx, gss_ctx_id_t sctx, int flags, gss_OID mechoid)283{284krb5_data token, header, trailer;285OM_uint32 min_stat, maj_stat;286gss_qop_t qop_state;287int conf_state, conf_state2;288gss_iov_buffer_desc iov[6];289unsigned char *p;290int iov_len;291char header_data[9] = "ABCheader";292char trailer_data[10] = "trailerXYZ";293294char token_data[16] = "0123456789abcdef";295296memset(&iov, 0, sizeof(iov));297298if (flags & USE_SIGN_ONLY) {299header.data = header_data;300header.length = 9;301trailer.data = trailer_data;302trailer.length = 10;303} else {304header.data = NULL;305header.length = 0;306trailer.data = NULL;307trailer.length = 0;308}309310token.data = token_data;311token.length = 16;312313iov_len = sizeof(iov)/sizeof(iov[0]);314315memset(iov, 0, sizeof(iov));316317iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER | GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE;318319if (header.length != 0) {320iov[1].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY;321iov[1].buffer.length = header.length;322iov[1].buffer.value = header.data;323} else {324iov[1].type = GSS_IOV_BUFFER_TYPE_EMPTY;325iov[1].buffer.length = 0;326iov[1].buffer.value = NULL;327}328iov[2].type = GSS_IOV_BUFFER_TYPE_DATA;329iov[2].buffer.length = token.length;330iov[2].buffer.value = token.data;331if (trailer.length != 0) {332iov[3].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY;333iov[3].buffer.length = trailer.length;334iov[3].buffer.value = trailer.data;335} else {336iov[3].type = GSS_IOV_BUFFER_TYPE_EMPTY;337iov[3].buffer.length = 0;338iov[3].buffer.value = NULL;339}340if (dce_style_flag) {341iov[4].type = GSS_IOV_BUFFER_TYPE_EMPTY;342} else {343iov[4].type = GSS_IOV_BUFFER_TYPE_PADDING | GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE;344}345iov[4].buffer.length = 0;346iov[4].buffer.value = 0;347if (dce_style_flag) {348iov[5].type = GSS_IOV_BUFFER_TYPE_EMPTY;349} else if (flags & USE_HEADER_ONLY) {350iov[5].type = GSS_IOV_BUFFER_TYPE_EMPTY;351} else {352iov[5].type = GSS_IOV_BUFFER_TYPE_TRAILER | GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE;353}354iov[5].buffer.length = 0;355iov[5].buffer.value = 0;356357maj_stat = gss_wrap_iov(&min_stat, cctx, dce_style_flag || flags & USE_CONF, 0, &conf_state,358iov, iov_len);359if (maj_stat != GSS_S_COMPLETE)360errx(1, "gss_wrap_iov failed");361362token.length =363iov[0].buffer.length +364iov[1].buffer.length +365iov[2].buffer.length +366iov[3].buffer.length +367iov[4].buffer.length +368iov[5].buffer.length;369token.data = emalloc(token.length);370371p = token.data;372memcpy(p, iov[0].buffer.value, iov[0].buffer.length);373p += iov[0].buffer.length;374memcpy(p, iov[1].buffer.value, iov[1].buffer.length);375p += iov[1].buffer.length;376memcpy(p, iov[2].buffer.value, iov[2].buffer.length);377p += iov[2].buffer.length;378memcpy(p, iov[3].buffer.value, iov[3].buffer.length);379p += iov[3].buffer.length;380memcpy(p, iov[4].buffer.value, iov[4].buffer.length);381p += iov[4].buffer.length;382memcpy(p, iov[5].buffer.value, iov[5].buffer.length);383p += iov[5].buffer.length;384385assert(p - ((unsigned char *)token.data) == token.length);386387if ((flags & (USE_SIGN_ONLY|FORCE_IOV)) == 0) {388gss_buffer_desc input, output;389390input.value = token.data;391input.length = token.length;392393maj_stat = gss_unwrap(&min_stat, sctx, &input,394&output, &conf_state2, &qop_state);395396if (maj_stat != GSS_S_COMPLETE)397errx(1, "gss_unwrap from gss_wrap_iov failed: %s",398gssapi_err(maj_stat, min_stat, mechoid));399400gss_release_buffer(&min_stat, &output);401} else {402maj_stat = gss_unwrap_iov(&min_stat, sctx, &conf_state2, &qop_state,403iov, iov_len);404405if (maj_stat != GSS_S_COMPLETE)406errx(1, "gss_unwrap_iov failed: %x %s", flags,407gssapi_err(maj_stat, min_stat, mechoid));408409}410if (conf_state2 != conf_state)411errx(1, "conf state wrong for iov: %x", flags);412413414free(token.data);415}416417static void418getverifymic(gss_ctx_id_t cctx, gss_ctx_id_t sctx, gss_OID mechoid)419{420gss_buffer_desc input_token, output_token;421OM_uint32 min_stat, maj_stat;422gss_qop_t qop_state;423424input_token.value = "bar";425input_token.length = 3;426427maj_stat = gss_get_mic(&min_stat, cctx, 0, &input_token,428&output_token);429if (maj_stat != GSS_S_COMPLETE)430errx(1, "gss_get_mic failed: %s",431gssapi_err(maj_stat, min_stat, mechoid));432433maj_stat = gss_verify_mic(&min_stat, sctx, &input_token,434&output_token, &qop_state);435if (maj_stat != GSS_S_COMPLETE)436errx(1, "gss_verify_mic failed: %s",437gssapi_err(maj_stat, min_stat, mechoid));438439gss_release_buffer(&min_stat, &output_token);440}441442static void443empty_release(void)444{445gss_ctx_id_t ctx = GSS_C_NO_CONTEXT;446gss_cred_id_t cred = GSS_C_NO_CREDENTIAL;447gss_name_t name = GSS_C_NO_NAME;448gss_OID_set oidset = GSS_C_NO_OID_SET;449OM_uint32 junk;450451gss_delete_sec_context(&junk, &ctx, NULL);452gss_release_cred(&junk, &cred);453gss_release_name(&junk, &name);454gss_release_oid_set(&junk, &oidset);455}456457/*458*459*/460461static struct getargs args[] = {462{"name-type",0, arg_string, &type_string, "type of name", NULL },463{"mech-type",0, arg_string, &mech_string, "type of mech", NULL },464{"ret-mech-type",0, arg_string, &ret_mech_string,465"type of return mech", NULL },466{"dns-canonicalize",0,arg_negative_flag, &dns_canon_flag,467"use dns to canonicalize", NULL },468{"mutual-auth",0, arg_flag, &mutual_auth_flag,"mutual auth", NULL },469{"client-name", 0, arg_string, &client_name, "client name", NULL },470{"client-password", 0, arg_string, &client_password, "client password", NULL },471{"limit-enctype",0, arg_string, &limit_enctype_string, "enctype", NULL },472{"dce-style",0, arg_flag, &dce_style_flag, "dce-style", NULL },473{"wrapunwrap",0, arg_flag, &wrapunwrap_flag, "wrap/unwrap", NULL },474{"iov", 0, arg_flag, &iov_flag, "wrap/unwrap iov", NULL },475{"getverifymic",0, arg_flag, &getverifymic_flag,476"get and verify mic", NULL },477{"delegate",0, arg_flag, &deleg_flag, "delegate credential", NULL },478{"policy-delegate",0, arg_flag, &policy_deleg_flag, "policy delegate credential", NULL },479{"server-no-delegate",0, arg_flag, &server_no_deleg_flag,480"server should get a credential", NULL },481{"export-import-cred",0, arg_flag, &ei_flag, "test export/import cred", NULL },482{"gsskrb5-acceptor-identity", 0, arg_string, &gsskrb5_acceptor_identity, "keytab", NULL },483{"session-enctype", 0, arg_string, &session_enctype_string, "enctype", NULL },484{"client-time-offset", 0, arg_integer, &client_time_offset, "time", NULL },485{"server-time-offset", 0, arg_integer, &server_time_offset, "time", NULL },486{"max-loops", 0, arg_integer, &max_loops, "time", NULL },487{"version", 0, arg_flag, &version_flag, "print version", NULL },488{"verbose", 'v', arg_flag, &verbose_flag, "verbose", NULL },489{"help", 0, arg_flag, &help_flag, NULL, NULL }490};491492static void493usage (int ret)494{495arg_printusage (args, sizeof(args)/sizeof(*args),496NULL, "service@host");497exit (ret);498}499500int501main(int argc, char **argv)502{503int optind = 0;504OM_uint32 min_stat, maj_stat;505gss_ctx_id_t cctx, sctx;506void *ctx;507gss_OID nameoid, mechoid, actual_mech, actual_mech2;508gss_cred_id_t client_cred = GSS_C_NO_CREDENTIAL, deleg_cred = GSS_C_NO_CREDENTIAL;509gss_name_t cname = GSS_C_NO_NAME;510gss_buffer_desc credential_data = GSS_C_EMPTY_BUFFER;511512setprogname(argv[0]);513514init_o2n();515516if (krb5_init_context(&context))517errx(1, "krb5_init_context");518519cctx = sctx = GSS_C_NO_CONTEXT;520521if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind))522usage(1);523524if (help_flag)525usage (0);526527if(version_flag){528print_version(NULL);529exit(0);530}531532argc -= optind;533argv += optind;534535if (argc != 1)536usage(1);537538if (dns_canon_flag != -1)539gsskrb5_set_dns_canonicalize(dns_canon_flag);540541if (type_string == NULL)542nameoid = GSS_C_NT_HOSTBASED_SERVICE;543else if (strcmp(type_string, "hostbased-service") == 0)544nameoid = GSS_C_NT_HOSTBASED_SERVICE;545else if (strcmp(type_string, "krb5-principal-name") == 0)546nameoid = GSS_KRB5_NT_PRINCIPAL_NAME;547else548errx(1, "%s not suppported", type_string);549550if (mech_string == NULL)551mechoid = GSS_KRB5_MECHANISM;552else553mechoid = string_to_oid(mech_string);554555if (gsskrb5_acceptor_identity) {556maj_stat = gsskrb5_register_acceptor_identity(gsskrb5_acceptor_identity);557if (maj_stat)558errx(1, "gsskrb5_acceptor_identity: %s",559gssapi_err(maj_stat, 0, GSS_C_NO_OID));560}561562if (client_password) {563credential_data.value = client_password;564credential_data.length = strlen(client_password);565}566567if (client_name) {568gss_buffer_desc cn;569570cn.value = client_name;571cn.length = strlen(client_name);572573maj_stat = gss_import_name(&min_stat, &cn, GSS_C_NT_USER_NAME, &cname);574if (maj_stat)575errx(1, "gss_import_name: %s",576gssapi_err(maj_stat, min_stat, GSS_C_NO_OID));577}578579if (client_password) {580maj_stat = gss_acquire_cred_with_password(&min_stat,581cname,582&credential_data,583GSS_C_INDEFINITE,584GSS_C_NO_OID_SET,585GSS_C_INITIATE,586&client_cred,587NULL,588NULL);589if (GSS_ERROR(maj_stat))590errx(1, "gss_acquire_cred_with_password: %s",591gssapi_err(maj_stat, min_stat, GSS_C_NO_OID));592} else {593maj_stat = gss_acquire_cred(&min_stat,594cname,595GSS_C_INDEFINITE,596GSS_C_NO_OID_SET,597GSS_C_INITIATE,598&client_cred,599NULL,600NULL);601if (GSS_ERROR(maj_stat))602errx(1, "gss_acquire_cred: %s",603gssapi_err(maj_stat, min_stat, GSS_C_NO_OID));604}605606if (limit_enctype_string) {607krb5_error_code ret;608609ret = krb5_string_to_enctype(context,610limit_enctype_string,611&limit_enctype);612if (ret)613krb5_err(context, 1, ret, "krb5_string_to_enctype");614}615616617if (limit_enctype) {618if (client_cred == NULL)619errx(1, "client_cred missing");620621maj_stat = gss_krb5_set_allowable_enctypes(&min_stat, client_cred,6221, &limit_enctype);623if (maj_stat)624errx(1, "gss_krb5_set_allowable_enctypes: %s",625gssapi_err(maj_stat, min_stat, GSS_C_NO_OID));626}627628loop(mechoid, nameoid, argv[0], client_cred,629&sctx, &cctx, &actual_mech, &deleg_cred);630631if (verbose_flag)632printf("resulting mech: %s\n", oid_to_string(actual_mech));633634if (ret_mech_string) {635gss_OID retoid;636637retoid = string_to_oid(ret_mech_string);638639if (gss_oid_equal(retoid, actual_mech) == 0)640errx(1, "actual_mech mech is not the expected type %s",641ret_mech_string);642}643644/* XXX should be actual_mech */645if (gss_oid_equal(mechoid, GSS_KRB5_MECHANISM)) {646time_t time;647gss_buffer_desc authz_data;648gss_buffer_desc in, out1, out2;649krb5_keyblock *keyblock, *keyblock2;650krb5_timestamp now;651krb5_error_code ret;652653ret = krb5_timeofday(context, &now);654if (ret)655errx(1, "krb5_timeofday failed");656657/* client */658maj_stat = gss_krb5_export_lucid_sec_context(&min_stat,659&cctx,6601, /* version */661&ctx);662if (maj_stat != GSS_S_COMPLETE)663errx(1, "gss_krb5_export_lucid_sec_context failed: %s",664gssapi_err(maj_stat, min_stat, actual_mech));665666667maj_stat = gss_krb5_free_lucid_sec_context(&maj_stat, ctx);668if (maj_stat != GSS_S_COMPLETE)669errx(1, "gss_krb5_free_lucid_sec_context failed: %s",670gssapi_err(maj_stat, min_stat, actual_mech));671672/* server */673maj_stat = gss_krb5_export_lucid_sec_context(&min_stat,674&sctx,6751, /* version */676&ctx);677if (maj_stat != GSS_S_COMPLETE)678errx(1, "gss_krb5_export_lucid_sec_context failed: %s",679gssapi_err(maj_stat, min_stat, actual_mech));680maj_stat = gss_krb5_free_lucid_sec_context(&min_stat, ctx);681if (maj_stat != GSS_S_COMPLETE)682errx(1, "gss_krb5_free_lucid_sec_context failed: %s",683gssapi_err(maj_stat, min_stat, actual_mech));684685maj_stat = gsskrb5_extract_authtime_from_sec_context(&min_stat,686sctx,687&time);688if (maj_stat != GSS_S_COMPLETE)689errx(1, "gsskrb5_extract_authtime_from_sec_context failed: %s",690gssapi_err(maj_stat, min_stat, actual_mech));691692if (time > now)693errx(1, "gsskrb5_extract_authtime_from_sec_context failed: "694"time authtime is before now: %ld %ld",695(long)time, (long)now);696697maj_stat = gsskrb5_extract_service_keyblock(&min_stat,698sctx,699&keyblock);700if (maj_stat != GSS_S_COMPLETE)701errx(1, "gsskrb5_export_service_keyblock failed: %s",702gssapi_err(maj_stat, min_stat, actual_mech));703704krb5_free_keyblock(context, keyblock);705706maj_stat = gsskrb5_get_subkey(&min_stat,707sctx,708&keyblock);709if (maj_stat != GSS_S_COMPLETE710&& (!(maj_stat == GSS_S_FAILURE && min_stat == GSS_KRB5_S_KG_NO_SUBKEY)))711errx(1, "gsskrb5_get_subkey server failed: %s",712gssapi_err(maj_stat, min_stat, actual_mech));713714if (maj_stat != GSS_S_COMPLETE)715keyblock = NULL;716else if (limit_enctype && keyblock->keytype != limit_enctype)717errx(1, "gsskrb5_get_subkey wrong enctype");718719maj_stat = gsskrb5_get_subkey(&min_stat,720cctx,721&keyblock2);722if (maj_stat != GSS_S_COMPLETE723&& (!(maj_stat == GSS_S_FAILURE && min_stat == GSS_KRB5_S_KG_NO_SUBKEY)))724errx(1, "gsskrb5_get_subkey client failed: %s",725gssapi_err(maj_stat, min_stat, actual_mech));726727if (maj_stat != GSS_S_COMPLETE)728keyblock2 = NULL;729else if (limit_enctype && keyblock->keytype != limit_enctype)730errx(1, "gsskrb5_get_subkey wrong enctype");731732if (keyblock || keyblock2) {733if (keyblock == NULL)734errx(1, "server missing token keyblock");735if (keyblock2 == NULL)736errx(1, "client missing token keyblock");737738if (keyblock->keytype != keyblock2->keytype)739errx(1, "enctype mismatch");740if (keyblock->keyvalue.length != keyblock2->keyvalue.length)741errx(1, "key length mismatch");742if (memcmp(keyblock->keyvalue.data, keyblock2->keyvalue.data,743keyblock2->keyvalue.length) != 0)744errx(1, "key data mismatch");745}746747if (session_enctype_string) {748krb5_enctype enctype;749750ret = krb5_string_to_enctype(context,751session_enctype_string,752&enctype);753754if (ret)755krb5_err(context, 1, ret, "krb5_string_to_enctype");756757if (enctype != keyblock->keytype)758errx(1, "keytype is not the expected %d != %d",759(int)enctype, (int)keyblock2->keytype);760}761762if (keyblock)763krb5_free_keyblock(context, keyblock);764if (keyblock2)765krb5_free_keyblock(context, keyblock2);766767maj_stat = gsskrb5_get_initiator_subkey(&min_stat,768sctx,769&keyblock);770if (maj_stat != GSS_S_COMPLETE771&& (!(maj_stat == GSS_S_FAILURE && min_stat == GSS_KRB5_S_KG_NO_SUBKEY)))772errx(1, "gsskrb5_get_initiator_subkey failed: %s",773gssapi_err(maj_stat, min_stat, actual_mech));774775if (maj_stat == GSS_S_COMPLETE) {776777if (limit_enctype && keyblock->keytype != limit_enctype)778errx(1, "gsskrb5_get_initiator_subkey wrong enctype");779krb5_free_keyblock(context, keyblock);780}781782maj_stat = gsskrb5_extract_authz_data_from_sec_context(&min_stat,783sctx,784128,785&authz_data);786if (maj_stat == GSS_S_COMPLETE)787gss_release_buffer(&min_stat, &authz_data);788789790memset(&out1, 0, sizeof(out1));791memset(&out2, 0, sizeof(out2));792793in.value = "foo";794in.length = 3;795796gss_pseudo_random(&min_stat, sctx, GSS_C_PRF_KEY_FULL, &in,797100, &out1);798gss_pseudo_random(&min_stat, cctx, GSS_C_PRF_KEY_FULL, &in,799100, &out2);800801if (out1.length != out2.length)802errx(1, "prf len mismatch");803if (memcmp(out1.value, out2.value, out1.length) != 0)804errx(1, "prf data mismatch");805806gss_release_buffer(&min_stat, &out1);807808gss_pseudo_random(&min_stat, sctx, GSS_C_PRF_KEY_FULL, &in,809100, &out1);810811if (out1.length != out2.length)812errx(1, "prf len mismatch");813if (memcmp(out1.value, out2.value, out1.length) != 0)814errx(1, "prf data mismatch");815816gss_release_buffer(&min_stat, &out1);817gss_release_buffer(&min_stat, &out2);818819in.value = "bar";820in.length = 3;821822gss_pseudo_random(&min_stat, sctx, GSS_C_PRF_KEY_PARTIAL, &in,823100, &out1);824gss_pseudo_random(&min_stat, cctx, GSS_C_PRF_KEY_PARTIAL, &in,825100, &out2);826827if (out1.length != out2.length)828errx(1, "prf len mismatch");829if (memcmp(out1.value, out2.value, out1.length) != 0)830errx(1, "prf data mismatch");831832gss_release_buffer(&min_stat, &out1);833gss_release_buffer(&min_stat, &out2);834835wrapunwrap_flag = 1;836getverifymic_flag = 1;837}838839if (wrapunwrap_flag) {840wrapunwrap(cctx, sctx, 0, actual_mech);841wrapunwrap(cctx, sctx, 1, actual_mech);842wrapunwrap(sctx, cctx, 0, actual_mech);843wrapunwrap(sctx, cctx, 1, actual_mech);844}845846if (iov_flag) {847wrapunwrap_iov(cctx, sctx, 0, actual_mech);848wrapunwrap_iov(cctx, sctx, USE_HEADER_ONLY|FORCE_IOV, actual_mech);849wrapunwrap_iov(cctx, sctx, USE_HEADER_ONLY, actual_mech);850wrapunwrap_iov(cctx, sctx, USE_CONF, actual_mech);851wrapunwrap_iov(cctx, sctx, USE_CONF|USE_HEADER_ONLY, actual_mech);852853wrapunwrap_iov(cctx, sctx, FORCE_IOV, actual_mech);854wrapunwrap_iov(cctx, sctx, USE_CONF|FORCE_IOV, actual_mech);855wrapunwrap_iov(cctx, sctx, USE_HEADER_ONLY|FORCE_IOV, actual_mech);856wrapunwrap_iov(cctx, sctx, USE_CONF|USE_HEADER_ONLY|FORCE_IOV, actual_mech);857858wrapunwrap_iov(cctx, sctx, USE_SIGN_ONLY|FORCE_IOV, actual_mech);859wrapunwrap_iov(cctx, sctx, USE_CONF|USE_SIGN_ONLY|FORCE_IOV, actual_mech);860wrapunwrap_iov(cctx, sctx, USE_CONF|USE_HEADER_ONLY|USE_SIGN_ONLY|FORCE_IOV, actual_mech);861862/* works */863wrapunwrap_iov(cctx, sctx, 0, actual_mech);864wrapunwrap_iov(cctx, sctx, FORCE_IOV, actual_mech);865866wrapunwrap_iov(cctx, sctx, USE_CONF, actual_mech);867wrapunwrap_iov(cctx, sctx, USE_CONF|FORCE_IOV, actual_mech);868869wrapunwrap_iov(cctx, sctx, USE_SIGN_ONLY, actual_mech);870wrapunwrap_iov(cctx, sctx, USE_SIGN_ONLY|FORCE_IOV, actual_mech);871872wrapunwrap_iov(cctx, sctx, USE_CONF|USE_SIGN_ONLY, actual_mech);873wrapunwrap_iov(cctx, sctx, USE_CONF|USE_SIGN_ONLY|FORCE_IOV, actual_mech);874875wrapunwrap_iov(cctx, sctx, USE_HEADER_ONLY, actual_mech);876wrapunwrap_iov(cctx, sctx, USE_HEADER_ONLY|FORCE_IOV, actual_mech);877878wrapunwrap_iov(cctx, sctx, USE_CONF|USE_HEADER_ONLY, actual_mech);879wrapunwrap_iov(cctx, sctx, USE_CONF|USE_HEADER_ONLY|FORCE_IOV, actual_mech);880}881882if (getverifymic_flag) {883getverifymic(cctx, sctx, actual_mech);884getverifymic(cctx, sctx, actual_mech);885getverifymic(sctx, cctx, actual_mech);886getverifymic(sctx, cctx, actual_mech);887}888889890gss_delete_sec_context(&min_stat, &cctx, NULL);891gss_delete_sec_context(&min_stat, &sctx, NULL);892893if (deleg_cred != GSS_C_NO_CREDENTIAL) {894gss_cred_id_t cred2 = GSS_C_NO_CREDENTIAL;895gss_buffer_desc cb;896897if (verbose_flag)898printf("checking actual mech (%s) on delegated cred\n",899oid_to_string(actual_mech));900loop(actual_mech, nameoid, argv[0], deleg_cred, &sctx, &cctx, &actual_mech2, &cred2);901902gss_delete_sec_context(&min_stat, &cctx, NULL);903gss_delete_sec_context(&min_stat, &sctx, NULL);904905gss_release_cred(&min_stat, &cred2);906907/* try again using SPNEGO */908if (verbose_flag)909printf("checking spnego on delegated cred\n");910loop(GSS_SPNEGO_MECHANISM, nameoid, argv[0], deleg_cred, &sctx, &cctx,911&actual_mech2, &cred2);912913gss_delete_sec_context(&min_stat, &cctx, NULL);914gss_delete_sec_context(&min_stat, &sctx, NULL);915916gss_release_cred(&min_stat, &cred2);917918/* check export/import */919if (ei_flag) {920921maj_stat = gss_export_cred(&min_stat, deleg_cred, &cb);922if (maj_stat != GSS_S_COMPLETE)923errx(1, "export failed: %s",924gssapi_err(maj_stat, min_stat, NULL));925926maj_stat = gss_import_cred(&min_stat, &cb, &cred2);927if (maj_stat != GSS_S_COMPLETE)928errx(1, "import failed: %s",929gssapi_err(maj_stat, min_stat, NULL));930931gss_release_buffer(&min_stat, &cb);932gss_release_cred(&min_stat, &deleg_cred);933934if (verbose_flag)935printf("checking actual mech (%s) on export/imported cred\n",936oid_to_string(actual_mech));937loop(actual_mech, nameoid, argv[0], cred2, &sctx, &cctx,938&actual_mech2, &deleg_cred);939940gss_release_cred(&min_stat, &deleg_cred);941942gss_delete_sec_context(&min_stat, &cctx, NULL);943gss_delete_sec_context(&min_stat, &sctx, NULL);944945/* try again using SPNEGO */946if (verbose_flag)947printf("checking SPNEGO on export/imported cred\n");948loop(GSS_SPNEGO_MECHANISM, nameoid, argv[0], cred2, &sctx, &cctx,949&actual_mech2, &deleg_cred);950951gss_release_cred(&min_stat, &deleg_cred);952953gss_delete_sec_context(&min_stat, &cctx, NULL);954gss_delete_sec_context(&min_stat, &sctx, NULL);955956gss_release_cred(&min_stat, &cred2);957958} else {959gss_release_cred(&min_stat, &deleg_cred);960}961962}963964empty_release();965966krb5_free_context(context);967968return 0;969}970971972