static const char Base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static const char Pad64 = '=';
/** Maximal possible size of the decoded data. */
#define BASE64_MAX_DECODED_SIZE(_encoded_size) ((_encoded_size) / 4 * 3)
+#define PAD64 '='
/**
* base64-decode a buffer.
*
char *pos;
const char *end = src + encoded_size;
unsigned char *target;
- size_t targsize;
if (encoded_size == (size_t)-1)
encoded_size = strlen(src);
- targsize = BASE64_MAX_DECODED_SIZE(encoded_size);
- target = para_malloc(targsize + 1);
+ target = para_malloc(BASE64_MAX_DECODED_SIZE(encoded_size) + 1);
state = 0;
tarindex = 0;
if (para_isspace(ch)) /* Skip whitespace anywhere. */
continue;
- if (ch == Pad64)
+ if (ch == PAD64)
break;
pos = strchr(Base64, ch);
switch (state) {
case 0:
- if (tarindex >= targsize)
- goto fail;
target[tarindex] = (pos - Base64) << 2;
state = 1;
break;
case 1:
- if (tarindex + 1 >= targsize)
- goto fail;
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex + 1] = ((pos - Base64) & 0x0f) << 4;
tarindex++;
state = 2;
break;
case 2:
- if (tarindex + 1 >= targsize)
- goto fail;
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex + 1] = ((pos - Base64) & 0x03) << 6;
tarindex++;
state = 3;
break;
case 3:
- if (tarindex >= targsize)
- goto fail;
target[tarindex] |= pos - Base64;
tarindex++;
state = 0;
* on a byte boundary, and/or with erroneous trailing characters.
*/
- if (*src == Pad64) { /* We got a pad char. */
+ if (*src == PAD64) { /* We got a pad char. */
ch = *src++; /* Skip it, get next. */
switch (state) {
case 0: /* Invalid = in first position */
if (!isspace(ch))
break;
/* Make sure there is another trailing = sign. */
- if (ch != Pad64)
+ if (ch != PAD64)
goto fail;
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */