14 m_counter(m_cipher->parallel_bytes()),
15 m_pad(m_counter.size()),
16 m_ctr_size(m_cipher->block_size()),
23 m_counter(m_cipher->parallel_bytes()),
24 m_pad(m_counter.size()),
29 if(m_ctr_size == 0 || m_ctr_size > m_cipher->block_size())
41 void CTR_BE::key_schedule(
const uint8_t key[],
size_t key_len)
43 m_cipher->set_key(key, key_len);
51 return (
"CTR-BE(" + m_cipher->name() +
")");
56 while(length >= m_pad.size() - m_pad_pos)
58 xor_buf(out, in, &m_pad[m_pad_pos], m_pad.size() - m_pad_pos);
59 length -= (m_pad.size() - m_pad_pos);
60 in += (m_pad.size() - m_pad_pos);
61 out += (m_pad.size() - m_pad_pos);
64 xor_buf(out, in, &m_pad[m_pad_pos], length);
73 const size_t bs = m_cipher->block_size();
77 const size_t n_wide = m_counter.size() / m_cipher->block_size();
81 for(
size_t i = 1; i != n_wide; ++i)
85 for(
size_t j = 0; j != m_ctr_size; ++j)
86 if(++m_counter[i*bs + (bs - 1 - j)])
90 m_cipher->encrypt_n(m_counter.data(), m_pad.data(), n_wide);
97 void CTR_BE::increment_counter()
99 const size_t bs = m_cipher->block_size();
100 const size_t n_wide = m_counter.size() / bs;
102 for(
size_t i = 0; i != n_wide; ++i)
104 uint16_t carry =
static_cast<uint16_t
>(n_wide);
105 for(
size_t j = 0; carry && j != m_ctr_size; ++j)
107 const size_t off = i*bs + (bs-1-j);
108 const uint16_t cnt =
static_cast<uint16_t
>(m_counter[off]) + carry;
109 m_counter[off] =
static_cast<uint8_t
>(cnt);
114 m_cipher->encrypt_n(m_counter.data(), m_pad.data(), n_wide);
void xor_buf(T out[], const T in[], size_t length)
std::string name() const override
void seek(uint64_t offset) override
CTR_BE(BlockCipher *cipher)
void set_iv(const uint8_t iv[], size_t iv_len) override
void cipher(const uint8_t in[], uint8_t out[], size_t length) override
size_t buffer_insert(std::vector< T, Alloc > &buf, size_t buf_offset, const T input[], size_t input_length)
bool valid_iv_length(size_t iv_len) const override
void zeroise(std::vector< T, Alloc > &vec)