| .TH DES_CRYPT 3  | 
 | .SH NAME | 
 | des_read_password, des_read_2password, | 
 | des_string_to_key, des_string_to_2key, des_read_pw_string, | 
 | des_random_key, des_set_key, | 
 | des_key_sched, des_ecb_encrypt, des_ecb3_encrypt, des_cbc_encrypt, | 
 | des_3cbc_encrypt, | 
 | des_pcbc_encrypt, des_cfb_encrypt, des_ofb_encrypt, | 
 | des_cbc_cksum, des_quad_cksum, | 
 | des_enc_read, des_enc_write, des_set_odd_parity, | 
 | des_is_weak_key, crypt \- (non USA) DES encryption | 
 | .SH SYNOPSIS | 
 | .nf | 
 | .nj | 
 | .ft B | 
 | #include <des.h> | 
 | .PP | 
 | .B int des_read_password(key,prompt,verify) | 
 | des_cblock *key; | 
 | char *prompt; | 
 | int verify; | 
 | .PP | 
 | .B int des_read_2password(key1,key2,prompt,verify) | 
 | des_cblock *key1,*key2; | 
 | char *prompt; | 
 | int verify; | 
 | .PP | 
 | .B int des_string_to_key(str,key) | 
 | char *str; | 
 | des_cblock *key; | 
 | .PP | 
 | .B int des_string_to_2keys(str,key1,key2) | 
 | char *str; | 
 | des_cblock *key1,*key2; | 
 | .PP | 
 | .B int des_read_pw_string(buf,length,prompt,verify) | 
 | char *buf; | 
 | int length; | 
 | char *prompt; | 
 | int verify; | 
 | .PP | 
 | .B int des_random_key(key) | 
 | des_cblock *key; | 
 | .PP | 
 | .B int des_set_key(key,schedule) | 
 | des_cblock *key; | 
 | des_key_schedule schedule; | 
 | .PP | 
 | .B int des_key_sched(key,schedule) | 
 | des_cblock *key; | 
 | des_key_schedule schedule; | 
 | .PP | 
 | .B int des_ecb_encrypt(input,output,schedule,encrypt) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | des_key_schedule schedule; | 
 | int encrypt; | 
 | .PP | 
 | .B int des_ecb3_encrypt(input,output,ks1,ks2,encrypt) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | des_key_schedule ks1,ks2; | 
 | int encrypt; | 
 | .PP | 
 | .B int des_cbc_encrypt(input,output,length,schedule,ivec,encrypt) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | long length; | 
 | des_key_schedule schedule; | 
 | des_cblock *ivec; | 
 | int encrypt; | 
 | .PP | 
 | .B int des_3cbc_encrypt(input,output,length,sk1,sk2,ivec1,ivec2,encrypt) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | long length; | 
 | des_key_schedule sk1; | 
 | des_key_schedule sk2; | 
 | des_cblock *ivec1; | 
 | des_cblock *ivec2; | 
 | int encrypt; | 
 | .PP | 
 | .B int des_pcbc_encrypt(input,output,length,schedule,ivec,encrypt) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | long length; | 
 | des_key_schedule schedule; | 
 | des_cblock *ivec; | 
 | int encrypt; | 
 | .PP | 
 | .B int des_cfb_encrypt(input,output,numbits,length,schedule,ivec,encrypt) | 
 | unsigned char *input; | 
 | unsigned char *output; | 
 | int numbits; | 
 | long length; | 
 | des_key_schedule schedule; | 
 | des_cblock *ivec; | 
 | int encrypt; | 
 | .PP | 
 | .B int des_ofb_encrypt(input,output,numbits,length,schedule,ivec) | 
 | unsigned char *input,*output; | 
 | int numbits; | 
 | long length; | 
 | des_key_schedule schedule; | 
 | des_cblock *ivec; | 
 | .PP | 
 | .B unsigned long des_cbc_cksum(input,output,length,schedule,ivec) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | long length; | 
 | des_key_schedule schedule; | 
 | des_cblock *ivec; | 
 | .PP | 
 | .B unsigned long des_quad_cksum(input,output,length,out_count,seed) | 
 | des_cblock *input; | 
 | des_cblock *output; | 
 | long length; | 
 | int out_count; | 
 | des_cblock *seed; | 
 | .PP | 
 | .B int des_check_key; | 
 | .PP | 
 | .B int des_enc_read(fd,buf,len,sched,iv) | 
 | int fd; | 
 | char *buf; | 
 | int len; | 
 | des_key_schedule sched; | 
 | des_cblock *iv; | 
 | .PP | 
 | .B int des_enc_write(fd,buf,len,sched,iv) | 
 | int fd; | 
 | char *buf; | 
 | int len; | 
 | des_key_schedule sched; | 
 | des_cblock *iv; | 
 | .PP | 
 | .B extern int des_rw_mode; | 
 | .PP | 
 | .B void des_set_odd_parity(key) | 
 | des_cblock *key; | 
 | .PP | 
 | .B int des_is_weak_key(key) | 
 | des_cblock *key; | 
 | .PP | 
 | .B char *crypt(passwd,salt) | 
 | char *passwd; | 
 | char *salt; | 
 | .PP | 
 | .fi | 
 | .SH DESCRIPTION | 
 | This library contains a fast implementation of the DES encryption | 
 | algorithm. | 
 | .PP | 
 | There are two phases to the use of DES encryption. | 
 | The first is the generation of a | 
 | .I des_key_schedule | 
 | from a key, | 
 | the second is the actual encryption. | 
 | A des key is of type | 
 | .I des_cblock. | 
 | This type is made from 8 characters with odd parity. | 
 | The least significant bit in the character is the parity bit. | 
 | The key schedule is an expanded form of the key; it is used to speed the | 
 | encryption process. | 
 | .PP | 
 | .I des_read_password | 
 | writes the string specified by prompt to the standard output, | 
 | turns off echo and reads an input string from standard input | 
 | until terminated with a newline. | 
 | If verify is non-zero, it prompts and reads the input again and verifies | 
 | that both entered passwords are the same. | 
 | The entered string is converted into a des key by using the | 
 | .I des_string_to_key | 
 | routine. | 
 | The new key is placed in the | 
 | .I des_cblock | 
 | that was passed (by reference) to the routine. | 
 | If there were no errors, | 
 | .I des_read_password | 
 | returns 0, | 
 | -1 is returned if there was a terminal error and 1 is returned for | 
 | any other error. | 
 | .PP | 
 | .I des_read_2password | 
 | operates in the same way as | 
 | .I des_read_password | 
 | except that it generates 2 keys by using the | 
 | .I des_string_to_2key | 
 | function. | 
 | .PP | 
 | .I des_read_pw_string | 
 | is called by | 
 | .I des_read_password | 
 | to read and verify a string from a terminal device. | 
 | The string is returned in | 
 | .I buf. | 
 | The size of | 
 | .I buf | 
 | is passed to the routine via the | 
 | .I length | 
 | parameter. | 
 | .PP | 
 | .I des_string_to_key | 
 | converts a string into a valid des key. | 
 | .PP | 
 | .I des_string_to_2key | 
 | converts a string into 2 valid des keys. | 
 | This routine is best suited for used to generate keys for use with | 
 | .I des_ecb3_encrypt. | 
 | .PP | 
 | .I des_random_key | 
 | returns a random key that is made of a combination of process id, | 
 | time and an increasing counter. | 
 | .PP | 
 | Before a des key can be used it is converted into a | 
 | .I des_key_schedule | 
 | via the | 
 | .I des_set_key | 
 | routine. | 
 | If the | 
 | .I des_check_key | 
 | flag is non-zero, | 
 | .I des_set_key | 
 | will check that the key passed is of odd parity and is not a week or | 
 | semi-weak key. | 
 | If the parity is wrong, | 
 | then -1 is returned. | 
 | If the key is a weak key, | 
 | then -2 is returned. | 
 | If an error is returned, | 
 | the key schedule is not generated. | 
 | .PP | 
 | .I des_key_sched | 
 | is another name for the | 
 | .I des_set_key | 
 | function. | 
 | .PP | 
 | The following routines mostly operate on an input and output stream of | 
 | .I des_cblock's. | 
 | .PP | 
 | .I des_ecb_encrypt | 
 | is the basic DES encryption routine that encrypts or decrypts a single 8-byte | 
 | .I des_cblock | 
 | in | 
 | .I electronic code book | 
 | mode. | 
 | It always transforms the input data, pointed to by | 
 | .I input, | 
 | into the output data, | 
 | pointed to by the | 
 | .I output | 
 | argument. | 
 | If the | 
 | .I encrypt | 
 | argument is non-zero (DES_ENCRYPT), | 
 | the | 
 | .I input | 
 | (cleartext) is encrypted in to the | 
 | .I output | 
 | (ciphertext) using the key_schedule specified by the | 
 | .I schedule | 
 | argument, | 
 | previously set via | 
 | .I des_set_key. | 
 | If | 
 | .I encrypt | 
 | is zero (DES_DECRYPT), | 
 | the | 
 | .I input | 
 | (now ciphertext) | 
 | is decrypted into the | 
 | .I output | 
 | (now cleartext). | 
 | Input and output may overlap. | 
 | No meaningful value is returned. | 
 | .PP | 
 | .I des_ecb3_encrypt | 
 | encrypts/decrypts the | 
 | .I input | 
 | block by using triple ecb DES encryption. | 
 | This involves encrypting the input with  | 
 | .I ks1, | 
 | decryption with the key schedule | 
 | .I ks2, | 
 | and then encryption with the first again. | 
 | This routine greatly reduces the chances of brute force breaking of | 
 | DES and has the advantage of if | 
 | .I ks1 | 
 | and | 
 | .I ks2 | 
 | are the same, it is equivalent to just encryption using ecb mode and | 
 | .I ks1 | 
 | as the key. | 
 | .PP | 
 | .I des_cbc_encrypt | 
 | encrypts/decrypts using the | 
 | .I cipher-block-chaining | 
 | mode of DES. | 
 | If the | 
 | .I encrypt | 
 | argument is non-zero, | 
 | the routine cipher-block-chain encrypts the cleartext data pointed to by the | 
 | .I input | 
 | argument into the ciphertext pointed to by the | 
 | .I output | 
 | argument, | 
 | using the key schedule provided by the | 
 | .I schedule | 
 | argument, | 
 | and initialisation vector provided by the | 
 | .I ivec | 
 | argument. | 
 | If the | 
 | .I length | 
 | argument is not an integral multiple of eight bytes,  | 
 | the last block is copied to a temporary area and zero filled. | 
 | The output is always | 
 | an integral multiple of eight bytes. | 
 | To make multiple cbc encrypt calls on a large amount of data appear to | 
 | be one  | 
 | .I des_cbc_encrypt | 
 | call, the | 
 | .I ivec | 
 | of subsequent calls should be the last 8 bytes of the output. | 
 | .PP | 
 | .I des_3cbc_encrypt | 
 | encrypts/decrypts the | 
 | .I input | 
 | block by using triple cbc DES encryption. | 
 | This involves encrypting the input with key schedule | 
 | .I ks1, | 
 | decryption with the key schedule | 
 | .I ks2, | 
 | and then encryption with the first again. | 
 | 2 initialisation vectors are required, | 
 | .I ivec1 | 
 | and | 
 | .I ivec2. | 
 | Unlike | 
 | .I des_cbc_encrypt, | 
 | these initialisation vectors are modified by the subroutine. | 
 | This routine greatly reduces the chances of brute force breaking of | 
 | DES and has the advantage of if | 
 | .I ks1 | 
 | and | 
 | .I ks2 | 
 | are the same, it is equivalent to just encryption using cbc mode and | 
 | .I ks1 | 
 | as the key. | 
 | .PP | 
 | .I des_pcbc_encrypt | 
 | encrypt/decrypts using a modified block chaining mode. | 
 | It provides better error propagation characteristics than cbc | 
 | encryption. | 
 | .PP | 
 | .I des_cfb_encrypt | 
 | encrypt/decrypts using cipher feedback mode.  This method takes an | 
 | array of characters as input and outputs and array of characters.  It | 
 | does not require any padding to 8 character groups.  Note: the ivec | 
 | variable is changed and the new changed value needs to be passed to | 
 | the next call to this function.  Since this function runs a complete | 
 | DES ecb encryption per numbits, this function is only suggested for | 
 | use when sending small numbers of characters. | 
 | .PP | 
 | .I des_ofb_encrypt | 
 | encrypt using output feedback mode.  This method takes an | 
 | array of characters as input and outputs and array of characters.  It | 
 | does not require any padding to 8 character groups.  Note: the ivec | 
 | variable is changed and the new changed value needs to be passed to | 
 | the next call to this function.  Since this function runs a complete | 
 | DES ecb encryption per numbits, this function is only suggested for | 
 | use when sending small numbers of characters. | 
 | .PP | 
 | .I des_cbc_cksum | 
 | produces an 8 byte checksum based on the input stream (via cbc encryption). | 
 | The last 4 bytes of the checksum is returned and the complete 8 bytes is | 
 | placed in | 
 | .I output. | 
 | .PP | 
 | .I des_quad_cksum | 
 | returns a 4 byte checksum from the input bytes. | 
 | The algorithm can be iterated over the input, | 
 | depending on | 
 | .I out_count, | 
 | 1, 2, 3 or 4 times. | 
 | If | 
 | .I output | 
 | is non-NULL, | 
 | the 8 bytes generated by each pass are written into | 
 | .I output. | 
 | .PP | 
 | .I des_enc_write | 
 | is used to write | 
 | .I len | 
 | bytes | 
 | to file descriptor | 
 | .I fd | 
 | from buffer | 
 | .I buf. | 
 | The data is encrypted via | 
 | .I pcbc_encrypt | 
 | (default) using | 
 | .I sched | 
 | for the key and | 
 | .I iv | 
 | as a starting vector. | 
 | The actual data send down | 
 | .I fd | 
 | consists of 4 bytes (in network byte order) containing the length of the | 
 | following encrypted data.  The encrypted data then follows, padded with random | 
 | data out to a multiple of 8 bytes. | 
 | .PP | 
 | .I des_enc_read | 
 | is used to read | 
 | .I len | 
 | bytes | 
 | from file descriptor | 
 | .I fd | 
 | into buffer | 
 | .I buf. | 
 | The data being read from | 
 | .I fd | 
 | is assumed to have come from | 
 | .I des_enc_write | 
 | and is decrypted using | 
 | .I sched | 
 | for the key schedule and | 
 | .I iv | 
 | for the initial vector. | 
 | The | 
 | .I des_enc_read/des_enc_write | 
 | pair can be used to read/write to files, pipes and sockets. | 
 | I have used them in implementing a version of rlogin in which all | 
 | data is encrypted. | 
 | .PP | 
 | .I des_rw_mode | 
 | is used to specify the encryption mode to use with  | 
 | .I des_enc_read | 
 | and  | 
 | .I des_end_write. | 
 | If set to | 
 | .I DES_PCBC_MODE | 
 | (the default), des_pcbc_encrypt is used. | 
 | If set to | 
 | .I DES_CBC_MODE | 
 | des_cbc_encrypt is used. | 
 | These two routines and the variable are not part of the normal MIT library. | 
 | .PP | 
 | .I des_set_odd_parity | 
 | sets the parity of the passed | 
 | .I key | 
 | to odd.  This routine is not part of the standard MIT library. | 
 | .PP | 
 | .I des_is_weak_key | 
 | returns 1 is the passed key is a weak key (pick again :-), | 
 | 0 if it is ok. | 
 | This routine is not part of the standard MIT library. | 
 | .PP | 
 | .I crypt | 
 | is a replacement for the normal system crypt. | 
 | It is much faster than the system crypt. | 
 | .PP | 
 | .SH FILES | 
 | /usr/include/des.h | 
 | .br | 
 | /usr/lib/libdes.a | 
 | .PP | 
 | The encryption routines have been tested on 16bit, 32bit and 64bit | 
 | machines of various endian and even works under VMS. | 
 | .PP | 
 | .SH BUGS | 
 | .PP | 
 | If you think this manual is sparse, | 
 | read the des_crypt(3) manual from the MIT kerberos (or bones outside | 
 | of the USA) distribution. | 
 | .PP | 
 | .I des_cfb_encrypt | 
 | and | 
 | .I des_ofb_encrypt | 
 | operates on input of 8 bits.  What this means is that if you set | 
 | numbits to 12, and length to 2, the first 12 bits will come from the 1st | 
 | input byte and the low half of the second input byte.  The second 12 | 
 | bits will have the low 8 bits taken from the 3rd input byte and the | 
 | top 4 bits taken from the 4th input byte.  The same holds for output. | 
 | This function has been implemented this way because most people will | 
 | be using a multiple of 8 and because once you get into pulling bytes input | 
 | bytes apart things get ugly! | 
 | .PP | 
 | .I des_read_pw_string | 
 | is the most machine/OS dependent function and normally generates the | 
 | most problems when porting this code. | 
 | .PP | 
 | .I des_string_to_key | 
 | is probably different from the MIT version since there are lots | 
 | of fun ways to implement one-way encryption of a text string. | 
 | .PP | 
 | The routines are optimised for 32 bit machines and so are not efficient | 
 | on IBM PCs. | 
 | .PP | 
 | NOTE: extensive work has been done on this library since this document | 
 | was origionally written.  Please try to read des.doc from the libdes | 
 | distribution since it is far more upto date and documents more of the | 
 | functions.  Libdes is now also being shipped as part of SSLeay, a | 
 | general cryptographic library that amonst other things implements | 
 | netscapes SSL protocoll.  The most recent version can be found in | 
 | SSLeay distributions. | 
 | .SH AUTHOR | 
 | Eric Young (eay@cryptsoft.com) |