1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1999-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                                                                      *
19 ***********************************************************************/
20 #pragma prototyped
21 /*
22  * base64encode()/base64decode() tester
23  */
24 
25 #include <ast.h>
26 
main()27 main()
28 {
29 	register int	i;
30 	int		testno;
31 	int		errors;
32 	ssize_t		l;
33 	ssize_t		r;
34 	ssize_t		t;
35 	unsigned char	dat[256];
36 	unsigned char	tst[sizeof(dat)];
37 	char		buf[1024];
38 	unsigned char	pat[16];
39 
40 	static char	en[] = "YWJjZGVmZ2hpams=";
41 	static char	de[] = "abcdefghijk";
42 
43 	testno = errors = 0;
44 	sfprintf(sfstdout, "TEST	base64\n");
45 	for (i = 0; i < sizeof(dat); i++)
46 		dat[i] = i;
47 	for (i = 0; i < sizeof(dat) - 1; i++)
48 	{
49 		testno++;
50 		if (i > 0)
51 		{
52 			l = base64encode(dat, i, NiL, buf, sizeof(buf), NiL);
53 			if (l < 0 || l > sizeof(buf))
54 			{
55 				errors++;
56 				sfprintf(sfstdout, "test %02d left buffer encode size %ld failed\n", testno, l);
57 				continue;
58 			}
59 			t = base64decode(buf, l, NiL, tst, sizeof(tst), NiL);
60 			if (t != i)
61 			{
62 				errors++;
63 				sfprintf(sfstdout, "test %02d left buffer decode size %ld failed\n", testno, t);
64 				continue;
65 			}
66 			if (memcmp(dat, tst, i))
67 			{
68 				errors++;
69 				sfprintf(sfstdout, "test %02d left buffer decode failed\n", testno);
70 				continue;
71 			}
72 		}
73 		else
74 			l = 0;
75 		r = base64encode(dat + i, sizeof(dat) - i, NiL, buf + l, sizeof(buf) - l, NiL);
76 		if (r < 0 || r > sizeof(buf) - l)
77 		{
78 			errors++;
79 			sfprintf(sfstdout, "test %02d right buffer encode size %ld failed\n", testno, r);
80 			continue;
81 		}
82 		t = base64decode(buf + l, r, NiL, tst, sizeof(tst), NiL);
83 		if (t != (sizeof(dat) - i))
84 		{
85 			errors++;
86 			sfprintf(sfstdout, "test %02d total buffer decode size %ld failed\n", testno, t);
87 			continue;
88 		}
89 		if (memcmp(dat + i, tst, sizeof(dat) - i))
90 		{
91 			errors++;
92 			sfprintf(sfstdout, "test %02d right buffer decode failed\n", testno);
93 			continue;
94 		}
95 		t = base64decode(buf, l + r, NiL, tst, sizeof(tst), NiL);
96 		if (t != sizeof(dat))
97 		{
98 			errors++;
99 			sfprintf(sfstdout, "test %02d total buffer decode size %ld failed\n", testno, t);
100 			continue;
101 		}
102 		if (memcmp(dat, tst, sizeof(dat)))
103 		{
104 			errors++;
105 			sfprintf(sfstdout, "test %02d total buffer decode failed\n", testno);
106 			continue;
107 		}
108 	}
109 	for (r = 0; r <= sizeof(pat); r++)
110 	{
111 		testno++;
112 		memset(tst, '*', sizeof(pat));
113 		tst[sizeof(pat)-1] = 0;
114 		t = base64decode(en, sizeof(en)-1, NiL, tst, r, NiL);
115 		if (t != (sizeof(de)-1))
116 		{
117 			sfprintf(sfstdout, "decode size %r failed, %r expected\n", t, sizeof(de)-1);
118 			errors++;
119 		}
120 		else
121 		{
122 			memset(pat, '*', sizeof(pat));
123 			pat[sizeof(pat)-1] = 0;
124 			memcpy(pat, de, r >= sizeof(de) ? sizeof(de) : r);
125 			if (memcmp(tst, pat, sizeof(pat)))
126 			{
127 				sfprintf(sfstdout, "decode failed, \"%s\" != \"%s\"\n", tst, pat);
128 				errors++;
129 			}
130 		}
131 	}
132 	sfprintf(sfstdout, "TEST	base64, %d test%s", testno, testno == 1 ? "" : "s");
133 	sfprintf(sfstdout, ", %d error%s\n", errors, errors == 1 ? "" : "s");
134 	return 0;
135 }
136