Annotation of 43BSDReno/kerberosIV/krb/get_in_tkt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *
        !             3:  * $Source: /usr/src/kerberosIV/krb/RCS/get_in_tkt.c,v $
        !             4:  * $Author: kfall $
        !             5:  *
        !             6:  * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
        !             7:  *
        !             8:  * For copying and distribution information, please see the file
        !             9:  * <mit-copyright.h>.
        !            10:  */
        !            11: 
        !            12: #ifndef lint
        !            13: static char rcsid_get_in_tkt_c[] =
        !            14: "$Header: /usr/src/kerberosIV/krb/RCS/get_in_tkt.c,v 4.13 90/06/23 03:10:32 kfall Exp $";
        !            15: #endif /* lint */
        !            16: 
        !            17: #include <mit-copyright.h>
        !            18: #include <des.h>
        !            19: #include <krb.h>
        !            20: #include <prot.h>
        !            21: 
        !            22: #ifndef NULL
        !            23: #define NULL 0
        !            24: #endif
        !            25: 
        !            26: /*
        !            27:  * This file contains two routines: passwd_to_key() converts
        !            28:  * a password into a DES key (prompting for the password if
        !            29:  * not supplied), and krb_get_pw_in_tkt() gets an initial ticket for
        !            30:  * a user.
        !            31:  */
        !            32: 
        !            33: /*
        !            34:  * passwd_to_key(): given a password, return a DES key.
        !            35:  * There are extra arguments here which (used to be?)
        !            36:  * used by srvtab_to_key().
        !            37:  *
        !            38:  * If the "passwd" argument is not null, generate a DES
        !            39:  * key from it, using string_to_key().
        !            40:  *
        !            41:  * If the "passwd" argument is null, call des_read_password()
        !            42:  * to prompt for a password and then convert it into a DES key.
        !            43:  *
        !            44:  * In either case, the resulting key is put in the "key" argument,
        !            45:  * and 0 is returned.
        !            46:  */
        !            47: 
        !            48: /*ARGSUSED */
        !            49: static int passwd_to_key(user,instance,realm,passwd,key)
        !            50:     char *user, *instance, *realm, *passwd;
        !            51:     C_Block key;
        !            52: {
        !            53: #ifdef NOENCRYPTION
        !            54:     if (!passwd)
        !            55:        placebo_read_password(key, "Password: ", 0);
        !            56: #else /* Do encyryption */
        !            57:     if (passwd)
        !            58:         string_to_key(passwd, key);
        !            59:     else {
        !            60:         des_read_password(key, "Kerberos Password: ", 0);
        !            61:     }
        !            62: #endif /* NOENCRYPTION */
        !            63:     return (0);
        !            64: }
        !            65: 
        !            66: /*
        !            67:  * krb_get_pw_in_tkt() takes the name of the server for which the initial
        !            68:  * ticket is to be obtained, the name of the principal the ticket is
        !            69:  * for, the desired lifetime of the ticket, and the user's password.
        !            70:  * It passes its arguments on to krb_get_in_tkt(), which contacts
        !            71:  * Kerberos to get the ticket, decrypts it using the password provided,
        !            72:  * and stores it away for future use.
        !            73:  *
        !            74:  * krb_get_pw_in_tkt() passes two additional arguments to krb_get_in_tkt():
        !            75:  * the name of a routine (passwd_to_key()) to be used to get the
        !            76:  * password in case the "password" argument is null and NULL for the
        !            77:  * decryption procedure indicating that krb_get_in_tkt should use the 
        !            78:  * default method of decrypting the response from the KDC.
        !            79:  *
        !            80:  * The result of the call to krb_get_in_tkt() is returned.
        !            81:  */
        !            82: 
        !            83: krb_get_pw_in_tkt(user,instance,realm,service,sinstance,life,password)
        !            84:     char *user, *instance, *realm, *service, *sinstance;
        !            85:     int life;
        !            86:     char *password;
        !            87: {
        !            88:     return(krb_get_in_tkt(user,instance,realm,service,sinstance,life,
        !            89:                           passwd_to_key, NULL, password));
        !            90: }
        !            91: 
        !            92: #ifdef NOENCRYPTION
        !            93: /*
        !            94:  * $Source: /usr/src/kerberosIV/krb/RCS/get_in_tkt.c,v $
        !            95:  * $Author: kfall $
        !            96:  *
        !            97:  * Copyright 1985, 1986, 1987, 1988 by the Massachusetts Institute
        !            98:  * of Technology.
        !            99:  *
        !           100:  * For copying and distribution information, please see the file
        !           101:  * <mit-copyright.h>.
        !           102:  *
        !           103:  * This routine prints the supplied string to standard
        !           104:  * output as a prompt, and reads a password string without
        !           105:  * echoing.
        !           106:  */
        !           107: 
        !           108: #ifndef        lint
        !           109: static char rcsid_read_password_c[] =
        !           110: "$Header: /usr/src/kerberosIV/krb/RCS/get_in_tkt.c,v 4.13 90/06/23 03:10:32 kfall Exp $";
        !           111: #endif lint
        !           112: 
        !           113: #include <des.h>
        !           114: #include "conf.h"
        !           115: 
        !           116: #include <stdio.h>
        !           117: #ifdef BSDUNIX
        !           118: #include <strings.h>
        !           119: #include <sys/ioctl.h>
        !           120: #include <signal.h>
        !           121: #include <setjmp.h>
        !           122: #else
        !           123: char     *strcpy();
        !           124: int      strcmp();
        !           125: #endif
        !           126: 
        !           127: #ifdef BSDUNIX
        !           128: static jmp_buf env;
        !           129: #endif
        !           130: 
        !           131: #ifdef BSDUNIX
        !           132: static void sig_restore();
        !           133: static push_signals(), pop_signals();
        !           134: int placebo_read_pw_string();
        !           135: #endif
        !           136: 
        !           137: /*** Routines ****************************************************** */
        !           138: int
        !           139: placebo_read_password(k,prompt,verify)
        !           140:     des_cblock *k;
        !           141:     char *prompt;
        !           142:     int        verify;
        !           143: {
        !           144:     int ok;
        !           145:     char key_string[BUFSIZ];
        !           146: 
        !           147: #ifdef BSDUNIX
        !           148:     if (setjmp(env)) {
        !           149:        ok = -1;
        !           150:        goto lose;
        !           151:     }
        !           152: #endif
        !           153: 
        !           154:     ok = placebo_read_pw_string(key_string, BUFSIZ, prompt, verify);
        !           155:     if (ok == 0)
        !           156:        bzero(k, sizeof(C_Block));
        !           157: 
        !           158: lose:
        !           159:     bzero(key_string, sizeof (key_string));
        !           160:     return ok;
        !           161: }
        !           162: 
        !           163: /*
        !           164:  * This version just returns the string, doesn't map to key.
        !           165:  *
        !           166:  * Returns 0 on success, non-zero on failure.
        !           167:  */
        !           168: 
        !           169: int
        !           170: placebo_read_pw_string(s,max,prompt,verify)
        !           171:     char *s;
        !           172:     int        max;
        !           173:     char *prompt;
        !           174:     int        verify;
        !           175: {
        !           176:     int ok = 0;
        !           177:     char *ptr;
        !           178:     
        !           179: #ifdef BSDUNIX
        !           180:     jmp_buf old_env;
        !           181:     struct sgttyb tty_state;
        !           182: #endif
        !           183:     char key_string[BUFSIZ];
        !           184: 
        !           185:     if (max > BUFSIZ) {
        !           186:        return -1;
        !           187:     }
        !           188: 
        !           189: #ifdef BSDUNIX
        !           190:     bcopy(old_env, env, sizeof(env));
        !           191:     if (setjmp(env))
        !           192:        goto lose;
        !           193: 
        !           194:     /* save terminal state*/
        !           195:     if (ioctl(0,TIOCGETP,&tty_state) == -1) 
        !           196:        return -1;
        !           197: 
        !           198:     push_signals();
        !           199:     /* Turn off echo */
        !           200:     tty_state.sg_flags &= ~ECHO;
        !           201:     if (ioctl(0,TIOCSETP,&tty_state) == -1)
        !           202:        return -1;
        !           203: #endif
        !           204:     while (!ok) {
        !           205:        printf(prompt);
        !           206:        fflush(stdout);
        !           207: #ifdef CROSSMSDOS
        !           208:        h19line(s,sizeof(s),0);
        !           209:        if (!strlen(s))
        !           210:            continue;
        !           211: #else
        !           212:        if (!fgets(s, max, stdin)) {
        !           213:            clearerr(stdin);
        !           214:            continue;
        !           215:        }
        !           216:        if ((ptr = index(s, '\n')))
        !           217:            *ptr = '\0';
        !           218: #endif
        !           219:        if (verify) {
        !           220:            printf("\nVerifying, please re-enter %s",prompt);
        !           221:            fflush(stdout);
        !           222: #ifdef CROSSMSDOS
        !           223:            h19line(key_string,sizeof(key_string),0);
        !           224:            if (!strlen(key_string))
        !           225:                continue;
        !           226: #else
        !           227:            if (!fgets(key_string, sizeof(key_string), stdin)) {
        !           228:                clearerr(stdin);
        !           229:                continue;
        !           230:            }
        !           231:             if ((ptr = index(key_string, '\n')))
        !           232:            *ptr = '\0';
        !           233: #endif
        !           234:            if (strcmp(s,key_string)) {
        !           235:                printf("\n\07\07Mismatch - try again\n");
        !           236:                fflush(stdout);
        !           237:                continue;
        !           238:            }
        !           239:        }
        !           240:        ok = 1;
        !           241:     }
        !           242: 
        !           243: #ifdef BSDUNIX
        !           244: lose:
        !           245:     if (!ok)
        !           246:        bzero(s, max);
        !           247:     printf("\n");
        !           248:     /* turn echo back on */
        !           249:     tty_state.sg_flags |= ECHO;
        !           250:     if (ioctl(0,TIOCSETP,&tty_state))
        !           251:        ok = 0;
        !           252:     pop_signals();
        !           253:     bcopy(env, old_env, sizeof(env));
        !           254: #endif
        !           255:     if (verify)
        !           256:        bzero(key_string, sizeof (key_string));
        !           257:     s[max-1] = 0;              /* force termination */
        !           258:     return !ok;                        /* return nonzero if not okay */
        !           259: }
        !           260: 
        !           261: #ifdef BSDUNIX
        !           262: /*
        !           263:  * this can be static since we should never have more than
        !           264:  * one set saved....
        !           265:  */
        !           266: #ifdef POSIX
        !           267: static void (*old_sigfunc[NSIG])();
        !           268: #else
        !           269: static int (*old_sigfunc[NSIG])();
        !           270: #endif POSIX
        !           271: 
        !           272: static push_signals()
        !           273: {
        !           274:     register i;
        !           275:     for (i = 0; i < NSIG; i++)
        !           276:        old_sigfunc[i] = signal(i,sig_restore);
        !           277: }
        !           278: 
        !           279: static pop_signals()
        !           280: {
        !           281:     register i;
        !           282:     for (i = 0; i < NSIG; i++)
        !           283:        signal(i,old_sigfunc[i]);
        !           284: }
        !           285: 
        !           286: static void sig_restore(sig,code,scp)
        !           287:     int sig,code;
        !           288:     struct sigcontext *scp;
        !           289: {
        !           290:     longjmp(env,1);
        !           291: }
        !           292: #endif
        !           293: #endif /* NOENCRYPTION */

unix.superglobalmegacorp.com

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