update changelog
[debian/iodine.git] / tests / base64.c
1 /*
2  * Copyright (c) 2006-2014 Erik Ekman <yarrick@kryo.se>,
3  * 2006-2009 Bjorn Andersson <flex@kryo.se>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #include <check.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 #include <errno.h>
23
24 #include "encoding.h"
25 #include "base64.h"
26 #include "test.h"
27
28 #define TUPLES 5
29
30 static struct tuple
31 {
32         char *a;
33         char *b;
34 } testpairs[TUPLES] = {
35         { "iodinetestingtesting", "Aw8KAw4LDgvZDgLUz2rLC2rPBMC" },
36         { "abc1231", "ywjJmtiZmq" },
37         {
38           "\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xAA\x68"
39           "\x9E\x69\x64\x8E\x28\x60\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50"
40           "\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40\x3F\x3F\x3C\xEF\xAE\x78"
41           "\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xAA\x68\x9E\x69\x64\x8E\x28\x60"
42           "\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48"
43           "\x1C\x61\x44\x0C\x20\x40\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70"
44           "\xBE\xEB\x6C\xAE\xAA\x68\x9E\x69\x64\x8E\x28\x60\x7D\xE7\x5C\x6D\xA6\x58"
45           "\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40",
46
47           "+9876543210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcbapZ"
48           "776543210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba+987654"
49           "3210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
50         },
51         {
52           "\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xAA\x68"
53           "\x9E\x69\x64\x8E\x28\x60\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50"
54           "\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40\x3F\x3F\x3C\xEF\xAE\x78"
55           "\xDF\x6D\x74\xCF\x2C\x70\xBE\xEB\x6C\xAE\xA1\x61\x91\x61\x61\x81\x28\x60"
56           "\x7D\xE7\x5C\x6D\xA6\x58\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48"
57           "\x1C\x61\x44\x0C\x20\x40\xFF\xEF\x7C\xEF\xAE\x78\xDF\x6D\x74\xCF\x2C\x70"
58           "\xBE\xEB\x6C\xAE\xA1\x61\x91\x61\x61\x81\x28\x60\x7D\xE7\x5C\x6D\xA6\x58"
59           "\x5D\x65\x54\x4D\x24\x50\x3C\xE3\x4C\x2C\xA2\x48\x1C\x61\x44\x0C\x20\x40",
60
61           "+9876543210-ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcbapZ"
62           "776543210-ZYXWVUTSRQfHKwfHGsHGFEDCBAzyxwvutsrqponmlkjihgfedcba+987654321"
63           "0-ZYXWVUTSRQfHKwfHGsHGFEDCBAzyxwvutsrqponmlkjihgfedcba"
64         },
65         { "", "" }
66 };
67
68 START_TEST(test_base64_encode)
69 {
70         size_t len;
71         char buf[4096];
72         struct encoder *b64;
73         int val;
74
75         b64 = get_base64_encoder();
76
77         len = sizeof(buf);
78         val = b64->encode(buf, &len, testpairs[_i].a, strlen(testpairs[_i].a));
79
80         fail_unless(val == strlen(testpairs[_i].b));
81         fail_unless(strcmp(buf, testpairs[_i].b) == 0,
82                         "'%s' != '%s'", buf, testpairs[_i].b);
83 }
84 END_TEST
85
86 START_TEST(test_base64_decode)
87 {
88         size_t len;
89         char buf[4096];
90         struct encoder *b64;
91         int val;
92
93         b64 = get_base64_encoder();
94
95         len = sizeof(buf);
96         val = b64->decode(buf, &len, testpairs[_i].b, strlen(testpairs[_i].b));
97
98         fail_unless(val == strlen(testpairs[_i].a));
99         fail_unless(strcmp(buf, testpairs[_i].a) == 0,
100                         "'%s' != '%s'", buf, testpairs[_i].a);
101 }
102 END_TEST
103
104 START_TEST(test_base64_blksize)
105 {
106         size_t rawlen;
107         size_t enclen;
108         char *rawbuf;
109         char *encbuf;
110         struct encoder *b64;
111         int i;
112         int val;
113
114         b64 = get_base64_encoder();
115
116         rawlen = b64->blocksize_raw();
117         enclen = b64->blocksize_encoded();
118
119         rawbuf = malloc(rawlen + 16);
120         encbuf = malloc(enclen + 16);
121
122         for (i = 0; i < rawlen; i++) {
123                 rawbuf[i] = 'A';
124         }
125         rawbuf[i] = 0;
126
127         val = b64->encode(encbuf, &enclen, rawbuf, rawlen);
128
129         fail_unless(rawlen == 3, "raw length was %d not 3", rawlen);
130         fail_unless(enclen == 3, "encoded %d bytes, not 3", enclen);
131         fail_unless(val == 4, "encoded string %s was length %d", encbuf, val);
132
133         memset(rawbuf, 0, rawlen + 16);
134
135         enclen = val;
136         val = b64->decode(rawbuf, &rawlen, encbuf, enclen);
137
138         fail_unless(rawlen == 3, "raw length was %d not 3", rawlen);
139         fail_unless(val == 3);
140         for (i = 0; i < rawlen; i++) {
141                 fail_unless(rawbuf[i] == 'A');
142         }
143 }
144 END_TEST
145
146 TCase *
147 test_base64_create_tests()
148 {
149         TCase *tc;
150
151         tc = tcase_create("Base64");
152         tcase_add_loop_test(tc, test_base64_encode, 0, TUPLES);
153         tcase_add_loop_test(tc, test_base64_decode, 0, TUPLES);
154         tcase_add_test(tc, test_base64_blksize);
155
156         return tc;
157 }