1 #define TEST_NAME "codecs"
2 #include "cmptest.h"
3
4 int
main(void)5 main(void)
6 {
7 unsigned char buf1[1000];
8 char buf3[33];
9 unsigned char buf4[4];
10 const char *b64;
11 char *b64_;
12 const char *b64_end;
13 unsigned char *bin;
14 const char *hex;
15 const char *hex_end;
16 size_t b64_len;
17 size_t bin_len;
18 unsigned int i;
19
20 printf("%s\n",
21 sodium_bin2hex(buf3, 33U, (const unsigned char *) "0123456789ABCDEF",
22 16U));
23 printf("bin2hex(..., guard_page, 0):%s\n",
24 sodium_bin2hex(buf3, sizeof buf3, guard_page, 0U));
25 printf("bin2hex(..., \"\", 0):%s\n",
26 sodium_bin2hex(buf3, sizeof buf3, (const unsigned char *) "", 0U));
27
28 hex = "Cafe : 6942";
29 sodium_hex2bin(buf4, sizeof buf4, hex, strlen(hex), ": ", &bin_len,
30 &hex_end);
31 printf("%lu:%02x%02x%02x%02x\n", (unsigned long) bin_len,
32 buf4[0], buf4[1], buf4[2], buf4[3]);
33 printf("dt1: %ld\n", (long) (hex_end - hex));
34
35 hex = "Cafe : 6942";
36 sodium_hex2bin(buf4, sizeof buf4, hex, strlen(hex), ": ", &bin_len, NULL);
37 printf("%lu:%02x%02x%02x%02x\n", (unsigned long) bin_len,
38 buf4[0], buf4[1], buf4[2], buf4[3]);
39
40 hex = "deadbeef";
41 if (sodium_hex2bin(buf1, 1U, hex, 8U, NULL, &bin_len, &hex_end) != -1) {
42 printf("sodium_hex2bin() overflow not detected\n");
43 }
44 printf("dt2: %ld\n", (long) (hex_end - hex));
45
46 hex = "de:ad:be:eff";
47 if (sodium_hex2bin(buf1, 4U, hex, 12U, ":", &bin_len, &hex_end) != -1) {
48 printf(
49 "sodium_hex2bin() with an odd input length and a short output "
50 "buffer\n");
51 }
52 printf("dt3: %ld\n", (long) (hex_end - hex));
53
54 hex = "de:ad:be:eff";
55 if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
56 &bin_len, &hex_end) != -1) {
57 printf("sodium_hex2bin() with an odd input length\n");
58 }
59 printf("dt4: %ld\n", (long) (hex_end - hex));
60
61 hex = "de:ad:be:eff";
62 if (sodium_hex2bin(buf1, sizeof buf1, hex, 13U, ":",
63 &bin_len, &hex_end) != -1) {
64 printf("sodium_hex2bin() with an odd input length (2)\n");
65 }
66 printf("dt5: %ld\n", (long) (hex_end - hex));
67
68 hex = "de:ad:be:eff";
69 if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
70 &bin_len, NULL) != -1) {
71 printf("sodium_hex2bin() with an odd input length and no end pointer\n");
72 }
73
74 hex = "de:ad:be:ef*";
75 if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
76 &bin_len, &hex_end) != 0) {
77 printf("sodium_hex2bin() with an extra character and an end pointer\n");
78 }
79 printf("dt6: %ld\n", (long) (hex_end - hex));
80
81 hex = "de:ad:be:ef*";
82 if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, ":",
83 &bin_len, NULL) != -1) {
84 printf("sodium_hex2bin() with an extra character and no end pointer\n");
85 }
86
87 assert(sodium_hex2bin(buf4, sizeof buf4, (const char *) guard_page, 0U,
88 NULL, &bin_len, NULL) == 0);
89 assert(bin_len == 0);
90
91 assert(sodium_hex2bin(buf4, sizeof buf4, "", 0U, NULL, &bin_len, NULL) == 0);
92 assert(bin_len == 0);
93
94 printf("%s\n",
95 sodium_bin2base64(buf3, 31U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFab",
96 21U, sodium_base64_VARIANT_ORIGINAL));
97 printf("%s\n",
98 sodium_bin2base64(buf3, 33U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFabc",
99 22U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
100 printf("%s\n",
101 sodium_bin2base64(buf3, 31U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFab",
102 21U, sodium_base64_VARIANT_URLSAFE));
103 printf("%s\n",
104 sodium_bin2base64(buf3, 33U, (const unsigned char *) "\xfb\xf0\xf1" "0123456789ABCDEFabc",
105 22U, sodium_base64_VARIANT_URLSAFE_NO_PADDING));
106 printf("%s\n",
107 sodium_bin2base64(buf3, 1U, guard_page,
108 0U, sodium_base64_VARIANT_ORIGINAL));
109 printf("%s\n",
110 sodium_bin2base64(buf3, 5U, (const unsigned char *) "a",
111 1U, sodium_base64_VARIANT_ORIGINAL));
112 printf("%s\n",
113 sodium_bin2base64(buf3, 5U, (const unsigned char *) "ab",
114 2U, sodium_base64_VARIANT_ORIGINAL));
115 printf("%s\n",
116 sodium_bin2base64(buf3, 5U, (const unsigned char *) "abc",
117 3U, sodium_base64_VARIANT_ORIGINAL));
118 printf("%s\n",
119 sodium_bin2base64(buf3, 1U, guard_page,
120 0U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
121 printf("%s\n",
122 sodium_bin2base64(buf3, 3U, (const unsigned char *) "a",
123 1U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
124 printf("%s\n",
125 sodium_bin2base64(buf3, 4U, (const unsigned char *) "ab",
126 2U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
127 printf("%s\n",
128 sodium_bin2base64(buf3, 5U, (const unsigned char *) "abc",
129 3U, sodium_base64_VARIANT_ORIGINAL_NO_PADDING));
130
131 b64 = "VGhpcyBpcyBhIGpvdXJu" "\n" "ZXkgaW50by" " " "Bzb3VuZA==";
132 memset(buf4, '*', sizeof buf4);
133 assert(sodium_base642bin(buf4, sizeof buf4, b64, strlen(b64), "\n\r ", &bin_len,
134 &b64_end, sodium_base64_VARIANT_ORIGINAL) == -1);
135 buf4[bin_len] = 0;
136 printf("[%s]\n", (const char *) buf4);
137 printf("[%s]\n", b64_end);
138
139 memset(buf1, '*', sizeof buf1);
140 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), "\n\r ", &bin_len,
141 &b64_end, sodium_base64_VARIANT_ORIGINAL) == 0);
142 buf1[bin_len] = 0;
143 printf("[%s]\n", (const char *) buf1);
144 assert(*b64_end == 0);
145
146 memset(buf1, '*', sizeof buf1);
147 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, &bin_len,
148 &b64_end, sodium_base64_VARIANT_ORIGINAL) == 0);
149 buf1[bin_len] = 0;
150 printf("[%s]\n", (const char *) buf1);
151 printf("[%s]\n", b64_end);
152
153 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
154 &b64_end, sodium_base64_VARIANT_ORIGINAL) == 0);
155 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
156 &b64_end, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
157 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
158 &b64_end, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
159 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
160 &b64_end, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == 0);
161 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
162 &b64_end, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == 0);
163
164 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
165 NULL, sodium_base64_VARIANT_ORIGINAL) == -1);
166 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
167 NULL, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
168 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
169 NULL, sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
170 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), NULL, NULL,
171 NULL, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == -1);
172 assert(sodium_base642bin(buf1, sizeof buf1, b64, strlen(b64), " \r\n", NULL,
173 NULL, sodium_base64_VARIANT_URLSAFE_NO_PADDING) == -1);
174
175 assert(sodium_base642bin(guard_page, (size_t) 10U, "a=", (size_t) 2U, NULL, NULL, NULL,
176 sodium_base64_VARIANT_URLSAFE) == -1);
177 assert(sodium_base642bin(guard_page, (size_t) 10U, "a*", (size_t) 2U, NULL, NULL, NULL,
178 sodium_base64_VARIANT_URLSAFE) == -1);
179 assert(sodium_base642bin(guard_page, (size_t) 10U, "a*", (size_t) 2U, "~", NULL, NULL,
180 sodium_base64_VARIANT_URLSAFE) == -1);
181 assert(sodium_base642bin(guard_page, (size_t) 10U, "a*", (size_t) 2U, "*", NULL, NULL,
182 sodium_base64_VARIANT_URLSAFE) == -1);
183 assert(sodium_base642bin(guard_page, (size_t) 10U, "a==", (size_t) 3U, NULL, NULL, NULL,
184 sodium_base64_VARIANT_URLSAFE) == -1);
185 assert(sodium_base642bin(guard_page, (size_t) 10U, "a=*", (size_t) 3U, NULL, NULL, NULL,
186 sodium_base64_VARIANT_URLSAFE) == -1);
187 assert(sodium_base642bin(guard_page, (size_t) 10U, "a=*", (size_t) 3U, "~", NULL, NULL,
188 sodium_base64_VARIANT_URLSAFE) == -1);
189 assert(sodium_base642bin(guard_page, (size_t) 10U, "a=*", (size_t) 3U, "*", NULL, NULL,
190 sodium_base64_VARIANT_URLSAFE) == -1);
191
192 assert(sodium_base642bin(buf1, sizeof buf1, "O1R", (size_t) 3U, NULL, NULL, NULL,
193 sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
194 assert(sodium_base642bin(buf1, sizeof buf1, "O1Q", (size_t) 3U, NULL, NULL, NULL,
195 sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
196 assert(sodium_base642bin(buf1, sizeof buf1, "O1", (size_t) 2U, NULL, NULL, NULL,
197 sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
198 assert(sodium_base642bin(buf1, sizeof buf1, "Ow", (size_t) 2U, NULL, NULL, NULL,
199 sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == 0);
200 assert(sodium_base642bin(buf1, sizeof buf1, "O", (size_t) 1U, NULL, NULL, NULL,
201 sodium_base64_VARIANT_ORIGINAL_NO_PADDING) == -1);
202
203 assert(sodium_base642bin(buf1, sizeof buf1, "kaw", (size_t) 3U, NULL, NULL, NULL,
204 sodium_base64_VARIANT_ORIGINAL) == -1);
205 assert(sodium_base642bin(buf1, sizeof buf1, "kQ*", (size_t) 3U, "@", NULL, NULL,
206 sodium_base64_VARIANT_ORIGINAL) == -1);
207 assert(sodium_base642bin(buf1, sizeof buf1, "kQ*", (size_t) 3U, "*", NULL, NULL,
208 sodium_base64_VARIANT_ORIGINAL) == -1);
209 assert(sodium_base642bin(buf1, sizeof buf1, "kaw=**", (size_t) 6U, "*", NULL, NULL,
210 sodium_base64_VARIANT_ORIGINAL) == 0);
211 assert(sodium_base642bin(buf1, sizeof buf1, "kaw*=*", (size_t) 6U, "~*", NULL, NULL,
212 sodium_base64_VARIANT_ORIGINAL) == 0);
213 assert(sodium_base642bin(buf1, sizeof buf1, "ka*w*=*", (size_t) 7U, "*~", NULL, NULL,
214 sodium_base64_VARIANT_ORIGINAL) == 0);
215
216 assert(sodium_base642bin(buf1, sizeof buf1, (const char *) guard_page, 0U,
217 NULL, &bin_len, NULL, sodium_base64_VARIANT_ORIGINAL) == 0);
218 assert(bin_len == 0);
219
220 assert(sodium_base642bin(buf1, sizeof buf1, "", 0U, NULL, &bin_len, NULL,
221 sodium_base64_VARIANT_ORIGINAL) == 0);
222 assert(bin_len == 0);
223
224 for (i = 0; i < 1000; i++) {
225 assert(sizeof buf1 >= 100);
226 bin_len = (size_t) randombytes_uniform(100);
227 bin = (unsigned char *) sodium_malloc(bin_len);
228 b64_len = (bin_len + 2U) / 3U * 4U + 1U;
229 assert(b64_len == sodium_base64_encoded_len(bin_len, sodium_base64_VARIANT_URLSAFE));
230 b64_ = (char *) sodium_malloc(b64_len);
231 randombytes_buf(bin, bin_len);
232 memcpy(buf1, bin, bin_len);
233 b64 = sodium_bin2base64(b64_, b64_len, bin, bin_len,
234 sodium_base64_VARIANT_URLSAFE);
235 assert(b64 != NULL);
236 assert(sodium_base642bin(bin, bin_len + 10, b64, b64_len,
237 NULL, NULL, &b64_end,
238 sodium_base64_VARIANT_URLSAFE) == 0);
239 assert(b64_end == &b64[b64_len - 1]);
240 assert(memcmp(bin, buf1, bin_len) == 0);
241 sodium_free(bin);
242 sodium_free(b64_);
243 }
244 return 0;
245 }
246