Annotation of 43BSDReno/kerberosIV/des/string_to_key.c, revision 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.