57 #include <ripple/basics/base64.h>
69 static char constexpr tab[] = {
70 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
74 inline signed char const*
77 static signed char constexpr tab[] = {
78 -1, -1, -1, -1, -1, -1, -1, -1,
79 -1, -1, -1, -1, -1, -1, -1, -1,
80 -1, -1, -1, -1, -1, -1, -1, -1,
81 -1, -1, -1, -1, -1, -1, -1, -1,
82 -1, -1, -1, -1, -1, -1, -1, -1,
83 -1, -1, -1, 62, -1, -1, -1, 63,
84 52, 53, 54, 55, 56, 57, 58, 59,
85 60, 61, -1, -1, -1, -1, -1, -1,
86 -1, 0, 1, 2, 3, 4, 5, 6,
87 7, 8, 9, 10, 11, 12, 13, 14,
88 15, 16, 17, 18, 19, 20, 21, 22,
89 23, 24, 25, -1, -1, -1, -1, -1,
90 -1, 26, 27, 28, 29, 30, 31, 32,
91 33, 34, 35, 36, 37, 38, 39, 40,
92 41, 42, 43, 44, 45, 46, 47, 48,
93 49, 50, 51, -1, -1, -1, -1, -1,
94 -1, -1, -1, -1, -1, -1, -1, -1,
95 -1, -1, -1, -1, -1, -1, -1, -1,
96 -1, -1, -1, -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
117 return 4 * ((n + 2) / 3);
123 return ((n / 4) * 3) + 2;
141 char*
out =
static_cast<char*
>(dest);
142 char const*
in =
static_cast<char const*
>(src);
145 for (
auto n = len / 3; n--;)
147 *
out++ = tab[(
in[0] & 0xfc) >> 2];
148 *
out++ = tab[((
in[0] & 0x03) << 4) + ((
in[1] & 0xf0) >> 4)];
149 *
out++ = tab[((
in[2] & 0xc0) >> 6) + ((
in[1] & 0x0f) << 2)];
150 *
out++ = tab[
in[2] & 0x3f];
157 *
out++ = tab[(
in[0] & 0xfc) >> 2];
158 *
out++ = tab[((
in[0] & 0x03) << 4) + ((
in[1] & 0xf0) >> 4)];
159 *
out++ = tab[(
in[1] & 0x0f) << 2];
164 *
out++ = tab[(
in[0] & 0xfc) >> 2];
165 *
out++ = tab[((
in[0] & 0x03) << 4)];
174 return out -
static_cast<char*
>(dest);
191 char*
out =
static_cast<char*
>(dest);
192 auto in =
reinterpret_cast<unsigned char const*
>(src);
193 unsigned char c3[3]{}, c4[4]{};
199 while (len-- && *
in !=
'=')
201 auto const v = inverse[*
in];
208 c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4);
209 c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2);
210 c3[2] = ((c4[2] & 0x3) << 6) + c4[3];
212 for (i = 0; i < 3; i++)
220 c3[0] = (c4[0] << 2) + ((c4[1] & 0x30) >> 4);
221 c3[1] = ((c4[1] & 0xf) << 4) + ((c4[2] & 0x3c) >> 2);
222 c3[2] = ((c4[2] & 0x3) << 6) + c4[3];
224 for (j = 0; j < i - 1; j++)
229 out -
static_cast<char*
>(dest),
230 in -
reinterpret_cast<unsigned char const*
>(src)};
249 auto const result =
base64::decode(&dest[0], data.data(), data.size());
250 dest.
resize(result.first);