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