Annotation of 43BSDReno/kerberosIV/ext_srvtab/ext_srvtab.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Source: /mit/kerberos/src/admin/RCS/ext_srvtab.c,v $
                      3:  * $Header: ext_srvtab.c,v 4.1 89/07/18 16:49:30 jtkohl Exp $
                      4:  *
                      5:  * Copyright 1987, 1988 by the Massachusetts Institute of Technology. 
                      6:  *
                      7:  * For copying and distribution information, please see the file
                      8:  * <mit-copyright.h>. 
                      9:  *
                     10:  * Description 
                     11:  */
                     12: 
                     13: #ifndef        lint
                     14: static char rcsid_ext_srvtab_c[] =
                     15:     "$Header: ext_srvtab.c,v 4.1 89/07/18 16:49:30 jtkohl Exp $";
                     16: #endif lint
                     17: 
                     18: #include <mit-copyright.h>
                     19: 
                     20: #include <stdio.h>
                     21: #include <sys/file.h>
                     22: #include <sys/types.h>
                     23: #include <sys/time.h>
                     24: #include <sys/stat.h>
                     25: #include <sys/wait.h>
                     26: #include <signal.h>
                     27: #include <des.h>
                     28: #include <krb.h>
                     29: #include <krb_db.h>
                     30: 
                     31: #define TRUE 1
                     32: #define FALSE 0
                     33: 
                     34: static C_Block master_key;
                     35: static C_Block session_key;
                     36: static Key_schedule master_key_schedule;
                     37: char progname[] = "ext_srvtab";
                     38: char realm[REALM_SZ];
                     39: 
                     40: main(argc, argv)
                     41:   int argc;
                     42:   char *argv[];
                     43: {
                     44:     FILE *fout;
                     45:     char fname[1024];
                     46:     int fopen_errs = 0;
                     47:     int arg;
                     48:     Principal princs[40];
                     49:     int more; 
                     50:     int prompt = TRUE;
                     51:     register int n, i;
                     52:     
                     53:     bzero(realm, sizeof(realm));
                     54:     
                     55:     /* Parse commandline arguments */
                     56:     if (argc < 2)
                     57:        usage();
                     58:     else {
                     59:        for (i = 1; i < argc; i++) {
                     60:            if (strcmp(argv[i], "-n") == 0)
                     61:                prompt = FALSE;
                     62:            else if (strcmp(argv[i], "-r") == 0) {
                     63:                if (++i >= argc)
                     64:                    usage();
                     65:                else {
                     66:                    strcpy(realm, argv[i]);
                     67:                    /* 
                     68:                     * This is to humor the broken way commandline
                     69:                     * argument parsing is done.  Later, this
                     70:                     * program ignores everything that starts with -.
                     71:                     */
                     72:                    argv[i][0] = '-';
                     73:                }
                     74:            }
                     75:            else if (argv[i][0] == '-')
                     76:                usage();
                     77:            else
                     78:                if (!k_isinst(argv[i])) {
                     79:                fprintf(stderr, "%s: bad instance name: %s\n",
                     80:                        progname, argv[i]);
                     81:                usage();
                     82:            }
                     83:        }
                     84:     }
                     85: 
                     86:     if (kdb_get_master_key (prompt, master_key, master_key_schedule) != 0) {
                     87:       fprintf (stderr, "Couldn't read master key.\n");
                     88:       fflush (stderr);
                     89:       exit(1);
                     90:     }
                     91: 
                     92:     if (kdb_verify_master_key (master_key, master_key_schedule, stderr) < 0) {
                     93:       exit(1);
                     94:     }
                     95: 
                     96:     /* For each arg, search for instances of arg, and produce */
                     97:     /* srvtab file */
                     98:     if (!realm[0])
                     99:        if (krb_get_lrealm(realm, 1) != KSUCCESS) {
                    100:            fprintf(stderr, "%s: couldn't get local realm\n", progname);
                    101:            exit(1);
                    102:        }
                    103:     (void) umask(077);
                    104: 
                    105:     for (arg = 1; arg < argc; arg++) {
                    106:        if (argv[arg][0] == '-')
                    107:            continue;
                    108:        sprintf(fname, "%s-new-srvtab", argv[arg]);
                    109:        if ((fout = fopen(fname, "w")) == NULL) {
                    110:            fprintf(stderr, "Couldn't create file '%s'.\n", fname);
                    111:            fopen_errs++;
                    112:            continue;
                    113:        }
                    114:        printf("Generating '%s'....\n", fname);
                    115:        n = kerb_get_principal("*", argv[arg], &princs[0], 40, &more);
                    116:        if (more)
                    117:            fprintf(stderr, "More than 40 found...\n");
                    118:        for (i = 0; i < n; i++) {
                    119:            FWrite(princs[i].name, strlen(princs[i].name) + 1, 1, fout);
                    120:            FWrite(princs[i].instance, strlen(princs[i].instance) + 1,
                    121:                   1, fout);
                    122:            FWrite(realm, strlen(realm) + 1, 1, fout);
                    123:            FWrite(&princs[i].key_version,
                    124:                sizeof(princs[i].key_version), 1, fout);
                    125:            bcopy(&princs[i].key_low, session_key, sizeof(long));
                    126:            bcopy(&princs[i].key_high, session_key + sizeof(long),
                    127:                  sizeof(long));
                    128:            kdb_encrypt_key (session_key, session_key, 
                    129:                             master_key, master_key_schedule, DES_DECRYPT);
                    130:            FWrite(session_key, sizeof session_key, 1, fout);
                    131:        }
                    132:        fclose(fout);
                    133:     }
                    134: 
                    135:     StampOutSecrets();
                    136: 
                    137:     exit(fopen_errs);          /* 0 errors if successful */
                    138: 
                    139: }
                    140: 
                    141: Die()
                    142: {
                    143:     StampOutSecrets();
                    144:     exit(1);
                    145: }
                    146: 
                    147: FWrite(p, size, n, f)
                    148:   char   *p;
                    149:   int     size;
                    150:   int     n;
                    151:   FILE   *f;
                    152: {
                    153:     if (fwrite(p, size, n, f) != n) {
                    154:        printf("Error writing output file.  Terminating.\n");
                    155:        Die();
                    156:     }
                    157: }
                    158: 
                    159: StampOutSecrets()
                    160: {
                    161:     bzero(master_key, sizeof master_key);
                    162:     bzero(session_key, sizeof session_key);
                    163:     bzero(master_key_schedule, sizeof master_key_schedule);
                    164: }
                    165: 
                    166: usage()
                    167: {
                    168:     fprintf(stderr, 
                    169:            "Usage: %s [-n] [-r realm] instance [instance ...]\n", progname);
                    170:     exit(1);
                    171: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.