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())
84 if (callback.is_valid())
86 if (output_buffer_is_full())
89 reset_output_buffer();
103 template <
typename TInputIterator>
105 bool decode(TInputIterator input_begin, TInputIterator input_end)
107 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(TInputIterator),
"Input type must be an 8 bit integral");
109 while (input_begin != input_end)
111 if (!
decode(*input_begin++))
123 template <
typename TInputIterator>
125 bool decode(TInputIterator input_begin,
size_t input_length)
127 ETL_STATIC_ASSERT(ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL(TInputIterator),
"Input type must be an 8 bit integral");
129 while (input_length-- != 0)
131 if (!
decode(*input_begin++))
143 template <
typename TInputIterator>
145 bool decode_final(TInputIterator input_begin, TInputIterator input_end)
153 template <
typename TInputIterator>
157 return decode(input_begin, input_length) &&
flush();
167 bool success = decode_block();
169 reset_input_buffer();
173 if (callback.is_valid())
182 callback(span_type());
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;
316 unsigned char* p_output_buffer_,
317 size_t ouput_buffer_max_size_,
318 callback_type callback_)
319 : base64(encoder_table_, use_padding_)
321 , input_buffer_length(0)
322 , p_output_buffer(p_output_buffer_)
323 , output_buffer_length(0)
324 , output_buffer_max_size(ouput_buffer_max_size_)
325 , callback(callback_)
326 , overflow_detected(false)
327 , invalid_data_detected(false)
328 , padding_received(false)
340 return input_length - (input_length / 4U);
348 template <
typename T>
350 uint32_t get_index_from_sextet(T sextet)
352 const char* encoder_table_end = encoder_table + 64;
353 const char* p_sextet = etl::find(encoder_table, encoder_table_end,
static_cast<char>(sextet));
355 if (p_sextet != encoder_table_end)
357 return static_cast<uint32_t
>(etl::distance(encoder_table, p_sextet));
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);
428 ETL_ASSERT(!invalid_data_detected, ETL_ERROR(etl::base64_invalid_data));
429 ETL_ASSERT(!overflow_detected, ETL_ERROR(etl::base64_overflow));
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)
492 ETL_ASSERT_FAIL(ETL_ERROR(etl::base64_invalid_data));
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");
586 unsigned char output_buffer[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");
641 unsigned char output_buffer[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");
696 unsigned char output_buffer[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");
751 unsigned char output_buffer[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");
806 unsigned char output_buffer[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");
861 unsigned char output_buffer[Buffer_Size];
865#undef ETL_IS_TYPE_8_BIT_INTEGRAL
866#undef ETL_IS_ITERATOR_TYPE_8_BIT_INTEGRAL
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
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
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
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
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
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
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
Span - Fixed Extent.
Definition span.h:138
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
bitset_ext
Definition absolute.h:39