Annotation of 43BSDReno/kerberosIV/des/doc/libdes.doc, revision 1.1.1.1

1.1       root        1: 
                      2:        How to use the Kerberos encryption library.
                      3: 
                      4:                        Revised         10/15/85        spm
                      5: 
                      6: 1)     The following include file is needed:
                      7:        
                      8:        /projects/auth/include/des.h    (VAX)
                      9:        ---------------                                 (PC8086)
                     10: 
                     11: 2)     The encryption library that should be linked to is:
                     12:        
                     13:        /projects/auth/lib/libdes.a             (VAX)
                     14: |      /projects/auth/ibm/lib/libdes.a (PC8086 cross-compilation environment)
                     15: 
                     16: 3)     For each key that may be simultaneously active,
                     17:        allocate (either compile or malloc) a "Key_schedule" struct, 
                     18:        defined in "des.h"
                     19: 
                     20: 4)     Create key schedules, as needed, prior to using the encryption
                     21:        routines, via "des_set_key()".
                     22: 
                     23: 5)  Setup the input and output areas.  Make sure to note the restrictions
                     24:        on lengths being multiples of eight bytes.
                     25: 
                     26: 6)     Invoke the encryption/decryption routines, "ecb_encrypt()"
                     27:         or "cbc_encrypt()"
                     28: 
                     29: 7)     To generate a cryptographic checksum, use "cbc_cksum()"
                     30: /*     ----------------------------------------------------------------        */
                     31:        
                     32:        Routine Interfaces--
                     33: 
                     34: /*     -----------------------------------------------------------------       */
                     35: 
                     36: int
                     37:        des_set_key(k,schedule)
                     38:                C_Block                 *k;
                     39:                Key_schedule    schedule;
                     40: 
                     41:        Calculates a key schedule from (all) eight bytes of the input key, and
                     42:        puts it into the indicated "Key_schedule" struct;
                     43: 
                     44:        Make sure to pass valid eight bytes, no padding or other processing
                     45:        it done.
                     46: 
                     47:        The key schedule is then used in subsequent encryption/decryption
                     48:        operations.  Many key schedules may be created and cached for later
                     49:        use.
                     50: 
                     51:        The user is responsible to clear keys and schedules no longer needed
                     52:        to prevent their disclosure.
                     53: 
                     54: |      Checks the parity of the key provided, to make sure it is odd per
                     55: |      FIPS spec.  Returns 0 value for key ok, 1 for key_parity error.
                     56: 
                     57: /*     ----------------------------------------------------------------        */
                     58:        
                     59: int
                     60:        ecb_encrypt(input,output,schedule,encrypt)
                     61:                C_Block                 *input;         /* ptr to eight byte input value */
                     62:                C_Block                 *output;        /* ptr to eight byte output value */
                     63:                int                             encrypt;        /* 0 ==> decrypt, else encrypt */
                     64:                Key_schedule    schedule;       /* addr of key schedule */
                     65: 
                     66: This is the low level routine that encrypts or decrypts a single 8-byte
                     67: block in electronic code book mode.  Always transforms the input
                     68: data into the output data.
                     69: 
                     70: If encrypt is non-zero, the input (cleartext) is encrypted into the
                     71: output (ciphertext) using the specified key_schedule, pre-set via "des_set_key".
                     72: 
                     73: If encrypt is zero, the input (now ciphertext) is decrypted into
                     74: the output (now cleartext).
                     75: 
                     76: Input and output may be the same space.
                     77: 
                     78: Does not return any meaningful value.  Void is not used for compatibility
                     79: with other compilers.
                     80: 
                     81: /*     --------------------------------------------------------------  */
                     82: 
                     83: int    
                     84:        cbc_encrypt(input,output,length,schedule,ivec,encrypt)
                     85: 
                     86:                C_Block                 *input;         /* ptr to input data */
                     87:                C_Block                 *output;        /* ptr to output data */
                     88:                int                             length;         /* desired length, in bytes */
                     89:                Key_schedule    schedule;               /* addr of precomputed schedule */
                     90:                C_Block                 *ivec;          /* pointer to 8 byte initialization
                     91:                                                                         * vector
                     92:                                                                         */
                     93:                int                             encrypt         /* 0 ==> decrypt; else encrypt*/
                     94: 
                     95: 
                     96:        If encrypt is non-zero, the routine cipher-block-chain encrypts
                     97:        the INPUT (cleartext) into the OUTPUT (ciphertext) using the provided
                     98:        key schedule and initialization vector.  If the length is not an integral
                     99:        multiple of eight bytes, the last block is copied to a temp and zero 
                    100:        filled (highest addresses).  The output is ALWAYS an integral multiple
                    101:        of eight bytes.
                    102: 
                    103:        If encrypt is zero, the routine cipher-block chain decrypts the INPUT
                    104:        (ciphertext) into the OUTPUT (cleartext) using the provided key schedule
                    105:        and     initialization vector.  Decryption ALWAYS operates on integral
                    106:        multiples of 8 bytes, so will round the length provided up to the
                    107:        appropriate     multiple. Consequently, it will always produce the rounded-up
                    108:        number of bytes of output cleartext. The application must determine if
                    109:        the output cleartext was zero-padded due to cleartext lengths not integral
                    110:        multiples of 8.
                    111: 
                    112:        No errors or meaningful value are returned.  Void is not used for
                    113:        compatibility with other compilers.
                    114: 
                    115: 
                    116: /* cbc checksum (MAC) only routine  ---------------------------------------- */
                    117: int    
                    118:        cbc_cksum(input,output,length,schedule,ivec)
                    119: 
                    120:        C_Block                 *input;         /* >= length bytes of inputtext  */
                    121:        C_Block                 *output;        /* >= length bytes of outputtext */
                    122:        int                             length;         /* in bytes                                             */
                    123:        Key_schedule    schedule;       /* precomputed key schedule        */
                    124:        C_Block                 *ivec;          /* 8 bytes of ivec                         */
                    125: 
                    126: 
                    127:        Produces a cryptographic checksum, 8 bytes, by cipher-block-chain
                    128:        encrypting the input, discarding the ciphertext output, and only retaining
                    129:        the last ciphertext 8-byte block.  Uses the provided key schedule and ivec.
                    130:        The input is effectively zero-padded to an integral multiple of
                    131:        eight bytes, though the original input is not modified.
                    132: 
                    133:        No meaningful value is returned.  Void is not used for compatibility
                    134:        with other compilers.
                    135: 
                    136: 
                    137: /*     random_key ----------------------------------------*/
                    138: int
                    139:        random_key(key)
                    140: 
                    141:        C_Block *key;
                    142: 
                    143:        The start for the random number generated is set from the current time
                    144:        in microseconds, then the random number generator is invoked
                    145:        to create an eight byte output key (not a schedule).  The key
                    146:        generated is set to odd parity per FIPS spec.
                    147: 
                    148:        The caller must supply space for the output key, pointed to 
                    149:        by "*key", then after getting a new key, call the des_set_key() 
                    150:        routine when needed.
                    151: 
                    152:        No meaningfull value is returned.  Void is not used for compatibility
                    153:        with other compilers.
                    154: 
                    155: 
                    156: /* string_to_key --------------------------------------------*/
                    157: 
                    158: int
                    159:        string_to_key(str,key)
                    160:        register char           *str;
                    161:        register C_Block        *key;
                    162: 
                    163:        This routines converts an arbitrary length, null terminated string
                    164:        to an 8 byte DES key, with each byte parity set to odd, per FIPS spec.
                    165: 
                    166:        The algorithm is as follows:
                    167: 
                    168: |      Take the first 8 bytes and remove the parity (leaving 56 bits).
                    169: |      Do the same for the second 8 bytes, and the third, etc.  Do this for
                    170: |      as many sets of 8 bytes as necessary, filling in the remainder of the
                    171: |      last set with nulls.  Fold the second set back on the first (i.e. bit
                    172: |      0 over bit 55, and bit 55 over bit 0).  Fold the third over the second
                    173: |      (bit 0 of the third set is now over bit 0 of the first set).  Repeat
                    174: |      until you have done this to all sets.  Xor the folded sets.  Break the
                    175: |      result into 8 7 bit bytes, and generate odd parity for each byte.  You
                    176: |      now have 64 bits.  Note that DES takes a 64 bit key, and uses only the
                    177: |      non parity bits.
                    178: 
                    179: 
                    180: /* read_password -------------------------------------------*/
                    181: 
                    182: read_password(k,prompt,verify)
                    183:        C_Block *k;
                    184:        char *prompt;
                    185:        int     verify;
                    186: 
                    187: This routine issues the supplied prompt, turns off echo, if possible, and
                    188: reads an input string.  If verify is non-zero, it does it again, for use
                    189: in applications such as changing a password. If verify is non-zero, both
                    190: versions are compared, and the input is requested repeatedly until they
                    191: match.  Then, the input string is mapped into a valid DES key, internally
                    192: using the string_to_key routine.  The newly created key is copied to the
                    193: area pointed to by parameter "k".  
                    194: 
                    195: No meaningful value is returned.  If an error occurs trying to manipulate
                    196: the terminal echo, the routine forces the process to exit.
                    197: 
                    198: /* get_line ------------------------*/
                    199: long get_line(p,max)
                    200:        char    *p;
                    201:        long    max;
                    202: 
                    203: Reads input characters from standard input until either a newline appears or
                    204: else the max length is reached.  The characters read are stuffed into
                    205: the string pointed to, which will always be null terminated.  The newline
                    206: is not inserted in the string.  The max parameter includes the byte needed
                    207: for the null terminator, so allocate and pass one more than the maximum
                    208: string length desired.

unix.superglobalmegacorp.com

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