1 #include <drift/dslcore.h>
2 #include <drift/base64.h>
47 #if defined(BIG_ENDIAN)
48 #define WORDS_BIGENDIAN 1
50 #undef WORDS_BIGENDIAN
53 #include <drift/base64_data.h>
55 #define BADCHAR 0x01FFFFFF
76 const uint8* s = (
const uint8*) str;
77 uint8* p = (uint8*) dest;
84 for (i = 0; i < len - 2; i += 3) {
85 t1 = s[i]; t2 = s[i+1]; t3 = s[i+2];
87 *p++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
88 *p++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
98 *p++ = e1[(t1 & 0x03) << 4];
103 t1 = s[i]; t2 = s[i+1];
105 *p++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
106 *p++ = e2[(t2 & 0x0F) << 2];
111 return (
int)(p - (uint8*)dest);
114 #ifdef WORDS_BIGENDIAN
115 int DSL_CC
base64_decode(
const char* src,
size_t len,
void * dest) {
116 if (len == 0)
return 0;
122 if (len < 4 || (len % 4 != 0))
return -1;
123 if (src[len-1] == CHARPAD) {
125 if (src[len -1] == CHARPAD) {
132 int leftover = len % 4;
133 int chunks = (leftover == 0) ? len / 4 - 1 : len /4;
135 uint8* p = (uint8*) dest;
137 uint32* destInt = (uint32*) p;
138 uint32* srcInt = (uint32*) src;
139 uint32 y = *srcInt++;
140 for (i = 0; i < chunks; ++i) {
141 x = d0[y >> 24 & 0xff] | d1[y >> 16 & 0xff] |
142 d2[y >> 8 & 0xff] | d3[y & 0xff];
144 if (x >= BADCHAR)
return -1;
147 destInt = (uint32*)p;
153 x = d0[y >> 24 & 0xff] | d1[y >> 16 & 0xff] |
154 d2[y >> 8 & 0xff] | d3[y & 0xff];
155 if (x >= BADCHAR)
return -1;
156 *p++ = ((uint8*)&x)[1];
157 *p++ = ((uint8*)&x)[2];
158 *p = ((uint8*)&x)[3];
167 x = d3[y >> 24] *64 + d3[(y >> 16) & 0xff];
168 *p = (uint8)(x >> 4);
171 x = (d3[y >> 24] *64 + d3[(y >> 16) & 0xff])*64 +
173 *p++ = (uint8) (x >> 10);
174 *p = (uint8) (x >> 2);
178 if (x >= BADCHAR)
return -1;
179 return 3*chunks + (6*leftover)/8;
184 if (len == 0)
return 0;
191 if (len < 4 || (len % 4 != 0))
return -1;
193 if (src[len-1] == CHARPAD) {
195 if (src[len -1] == CHARPAD) {
202 int leftover = len % 4;
203 int chunks = (leftover == 0) ? len / 4 - 1 : len /4;
205 uint8* p = (uint8*) dest;
207 uint32* destInt = (uint32*) p;
208 uint32* srcInt = (uint32*) src;
209 uint32 y = *srcInt++;
210 for (i = 0; i < chunks; ++i) {
212 d1[(y >> 8) & 0xff] |
213 d2[(y >> 16) & 0xff] |
214 d3[(y >> 24) & 0xff];
216 if (x >= BADCHAR)
return -1;
219 destInt = (uint32*)p;
226 d1[(y >> 8) & 0xff] |
227 d2[(y >> 16) & 0xff] |
228 d3[(y >> 24) & 0xff];
230 if (x >= BADCHAR)
return -1;
231 *p++ = ((uint8*)(&x))[0];
232 *p++ = ((uint8*)(&x))[1];
233 *p = ((uint8*)(&x))[2];
239 *p = *((uint8*)(&x));
243 x = d0[y & 0xff] | d1[y >> 8 & 0xff];
244 *p = *((uint8*)(&x));
250 *p++ = ((uint8*)(&x))[0];
251 *p = ((uint8*)(&x))[1];
255 if (x >= BADCHAR)
return -1;
257 return 3*chunks + (6*leftover)/8;
int DSL_CC base64_decode(const char *src, size_t len, void *dest)
int DSL_CC base64_encode(const void *str, size_t len, char *dest)