2 * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
12 RCSID("$Id: ext_srvtab.c,v 1.18 1999/09/16 20:37:20 assar Exp $");
14 static des_cblock master_key;
15 static des_cblock session_key;
16 static des_key_schedule master_key_schedule;
17 static char realm[REALM_SZ];
22 memset(master_key, 0, sizeof master_key);
23 memset(session_key, 0, sizeof session_key);
24 memset(master_key_schedule, 0, sizeof master_key_schedule);
31 "Usage: %s [-n] [-r realm] instance [instance ...]\n",
38 FWrite(void *p, int size, int n, FILE *f)
40 if (fwrite(p, size, n, f) != n) {
42 errx(1, "Error writing output file. Terminating.\n");
47 main(int argc, char **argv)
55 int prompt = KDB_GET_PROMPT;
58 set_progname (argv[0]);
59 memset(realm, 0, sizeof(realm));
62 atexit(StampOutSecrets);
65 /* Parse commandline arguments */
69 for (i = 1; i < argc; i++) {
70 if (strcmp(argv[i], "-n") == 0)
72 else if (strcmp(argv[i], "-r") == 0) {
76 strlcpy(realm, argv[i], REALM_SZ);
78 * This is to humor the broken way commandline
79 * argument parsing is done. Later, this
80 * program ignores everything that starts with -.
85 else if (argv[i][0] == '-')
88 if (!k_isinst(argv[i])) {
89 warnx("bad instance name: %s", argv[i]);
95 if (kdb_get_master_key (prompt, &master_key, master_key_schedule) != 0)
96 errx (1, "Couldn't read master key.");
98 if (kdb_verify_master_key (&master_key, master_key_schedule, stderr) < 0) {
102 /* For each arg, search for instances of arg, and produce */
105 if (krb_get_lrealm(realm, 1) != KSUCCESS) {
107 errx (1, "couldn't get local realm");
111 for (arg = 1; arg < argc; arg++) {
112 if (argv[arg][0] == '-')
114 snprintf(fname, sizeof(fname), "%s-new-srvtab", argv[arg]);
115 if ((fout = fopen(fname, "w")) == NULL) {
116 warn("Couldn't create file '%s'.", fname);
120 printf("Generating '%s'....\n", fname);
121 n = kerb_get_principal("*", argv[arg], &princs[0], 40, &more);
123 fprintf(stderr, "More than 40 found...\n");
124 for (i = 0; i < n; i++) {
125 FWrite(princs[i].name, strlen(princs[i].name) + 1, 1, fout);
126 FWrite(princs[i].instance, strlen(princs[i].instance) + 1,
128 FWrite(realm, strlen(realm) + 1, 1, fout);
129 FWrite(&princs[i].key_version,
130 sizeof(princs[i].key_version), 1, fout);
131 copy_to_key(&princs[i].key_low, &princs[i].key_high, session_key);
132 kdb_encrypt_key (&session_key, &session_key,
133 &master_key, master_key_schedule, DES_DECRYPT);
134 FWrite(session_key, sizeof session_key, 1, fout);
139 return fopen_errs; /* 0 errors if successful */