57#include <xrpl/basics/base64.h>
72 static char constexpr tab[] = {
73 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
77inline signed char const*
80 static signed char constexpr tab[] = {
81 -1, -1, -1, -1, -1, -1, -1, -1,
82 -1, -1, -1, -1, -1, -1, -1, -1,
83 -1, -1, -1, -1, -1, -1, -1, -1,
84 -1, -1, -1, -1, -1, -1, -1, -1,
85 -1, -1, -1, -1, -1, -1, -1, -1,
86 -1, -1, -1, 62, -1, -1, -1, 63,
87 52, 53, 54, 55, 56, 57, 58, 59,
88 60, 61, -1, -1, -1, -1, -1, -1,
89 -1, 0, 1, 2, 3, 4, 5, 6,
90 7, 8, 9, 10, 11, 12, 13, 14,
91 15, 16, 17, 18, 19, 20, 21, 22,
92 23, 24, 25, -1, -1, -1, -1, -1,
93 -1, 26, 27, 28, 29, 30, 31, 32,
94 33, 34, 35, 36, 37, 38, 39, 40,
95 41, 42, 43, 44, 45, 46, 47, 48,
96 49, 50, 51, -1, -1, -1, -1, -1,
97 -1, -1, -1, -1, -1, -1, -1, -1,
98 -1, -1, -1, -1, -1, -1, -1, -1,
99 -1, -1, -1, -1, -1, -1, -1, -1,
100 -1, -1, -1, -1, -1, -1, -1, -1,
101 -1, -1, -1, -1, -1, -1, -1, -1,
102 -1, -1, -1, -1, -1, -1, -1, -1,
103 -1, -1, -1, -1, -1, -1, -1, -1,
104 -1, -1, -1, -1, -1, -1, -1, -1,
105 -1, -1, -1, -1, -1, -1, -1, -1,
106 -1, -1, -1, -1, -1, -1, -1, -1,
107 -1, -1, -1, -1, -1, -1, -1, -1,
108 -1, -1, -1, -1, -1, -1, -1, -1,
109 -1, -1, -1, -1, -1, -1, -1, -1,
110 -1, -1, -1, -1, -1, -1, -1, -1,
111 -1, -1, -1, -1, -1, -1, -1, -1,
112 -1, -1, -1, -1, -1, -1, -1, -1
120 return 4 * ((n + 2) / 3);
126 return ((n / 4) * 3) + 2;
144 char*
out =
static_cast<char*
>(dest);
145 char const*
in =
static_cast<char const*
>(src);
148 for (
auto n = len / 3; n--;)
150 *
out++ = tab[(
in[0] & 0xfc) >> 2];
151 *
out++ = tab[((
in[0] & 0x03) << 4) + ((
in[1] & 0xf0) >> 4)];
152 *
out++ = tab[((
in[2] & 0xc0) >> 6) + ((
in[1] & 0x0f) << 2)];
153 *
out++ = tab[
in[2] & 0x3f];
160 *
out++ = tab[(
in[0] & 0xfc) >> 2];
161 *
out++ = tab[((
in[0] & 0x03) << 4) + ((
in[1] & 0xf0) >> 4)];
162 *
out++ = tab[(
in[1] & 0x0f) << 2];
167 *
out++ = tab[(
in[0] & 0xfc) >> 2];
168 *
out++ = tab[((
in[0] & 0x03) << 4)];
177 return out -
static_cast<char*
>(dest);
194 char*
out =
static_cast<char*
>(dest);
195 auto in =
reinterpret_cast<unsigned char const*
>(src);
196 unsigned char c3[3]{}, c4[4]{};
202 while (len-- && *
in !=
'=')
204 auto const v = inverse[*
in];
211 c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4);
212 c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2);
213 c3[2] = ((c4[2] & 0x3) << 6) + c4[3];
215 for (i = 0; i < 3; i++)
223 c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4);
224 c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2);
225 c3[2] = ((c4[2] & 0x3) << 6) + c4[3];
227 for (j = 0; j < i - 1; j++)
232 out -
static_cast<char*
>(dest),
233 in -
reinterpret_cast<unsigned char const*
>(src)};
252 auto const result =
base64::decode(&dest[0], data.data(), data.size());
253 dest.
resize(result.first);
std::pair< std::size_t, std::size_t > decode(void *dest, char const *src, std::size_t len)
Decode a padded base64 string into a series of octets.
signed char const * get_inverse()
char const * get_alphabet()
std::size_t encode(void *dest, void const *src, std::size_t len)
Encode a series of octets as a padded, base64 string.
std::size_t constexpr decoded_size(std::size_t n)
Returns max bytes needed to decode a base64 string.
std::size_t constexpr encoded_size(std::size_t n)
Returns max chars needed to encode a base64 string.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string base64_decode(std::string_view data)
std::string base64_encode(std::uint8_t const *data, std::size_t len)