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

1.1       root        1: /*
                      2:  * $Source: /mit/kerberos/src/admin/RCS/kdb_init.c,v $
                      3:  * $Author: jtkohl $ 
                      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:  * program to initialize the database,  reports error if database file
                     11:  * already exists. 
                     12:  */
                     13: 
                     14: #ifndef        lint
                     15: static char rcsid_kdb_init_c[] =
                     16: "$Header: kdb_init.c,v 4.0 89/01/24 21:50:45 jtkohl Exp $";
                     17: #endif lint
                     18: 
                     19: #include <mit-copyright.h>
                     20: #include <stdio.h>
                     21: #include <sys/types.h>
                     22: #include <sys/file.h>
                     23: #include <sys/time.h>
                     24: #include <des.h>
                     25: #include <krb.h>
                     26: #include <krb_db.h>
                     27: #include <string.h>
                     28: 
                     29: #define        TRUE    1
                     30: 
                     31: enum ap_op {
                     32:     NULL_KEY,                  /* setup null keys */
                     33:     MASTER_KEY,                 /* use master key as new key */
                     34:     RANDOM_KEY,                        /* choose a random key */
                     35: };
                     36: 
                     37: int     debug = 0;
                     38: char   *progname, *rindex();
                     39: C_Block master_key;
                     40: Key_schedule master_key_schedule;
                     41: 
                     42: main(argc, argv)
                     43:     char   *argv[];
                     44: {
                     45:     char    realm[REALM_SZ];
                     46:     char   *cp;
                     47:     int code;
                     48:     extern char *sys_errlist[];
                     49:     char *database;
                     50:     
                     51:     progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
                     52: 
                     53:     if (argc > 3) {
                     54:        fprintf(stderr, "Usage: %s [realm-name] [database-name]\n", argv[0]);
                     55:        exit(1);
                     56:     }
                     57:     if (argc == 3) {
                     58:        database = argv[2];
                     59:        --argc;
                     60:     } else
                     61:        database = DBM_FILE;
                     62: 
                     63:     /* Do this first, it'll fail if the database exists */
                     64:     if ((code = kerb_db_create(database)) != 0) {
                     65:        fprintf(stderr, "Couldn't create database: %s\n",
                     66:                sys_errlist[code]);
                     67:        exit(1);
                     68:     }
                     69:     kerb_db_set_name(database);
                     70: 
                     71:     if (argc == 2)
                     72:        strncpy(realm, argv[1], REALM_SZ);
                     73:     else {
                     74:        fprintf(stderr, "Realm name [default  %s ]: ", KRB_REALM);
                     75:        if (fgets(realm, sizeof(realm), stdin) == NULL) {
                     76:            fprintf(stderr, "\nEOF reading realm\n");
                     77:            exit(1);
                     78:        }
                     79:        if (cp = index(realm, '\n'))
                     80:            *cp = '\0';
                     81:        if (!*realm)                    /* no realm given */
                     82:            strcpy(realm, KRB_REALM);
                     83:     }
                     84:     if (!k_isrealm(realm)) {
                     85:        fprintf(stderr, "%s: Bad kerberos realm name \"%s\"\n",
                     86:                progname, realm);
                     87:        exit(1);
                     88:     }
                     89:     printf("You will be prompted for the database Master Password.\n");
                     90:     printf("It is important that you NOT FORGET this password.\n");
                     91:     fflush(stdout);
                     92: 
                     93:     if (kdb_get_master_key (TRUE, master_key, master_key_schedule) != 0) {
                     94:       fprintf (stderr, "Couldn't read master key.\n");
                     95:       exit (-1);
                     96:     }
                     97: 
                     98:     if (
                     99:        add_principal(KERB_M_NAME, KERB_M_INST, MASTER_KEY) ||
                    100:        add_principal(KERB_DEFAULT_NAME, KERB_DEFAULT_INST, NULL_KEY) ||
                    101:        add_principal("krbtgt", realm, RANDOM_KEY) ||
                    102:        add_principal("changepw", KRB_MASTER, RANDOM_KEY) 
                    103:        ) {
                    104:        fprintf(stderr, "\n%s: couldn't initialize database.\n",
                    105:                progname);
                    106:        exit(1);
                    107:     }
                    108: 
                    109:     /* play it safe */
                    110:     bzero (master_key, sizeof (C_Block));
                    111:     bzero (master_key_schedule, sizeof (Key_schedule));
                    112:     exit(0);
                    113: }
                    114: 
                    115: /* use a return code to indicate success or failure.  check the return */
                    116: /* values of the routines called by this routine. */
                    117: 
                    118: add_principal(name, instance, aap_op)
                    119:     char   *name, *instance;
                    120:     enum ap_op aap_op;
                    121: {
                    122:     Principal principal;
                    123:     char    datestring[50];
                    124:     char    pw_str[255];
                    125:     void    read_pw_string();
                    126:     void    string_to_key();
                    127:     void    random_key();
                    128:     struct tm *tm, *localtime();
                    129:     C_Block new_key;
                    130: 
                    131:     bzero(&principal, sizeof(principal));
                    132:     strncpy(principal.name, name, ANAME_SZ);
                    133:     strncpy(principal.instance, instance, INST_SZ);
                    134:     switch (aap_op) {
                    135:     case NULL_KEY:
                    136:        principal.key_low = 0;
                    137:        principal.key_high = 0;
                    138:        break;
                    139:     case RANDOM_KEY:
                    140: #ifdef NOENCRYPTION
                    141:        bzero(new_key, sizeof(C_Block));
                    142:        new_key[0] = 127;
                    143: #else
                    144:        random_key(new_key);
                    145: #endif
                    146:        kdb_encrypt_key (new_key, new_key, master_key, master_key_schedule,
                    147:                         ENCRYPT);
                    148:        bcopy(new_key, &principal.key_low, 4);
                    149:        bcopy(((long *) new_key) + 1, &principal.key_high, 4);
                    150:        break;
                    151:     case MASTER_KEY:
                    152:        bcopy (master_key, new_key, sizeof (C_Block));
                    153:        kdb_encrypt_key (new_key, new_key, master_key, master_key_schedule,
                    154:                         ENCRYPT);
                    155:        bcopy(new_key, &principal.key_low, 4);
                    156:        bcopy(((long *) new_key) + 1, &principal.key_high, 4);
                    157:        break;
                    158:     }
                    159:     principal.exp_date = 946702799;    /* Happy new century */
                    160:     strncpy(principal.exp_date_txt, "12/31/99", DATE_SZ);
                    161:     principal.mod_date = time(0);
                    162: 
                    163:     tm = localtime(&principal.mod_date);
                    164:     principal.attributes = 0;
                    165:     principal.max_life = 255;
                    166: 
                    167:     principal.kdc_key_ver = 1;
                    168:     principal.key_version = 1;
                    169: 
                    170:     strncpy(principal.mod_name, "db_creation", ANAME_SZ);
                    171:     strncpy(principal.mod_instance, "", INST_SZ);
                    172:     principal.old = 0;
                    173: 
                    174:     kerb_db_put_principal(&principal, 1);
                    175:     
                    176:     /* let's play it safe */
                    177:     bzero (new_key, sizeof (C_Block));
                    178:     bzero (&principal.key_low, 4);
                    179:     bzero (&principal.key_high, 4);
                    180:     return 0;
                    181: }

unix.superglobalmegacorp.com

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