28#ifndef ETL_BASE64_DECODER_INCLUDED
29#define ETL_BASE64_DECODER_INCLUDED
32#include "static_assert.h"
51#define ETL_IS_8_BIT_INTEGRAL(Type) (etl::is_integral<typename etl::remove_cv<Type>::type>::value && \
52 (etl::integral_limits<typename etl::remove_cv<Type>::type>::bits == 8U))
54#define ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(Type) (etl::is_integral<typename etl::iterator_traits<typename etl::remove_cv<Type>::type>::value_type>::value && \
55 (etl::integral_limits<typename etl::iterator_traits<typename etl::remove_cv<Type>::type>::value_type>::bits == 8U))
76 ETL_STATIC_ASSERT(ETL_IS_8_BIT_INTEGRAL(
T),
"Input type must be an 8 bit integral");
78 push_to_input_buffer(value);
80 if (input_buffer_is_full())
86 if (output_buffer_is_full())
89 reset_output_buffer();
103 template <
typename TInputIterator>
107 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(
TInputIterator),
"Input type must be an 8 bit integral");
123 template <
typename TInputIterator>
127 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(
TInputIterator),
"Input type must be an 8 bit integral");
143 template <
typename TInputIterator>
153 template <
typename TInputIterator>
169 reset_input_buffer();
184 reset_output_buffer();
188 padding_received =
false;
199 reset_input_buffer();
200 reset_output_buffer();
201 overflow_detected =
false;
202 invalid_data_detected =
false;
203 padding_received =
false;
213 return p_output_buffer;
221 const unsigned char*
end()
const
223 return p_output_buffer + output_buffer_length;
233 return p_output_buffer;
241 const unsigned char*
cend()
const
243 return p_output_buffer + output_buffer_length;
254 return output_buffer_length;
264 return output_buffer_max_size;
285 return overflow_detected;
295 return invalid_data_detected;
321 , input_buffer_length(0)
323 , output_buffer_length(0)
326 , overflow_detected(false)
327 , invalid_data_detected(false)
328 , padding_received(false)
348 template <
typename T>
361 invalid_data_detected =
true;
369 template <
typename T>
375 return static_cast<T
>(
'=');
384 switch (input_buffer_length)
389 uint32_t sextets = (get_index_from_sextet(input_buffer[0]) << 6);
390 sextets = sextets | (get_index_from_sextet(input_buffer[1]));
391 push_to_output_buffer((sextets >> 4) & 0xFF);
398 uint32_t sextets = (get_index_from_sextet(input_buffer[0]) << 12);
399 sextets = sextets | (get_index_from_sextet(input_buffer[1]) << 6);
400 sextets = sextets | (get_index_from_sextet(input_buffer[2]));
401 push_to_output_buffer((sextets >> 10) & 0xFF);
402 push_to_output_buffer((sextets >> 2) & 0xFF);
410 uint32_t sextets = (get_index_from_sextet(input_buffer[0]) << 18);
411 sextets = sextets | (get_index_from_sextet(input_buffer[1]) << 12);
412 sextets = sextets | (get_index_from_sextet(input_buffer[2]) << 6);
413 sextets = sextets | (get_index_from_sextet(input_buffer[3]));
416 push_to_output_buffer((sextets >> 16) & 0xFF);
417 push_to_output_buffer((sextets >> 8) & 0xFF);
418 push_to_output_buffer((sextets >> 0) & 0xFF);
431 return (!invalid_data_detected && !overflow_detected);
438 void push_to_output_buffer(
unsigned char c)
440 if (output_buffer_length < output_buffer_max_size)
442 p_output_buffer[output_buffer_length++] = c;
446 overflow_detected =
true;
454 bool output_buffer_is_full()
const
456 return output_buffer_length == output_buffer_max_size;
463 bool output_buffer_is_empty()
const
465 return output_buffer_length == 0;
472 void reset_output_buffer()
474 output_buffer_length = 0;
480 template <
typename T>
482 void push_to_input_buffer(T value)
484 if (value == padding<T>())
486 padding_received =
true;
490 if (padding_received)
493 invalid_data_detected =
true;
497 input_buffer[input_buffer_length++] =
static_cast<uint8_t
>(value);
506 bool input_buffer_is_full()
const
508 return input_buffer_length == 4U;
515 void reset_input_buffer()
517 input_buffer_length = 0;
520 char input_buffer[4];
521 size_t input_buffer_length;
523 unsigned char* p_output_buffer;
524 size_t output_buffer_length;
525 const size_t output_buffer_max_size;
527 callback_type callback;
529 bool overflow_detected;
530 bool invalid_data_detected;
531 bool padding_received;
537 template <
size_t Buffer_Size = etl::base64::Min_Decode_Buffer_Size>
542 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Decode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Decode_Buffer_Size");
592 template <
size_t Buffer_Size = etl::base64::Min_Decode_Buffer_Size>
597 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Decode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Decode_Buffer_Size");
647 template <
size_t Buffer_Size = etl::base64::Min_Decode_Buffer_Size>
652 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Decode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Decode_Buffer_Size");
702 template <
size_t Buffer_Size = etl::base64::Min_Decode_Buffer_Size>
707 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Decode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Decode_Buffer_Size");
757 template <
size_t Buffer_Size = etl::base64::Min_Decode_Buffer_Size>
762 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Decode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Decode_Buffer_Size");
812 template <
size_t Buffer_Size = etl::base64::Min_Decode_Buffer_Size>
817 ETL_STATIC_ASSERT((
Buffer_Size >= etl::base64::Min_Decode_Buffer_Size),
"Buffer size must be greater than etl::base64::Min_Decode_Buffer_Size");
865#undef ETL_IS_TYPE_8_BIT_INTEGRAL
866#undef ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL
Illegal character exception.
Definition base64.h:84
buffer overflow exception.
Definition base64.h:71
Base64 RFC-2152 Decoder.
Definition base64_decoder.h:539
ETL_CONSTEXPR14 base64_rfc2152_decoder()
Base64 RFC-2152 constructor.
Definition base64_decoder.h:548
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_decoder.h:578
ETL_CONSTEXPR14 base64_rfc2152_decoder(callback_type callback_)
Base64 RFC-2152 constructor.
Definition base64_decoder.h:562
Base64 RFC-3501 Decoder.
Definition base64_decoder.h:594
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_decoder.h:633
ETL_CONSTEXPR14 base64_rfc3501_decoder()
Base64 RFC-3501 constructor.
Definition base64_decoder.h:603
ETL_CONSTEXPR14 base64_rfc3501_decoder(callback_type callback_)
Base64 RFC-3501 constructor.
Definition base64_decoder.h:617
Base64 RFC-4648 Decoder.
Definition base64_decoder.h:649
ETL_CONSTEXPR14 base64_rfc4648_decoder(callback_type callback_)
Base64 RFC-4648 constructor.
Definition base64_decoder.h:672
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_decoder.h:688
ETL_CONSTEXPR14 base64_rfc4648_decoder()
Base64 RFC-4648 constructor.
Definition base64_decoder.h:658
Base64 RFC-4648-Padding Decoder.
Definition base64_decoder.h:704
ETL_CONSTEXPR14 base64_rfc4648_padding_decoder(callback_type callback_)
Base64 RFC-4648-Padding constructor.
Definition base64_decoder.h:727
ETL_CONSTEXPR14 base64_rfc4648_padding_decoder()
Base64 RFC-4648-Padding constructor.
Definition base64_decoder.h:713
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_decoder.h:743
Base64 RFC-4648-URL Decoder.
Definition base64_decoder.h:759
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_decoder.h:798
ETL_CONSTEXPR14 base64_rfc4648_url_decoder()
Base64 RFC-4648-Padding constructor.
Definition base64_decoder.h:768
ETL_CONSTEXPR14 base64_rfc4648_url_decoder(callback_type callback_)
Base64 RFC-4648-Padding constructor.
Definition base64_decoder.h:782
Base64 RFC-4648-URL-Padding Decoder.
Definition base64_decoder.h:814
ETL_CONSTEXPR14 base64_rfc4648_url_padding_decoder()
Base64 RFC-4648-Padding constructor.
Definition base64_decoder.h:823
static ETL_NODISCARD ETL_CONSTEXPR14 size_t safe_output_buffer_size(size_t input_length)
Calculate the required output encode buffer size.
Definition base64_decoder.h:853
ETL_CONSTEXPR14 base64_rfc4648_url_padding_decoder(callback_type callback_)
Base64 RFC-4648-Padding constructor.
Definition base64_decoder.h:837
Common Base64 definitions.
Definition base64.h:110
Declaration.
Definition delegate_cpp03.h:191
Base64 Decoder.
Definition base64_decoder.h:63
ETL_NODISCARD ETL_CONSTEXPR14 size_t buffer_size() const
Returns the maximum size of the output buffer.
Definition base64_decoder.h:262
ETL_NODISCARD ETL_CONSTEXPR14 const unsigned char * end() const
This only returns a useful value if a callback has not been set or called.
Definition base64_decoder.h:221
ETL_CONSTEXPR14 bool decode(TInputIterator input_begin, size_t input_length)
Decode from Base64.
Definition base64_decoder.h:125
ETL_NODISCARD ETL_CONSTEXPR14 const unsigned char * cbegin() const
Returns the beginning of the output buffer.
Definition base64_decoder.h:231
ETL_NODISCARD ETL_CONSTEXPR14 span_type span() const
Definition base64_decoder.h:273
ETL_CONSTEXPR14 ibase64_decoder(const char *encoder_table_, bool use_padding_, unsigned char *p_output_buffer_, size_t ouput_buffer_max_size_, callback_type callback_)
Constructor.
Definition base64_decoder.h:314
ETL_NODISCARD ETL_CONSTEXPR14 size_t size() const
Definition base64_decoder.h:252
ETL_NODISCARD ETL_CONSTEXPR14 const unsigned char * cend() const
This only returns a useful value if a callback has not been set or called.
Definition base64_decoder.h:241
ETL_CONSTEXPR14 bool decode_final(TInputIterator input_begin, size_t input_length)
Decode from Base64.
Definition base64_decoder.h:155
ETL_CONSTEXPR14 bool flush()
Flush any remaining data to the output.
Definition base64_decoder.h:164
static ETL_NODISCARD ETL_CONSTEXPR14 size_t decoded_size_from_valid_input_length(size_t input_length)
Calculates the minimum buffer size required to decode from Base64.
Definition base64_decoder.h:338
ETL_CONSTEXPR14 bool decode(T value)
Decode to Base64.
Definition base64_decoder.h:74
ETL_NODISCARD ETL_CONSTEXPR14 bool error() const
Returns true if an error was detected.
Definition base64_decoder.h:303
ETL_NODISCARD ETL_CONSTEXPR14 bool overflow() const
Returns true if the output buffer has overflowed.
Definition base64_decoder.h:283
ETL_CONSTEXPR14 void restart()
Reset the encoder.
Definition base64_decoder.h:197
ETL_CONSTEXPR14 bool decode_final(TInputIterator input_begin, TInputIterator input_end)
Decode from Base64.
Definition base64_decoder.h:145
ETL_NODISCARD ETL_CONSTEXPR14 const unsigned char * begin() const
Returns the beginning of the output buffer.
Definition base64_decoder.h:211
ETL_NODISCARD ETL_CONSTEXPR14 bool invalid_data() const
Returns true if an invalid character was detected.
Definition base64_decoder.h:293
ETL_CONSTEXPR14 bool decode(TInputIterator input_begin, TInputIterator input_end)
Decode from Base64.
Definition base64_decoder.h:105
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
bitset_ext
Definition absolute.h:38
pair holds two objects of arbitrary type
Definition utility.h:164