/* Original code from: * dmc - dynamic mail client -- author: pancake * See LICENSE file for copyright and license details. */ #include #include #include #include #include #define SZ 1024 static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; static void b64_encode(const ut8 in[3], ut8 out[4], int len) { out[0] = cb64[ in[0] >> 2 ]; out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; out[2] = (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '='); out[3] = (len > 2 ? cb64[ in[2] & 0x3f ] : '='); } static int b64_decode(const ut8 in[4], ut8 out[3]) { ut8 len = 3, i, v[4] = {0}; for (i=0; i<4; i++) { if (in[i]<43||in[i]>122) return -1; v[i] = cd64[in[i]-43]; if (v[i]=='$') { len = i-1; break; } else v[i]-=62; } out[0] = v[0] << 2 | v[1] >> 4; out[1] = v[1] << 4 | v[2] >> 2; out[2] = ((v[2] << 6) & 0xc0) | v[3]; return len; } R_API int r_base64_decode(ut8 *bout, const ut8 *bin, int len) { int in, out, ret; for (in=out=0; in3?3:len-in); }