check in keyconvert tool
[sfa.git] / keyconvert / b64decode.c
diff --git a/keyconvert/b64decode.c b/keyconvert/b64decode.c
new file mode 100644 (file)
index 0000000..07dc452
--- /dev/null
@@ -0,0 +1,62 @@
+#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
+}