Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / authsaslfrombase64.c
1 /*
2 ** Copyright 1998 - 2008 Double Precision, Inc.
3 ** See COPYING for distribution information.
4 */
5
6 #include <stdlib.h>
7
8 static const char decode64tab[256]= {
9 100, 100, 100, 100, 100, 100, 100, 100,
10 100, 100, 100, 100, 100, 100, 100, 100,
11 100, 100, 100, 100, 100, 100, 100, 100,
12 100, 100, 100, 100, 100, 100, 100, 100,
13 100, 100, 100, 100, 100, 100, 100, 100,
14 100, 100, 100, 62, 100, 100, 100, 63,
15 52, 53, 54, 55, 56, 57, 58, 59,
16 60, 61, 100, 100, 100, 100, 100, 100,
17 100, 0, 1, 2, 3, 4, 5, 6,
18 7, 8, 9, 10, 11, 12, 13, 14,
19 15, 16, 17, 18, 19, 20, 21, 22,
20 23, 24, 25, 100, 100, 100, 100, 100,
21 100, 26, 27, 28, 29, 30, 31, 32,
22 33, 34, 35, 36, 37, 38, 39, 40,
23 41, 42, 43, 44, 45, 46, 47, 48,
24 49, 50, 51, 100, 100, 100, 100, 100,
25 100, 100, 100, 100, 100, 100, 100, 100,
26 100, 100, 100, 100, 100, 100, 100, 100,
27 100, 100, 100, 100, 100, 100, 100, 100,
28 100, 100, 100, 100, 100, 100, 100, 100,
29 100, 100, 100, 100, 100, 100, 100, 100,
30 100, 100, 100, 100, 100, 100, 100, 100,
31 100, 100, 100, 100, 100, 100, 100, 100,
32 100, 100, 100, 100, 100, 100, 100, 100,
33 100, 100, 100, 100, 100, 100, 100, 100,
34 100, 100, 100, 100, 100, 100, 100, 100,
35 100, 100, 100, 100, 100, 100, 100, 100,
36 100, 100, 100, 100, 100, 100, 100, 100,
37 100, 100, 100, 100, 100, 100, 100, 100,
38 100, 100, 100, 100, 100, 100, 100, 100,
39 100, 100, 100, 100, 100, 100, 100, 100,
40 100, 100, 100, 100, 100, 100, 100, 100};
41
42 int authsasl_frombase64(char *base64buf)
43 {
44 int i, j, k;
45
46 for (j=0; base64buf[j]; j++)
47 if (decode64tab[(unsigned char)base64buf[j]] >= 100)
48 break;
49
50 if (base64buf[j] && base64buf[j+1] && base64buf[j+2])
51 return (-1);
52 while (base64buf[j] == '=') ++j;
53 if (j % 4) return (-1);
54
55 i=j;
56 k=0;
57 for (j=0; j<i; j += 4)
58 {
59 int w=decode64tab[(int)(unsigned char)base64buf[j]];
60 int x=decode64tab[(int)(unsigned char)base64buf[j+1]];
61 int y=decode64tab[(int)(unsigned char)base64buf[j+2]];
62 int z=decode64tab[(int)(unsigned char)base64buf[j+3]];
63 int a,b,c;
64
65 a= (w << 2) | (x >> 4);
66 b= (x << 4) | (y >> 2);
67 c= (y << 6) | z;
68 base64buf[k++]=a;
69 if ( base64buf[j+2] != '=')
70 base64buf[k++]=b;
71 if ( base64buf[j+3] != '=')
72 base64buf[k++]=c;
73 }
74 return (k);
75 }