8#include <botan/filters.h>
9#include <botan/mem_ops.h>
10#include <botan/internal/rounding.h>
11#include <botan/exceptn.h>
19 m_main_block_mod(b), m_final_minimum(f)
21 if(m_main_block_mod == 0)
24 if(m_final_minimum > m_main_block_mod)
27 m_buffer.resize(2 * m_main_block_mod);
39 if(m_buffer_pos + input_size >= m_main_block_mod + m_final_minimum)
41 size_t to_copy = std::min<size_t>(m_buffer.size() - m_buffer_pos, input_size);
43 copy_mem(&m_buffer[m_buffer_pos], input, to_copy);
44 m_buffer_pos += to_copy;
47 input_size -= to_copy;
49 size_t total_to_consume =
51 m_buffer_pos + input_size - m_final_minimum),
56 m_buffer_pos -= total_to_consume;
58 copy_mem(m_buffer.data(), m_buffer.data() + total_to_consume, m_buffer_pos);
61 if(input_size >= m_final_minimum)
63 size_t full_blocks = (input_size - m_final_minimum) / m_main_block_mod;
64 size_t to_copy = full_blocks * m_main_block_mod;
71 input_size -= to_copy;
75 copy_mem(&m_buffer[m_buffer_pos], input, input_size);
76 m_buffer_pos += input_size;
84 if(m_buffer_pos < m_final_minimum)
85 throw Invalid_State(
"Buffered filter end_msg without enough input");
87 size_t spare_blocks = (m_buffer_pos - m_final_minimum) / m_main_block_mod;
91 size_t spare_bytes = m_main_block_mod * spare_blocks;
93 buffered_final(&m_buffer[spare_bytes], m_buffer_pos - spare_bytes);
virtual void buffered_block(const uint8_t input[], size_t length)=0
Buffered_Filter(size_t block_size, size_t final_minimum)
virtual void buffered_final(const uint8_t input[], size_t length)=0
void write(const uint8_t in[], size_t length)
constexpr T round_down(T n, T align_to)
void copy_mem(T *out, const T *in, size_t n)