--- /dev/null
+#include "b64decode.h"
+
+#define UNDEF_CH -2
+
+char s64table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+int charmap[257];
+int *pcharmap;
+
+void b64decodeinit()
+{
+ int i;
+ char ch;
+
+ pcharmap= charmap + 1;
+
+ for (i = 0; i <= 255; i++)
+ pcharmap[i] = UNDEF_CH;
+
+ for (i = 0; i < 64; i++) {
+ ch = s64table[i];
+ if (pcharmap[ch] == UNDEF_CH)
+ pcharmap[ch] = i;
+ }
+}
+
+int b64decode(char *s, char *dest)
+{\r
+ int k,k2,i;\r
+\r
+ i=0;\r
+ while (*s!='\0') {\r
+ /* byte #1 */\r
+ if ((*s=='=') || ((k=pcharmap[(unsigned char) (*(s++))])<0))\r
+ return -1;\r
+\r
+ /* byte #2 */\r
+ if ((*s=='=') || ((k2=pcharmap[(unsigned char) (*(s++))])<0))\r
+ return -1;\r
+ else\r
+ dest[i++] = (k<<2) + (k2>>4);\r
+\r
+ /* byte #3 */\r
+ if (*s=='=')\r
+ s++;\r
+ else\r
+ if ((k=pcharmap[(unsigned char) (*(s++))])<0)\r
+ return -1;\r
+ else\r
+ dest[i++] = (k2<<4) + (k>>2);\r
+\r
+ /* byte #4 */\r
+ if (*s=='=')\r
+ s++;\r
+ else\r
+ if ((k2=pcharmap[(unsigned char) (*(s++))])<0)\r
+ -1;\r
+ else\r
+ dest[i++] = (k<<6) + (k2);\r
+ }\r
+\r
+ return i;\r
+}