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

unix.superglobalmegacorp.com

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