=pod

=head1 NAME

blowfish, BF_set_key, BF_encrypt, BF_decrypt, BF_ecb_encrypt, BF_cbc_encrypt,
BF_cfb64_encrypt, BF_ofb64_encrypt, BF_options - Blowfish encryption

=head1 SYNOPSIS

 #include <openssl/blowfish.h>

 void BF_set_key(BF_KEY *key, int len, const unsigned char *data);

 void BF_ecb_encrypt(const unsigned char *in, unsigned char *out,
         BF_KEY *key, int enc);
 void BF_cbc_encrypt(const unsigned char *in, unsigned char *out,
 	 long length, BF_KEY *schedule, unsigned char *ivec, int enc);
 void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out,
 	 long length, BF_KEY *schedule, unsigned char *ivec, int *num,
         int enc);
 void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out,
 	 long length, BF_KEY *schedule, unsigned char *ivec, int *num);
 const char *BF_options(void);

 void BF_encrypt(BF_LONG *data,const BF_KEY *key);
 void BF_decrypt(BF_LONG *data,const BF_KEY *key);

=head1 DESCRIPTION

This library implements the Blowfish cipher, which is invented and described
by Counterpane (see http://www.counterpane.com/blowfish.html ).

Blowfish is a block cipher that operates on 64 bit (8 byte) blocks of data.
It uses a variable size key, but typically, 128 bit (16 byte) keys are
a considered good for strong encryption.  Blowfish can be used in the same
modes as DES (see L<des_modes(7)|des_modes(7)>).  Blowfish is currently one
of the faster block ciphers.  It is quite a bit faster than DES, and much
faster than IDEA or RC2.

Blowfish consists of a key setup phase and the actual encryption or decryption
phase.

BF_set_key() sets up the B<BF_KEY> B<key> using the B<len> bytes long key
at B<data>.

BF_ecb_encrypt() is the basic Blowfish encryption and decryption function.
It encrypts or decrypts the first 64 bits of B<in> using the key B<key>,
putting the result in B<out>.  B<enc> decides if encryption (B<BF_ENCRYPT>)
or decryption (B<BF_DECRYPT>) shall be performed.  The vector pointed at by
B<in> and B<out> must be 64 bits in length, no less.  If they are larger,
everything after the first 64 bits is ignored.

The mode functions BF_cbc_encrypt(), BF_cfb64_encrypt() and BF_ofb64_encrypt()
all operate on variable length data.  They all take an initialization vector
B<ivec> which needs to be passed along into the next call of the same function 
for the same message.  B<ivec> may be initialized with anything, but the
recipient needs to know what it was initialized with, or it won't be able
to decrypt.  Some programs and protocols simplify this, like SSH, where
B<ivec> is simply initialized to zero.
BF_cbc_encrypt() operates of data that is a multiple of 8 bytes long, while
BF_cfb64_encrypt() and BF_ofb64_encrypt() are used to encrypt an variable
number of bytes (the amount does not have to be an exact multiple of 8).  The
purpose of the latter two is to simulate stream ciphers, and therefore, they
need the parameter B<num>, which is a pointer to an integer where the current
offset in B<ivec> is stored between calls.  This integer must be initialized
to zero when B<ivec> is initialized.

BF_cbc_encrypt() is the Cipher Block Chaining function for Blowfish.  It
encrypts or decrypts the 64 bits chunks of B<in> using the key B<schedule>,
putting the result in B<out>.  B<enc> decides if encryption (BF_ENCRYPT) or
decryption (BF_DECRYPT) shall be performed.  B<ivec> must point at an 8 byte
long initialization vector.

BF_cfb64_encrypt() is the CFB mode for Blowfish with 64 bit feedback.
It encrypts or decrypts the bytes in B<in> using the key B<schedule>,
putting the result in B<out>.  B<enc> decides if encryption (B<BF_ENCRYPT>)
or decryption (B<BF_DECRYPT>) shall be performed.  B<ivec> must point at an
8 byte long initialization vector. B<num> must point at an integer which must
be initially zero.

BF_ofb64_encrypt() is the OFB mode for Blowfish with 64 bit feedback.
It uses the same parameters as BF_cfb64_encrypt(), which must be initialized
the same way.

BF_encrypt() and BF_decrypt() are the lowest level functions for Blowfish
encryption.  They encrypt/decrypt the first 64 bits of the vector pointed by
B<data>, using the key B<key>.  These functions should not be used unless you
implement 'modes' of Blowfish.  The alternative is to use BF_ecb_encrypt().
If you still want to use these functions, you should be aware that they take
each 32-bit chunk in host-byte order, which is little-endian on little-endian
platforms and big-endian on big-endian ones.

=head1 RETURN VALUES

None of the functions presented here return any value.

=head1 NOTE

Applications should use the higher level functions
L<EVP_EncryptInit(3)|EVP_EncryptInit(3)> etc. instead of calling the
blowfish functions directly.

=head1 SEE ALSO

L<des_modes(7)|des_modes(7)>

=head1 HISTORY

The Blowfish functions are available in all versions of SSLeay and OpenSSL.

=cut

