bd211b8556ef6b18ebf137419bd5555d65271664semery/*
bd211b8556ef6b18ebf137419bd5555d65271664semery * CDDL HEADER START
bd211b8556ef6b18ebf137419bd5555d65271664semery *
bd211b8556ef6b18ebf137419bd5555d65271664semery * The contents of this file are subject to the terms of the
bd211b8556ef6b18ebf137419bd5555d65271664semery * Common Development and Distribution License (the "License").
bd211b8556ef6b18ebf137419bd5555d65271664semery * You may not use this file except in compliance with the License.
bd211b8556ef6b18ebf137419bd5555d65271664semery *
bd211b8556ef6b18ebf137419bd5555d65271664semery * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bd211b8556ef6b18ebf137419bd5555d65271664semery * or http://www.opensolaris.org/os/licensing.
bd211b8556ef6b18ebf137419bd5555d65271664semery * See the License for the specific language governing permissions
bd211b8556ef6b18ebf137419bd5555d65271664semery * and limitations under the License.
bd211b8556ef6b18ebf137419bd5555d65271664semery *
bd211b8556ef6b18ebf137419bd5555d65271664semery * When distributing Covered Code, include this CDDL HEADER in each
bd211b8556ef6b18ebf137419bd5555d65271664semery * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
bd211b8556ef6b18ebf137419bd5555d65271664semery * If applicable, add the following below this CDDL HEADER, with the
bd211b8556ef6b18ebf137419bd5555d65271664semery * fields enclosed by brackets "[]" replaced with your own identifying
bd211b8556ef6b18ebf137419bd5555d65271664semery * information: Portions Copyright [yyyy] [name of copyright owner]
bd211b8556ef6b18ebf137419bd5555d65271664semery *
bd211b8556ef6b18ebf137419bd5555d65271664semery * CDDL HEADER END
bd211b8556ef6b18ebf137419bd5555d65271664semery */
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery/*
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
bd211b8556ef6b18ebf137419bd5555d65271664semery * Use is subject to license terms.
bd211b8556ef6b18ebf137419bd5555d65271664semery */
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery#include <stdio.h>
bd211b8556ef6b18ebf137419bd5555d65271664semery#include <stdlib.h>
bd211b8556ef6b18ebf137419bd5555d65271664semery#include <strings.h>
bd211b8556ef6b18ebf137419bd5555d65271664semery#include <locale.h>
bd211b8556ef6b18ebf137419bd5555d65271664semery#include <netdb.h>
bd211b8556ef6b18ebf137419bd5555d65271664semery#include "k5-int.h"
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery#define QUOTE(x) #x
bd211b8556ef6b18ebf137419bd5555d65271664semery#define VAL2STR(x) QUOTE(x)
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic char *whoami = NULL;
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic void kt_add_entry(krb5_context ctx, krb5_keytab kt,
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery const krb5_principal princ, const krb5_principal sprinc,
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery krb5_enctype enctype, krb5_kvno kvno, const char *pw);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic krb5_error_code kt_remove_entries(krb5_context ctx, krb5_keytab kt,
bd211b8556ef6b18ebf137419bd5555d65271664semery const krb5_principal princ);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic void usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semeryint
bd211b8556ef6b18ebf137419bd5555d65271664semerymain(int argc, char **argv)
bd211b8556ef6b18ebf137419bd5555d65271664semery{
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_context ctx = NULL;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_error_code code = 0;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_enctype *enctypes;
bd211b8556ef6b18ebf137419bd5555d65271664semery int enctype_count = 0;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_ccache cc = NULL;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_keytab kt = NULL;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_kvno kvno = 1;
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery krb5_principal victim, salt;
bd211b8556ef6b18ebf137419bd5555d65271664semery char c, *vprincstr, *ktname, *token, *lasts, *newpw;
bd211b8556ef6b18ebf137419bd5555d65271664semery int result_code, i, len, nflag = 0;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_data result_code_string, result_string;
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) setlocale(LC_ALL, "");
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery#if !defined(TEXT_DOMAIN)
bd211b8556ef6b18ebf137419bd5555d65271664semery#define TEXT_DOMAIN "SYS_TEST"
bd211b8556ef6b18ebf137419bd5555d65271664semery#endif /* TEXT_DOMAIN */
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) textdomain(TEXT_DOMAIN);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery /* Misc init stuff */
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) memset(&result_code_string, 0, sizeof (result_code_string));
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) memset(&result_string, 0, sizeof (result_string));
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery whoami = argv[0];
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_init_context(&ctx);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("krb5_init_context() failed"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery while ((c = getopt(argc, argv, "v:c:k:e:ns:")) != -1) {
bd211b8556ef6b18ebf137419bd5555d65271664semery switch (c) {
bd211b8556ef6b18ebf137419bd5555d65271664semery case 'n':
bd211b8556ef6b18ebf137419bd5555d65271664semery nflag++;
bd211b8556ef6b18ebf137419bd5555d65271664semery break;
bd211b8556ef6b18ebf137419bd5555d65271664semery case 'k':
bd211b8556ef6b18ebf137419bd5555d65271664semery if (kt != NULL)
bd211b8556ef6b18ebf137419bd5555d65271664semery usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery len = snprintf(NULL, 0, "WRFILE:%s", optarg) + 1;
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((ktname = malloc(len)) == NULL) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't allocate memory\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) snprintf(ktname, len, "WRFILE:%s", optarg);
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((code = krb5_kt_resolve(ctx, ktname, &kt)) != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't open/create "
bd211b8556ef6b18ebf137419bd5555d65271664semery "keytab %s"), optarg);
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery break;
bd211b8556ef6b18ebf137419bd5555d65271664semery case 'c':
bd211b8556ef6b18ebf137419bd5555d65271664semery if (cc != NULL)
bd211b8556ef6b18ebf137419bd5555d65271664semery usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((code = krb5_cc_resolve(ctx, optarg, &cc)) != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't open ccache %s"), optarg);
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery break;
bd211b8556ef6b18ebf137419bd5555d65271664semery case 'e':
bd211b8556ef6b18ebf137419bd5555d65271664semery len = strlen(optarg);
bd211b8556ef6b18ebf137419bd5555d65271664semery token = strtok_r(optarg, ",\t,", &lasts);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (token == NULL)
bd211b8556ef6b18ebf137419bd5555d65271664semery usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery do {
bd211b8556ef6b18ebf137419bd5555d65271664semery if (enctype_count++ == 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery enctypes = malloc(sizeof (*enctypes));
bd211b8556ef6b18ebf137419bd5555d65271664semery } else {
bd211b8556ef6b18ebf137419bd5555d65271664semery enctypes = realloc(enctypes,
bd211b8556ef6b18ebf137419bd5555d65271664semery sizeof (*enctypes) * enctype_count);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery if (enctypes == NULL) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr, gettext
bd211b8556ef6b18ebf137419bd5555d65271664semery ("Couldn't allocate memory"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_string_to_enctype(token,
bd211b8556ef6b18ebf137419bd5555d65271664semery &enctypes[enctype_count - 1]);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("Unknown "
bd211b8556ef6b18ebf137419bd5555d65271664semery "or unsupported enctype %s"),
bd211b8556ef6b18ebf137419bd5555d65271664semery optarg);
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery } while ((token = strtok_r(NULL, ",\t ", &lasts)) !=
bd211b8556ef6b18ebf137419bd5555d65271664semery NULL);
bd211b8556ef6b18ebf137419bd5555d65271664semery break;
bd211b8556ef6b18ebf137419bd5555d65271664semery case 'v':
bd211b8556ef6b18ebf137419bd5555d65271664semery kvno = (krb5_kvno) atoi(optarg);
bd211b8556ef6b18ebf137419bd5555d65271664semery break;
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery case 's':
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery vprincstr = optarg;
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery code = krb5_parse_name(ctx, vprincstr, &salt);
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery if (code != 0) {
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery com_err(whoami, code,
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery gettext("krb5_parse_name(%s) failed"),
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery vprincstr);
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery exit(1);
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery }
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery break;
bd211b8556ef6b18ebf137419bd5555d65271664semery default:
bd211b8556ef6b18ebf137419bd5555d65271664semery usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery break;
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (nflag && enctype_count == 0)
bd211b8556ef6b18ebf137419bd5555d65271664semery usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (nflag == 0 && cc == NULL &&
bd211b8556ef6b18ebf137419bd5555d65271664semery (code = krb5_cc_default(ctx, &cc)) != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("Could not find a ccache"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (enctype_count > 0 && kt == NULL &&
bd211b8556ef6b18ebf137419bd5555d65271664semery (code = krb5_kt_default(ctx, &kt)) != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("No keytab specified"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (argc != (optind + 1))
bd211b8556ef6b18ebf137419bd5555d65271664semery usage();
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery vprincstr = argv[optind];
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_parse_name(ctx, vprincstr, &victim);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("krb5_parse_name(%s) failed"),
bd211b8556ef6b18ebf137419bd5555d65271664semery vprincstr);
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (!isatty(fileno(stdin))) {
bd211b8556ef6b18ebf137419bd5555d65271664semery char buf[PASS_MAX + 1];
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (scanf("%" VAL2STR(PASS_MAX) "s", &buf) != 1) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't read new password\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery newpw = strdup(buf);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (newpw == NULL) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't allocate memory\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery } else {
bd211b8556ef6b18ebf137419bd5555d65271664semery newpw = getpassphrase(gettext("Enter new password: "));
bd211b8556ef6b18ebf137419bd5555d65271664semery if (newpw == NULL) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't read new password\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery newpw = strdup(newpw);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (newpw == NULL) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Couldn't allocate memory\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (nflag == 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_set_password_using_ccache(ctx, cc, newpw, victim,
bd211b8556ef6b18ebf137419bd5555d65271664semery &result_code, &result_code_string, &result_string);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("krb5_set_password() failed"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_cc_close(ctx, cc);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) printf("Result: %.*s (%d) %.*s\n",
bd211b8556ef6b18ebf137419bd5555d65271664semery result_code == 0 ?
bd211b8556ef6b18ebf137419bd5555d65271664semery strlen("success") : result_code_string.length,
bd211b8556ef6b18ebf137419bd5555d65271664semery result_code == 0 ? "success" : result_code_string.data,
bd211b8556ef6b18ebf137419bd5555d65271664semery result_code,
bd211b8556ef6b18ebf137419bd5555d65271664semery result_string.length, result_string.data);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (result_code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr, gettext("Exiting...\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(result_code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (enctype_count && (code = kt_remove_entries(ctx, kt, victim)))
bd211b8556ef6b18ebf137419bd5555d65271664semery goto error;
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery for (i = 0; i < enctype_count; i++)
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery kt_add_entry(ctx, kt, victim, salt, enctypes[i], kvno, newpw);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semeryerror:
bd211b8556ef6b18ebf137419bd5555d65271664semery if (kt != NULL)
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_kt_close(ctx, kt);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code ? 1 : 0);
bd211b8556ef6b18ebf137419bd5555d65271664semery}
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic
bd211b8556ef6b18ebf137419bd5555d65271664semerykrb5_error_code
bd211b8556ef6b18ebf137419bd5555d65271664semerykt_remove_entries(krb5_context ctx, krb5_keytab kt, const krb5_principal princ)
bd211b8556ef6b18ebf137419bd5555d65271664semery{
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_error_code code;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_kt_cursor cursor;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_keytab_entry entry;
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery /*
bd211b8556ef6b18ebf137419bd5555d65271664semery * This is not a fatal error, we expect this to fail in the majority
bd211b8556ef6b18ebf137419bd5555d65271664semery * of cases (when clients are first initialized).
bd211b8556ef6b18ebf137419bd5555d65271664semery */
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_kt_get_entry(ctx, kt, princ, 0, 0, &entry);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Could not retrieve entry in keytab"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (0);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_kt_free_entry(ctx, &entry);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_kt_start_seq_get(ctx, kt, &cursor);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("While starting keytab scan"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery while ((code = krb5_kt_next_entry(ctx, kt, &entry, &cursor)) == 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery if (krb5_principal_compare(ctx, princ, entry.principal)) {
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_kt_end_seq_get(ctx, kt, &cursor);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("While temporarily "
bd211b8556ef6b18ebf137419bd5555d65271664semery "ending keytab scan"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_kt_remove_entry(ctx, kt, &entry);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("While deleting entry "
bd211b8556ef6b18ebf137419bd5555d65271664semery "from keytab"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_kt_start_seq_get(ctx, kt, &cursor);
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("While restarting keytab scan"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_kt_free_entry(ctx, &entry);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code && code != KRB5_KT_END) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("While scanning keytab"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((code = krb5_kt_end_seq_get(ctx, kt, &cursor))) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("While ending keytab scan"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return (code);
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery return (0);
bd211b8556ef6b18ebf137419bd5555d65271664semery}
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic
bd211b8556ef6b18ebf137419bd5555d65271664semeryvoid
bd211b8556ef6b18ebf137419bd5555d65271664semerykt_add_entry(krb5_context ctx, krb5_keytab kt, const krb5_principal princ,
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery const krb5_principal sprinc, krb5_enctype enctype, krb5_kvno kvno,
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery const char *pw)
bd211b8556ef6b18ebf137419bd5555d65271664semery{
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_keytab_entry *entry;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_data password, salt;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_keyblock key;
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_error_code code;
bd211b8556ef6b18ebf137419bd5555d65271664semery char buf[100];
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((code = krb5_enctype_to_string(enctype, buf, sizeof (buf)))) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("Enctype %d has no name!"),
bd211b8556ef6b18ebf137419bd5555d65271664semery enctype);
bd211b8556ef6b18ebf137419bd5555d65271664semery return;
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((entry = (krb5_keytab_entry *) malloc(sizeof (*entry))) == NULL) {
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr, gettext("Couldn't allocate memory"));
bd211b8556ef6b18ebf137419bd5555d65271664semery return;
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) memset((char *)entry, 0, sizeof (*entry));
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery password.length = strlen(pw);
bd211b8556ef6b18ebf137419bd5555d65271664semery password.data = (char *)pw;
bd211b8556ef6b18ebf137419bd5555d65271664semery
c386eb9c22c7c00fc48a982f238576e16b113bdaShawn Emery if ((code = krb5_principal2salt(ctx, sprinc, &salt)) != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Could not compute salt for %s"), enctype);
bd211b8556ef6b18ebf137419bd5555d65271664semery return;
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery code = krb5_c_string_to_key(ctx, enctype, &password, &salt, &key);
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if (code != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code, gettext("Could not compute salt for %s"),
bd211b8556ef6b18ebf137419bd5555d65271664semery enctype);
bd211b8556ef6b18ebf137419bd5555d65271664semery krb5_xfree(salt.data);
bd211b8556ef6b18ebf137419bd5555d65271664semery return;
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) memcpy(&entry->key, &key, sizeof (krb5_keyblock));
bd211b8556ef6b18ebf137419bd5555d65271664semery entry->vno = kvno;
bd211b8556ef6b18ebf137419bd5555d65271664semery entry->principal = princ;
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery if ((code = krb5_kt_add_entry(ctx, kt, entry)) != 0) {
bd211b8556ef6b18ebf137419bd5555d65271664semery com_err(whoami, code,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("Could not add entry to keytab"));
bd211b8556ef6b18ebf137419bd5555d65271664semery }
bd211b8556ef6b18ebf137419bd5555d65271664semery}
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semerystatic
bd211b8556ef6b18ebf137419bd5555d65271664semeryvoid
bd211b8556ef6b18ebf137419bd5555d65271664semeryusage()
bd211b8556ef6b18ebf137419bd5555d65271664semery{
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr, gettext("Usage: %s [-c ccache] [-k keytab] "
72f0806acd90f56fb47a8087c33cfeaec527fddaShawn Emery "[-e enctype_list] [-s salt_name] [-n] princ\n"), whoami);
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr,
bd211b8556ef6b18ebf137419bd5555d65271664semery gettext("\t-n\tDon't set the principal's password\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr, gettext("\tenctype_list is a comma or whitespace"
bd211b8556ef6b18ebf137419bd5555d65271664semery " separated list\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery (void) fprintf(stderr, gettext("\tIf -n is used then -k and -e must be "
bd211b8556ef6b18ebf137419bd5555d65271664semery "used\n"));
bd211b8556ef6b18ebf137419bd5555d65271664semery
bd211b8556ef6b18ebf137419bd5555d65271664semery exit(1);
bd211b8556ef6b18ebf137419bd5555d65271664semery}