initial checkin
[sfa.git] / keyconvert / b64decode.c
1 #include "b64decode.h"
2
3 #define UNDEF_CH -2
4
5 char s64table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
6 int     charmap[257];
7 int     *pcharmap;
8
9 void b64decodeinit()
10 {
11    int i;
12    char ch;
13
14    pcharmap= charmap + 1;
15
16   for (i = 0; i <= 255; i++)
17     pcharmap[i] = UNDEF_CH;
18
19   for (i = 0; i < 64; i++) {
20     ch = s64table[i];
21     if (pcharmap[ch] == UNDEF_CH)
22       pcharmap[ch] = i;
23   }
24 }
25
26 int b64decode(char *s, char *dest)
27 {\r
28   int k,k2,i;\r
29 \r
30   i=0;\r
31   while (*s!='\0') {\r
32     /* byte #1 */\r
33     if ((*s=='=') || ((k=pcharmap[(unsigned char) (*(s++))])<0))\r
34       return -1;\r
35 \r
36     /* byte #2 */\r
37     if ((*s=='=') || ((k2=pcharmap[(unsigned char) (*(s++))])<0))\r
38       return -1;\r
39     else\r
40       dest[i++] = (k<<2) + (k2>>4);\r
41 \r
42     /* byte #3 */\r
43     if (*s=='=')\r
44       s++;\r
45     else\r
46       if ((k=pcharmap[(unsigned char) (*(s++))])<0)\r
47         return -1;\r
48       else\r
49         dest[i++] = (k2<<4) + (k>>2);\r
50 \r
51     /* byte #4 */\r
52     if (*s=='=')\r
53       s++;\r
54     else\r
55       if ((k2=pcharmap[(unsigned char) (*(s++))])<0)\r
56         -1;\r
57       else\r
58         dest[i++] = (k<<6) + (k2);\r
59   }\r
60 \r
61   return i;\r
62 }