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

1.1       root        1: /*
                      2:  * $Source: /afs/athena.mit.edu/astaff/project/kerberos/src/lib/des/RCS/string_to_key.c,v $
                      3:  * $Author: jtkohl $
                      4:  *
                      5:  * Copyright 1985, 1986, 1987, 1988, 1989 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:  * The key schedule is passed as an arg, as well as the cleartext or
                     19:  * ciphertext.  The cleartext and ciphertext should be in host order.
                     20:  *
                     21:  * These routines form the library interface to the DES facilities.
                     22:  *
                     23:  *     spm     8/85    MIT project athena
                     24:  */
                     25: 
                     26: #ifndef        lint
                     27: static char rcsid_string_to_key_c[] =
                     28: "$Id: string_to_key.c,v 4.11 90/01/02 13:46:38 jtkohl Exp $";
                     29: #endif lint
                     30: 
                     31: #include <mit-copyright.h>
                     32: #include <stdio.h>
                     33: #include <des.h>
                     34: #include "des_internal.h"
                     35: 
                     36: extern int des_debug;
                     37: extern int des_debug_print();
                     38: extern void des_fixup_key_parity();
                     39: 
                     40: /*
                     41:  * convert an arbitrary length string to a DES key
                     42:  */
                     43: int
                     44: des_string_to_key(str,key)
                     45:     char *str;
                     46:     register des_cblock *key;
                     47: {
                     48:     register char *in_str;
                     49:     register unsigned temp,i;
                     50:     register int j;
                     51:     register long length;
                     52:     static unsigned char *k_p;
                     53:     static int forward;
                     54:     register char *p_char;
                     55:     static char k_char[64];
                     56:     static des_key_schedule key_sked;
                     57:     extern unsigned long des_cbc_cksum();
                     58: 
                     59:     in_str = str;
                     60:     forward = 1;
                     61:     p_char = k_char;
                     62:     length = strlen(str);
                     63: 
                     64:     /* init key array for bits */
                     65:     bzero(k_char,sizeof(k_char));
                     66: 
                     67: #ifdef DEBUG
                     68:     if (des_debug)
                     69:        fprintf(stdout,
                     70:                "\n\ninput str length = %d  string = %s\nstring = 0x ",
                     71:                length,str);
                     72: #endif
                     73: 
                     74:     /* get next 8 bytes, strip parity, xor */
                     75:     for (i = 1; i <= length; i++) {
                     76:        /* get next input key byte */
                     77:        temp = (unsigned int) *str++;
                     78: #ifdef DEBUG
                     79:        if (des_debug)
                     80:            fprintf(stdout,"%02x ",temp & 0xff);
                     81: #endif
                     82:        /* loop through bits within byte, ignore parity */
                     83:        for (j = 0; j <= 6; j++) {
                     84:            if (forward)
                     85:                *p_char++ ^= (int) temp & 01;
                     86:            else
                     87:                *--p_char ^= (int) temp & 01;
                     88:            temp = temp >> 1;
                     89:        } while (--j > 0);
                     90: 
                     91:        /* check and flip direction */
                     92:        if ((i%8) == 0)
                     93:            forward = !forward;
                     94:     }
                     95: 
                     96:     /* now stuff into the key des_cblock, and force odd parity */
                     97:     p_char = k_char;
                     98:     k_p = (unsigned char *) key;
                     99: 
                    100:     for (i = 0; i <= 7; i++) {
                    101:        temp = 0;
                    102:        for (j = 0; j <= 6; j++)
                    103:            temp |= *p_char++ << (1+j);
                    104:        *k_p++ = (unsigned char) temp;
                    105:     }
                    106: 
                    107:     /* fix key parity */
                    108:     des_fixup_key_parity(key);
                    109: 
                    110:     /* Now one-way encrypt it with the folded key */
                    111:     (void) des_key_sched(key,key_sked);
                    112:     (void) des_cbc_cksum((des_cblock *)in_str,key,length,key_sked,key);
                    113:     /* erase key_sked */
                    114:     bzero((char *)key_sked,sizeof(key_sked));
                    115: 
                    116:     /* now fix up key parity again */
                    117:     des_fixup_key_parity(key);
                    118: 
                    119:     if (des_debug)
                    120:        fprintf(stdout,
                    121:                "\nResulting string_to_key = 0x%x 0x%x\n",
                    122:                *((unsigned long *) key),
                    123:                *((unsigned long *) key+1));
                    124: }

unix.superglobalmegacorp.com

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