/*
* Skips all whitespace anywhere. Converts characters, four at a time, starting
* at (or after) src from base - 64 numbers into three 8 bit bytes in the
- * target area. it returns the number of data bytes stored at the target, or -1
+ * target area. it returns the number of data bytes stored at the target, or -E_BASE64
* on error.
*/
-static int base64_decode(char const *src, unsigned char *target, size_t targsize)
+int base64_decode(char const *src, unsigned char *target, size_t targsize)
{
unsigned int tarindex, state;
int ch;
pos = strchr(Base64, ch);
if (pos == 0) /* A non-base64 character. */
- return -1;
+ return -E_BASE64;
switch (state) {
case 0:
if (target) {
if (tarindex >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] = (pos - Base64) << 2;
}
state = 1;
case 1:
if (target) {
if (tarindex + 1 >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] |= (pos - Base64) >> 4;
target[tarindex+1] = ((pos - Base64) & 0x0f)
<< 4 ;
case 2:
if (target) {
if (tarindex + 1 >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] |= (pos - Base64) >> 2;
target[tarindex+1] = ((pos - Base64) & 0x03)
<< 6;
case 3:
if (target) {
if (tarindex >= targsize)
- return (-1);
+ return -E_BASE64;
target[tarindex] |= (pos - Base64);
}
tarindex++;
switch (state) {
case 0: /* Invalid = in first position */
case 1: /* Invalid = in second position */
- return (-1);
+ return -E_BASE64;
case 2: /* Valid, means one byte of info */
/* Skip any number of spaces. */
break;
/* Make sure there is another trailing = sign. */
if (ch != Pad64)
- return (-1);
+ return -E_BASE64;
ch = *src++; /* Skip the = */
/* Fall through to "single trailing =" case. */
/* FALLTHROUGH */
*/
for (; ch != '\0'; ch = *src++)
if (!isspace(ch))
- return (-1);
+ return -E_BASE64;
/*
* Now make sure for cases 2 and 3 that the "extra"
* subliminal channel.
*/
if (target && target[tarindex] != 0)
- return (-1);
+ return -E_BASE64;
}
} else {
/*
* have no partial bytes lying around.
*/
if (state != 0)
- return (-1);
+ return -E_BASE64;
}
- return (tarindex);
+ return tarindex;
}
int uudecode(const char *src, unsigned char *target, size_t targsize)
*p = '\0';
len = base64_decode(encoded, target, targsize);
free(encoded);
- return len >= 0? len : -E_BASE64;
+ return len;
}
/*