9 #include <botan/base32.h>
10 #include <botan/internal/codec_base.h>
11 #include <botan/internal/rounding.h>
20 static inline std::string
name() noexcept
25 static inline size_t encoding_bytes_in() noexcept
27 return m_encoding_bytes_in;
29 static inline size_t encoding_bytes_out() noexcept
31 return m_encoding_bytes_out;
34 static inline size_t decoding_bytes_in() noexcept
36 return m_encoding_bytes_out;
38 static inline size_t decoding_bytes_out() noexcept
40 return m_encoding_bytes_in;
43 static inline size_t bits_consumed() noexcept
45 return m_encoding_bits;
47 static inline size_t remaining_bits_before_padding() noexcept
49 return m_remaining_bits_before_padding;
52 static inline size_t encode_max_output(
size_t input_length)
54 return (
round_up(input_length, m_encoding_bytes_in) / m_encoding_bytes_in) * m_encoding_bytes_out;
56 static inline size_t decode_max_output(
size_t input_length)
58 return (
round_up(input_length, m_encoding_bytes_out) * m_encoding_bytes_in) / m_encoding_bytes_out;
61 static void encode(
char out[8],
const uint8_t in[5]) noexcept
63 out[0] = Base32::m_bin_to_base32[(in[0] & 0xF8) >> 3];
64 out[1] = Base32::m_bin_to_base32[((in[0] & 0x07) << 2) | (in[1] >> 6)];
65 out[2] = Base32::m_bin_to_base32[((in[1] & 0x3E) >> 1)];
66 out[3] = Base32::m_bin_to_base32[((in[1] & 0x01) << 4) | (in[2] >> 4)];
67 out[4] = Base32::m_bin_to_base32[((in[2] & 0x0F) << 1) | (in[3] >> 7)];
68 out[5] = Base32::m_bin_to_base32[((in[3] & 0x7C) >> 2)];
69 out[6] = Base32::m_bin_to_base32[((in[3] & 0x03) << 3) | (in[4] >> 5)];
70 out[7] = Base32::m_bin_to_base32[in[4] & 0x1F];
73 static inline uint8_t lookup_binary_value(
char input) noexcept
75 return Base32::m_base32_to_bin[
static_cast<uint8_t
>(input)];
78 static inline bool check_bad_char(uint8_t bin,
char input,
bool ignore_ws)
84 else if(!(bin == 0x81 || (bin == 0x80 && ignore_ws)))
86 std::string bad_char(1, input);
89 else if(bad_char ==
"\n")
91 else if(bad_char ==
"\r")
94 throw Invalid_Argument(
95 std::string(
"base32_decode: invalid base32 character '") +
101 static void decode(uint8_t* out_ptr,
const uint8_t decode_buf[8])
103 out_ptr[0] = (decode_buf[0] << 3) | (decode_buf[1] >> 2);
104 out_ptr[1] = (decode_buf[1] << 6) | (decode_buf[2] << 1) | (decode_buf[3] >> 4);
105 out_ptr[2] = (decode_buf[3] << 4) | (decode_buf[4] >> 1);
106 out_ptr[3] = (decode_buf[4] << 7) | (decode_buf[5] << 2) | (decode_buf[6] >> 3);
107 out_ptr[4] = (decode_buf[6] << 5) | decode_buf[7];
110 static inline size_t bytes_to_remove(
size_t final_truncate)
112 return final_truncate ? (final_truncate / 2) + 1 : 0;
116 static const size_t m_encoding_bits = 5;
117 static const size_t m_remaining_bits_before_padding = 6;
120 static const size_t m_encoding_bytes_in = 5;
121 static const size_t m_encoding_bytes_out = 8;
124 static const uint8_t m_bin_to_base32[32];
125 static const uint8_t m_base32_to_bin[256];
128 const uint8_t Base32::m_bin_to_base32[32] =
130 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
131 'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
132 '2',
'3',
'4',
'5',
'6',
'7'
139 const uint8_t Base32::m_base32_to_bin[256] =
141 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80,
142 0x80, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
143 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
144 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
145 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
146 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
147 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04,
148 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
149 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
150 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
151 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
152 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
153 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
154 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
155 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
156 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
157 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
158 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
159 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
160 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
161 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
162 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
163 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
164 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
165 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
166 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
174 size_t& input_consumed,
177 return base_encode(Base32(), out, in, input_length, input_consumed, final_inputs);
189 size_t& input_consumed,
193 return base_decode(Base32(), out, in, input_length, input_consumed, final_inputs, ignore_ws);
205 const std::string& input,
208 return base32_decode(output, input.data(), input.length(), ignore_ws);
215 return base_decode_to_vec<secure_vector<uint8_t>>(Base32(), input, input_length, ignore_ws);
size_t base_decode(Base &&base, uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws=true)
int(* final)(unsigned char *, CTX *)
std::string base_encode_to_string(Base &&base, const uint8_t input[], size_t input_length)
std::vector< T, secure_allocator< T >> secure_vector
std::string encode(const uint8_t der[], size_t length, const std::string &label, size_t width)
size_t base32_decode(uint8_t out[], const char in[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws)
secure_vector< uint8_t > decode(DataSource &source, std::string &label)
size_t base32_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
size_t base_decode_full(Base &&base, uint8_t output[], const char input[], size_t input_length, bool ignore_ws)
size_t round_up(size_t n, size_t align_to)
size_t base_encode(Base &&base, char output[], const uint8_t input[], size_t input_length, size_t &input_consumed, bool final_inputs)