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

1.1     ! root        1: /*
        !             2:  * $Source: /mit/kerberos/src/lib/krb/RCS/mk_priv.c,v $
        !             3:  * $Author: jtkohl $
        !             4:  *
        !             5:  * Copyright 1986, 1987, 1988 by the Massachusetts Institute
        !             6:  * of Technology.
        !             7:  *
        !             8:  * For copying and distribution information, please see the file
        !             9:  * <mit-copyright.h>.
        !            10:  *
        !            11:  * This routine constructs a Kerberos 'private msg', i.e.
        !            12:  * cryptographically sealed with a private session key.
        !            13:  *
        !            14:  * Note-- bcopy is used to avoid alignment problems on IBM RT.
        !            15:  *
        !            16:  * Note-- It's too bad that it did a long int compare on the RT before.
        !            17:  *
        !            18:  * Returns either < 0 ===> error, or resulting size of message
        !            19:  *
        !            20:  * Steve Miller    Project Athena  MIT/DEC
        !            21:  */
        !            22: 
        !            23: #ifndef lint
        !            24: static char *rcsid_mk_priv_c=
        !            25: "$Header: mk_priv.c,v 4.13 89/03/22 14:48:59 jtkohl Exp $";
        !            26: #endif /* lint */
        !            27: 
        !            28: #include <mit-copyright.h>
        !            29: 
        !            30: /* system include files */
        !            31: #include <stdio.h>
        !            32: #include <errno.h>
        !            33: #include <sys/types.h>
        !            34: #include <netinet/in.h>
        !            35: #include <sys/time.h>
        !            36: 
        !            37: /* application include files */
        !            38: #include <des.h>
        !            39: #include <krb.h>
        !            40: #include <prot.h>
        !            41: #include "lsb_addr_comp.h"
        !            42: 
        !            43: extern char *errmsg();
        !            44: extern int errno;
        !            45: extern int krb_debug;
        !            46: 
        !            47: /* static storage */
        !            48: 
        !            49: 
        !            50: static u_long c_length;
        !            51: static struct timeval msg_time;
        !            52: static u_char msg_time_5ms;
        !            53: static long msg_time_sec;
        !            54: 
        !            55: /*
        !            56:  * krb_mk_priv() constructs an AUTH_MSG_PRIVATE message.  It takes
        !            57:  * some user data "in" of "length" bytes and creates a packet in "out"
        !            58:  * consisting of the user data, a timestamp, and the sender's network
        !            59:  * address.
        !            60: #ifndef NOENCRYTION
        !            61:  * The packet is encrypted by pcbc_encrypt(), using the given
        !            62:  * "key" and "schedule".
        !            63: #endif
        !            64:  * The length of the resulting packet "out" is
        !            65:  * returned.
        !            66:  *
        !            67:  * It is similar to krb_mk_safe() except for the additional key
        !            68:  * schedule argument "schedule" and the fact that the data is encrypted
        !            69:  * rather than appended with a checksum.  Also, the protocol version
        !            70:  * number is "private_msg_ver", defined in krb_rd_priv.c, rather than
        !            71:  * KRB_PROT_VERSION, defined in "krb.h".
        !            72:  *
        !            73:  * The "out" packet consists of:
        !            74:  *
        !            75:  * Size                        Variable                Field
        !            76:  * ----                        --------                -----
        !            77:  *
        !            78:  * 1 byte              private_msg_ver         protocol version number
        !            79:  * 1 byte              AUTH_MSG_PRIVATE |      message type plus local
        !            80:  *                     HOST_BYTE_ORDER         byte order in low bit
        !            81:  *
        !            82: #ifdef NOENCRYPTION
        !            83:  * 4 bytes             c_length                length of data
        !            84: #else
        !            85:  * 4 bytes             c_length                length of encrypted data
        !            86:  *
        !            87:  * ===================== begin encrypt ================================
        !            88: #endif
        !            89:  * 
        !            90:  * 4 bytes             length                  length of user data
        !            91:  * length              in                      user data
        !            92:  * 1 byte              msg_time_5ms            timestamp milliseconds
        !            93:  * 4 bytes             sender->sin.addr.s_addr sender's IP address
        !            94:  *
        !            95:  * 4 bytes             msg_time_sec or         timestamp seconds with
        !            96:  *                     -msg_time_sec           direction in sign bit
        !            97:  *
        !            98:  * 0<=n<=7  bytes      pad to 8 byte multiple  zeroes
        !            99: #ifndef NOENCRYPTION
        !           100:  *                     (done by pcbc_encrypt())
        !           101:  *
        !           102:  * ======================= end encrypt ================================
        !           103: #endif
        !           104:  */
        !           105: 
        !           106: long krb_mk_priv(in,out,length,schedule,key,sender,receiver)
        !           107:     u_char *in;                 /* application data */
        !           108:     u_char *out;                /* put msg here, leave room for
        !           109:                                  * header! breaks if in and out
        !           110:                                  * (header stuff) overlap */
        !           111:     u_long length;              /* of in data */
        !           112:     Key_schedule schedule;      /* precomputed key schedule */
        !           113:     C_Block key;                /* encryption key for seed and ivec */
        !           114:     struct sockaddr_in *sender; /* sender address */
        !           115:     struct sockaddr_in *receiver; /* receiver address */
        !           116: {
        !           117:     register u_char     *p,*q;
        !           118:     static       u_char *c_length_ptr;
        !           119:     extern int private_msg_ver; /* in krb_rd_priv.c */
        !           120: 
        !           121:     /*
        !           122:      * get the current time to use instead of a sequence #, since
        !           123:      * process lifetime may be shorter than the lifetime of a session
        !           124:      * key.
        !           125:      */
        !           126:     if (gettimeofday(&msg_time,(struct timezone *)0)) {
        !           127:         return -1;
        !           128:     }
        !           129:     msg_time_sec = (long) msg_time.tv_sec;
        !           130:     msg_time_5ms = msg_time.tv_usec/5000; /* 5ms quanta */
        !           131: 
        !           132:     p = out;
        !           133: 
        !           134:     *p++ = private_msg_ver;
        !           135:     *p++ = AUTH_MSG_PRIVATE | HOST_BYTE_ORDER;
        !           136: 
        !           137:     /* calculate cipher length */
        !           138:     c_length_ptr = p;
        !           139:     p += sizeof(c_length);
        !           140: 
        !           141: #ifndef NOENCRYPTION
        !           142:     /* start for encrypted stuff */
        !           143: #endif
        !           144:     q = p;
        !           145: 
        !           146:     /* stuff input length */
        !           147:     bcopy((char *)&length,(char *)p,sizeof(length));
        !           148:     p += sizeof(length);
        !           149: 
        !           150: #ifdef NOENCRYPTION
        !           151:     /* make all the stuff contiguous for checksum */
        !           152: #else
        !           153:     /* make all the stuff contiguous for checksum and encryption */
        !           154: #endif
        !           155:     bcopy((char *)in,(char *)p,(int) length);
        !           156:     p += length;
        !           157: 
        !           158:     /* stuff time 5ms */
        !           159:     bcopy((char *)&msg_time_5ms,(char *)p,sizeof(msg_time_5ms));
        !           160:     p += sizeof(msg_time_5ms);
        !           161: 
        !           162:     /* stuff source address */
        !           163:     bcopy((char *)&sender->sin_addr.s_addr,(char *)p,
        !           164:           sizeof(sender->sin_addr.s_addr));
        !           165:     p += sizeof(sender->sin_addr.s_addr);
        !           166: 
        !           167:     /*
        !           168:      * direction bit is the sign bit of the timestamp.  Ok
        !           169:      * until 2038??
        !           170:      */
        !           171:     /* For compatibility with broken old code, compares are done in VAX 
        !           172:        byte order (LSBFIRST) */ 
        !           173:     if (lsb_net_ulong_less(sender->sin_addr.s_addr, /* src < recv */ 
        !           174:                          receiver->sin_addr.s_addr)==-1) 
        !           175:         msg_time_sec =  -msg_time_sec; 
        !           176:     else if (lsb_net_ulong_less(sender->sin_addr.s_addr, 
        !           177:                                receiver->sin_addr.s_addr)==0) 
        !           178:         if (lsb_net_ushort_less(sender->sin_port,receiver->sin_port) == -1) 
        !           179:             msg_time_sec = -msg_time_sec; 
        !           180:     /* stuff time sec */
        !           181:     bcopy((char *)&msg_time_sec,(char *)p,sizeof(msg_time_sec));
        !           182:     p += sizeof(msg_time_sec);
        !           183: 
        !           184:     /*
        !           185:      * All that for one tiny bit!  Heaven help those that talk to
        !           186:      * themselves.
        !           187:      */
        !           188: 
        !           189: #ifdef notdef
        !           190:     /*
        !           191:      * calculate the checksum of the length, address, sequence, and
        !           192:      * inp data
        !           193:      */
        !           194:     cksum =  quad_cksum(q,NULL,p-q,0,key);
        !           195:     if (krb_debug)
        !           196:         printf("\ncksum = %u",cksum);
        !           197:     /* stuff checksum */
        !           198:     bcopy((char *) &cksum,(char *) p,sizeof(cksum));
        !           199:     p += sizeof(cksum);
        !           200: #endif
        !           201: 
        !           202: #ifdef NOENCRYPTION
        !           203:     /*
        !           204:      * All the data have been assembled, compute length
        !           205:      */
        !           206: #else
        !           207:     /*
        !           208:      * All the data have been assembled, compute length and encrypt
        !           209:      * starting with the length, data, and timestamps use the key as
        !           210:      * an ivec.
        !           211:      */
        !           212: #endif
        !           213: 
        !           214:     c_length = p - q;
        !           215:     c_length = ((c_length + sizeof(C_Block) -1)/sizeof(C_Block)) *
        !           216:         sizeof(C_Block);
        !           217:     /* stuff the length */
        !           218:     bcopy((char *) &c_length,(char *)c_length_ptr,sizeof(c_length));
        !           219: 
        !           220: #ifndef NOENCRYPTION
        !           221:     /* pcbc encrypt, pad as needed, use key as ivec */
        !           222:     pcbc_encrypt((C_Block *) q,(C_Block *) q, (long) (p-q), schedule,
        !           223:                  key, ENCRYPT);
        !           224: #endif /* NOENCRYPTION */
        !           225: 
        !           226:     return (q - out + c_length);        /* resulting size */
        !           227: }

unix.superglobalmegacorp.com

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