9#include <botan/exceptn.h>
20 const size_t LEFT_SIZE = left_size();
21 const size_t RIGHT_SIZE = right_size();
24 uint8_t* buffer = buffer_vec.data();
26 for(
size_t i = 0; i != blocks; ++i)
28 xor_buf(buffer, in, m_key1.data(), LEFT_SIZE);
29 m_cipher->set_key(buffer, LEFT_SIZE);
30 m_cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
32 m_hash->update(out + LEFT_SIZE, RIGHT_SIZE);
33 m_hash->final(buffer);
34 xor_buf(out, in, buffer, LEFT_SIZE);
36 xor_buf(buffer, out, m_key2.data(), LEFT_SIZE);
37 m_cipher->set_key(buffer, LEFT_SIZE);
38 m_cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
52 const size_t LEFT_SIZE = left_size();
53 const size_t RIGHT_SIZE = right_size();
56 uint8_t* buffer = buffer_vec.data();
58 for(
size_t i = 0; i != blocks; ++i)
60 xor_buf(buffer, in, m_key2.data(), LEFT_SIZE);
61 m_cipher->set_key(buffer, LEFT_SIZE);
62 m_cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE);
64 m_hash->update(out + LEFT_SIZE, RIGHT_SIZE);
65 m_hash->final(buffer);
66 xor_buf(out, in, buffer, LEFT_SIZE);
68 xor_buf(buffer, out, m_key1.data(), LEFT_SIZE);
69 m_cipher->set_key(buffer, LEFT_SIZE);
70 m_cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE);
80void Lion::key_schedule(
const uint8_t key[],
size_t length)
84 const size_t half = length / 2;
86 m_key1.resize(left_size());
87 m_key2.resize(left_size());
91 copy_mem(m_key2.data(), key + half, half);
99 return "Lion(" + m_hash->name() +
"," +
100 m_cipher->name() +
"," +
109 return new Lion(m_hash->clone(), m_cipher->clone(),
block_size());
127 m_block_size(
std::max<size_t>(2*
hash->output_length() + 1, bs)),
131 if(2*left_size() + 1 > m_block_size)
134 if(!m_cipher->valid_keylength(left_size()))
Lion(HashFunction *hash, StreamCipher *cipher, size_t block_size)
size_t block_size() const override
BlockCipher * clone() const override
std::string name() const override
void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override
void verify_key_set(bool cond) const
std::string to_string(const BER_Object &obj)
void zap(std::vector< T, Alloc > &vec)
void copy_mem(T *out, const T *in, size_t n)
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
std::vector< T, secure_allocator< T > > secure_vector
void clear_mem(T *ptr, size_t n)