Botan 2.13.0 Crypto and TLS for C++11

- Main Page
- Namespaces
- Classes
- Files

- Class List
- Class Index
- Class Hierarchy
- Class Members

Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | List of all members
Botan::GOST_28147_89 Class Referencefinal

`#include <gost_28147.h>`

Inheritance diagram for Botan::GOST_28147_89:

## Public Types
enum |

## Public Member Functions
size_t | block_size () const finaloverride
void | clear () override
BlockCipher * | clone () const override
void | decrypt (const uint8_t in[], uint8_t out[]) const
void | decrypt (uint8_t block[]) const
template<typename Alloc >
void | decrypt (std::vector< uint8_t, Alloc > &block) const
template<typename Alloc , typename Alloc2 >
void | decrypt (const std::vector< uint8_t, Alloc > &in, std::vector< uint8_t, Alloc2 > &out) const
void | decrypt_n (const uint8_t in[], uint8_t out[], size_t blocks) const override
void | decrypt_n_xex (uint8_t data[], const uint8_t mask[], size_t blocks) const finaloverride
void | encrypt (const uint8_t in[], uint8_t out[]) const
void | encrypt (uint8_t block[]) const
template<typename Alloc >
void | encrypt (std::vector< uint8_t, Alloc > &block) const
template<typename Alloc , typename Alloc2 >
void | encrypt (const std::vector< uint8_t, Alloc > &in, std::vector< uint8_t, Alloc2 > &out) const
void | encrypt_n (const uint8_t in[], uint8_t out[], size_t blocks) const override
void | encrypt_n_xex (uint8_t data[], const uint8_t mask[], size_t blocks) const finaloverride
| GOST_28147_89 (const GOST_28147_89_Params &params)
| GOST_28147_89 (const std::string &param_name)
Key_Length_Specification | key_spec () const finaloverride
size_t | maximum_keylength () const
size_t | minimum_keylength () const
std::string | name () const override
size_t | parallel_bytes () const
virtual size_t | parallelism () const
virtual std::string | provider () const
void | set_key (const SymmetricKey &key)
template<typename Alloc >
void | set_key (const std::vector< uint8_t, Alloc > &key)
void | set_key (const uint8_t key[], size_t length)
bool | valid_keylength (size_t length) const

## Static Public Member Functions
static std::unique_ptr< BlockCipher > | create (const std::string &algo_spec, const std::string &provider="")
static std::unique_ptr< BlockCipher > | create_or_throw (const std::string &algo_spec, const std::string &provider="")
static std::vector< std::string > | providers (const std::string &algo_spec)

## Protected Member Functions
void | verify_key_set (bool cond) const

## Detailed Description

GOST 28147-89

Definition at line 60 of file gost_28147.h.

## Member Enumeration Documentation

anonymous enum
| inherited

Definition at line 224 of file block_cipher.h.

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

## Constructor & Destructor Documentation

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

Parameters

  params | the sbox parameters to use

Definition at line 61 of file gost_28147.cpp.

References Botan::GOST_28147_89_Params::sbox_pair().

61 : m_SBOX(1024)
62 {
63 // Convert the parallel 4x4 sboxes into larger word-based sboxes
64
65 for(size_t i = 0; i != 256; ++i)
66 {
67 m_SBOX[i ] = rotl<11, uint32_t>(param.sbox_pair(0, i));
68 m_SBOX[i+256] = rotl<19, uint32_t>(param.sbox_pair(1, i));
69 m_SBOX[i+512] = rotl<27, uint32_t>(param.sbox_pair(2, i));
70 m_SBOX[i+768] = rotl< 3, uint32_t>(param.sbox_pair(3, i));
71 }
72 }

Botan::GOST_28147_89::GOST_28147_89 | ( | const std::string & | param_name | ) |
| inline explicit

Definition at line 76 of file gost_28147.h.

76 :
77 GOST_28147_89(GOST_28147_89_Params(param_name)) {}
Botan::GOST_28147_89::GOST_28147_89
GOST_28147_89(const GOST_28147_89_Params &params)
Definition: gost_28147.cpp:61

## Member Function Documentation

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

Implements Botan::BlockCipher.

Definition at line 225 of file block_cipher.h.

225 { return BS; }

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

Reset the state.

Implements Botan::SymmetricAlgorithm.

Definition at line 184 of file gost_28147.cpp.

References Botan::zap().

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

185 {
186 zap(m_EK);
187 }
Botan::zap
void zap(std::vector< T, Alloc > &vec)
Definition: secmem.h:170

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

Returns
  new object representing the same algorithm as *this

Implements Botan::BlockCipher.

Definition at line 69 of file gost_28147.h.

69 { return new GOST_28147_89(m_SBOX); }
Botan::GOST_28147_89::GOST_28147_89
GOST_28147_89(const GOST_28147_89_Params &params)
Definition: gost_28147.cpp:61

std::unique_ptr< BlockCipher > Botan::BlockCipher::create | ( | const std::string & | algo_spec,
|  | const std::string & | provider = `""`
| ) |  |
| static inherited

Create an instance based on a name If provider is empty then best available is chosen.

Parameters

  algo_spec | algorithm name
  provider | provider implementation to choose

Returns
  a null pointer if the algo/provider combination cannot be found

Definition at line 108 of file block_cipher.cpp.

References Botan::SCAN_Name::algo_name(), Botan::SCAN_Name::arg(), Botan::SCAN_Name::arg_as_integer(), Botan::SCAN_Name::arg_count(), Botan::SCAN_Name::arg_count_between(), Botan::BlockCipher::block_size(), BOTAN_UNUSED, Botan::HashFunction::create(), Botan::StreamCipher::create(), hash, Botan::make_commoncrypto_block_cipher(), and Botan::make_openssl_block_cipher().

Referenced by botan_block_cipher_init(), Botan::AEAD_Mode::create(), Botan::MessageAuthenticationCode::create(), Botan::StreamCipher::create(), Botan::Cipher_Mode::create(), and Botan::BlockCipher::create_or_throw().

110 {
111 #if defined(BOTAN_HAS_COMMONCRYPTO)
112 if(provider.empty() || provider == "commoncrypto")
113 {
114 if(auto bc = make_commoncrypto_block_cipher(algo))
115 return bc;
116
117 if(!provider.empty())
118 return nullptr;
119 }
120 #endif
121
122 #if defined(BOTAN_HAS_OPENSSL)
123 if(provider.empty() || provider == "openssl")
124 {
125 if(auto bc = make_openssl_block_cipher(algo))
126 return bc;
127
128 if(!provider.empty())
129 return nullptr;
130 }
131 #endif
132
133 // TODO: CryptoAPI
134 // TODO: /dev/crypto
135
136 // Only base providers from here on out
137 if(provider.empty() == false && provider != "base")
138 return nullptr;
139
140 #if defined(BOTAN_HAS_AES)
141 if(algo == "AES-128")
142 {
143 return std::unique_ptr<BlockCipher>(new AES_128);
144 }
145
146 if(algo == "AES-192")
147 {
148 return std::unique_ptr<BlockCipher>(new AES_192);
149 }
150
151 if(algo == "AES-256")
152 {
153 return std::unique_ptr<BlockCipher>(new AES_256);
154 }
155 #endif
156
157 #if defined(BOTAN_HAS_ARIA)
158 if(algo == "ARIA-128")
159 {
160 return std::unique_ptr<BlockCipher>(new ARIA_128);
161 }
162
163 if(algo == "ARIA-192")
164 {
165 return std::unique_ptr<BlockCipher>(new ARIA_192);
166 }
167
168 if(algo == "ARIA-256")
169 {
170 return std::unique_ptr<BlockCipher>(new ARIA_256);
171 }
172 #endif
173
174 #if defined(BOTAN_HAS_SERPENT)
175 if(algo == "Serpent")
176 {
177 return std::unique_ptr<BlockCipher>(new Serpent);
178 }
179 #endif
180
181 #if defined(BOTAN_HAS_SHACAL2)
182 if(algo == "SHACAL2")
183 {
184 return std::unique_ptr<BlockCipher>(new SHACAL2);
185 }
186 #endif
187
188 #if defined(BOTAN_HAS_TWOFISH)
189 if(algo == "Twofish")
190 {
191 return std::unique_ptr<BlockCipher>(new Twofish);
192 }
193 #endif
194
195 #if defined(BOTAN_HAS_THREEFISH_512)
196 if(algo == "Threefish-512")
197 {
198 return std::unique_ptr<BlockCipher>(new Threefish_512);
199 }
200 #endif
201
202 #if defined(BOTAN_HAS_BLOWFISH)
203 if(algo == "Blowfish")
204 {
205 return std::unique_ptr<BlockCipher>(new Blowfish);
206 }
207 #endif
208
209 #if defined(BOTAN_HAS_CAMELLIA)
210 if(algo == "Camellia-128")
211 {
212 return std::unique_ptr<BlockCipher>(new Camellia_128);
213 }
214
215 if(algo == "Camellia-192")
216 {
217 return std::unique_ptr<BlockCipher>(new Camellia_192);
218 }
219
220 if(algo == "Camellia-256")
221 {
222 return std::unique_ptr<BlockCipher>(new Camellia_256);
223 }
224 #endif
225
226 #if defined(BOTAN_HAS_DES)
227 if(algo == "DES")
228 {
229 return std::unique_ptr<BlockCipher>(new DES);
230 }
231
232 if(algo == "DESX")
233 {
234 return std::unique_ptr<BlockCipher>(new DESX);
235 }
236
237 if(algo == "TripleDES" || algo == "3DES" || algo == "DES-EDE")
238 {
239 return std::unique_ptr<BlockCipher>(new TripleDES);
240 }
241 #endif
242
243 #if defined(BOTAN_HAS_NOEKEON)
244 if(algo == "Noekeon")
245 {
246 return std::unique_ptr<BlockCipher>(new Noekeon);
247 }
248 #endif
249
250 #if defined(BOTAN_HAS_CAST_128)
251 if(algo == "CAST-128" || algo == "CAST5")
252 {
253 return std::unique_ptr<BlockCipher>(new CAST_128);
254 }
255 #endif
256
257 #if defined(BOTAN_HAS_CAST_256)
258 if(algo == "CAST-256")
259 {
260 return std::unique_ptr<BlockCipher>(new CAST_256);
261 }
262 #endif
263
264 #if defined(BOTAN_HAS_IDEA)
265 if(algo == "IDEA")
266 {
267 return std::unique_ptr<BlockCipher>(new IDEA);
268 }
269 #endif
270
271 #if defined(BOTAN_HAS_KASUMI)
272 if(algo == "KASUMI")
273 {
274 return std::unique_ptr<BlockCipher>(new KASUMI);
275 }
276 #endif
277
278 #if defined(BOTAN_HAS_MISTY1)
279 if(algo == "MISTY1")
280 {
281 return std::unique_ptr<BlockCipher>(new MISTY1);
282 }
283 #endif
284
285 #if defined(BOTAN_HAS_SEED)
286 if(algo == "SEED")
287 {
288 return std::unique_ptr<BlockCipher>(new SEED);
289 }
290 #endif
291
292 #if defined(BOTAN_HAS_SM4)
293 if(algo == "SM4")
294 {
295 return std::unique_ptr<BlockCipher>(new SM4);
296 }
297 #endif
298
299 #if defined(BOTAN_HAS_XTEA)
300 if(algo == "XTEA")
301 {
302 return std::unique_ptr<BlockCipher>(new XTEA);
303 }
304 #endif
305
306 const SCAN_Name req(algo);
307
308 #if defined(BOTAN_HAS_GOST_28147_89)
309 if(req.algo_name() == "GOST-28147-89")
310 {
311 return std::unique_ptr<BlockCipher>(new GOST_28147_89(req.arg(0, "R3411_94_TestParam")));
312 }
313 #endif
314
315 #if defined(BOTAN_HAS_CASCADE)
316 if(req.algo_name() == "Cascade" && req.arg_count() == 2)
317 {
318 std::unique_ptr<BlockCipher> c1(BlockCipher::create(req.arg(0)));
319 std::unique_ptr<BlockCipher> c2(BlockCipher::create(req.arg(1)));
320
321 if(c1 && c2)
322 return std::unique_ptr<BlockCipher>(new Cascade_Cipher(c1.release(), c2.release()));
323 }
324 #endif
325
326 #if defined(BOTAN_HAS_LION)
327 if(req.algo_name() == "Lion" && req.arg_count_between(2, 3))
328 {
329 std::unique_ptr<HashFunction> hash(HashFunction::create(req.arg(0)));
330 std::unique_ptr<StreamCipher> stream(StreamCipher::create(req.arg(1)));
331
332 if(hash && stream)
333 {
334 const size_t block_size = req.arg_as_integer(2, 1024);
335 return std::unique_ptr<BlockCipher>(new Lion(hash.release(), stream.release(), block_size));
336 }
337 }
338 #endif
339
340 BOTAN_UNUSED(req);
341 BOTAN_UNUSED(provider);
342
343 return nullptr;
344 }
Botan::PKCS11::KeyType::Twofish
Botan::make_commoncrypto_block_cipher
std::unique_ptr< BlockCipher > make_commoncrypto_block_cipher(const std::string &name)
Definition: commoncrypto_block.cpp:138
Botan::HashFunction::create
static std::unique_ptr< HashFunction > create(const std::string &algo_spec, const std::string &provider="")
Definition: hash.cpp:106
BOTAN_UNUSED
#define BOTAN_UNUSED(...)
Definition: assert.h:142
Botan::BlockCipher::create
static std::unique_ptr< BlockCipher > create(const std::string &algo_spec, const std::string &provider="")
Definition: block_cipher.cpp:108
Botan::PKCS11::KeyType::Blowfish
Botan::StreamCipher::create
static std::unique_ptr< StreamCipher > create(const std::string &algo_spec, const std::string &provider="")
Definition: stream_cipher.cpp:42
Botan::BlockCipher::provider
virtual std::string provider() const
Definition: block_cipher.h:73
Botan::make_openssl_block_cipher
std::unique_ptr< BlockCipher > make_openssl_block_cipher(const std::string &name)
Definition: openssl_block.cpp:200
Botan::BlockCipher::block_size
virtual size_t block_size() const =0
hash
MechanismType hash
Definition: p11_mechanism.cpp:64

std::unique_ptr< BlockCipher > Botan::BlockCipher::create_or_throw | ( | const std::string & | algo_spec,
|  | const std::string & | provider = `""`
| ) |  |
| static inherited

Create an instance based on a name, or throw if the algo/provider combination cannot be found. If provider is empty then best available is chosen.

Definition at line 348 of file block_cipher.cpp.

References Botan::BlockCipher::create().

Referenced by Botan::TLS::Connection_Cipher_State::Connection_Cipher_State(), Botan::Encrypted_PSK_Database::Encrypted_PSK_Database(), Botan::rfc3394_keyunwrap(), and Botan::rfc3394_keywrap().

350 {
351 if(auto bc = BlockCipher::create(algo, provider))
352 {
353 return bc;
354 }
355 throw Lookup_Error("Block cipher", algo, provider);
356 }
Botan::BlockCipher::create
static std::unique_ptr< BlockCipher > create(const std::string &algo_spec, const std::string &provider="")
Definition: block_cipher.cpp:108
Botan::BlockCipher::provider
virtual std::string provider() const
Definition: block_cipher.h:73

void Botan::BlockCipher::decrypt | ( | const uint8_t | in[],
|  | uint8_t | 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 92 of file block_cipher.h.

Referenced by Botan::DESX::decrypt_n(), Botan::XTS_Decryption::finish(), Botan::CTS_Decryption::finish(), and Botan::nist_key_unwrap_padded().

93 { decrypt_n(in, out, 1); }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0

void Botan::BlockCipher::decrypt | ( | uint8_t | 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 109 of file block_cipher.h.

109 { decrypt_n(block, block, 1); }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
template<typename Alloc >

void Botan::BlockCipher::decrypt | ( | std::vector< uint8_t, Alloc > & | block | ) | const
| inline inherited

Decrypt one or more blocks

Parameters

  block | the input/output buffer (multiple of block_size())

Definition at line 126 of file block_cipher.h.

127 {
128 return decrypt_n(block.data(), block.data(), block.size() / block_size());
129 }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
Botan::BlockCipher::block_size
virtual size_t block_size() const =0
template<typename Alloc , typename Alloc2 >

void Botan::BlockCipher::decrypt | ( | const std::vector< uint8_t, Alloc > & | in,
|  | std::vector< uint8_t, Alloc2 > & | out
| ) |  | const
| inline inherited

Decrypt one or more blocks

Parameters

  in | the input buffer (multiple of block_size())
  out | the output buffer (same size as in)

Definition at line 149 of file block_cipher.h.

151 {
152 return decrypt_n(in.data(), out.data(), in.size() / block_size());
153 }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
Botan::BlockCipher::block_size
virtual size_t block_size() const =0

void Botan::GOST_28147_89::decrypt_n | ( | const uint8_t | in[],
|  | uint8_t | out[],
|  | size_t | blocks
| ) |  | const
| override 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 146 of file gost_28147.cpp.

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

147 {
148 verify_key_set(m_EK.empty() == false);
149
150 for(size_t i = 0; i != blocks; ++i)
151 {
152 uint32_t N1 = load_le<uint32_t>(in, 0);
153 uint32_t N2 = load_le<uint32_t>(in, 1);
154
155 GOST_2ROUND(N1, N2, 0, 1);
156 GOST_2ROUND(N1, N2, 2, 3);
157 GOST_2ROUND(N1, N2, 4, 5);
158 GOST_2ROUND(N1, N2, 6, 7);
159
160 for(size_t j = 0; j != 3; ++j)
161 {
162 GOST_2ROUND(N1, N2, 7, 6);
163 GOST_2ROUND(N1, N2, 5, 4);
164 GOST_2ROUND(N1, N2, 3, 2);
165 GOST_2ROUND(N1, N2, 1, 0);
166 }
167
168 store_le(out, N2, N1);
169 in += BLOCK_SIZE;
170 out += BLOCK_SIZE;
171 }
172 }
Botan::load_le< uint32_t >
uint32_t load_le< uint32_t >(const uint8_t in[], size_t off)
Definition: loadstor.h:198
Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE
Definition: block_cipher.h:224
Botan::SymmetricAlgorithm::verify_key_set
void verify_key_set(bool cond) const
Definition: sym_algo.h:89
GOST_2ROUND
#define GOST_2ROUND(N1, N2, R1, R2)
Definition: gost_28147.cpp:96
Botan::store_le
void store_le(uint16_t in, uint8_t out[2])
Definition: loadstor.h:454

void Botan::Block_Cipher_Fixed_Params< BS, KMIN, 0 , 1 , BlockCipher >::decrypt_n_xex | ( | uint8_t | data[],
|  | const uint8_t | mask[],
|  | size_t | blocks
| ) |  | const
| inline final override virtual inherited

Reimplemented from Botan::BlockCipher.

Definition at line 237 of file block_cipher.h.

240 {
241 xor_buf(data, mask, blocks * BS);
242 this->decrypt_n(data, data, blocks);
243 xor_buf(data, mask, blocks * BS);
244 }
Botan::BlockCipher::decrypt_n
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
Botan::xor_buf
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
Definition: mem_ops.h:232

void Botan::BlockCipher::encrypt | ( | const uint8_t | in[],
|  | uint8_t | 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 82 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::nist_key_wrap_padded(), Botan::CBC_Encryption::process(), and Botan::CFB_Mode::shift_register().

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

void Botan::BlockCipher::encrypt | ( | uint8_t | 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 101 of file block_cipher.h.

101 { encrypt_n(block, block, 1); }
Botan::BlockCipher::encrypt_n
virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
template<typename Alloc >

void Botan::BlockCipher::encrypt | ( | std::vector< uint8_t, Alloc > & | block | ) | const
| inline inherited

Encrypt one or more blocks

Parameters

  block | the input/output buffer (multiple of block_size())

Definition at line 116 of file block_cipher.h.

117 {
118 return encrypt_n(block.data(), block.data(), block.size() / block_size());
119 }
Botan::BlockCipher::encrypt_n
virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
Botan::BlockCipher::block_size
virtual size_t block_size() const =0
template<typename Alloc , typename Alloc2 >

void Botan::BlockCipher::encrypt | ( | const std::vector< uint8_t, Alloc > & | in,
|  | std::vector< uint8_t, Alloc2 > & | out
| ) |  | const
| inline inherited

Encrypt one or more blocks

Parameters

  in | the input buffer (multiple of block_size())
  out | the output buffer (same size as in)

Definition at line 137 of file block_cipher.h.

139 {
140 return encrypt_n(in.data(), out.data(), in.size() / block_size());
141 }
Botan::BlockCipher::encrypt_n
virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
Botan::BlockCipher::block_size
virtual size_t block_size() const =0

void Botan::GOST_28147_89::encrypt_n | ( | const uint8_t | in[],
|  | uint8_t | out[],
|  | size_t | blocks
| ) |  | const
| override 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 114 of file gost_28147.cpp.

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

115 {
116 verify_key_set(m_EK.empty() == false);
117
118 for(size_t i = 0; i != blocks; ++i)
119 {
120 uint32_t N1 = load_le<uint32_t>(in, 0);
121 uint32_t N2 = load_le<uint32_t>(in, 1);
122
123 for(size_t j = 0; j != 3; ++j)
124 {
125 GOST_2ROUND(N1, N2, 0, 1);
126 GOST_2ROUND(N1, N2, 2, 3);
127 GOST_2ROUND(N1, N2, 4, 5);
128 GOST_2ROUND(N1, N2, 6, 7);
129 }
130
131 GOST_2ROUND(N1, N2, 7, 6);
132 GOST_2ROUND(N1, N2, 5, 4);
133 GOST_2ROUND(N1, N2, 3, 2);
134 GOST_2ROUND(N1, N2, 1, 0);
135
136 store_le(out, N2, N1);
137
138 in += BLOCK_SIZE;
139 out += BLOCK_SIZE;
140 }
141 }
Botan::load_le< uint32_t >
uint32_t load_le< uint32_t >(const uint8_t in[], size_t off)
Definition: loadstor.h:198
Botan::Block_Cipher_Fixed_Params< 8, 32 >::BLOCK_SIZE
Definition: block_cipher.h:224
Botan::SymmetricAlgorithm::verify_key_set
void verify_key_set(bool cond) const
Definition: sym_algo.h:89
GOST_2ROUND
#define GOST_2ROUND(N1, N2, R1, R2)
Definition: gost_28147.cpp:96
Botan::store_le
void store_le(uint16_t in, uint8_t out[2])
Definition: loadstor.h:454

void Botan::Block_Cipher_Fixed_Params< BS, KMIN, 0 , 1 , BlockCipher >::encrypt_n_xex | ( | uint8_t | data[],
|  | const uint8_t | mask[],
|  | size_t | blocks
| ) |  | const
| inline final override virtual inherited

Reimplemented from Botan::BlockCipher.

Definition at line 228 of file block_cipher.h.

231 {
232 xor_buf(data, mask, blocks * BS);
233 this->encrypt_n(data, data, blocks);
234 xor_buf(data, mask, blocks * BS);
235 }
Botan::xor_buf
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
Definition: mem_ops.h:232
Botan::BlockCipher::encrypt_n
virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0

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

Implements Botan::SymmetricAlgorithm.

Definition at line 246 of file block_cipher.h.

247 {
248 return Key_Length_Specification(KMIN, KMAX, KMOD);
249 }

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

Returns
  minimum allowed key length

Definition at line 38 of file sym_algo.h.

39 {
40 return key_spec().maximum_keylength();
41 }
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

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

Returns
  maximum allowed key length

Definition at line 46 of file sym_algo.h.

Referenced by botan_block_cipher_get_keyspec(), and botan_mac_get_keyspec().

47 {
48 return key_spec().minimum_keylength();
49 }
Botan::Key_Length_Specification::minimum_keylength
size_t minimum_keylength() const
Definition: key_spec.h:61
Botan::SymmetricAlgorithm::key_spec
virtual Key_Length_Specification key_spec() const =0

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

Returns
  the algorithm name

Implements Botan::SymmetricAlgorithm.

Definition at line 74 of file gost_28147.cpp.

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

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

Returns
  prefererred parallelism of this cipher in bytes

Definition at line 64 of file block_cipher.h.

Referenced by Botan::CBC_Mode::update_granularity().

65 {
66 return parallelism() * block_size() * BOTAN_BLOCK_CIPHER_PAR_MULT;
67 }
Botan::BlockCipher::parallelism
virtual size_t parallelism() const
Definition: block_cipher.h:59
Botan::BlockCipher::block_size
virtual size_t block_size() const =0

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

Returns
  native parallelism of this cipher in blocks

Reimplemented in Botan::AES_256, Botan::AES_192, Botan::Threefish_512, Botan::Serpent, Botan::AES_128, Botan::IDEA, Botan::SM4, Botan::Noekeon, and Botan::SHACAL2.

Definition at line 59 of file block_cipher.h.

59 { return 1; }

virtual std::string Botan::BlockCipher::provider | ( |  | ) | const
| inline virtual inherited

Returns
  provider information about this implementation. Default is "base", might also return "sse2", "avx2", "openssl", or some other arbitrary string.

Reimplemented in Botan::AES_256, Botan::AES_192, Botan::SM4, Botan::Threefish_512, Botan::AES_128, Botan::IDEA, Botan::Serpent, Botan::Noekeon, and Botan::SHACAL2.

Definition at line 73 of file block_cipher.h.

73 { return "base"; }

std::vector< std::string > Botan::BlockCipher::providers | ( | const std::string & | algo_spec | ) |
| static inherited

Returns
  list of available providers for this algorithm, empty if not available

Parameters

  algo_spec | algorithm name

Definition at line 358 of file block_cipher.cpp.

359 {
360 return probe_providers_of<BlockCipher>(algo, { "base", "openssl", "commoncrypto" });
361 }

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 65 of file sym_algo.h.

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

Referenced by Botan::aont_package(), Botan::aont_unpackage(), botan_block_cipher_set_key(), botan_cipher_set_key(), botan_mac_set_key(), Botan::Sodium::crypto_stream_salsa20(), Botan::Sodium::crypto_stream_salsa20_xor_ic(), Botan::Sodium::crypto_stream_xsalsa20(), Botan::Sodium::crypto_stream_xsalsa20_xor_ic(), Botan::FPE::fe1_decrypt(), Botan::FPE::fe1_encrypt(), and Botan::Sodium::randombytes_buf_deterministic().

66 {
67 set_key(key.begin(), key.length());
68 }
Botan::SymmetricAlgorithm::set_key
void set_key(const SymmetricKey &key)
Definition: sym_algo.h:65
template<typename Alloc >

void Botan::SymmetricAlgorithm::set_key | ( | const std::vector< uint8_t, Alloc > & | key | ) |
| inline inherited

Definition at line 71 of file sym_algo.h.

72 {
73 set_key(key.data(), key.size());
74 }
Botan::SymmetricAlgorithm::set_key
void set_key(const SymmetricKey &key)
Definition: sym_algo.h:65

void Botan::SymmetricAlgorithm::set_key | ( | const uint8_t | key[],
|  | size_t | length
| ) |  |
| 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 17 of file sym_algo.cpp.

References Botan::SymmetricAlgorithm::name(), and Botan::SymmetricAlgorithm::valid_keylength().

18 {
19 if(!valid_keylength(length))
20 throw Invalid_Key_Length(name(), length);
21 key_schedule(key, length);
22 }
Botan::SymmetricAlgorithm::valid_keylength
bool valid_keylength(size_t length) const
Definition: sym_algo.h:56
Botan::SymmetricAlgorithm::name
virtual std::string name() const =0

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 56 of file sym_algo.h.

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

57 {
58 return key_spec().valid_keylength(length);
59 }
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

void Botan::SymmetricAlgorithm::verify_key_set | ( | bool | cond | ) | const
| inline protected inherited

Definition at line 89 of file sym_algo.h.

Referenced by Botan::Salsa20::cipher(), Botan::CTR_BE::cipher(), Botan::RC4::cipher(), Botan::SHAKE_128_Cipher::cipher(), Botan::ChaCha::cipher(), Botan::IDEA::decrypt_n(), Botan::SHACAL2::decrypt_n(), Botan::SM4::decrypt_n(), Botan::KASUMI::decrypt_n(), Botan::DES::decrypt_n(), Botan::Twofish::decrypt_n(), Botan::CAST_128::decrypt_n(), Botan::DESX::decrypt_n(), Botan::XTEA::decrypt_n(), Botan::MISTY1::decrypt_n(), Botan::AES_128::decrypt_n(), Botan::Noekeon::decrypt_n(), Botan::SEED::decrypt_n(), Botan::Camellia_128::decrypt_n(), Botan::Blowfish::decrypt_n(), Botan::CAST_256::decrypt_n(), Botan::Serpent::decrypt_n(), Botan::Threefish_512::decrypt_n(), Botan::Lion::decrypt_n(), Botan::ARIA_128::decrypt_n(), Botan::Camellia_192::decrypt_n(), Botan::TripleDES::decrypt_n(), Botan::ARIA_192::decrypt_n(), Botan::Camellia_256::decrypt_n(), decrypt_n(), Botan::AES_192::decrypt_n(), Botan::ARIA_256::decrypt_n(), Botan::AES_256::decrypt_n(), Botan::Noekeon::encrypt_n(), Botan::CAST_128::encrypt_n(), Botan::SEED::encrypt_n(), Botan::CAST_256::encrypt_n(), Botan::SHACAL2::encrypt_n(), Botan::SM4::encrypt_n(), Botan::IDEA::encrypt_n(), Botan::KASUMI::encrypt_n(), Botan::AES_128::encrypt_n(), Botan::MISTY1::encrypt_n(), Botan::DES::encrypt_n(), Botan::Blowfish::encrypt_n(), Botan::Twofish::encrypt_n(), Botan::DESX::encrypt_n(), Botan::Camellia_128::encrypt_n(), Botan::XTEA::encrypt_n(), Botan::Threefish_512::encrypt_n(), Botan::Serpent::encrypt_n(), Botan::Lion::encrypt_n(), Botan::ARIA_128::encrypt_n(), Botan::Camellia_192::encrypt_n(), Botan::TripleDES::encrypt_n(), Botan::ARIA_192::encrypt_n(), Botan::Camellia_256::encrypt_n(), encrypt_n(), Botan::AES_192::encrypt_n(), Botan::ARIA_256::encrypt_n(), Botan::AES_256::encrypt_n(), Botan::OCB_Encryption::finish(), Botan::OCB_Decryption::finish(), Botan::GHASH::ghash_update(), Botan::CFB_Encryption::process(), Botan::CFB_Decryption::process(), Botan::Salsa20::seek(), Botan::CTR_BE::seek(), Botan::ChaCha::seek(), Botan::OCB_Mode::set_associated_data(), Botan::Salsa20::set_iv(), Botan::ChaCha::set_iv(), Botan::GHASH::update(), Botan::GHASH::update_associated_data(), and Botan::ChaCha::write_keystream().

90 {
91 if(cond == false)
92 throw_key_not_set_error();
93 }

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

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