summaryrefslogtreecommitdiffstats
path: root/src/base64.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base64.c')
-rw-r--r--src/base64.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/base64.c b/src/base64.c
index 7128a5a..e59d963 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -43,32 +43,32 @@ static const signed char base64_table[256] = {
43 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 43 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
44}; 44};
45 45
46char *base64encode(const unsigned char *buf, size_t *size) 46size_t base64encode(char *outbuf, const unsigned char *buf, size_t size)
47{ 47{
48 if (!buf || !size || !(*size > 0)) return NULL; 48 if (!outbuf || !buf || (size <= 0)) {
49 int outlen = (*size / 3) * 4; 49 return 0;
50 char *outbuf = (char*)malloc(outlen+5); // 4 spare bytes + 1 for '\0' 50 }
51
51 size_t n = 0; 52 size_t n = 0;
52 size_t m = 0; 53 size_t m = 0;
53 unsigned char input[3]; 54 unsigned char input[3];
54 unsigned int output[4]; 55 unsigned int output[4];
55 while (n < *size) { 56 while (n < size) {
56 input[0] = buf[n]; 57 input[0] = buf[n];
57 input[1] = (n+1 < *size) ? buf[n+1] : 0; 58 input[1] = (n+1 < size) ? buf[n+1] : 0;
58 input[2] = (n+2 < *size) ? buf[n+2] : 0; 59 input[2] = (n+2 < size) ? buf[n+2] : 0;
59 output[0] = input[0] >> 2; 60 output[0] = input[0] >> 2;
60 output[1] = ((input[0] & 3) << 4) + (input[1] >> 4); 61 output[1] = ((input[0] & 3) << 4) + (input[1] >> 4);
61 output[2] = ((input[1] & 15) << 2) + (input[2] >> 6); 62 output[2] = ((input[1] & 15) << 2) + (input[2] >> 6);
62 output[3] = input[2] & 63; 63 output[3] = input[2] & 63;
63 outbuf[m++] = base64_str[(int)output[0]]; 64 outbuf[m++] = base64_str[(int)output[0]];
64 outbuf[m++] = base64_str[(int)output[1]]; 65 outbuf[m++] = base64_str[(int)output[1]];
65 outbuf[m++] = (n+1 < *size) ? base64_str[(int)output[2]] : base64_pad; 66 outbuf[m++] = (n+1 < size) ? base64_str[(int)output[2]] : base64_pad;
66 outbuf[m++] = (n+2 < *size) ? base64_str[(int)output[3]] : base64_pad; 67 outbuf[m++] = (n+2 < size) ? base64_str[(int)output[3]] : base64_pad;
67 n+=3; 68 n+=3;
68 } 69 }
69 outbuf[m] = 0; // 0-termination! 70 outbuf[m] = 0; // 0-termination!
70 *size = m; 71 return m;
71 return outbuf;
72} 72}
73 73
74static int base64decode_block(unsigned char *target, const char *data, size_t data_size) 74static int base64decode_block(unsigned char *target, const char *data, size_t data_size)