/* * Decode base64 str, outputting data to buffer * at data of length size. Return length of * decoded data written or -1 on error or overflow. */ int vpnconnect_base64_decode(const char *str, void *data, int size) { const char *p; unsigned char *q; unsigned char *e = NULL; q = data; if (size >= 0) e = q + size; for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) { unsigned int val = token_decode(p); unsigned int marker = (val >> 24) & 0xff; if (val == DECODE_ERROR) return -1; if (e && q >= e) return -1; *q++ = (val >> 16) & 0xff; if (marker < 2) { if (e && q >= e) return -1; *q++ = (val >> 8) & 0xff; } if (marker < 1) { if (e && q >= e) return -1; *q++ = val & 0xff; } } return q - (unsigned char *) data; }
// TODO: Implement an S3Data class. S3_PRIVATE int s3_base64_decode(const char *str, void *data) { const char *p; unsigned char *q; q = data; for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) { unsigned int val = token_decode(p); unsigned int marker = (val >> 24) & 0xff; if (val == DECODE_ERROR) return -1; *q++ = (val >> 16) & 0xff; if (marker < 2) *q++ = (val >> 8) & 0xff; if (marker < 1) *q++ = val & 0xff; } return q - (unsigned char *) data; }
int base64_decode(const char *str, void *data) { const char *p; unsigned char *q; unsigned int size; q = data; size = strlen(str); for (p = str; *p && (*p == '=' || is_base64_char(*p)); p += 4, size -= 4) { unsigned int val = token_decode(p, size); unsigned int marker = (val >> 24) & 0xff; if (val == DECODE_ERROR) return -1; *q++ = (val >> 16) & 0xff; if (marker < 2) *q++ = (val >> 8) & 0xff; if (marker < 1) *q++ = val & 0xff; } return q - (unsigned char *) data; }