8 #include <botan/b64_filt.h>
9 #include <botan/base64.h>
10 #include <botan/charset.h>
11 #include <botan/exceptn.h>
20 m_line_length(breaks ? length : 0),
21 m_trailing_newline(t_n && breaks),
32 void Base64_Encoder::encode_and_send(
const uint8_t input[],
size_t length,
37 const size_t proc =
std::min(length, m_in.size());
40 size_t produced =
base64_encode(reinterpret_cast<char*>(m_out.data()), input,
41 proc, consumed, final_inputs);
43 do_output(m_out.data(), produced);
54 void Base64_Encoder::do_output(
const uint8_t input[],
size_t length)
56 if(m_line_length == 0)
60 size_t remaining = length, offset = 0;
63 size_t sent =
std::min(m_line_length - m_out_position, remaining);
64 send(input + offset, sent);
65 m_out_position += sent;
68 if(m_out_position == m_line_length)
83 if(m_position + length >= m_in.size())
85 encode_and_send(m_in.data(), m_in.size());
86 input += (m_in.size() - m_position);
87 length -= (m_in.size() - m_position);
88 while(length >= m_in.size())
90 encode_and_send(input, m_in.size());
92 length -= m_in.size();
94 copy_mem(m_in.data(), input, length);
105 encode_and_send(m_in.data(), m_position,
true);
107 if(m_trailing_newline || (m_out_position && m_line_length))
110 m_out_position = m_position = 0;
117 m_checking(c), m_in(64), m_out(48), m_position(0)
128 size_t to_copy = std::min<size_t>(length, m_in.size() - m_position);
131 m_in.resize(m_in.size()*2);
132 m_out.resize(m_out.size()*2);
134 copy_mem(&m_in[m_position], input, to_copy);
135 m_position += to_copy;
139 reinterpret_cast<const char*
>(m_in.data()),
145 send(m_out, written);
147 if(consumed != m_position)
149 copy_mem(m_in.data(), m_in.data() + consumed, m_position - consumed);
150 m_position = m_position - consumed;
167 reinterpret_cast<const char*
>(m_in.data()),
173 send(m_out, written);
175 const bool not_full_bytes = consumed != m_position;
Base64_Encoder(bool breaks=false, size_t length=72, bool t_n=false)
size_t base64_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws)
Base64_Decoder(Decoder_Checking checking=NONE)
virtual void send(const uint8_t in[], size_t length)
void write(const uint8_t input[], size_t length) override
void copy_mem(T *out, const T *in, size_t n)
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
size_t buffer_insert(std::vector< T, Alloc > &buf, size_t buf_offset, const T input[], size_t input_length)
void write(const uint8_t input[], size_t length) override