diff options
| -rw-r--r-- | xs_encdec.h | 38 |
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; |