Botan  1.11.10
Public Types | Public Member Functions | List of all members
Botan::GOST_28147_89 Class Reference

#include <gost_28147.h>

Inheritance diagram for Botan::GOST_28147_89:
Botan::Block_Cipher_Fixed_Params< 8, 32 > Botan::BlockCipher Botan::SymmetricAlgorithm

Public Types

enum  
 

Public Member Functions

size_t block_size () const
 
void clear ()
 
BlockCipherclone () const
 
void decrypt (const byte in[], byte out[]) const
 
void decrypt (byte block[]) const
 
template<typename Alloc >
void decrypt (std::vector< byte, Alloc > &block) const
 
template<typename Alloc , typename Alloc2 >
void decrypt (const std::vector< byte, Alloc > &in, std::vector< byte, Alloc2 > &out) const
 
void decrypt_n (const byte in[], byte out[], size_t blocks) const
 
void encrypt (const byte in[], byte out[]) const
 
void encrypt (byte block[]) const
 
template<typename Alloc >
void encrypt (std::vector< byte, Alloc > &block) const
 
template<typename Alloc , typename Alloc2 >
void encrypt (const std::vector< byte, Alloc > &in, std::vector< byte, Alloc2 > &out) const
 
void encrypt_n (const byte in[], byte out[], size_t blocks) const
 
 GOST_28147_89 (const GOST_28147_89_Params &params)
 
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)
 
template<typename Alloc >
void set_key (const std::vector< byte, Alloc > &key)
 
void set_key (const byte key[], size_t length)
 
bool valid_keylength (size_t length) const
 

Detailed Description

GOST 28147-89

Definition at line 52 of file gost_28147.h.

Member Enumeration Documentation

anonymous enum
inherited

Constructor & Destructor Documentation

Botan::GOST_28147_89::GOST_28147_89 ( const GOST_28147_89_Params params)
Parameters
paramsthe sbox parameters to use

Definition at line 54 of file gost_28147.cpp.

References Botan::rotate_left(), and Botan::GOST_28147_89_Params::sbox_entry().

54  : SBOX(1024)
55  {
56  // Convert the parallel 4x4 sboxes into larger word-based sboxes
57  for(size_t i = 0; i != 4; ++i)
58  for(size_t j = 0; j != 256; ++j)
59  {
60  const u32bit T = (param.sbox_entry(2*i , j % 16)) |
61  (param.sbox_entry(2*i+1, j / 16) << 4);
62  SBOX[256*i+j] = rotate_left(T, (11+8*i) % 32);
63  }
64  }
T rotate_left(T input, size_t rot)
Definition: rotate.h:21
uint32_t u32bit
Definition: types.h:32

Member Function Documentation

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

Implements Botan::BlockCipher.

Definition at line 152 of file block_cipher.h.

152 { return BS; }
void Botan::GOST_28147_89::clear ( )
virtual

Implements Botan::SymmetricAlgorithm.

Definition at line 172 of file gost_28147.cpp.

References Botan::zap().

Referenced by Botan::GOST_34_11::clear().

173  {
174  zap(EK);
175  }
void zap(std::vector< T, Alloc > &vec)
Definition: secmem.h:176
BlockCipher* Botan::GOST_28147_89::clone ( ) const
inlinevirtual
Returns
new object representing the same algorithm as *this

Implements Botan::BlockCipher.

Definition at line 61 of file gost_28147.h.

61 { return new GOST_28147_89(SBOX); }
GOST_28147_89(const GOST_28147_89_Params &params)
Definition: gost_28147.cpp:54
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(), Botan::XTS_Decryption::finish(), and Botan::CTS_Decryption::finish().

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
template<typename Alloc >
void Botan::BlockCipher::decrypt ( std::vector< byte, Alloc > &  block) const
inlineinherited

Decrypt one or more blocks

Parameters
blockthe input/output buffer (multiple of block_size())

Definition at line 91 of file block_cipher.h.

92  {
93  return decrypt_n(&block[0], &block[0], block.size() / block_size());
94  }
virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const =0
virtual size_t block_size() const =0
template<typename Alloc , typename Alloc2 >
void Botan::BlockCipher::decrypt ( const std::vector< byte, Alloc > &  in,
std::vector< byte, Alloc2 > &  out 
) const
inlineinherited

Decrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)

Definition at line 114 of file block_cipher.h.

116  {
117  return decrypt_n(&in[0], &out[0], in.size() / block_size());
118  }
virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const =0
virtual size_t block_size() const =0
void Botan::GOST_28147_89::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 136 of file gost_28147.cpp.

References Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE, GOST_2ROUND, Botan::load_le< u32bit >(), and Botan::store_le().

137  {
138  for(size_t i = 0; i != blocks; ++i)
139  {
140  u32bit N1 = load_le<u32bit>(in, 0);
141  u32bit N2 = load_le<u32bit>(in, 1);
142 
143  GOST_2ROUND(N1, N2, 0, 1);
144  GOST_2ROUND(N1, N2, 2, 3);
145  GOST_2ROUND(N1, N2, 4, 5);
146  GOST_2ROUND(N1, N2, 6, 7);
147 
148  for(size_t j = 0; j != 3; ++j)
149  {
150  GOST_2ROUND(N1, N2, 7, 6);
151  GOST_2ROUND(N1, N2, 5, 4);
152  GOST_2ROUND(N1, N2, 3, 2);
153  GOST_2ROUND(N1, N2, 1, 0);
154  }
155 
156  store_le(out, N2, N1);
157  in += BLOCK_SIZE;
158  out += BLOCK_SIZE;
159  }
160  }
void store_le(u16bit in, byte out[2])
Definition: loadstor.h:427
u32bit load_le< u32bit >(const byte in[], size_t off)
Definition: loadstor.h:183
uint32_t u32bit
Definition: types.h:32
#define GOST_2ROUND(N1, N2, R1, R2)
Definition: gost_28147.cpp:88
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::DESX::encrypt_n(), Botan::XTS_Encryption::finish(), Botan::CTS_Encryption::finish(), Botan::CFB_Encryption::update(), Botan::CBC_Encryption::update(), and Botan::CFB_Decryption::update().

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
template<typename Alloc >
void Botan::BlockCipher::encrypt ( std::vector< byte, Alloc > &  block) const
inlineinherited

Encrypt one or more blocks

Parameters
blockthe input/output buffer (multiple of block_size())

Definition at line 81 of file block_cipher.h.

82  {
83  return encrypt_n(&block[0], &block[0], block.size() / block_size());
84  }
virtual void encrypt_n(const byte in[], byte out[], size_t blocks) const =0
virtual size_t block_size() const =0
template<typename Alloc , typename Alloc2 >
void Botan::BlockCipher::encrypt ( const std::vector< byte, Alloc > &  in,
std::vector< byte, Alloc2 > &  out 
) const
inlineinherited

Encrypt one or more blocks

Parameters
inthe input buffer (multiple of block_size())
outthe output buffer (same size as in)

Definition at line 102 of file block_cipher.h.

104  {
105  return encrypt_n(&in[0], &out[0], in.size() / block_size());
106  }
virtual void encrypt_n(const byte in[], byte out[], size_t blocks) const =0
virtual size_t block_size() const =0
void Botan::GOST_28147_89::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 106 of file gost_28147.cpp.

References Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE, GOST_2ROUND, Botan::load_le< u32bit >(), and Botan::store_le().

107  {
108  for(size_t i = 0; i != blocks; ++i)
109  {
110  u32bit N1 = load_le<u32bit>(in, 0);
111  u32bit N2 = load_le<u32bit>(in, 1);
112 
113  for(size_t j = 0; j != 3; ++j)
114  {
115  GOST_2ROUND(N1, N2, 0, 1);
116  GOST_2ROUND(N1, N2, 2, 3);
117  GOST_2ROUND(N1, N2, 4, 5);
118  GOST_2ROUND(N1, N2, 6, 7);
119  }
120 
121  GOST_2ROUND(N1, N2, 7, 6);
122  GOST_2ROUND(N1, N2, 5, 4);
123  GOST_2ROUND(N1, N2, 3, 2);
124  GOST_2ROUND(N1, N2, 1, 0);
125 
126  store_le(out, N2, N1);
127 
128  in += BLOCK_SIZE;
129  out += BLOCK_SIZE;
130  }
131  }
void store_le(u16bit in, byte out[2])
Definition: loadstor.h:427
u32bit load_le< u32bit >(const byte in[], size_t off)
Definition: loadstor.h:183
uint32_t u32bit
Definition: types.h:32
#define GOST_2ROUND(N1, N2, R1, R2)
Definition: gost_28147.cpp:88
Key_Length_Specification Botan::Block_Cipher_Fixed_Params< BS, KMIN, KMAX, KMOD >::key_spec ( ) const
inlinevirtualinherited
Returns
object describing limits on key size

Implements Botan::SymmetricAlgorithm.

Definition at line 154 of file block_cipher.h.

155  {
156  return Key_Length_Specification(KMIN, KMAX, KMOD);
157  }
size_t Botan::SymmetricAlgorithm::maximum_keylength ( ) const
inlineinherited
Returns
minimum allowed key length

Definition at line 36 of file sym_algo.h.

37  {
38  return key_spec().maximum_keylength();
39  }
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 44 of file sym_algo.h.

45  {
46  return key_spec().minimum_keylength();
47  }
size_t minimum_keylength() const
Definition: key_spec.h:61
virtual Key_Length_Specification key_spec() const =0
std::string Botan::GOST_28147_89::name ( ) const
virtual

Implements Botan::SymmetricAlgorithm.

Definition at line 66 of file gost_28147.cpp.

67  {
68  /*
69  'Guess' the right name for the sbox on the basis of the values.
70  This would need to be updated if support for other sbox parameters
71  is added. Preferably, we would just store the string value in the
72  constructor, but can't break binary compat.
73  */
74  std::string sbox_name = "";
75  if(SBOX[0] == 0x00072000)
76  sbox_name = "R3411_94_TestParam";
77  else if(SBOX[0] == 0x0002D000)
78  sbox_name = "R3411_CryptoPro";
79  else
80  throw Internal_Error("GOST-28147 unrecognized sbox value");
81 
82  return "GOST-28147-89(" + sbox_name + ")";
83  }
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.

Referenced by Botan::XTS_Mode::update_granularity(), Botan::CBC_Mode::update_granularity(), and Botan::ECB_Mode::update_granularity().

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

Set the symmetric key of this object.

Parameters
keythe SymmetricKey to be set.

Definition at line 63 of file sym_algo.h.

References Botan::OctetString::begin(), and Botan::OctetString::length().

Referenced by Botan::aont_package(), and Botan::aont_unpackage().

64  {
65  set_key(key.begin(), key.length());
66  }
void set_key(const SymmetricKey &key)
Definition: sym_algo.h:63
template<typename Alloc >
void Botan::SymmetricAlgorithm::set_key ( const std::vector< byte, Alloc > &  key)
inlineinherited

Definition at line 69 of file sym_algo.h.

70  {
71  set_key(&key[0], key.size());
72  }
void set_key(const SymmetricKey &key)
Definition: sym_algo.h:63
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 79 of file sym_algo.h.

80  {
81  if(!valid_keylength(length))
82  throw Invalid_Key_Length(name(), length);
83  key_schedule(key, length);
84  }
bool valid_keylength(size_t length) const
Definition: sym_algo.h:54
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 54 of file sym_algo.h.

Referenced by Botan::aont_package(), and Botan::aont_unpackage().

55  {
56  return key_spec().valid_keylength(length);
57  }
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: