8 #include <botan/lion.h>
9 #include <botan/parsing.h>
18 const size_t LEFT_SIZE = left_size();
19 const size_t RIGHT_SIZE = right_size();
22 uint8_t* buffer = buffer_vec.data();
24 for(
size_t i = 0; i != blocks; ++i)
26 xor_buf(buffer, in, m_key1.data(), LEFT_SIZE);
27 m_cipher->set_key(buffer, LEFT_SIZE);
28 m_cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
30 m_hash->update(out + LEFT_SIZE, RIGHT_SIZE);
31 m_hash->final(buffer);
32 xor_buf(out, in, buffer, LEFT_SIZE);
34 xor_buf(buffer, out, m_key2.data(), LEFT_SIZE);
35 m_cipher->set_key(buffer, LEFT_SIZE);
36 m_cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
48 const size_t LEFT_SIZE = left_size();
49 const size_t RIGHT_SIZE = right_size();
52 uint8_t* buffer = buffer_vec.data();
54 for(
size_t i = 0; i != blocks; ++i)
56 xor_buf(buffer, in, m_key2.data(), LEFT_SIZE);
57 m_cipher->set_key(buffer, LEFT_SIZE);
58 m_cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
60 m_hash->update(out + LEFT_SIZE, RIGHT_SIZE);
61 m_hash->final(buffer);
62 xor_buf(out, in, buffer, LEFT_SIZE);
64 xor_buf(buffer, out, m_key1.data(), LEFT_SIZE);
65 m_cipher->set_key(buffer, LEFT_SIZE);
66 m_cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
76 void Lion::key_schedule(
const uint8_t key[],
size_t length)
80 const size_t half = length / 2;
82 copy_mem(m_key2.data(), key + half, half);
90 return "Lion(" + m_hash->name() +
"," +
91 m_cipher->name() +
"," +
100 return new Lion(m_hash->clone(), m_cipher->clone(),
block_size());
118 m_block_size(
std::
max<size_t>(2*hash->output_length() + 1, bs)),
122 if(2*left_size() + 1 > m_block_size)
125 if(!m_cipher->valid_keylength(left_size()))
128 m_key1.resize(left_size());
129 m_key2.resize(left_size());
void xor_buf(T out[], const T in[], size_t length)
BlockCipher * clone() const override
void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
std::string to_string(const BER_Object &obj)
std::vector< T, secure_allocator< T >> secure_vector
size_t block_size() const override
void copy_mem(T *out, const T *in, size_t n)
void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
std::unique_ptr< HashFunction > m_hash
Lion(HashFunction *hash, StreamCipher *cipher, size_t block_size)
std::string name() const override
void zeroise(std::vector< T, Alloc > &vec)