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)