Annotation of 43BSDReno/kerberosIV/des/cksum.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Source: /afs/athena.mit.edu/astaff/project/kerberos/src/lib/des/RCS/cksum.c,v $
                      3:  * $Author: jtkohl $
                      4:  *
                      5:  * Copyright 1985, 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:  * These routines perform encryption and decryption using the DES
                     12:  * private key algorithm, or else a subset of it-- fewer inner loops.
                     13:  * (AUTH_DES_ITER defaults to 16, may be less.)
                     14:  *
                     15:  * Under U.S. law, this software may not be exported outside the US
                     16:  * without license from the U.S. Commerce department.
                     17:  * 
                     18:  * These routines form the library interface to the DES facilities.
                     19:  *
                     20:  *     spm     8/85    MIT project athena
                     21:  */
                     22: 
                     23: #ifndef        lint
                     24: static char rcsid_cksum_c[] =
                     25: "$Id: cksum.c,v 4.10 90/01/02 13:46:25 jtkohl Exp $";
                     26: #endif lint
                     27: 
                     28: #include <mit-copyright.h>
                     29: #include <stdio.h>
                     30: #include <strings.h>
                     31: 
                     32: #include <des.h>
                     33: #include "des_internal.h"
                     34: 
                     35: extern int des_debug;
                     36: extern int des_debug_print();
                     37: 
                     38: /*
                     39:  * This routine performs DES cipher-block-chaining checksum operation,
                     40:  * a.k.a.  Message Authentication Code.  It ALWAYS encrypts from input
                     41:  * to a single 64 bit output MAC checksum.
                     42:  *
                     43:  * The key schedule is passed as an arg, as well as the cleartext or
                     44:  * ciphertext. The cleartext and ciphertext should be in host order.
                     45:  *
                     46:  * NOTE-- the output is ALWAYS 8 bytes long.  If not enough space was
                     47:  * provided, your program will get trashed.
                     48:  *
                     49:  * The input is null padded, at the end (highest addr), to an integral
                     50:  * multiple of eight bytes.
                     51:  */
                     52: 
                     53: unsigned long
                     54: des_cbc_cksum(in,out,length,key,iv)
                     55:     des_cblock *in;            /* >= length bytes of inputtext */
                     56:     des_cblock *out;           /* >= length bytes of outputtext */
                     57:     register long length;      /* in bytes */
                     58:     des_key_schedule key;              /* precomputed key schedule */
                     59:     des_cblock *iv;            /* 8 bytes of ivec */
                     60: {
                     61:     register unsigned long *input = (unsigned long *) in;
                     62:     register unsigned long *output = (unsigned long *) out;
                     63:     unsigned long *ivec = (unsigned long *) iv;
                     64: 
                     65:     unsigned long i,j;
                     66:     static unsigned long t_input[2];
                     67:     static unsigned long t_output[8];
                     68:     static unsigned char *t_in_p;
                     69: 
                     70:     t_in_p = (unsigned char *) t_input;
                     71: #ifdef MUSTALIGN
                     72:     if ((long) ivec & 3) {
                     73:        bcopy((char *)ivec++,(char *)&t_output[0],sizeof(t_output[0]));
                     74:        bcopy((char *)ivec,(char *)&t_output[1],sizeof(t_output[1]));
                     75:     }
                     76:     else
                     77: #endif
                     78:     {
                     79:        t_output[0] = *ivec++;
                     80:        t_output[1] = *ivec;
                     81:     }
                     82: 
                     83:     for (i = 0; length > 0; i++, length -= 8) {
                     84:        /* get input */
                     85: #ifdef MUSTALIGN
                     86:        if ((long) input & 3) {
                     87:            bcopy((char *)input++,(char *)&t_input[0],sizeof(t_input[0]));
                     88:            bcopy((char *)input++,(char *)&t_input[1],sizeof(t_input[1]));
                     89:        }
                     90:        else
                     91: #endif
                     92:        {
                     93:            t_input[0] = *input++;
                     94:            t_input[1] = *input++;
                     95:        }
                     96: 
                     97:        /* zero pad */
                     98:        if (length < 8)
                     99:            for (j = length; j <= 7; j++)
                    100:                *(t_in_p+j)= 0;
                    101: 
                    102: #ifdef DEBUG
                    103:        if (des_debug)
                    104:            des_debug_print("clear",length,t_input[0],t_input[1]);
                    105: #endif
                    106:        /* do the xor for cbc into the temp */
                    107:        t_input[0] ^= t_output[0] ;
                    108:        t_input[1] ^= t_output[1] ;
                    109:        /* encrypt */
                    110:        (void) des_ecb_encrypt(t_input,t_output,key,1);
                    111: #ifdef DEBUG
                    112:        if (des_debug) {
                    113:            des_debug_print("xor'ed",i,t_input[0],t_input[1]);
                    114:            des_debug_print("cipher",i,t_output[0],t_output[1]);
                    115:        }
                    116: #else
                    117: #ifdef lint
                    118:        i = i;
                    119: #endif
                    120: #endif
                    121:     }
                    122:     /* copy temp output and save it for checksum */
                    123: #ifdef MUSTALIGN
                    124:     if ((long) output & 3) {
                    125:        bcopy((char *)&t_output[0],(char *)output++,sizeof(t_output[0]));
                    126:        bcopy((char *)&t_output[1],(char *)output,sizeof(t_output[1]));
                    127:     }
                    128:     else
                    129: #endif
                    130:     {
                    131:        *output++ = t_output[0];
                    132:        *output = t_output[1];
                    133:     }
                    134: 
                    135:     return (unsigned long) t_output[1];
                    136: }

unix.superglobalmegacorp.com

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