1 /* Self tests for base64.
2 Copyright (C) 2004, 2008, 2009 Free Software Foundation, Inc.
3 Written by Simon Josefsson.
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
29 #define ASSERT(expr) \
34 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
44 const char *in = "abcdefghijklmnop";
45 const char *b64in = "YWJjZGVmZw==";
51 memset (out, 0x42, sizeof (out));
52 base64_encode (in, 0, out, 0);
53 ASSERT(out[0] == '\x42');
55 memset (out, 0x42, sizeof (out));
56 base64_encode (in, 1, out, 1);
57 ASSERT (memcmp (out, "YQ==", 1) == 0);
59 memset (out, 0x42, sizeof (out));
60 base64_encode (in, 1, out, 2);
61 ASSERT (memcmp (out, "YQ==", 2) == 0);
63 memset (out, 0x42, sizeof (out));
64 base64_encode (in, 1, out, 3);
65 ASSERT (memcmp (out, "YQ==", 3) == 0);
67 memset (out, 0x42, sizeof (out));
68 base64_encode (in, 1, out, 4);
69 ASSERT (memcmp (out, "YQ==", 4) == 0);
71 memset (out, 0x42, sizeof (out));
72 base64_encode (in, 1, out, 8);
73 ASSERT (memcmp (out, "YQ==", 4) == 0);
75 memset (out, 0x42, sizeof (out));
76 base64_encode (in, 2, out, 4);
77 ASSERT (memcmp (out, "YWI=", 4) == 0);
79 memset (out, 0x42, sizeof (out));
80 base64_encode (in, 3, out, 4);
81 ASSERT (memcmp (out, "YWJj", 4) == 0);
83 memset (out, 0x42, sizeof (out));
84 base64_encode (in, 4, out, 5);
85 ASSERT (memcmp (out, "YWJjZA==", 5) == 0);
87 memset (out, 0x42, sizeof (out));
88 base64_encode (in, 4, out, 100);
89 ASSERT (memcmp (out, "YWJjZA==", 6) == 0);
93 memset (out, 0x42, sizeof (out));
95 ok = base64_decode (b64in, 4, out, &len);
99 memset (out, 0x42, sizeof (out));
101 ok = base64_decode (b64in, 4, out, &len);
104 ASSERT (memcmp (out, "abcdefg", 1) == 0);
106 memset (out, 0x42, sizeof (out));
108 ok = base64_decode (b64in, 4, out, &len);
111 ASSERT (memcmp (out, "abcdefg", 2) == 0);
113 memset (out, 0x42, sizeof (out));
115 ok = base64_decode (b64in, 4, out, &len);
118 ASSERT (memcmp (out, "abcdefg", 3) == 0);
120 memset (out, 0x42, sizeof (out));
122 ok = base64_decode (b64in, 4, out, &len);
125 ASSERT (memcmp (out, "abcdefg", 3) == 0);
127 memset (out, 0x42, sizeof (out));
129 ok = base64_decode (b64in, strlen (b64in), out, &len);
132 ASSERT (memcmp (out, "abcdefg", 7) == 0);
134 /* Allocating encode */
136 len = base64_encode_alloc (in, strlen (in), &p);
138 ASSERT (strcmp (p, "YWJjZGVmZ2hpamtsbW5vcA==") == 0);
141 len = base64_encode_alloc (in, SIZE_MAX - 5, &p);
144 /* Decode context function */
146 struct base64_decode_context ctx;
148 base64_decode_ctx_init (&ctx);
151 ok = base64_decode_ctx (&ctx, b64in, strlen (b64in), out, &len);
154 ASSERT (memcmp (out, "abcdefg", len) == 0);
157 /* Allocating decode context function */
159 ok = base64_decode_alloc_ctx (NULL, b64in, strlen (b64in), &p, &len);
162 ASSERT (memcmp (out, "abcdefg", len) == 0);
165 struct base64_decode_context ctx;
166 const char *newlineb64 = "YWJjZG\nVmZ2hp\namtsbW5vcA==";
168 base64_decode_ctx_init (&ctx);
170 ok = base64_decode_alloc_ctx (&ctx, newlineb64, strlen (newlineb64), &p, &len);
172 ASSERT (len == strlen (in));
173 ASSERT (memcmp (p, in, len) == 0);
177 struct base64_decode_context ctx;
178 base64_decode_ctx_init (&ctx);
180 ok = base64_decode_alloc_ctx (&ctx, "YW\nJjZGVmZ2hp", 13, &p, &len);
183 ASSERT (memcmp (p, "abcdefghi", len) == 0);
185 base64_decode_ctx_init (&ctx);
187 ok = base64_decode_alloc_ctx (&ctx, "YW\n", 3, &p, &len);
191 ok = base64_decode_alloc_ctx (&ctx, "JjZGVmZ2", 8, &p, &len);
194 ASSERT (memcmp (p, "abcdef", len) == 0);
196 ok = base64_decode_alloc_ctx (&ctx, "hp", 2, &p, &len);
199 /* Actually this looks buggy. Shouldn't output be 'ghi'? */
200 ASSERT (memcmp (p, "gh", len) == 0);
201 ok = base64_decode_alloc_ctx (&ctx, "", 0, &p, &len);
206 struct base64_decode_context ctx;
207 const char *newlineb64 = "\n\n\n\n\n";
209 base64_decode_ctx_init (&ctx);
211 ok = base64_decode_alloc_ctx (&ctx, newlineb64, strlen (newlineb64), &p, &len);
216 ok = base64_decode_alloc_ctx (NULL, " ! ", 3, &p, &len);
219 ok = base64_decode_alloc_ctx (NULL, "abc\ndef", 7, &p, &len);
222 ok = base64_decode_alloc_ctx (NULL, "aa", 2, &p, &len);
225 ok = base64_decode_alloc_ctx (NULL, "aa=", 3, &p, &len);
228 ok = base64_decode_alloc_ctx (NULL, "aax", 3, &p, &len);
231 ok = base64_decode_alloc_ctx (NULL, "aa=X", 4, &p, &len);
234 ok = base64_decode_alloc_ctx (NULL, "aa=X", 4, &p, &len);
237 ok = base64_decode_alloc_ctx (NULL, "aax=X", 5, &p, &len);