Botan 1.10.17
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 Botan::Algorithm

Public Types

enum  

Public Member Functions

size_t block_size () const
void clear ()
BlockCipherclone () const
void decrypt (byte block[]) const
void decrypt (const byte in[], byte out[]) const
void decrypt_n (const byte in[], byte out[], size_t blocks) const
void encrypt (byte block[]) const
void encrypt (const byte in[], byte 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 byte key[], size_t length)
void set_key (const SymmetricKey &key)
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.

Constructor & Destructor Documentation

◆ GOST_28147_89()

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.

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 }
T rotate_left(T input, size_t rot)
Definition rotate.h:21
unsigned int u32bit
Definition types.h:32

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

Referenced by clone(), and Botan::Core_Engine::find_block_cipher().

Member Function Documentation

◆ block_size()

size_t Botan::Block_Cipher_Fixed_Params< BS, KMIN, 0, 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; }

◆ clear()

void Botan::GOST_28147_89::clear ( )
inlinevirtual

Zeroize internal state

Implements Botan::Algorithm.

Definition at line 58 of file gost_28147.h.

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

References Botan::zeroise().

◆ clone()

BlockCipher * Botan::GOST_28147_89::clone ( ) const
inlinevirtual

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); }
GOST_28147_89(const GOST_28147_89_Params &params)

References GOST_28147_89().

◆ decrypt() [1/2]

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

◆ decrypt() [2/2]

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.

58 { decrypt_n(in, out, 1); }

◆ 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
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 137 of file gost_28147.cpp.

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 }
#define GOST_2ROUND(N1, N2, R1, R2)
u32bit load_le< u32bit >(const byte in[], size_t off)
Definition loadstor.h:183
void store_le(u16bit in, byte out[2])
Definition loadstor.h:427

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

◆ encrypt() [1/2]

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

◆ encrypt() [2/2]

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.

48 { encrypt_n(in, out, 1); }

◆ 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
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 107 of file gost_28147.cpp.

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 }

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

◆ key_spec()

Key_Length_Specification Botan::Block_Cipher_Fixed_Params< BS, KMIN, 0, 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 {
113 }
Key_Length_Specification(size_t keylen)
Definition key_spec.h:25

◆ maximum_keylength()

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 sym_algo.h:33

◆ minimum_keylength()

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 sym_algo.h:41

◆ 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 }
Internal_Error(const std::string &err)
Definition exceptn.h:47

References Botan::Internal_Error::Internal_Error().

◆ parallel_bytes()

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.

36 {
38 }

◆ parallelism()

virtual size_t Botan::BlockCipher::parallelism ( ) const
inlinevirtualinherited
Returns
native parallelism of this cipher in blocks

Definition at line 30 of file block_cipher.h.

30{ return 1; }

◆ set_key() [1/2]

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 {
73 }
Invalid_Key_Length(const std::string &name, size_t length)
Definition exceptn.h:57

◆ set_key() [2/2]

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

61 { set_key(key.begin(), key.length()); }

◆ valid_keylength()

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.

52 {
54 }
bool valid_keylength(size_t length) const
Definition sym_algo.h:51

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