Provided by: libmcrypt-dev_2.5.8-3.3_amd64 bug

NAME

       libmcrypt - encryption/decryption library

SYNOPSIS

       [see also mcrypt.h for more information]

DESCRIPTION

       The  libmcrypt  is  a  data  encryption  library.  The library is thread safe and provides
       encryption and decryption functions.  This version of the library supports many encryption
       algorithms  and  encryption modes. Some algorithms which are supported: SERPENT, RIJNDAEL,
       3DES, GOST, SAFER+, CAST-256, RC2, XTEA, 3WAY, TWOFISH, BLOWFISH, ARCFOUR, WAKE and more.

       OFB, CBC, ECB, nOFB, nCFB and CFB are the modes that all algorithms  may  function.   ECB,
       CBC, encrypt in blocks but CTR, nCFB, nOFB, CFB and OFB in bytes (streams).  Note that CFB
       and OFB in the rest of the document represent the "8bit CFB or OFB" mode.  nOFB  and  nCFB
       modes  represents a n-bit OFB/CFB mode, n is used to represent the algorithm's block size.
       The library supports an extra STREAM mode to include some stream algorithms like  WAKE  or
       ARCFOUR.

       In  this version of the library all modes and algorithms are modular, which means that the
       algorithm and the mode is loaded at run-time.  This way you can add algorithms  and  modes
       faster, and much easier.

       LibMcrypt includes the following symmetric (block) algorithms:

       DES: The traditional DES algorithm designed by IBM and US NSA.  Uses 56 bit key and 64 bit
       block. It is now considered a weak algorithm, due to its small  key  size  (it  was  never
       intended for use with classified data).

       3DES  or  Triple DES: DES but with multiple (triple) encryption. It encrypts the plaintext
       once, then decrypts it with the second key, and encrypts  it  again  with  the  third  key
       (outer  cbc mode used for cbc).  Much better than traditional DES since the key is now 168
       bits (actually the effective key length is 112 bits due to the meet-in-the-middle attack).

       CAST-128: CAST was designed in  Canada  by  Carlisle  Adams  and  Stafford  Tavares.   The
       original algorithm used a 64bit key and block. The algorithm here is CAST-128 (also called
       CAST5) which has a 128bit key and 64bit block size.

       CAST-256: CAST-256 was designed by Carlisle Adams. It is a symmetric  cipher  designed  in
       accordance  with  the  CAST design procedure. It is an extention of the CAST-128, having a
       128 bit block size, and up to 256 bit key size.

       xTEA: TEA stands for the Tiny Encryption Algorithm. It is a  feistel  cipher  designed  by
       David  Wheeler  & Roger M. Needham.  The original TEA was intended for use in applications
       where code size is at a premium, or where it is necessary  for  someone  to  remember  the
       algorithm and code it on an arbitrary machine at a later time.  The algorithm used here is
       extended TEA and has a 128bit key size and 64bit block size.

       3-WAY: The 3way algorithm designed by Joan Daemen. It uses key and block size of 96 bits.

       SKIPJACK: SKIPJACK was designed by the US NSA. It was  part  of  the  ill-fated  "Clipper"
       Escrowed  Encryption  Standard  (EES) (FIPS 185) proposal. It operates on 64bit blocks and
       uses a key of 80 bits. SKIPJACK is provided only as an extra module to libmcrypt.

       BLOWFISH: The Blowfish algorithm designed by Bruce Schneier. It is better and faster  than
       DES. It can use a key up to 448 bits.

       TWOFISH:  Twofish  was  designed by Bruce Schneier, Doug Whiting, John Kelsey, Chris Hall,
       David Wagner for Counterpane systems. Intended to be highly secure and highly flexible. It
       uses a 128bit block size and 128,192,256 bit key size.  (Twofish is the default algorithm)

       LOKI97:  LOKI97  was  designed  by Lawrie Brown and Josef Pieprzyk. It has a 128-bit block
       length and a 256bit key schedule, which can be initialized using 128, 192 or 256 bit keys.
       It  has  evolved  from  the  earlier  LOKI89  and  LOKI91  64-bit  block  ciphers,  with a
       strengthened key schedule and a larger keyspace.

       RC2: RC2 (RC stands for Rivest Cipher) was designed by Ron Rivest. It uses block  size  of
       64  bit  and  a  key  size  from 8 to 1024 bits. It is optimized for 16bit microprocessors
       (reflecting its age). It is described in the RFC2268.

       ARCFOUR: RC4 was designed by Ron Rivest. For several years this algorithm was considered a
       trade  secret  and details were not available. In September 1994 someone posted the source
       code in the cypherpunks mailing list. Although the source code is  now  available  RC4  is
       trademarked  by  RSADSI  so  a  compatible  cipher named ARCFOUR is included in the mcrypt
       distribution. It is a stream cipher and has a maximum key of 2048 bits.

       RC6: RC6 was designed by Ron Rivest for RSA labs. In mcrypt it uses block size of 128  bit
       and  a  key size of 128/192/256 bits.  Refer to RSA Labs and Ron Rivest for any copyright,
       patent or license issues for the RC6 algorithm. RC6 is provided only as an extra module to
       libmcrypt.

       RIJNDAEL:  Rijndael is a block cipher, designed by Joan Daemen and Vincent Rijmen, and was
       approved for the USA's NIST Advanced Encryption Standard,  FIPS-197.   The  cipher  has  a
       variable  block  length  and key length. Rijndael can be implemented very efficiently on a
       wide range of processors and in hardware. The design of Rijndael was  strongly  influenced
       by  the  design of the block cipher Square.  There exist three versions of this algorithm,
       namely: RIJNDAEL-128 (the AES winner) , RIJNDAEL-192 , RIJNDAEL-256 The numerals 128,  192
       and 256 stand for the length of the block size.

       MARS:  MARS  is  a  128-bit  block  cipher designed by IBM as a candidate for the Advanced
       Encryption Standard. Refer to IBM for any copyright, patent or license issues for the MARS
       algorithm. MARS is provided only as an extra module to libmcrypt.

       PANAMA:  PANAMA  is  a  cryptographic module that can be used both as a cryptographic hash
       function and as a stream cipher. It designed by Joan Daemen and Craig Clapp.  PANAMA  (the
       stream cipher) is included in libmcrypt.

       WAKE:  WAKE  stands  for  Word Auto Key Encryption, and is an encryption system for medium
       speed encryption of blocks and of high security.  WAKE was designed by David  J.  Wheeler.
       It  is intended to be fast on most computers and relies on repeated table use and having a
       large state space.

       SERPENT: Serpent is a 128-bit block cipher designed by Ross Anderson, Eli Biham  and  Lars
       Knudsen as a candidate for the Advanced Encryption Standard.  Serpent's design was limited
       to well understood mechanisms, so that could rely on the wide experience of  block  cipher
       cryptanalysis,  and  achieve  the  highest  practical  level of assurance that no shortcut
       attack will be found. Serpent has twice as many rounds as  are  necessary,  to  block  all
       currently  known  shortcut  attacks. Despite these exacting design constraints, Serpent is
       faster than DES.

       IDEA: IDEA stands for International Data Encryption Algorithm and was designed  by  Xuejia
       Lai  and  James  Massey. It operates on 64bit blocks and uses a key of 128 bits.  Refer to
       Ascom-Tech AG for any copyright, patent or license issues for the IDEA algorithm. IDEA  is
       provided only as an extra module to libmcrypt.

       ENIGMA  (UNIX  crypt):  A  one-rotor  machine  designed  along  the  lines  of  Enigma but
       considerable trivialized. Very easy to  break  for  a  skilled  cryptanalyst.   I  suggest
       against using it. Added just for completeness.

       GOST:  A  former  soviet  union's  algorithm. An acronym for "Gosudarstvennyi Standard" or
       Government Standard. It uses a 256 bit key and a 64 bit block.
        The S-boxes used here are described in the Applied Cryptography book by  Bruce  Schneier.
       They were used in an application for the Central Bank of the Russian Federation.
        Some  quotes  from  gost.c:  The standard is written by A. Zabotin (project leader), G.P.
       Glazkov, and V.B. Isaeva.  It was accepted and introduced into use by the  action  of  the
       State  Standards  Committee of the USSR on 2 June 1989 as No. 1409.  It was to be reviewed
       in 1993, but  whether  anyone  wishes  to  take  on  this  obligation  from  the  USSR  is
       questionable.
        This  code  is based on the 25 November 1993 draft translation by Aleksandr Malchik, with
       Whitfield Diffie, of the Government Standard of the U.S.S.R. GOST 28149-89, "Cryptographic
       Transformation  Algorithm",  effective  1  July 1990.  (Whitfield.Diffie@eng.sun.com) Some
       details have been cleared up by the paper "Soviet Encryption Algorithm" by Josef  Pieprzyk
       and    Leonid    Tombak    of   the   University   of   Wollongong,   New   South   Wales.
       (josef/leo@cs.adfa.oz.au)

       SAFER: SAFER (Secure And Fast Encryption Routine) is a block  cipher  developed  by  Prof.
       J.L.  Massey  at  the Swiss Federal Institute of Technology.  There exist four versions of
       this algorithm, namely: SAFER K-64 , SAFER K-128 , SAFER  SK-64  and  SAFER  SK-128.   The
       numerals  64  and  128  stand  for the length of the user-selected key, 'K' stands for the
       original key schedule and 'SK' stands for the strengthened key schedule (in which some  of
       the  "weaknesses"  of  the  original key schedule have been removed). In mcrypt only SAFER
       SK-64 and SAFER SK-128 are used.

       SAFER+: SAFER+ was designed by Prof. J.L. Massey, Prof.  Gurgen  H.  Khachatrian  and  Dr.
       Melsik K. Kuregian for Cylink. SAFER+ is based on the existing SAFER family of ciphers and
       provides for a block size of 128bits and 128, 192 and 256 bits key length.

       A short description of the modes supported by libmcrypt:

       STREAM: The mode used with stream ciphers. In this mode the keystream from the  cipher  is
       XORed with the plaintext. Thus you should NOT ever use the same key.

       ECB:  The  Electronic  CodeBook  mode. It is the simplest mode to use with a block cipher.
       Encrypts each block independently. It is a block mode so  plaintext  length  should  be  a
       multiple of blocksize (n*blocksize).

       CBC:  The  Cipher Block Chaining mode. It is better than ECB since the plaintext is XOR'ed
       with the previous ciphertext. A random block should be placed as the first block  (IV)  so
       the  same  block  or messages always encrypt to something different. It is a block mode so
       plaintext length should be a multiple of blocksize (n*blocksize).

       CFB: The Cipher-Feedback Mode (in  8bit).  This  is  a  self-synchronizing  stream  cipher
       implemented  from  a  block cipher. This is the best mode to use for encrypting strings or
       streams. This mode requires an IV.

       OFB: The Output-Feedback Mode (in 8bit). This is a synchronous stream  cipher  implemented
       from  a  block cipher. It is intended for use in noisy lines, because corrupted ciphertext
       blocks do not corrupt the plaintext blocks that follow. Insecure  (because  used  in  8bit
       mode) so it is recommended not to use it. Added just for completeness.

       nOFB:  The  Output-Feedback  Mode  (in nbit). n Is the size of the block of the algorithm.
       This is a synchronous stream cipher implemented from a block cipher. It  is  intended  for
       use  in  noisy  lines,  because  corrupted  ciphertext blocks do not corrupt the plaintext
       blocks that follow. This mode operates in streams.

       nCFB: The Cipher-Feedback Mode (in nbit). n Is the size of the  block  of  the  algorithm.
       This  is  a  self  synchronizing  stream cipher implemented from a block cipher. This mode
       operates in streams.

       CTR: The Counter Mode. This is a stream cipher implemented from a block cipher. This  mode
       uses  the cipher to encrypt a set of input blocks, called counters, to produce blocks that
       will be XORed with the plaintext.  In libmcrypt the counter  is  the  given  IV  which  is
       incremented at each step.  This mode operates in streams.

       Error  Recovery  in  these  modes: If bytes are removed or lost from the file or stream in
       ECB, CTR, CBC and OFB modes, are impossible to recover, although CFB and nCFB  modes  will
       recover. If some bytes are altered then a full block of plaintext is affected in ECB, nOFB
       and CTR modes, two blocks in CBC, nCFB and CFB modes, but only the corresponding  byte  in
       OFB mode.

       Encryption can be done as follows:

       A call to function: MCRYPT mcrypt_module_open( char *algorithm, char* algorithm_directory,
                      char* mode, char* mode_directory);

       This function associates the algorithm and the mode specified.  The name of the  algorithm
       is  specified  in  algorithm,  eg  "twofish", and the algorithm_directory is the directory
       where the algorithm is (it may be null if it is the default). The  same  applies  for  the
       mode.   The  library  is  closed by calling mcrypt_module_close(), but you should not call
       that function if mcrypt_generic_end() is called before.  Normally it returns an encryption
       descriptor, or MCRYPT_FAILED on error.

       A  call  to  function:  int  mcrypt_generic_init( MCRYPT td, void *key, int lenofkey, void
       *IV);

       This function initializes all buffers for  the  specified  thread  The  maximum  value  of
       lenofkey  should  be  the  one  obtained  by calling mcrypt_get_key_size() and every value
       smaller than this is legal.  Note that Lenofkey should be specified  in  bytes  not  bits.
       The IV should normally have the size of the algorithms block size, but you must obtain the
       size by calling mcrypt_get_iv_size().  IV is ignored in ECB. IV MUST exist  in  CFB,  CBC,
       STREAM, nOFB and OFB modes. It needs to be random and unique (but not secret). The same IV
       must be used for encryption/decryption.  After calling  this  function  you  can  use  the
       descriptor for encryption or decryption (not both).  Returns a negative value on error.

       To encrypt now call:

       int mcrypt_generic( MCRYPT td, void *plaintext, int len);

       This  is  the  main  encryption  function.  td  is  the  encryption descriptor returned by
       mcrypt_generic_init(). Plaintext is the plaintext you wish to encrypt and  len  should  be
       the length (in bytes) of the plaintext and it should be k*algorithms_block_size if used in
       a mode which operated in blocks (cbc, ecb, nofb), or whatever when  used  in  cfb  or  ofb
       which  operate  in  streams.  The  plaintext  is  replaced by the ciphertext. Returns 0 on
       success.

       To decrypt you can call:

       int mdecrypt_generic( MCRYPT td, void *ciphertext, int len);

       The decryption function. It is almost the same with mcrypt_generic.  Returns 0 on success.

       When you're finished you should call:

       int mcrypt_generic_end( MCRYPT td);

       This function terminates encryption specified by the encryption descriptor (td).  Actually
       it  clears  all  buffers,  and  closes  all the modules used.  Returns a negative value on
       error.     This    function    is    deprecated.     Use    mcrypt_generic_deinit()    and
       mcrypt_module_close() instead.

       int mcrypt_generic_deinit( MCRYPT td);

       This function terminates encryption specified by the encryption descriptor (td).  Actually
       it clears all buffers. The difference with mcrypt_generic_end() is that this function does
       not  close  the  modules  used.  Thus  you  should  use mcrypt_module_close().  Using this
       function you gain in speed if you use the same modules for several encryptions.  Returns a
       negative value on error.

       int mcrypt_module_close( MCRYPT td);

       This function closes the modules used by the descriptor td.

       These  are  some  extra  functions  that  operate  on modules that have been opened: These
       functions have the prefix mcrypt_enc_*.

       int mcrypt_enc_set_state(MCRYPT td, void *state, int size); This function sets  the  state
       of  the  algorithm. Can be used only with block algorithms and certain modes like CBC, CFB
       etc.  It is usefully if you want to restart  or  start  a  different  encryption  quickly.
       Returns zero on success. The state is the output of mcrypt_enc_get_state().

       int  mcrypt_enc_get_state(MCRYPT  td,  void  *state, int *size); This function returns the
       state of the algorithm. Can be used only certain modes and algorithms. The size will  hold
       the  size  of  the state and the state must have enough bytes to hold it.  Returns zero on
       success.

       int mcrypt_enc_self_test( MCRYPT td);

       This function runs the self test on the algorithm specified by the descriptor td.  If  the
       self test succeeds it returns zero.

       int mcrypt_enc_is_block_algorithm_mode( MCRYPT td);

       Returns 1 if the mode is for use with block algorithms, otherwise it returns 0. (eg. 0 for
       stream, and 1 for cbc, cfb, ofb)

       int mcrypt_enc_is_block_algorithm( MCRYPT td);

       Returns 1 if the algorithm is a block algorithm or 0 if it is a stream algorithm.

       int mcrypt_enc_is_block_mode( MCRYPT td);

       Returns 1 if the mode outputs blocks of bytes or 0 if it outputs bytes.  (eg.  1  for  cbc
       and ecb, and 0 for cfb and stream)

       int mcrypt_enc_get_block_size( MCRYPT td);

       Returns  the  block size of the algorithm specified by the encryption descriptor in bytes.
       The algorithm MUST be opened using mcrypt_module_open().

       int mcrypt_enc_get_key_size( MCRYPT td);

       Returns the maximum supported key size  of  the  algorithm  specified  by  the  encryption
       descriptor in bytes. The algorithm MUST be opened using mcrypt_module_open().

       int* mcrypt_enc_get_supported_key_sizes( MCRYPT td, int* sizes)

       Returns  the  key sizes supported by the algorithm specified by the encryption descriptor.
       If sizes is zero and returns NULL then all key sizes between 1  and  mcrypt_get_key_size()
       are  supported  by  the  algorithm. If it is 1 then only the mcrypt_get_key_size() size is
       supported and sizes[0] is equal to it. If it is greater than 1 then that number  specifies
       the  number  of elements in sizes which are the key sizes that the algorithm supports. The
       returned value is allocated with malloc, so you should not forget to free it.

       int mcrypt_enc_get_iv_size( MCRYPT td);

       Returns size of the IV of the algorithm specified by the encryption descriptor  in  bytes.
       The  algorithm  MUST  be  opened  using mcrypt_module_open().  If it is '0' then the IV is
       ignored in that algorithm. IV is used in CBC, CFB, OFB modes, and in  some  algorithms  in
       STREAM mode.

       int mcrypt_enc_mode_has_iv( MCRYPT td);

       Returns  1  if  the mode needs an IV, 0 otherwise. Some 'stream' algorithms may need an IV
       even if the mode itself does not need an IV.

       char* mcrypt_enc_get_algorithms_name( MCRYPT td);

       Returns a character array containing the name of the algorithm.   The  returned  value  is
       allocated with malloc, so you should not forget to free it.

       char* mcrypt_enc_get_modes_name( MCRYPT td);

       Returns  a  character  array  containing  the  name  of  the  mode.  The returned value is
       allocated with malloc, so you should not forget to free it.

       These are some extra functions that operate on modules: These functions  have  the  prefix
       mcrypt_module_*.

       int mcrypt_module_self_test (char* algorithm, char* directory);

       This  function runs the self test on the specified algorithm. If the self test succeeds it
       returns zero.

       int mcrypt_module_is_block_algorithm_mode( char* algorithm, char* directory);

       Returns 1 if the mode is for use with block algorithms, otherwise it returns 0. (eg. 0 for
       stream, and 1 for cbc, cfb, ofb)

       int mcrypt_module_is_block_algorithm( char* mode, char* directory);

       Returns 1 if the algorithm is a block algorithm or 0 if it is a stream algorithm.

       int mcrypt_module_is_block_mode( char* mode, char* directory);

       Returns  1  if  the mode outputs blocks of bytes or 0 if it outputs bytes.  (eg. 1 for cbc
       and ecb, and 0 for cfb and stream)

       int mcrypt_module_get_algo_block_size( char* algorithm, char* directory);

       Returns the block size of the algorithm.

       int mcrypt_module_get_algo_key_size( char* algorithm, char* directory);

       Returns the maximum supported key size of the algorithm.

       int* mcrypt_module_get_algo_supported_key_sizes( char* algorithm,  char*  directory,  int*
       sizes);

       Returns  the  key sizes supported by the algorithm. If sizes is zero and returns NULL then
       all key sizes between 1 and mcrypt_get_key_size() are supported by the algorithm. If it is
       1 then only the mcrypt_get_key_size() size is supported and sizes[0] is equal to it. If it
       is greater than 1 then that number specifies the number of elements in sizes which are the
       key    sizes    that    the    algorithm    supports.    This    function    differs    to
       mcrypt_enc_get_supported_key_sizes(), because the return  value  here  is  allocated  (not
       static), thus it should be freed.

       char** mcrypt_list_algorithms ( char* libdir, int* size);

       Returns a pointer to a character array containing all the mcrypt algorithms located in the
       libdir, or if it is NULL, in the  default  directory.  The  size  is  the  number  of  the
       character  arrays.   The  arrays  are  allocated  internally  and should be freed by using
       mcrypt_free_p().

       char** mcrypt_list_modes ( char* libdir, int *size);

       Returns a pointer to a character array containing all the  mcrypt  modes  located  in  the
       libdir,  or  if  it  is  NULL,  in  the  default  directory. The size is the number of the
       character arrays.  The arrays should be freed by using mcrypt_free_p().

       void mcrypt_free_p (char **p, int size);

       Frees the pointer to array returned by previous functions.

       void mcrypt_free (void *ptr);

       Frees the memory used by the pointer.

       void mcrypt_perror(int err);

       This function prints a human readable description of the error 'err' in the  stderr.   The
       err should be a value returned by mcrypt_generic_init().

       const char* mcrypt_strerror(int err);

       This  function returns a human readable description of the error 'err'.  The err should be
       a value returned by mcrypt_generic_init().

       int mcrypt_mutex_register ( void (*mutex_lock)(void) , void (*mutex_unlock)(void) );

       This function is only used in multithreaded application and only if compiled with  dynamic
       module  loading  support.  This  is  actually  used  internally in libltdl. Except for the
       dynamic module loading libmcrypt is thread safe.

       Some example programs follow here. Compile as "cc prog.c -lmcrypt", or "cc prog.c -lmcrypt
       -lltdl"  depending  on  your  installation.  Libltdl is used for opening dynamic libraries
       (modules).

       /* First example: Encrypts stdin to stdout using TWOFISH with 128 bit key and CFB */

       #include <mcrypt.h>
       #include <stdio.h>
       #include <stdlib.h>
       /* #include <mhash.h> */

       main() {

         MCRYPT td;
         int i;
         char *key;
         char password[20];
         char block_buffer;
         char *IV;
         int keysize=16; /* 128 bits */

         key=calloc(1, keysize);
         strcpy(password, "A_large_key");

       /* Generate the key using the password */
       /*  mhash_keygen( KEYGEN_MCRYPT, MHASH_MD5, key, keysize, NULL, 0, password, strlen(password));
        */
         memmove( key, password, strlen(password));

         td = mcrypt_module_open("twofish", NULL, "cfb", NULL);
         if (td==MCRYPT_FAILED) {
            return 1;
         }
         IV = malloc(mcrypt_enc_get_iv_size(td));

       /* Put random data in IV. Note these are not real random data,
        * consider using /dev/random or /dev/urandom.
        */

         /*  srand(time(0)); */
         for (i=0; i< mcrypt_enc_get_iv_size( td); i++) {
           IV[i]=rand();
         }

         i=mcrypt_generic_init( td, key, keysize, IV);
         if (i<0) {
            mcrypt_perror(i);
            return 1;
         }

         /* Encryption in CFB is performed in bytes */
         while ( fread (&block_buffer, 1, 1, stdin) == 1 ) {
             mcrypt_generic (td, &block_buffer, 1);

       /* Comment above and uncomment this to decrypt */
       /*    mdecrypt_generic (td, &block_buffer, 1);  */

             fwrite ( &block_buffer, 1, 1, stdout);
         }

       /* Deinit the encryption thread, and unload the module */
         mcrypt_generic_end(td);

         return 0;

       }

       /* Second Example: encrypts using CBC and SAFER+ with 192 bits key */

       #include <mcrypt.h>
       #include <stdio.h>
       #include <stdlib.h>

       main() {

         MCRYPT td;
         int i;
         char *key; /* created using mcrypt_gen_key */
         char *block_buffer;
         char *IV;
         int blocksize;
         int keysize = 24; /* 192 bits == 24 bytes */

         key = calloc(1, keysize);
         strcpy(key, "A_large_and_random_key");

         td = mcrypt_module_open("saferplus", NULL, "cbc", NULL);

         blocksize = mcrypt_enc_get_block_size(td);
         block_buffer = malloc(blocksize);
       /* but unfortunately this does not fill all the key so the rest bytes are
        * padded with zeros. Try to use large keys or convert them with mcrypt_gen_key().
        */

         IV=malloc(mcrypt_enc_get_iv_size(td));

       /* Put random data in IV. Note these are not real random data,
        * consider using /dev/random or /dev/urandom.
        */

       /* srand(time(0)); */
         for (i=0; i < mcrypt_enc_get_iv_size(td); i++) {
           IV[i]=rand();
         }

         mcrypt_generic_init( td, key, keysize, IV);

         /* Encryption in CBC is performed in blocks */
         while ( fread (block_buffer, 1, blocksize, stdin) == blocksize ) {
             mcrypt_generic (td, block_buffer, blocksize);
       /*      mdecrypt_generic (td, block_buffer, blocksize); */
             fwrite ( block_buffer, 1, blocksize, stdout);
         }

       /* deinitialize the encryption thread */
         mcrypt_generic_deinit (td);

       /* Unload the loaded module */
         mcrypt_module_close(td);
         return 0;

       }

       The library does not install any signal handler.

       Questions about libmcrypt should be sent to:

              mcrypt-dev@lists.hellug.gr or, if this fails, to the author addresses given  below.
              The mcrypt home page is:

              http://mcrypt.hellug.gr

AUTHORS

       Version 2.4 Copyright (C) 1998-1999 Nikos Mavroyanopoulos (nmav@hellug.gr).

       Thanks  to  all  the  people  who reported problems and suggested various improvements for
       mcrypt; who are too numerous to cite here.

                                          10 March 2002                                 MCRYPT(3)