|
Packit Service |
99d1c0 |
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
Packit Service |
99d1c0 |
/* tests/etinfo.c - Test harness for KDC etype-info behavior */
|
|
Packit Service |
99d1c0 |
/*
|
|
Packit Service |
99d1c0 |
* Copyright (C) 2015 by the Massachusetts Institute of Technology.
|
|
Packit Service |
99d1c0 |
* All rights reserved.
|
|
Packit Service |
99d1c0 |
*
|
|
Packit Service |
99d1c0 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
99d1c0 |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
99d1c0 |
* are met:
|
|
Packit Service |
99d1c0 |
*
|
|
Packit Service |
99d1c0 |
* * Redistributions of source code must retain the above copyright
|
|
Packit Service |
99d1c0 |
* notice, this list of conditions and the following disclaimer.
|
|
Packit Service |
99d1c0 |
*
|
|
Packit Service |
99d1c0 |
* * Redistributions in binary form must reproduce the above copyright
|
|
Packit Service |
99d1c0 |
* notice, this list of conditions and the following disclaimer in
|
|
Packit Service |
99d1c0 |
* the documentation and/or other materials provided with the
|
|
Packit Service |
99d1c0 |
* distribution.
|
|
Packit Service |
99d1c0 |
*
|
|
Packit Service |
99d1c0 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
Packit Service |
99d1c0 |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
Packit Service |
99d1c0 |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
Packit Service |
99d1c0 |
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
Packit Service |
99d1c0 |
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
Packit Service |
99d1c0 |
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
Packit Service |
99d1c0 |
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit Service |
99d1c0 |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
Packit Service |
99d1c0 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
Packit Service |
99d1c0 |
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit Service |
99d1c0 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
Packit Service |
99d1c0 |
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit Service |
99d1c0 |
*/
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
/*
|
|
Packit Service |
99d1c0 |
* Send an AS-REQ to the KDC for a specified principal, with an optionally
|
|
Packit Service |
99d1c0 |
* specified request enctype list. Decode the output as either an AS-REP or a
|
|
Packit Service |
99d1c0 |
* KRB-ERROR and display the PA-ETYPE-INFO2, PA-ETYPE-INFO, and PA-PW-SALT
|
|
Packit Service |
99d1c0 |
* padata in the following format:
|
|
Packit Service |
99d1c0 |
*
|
|
Packit Service |
99d1c0 |
* error/asrep etype-info2/etype-info/pw-salt enctype salt [s2kparams]
|
|
Packit Service |
99d1c0 |
*
|
|
Packit Service |
99d1c0 |
* enctype is omitted for PA-PW-SALT entries. salt is displayed directly;
|
|
Packit Service |
99d1c0 |
* s2kparams is displayed in uppercase hex.
|
|
Packit Service |
99d1c0 |
*/
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
#include "k5-int.h"
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
static krb5_context ctx;
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
static void
|
|
Packit Service |
99d1c0 |
check(krb5_error_code code)
|
|
Packit Service |
99d1c0 |
{
|
|
Packit Service |
99d1c0 |
const char *errmsg;
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if (code) {
|
|
Packit Service |
99d1c0 |
errmsg = krb5_get_error_message(ctx, code);
|
|
Packit Service |
99d1c0 |
fprintf(stderr, "%s\n", errmsg);
|
|
Packit Service |
99d1c0 |
krb5_free_error_message(ctx, errmsg);
|
|
Packit Service |
99d1c0 |
exit(1);
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
static void
|
|
Packit Service |
99d1c0 |
display_etinfo(krb5_etype_info_entry **list, const char *l1, const char *l2)
|
|
Packit Service |
99d1c0 |
{
|
|
Packit Service |
99d1c0 |
krb5_etype_info_entry *info;
|
|
Packit Service |
99d1c0 |
char etname[256];
|
|
Packit Service |
99d1c0 |
unsigned int i;
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
for (; *list != NULL; list++) {
|
|
Packit Service |
99d1c0 |
info = *list;
|
|
Packit Service |
99d1c0 |
check(krb5_enctype_to_name(info->etype, TRUE, etname, sizeof(etname)));
|
|
Packit Service |
99d1c0 |
printf("%s %s %s ", l1, l2, etname);
|
|
Packit Service |
99d1c0 |
if (info->length != KRB5_ETYPE_NO_SALT)
|
|
Packit Service |
99d1c0 |
printf("%.*s", info->length, info->salt);
|
|
Packit Service |
99d1c0 |
else
|
|
Packit Service |
99d1c0 |
printf("(default)");
|
|
Packit Service |
99d1c0 |
if (info->s2kparams.length > 0) {
|
|
Packit Service |
99d1c0 |
printf(" ");
|
|
Packit Service |
99d1c0 |
for (i = 0; i < info->s2kparams.length; i++)
|
|
Packit Service |
99d1c0 |
printf("%02X", (unsigned char)info->s2kparams.data[i]);
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
printf("\n");
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
static void
|
|
Packit Service |
99d1c0 |
display_padata(krb5_pa_data **pa_list, const char *label)
|
|
Packit Service |
99d1c0 |
{
|
|
Packit Service |
99d1c0 |
krb5_pa_data *pa;
|
|
Packit Service |
99d1c0 |
krb5_data d;
|
|
Packit Service |
99d1c0 |
krb5_etype_info_entry **etinfo_list;
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
for (; pa_list != NULL && *pa_list != NULL; pa_list++) {
|
|
Packit Service |
99d1c0 |
pa = *pa_list;
|
|
Packit Service |
99d1c0 |
d = make_data(pa->contents, pa->length);
|
|
Packit Service |
99d1c0 |
if (pa->pa_type == KRB5_PADATA_ETYPE_INFO2) {
|
|
Packit Service |
99d1c0 |
check(decode_krb5_etype_info2(&d, &etinfo_list));
|
|
Packit Service |
99d1c0 |
display_etinfo(etinfo_list, label, "etype_info2");
|
|
Packit Service |
99d1c0 |
krb5_free_etype_info(ctx, etinfo_list);
|
|
Packit Service |
99d1c0 |
} else if (pa->pa_type == KRB5_PADATA_ETYPE_INFO) {
|
|
Packit Service |
99d1c0 |
check(decode_krb5_etype_info(&d, &etinfo_list));
|
|
Packit Service |
99d1c0 |
display_etinfo(etinfo_list, label, "etype_info");
|
|
Packit Service |
99d1c0 |
krb5_free_etype_info(ctx, etinfo_list);
|
|
Packit Service |
99d1c0 |
} else if (pa->pa_type == KRB5_PADATA_PW_SALT) {
|
|
Packit Service |
99d1c0 |
printf("%s pw_salt %.*s\n", label, (int)d.length, d.data);
|
|
Packit Service |
99d1c0 |
} else if (pa->pa_type == KRB5_PADATA_AFS3_SALT) {
|
|
Packit Service |
99d1c0 |
printf("%s afs3_salt %.*s\n", label, (int)d.length, d.data);
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
int
|
|
Packit Service |
99d1c0 |
main(int argc, char **argv)
|
|
Packit Service |
99d1c0 |
{
|
|
Packit Service |
99d1c0 |
krb5_principal client;
|
|
Packit Service |
99d1c0 |
krb5_get_init_creds_opt *opt;
|
|
Packit Service |
99d1c0 |
krb5_init_creds_context icc;
|
|
Packit Service |
99d1c0 |
krb5_data reply, request, realm;
|
|
Packit Service |
99d1c0 |
krb5_error *error;
|
|
Packit Service |
99d1c0 |
krb5_kdc_rep *asrep;
|
|
Packit Service |
99d1c0 |
krb5_pa_data **padata;
|
|
Packit Service |
99d1c0 |
krb5_enctype *enctypes, def[] = { ENCTYPE_NULL };
|
|
Packit Service |
99d1c0 |
krb5_preauthtype pa_type = KRB5_PADATA_NONE;
|
|
Packit Service |
99d1c0 |
unsigned int flags;
|
|
Packit Service |
99d1c0 |
int master = 0;
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if (argc < 2 && argc > 4) {
|
|
Packit Service |
99d1c0 |
fprintf(stderr, "Usage: %s princname [enctypes] [patype]\n", argv[0]);
|
|
Packit Service |
99d1c0 |
exit(1);
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
check(krb5_init_context(&ctx));
|
|
Packit Service |
99d1c0 |
check(krb5_parse_name(ctx, argv[1], &client));
|
|
Packit Service |
99d1c0 |
if (argc >= 3) {
|
|
Packit Service |
99d1c0 |
check(krb5int_parse_enctype_list(ctx, "", argv[2], def, &enctypes));
|
|
Packit Service |
99d1c0 |
krb5_set_default_in_tkt_ktypes(ctx, enctypes);
|
|
Packit Service |
99d1c0 |
free(enctypes);
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
if (argc >= 4)
|
|
Packit Service |
99d1c0 |
pa_type = atoi(argv[3]);
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
check(krb5_get_init_creds_opt_alloc(ctx, &opt));
|
|
Packit Service |
99d1c0 |
if (pa_type != KRB5_PADATA_NONE)
|
|
Packit Service |
99d1c0 |
krb5_get_init_creds_opt_set_preauth_list(opt, &pa_type, 1);
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
check(krb5_init_creds_init(ctx, client, NULL, NULL, 0, opt, &icc));
|
|
Packit Service |
99d1c0 |
reply = empty_data();
|
|
Packit Service |
99d1c0 |
check(krb5_init_creds_step(ctx, icc, &reply, &request, &realm, &flags));
|
|
Packit Service |
99d1c0 |
assert(flags == KRB5_INIT_CREDS_STEP_FLAG_CONTINUE);
|
|
Packit Service |
99d1c0 |
check(krb5_sendto_kdc(ctx, &request, &realm, &reply, &master, 0));
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
if (decode_krb5_error(&reply, &error) == 0) {
|
|
Packit Service |
99d1c0 |
decode_krb5_padata_sequence(&error->e_data, &padata);
|
|
Packit Service |
99d1c0 |
if (error->error == KDC_ERR_PREAUTH_REQUIRED) {
|
|
Packit Service |
99d1c0 |
display_padata(padata, "error");
|
|
Packit Service |
99d1c0 |
} else if (error->error == KDC_ERR_MORE_PREAUTH_DATA_REQUIRED) {
|
|
Packit Service |
99d1c0 |
display_padata(padata, "more");
|
|
Packit Service |
99d1c0 |
} else {
|
|
Packit Service |
99d1c0 |
fprintf(stderr, "Unexpected error %d\n", (int)error->error);
|
|
Packit Service |
99d1c0 |
return 1;
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
krb5_free_pa_data(ctx, padata);
|
|
Packit Service |
99d1c0 |
krb5_free_error(ctx, error);
|
|
Packit Service |
99d1c0 |
} else if (decode_krb5_as_rep(&reply, &asrep) == 0) {
|
|
Packit Service |
99d1c0 |
display_padata(asrep->padata, "asrep");
|
|
Packit Service |
99d1c0 |
krb5_free_kdc_rep(ctx, asrep);
|
|
Packit Service |
99d1c0 |
} else {
|
|
Packit Service |
99d1c0 |
abort();
|
|
Packit Service |
99d1c0 |
}
|
|
Packit Service |
99d1c0 |
|
|
Packit Service |
99d1c0 |
krb5_free_data_contents(ctx, &request);
|
|
Packit Service |
99d1c0 |
krb5_free_data_contents(ctx, &reply);
|
|
Packit Service |
99d1c0 |
krb5_free_data_contents(ctx, &realm;;
|
|
Packit Service |
99d1c0 |
krb5_get_init_creds_opt_free(ctx, opt);
|
|
Packit Service |
99d1c0 |
krb5_init_creds_free(ctx, icc);
|
|
Packit Service |
99d1c0 |
krb5_free_principal(ctx, client);
|
|
Packit Service |
99d1c0 |
krb5_free_context(ctx);
|
|
Packit Service |
99d1c0 |
return 0;
|
|
Packit Service |
99d1c0 |
}
|