8 #include <botan/hex_filt.h>
10 #include <botan/parsing.h>
11 #include <botan/charset.h>
12 #include <botan/exceptn.h>
26 m_casing(c), m_line_length(breaks ? length : 0)
28 m_in.resize(HEX_CODEC_BUFFER_SIZE);
29 m_out.resize(2*m_in.size());
30 m_counter = m_position = 0;
38 m_in.resize(HEX_CODEC_BUFFER_SIZE);
39 m_out.resize(2*m_in.size());
40 m_counter = m_position = 0;
46 void Hex_Encoder::encode_and_send(
const uint8_t block[],
size_t length)
48 hex_encode(reinterpret_cast<char*>(m_out.data()),
52 if(m_line_length == 0)
53 send(m_out, 2*length);
56 size_t remaining = 2*length, offset = 0;
59 size_t sent =
std::min(m_line_length - m_counter, remaining);
60 send(&m_out[offset], sent);
64 if(m_counter == m_line_length)
79 if(m_position + length >= m_in.size())
81 encode_and_send(m_in.data(), m_in.size());
82 input += (m_in.size() - m_position);
83 length -= (m_in.size() - m_position);
84 while(length >= m_in.size())
86 encode_and_send(input, m_in.size());
88 length -= m_in.size();
90 copy_mem(m_in.data(), input, length);
101 encode_and_send(m_in.data(), m_position);
102 if(m_counter && m_line_length)
104 m_counter = m_position = 0;
112 m_in.resize(HEX_CODEC_BUFFER_SIZE);
113 m_out.resize(m_in.size() / 2);
124 size_t to_copy = std::min<size_t>(length, m_in.size() - m_position);
125 copy_mem(&m_in[m_position], input, to_copy);
126 m_position += to_copy;
130 reinterpret_cast<const char*
>(m_in.data()),
135 send(m_out, written);
137 if(consumed != m_position)
139 copy_mem(m_in.data(), m_in.data() + consumed, m_position - consumed);
140 m_position = m_position - consumed;
157 reinterpret_cast<const char*
>(m_in.data()),
162 send(m_out, written);
164 const bool not_full_bytes = consumed != m_position;
virtual void send(const uint8_t in[], size_t length)
void write(const uint8_t in[], size_t length) override
const size_t HEX_CODEC_BUFFER_SIZE
void write(const uint8_t[], size_t) override
Hex_Decoder(Decoder_Checking checking=NONE)
void copy_mem(T *out, const T *in, size_t n)
Hex_Encoder(Case the_case)
size_t buffer_insert(std::vector< T, Alloc > &buf, size_t buf_offset, const T input[], size_t input_length)
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)