|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.