Annotation of 43BSDReno/old/athena/kpasswd/kpasswd.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*
                      3:  * Copyright (c) 1989 The Regents of the University of California.
                      4:  * All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms are permitted
                      7:  * provided that the above copyright notice and this paragraph are
                      8:  * duplicated in all such forms and that any documentation,
                      9:  * advertising materials, and other materials related to such
                     10:  * distribution and use acknowledge that the software was developed
                     11:  * by the University of California, Berkeley.  The name of the
                     12:  * University may not be used to endorse or promote products derived
                     13:  * from this software without specific prior written permission.
                     14:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     15:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     16:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     17:  */
                     18: 
                     19: #ifndef lint
                     20: static char sccsid[] = "@(#)kpasswd.c  1.2 (Berkeley) 5/17/89";
                     21: #endif /* not lint */
                     22: 
                     23: /*
                     24:  * kpasswd - client program to update Kerberos password
                     25:  *
                     26:  * K. Fall
                     27:  * 12-Dec-88
                     28:  */
                     29: 
                     30: #include <stdio.h>
                     31: #include <sys/types.h>
                     32: #include <sys/time.h>
                     33: #include <sys/resource.h>
                     34: #include <sys/socket.h>
                     35: #include <sys/signal.h>
                     36: #include <netinet/in.h>
                     37: #include <netdb.h>
                     38: #include <kerberos/krb.h>
                     39: #include "kpasswd_proto.h"
                     40: 
                     41: KTEXT_ST       ticket;
                     42: long           authopts = 0L;
                     43: Key_schedule   random_schedule;
                     44: char           realm[REALM_SZ], krbhst[MAX_HSTNM];
                     45: static         struct  kpasswd_data    proto_data;
                     46: static         C_Block         okey;
                     47: static         Key_schedule    osched;
                     48: static struct timeval  timeout = { CLIENT_KRB_TIMEOUT, 0 };
                     49: int            sock;
                     50: char           *getpass();
                     51: int            sock;
                     52: 
                     53: int            finish();
                     54: 
                     55: #define                PROTO   "tcp"
                     56: 
                     57: main(argc, argv)
                     58: int    argc;
                     59: char   **argv;
                     60: {
                     61:        struct servent  *se;
                     62:        struct hostent  *host;
                     63:        struct sockaddr_in      sin;
                     64:        int             rval;
                     65:        char            password[255], *pass;
                     66:        fd_set          readfds;
                     67: 
                     68:        static struct   rlimit rl = { 0, 0 };
                     69: 
                     70:        signal(SIGHUP, SIG_IGN);
                     71:        signal(SIGINT, SIG_IGN);
                     72:        signal(SIGTSTP, SIG_IGN);
                     73: 
                     74:        if(setrlimit(RLIMIT_CORE, &rl) < 0) {
                     75:                perror("setrlimit");
                     76:                exit(1);
                     77:        }
                     78: 
                     79:        if((se = getservbyname(SERVICE, PROTO)) == NULL) {
                     80:                fprintf(stderr, "couldn't find entry for service %s/%s\n",
                     81:                        SERVICE, PROTO);
                     82:                exit(1);
                     83:        }
                     84:        if((rval = krb_get_lrealm(realm,1)) != KSUCCESS) {
                     85:                fprintf(stderr, "couldn't get local Kerberos realm: %s\n",
                     86:                        krb_err_txt[rval]);
                     87:                exit(1);
                     88:        }
                     89: 
                     90:        if((rval = krb_get_krbhst(krbhst, realm, 1)) != KSUCCESS) {
                     91:                fprintf(stderr, "couldn't get Kerberos host: %s\n",
                     92:                        krb_err_txt[rval]);
                     93:                exit(1);
                     94:        }
                     95: 
                     96:        if((host = gethostbyname(krbhst)) == NULL) {
                     97:                fprintf(stderr, "couldn't get host entry for host %s\n",
                     98:                        krbhst);
                     99:                exit(1);
                    100:        }
                    101: 
                    102:        sin.sin_family = host->h_addrtype;
                    103:        bcopy(host->h_addr, (char *) &sin.sin_addr, host->h_length);
                    104:        sin.sin_port = se->s_port;
                    105: 
                    106:        if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
                    107:                perror("socket");
                    108:                exit(1);
                    109:        }
                    110: 
                    111:        if(connect(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
                    112:                perror("connect");
                    113:                close(sock);
                    114:                exit(1);
                    115:        }
                    116: 
                    117:        rval = krb_sendauth(
                    118:                authopts,               /* NOT mutual */
                    119:                sock,
                    120:                &ticket,                /* (filled in) */
                    121:                SERVICE,
                    122:                krbhst,                 /* instance (krbhst) */
                    123:                realm,                  /* dest realm */
                    124:                (u_long) getpid(),      /* checksum */
                    125:                NULL,                   /* msg data */
                    126:                NULL,                   /* credentials */ 
                    127:                NULL,                   /* schedule */
                    128:                NULL,                   /* local addr */
                    129:                NULL,                   /* foreign addr */
                    130:                "KPWDV0.1"
                    131:        );
                    132: 
                    133:        if(rval != KSUCCESS) {
                    134:                fprintf(stderr, "Kerberos sendauth error: %s\n",
                    135:                        krb_err_txt[rval]);
                    136:                exit(1);
                    137:        }
                    138: 
                    139:        pass = getpass("Old Kerberos password:");
                    140:        string_to_key(pass, okey);
                    141:        key_sched(okey, osched);
                    142:        des_set_key(okey, osched);
                    143: 
                    144:        /* wait on the verification string */
                    145: 
                    146:        FD_ZERO(&readfds);
                    147:        FD_SET(sock, &readfds);
                    148: 
                    149:        rval =
                    150:          select(sock + 1, &readfds, (fd_set *) 0, (fd_set *) 0, &timeout);
                    151:        if((rval < 1) || !FD_ISSET(sock, &readfds)) {
                    152:                if(rval == 0) {
                    153:                        fprintf(stderr, "Timed out\n");
                    154:                        cleanup();
                    155:                        exit(1);
                    156:                }
                    157:                fprintf(stderr, "select failed\n");
                    158:                cleanup();
                    159:                exit(1);
                    160:        }
                    161: 
                    162:        /* read verification string */
                    163: 
                    164:        if(des_read(sock, &proto_data, sizeof(proto_data)) != sizeof(proto_data)) {
                    165:                fprintf(stderr,
                    166:                    "%s: couldn't read verification string (aborted)\n",
                    167:                    argv[0]
                    168:                );
                    169: 
                    170:                cleanup();
                    171:                exit(1);
                    172:        }
                    173: 
                    174:        signal(SIGHUP, finish);
                    175:        signal(SIGINT, finish);
                    176: 
                    177:        if(strcmp(SECURE_STRING, proto_data.secure_msg)) {
                    178:                cleanup();
                    179:                fprintf(stderr, "Sorry.\n");
                    180:                exit(1);
                    181:        }
                    182:        key_sched(proto_data.random_key, random_schedule);
                    183:        des_set_key(proto_data.random_key, random_schedule);
                    184:        pass = getpass("New Kerberos password:");
                    185:        strcpy(password, pass);
                    186:        pass = getpass("Retype new Kerberos password:");
                    187:        if(strcmp(password, pass)) {
                    188:                fprintf(stderr, "Password mismatch (aborted)\n");
                    189:                cleanup();
                    190:                exit(1);
                    191:        }
                    192:        send_update(sock, password, SECURE_STRING);
                    193: 
                    194:        /* wait for ACK */
                    195: 
                    196:        FD_ZERO(&readfds);
                    197:        FD_SET(sock, &readfds);
                    198: 
                    199:        rval =
                    200:          select(sock + 1, &readfds, (fd_set *) 0, (fd_set *) 0, &timeout);
                    201:        if((rval < 1) || !FD_ISSET(sock, &readfds)) {
                    202:                if(rval == 0) {
                    203:                        fprintf(stderr, "Timed out reading ACK\n");
                    204:                        cleanup();
                    205:                        exit(1);
                    206:                }
                    207:                fprintf(stderr, "select failed\n");
                    208:                cleanup();
                    209:                exit(1);
                    210:        }
                    211: 
                    212:        recv_ack(sock);
                    213:        cleanup();
                    214:        exit(0);
                    215: }
                    216: 
                    217: send_update(dest, pwd, str)
                    218:        int     dest;
                    219:        char    *pwd, *str;
                    220: {
                    221:        static struct   update_data     ud;
                    222:        strncpy(ud.secure_msg, str, MSGSIZE);
                    223:        strncpy(ud.pw, pwd, sizeof(ud.pw));
                    224:        if(des_write(dest, &ud, sizeof(ud)) != sizeof(ud)) {
                    225:                fprintf(stderr, "couldn't write pw update (abort)\n");
                    226:                bzero(ud, sizeof(ud));
                    227:                cleanup();
                    228:                exit(1);
                    229:        }
                    230: }
                    231: 
                    232: recv_ack(remote)
                    233:        int     remote;
                    234: {
                    235:        int     cc;
                    236:        char    buf[BUFSIZ];
                    237:        cc = des_read(remote, buf, sizeof(buf));
                    238:        if(cc <= 0) {
                    239:                fprintf(stderr, "error reading acknowledgement\n");
                    240:                cleanup();
                    241:                exit(1);
                    242:        }
                    243:        printf("%s", buf);
                    244: }
                    245: 
                    246: cleanup()
                    247: {
                    248:        bzero(&proto_data, sizeof(proto_data));
                    249:        bzero(okey, sizeof(okey));
                    250:        bzero(osched, sizeof(osched));
                    251:        bzero(random_schedule, sizeof(random_schedule));
                    252: }
                    253: 
                    254: finish()
                    255: {
                    256:        close(sock);
                    257:        exit(1);
                    258: }

unix.superglobalmegacorp.com

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