44static char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
57 size_t out_size = (size_t)size * 4 / 3 + 4;
58 if (out_size > INT_MAX)
62 char *p = (
char *)malloc(out_size);
68 const unsigned char *q = (
const unsigned char *)data;
69 for (
int i = 0;
i < size;)
71 unsigned int c = q[
i++];
100 return (
int)strlen(start);
116#define DECODE_ERROR 0xffffffff
121 unsigned int val = 0;
122 unsigned int marker = 0;
123 if (!token[0] || !token[1] || !token[2] || !token[3])
127 for (
unsigned int i = 0;
i < 4;
i++)
140 int char_pos =
pos(token[
i]);
145 val += (
unsigned int)char_pos;
152 return (marker << 24) | val;
164 unsigned char *e = NULL;
171 for (p = str; *p && (*p ==
'=' || strchr(
base64_chars, *p)); p += 4)
174 unsigned int marker = (val >> 24) & 0xff;
183 *q++ = (val >> 16) & 0xff;
190 *q++ = (val >> 8) & 0xff;
201 return (
int)(q - (
unsigned char *)data);
int openvpn_base64_decode(const char *str, void *data, int size)
static char base64_chars[]
int openvpn_base64_encode(const void *data, int size, char **str)
static unsigned int token_decode(const char *token)