#include #include #include "base64-internal.h" static char encoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; void base64__encode_trail(const unsigned char *in, int nin, unsigned char *out) { switch (nin) { case 1: out[0] = encoding[(in[0]>>2)&0x3f]; out[1] = encoding[(in[0]<<4)&0x30]; out[2] = '='; out[3] = '='; break; case 2: out[0] = encoding[(in[0]>>2)&0x3f]; out[1] = encoding[((in[0]<<4)|(in[1]>>4))&0x3f]; out[2] = encoding[(in[1]<<2)&0x3f]; out[3] = '='; break; default: abort(); break; } } void base64__encode(const unsigned char *in, unsigned char *out) { out[0] = encoding[(in[0]>>2)&0x3f]; out[1] = encoding[((in[0]<<4)|(in[1]>>4))&0x3f]; out[2] = encoding[((in[1]<<2)|(in[2]>>6))&0x3f]; out[3] = encoding[in[2]&0x3f]; } static int encx(unsigned char c) { const void *found; found = memchr(&encoding[0],c,64); return(found?((const char *)found)-&encoding[0]:-1); } B64DECSTATUS base64__decode(const unsigned char *in, unsigned char *out) { unsigned int v; int d; d = encx(in[0]); if (d < 0) return(B64D_ERROR); v = d; d = encx(in[1]); if (d < 0) return(B64D_ERROR); v = (v << 6) | d; d = encx(in[2]); if (d < 0) { if ((in[2] == '=') && (in[3] == '=') && ((v & 0xf) == 0)) { out[0] = v >> 4; return(B64D_FINAL_1); } return(B64D_ERROR); } v = (v << 6) | d; d = encx(in[3]); if (d < 0) { if ((in[3] == '=') && ((v & 0x3) == 0)) { out[0] = v >> 10; out[1] = (v >> 2) & 0xff; return(B64D_FINAL_2); } return(B64D_ERROR); } out[0] = v >> 10; out[1] = (v >> 2) & 0xff; out[2] = ((v << 6) | d) & 0xff; return(B64D_NORMAL); }