Botan 1.10.17

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:

## Public Types
enum |

## Public Member Functions
size_t | block_size () const
void | clear ()
BlockCipher * | clone () 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 | encrypt (const byte in[], byte out[]) const
void | encrypt (byte block[]) 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)
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

anonymous enum
| inherited

Definition at line 107 of file block_cipher.h.

107 { BLOCK_SIZE = BS };
Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE
Definition: block_cipher.h:107

## Constructor & Destructor Documentation

## ◆ GOST_28147_89()

Botan::GOST_28147_89::GOST_28147_89 | ( | const GOST_28147_89_Params & | params | ) |

Parameters

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

## Member Function Documentation

## ◆ block_size()

size_t Botan::Block_Cipher_Fixed_Params< BS, KMIN, 0 , 1 >::block_size | ( |  | ) | const
| inline virtual inherited

Returns
  block size of this algorithm

Implements Botan::BlockCipher.

Definition at line 108 of file block_cipher.h.

108 { return BS; }

## ◆ clear()

void Botan::GOST_28147_89::clear | ( |  | ) |
| inline virtual

Zeroize internal state

Implements Botan::Algorithm.

Definition at line 58 of file gost_28147.h.

References Botan::zeroise().

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

58 { zeroise(EK); }
Botan::zeroise
void zeroise(MemoryRegion< T > &vec)
Definition: secmem.h:428

## ◆ clone()

BlockCipher* Botan::GOST_28147_89::clone | ( |  | ) | const
| inline virtual

Get a 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); }
Botan::GOST_28147_89::GOST_28147_89
GOST_28147_89(const GOST_28147_89_Params &params)
Definition: gost_28147.cpp:54

## ◆ decrypt() [1/2]

void Botan::BlockCipher::decrypt | ( | const byte | in[],
|  | byte | out[]
| ) |  | const
| inline inherited

Decrypt a block.

Parameters

  in | The ciphertext block to be decypted as a byte array. Must be of length block_size().
  out | The 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); }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const =0

## ◆ decrypt() [2/2]

void Botan::BlockCipher::decrypt | ( | byte | block[] | ) | const
| inline inherited

Decrypt a block.

Parameters

  block | the 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); }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const byte in[], byte out[], size_t blocks) const =0

## ◆ decrypt_n()

void Botan::GOST_28147_89::decrypt_n | ( | const byte | in[],
|  | byte | out[],
|  | size_t | blocks
| ) |  | const
| virtual

Decrypt one or more blocks

Parameters

  in | the input buffer (multiple of block_size())
  out | the output buffer (same size as in)
  blocks | the number of blocks to process

Implements Botan::BlockCipher.

Definition at line 137 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().

138 {
139 for(size_t i = 0; i != blocks; ++i)
140 {
141 u32bit N1 = load_le<u32bit>(in, 0);
142 u32bit N2 = load_le<u32bit>(in, 1);
143
144 GOST_2ROUND(N1, N2, 0, 1);
145 GOST_2ROUND(N1, N2, 2, 3);
146 GOST_2ROUND(N1, N2, 4, 5);
147 GOST_2ROUND(N1, N2, 6, 7);
148
149 for(size_t j = 0; j != 3; ++j)
150 {
151 GOST_2ROUND(N1, N2, 7, 6);
152 GOST_2ROUND(N1, N2, 5, 4);
153 GOST_2ROUND(N1, N2, 3, 2);
154 GOST_2ROUND(N1, N2, 1, 0);
155 }
156
157 store_le(out, N2, N1);
158 in += BLOCK_SIZE;
159 out += BLOCK_SIZE;
160 }
161 }
Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE
Definition: block_cipher.h:107
Botan::store_le
void store_le(u16bit in, byte out[2])
Definition: loadstor.h:427
Botan::load_le< u32bit >
u32bit load_le< u32bit >(const byte in[], size_t off)
Definition: loadstor.h:183
GOST_2ROUND
#define GOST_2ROUND(N1, N2, R1, R2)
Definition: gost_28147.cpp:89
Botan::u32bit
unsigned int u32bit
Definition: types.h:32

## ◆ encrypt() [1/2]

void Botan::BlockCipher::encrypt | ( | const byte | in[],
|  | byte | out[]
| ) |  | const
| inline inherited

Encrypt a block.

Parameters

  in | The plaintext block to be encrypted as a byte array. Must be of length block_size().
  out | The 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_unpackage(), Botan::OFB::cipher(), Botan::DESX::encrypt_n(), Botan::OFB::set_iv(), Botan::CFB_Encryption::set_iv(), Botan::XTS_Encryption::set_iv(), Botan::CFB_Decryption::set_iv(), and Botan::XTS_Decryption::set_iv().

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

## ◆ encrypt() [2/2]

void Botan::BlockCipher::encrypt | ( | byte | block[] | ) | const
| inline inherited

Encrypt a block.

Parameters

  block | the 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); }
Botan::BlockCipher::encrypt_n
virtual void encrypt_n(const byte in[], byte out[], size_t blocks) const =0

## ◆ encrypt_n()

void Botan::GOST_28147_89::encrypt_n | ( | const byte | in[],
|  | byte | out[],
|  | size_t | blocks
| ) |  | const
| virtual

Encrypt one or more blocks

Parameters

  in | the input buffer (multiple of block_size())
  out | the output buffer (same size as in)
  blocks | the number of blocks to process

Implements Botan::BlockCipher.

Definition at line 107 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().

108 {
109 for(size_t i = 0; i != blocks; ++i)
110 {
111 u32bit N1 = load_le<u32bit>(in, 0);
112 u32bit N2 = load_le<u32bit>(in, 1);
113
114 for(size_t j = 0; j != 3; ++j)
115 {
116 GOST_2ROUND(N1, N2, 0, 1);
117 GOST_2ROUND(N1, N2, 2, 3);
118 GOST_2ROUND(N1, N2, 4, 5);
119 GOST_2ROUND(N1, N2, 6, 7);
120 }
121
122 GOST_2ROUND(N1, N2, 7, 6);
123 GOST_2ROUND(N1, N2, 5, 4);
124 GOST_2ROUND(N1, N2, 3, 2);
125 GOST_2ROUND(N1, N2, 1, 0);
126
127 store_le(out, N2, N1);
128
129 in += BLOCK_SIZE;
130 out += BLOCK_SIZE;
131 }
132 }
Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE
Definition: block_cipher.h:107
Botan::store_le
void store_le(u16bit in, byte out[2])
Definition: loadstor.h:427
Botan::load_le< u32bit >
u32bit load_le< u32bit >(const byte in[], size_t off)
Definition: loadstor.h:183
GOST_2ROUND
#define GOST_2ROUND(N1, N2, R1, R2)
Definition: gost_28147.cpp:89
Botan::u32bit
unsigned int u32bit
Definition: types.h:32

## ◆ key_spec()

Key_Length_Specification Botan::Block_Cipher_Fixed_Params< BS, KMIN, 0 , 1 >::key_spec | ( |  | ) | const
| inline virtual inherited

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 }

## ◆ maximum_keylength()

size_t Botan::SymmetricAlgorithm::maximum_keylength | ( |  | ) | const
| inline inherited

Returns
  minimum allowed key length

Definition at line 33 of file sym_algo.h.

34 {
35 return key_spec().maximum_keylength();
36 }
Botan::Key_Length_Specification::maximum_keylength
size_t maximum_keylength() const
Definition: key_spec.h:69
Botan::SymmetricAlgorithm::key_spec
virtual Key_Length_Specification key_spec() const =0

## ◆ minimum_keylength()

size_t Botan::SymmetricAlgorithm::minimum_keylength | ( |  | ) | const
| inline inherited

Returns
  maxmium allowed key length

Definition at line 41 of file sym_algo.h.

42 {
43 return key_spec().minimum_keylength();
44 }
Botan::SymmetricAlgorithm::key_spec
virtual Key_Length_Specification key_spec() const =0
Botan::Key_Length_Specification::minimum_keylength
size_t minimum_keylength() const
Definition: key_spec.h:61

## ◆ name()

std::string Botan::GOST_28147_89::name | ( |  | ) | const
| virtual

Returns
  name of this algorithm

Implements Botan::Algorithm.

Definition at line 67 of file gost_28147.cpp.

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

## ◆ parallel_bytes()

size_t Botan::BlockCipher::parallel_bytes | ( |  | ) | const
| inline inherited

Returns
  prefererred parallelism of this cipher in bytes

Definition at line 35 of file block_cipher.h.

36 {
37 return parallelism() * block_size() * BOTAN_BLOCK_CIPHER_PAR_MULT;
38 }
Botan::BlockCipher::parallelism
virtual size_t parallelism() const
Definition: block_cipher.h:30
Botan::BlockCipher::block_size
virtual size_t block_size() const =0

## ◆ parallelism()

virtual size_t Botan::BlockCipher::parallelism | ( |  | ) | const
| inline virtual inherited

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; }

## ◆ set_key() [1/2]

void Botan::SymmetricAlgorithm::set_key | ( | const SymmetricKey & | key | ) |
| inline inherited

Set the symmetric key of this object.

Parameters

  key | the SymmetricKey to be set.

Definition at line 60 of file sym_algo.h.

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

Referenced by Botan::aont_unpackage(), Botan::Lion::decrypt_n(), Botan::PKCS5_PBKDF2::derive_key(), Botan::ECB_Decryption::ECB_Decryption(), Botan::ECB_Encryption::ECB_Encryption(), Botan::Lion::encrypt_n(), Botan::HMAC_RNG::HMAC_RNG(), Botan::MAC_Filter::MAC_Filter(), Botan::HMAC_RNG::reseed(), Botan::XTS_Encryption::set_key(), Botan::EAX_Base::set_key(), Botan::XTS_Decryption::set_key(), Botan::Record_Writer::set_keys(), Botan::Record_Reader::set_keys(), and Botan::StreamCipher_Filter::StreamCipher_Filter().

61 { set_key(key.begin(), key.length()); }
Botan::SymmetricAlgorithm::set_key
void set_key(const SymmetricKey &key)
Definition: sym_algo.h:60

## ◆ set_key() [2/2]

void Botan::SymmetricAlgorithm::set_key | ( | const byte | key[],
|  | size_t | length
| ) |  |
| inline inherited

Set the symmetric key of this object.

Parameters

  key | the to be set as a byte array.
  length | in 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 }
Botan::SymmetricAlgorithm::valid_keylength
bool valid_keylength(size_t length) const
Definition: sym_algo.h:51
Botan::Algorithm::name
virtual std::string name() const =0

## ◆ valid_keylength()

bool Botan::SymmetricAlgorithm::valid_keylength | ( | size_t | length | ) | const
| inline inherited

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

Parameters

  length | the 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_unpackage(), Botan::HMAC_RNG::HMAC_RNG(), and Botan::Lion::Lion().

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

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

- src/block/gost_28147/gost_28147.h
- src/block/gost_28147/gost_28147.cpp