summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs_encdec.h38
1 files changed, 24 insertions, 14 deletions
diff --git a/xs_encdec.h b/xs_encdec.h
index 1ca9346..f6042e8 100644
--- a/xs_encdec.h
+++ b/xs_encdec.h
@@ -35,10 +35,13 @@ d_char *xs_hex_dec(const char *hex)
35/* decodes an hexdump into data */ 35/* decodes an hexdump into data */
36{ 36{
37 int sz = strlen(hex); 37 int sz = strlen(hex);
38 d_char *s; 38 d_char *s = NULL;
39 char *p; 39 char *p;
40 int n; 40 int n;
41 41
42 if (sz % 2)
43 return s;
44
42 p = s = calloc(sz / 2, 1); 45 p = s = calloc(sz / 2, 1);
43 46
44 for (n = 0; n < sz; n += 2) { 47 for (n = 0; n < sz; n += 2) {
@@ -63,34 +66,37 @@ d_char *xs_base64_enc(const char *data, int sz)
63{ 66{
64 d_char *s; 67 d_char *s;
65 unsigned char *p; 68 unsigned char *p;
66 int n; 69 char *i;
70 int bsz, n;
67 static char *b64_tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 71 static char *b64_tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
68 "abcdefghijklmnopqrstuvwxyz" 72 "abcdefghijklmnopqrstuvwxyz"
69 "0123456789+/"; 73 "0123456789+/";
70 74
71 s = xs_str_new(NULL); 75 bsz = ((sz + 3 - 1) / 3) * 4;
76 i = s = calloc(bsz + 1, 1);
72 p = (unsigned char *)data; 77 p = (unsigned char *)data;
73 78
74 for (n = 0; n < sz; n += 3) { 79 for (n = 0; n < sz; n += 3) {
75 int l = sz - n; 80 int l = sz - n;
76 81
77 if (l == 1) { 82 if (l == 1) {
78 s = xs_append_m(s, &b64_tbl[(p[n] >> 2) & 0x3f], 1); 83 *i++ = b64_tbl[(p[n] >> 2) & 0x3f];
79 s = xs_append_m(s, &b64_tbl[(p[n] << 4) & 0x3f], 1); 84 *i++ = b64_tbl[(p[n] << 4) & 0x3f];
80 s = xs_append_m(s, "==", 2); 85 *i++ = '=';
86 *i++ = '=';
81 } 87 }
82 else 88 else
83 if (l == 2) { 89 if (l == 2) {
84 s = xs_append_m(s, &b64_tbl[(p[n] >> 2) & 0x3f], 1); 90 *i++ = b64_tbl[(p[n] >> 2) & 0x3f];
85 s = xs_append_m(s, &b64_tbl[(p[n] << 4 | p[n + 1] >> 4) & 0x3f], 1); 91 *i++ = b64_tbl[(p[n] << 4 | p[n + 1] >> 4) & 0x3f];
86 s = xs_append_m(s, &b64_tbl[(p[n + 1] << 2) & 0x3f], 1); 92 *i++ = b64_tbl[(p[n + 1] << 2) & 0x3f];
87 s = xs_append_m(s, "=", 1); 93 *i++ = '=';
88 } 94 }
89 else { 95 else {
90 s = xs_append_m(s, &b64_tbl[(p[n] >> 2) & 0x3f], 1); 96 *i++ = b64_tbl[(p[n] >> 2) & 0x3f];
91 s = xs_append_m(s, &b64_tbl[(p[n] << 4 | p[n + 1] >> 4) & 0x3f], 1); 97 *i++ = b64_tbl[(p[n] << 4 | p[n + 1] >> 4) & 0x3f];
92 s = xs_append_m(s, &b64_tbl[(p[n + 1] << 2 | p[n + 2] >> 6) & 0x3f], 1); 98 *i++ = b64_tbl[(p[n + 1] << 2 | p[n + 2] >> 6) & 0x3f];
93 s = xs_append_m(s, &b64_tbl[(p[n + 2]) & 0x3f], 1); 99 *i++ = b64_tbl[(p[n + 2]) & 0x3f];
94 } 100 }
95 } 101 }
96 102
@@ -110,6 +116,10 @@ d_char *xs_base64_dec(const char *data, int *size)
110 116
111 p = (char *)data; 117 p = (char *)data;
112 118
119 /* size of data must be a multiple of 4 */
120 if (strlen(p) % 4)
121 return s;
122
113 for (p = (char *)data; *p; p += 4) { 123 for (p = (char *)data; *p; p += 4) {
114 int cs[4]; 124 int cs[4];
115 int n; 125 int n;