Annotation of 43BSDReno/kerberosIV/kdb_edit/kdb_edit.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * $Source: /mit/kerberos/src/admin/RCS/kdb_edit.c,v $
        !             3:  * $Author: jtkohl $
        !             4:  *
        !             5:  * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute
        !             6:  * of Technology.
        !             7:  *
        !             8:  * For copying and distribution information, please see the file
        !             9:  * <mit-copyright.h>.
        !            10:  *
        !            11:  * This routine changes the Kerberos encryption keys for principals,
        !            12:  * i.e., users or services. 
        !            13:  */
        !            14: 
        !            15: /*
        !            16:  * exit returns         0 ==> success -1 ==> error 
        !            17:  */
        !            18: 
        !            19: #ifndef        lint
        !            20: static char rcsid_kdb_edit_c[] =
        !            21: "$Header: kdb_edit.c,v 4.1 89/03/23 09:58:18 jtkohl Exp $";
        !            22: #endif lint
        !            23: 
        !            24: #include <mit-copyright.h>
        !            25: 
        !            26: #include <stdio.h>
        !            27: #include <signal.h>
        !            28: #include <errno.h>
        !            29: #include <strings.h>
        !            30: #include <sys/ioctl.h>
        !            31: #include <sys/file.h>
        !            32: #include "time.h"
        !            33: #include <des.h>
        !            34: #include <krb.h>
        !            35: #include <krb_db.h>
        !            36: /* MKEYFILE is now defined in kdc.h */
        !            37: #include <kdc.h>
        !            38: 
        !            39: extern char *errmsg();
        !            40: extern int errno;
        !            41: extern char *strcpy();
        !            42: 
        !            43: void    sig_exit();
        !            44: 
        !            45: char    prog[32];
        !            46: char   *progname = prog;
        !            47: int     nflag = 0;
        !            48: int     cflag;
        !            49: int     lflag;
        !            50: int     uflag;
        !            51: int     debug;
        !            52: extern  kerb_debug;
        !            53: extern char *sys_errlist[];
        !            54: 
        !            55: Key_schedule KS;
        !            56: C_Block new_key;
        !            57: unsigned char *input;
        !            58: 
        !            59: unsigned char *ivec;
        !            60: int     i, j;
        !            61: int     more;
        !            62: 
        !            63: char   *in_ptr;
        !            64: char    input_name[ANAME_SZ];
        !            65: char    input_instance[INST_SZ];
        !            66: char    input_string[ANAME_SZ];
        !            67: 
        !            68: #define        MAX_PRINCIPAL   10
        !            69: Principal principal_data[MAX_PRINCIPAL];
        !            70: 
        !            71: static Principal old_principal;
        !            72: static Principal default_princ;
        !            73: 
        !            74: static C_Block master_key;
        !            75: static C_Block session_key;
        !            76: static Key_schedule master_key_schedule;
        !            77: static char pw_str[255];
        !            78: static long master_key_version;
        !            79: 
        !            80: main(argc, argv)
        !            81:     int     argc;
        !            82:     char   *argv[];
        !            83: 
        !            84: {
        !            85:     /* Local Declarations */
        !            86: 
        !            87:     long    n;
        !            88: 
        !            89:     prog[sizeof prog - 1] = '\0';      /* make sure terminated */
        !            90:     strncpy(prog, argv[0], sizeof prog - 1);   /* salt away invoking
        !            91:                                                 * program */
        !            92: 
        !            93:     /* Assume a long is four bytes */
        !            94:     if (sizeof(long) != 4) {
        !            95:        fprintf(stdout, "%s: size of long is %d.\n", sizeof(long), prog);
        !            96:        exit(-1);
        !            97:     }
        !            98:     /* Assume <=32 signals */
        !            99:     if (NSIG > 32) {
        !           100:        fprintf(stderr, "%s: more than 32 signals defined.\n", prog);
        !           101:        exit(-1);
        !           102:     }
        !           103:     while (--argc > 0 && (*++argv)[0] == '-')
        !           104:        for (i = 1; argv[0][i] != '\0'; i++) {
        !           105:            switch (argv[0][i]) {
        !           106: 
        !           107:                /* debug flag */
        !           108:            case 'd':
        !           109:                debug = 1;
        !           110:                continue;
        !           111: 
        !           112:                /* debug flag */
        !           113:            case 'l':
        !           114:                kerb_debug |= 1;
        !           115:                continue;
        !           116: 
        !           117:            case 'n':           /* read MKEYFILE for master key */
        !           118:                nflag = 1;
        !           119:                continue;
        !           120: 
        !           121:            default:
        !           122:                fprintf(stderr, "%s: illegal flag \"%c\"\n",
        !           123:                        progname, argv[0][i]);
        !           124:                Usage();        /* Give message and die */
        !           125:            }
        !           126:        };
        !           127: 
        !           128:     fprintf(stdout, "Opening database...\n");
        !           129:     fflush(stdout);
        !           130:     kerb_init();
        !           131:     if (argc > 0) {
        !           132:        if (kerb_db_set_name(*argv) != 0) {
        !           133:            fprintf(stderr, "Could not open altername database name\n");
        !           134:            exit(1);
        !           135:        }
        !           136:     }
        !           137: 
        !           138: #ifdef notdef
        !           139:     no_core_dumps();           /* diddle signals to avoid core dumps! */
        !           140: 
        !           141:     /* ignore whatever is reasonable */
        !           142:     signal(SIGHUP, SIG_IGN);
        !           143:     signal(SIGINT, SIG_IGN);
        !           144:     signal(SIGTSTP, SIG_IGN);
        !           145: 
        !           146: #endif
        !           147: 
        !           148:     if (kdb_get_master_key ((nflag == 0), 
        !           149:                            master_key, master_key_schedule) != 0) {
        !           150:       fprintf (stdout, "Couldn't read master key.\n");
        !           151:       fflush (stdout);
        !           152:       exit (-1);
        !           153:     }
        !           154: 
        !           155:     if ((master_key_version = kdb_verify_master_key(master_key,
        !           156:                                                    master_key_schedule,
        !           157:                                                    stdout)) < 0)
        !           158:       exit (-1);
        !           159: 
        !           160:     /* lookup the default values */
        !           161:     n = kerb_get_principal(KERB_DEFAULT_NAME, KERB_DEFAULT_INST,
        !           162:                           &default_princ, 1, &more);
        !           163:     if (n != 1) {
        !           164:        fprintf(stderr,
        !           165:             "%s: Kerberos error on default value lookup, %d found.\n",
        !           166:                progname, n);
        !           167:        exit(-1);
        !           168:     }
        !           169:     fprintf(stdout, "Previous or default values are in [brackets] ,\n");
        !           170:     fprintf(stdout, "enter return to leave the same, or new value.\n");
        !           171: 
        !           172:     while (change_principal()) {
        !           173:     }
        !           174: 
        !           175:     cleanup();
        !           176: }
        !           177: 
        !           178: change_principal()
        !           179: {
        !           180:     static char temp[255];
        !           181:     int     creating = 0;
        !           182:     int     editpw = 0;
        !           183:     int     changed = 0;
        !           184:     long    temp_long;
        !           185:     int     n;
        !           186:     struct tm  *tp, edate, *localtime();
        !           187:     long       maketime();
        !           188: 
        !           189:     fprintf(stdout, "\nPrincipal name: ");
        !           190:     fflush(stdout);
        !           191:     if (!gets(input_name) || *input_name == '\0')
        !           192:        return 0;
        !           193:     fprintf(stdout, "Instance: ");
        !           194:     fflush(stdout);
        !           195:     /* instance can be null */
        !           196:     gets(input_instance);
        !           197:     j = kerb_get_principal(input_name, input_instance, principal_data,
        !           198:                           MAX_PRINCIPAL, &more);
        !           199:     if (!j) {
        !           200:        fprintf(stdout, "\n\07\07<Not found>, Create [y] ? ");
        !           201:        gets(temp);             /* Default case should work, it didn't */
        !           202:        if (temp[0] != 'y' && temp[0] != 'Y' && temp[0] != '\0')
        !           203:            return -1;
        !           204:        /* make a new principal, fill in defaults */
        !           205:        j = 1;
        !           206:        creating = 1;
        !           207:        strcpy(principal_data[0].name, input_name);
        !           208:        strcpy(principal_data[0].instance, input_instance);
        !           209:        principal_data[0].old = NULL;
        !           210:        principal_data[0].exp_date = default_princ.exp_date;
        !           211:        principal_data[0].max_life = default_princ.max_life;
        !           212:        principal_data[0].attributes = default_princ.attributes;
        !           213:        principal_data[0].kdc_key_ver = (unsigned char) master_key_version;
        !           214:        principal_data[0].key_version = 0; /* bumped up later */
        !           215:     }
        !           216:     tp = localtime(&principal_data[0].exp_date);
        !           217:     (void) sprintf(principal_data[0].exp_date_txt, "%4d-%02d-%02d",
        !           218:                   tp->tm_year > 1900 ? tp->tm_year : tp->tm_year + 1900,
        !           219:                   tp->tm_mon + 1, tp->tm_mday); /* January is 0, not 1 */
        !           220:     for (i = 0; i < j; i++) {
        !           221:        for (;;) {
        !           222:            fprintf(stdout,
        !           223:                    "\nPrincipal: %s, Instance: %s, kdc_key_ver: %d",
        !           224:                    principal_data[i].name, principal_data[i].instance,
        !           225:                    principal_data[i].kdc_key_ver);
        !           226:            editpw = 1;
        !           227:            changed = 0;
        !           228:            if (!creating) {
        !           229:                /*
        !           230:                 * copy the existing data so we can use the old values
        !           231:                 * for the qualifier clause of the replace 
        !           232:                 */
        !           233:                principal_data[i].old = (char *) &old_principal;
        !           234:                bcopy(&principal_data[i], &old_principal,
        !           235:                      sizeof(old_principal));
        !           236:                printf("\nChange password [n] ? ");
        !           237:                gets(temp);
        !           238:                if (strcmp("y", temp) && strcmp("Y", temp))
        !           239:                    editpw = 0;
        !           240:            }
        !           241:            /* password */
        !           242:            if (editpw) {
        !           243: #ifdef NOENCRYPTION
        !           244:                placebo_read_pw_string(pw_str, sizeof pw_str,
        !           245:                    "\nNew Password: ", TRUE);
        !           246: #else
        !           247:                des_read_pw_string(pw_str, sizeof pw_str,
        !           248:                    "\nNew Password: ", TRUE);
        !           249: #endif
        !           250:                if (!strcmp(pw_str, "RANDOM")) {
        !           251:                    printf("\nRandom password [y] ? ");
        !           252:                    gets(temp);
        !           253:                    if (!strcmp("n", temp) || !strcmp("N", temp)) {
        !           254:                        /* no, use literal */
        !           255: #ifdef NOENCRYPTION
        !           256:                        bzero(new_key, sizeof(C_Block));
        !           257:                        new_key[0] = 127;
        !           258: #else
        !           259:                        string_to_key(pw_str, new_key);
        !           260: #endif
        !           261:                        bzero(pw_str, sizeof pw_str);   /* "RANDOM" */
        !           262:                    } else {
        !           263: #ifdef NOENCRYPTION
        !           264:                        bzero(new_key, sizeof(C_Block));
        !           265:                        new_key[0] = 127;
        !           266: #else
        !           267:                        random_key(new_key);    /* yes, random */
        !           268: #endif
        !           269:                        bzero(pw_str, sizeof pw_str);
        !           270:                    }
        !           271:                } else if (!strcmp(pw_str, "NULL")) {
        !           272:                    printf("\nNull Key [y] ? ");
        !           273:                    gets(temp);
        !           274:                    if (!strcmp("n", temp) || !strcmp("N", temp)) {
        !           275:                        /* no, use literal */
        !           276: #ifdef NOENCRYPTION
        !           277:                        bzero(new_key, sizeof(C_Block));
        !           278:                        new_key[0] = 127;
        !           279: #else
        !           280:                        string_to_key(pw_str, new_key);
        !           281: #endif
        !           282:                        bzero(pw_str, sizeof pw_str);   /* "NULL" */
        !           283:                    } else {
        !           284: 
        !           285:                        principal_data[i].key_low = 0;
        !           286:                        principal_data[i].key_high = 0;
        !           287:                        goto null_key;
        !           288:                    }
        !           289:                } else {
        !           290: #ifdef NOENCRYPTION
        !           291:                    bzero(new_key, sizeof(C_Block));
        !           292:                    new_key[0] = 127;
        !           293: #else
        !           294:                    string_to_key(pw_str, new_key);
        !           295: #endif
        !           296:                    bzero(pw_str, sizeof pw_str);
        !           297:                }
        !           298: 
        !           299:                /* seal it under the kerberos master key */
        !           300:                kdb_encrypt_key (new_key, new_key, 
        !           301:                                 master_key, master_key_schedule,
        !           302:                                 ENCRYPT);
        !           303:                bcopy(new_key, &principal_data[i].key_low, 4);
        !           304:                bcopy(((long *) new_key) + 1,
        !           305:                    &principal_data[i].key_high, 4);
        !           306:                bzero(new_key, sizeof(new_key));
        !           307:        null_key:
        !           308:                /* set master key version */
        !           309:                principal_data[i].kdc_key_ver =
        !           310:                    (unsigned char) master_key_version;
        !           311:                /* bump key version # */
        !           312:                principal_data[i].key_version++;
        !           313:                fprintf(stdout,
        !           314:                        "\nPrincipal's new key version = %d\n",
        !           315:                        principal_data[i].key_version);
        !           316:                fflush(stdout);
        !           317:                changed = 1;
        !           318:            }
        !           319:            /* expiration date */
        !           320:            fprintf(stdout, "Expiration date (enter yyyy-mm-dd) [ %s ] ? ",
        !           321:                    principal_data[i].exp_date_txt);
        !           322:            zaptime(&edate);
        !           323:            while (gets(temp) && ((n = strlen(temp)) >
        !           324:                                  sizeof(principal_data[0].exp_date_txt))) {
        !           325:            bad_date:
        !           326:                fprintf(stdout, "\07\07Date Invalid\n");
        !           327:                fprintf(stdout,
        !           328:                        "Expiration date (enter yyyy-mm-dd) [ %s ] ? ",
        !           329:                        principal_data[i].exp_date_txt);
        !           330:                zaptime(&edate);
        !           331:            }
        !           332: 
        !           333:            if (*temp) {
        !           334:                if (sscanf(temp, "%d-%d-%d", &edate.tm_year,
        !           335:                              &edate.tm_mon, &edate.tm_mday) != 3)
        !           336:                    goto bad_date;
        !           337:                (void) strcpy(principal_data[i].exp_date_txt, temp);
        !           338:                edate.tm_mon--;         /* January is 0, not 1 */
        !           339:                edate.tm_hour = 23;     /* nearly midnight at the end of the */
        !           340:                edate.tm_min = 59;      /* specified day */
        !           341:                edate.tm_zon = 1;       /* local time, not GMT */
        !           342:                if (!(principal_data[i].exp_date = maketime(&edate)))
        !           343:                    goto bad_date;
        !           344:                changed = 1;
        !           345:            }
        !           346: 
        !           347:            /* maximum lifetime */
        !           348:            fprintf(stdout, "Max ticket lifetime (*5 minutes) [ %d ] ? ",
        !           349:                    principal_data[i].max_life);
        !           350:            while (gets(temp) && *temp) {
        !           351:                if (sscanf(temp, "%d", &temp_long) != 1)
        !           352:                    goto bad_life;
        !           353:                if (temp_long > 255 || (temp_long < 0)) {
        !           354:                bad_life:
        !           355:                    fprintf(stdout, "\07\07Invalid, choose 0-255\n");
        !           356:                    fprintf(stdout,
        !           357:                            "Max ticket lifetime (*5 minutes) [ %d ] ? ",
        !           358:                            principal_data[i].max_life);
        !           359:                    continue;
        !           360:                }
        !           361:                changed = 1;
        !           362:                /* dont clobber */
        !           363:                principal_data[i].max_life = (unsigned short) temp_long;
        !           364:                break;
        !           365:            }
        !           366: 
        !           367:            /* attributes */
        !           368:            fprintf(stdout, "Attributes [ %d ] ? ",
        !           369:                    principal_data[i].attributes);
        !           370:            while (gets(temp) && *temp) {
        !           371:                if (sscanf(temp, "%d", &temp_long) != 1)
        !           372:                    goto bad_att;
        !           373:                if (temp_long > 65535 || (temp_long < 0)) {
        !           374:                bad_att:
        !           375:                    fprintf(stdout, "\07\07Invalid, choose 0-65535\n");
        !           376:                    fprintf(stdout, "Attributes [ %d ] ? ",
        !           377:                            principal_data[i].attributes);
        !           378:                    continue;
        !           379:                }
        !           380:                changed = 1;
        !           381:                /* dont clobber */
        !           382:                principal_data[i].attributes =
        !           383:                    (unsigned short) temp_long;
        !           384:                break;
        !           385:            }
        !           386: 
        !           387:            /*
        !           388:             * remaining fields -- key versions and mod info, should
        !           389:             * not be directly manipulated 
        !           390:             */
        !           391:            if (changed) {
        !           392:                if (kerb_put_principal(&principal_data[i], 1)) {
        !           393:                    fprintf(stdout,
        !           394:                        "\nError updating Kerberos database");
        !           395:                } else {
        !           396:                    fprintf(stdout, "Edit O.K.");
        !           397:                }
        !           398:            } else {
        !           399:                fprintf(stdout, "Unchanged");
        !           400:            }
        !           401: 
        !           402: 
        !           403:            bzero(&principal_data[i].key_low, 4);
        !           404:            bzero(&principal_data[i].key_high, 4);
        !           405:            fflush(stdout);
        !           406:            break;
        !           407:        }
        !           408:     }
        !           409:     if (more) {
        !           410:        fprintf(stdout, "\nThere were more tuples found ");
        !           411:        fprintf(stdout, "than there were space for");
        !           412:       }
        !           413:     return 1;
        !           414: }
        !           415: 
        !           416: 
        !           417: no_core_dumps()
        !           418: {
        !           419: 
        !           420:     signal(SIGQUIT, sig_exit);
        !           421:     signal(SIGILL, sig_exit);
        !           422:     signal(SIGTRAP, sig_exit);
        !           423:     signal(SIGIOT, sig_exit);
        !           424:     signal(SIGEMT, sig_exit);
        !           425:     signal(SIGFPE, sig_exit);
        !           426:     signal(SIGBUS, sig_exit);
        !           427:     signal(SIGSEGV, sig_exit);
        !           428:     signal(SIGSYS, sig_exit);
        !           429: }
        !           430: 
        !           431: void
        !           432: sig_exit(sig, code, scp)
        !           433:     int     sig, code;
        !           434:     struct sigcontext *scp;
        !           435: {
        !           436:     cleanup();
        !           437:     fprintf(stderr,
        !           438:        "\nSignal caught, sig = %d code = %d old pc = 0x%X \nexiting",
        !           439:         sig, code, scp->sc_pc);
        !           440:     exit(-1);
        !           441: }
        !           442: 
        !           443: 
        !           444: cleanup()
        !           445: {
        !           446: 
        !           447:     bzero(master_key, sizeof(master_key));
        !           448:     bzero(session_key, sizeof(session_key));
        !           449:     bzero(master_key_schedule, sizeof(master_key_schedule));
        !           450:     bzero(principal_data, sizeof(principal_data));
        !           451:     bzero(new_key, sizeof(new_key));
        !           452:     bzero(pw_str, sizeof(pw_str));
        !           453: }
        !           454: Usage()
        !           455: {
        !           456:     fprintf(stderr, "Usage: %s [-n]\n", progname);
        !           457:     exit(1);
        !           458: }
        !           459: 
        !           460: /* zaptime code taken from: */
        !           461: /*
        !           462:  * PARTIME             parse date/time string into a TM structure
        !           463:  *
        !           464:  * Usage:
        !           465:  *      #include "time.h"             -- expanded tm structure
        !           466:  *     char *str; struct tm *tp;
        !           467:  *     partime(str,tp);
        !           468:  * Returns:
        !           469:  *     0 if parsing failed
        !           470:  *     else time values in specified TM structure (unspecified values
        !           471:  *             set to TMNULL)
        !           472:  * Notes:
        !           473:  *     This code is quasi-public; it may be used freely in like software.
        !           474:  *     It is not to be sold, nor used in licensed software without
        !           475:  *     permission of the author.
        !           476:  *     For everyone's benefit, please report bugs and improvements!
        !           477:  *     Copyright 1980 by Ken Harrenstien, SRI International.
        !           478:  *     (ARPANET: KLH @ SRI)
        !           479:  */
        !           480: 
        !           481: zaptime(atm)
        !           482: register struct tm *atm;
        !           483: /* clears atm */
        !           484: {
        !           485:        atm->tm_sec = TMNULL;
        !           486:        atm->tm_min = TMNULL;
        !           487:        atm->tm_hour = TMNULL;
        !           488:        atm->tm_mday = TMNULL;
        !           489:        atm->tm_mon = TMNULL;
        !           490:        atm->tm_year = TMNULL;
        !           491:        atm->tm_wday = TMNULL;
        !           492:        atm->tm_yday = TMNULL;
        !           493:        atm->tm_isdst = TMNULL;
        !           494:        atm->tm_zon = TMNULL;
        !           495:        atm->tm_ampm = TMNULL;
        !           496: }

unix.superglobalmegacorp.com

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