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