Annotation of 43BSDReno/kerberosIV/registerd/registerd.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[] = "@(#)registerd.c        1.7 (Berkeley) 5/11/90";
                     21: #endif /* not lint */
                     22: 
                     23: #include <sys/types.h>
                     24: #include <sys/time.h>
                     25: #include <sys/signal.h>
                     26: #include <sys/resource.h>
                     27: #include <sys/param.h>
                     28: #include <sys/file.h>
                     29: #include <netinet/in.h>
                     30: #include <stdio.h>
                     31: #include <syslog.h>
                     32: #include <kerberosIV/des.h>
                     33: #include <kerberosIV/krb.h>
                     34: #include <kerberosIV/krb_db.h>
                     35: #include "pathnames.h"
                     36: #include "register_proto.h"
                     37: 
                     38: #define        KBUFSIZ         (sizeof(struct keyfile_data))
                     39: #define        CRYPT           0x00
                     40: #define        CLEAR           0x01
                     41: 
                     42: char   *progname;
                     43: struct sockaddr_in     sin;
                     44: char   msgbuf[BUFSIZ];
                     45: 
                     46: int    die();
                     47: 
                     48: main(argc, argv)
                     49: char   **argv;
                     50: {
                     51:        int     kf;
                     52:        char    keyfile[MAXPATHLEN];
                     53:        static  Key_schedule    schedule;
                     54:        u_char  code;
                     55:        char    keybuf[KBUFSIZ];
                     56:        int     retval, sval;
                     57:        struct  keyfile_data    *kfile;
                     58:        static struct rlimit rl = { 0, 0 };
                     59: 
                     60:        openlog("registerd", LOG_PID, LOG_AUTH);
                     61: 
                     62:        progname = argv[0];
                     63: 
                     64:        signal(SIGHUP, SIG_IGN);
                     65:        signal(SIGINT, SIG_IGN);
                     66:        signal(SIGTSTP, SIG_IGN);
                     67:        signal(SIGPIPE, die);
                     68:        if (setrlimit(RLIMIT_CORE, &rl) < 0) {
                     69:                syslog(LOG_ERR, "setrlimit: %m");
                     70:                exit(1);
                     71:        }
                     72: 
                     73: 
                     74:        /* figure out who we are talking to */
                     75: 
                     76:        sval = sizeof(sin);
                     77:        if (getpeername(0, (struct sockaddr *) &sin, &sval) < 0) {
                     78:                syslog(LOG_ERR, "getpeername: %m");
                     79:                exit(1);
                     80:        }
                     81: 
                     82:        /* get encryption key */
                     83: 
                     84:        (void) sprintf(keyfile, "%s%s%s",
                     85:                SERVER_KEYDIR,
                     86:                CLIENT_KEYFILE,
                     87:                inet_ntoa(sin.sin_addr));
                     88: 
                     89:        if ((kf = open(keyfile, O_RDONLY)) < 0) {
                     90:                syslog(LOG_ERR,
                     91:                    "error opening Kerberos update keyfile (%s): %m", keyfile);
                     92:                (void) sprintf(msgbuf,
                     93:                    "couldn't open session keyfile for your host");
                     94:                send_packet(msgbuf, CLEAR);
                     95:                exit(1);
                     96:        }
                     97: 
                     98:        if (read(kf, keybuf, KBUFSIZ) != KBUFSIZ) {
                     99:                syslog(LOG_ERR, "wrong read size of Kerberos update keyfile");
                    100:                (void) sprintf(msgbuf,
                    101:                        "couldn't read session key from your host's keyfile");
                    102:                send_packet(msgbuf, CLEAR);
                    103:                exit(1);
                    104:        }
                    105:        (void) sprintf(msgbuf, GOTKEY_MSG);
                    106:        send_packet(msgbuf, CLEAR);
                    107:        kfile = (struct keyfile_data *) keybuf;
                    108:        key_sched(kfile->kf_key, schedule);
                    109:        des_set_key(kfile->kf_key, schedule);
                    110: 
                    111:        /* read the command code byte */
                    112: 
                    113:        if (des_read(0, &code, 1) == 1) {
                    114: 
                    115:                switch(code) {
                    116:                case    APPEND_DB:
                    117:                        retval = do_append();
                    118:                        break;
                    119:                case    ABORT:
                    120:                        cleanup();
                    121:                        close(0);
                    122:                        exit(0);
                    123:                default:
                    124:                        retval = KFAILURE;
                    125:                        syslog(LOG_NOTICE,
                    126:                                "invalid command code on db update (0x%x)",
                    127:                                code);
                    128:                }
                    129: 
                    130:        } else {
                    131:                retval = KFAILURE;
                    132:                syslog(LOG_ERR, "couldn't read command code on Kerberos update");
                    133:        }
                    134: 
                    135:        code = (u_char) retval; 
                    136:        if (code != KSUCCESS) {
                    137:                (void) sprintf(msgbuf, "%s", krb_err_txt[code]);
                    138:                send_packet(msgbuf, CRYPT);
                    139:        } else {
                    140:                (void) sprintf(msgbuf, "Update complete.");
                    141:                send_packet(msgbuf, CRYPT);
                    142:        }
                    143:        cleanup();
                    144:        close(0);
                    145:        exit(0);
                    146: }
                    147: 
                    148: #define        MAX_PRINCIPAL   10
                    149: static Principal       principal_data[MAX_PRINCIPAL];
                    150: static C_Block         key, master_key;
                    151: static Key_schedule    master_key_schedule;
                    152: int
                    153: do_append()
                    154: {
                    155:        Principal       default_princ;
                    156:        char            input_name[ANAME_SZ];
                    157:        char            input_instance[INST_SZ];
                    158:        int             j,n, more;
                    159:        long            mkeyversion;
                    160: 
                    161: 
                    162: 
                    163:        /* get master key from MKEYFILE */
                    164:        if (kdb_get_master_key(0, master_key, master_key_schedule) != 0) {
                    165:                syslog(LOG_ERR, "couldn't get master key");
                    166:                return(KFAILURE);
                    167:        }
                    168: 
                    169:        mkeyversion = kdb_verify_master_key(master_key, master_key_schedule, NULL);
                    170:        if (mkeyversion < 0) {
                    171:                syslog(LOG_ERR, "couldn't validate master key");
                    172:                return(KFAILURE);
                    173:        }
                    174: 
                    175:        n = kerb_get_principal(KERB_DEFAULT_NAME, KERB_DEFAULT_INST,
                    176:                &default_princ, 1, &more);
                    177: 
                    178:        if (n != 1) {
                    179:                syslog(LOG_ERR, "couldn't get default principal");
                    180:                return(KFAILURE);
                    181:        }
                    182: 
                    183:        /*
                    184:         * get principal name, instance, and password from network.
                    185:         * convert password to key and store it
                    186:         */
                    187: 
                    188:        if (net_get_principal(input_name, input_instance, key) != 0) {
                    189:                return(KFAILURE);
                    190:        }
                    191: 
                    192: 
                    193:        j = kerb_get_principal(
                    194:                input_name,
                    195:                input_instance,
                    196:                principal_data,
                    197:                MAX_PRINCIPAL,
                    198:                &more
                    199:        );
                    200: 
                    201:        if (j != 0) {
                    202:                /* already in database, no update */
                    203:                syslog(LOG_NOTICE,
                    204:                        "attempt to add duplicate entry for principal %s.%s",
                    205:                        input_name, input_instance);
                    206:                return(KDC_PR_N_UNIQUE);
                    207:        }
                    208: 
                    209:        /*
                    210:         * set up principal's name, instance
                    211:         */
                    212: 
                    213:        strcpy(principal_data[0].name, input_name);
                    214:        strcpy(principal_data[0].instance, input_instance);
                    215:        principal_data[0].old = NULL;
                    216: 
                    217: 
                    218:        /* and the expiration date and version #s */
                    219: 
                    220:        principal_data[0].exp_date = default_princ.exp_date;
                    221:        strcpy(principal_data[0].exp_date_txt, default_princ.exp_date_txt);
                    222:        principal_data[0].max_life = default_princ.max_life;
                    223:        principal_data[0].attributes = default_princ.attributes;
                    224:        principal_data[0].kdc_key_ver = default_princ.kdc_key_ver;
                    225: 
                    226: 
                    227:        /* and the key */
                    228: 
                    229:        kdb_encrypt_key(key, key, master_key, master_key_schedule,
                    230:                        ENCRYPT);
                    231:        bcopy(key, &principal_data[0].key_low, 4);
                    232:        bcopy(((long *) key) + 1, &principal_data[0].key_high,4);
                    233:        bzero(key, sizeof(key));
                    234: 
                    235:        principal_data[0].key_version = 1;      /* 1st entry */
                    236: 
                    237:        /* and write it to the database */
                    238: 
                    239:        if (kerb_put_principal(&principal_data[0], 1)) {
                    240:                syslog(LOG_INFO, "Kerberos update failure: put_principal failed");
                    241:                return(KFAILURE);
                    242:        }
                    243: 
                    244:        syslog(LOG_NOTICE, "Kerberos update: wrote new record for %s.%s from %s",
                    245:                principal_data[0].name,
                    246:                principal_data[0].instance,
                    247:                inet_ntoa(sin.sin_addr)
                    248:        );
                    249: 
                    250:        return(KSUCCESS);
                    251: 
                    252: }
                    253: 
                    254: send_packet(msg,flag)
                    255:        char    *msg;
                    256:        int     flag;
                    257: {
                    258:        int     len = strlen(msg);
                    259:        msg[len++] = '\n';
                    260:        msg[len] = '\0';
                    261:        if (len > sizeof(msgbuf)) {
                    262:                syslog(LOG_ERR, "send_packet: invalid msg size");
                    263:                return;
                    264:        }
                    265:        if (flag == CRYPT) {
                    266:                if (des_write(0, msg, len) != len)
                    267:                        syslog(LOG_ERR, "couldn't write reply message");
                    268:        } else if (flag == CLEAR) {
                    269:                if (write(0, msg, len) != len)
                    270:                        syslog(LOG_ERR, "couldn't write reply message");
                    271:        } else
                    272:                        syslog(LOG_ERR, "send_packet: invalid flag (%d)", flag);
                    273: 
                    274: }
                    275: 
                    276: net_get_principal(pname, iname, keyp)
                    277:        char    *pname, *iname;
                    278:        C_Block *keyp;
                    279: {
                    280:        int     cc;
                    281:        static  char    password[255];
                    282: 
                    283:        cc = des_read(0, pname, ANAME_SZ);
                    284:        if (cc != ANAME_SZ) {
                    285:                syslog(LOG_ERR, "couldn't get principal name");
                    286:                return(-1);
                    287:        }
                    288: 
                    289:        cc = des_read(0, iname, INST_SZ);
                    290:        if (cc != INST_SZ) {
                    291:                syslog(LOG_ERR, "couldn't get instance name");
                    292:                return(-1);
                    293:        }
                    294: 
                    295:        cc = des_read(0, password, 255);
                    296:        if (cc != 255) {
                    297:                syslog(LOG_ERR, "couldn't get password");
                    298:                bzero(password, 255);
                    299:                return(-1);
                    300:        }
                    301: 
                    302:        string_to_key(password, *keyp);
                    303:        bzero(password, 255);
                    304:        return(0);
                    305: }
                    306: 
                    307: cleanup()
                    308: {
                    309:        bzero(master_key, sizeof(master_key));
                    310:        bzero(key, sizeof(key));
                    311:        bzero(master_key_schedule, sizeof(master_key_schedule));
                    312: }
                    313: 
                    314: die()
                    315: {
                    316:        syslog(LOG_ERR, "remote end died (SIGPIPE)");
                    317:        cleanup();
                    318:        exit(1);
                    319: }

unix.superglobalmegacorp.com

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