1 /*
2  * This file is part of the Sofia-SIP package
3  *
4  * Copyright (C) 2005 Nokia Corporation.
5  *
6  * Contact: Pekka Pessi <pekka.pessi@nokia.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation; either version 2.1 of
11  * the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  *
23  */
24 
25 /**
26  * @file torture_base64.c
27  * @brief Test BASE64 encoding/decoding
28  *
29  * @author Pekka Pessi <Pekka.Pessi@nokia.com> \n
30  *
31  * @date Created: Tue Feb  1 13:29:09 EET 2005 ppessi
32  *
33  */
34 
35 #include "config.h"
36 
37 #include <stddef.h>
38 #include <string.h>
39 #include <assert.h>
40 #include <errno.h>
41 #include <stdio.h>
42 #include <stdlib.h>
43 
44 #include "sofia-sip/base64.h"
45 
46 int tstflags = 0;
47 #define TSTFLAGS tstflags
48 
49 char const *name = "torture_base64";
50 
51 #include <sofia-sip/tstdef.h>
52 
53 char const constant[] = "not changed";
54 
test_encoding(void)55 int test_encoding(void)
56 {
57   char buffer[32];
58 
59   BEGIN();
60 
61   TEST_SIZE(base64_e(buffer, sizeof buffer, "\0\020\203", 3), 4);
62   TEST_S(buffer, "ABCD");
63 
64   strcpy(buffer + 5, "not changed");
65   TEST_SIZE(base64_e(buffer, 5, "\0\020\203", 3), 4);
66   TEST_S(buffer + 5, "not changed");
67   TEST_S(buffer, "ABCD");
68 
69   strcpy(buffer + 4, "not changed");
70   TEST_SIZE(base64_e(buffer, 4, "\0\020\203", 3), 4);
71   TEST_S(buffer + 4, "not changed");
72   TEST_S(buffer, "ABC");
73 
74   strcpy(buffer + 3, "not changed");
75   TEST_SIZE(base64_e(buffer, 3, "\0\020\203", 3), 4);
76   TEST_S(buffer + 3, "not changed");
77   TEST_S(buffer, "AB");
78 
79   strcpy(buffer + 2, "not changed");
80   TEST_SIZE(base64_e(buffer, 2, "\0\020\203", 3), 4);
81   TEST_S(buffer + 2, "not changed");
82   TEST_S(buffer, "A");
83 
84   strcpy(buffer + 1, "not changed");
85   TEST_SIZE(base64_e(buffer, 1, "\0\020\203", 3), 4);
86   TEST_S(buffer + 1, "not changed");
87   TEST_S(buffer, "");
88 
89   strcpy(buffer + 5, "not changed");
90   TEST_SIZE(base64_e(buffer, 5, "\0\020", 2), 4);
91   TEST_S(buffer + 5, "not changed");
92   TEST_S(buffer, "ABA=");
93 
94   strcpy(buffer + 4, "not changed");
95   TEST_SIZE(base64_e(buffer, 4, "\0\020", 2), 4);
96   TEST_S(buffer + 4, "not changed");
97   TEST_S(buffer, "ABA");
98 
99   strcpy(buffer + 3, "not changed");
100   TEST_SIZE(base64_e(buffer, 3, "\0\020", 2), 4);
101   TEST_S(buffer + 3, "not changed");
102   TEST_S(buffer, "AB");
103 
104   strcpy(buffer + 2, "not changed");
105   TEST_SIZE(base64_e(buffer, 2, "\0\020", 2), 4);
106   TEST_S(buffer + 2, "not changed");
107   TEST_S(buffer, "A");
108 
109   strcpy(buffer + 1, "not changed");
110   TEST_SIZE(base64_e(buffer, 1, "\0\020", 2), 4);
111   TEST_S(buffer + 1, "not changed");
112   TEST_S(buffer, "");
113 
114   strcpy(buffer + 5, "not changed");
115   TEST_SIZE(base64_e(buffer, 5, "\0", 1), 4);
116   TEST_S(buffer + 5, "not changed");
117   TEST_S(buffer, "AA==");
118 
119   strcpy(buffer + 4, "not changed");
120   TEST_SIZE(base64_e(buffer, 4, "\0", 1), 4);
121   TEST_S(buffer + 4, "not changed");
122   TEST_S(buffer, "AA=");
123 
124   strcpy(buffer + 3, "not changed");
125   TEST_SIZE(base64_e(buffer, 3, "\0", 1), 4);
126   TEST_S(buffer + 3, "not changed");
127   TEST_S(buffer, "AA");
128 
129   strcpy(buffer + 2, "not changed");
130   TEST_SIZE(base64_e(buffer, 2, "\0", 1), 4);
131   TEST_S(buffer + 2, "not changed");
132   TEST_S(buffer, "A");
133 
134   strcpy(buffer + 1, "not changed");
135   TEST_SIZE(base64_e(buffer, 1, "\0", 1), 4);
136   TEST_S(buffer + 1, "not changed");
137   TEST_S(buffer, "");
138 
139   END();
140 }
141 
test_decoding(void)142 int test_decoding(void)
143 {
144   char buffer[32];
145 
146   BEGIN();
147 
148   strcpy(buffer + 0, "not changed");
149   TEST_SIZE(base64_d((void *)buffer, 0, "ABCD"), 3);
150   TEST_S(buffer + 0, "not changed");
151 
152   TEST_SIZE(base64_d((void *)buffer, 3, "ABCD"), 3);
153   TEST_M(buffer, "\0\020\203", 3);
154 
155   TEST_SIZE(base64_d(NULL, 3, "ABCD"), 3);
156 
157   TEST_SIZE(base64_d((void *)buffer, 3, "A B C D !!"), 3);
158   TEST_M(buffer, "\0\020\203", 3);
159 
160   END();
161 }
162 
163 
usage(int exitcode)164 void usage(int exitcode)
165 {
166   fprintf(stderr,
167 	  "usage: %s [-v] [-a]\n",
168 	  name);
169   exit(exitcode);
170 }
171 
main(int argc,char * argv[])172 int main(int argc, char *argv[])
173 {
174   int retval = 0;
175   int i;
176 
177   for (i = 1; argv[i]; i++) {
178     if (strcmp(argv[i], "-v") == 0)
179       tstflags |= tst_verbatim;
180     else if (strcmp(argv[i], "-a") == 0)
181       tstflags |= tst_abort;
182     else
183       usage(1);
184   }
185 
186   retval |= test_encoding(); fflush(stdout);
187   retval |= test_decoding(); fflush(stdout);
188 
189   return retval;
190 }
191