Botan  1.10.9
Public Types | Public Member Functions | List of all members
Botan::Blowfish Class Reference

#include <blowfish.h>

Inheritance diagram for Botan::Blowfish:
Botan::Block_Cipher_Fixed_Params< 8, 1, 56 > Botan::BlockCipher Botan::SymmetricAlgorithm Botan::Algorithm

Public Types

enum  
 

Public Member Functions

size_t block_size () const
 
 Blowfish ()
 
void clear ()
 
BlockCipherclone () const
 
void decrypt (const byte in[], byte out[]) const
 
void decrypt (byte block[]) const
 
void decrypt_n (const byte in[], byte out[], size_t blocks) const
 
void eks_key_schedule (const byte key[], size_t key_length, const byte salt[16], size_t workfactor)
 
void encrypt (const byte in[], byte out[]) const
 
void encrypt (byte block[]) const
 
void encrypt_n (const byte in[], byte out[], size_t blocks) const
 
Key_Length_Specification key_spec () const
 
size_t maximum_keylength () const
 
size_t minimum_keylength () const
 
std::string name () const
 
size_t parallel_bytes () const
 
virtual size_t parallelism () const
 
void set_key (const SymmetricKey &key)
 
void set_key (const byte key[], size_t length)
 
bool valid_keylength (size_t length) const
 

Detailed Description

Blowfish

Definition at line 18 of file blowfish.h.

Member Enumeration Documentation

anonymous enum
inherited

Constructor & Destructor Documentation

Botan::Blowfish::Blowfish ( )
inline

Definition at line 34 of file blowfish.h.

34 : S(1024), P(18) {}

Member Function Documentation

size_t Botan::Block_Cipher_Fixed_Params< BS, KMIN, KMAX, 1 >::block_size ( ) const
inlinevirtualinherited
Returns
block size of this algorithm

Implements Botan::BlockCipher.

Definition at line 108 of file block_cipher.h.

108 { return BS; }
void Botan::Blowfish::clear ( )
virtual

Zeroize internal state

Implements Botan::Algorithm.

Definition at line 181 of file blowfish.cpp.

References Botan::MemoryRegion< T >::begin().

Referenced by eks_key_schedule().

182  {
183  std::copy(P_INIT, P_INIT + 18, P.begin());
184  std::copy(S_INIT, S_INIT + 1024, S.begin());
185  }
BlockCipher* Botan::Blowfish::clone ( ) const
inlinevirtual

Get a new object representing the same algorithm as *this

Implements Botan::BlockCipher.

Definition at line 32 of file blowfish.h.

32 { return new Blowfish; }
void Botan::BlockCipher::decrypt ( const byte  in[],
byte  out[] 
) const
inlineinherited

Decrypt a block.

Parameters
inThe ciphertext block to be decypted as a byte array. Must be of length block_size().
outThe byte array designated to hold the decrypted block. Must be of length block_size().

Definition at line 57 of file block_cipher.h.

Referenced by Botan::DESX::decrypt_n().

58  { decrypt_n(in, out, 1); }
virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const =0
void Botan::BlockCipher::decrypt ( byte  block[]) const
inlineinherited

Decrypt a block.

Parameters
blockthe ciphertext block to be decrypted Must be of length block_size(). Will hold the result when the function has finished.

Definition at line 74 of file block_cipher.h.

74 { decrypt_n(block, block, 1); }
virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const =0
void Botan::Blowfish::decrypt_n ( const byte  in[],
byte  out[],
size_t  blocks 
) const
virtual

Decrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)
blocksthe number of blocks to process

Implements Botan::BlockCipher.

Definition at line 51 of file blowfish.cpp.

References Botan::Block_Cipher_Fixed_Params< 8, 1, 56 >::BLOCK_SIZE, Botan::get_byte(), Botan::load_be< u32bit >(), and Botan::store_be().

52  {
53  const u32bit* S1 = &S[0];
54  const u32bit* S2 = &S[256];
55  const u32bit* S3 = &S[512];
56  const u32bit* S4 = &S[768];
57 
58  for(size_t i = 0; i != blocks; ++i)
59  {
60  u32bit L = load_be<u32bit>(in, 0);
61  u32bit R = load_be<u32bit>(in, 1);
62 
63  for(size_t j = 17; j != 1; j -= 2)
64  {
65  L ^= P[j];
66  R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^
67  S3[get_byte(2, L)]) + S4[get_byte(3, L)];
68 
69  R ^= P[j-1];
70  L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^
71  S3[get_byte(2, R)]) + S4[get_byte(3, R)];
72  }
73 
74  L ^= P[1]; R ^= P[0];
75 
76  store_be(out, R, L);
77 
78  in += BLOCK_SIZE;
79  out += BLOCK_SIZE;
80  }
81  }
byte get_byte(size_t byte_num, T input)
Definition: get_byte.h:21
u32bit load_be< u32bit >(const byte in[], size_t off)
Definition: loadstor.h:166
void store_be(u16bit in, byte out[2])
Definition: loadstor.h:412
unsigned int u32bit
Definition: types.h:32
void Botan::Blowfish::eks_key_schedule ( const byte  key[],
size_t  key_length,
const byte  salt[16],
size_t  workfactor 
)

Modified EKSBlowfish key schedule, used for bcrypt password hashing

Definition at line 111 of file blowfish.cpp.

References clear(), and r.

113  {
114  if(length == 0 || length >= 56)
115  throw Invalid_Key_Length("EKSBlowfish", length);
116 
117  if(workfactor == 0)
118  throw std::invalid_argument("Bcrypt work factor must be at least 1");
119 
120  /*
121  * On a 2.8 GHz Core-i7, workfactor == 18 takes about 25 seconds to
122  * hash a password. This seems like a reasonable upper bound for the
123  * time being.
124  */
125  if(workfactor > 18)
126  throw std::invalid_argument("Requested Bcrypt work factor too large");
127 
128  clear();
129 
130  const byte null_salt[16] = { 0 };
131 
132  key_expansion(key, length, salt);
133 
134  const size_t rounds = 1 << workfactor;
135 
136  for(size_t r = 0; r != rounds; ++r)
137  {
138  key_expansion(key, length, null_salt);
139  key_expansion(salt, 16, null_salt);
140  }
141  }
unsigned char byte
Definition: types.h:22
BigInt r
Definition: numthry.cpp:26
void Botan::BlockCipher::encrypt ( const byte  in[],
byte  out[] 
) const
inlineinherited

Encrypt a block.

Parameters
inThe plaintext block to be encrypted as a byte array. Must be of length block_size().
outThe byte array designated to hold the encrypted block. Must be of length block_size().

Definition at line 47 of file block_cipher.h.

Referenced by Botan::aont_package(), Botan::aont_unpackage(), Botan::OFB::cipher(), Botan::DESX::encrypt_n(), Botan::CFB_Encryption::set_iv(), Botan::OFB::set_iv(), Botan::XTS_Encryption::set_iv(), Botan::CFB_Decryption::set_iv(), and Botan::XTS_Decryption::set_iv().

48  { encrypt_n(in, out, 1); }
virtual void encrypt_n(const byte in[], byte out[], size_t blocks) const =0
void Botan::BlockCipher::encrypt ( byte  block[]) const
inlineinherited

Encrypt a block.

Parameters
blockthe plaintext block to be encrypted Must be of length block_size(). Will hold the result when the function has finished.

Definition at line 66 of file block_cipher.h.

66 { encrypt_n(block, block, 1); }
virtual void encrypt_n(const byte in[], byte out[], size_t blocks) const =0
void Botan::Blowfish::encrypt_n ( const byte  in[],
byte  out[],
size_t  blocks 
) const
virtual

Encrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)
blocksthe number of blocks to process

Implements Botan::BlockCipher.

Definition at line 16 of file blowfish.cpp.

References Botan::Block_Cipher_Fixed_Params< 8, 1, 56 >::BLOCK_SIZE, Botan::get_byte(), Botan::load_be< u32bit >(), and Botan::store_be().

17  {
18  const u32bit* S1 = &S[0];
19  const u32bit* S2 = &S[256];
20  const u32bit* S3 = &S[512];
21  const u32bit* S4 = &S[768];
22 
23  for(size_t i = 0; i != blocks; ++i)
24  {
25  u32bit L = load_be<u32bit>(in, 0);
26  u32bit R = load_be<u32bit>(in, 1);
27 
28  for(size_t j = 0; j != 16; j += 2)
29  {
30  L ^= P[j];
31  R ^= ((S1[get_byte(0, L)] + S2[get_byte(1, L)]) ^
32  S3[get_byte(2, L)]) + S4[get_byte(3, L)];
33 
34  R ^= P[j+1];
35  L ^= ((S1[get_byte(0, R)] + S2[get_byte(1, R)]) ^
36  S3[get_byte(2, R)]) + S4[get_byte(3, R)];
37  }
38 
39  L ^= P[16]; R ^= P[17];
40 
41  store_be(out, R, L);
42 
43  in += BLOCK_SIZE;
44  out += BLOCK_SIZE;
45  }
46  }
byte get_byte(size_t byte_num, T input)
Definition: get_byte.h:21
u32bit load_be< u32bit >(const byte in[], size_t off)
Definition: loadstor.h:166
void store_be(u16bit in, byte out[2])
Definition: loadstor.h:412
unsigned int u32bit
Definition: types.h:32
Key_Length_Specification Botan::Block_Cipher_Fixed_Params< BS, KMIN, KMAX, 1 >::key_spec ( ) const
inlinevirtualinherited
Returns
object describing limits on key size

Implements Botan::SymmetricAlgorithm.

Definition at line 110 of file block_cipher.h.

111  {
112  return Key_Length_Specification(KMIN, KMAX, KMOD);
113  }
size_t Botan::SymmetricAlgorithm::maximum_keylength ( ) const
inlineinherited
Returns
minimum allowed key length

Definition at line 33 of file sym_algo.h.

34  {
35  return key_spec().maximum_keylength();
36  }
size_t maximum_keylength() const
Definition: key_spec.h:69
virtual Key_Length_Specification key_spec() const =0
size_t Botan::SymmetricAlgorithm::minimum_keylength ( ) const
inlineinherited
Returns
maxmium allowed key length

Definition at line 41 of file sym_algo.h.

42  {
43  return key_spec().minimum_keylength();
44  }
size_t minimum_keylength() const
Definition: key_spec.h:61
virtual Key_Length_Specification key_spec() const =0
std::string Botan::Blowfish::name ( ) const
inlinevirtual
Returns
name of this algorithm

Implements Botan::Algorithm.

Definition at line 31 of file blowfish.h.

31 { return "Blowfish"; }
size_t Botan::BlockCipher::parallel_bytes ( ) const
inlineinherited
Returns
prefererred parallelism of this cipher in bytes

Definition at line 35 of file block_cipher.h.

References block_size.

36  {
37  return parallelism() * block_size() * BOTAN_BLOCK_CIPHER_PAR_MULT;
38  }
virtual size_t parallelism() const
Definition: block_cipher.h:30
virtual size_t block_size() const =0
virtual size_t Botan::BlockCipher::parallelism ( ) const
inlinevirtualinherited
Returns
native parallelism of this cipher in blocks

Reimplemented in Botan::AES_256_NI, Botan::AES_192_NI, Botan::AES_128_NI, Botan::IDEA_SSE2, Botan::Noekeon_SIMD, Botan::Serpent_SIMD, and Botan::XTEA_SIMD.

Definition at line 30 of file block_cipher.h.

30 { return 1; }
void Botan::SymmetricAlgorithm::set_key ( const SymmetricKey key)
inlineinherited
void Botan::SymmetricAlgorithm::set_key ( const byte  key[],
size_t  length 
)
inlineinherited

Set the symmetric key of this object.

Parameters
keythe to be set as a byte array.
lengthin bytes of key param

Definition at line 68 of file sym_algo.h.

69  {
70  if(!valid_keylength(length))
71  throw Invalid_Key_Length(name(), length);
72  key_schedule(key, length);
73  }
bool valid_keylength(size_t length) const
Definition: sym_algo.h:51
virtual std::string name() const =0
bool Botan::SymmetricAlgorithm::valid_keylength ( size_t  length) const
inlineinherited

Check whether a given key length is valid for this algorithm.

Parameters
lengththe key length to be checked.
Returns
true if the key length is valid.

Definition at line 51 of file sym_algo.h.

Referenced by Botan::aont_package(), Botan::aont_unpackage(), Botan::HMAC_RNG::HMAC_RNG(), Botan::Lion::Lion(), Botan::Randpool::Randpool(), and Botan::EAX_Base::valid_keylength().

52  {
53  return key_spec().valid_keylength(length);
54  }
bool valid_keylength(size_t length) const
Definition: key_spec.h:51
virtual Key_Length_Specification key_spec() const =0

The documentation for this class was generated from the following files: