]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/wpa/src/utils/utils_module_tests.c
Update hostapd/wpa_supplicant to 2.8 to fix multiple vulnerabilities.
[FreeBSD/FreeBSD.git] / contrib / wpa / src / utils / utils_module_tests.c
1 /*
2  * utils module tests
3  * Copyright (c) 2014-2015, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8
9 #include "utils/includes.h"
10
11 #include "utils/common.h"
12 #include "utils/const_time.h"
13 #include "common/ieee802_11_defs.h"
14 #include "utils/bitfield.h"
15 #include "utils/ext_password.h"
16 #include "utils/trace.h"
17 #include "utils/base64.h"
18 #include "utils/ip_addr.h"
19 #include "utils/eloop.h"
20 #include "utils/json.h"
21 #include "utils/module_tests.h"
22
23
24 struct printf_test_data {
25         u8 *data;
26         size_t len;
27         char *encoded;
28 };
29
30 static const struct printf_test_data printf_tests[] = {
31         { (u8 *) "abcde", 5, "abcde" },
32         { (u8 *) "a\0b\nc\ed\re\tf\"\\", 13, "a\\0b\\nc\\ed\\re\\tf\\\"\\\\" },
33         { (u8 *) "\x00\x31\x00\x32\x00\x39", 6, "\\x001\\0002\\09" },
34         { (u8 *) "\n\n\n", 3, "\n\12\x0a" },
35         { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12,
36           "\\xc3\\xa5\xc3\\xa4\\xc3\\xb6\\xc3\\x85\\xc3\\x84\\xc3\\x96" },
37         { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12,
38           "\\303\\245\\303\\244\\303\\266\\303\\205\\303\\204\\303\\226" },
39         { (u8 *) "\xe5\xe4\xf6\xc5\xc4\xd6", 6,
40           "\\xe5\\xe4\\xf6\\xc5\\xc4\\xd6" },
41         { NULL, 0, NULL }
42 };
43
44
45 static int printf_encode_decode_tests(void)
46 {
47         int i;
48         size_t binlen;
49         char buf[100];
50         u8 bin[100];
51         int errors = 0;
52         int array[10];
53
54         wpa_printf(MSG_INFO, "printf encode/decode tests");
55
56         for (i = 0; printf_tests[i].data; i++) {
57                 const struct printf_test_data *test = &printf_tests[i];
58                 printf_encode(buf, sizeof(buf), test->data, test->len);
59                 wpa_printf(MSG_INFO, "%d: -> \"%s\"", i, buf);
60
61                 binlen = printf_decode(bin, sizeof(bin), buf);
62                 if (binlen != test->len ||
63                     os_memcmp(bin, test->data, binlen) != 0) {
64                         wpa_hexdump(MSG_ERROR, "Error in decoding#1",
65                                     bin, binlen);
66                         errors++;
67                 }
68
69                 binlen = printf_decode(bin, sizeof(bin), test->encoded);
70                 if (binlen != test->len ||
71                     os_memcmp(bin, test->data, binlen) != 0) {
72                         wpa_hexdump(MSG_ERROR, "Error in decoding#2",
73                                     bin, binlen);
74                         errors++;
75                 }
76         }
77
78         buf[5] = 'A';
79         printf_encode(buf, 5, (const u8 *) "abcde", 5);
80         if (buf[5] != 'A') {
81                 wpa_printf(MSG_ERROR, "Error in bounds checking#1");
82                 errors++;
83         }
84
85         for (i = 5; i < 10; i++) {
86                 buf[i] = 'A';
87                 printf_encode(buf, i, (const u8 *) "\xdd\xdd\xdd\xdd\xdd", 5);
88                 if (buf[i] != 'A') {
89                         wpa_printf(MSG_ERROR, "Error in bounds checking#2(%d)",
90                                    i);
91                         errors++;
92                 }
93         }
94
95         if (printf_decode(bin, 3, "abcde") != 2)
96                 errors++;
97
98         if (printf_decode(bin, 3, "\\xa") != 1 || bin[0] != 10)
99                 errors++;
100
101         if (printf_decode(bin, 3, "\\xq") != 1 || bin[0] != 'q')
102                 errors++;
103
104         if (printf_decode(bin, 3, "\\a") != 1 || bin[0] != 'a')
105                 errors++;
106
107         array[0] = 10;
108         array[1] = 10;
109         array[2] = 5;
110         array[3] = 10;
111         array[4] = 5;
112         array[5] = 0;
113         if (int_array_len(array) != 5)
114                 errors++;
115         int_array_sort_unique(array);
116         if (int_array_len(array) != 2)
117                 errors++;
118
119         if (errors) {
120                 wpa_printf(MSG_ERROR, "%d printf test(s) failed", errors);
121                 return -1;
122         }
123
124         return 0;
125 }
126
127
128 static int bitfield_tests(void)
129 {
130         struct bitfield *bf;
131         int i;
132         int errors = 0;
133
134         wpa_printf(MSG_INFO, "bitfield tests");
135
136         bf = bitfield_alloc(123);
137         if (bf == NULL)
138                 return -1;
139
140         for (i = 0; i < 123; i++) {
141                 if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
142                         errors++;
143                 if (i > 0 && bitfield_is_set(bf, i - 1))
144                         errors++;
145                 bitfield_set(bf, i);
146                 if (!bitfield_is_set(bf, i))
147                         errors++;
148                 bitfield_clear(bf, i);
149                 if (bitfield_is_set(bf, i))
150                         errors++;
151         }
152
153         for (i = 123; i < 200; i++) {
154                 if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
155                         errors++;
156                 if (i > 0 && bitfield_is_set(bf, i - 1))
157                         errors++;
158                 bitfield_set(bf, i);
159                 if (bitfield_is_set(bf, i))
160                         errors++;
161                 bitfield_clear(bf, i);
162                 if (bitfield_is_set(bf, i))
163                         errors++;
164         }
165
166         for (i = 0; i < 123; i++) {
167                 if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
168                         errors++;
169                 bitfield_set(bf, i);
170                 if (!bitfield_is_set(bf, i))
171                         errors++;
172         }
173
174         for (i = 0; i < 123; i++) {
175                 if (!bitfield_is_set(bf, i))
176                         errors++;
177                 bitfield_clear(bf, i);
178                 if (bitfield_is_set(bf, i))
179                         errors++;
180         }
181
182         for (i = 0; i < 123; i++) {
183                 if (bitfield_get_first_zero(bf) != i)
184                         errors++;
185                 bitfield_set(bf, i);
186         }
187         if (bitfield_get_first_zero(bf) != -1)
188                 errors++;
189         for (i = 0; i < 123; i++) {
190                 if (!bitfield_is_set(bf, i))
191                         errors++;
192                 bitfield_clear(bf, i);
193                 if (bitfield_get_first_zero(bf) != i)
194                         errors++;
195                 bitfield_set(bf, i);
196         }
197         if (bitfield_get_first_zero(bf) != -1)
198                 errors++;
199
200         bitfield_free(bf);
201
202         bf = bitfield_alloc(8);
203         if (bf == NULL)
204                 return -1;
205         if (bitfield_get_first_zero(bf) != 0)
206                 errors++;
207         for (i = 0; i < 8; i++)
208                 bitfield_set(bf, i);
209         if (bitfield_get_first_zero(bf) != -1)
210                 errors++;
211         bitfield_free(bf);
212
213         if (errors) {
214                 wpa_printf(MSG_ERROR, "%d bitfield test(s) failed", errors);
215                 return -1;
216         }
217
218         return 0;
219 }
220
221
222 static int int_array_tests(void)
223 {
224         int test1[] = { 1, 2, 3, 4, 5, 6, 0 };
225         int test2[] = { 1, -1, 0 };
226         int test3[] = { 1, 1, 1, -1, 2, 3, 4, 1, 2, 0 };
227         int test3_res[] = { -1, 1, 2, 3, 4, 0 };
228         int errors = 0;
229         int len;
230
231         wpa_printf(MSG_INFO, "int_array tests");
232
233         if (int_array_len(test1) != 6 ||
234             int_array_len(test2) != 2)
235                 errors++;
236
237         int_array_sort_unique(test3);
238         len = int_array_len(test3_res);
239         if (int_array_len(test3) != len)
240                 errors++;
241         else if (os_memcmp(test3, test3_res, len * sizeof(int)) != 0)
242                 errors++;
243
244         if (errors) {
245                 wpa_printf(MSG_ERROR, "%d int_array test(s) failed", errors);
246                 return -1;
247         }
248
249         return 0;
250 }
251
252
253 static int ext_password_tests(void)
254 {
255         struct ext_password_data *data;
256         int ret = 0;
257         struct wpabuf *pw;
258
259         wpa_printf(MSG_INFO, "ext_password tests");
260
261         data = ext_password_init("unknown", "foo");
262         if (data != NULL)
263                 return -1;
264
265         data = ext_password_init("test", NULL);
266         if (data == NULL)
267                 return -1;
268         pw = ext_password_get(data, "foo");
269         if (pw != NULL)
270                 ret = -1;
271         ext_password_free(pw);
272
273         ext_password_deinit(data);
274
275         pw = ext_password_get(NULL, "foo");
276         if (pw != NULL)
277                 ret = -1;
278         ext_password_free(pw);
279
280         return ret;
281 }
282
283
284 static int trace_tests(void)
285 {
286         wpa_printf(MSG_INFO, "trace tests");
287
288         wpa_trace_show("test backtrace");
289         wpa_trace_dump_funcname("test funcname", trace_tests);
290
291         return 0;
292 }
293
294
295 static int base64_tests(void)
296 {
297         int errors = 0;
298         unsigned char *res;
299         size_t res_len;
300
301         wpa_printf(MSG_INFO, "base64 tests");
302
303         res = base64_encode((const unsigned char *) "", ~0, &res_len);
304         if (res) {
305                 errors++;
306                 os_free(res);
307         }
308
309         res = base64_encode((const unsigned char *) "=", 1, &res_len);
310         if (!res || res_len != 5 || res[0] != 'P' || res[1] != 'Q' ||
311             res[2] != '=' || res[3] != '=' || res[4] != '\n')
312                 errors++;
313         os_free(res);
314
315         res = base64_encode((const unsigned char *) "=", 1, NULL);
316         if (!res || res[0] != 'P' || res[1] != 'Q' ||
317             res[2] != '=' || res[3] != '=' || res[4] != '\n')
318                 errors++;
319         os_free(res);
320
321         res = base64_decode((const unsigned char *) "", 0, &res_len);
322         if (res) {
323                 errors++;
324                 os_free(res);
325         }
326
327         res = base64_decode((const unsigned char *) "a", 1, &res_len);
328         if (res) {
329                 errors++;
330                 os_free(res);
331         }
332
333         res = base64_decode((const unsigned char *) "====", 4, &res_len);
334         if (res) {
335                 errors++;
336                 os_free(res);
337         }
338
339         res = base64_decode((const unsigned char *) "PQ==", 4, &res_len);
340         if (!res || res_len != 1 || res[0] != '=')
341                 errors++;
342         os_free(res);
343
344         res = base64_decode((const unsigned char *) "P.Q-=!=*", 8, &res_len);
345         if (!res || res_len != 1 || res[0] != '=')
346                 errors++;
347         os_free(res);
348
349         if (errors) {
350                 wpa_printf(MSG_ERROR, "%d base64 test(s) failed", errors);
351                 return -1;
352         }
353
354         return 0;
355 }
356
357
358 static int common_tests(void)
359 {
360         char buf[3], longbuf[100];
361         u8 addr[ETH_ALEN] = { 1, 2, 3, 4, 5, 6 };
362         u8 bin[3];
363         int errors = 0;
364         struct wpa_freq_range_list ranges;
365         size_t len;
366         const char *txt;
367         u8 ssid[255];
368
369         wpa_printf(MSG_INFO, "common tests");
370
371         if (hwaddr_mask_txt(buf, 3, addr, addr) != -1)
372                 errors++;
373
374         if (wpa_scnprintf(buf, 0, "hello") != 0 ||
375             wpa_scnprintf(buf, 3, "hello") != 2)
376                 errors++;
377
378         if (wpa_snprintf_hex(buf, 0, addr, ETH_ALEN) != 0 ||
379             wpa_snprintf_hex(buf, 3, addr, ETH_ALEN) != 2)
380                 errors++;
381
382         if (merge_byte_arrays(bin, 3, addr, ETH_ALEN, NULL, 0) != 3 ||
383             merge_byte_arrays(bin, 3, NULL, 0, addr, ETH_ALEN) != 3)
384                 errors++;
385
386         if (dup_binstr(NULL, 0) != NULL)
387                 errors++;
388
389         if (freq_range_list_includes(NULL, 0) != 0)
390                 errors++;
391
392         os_memset(&ranges, 0, sizeof(ranges));
393         if (freq_range_list_parse(&ranges, "") != 0 ||
394             freq_range_list_includes(&ranges, 0) != 0 ||
395             freq_range_list_str(&ranges) != NULL)
396                 errors++;
397
398         if (utf8_unescape(NULL, 0, buf, sizeof(buf)) != 0 ||
399             utf8_unescape("a", 1, NULL, 0) != 0 ||
400             utf8_unescape("a\\", 2, buf, sizeof(buf)) != 0 ||
401             utf8_unescape("abcde", 5, buf, sizeof(buf)) != 0 ||
402             utf8_unescape("abc", 3, buf, 3) != 3)
403                 errors++;
404
405         if (utf8_unescape("a", 0, buf, sizeof(buf)) != 1 || buf[0] != 'a')
406                 errors++;
407
408         if (utf8_unescape("\\b", 2, buf, sizeof(buf)) != 1 || buf[0] != 'b')
409                 errors++;
410
411         if (utf8_escape(NULL, 0, buf, sizeof(buf)) != 0 ||
412             utf8_escape("a", 1, NULL, 0) != 0 ||
413             utf8_escape("abcde", 5, buf, sizeof(buf)) != 0 ||
414             utf8_escape("a\\bcde", 6, buf, sizeof(buf)) != 0 ||
415             utf8_escape("ab\\cde", 6, buf, sizeof(buf)) != 0 ||
416             utf8_escape("abc\\de", 6, buf, sizeof(buf)) != 0 ||
417             utf8_escape("abc", 3, buf, 3) != 3)
418                 errors++;
419
420         if (utf8_escape("a", 0, buf, sizeof(buf)) != 1 || buf[0] != 'a')
421                 errors++;
422
423         os_memset(ssid, 0, sizeof(ssid));
424         txt = wpa_ssid_txt(ssid, sizeof(ssid));
425         len = os_strlen(txt);
426         /* Verify that SSID_MAX_LEN * 4 buffer limit is enforced. */
427         if (len != SSID_MAX_LEN * 4) {
428                 wpa_printf(MSG_ERROR,
429                            "Unexpected wpa_ssid_txt() result with too long SSID");
430                 errors++;
431         }
432
433         if (wpa_snprintf_hex_sep(longbuf, 0, addr, ETH_ALEN, '-') != 0 ||
434             wpa_snprintf_hex_sep(longbuf, 5, addr, ETH_ALEN, '-') != 3 ||
435             os_strcmp(longbuf, "01-0") != 0)
436                 errors++;
437
438         if (errors) {
439                 wpa_printf(MSG_ERROR, "%d common test(s) failed", errors);
440                 return -1;
441         }
442
443         return 0;
444 }
445
446
447 static int os_tests(void)
448 {
449         int errors = 0;
450         void *ptr;
451         os_time_t t;
452
453         wpa_printf(MSG_INFO, "os tests");
454
455         ptr = os_calloc((size_t) -1, (size_t) -1);
456         if (ptr) {
457                 errors++;
458                 os_free(ptr);
459         }
460         ptr = os_calloc((size_t) 2, (size_t) -1);
461         if (ptr) {
462                 errors++;
463                 os_free(ptr);
464         }
465         ptr = os_calloc((size_t) -1, (size_t) 2);
466         if (ptr) {
467                 errors++;
468                 os_free(ptr);
469         }
470
471         ptr = os_realloc_array(NULL, (size_t) -1, (size_t) -1);
472         if (ptr) {
473                 errors++;
474                 os_free(ptr);
475         }
476
477         os_sleep(1, 1);
478
479         if (os_mktime(1969, 1, 1, 1, 1, 1, &t) == 0 ||
480             os_mktime(1971, 0, 1, 1, 1, 1, &t) == 0 ||
481             os_mktime(1971, 13, 1, 1, 1, 1, &t) == 0 ||
482             os_mktime(1971, 1, 0, 1, 1, 1, &t) == 0 ||
483             os_mktime(1971, 1, 32, 1, 1, 1, &t) == 0 ||
484             os_mktime(1971, 1, 1, -1, 1, 1, &t) == 0 ||
485             os_mktime(1971, 1, 1, 24, 1, 1, &t) == 0 ||
486             os_mktime(1971, 1, 1, 1, -1, 1, &t) == 0 ||
487             os_mktime(1971, 1, 1, 1, 60, 1, &t) == 0 ||
488             os_mktime(1971, 1, 1, 1, 1, -1, &t) == 0 ||
489             os_mktime(1971, 1, 1, 1, 1, 61, &t) == 0 ||
490             os_mktime(1971, 1, 1, 1, 1, 1, &t) != 0 ||
491             os_mktime(2020, 1, 2, 3, 4, 5, &t) != 0 ||
492             os_mktime(2015, 12, 31, 23, 59, 59, &t) != 0)
493                 errors++;
494
495         if (os_setenv("hwsim_test_env", "test value", 0) != 0 ||
496             os_setenv("hwsim_test_env", "test value 2", 1) != 0 ||
497             os_unsetenv("hwsim_test_env") != 0)
498                 errors++;
499
500         if (os_file_exists("/this-file-does-not-exists-hwsim") != 0)
501                 errors++;
502
503         if (errors) {
504                 wpa_printf(MSG_ERROR, "%d os test(s) failed", errors);
505                 return -1;
506         }
507
508         return 0;
509 }
510
511
512 static int wpabuf_tests(void)
513 {
514         int errors = 0;
515         void *ptr;
516         struct wpabuf *buf;
517
518         wpa_printf(MSG_INFO, "wpabuf tests");
519
520         ptr = os_malloc(100);
521         if (ptr) {
522                 buf = wpabuf_alloc_ext_data(ptr, 100);
523                 if (buf) {
524                         if (wpabuf_resize(&buf, 100) < 0)
525                                 errors++;
526                         else
527                                 wpabuf_put(buf, 100);
528                         wpabuf_free(buf);
529                 } else {
530                         errors++;
531                         os_free(ptr);
532                 }
533         } else {
534                 errors++;
535         }
536
537         buf = wpabuf_alloc(100);
538         if (buf) {
539                 struct wpabuf *buf2;
540
541                 wpabuf_put(buf, 100);
542                 if (wpabuf_resize(&buf, 100) < 0)
543                         errors++;
544                 else
545                         wpabuf_put(buf, 100);
546                 buf2 = wpabuf_concat(buf, NULL);
547                 if (buf2 != buf)
548                         errors++;
549                 wpabuf_free(buf2);
550         } else {
551                 errors++;
552         }
553
554         buf = NULL;
555         buf = wpabuf_zeropad(buf, 10);
556         if (buf != NULL)
557                 errors++;
558
559         if (errors) {
560                 wpa_printf(MSG_ERROR, "%d wpabuf test(s) failed", errors);
561                 return -1;
562         }
563
564         return 0;
565 }
566
567
568 static int ip_addr_tests(void)
569 {
570         int errors = 0;
571         struct hostapd_ip_addr addr;
572         char buf[100];
573
574         wpa_printf(MSG_INFO, "ip_addr tests");
575
576         if (hostapd_parse_ip_addr("1.2.3.4", &addr) != 0 ||
577             addr.af != AF_INET ||
578             hostapd_ip_txt(NULL, buf, sizeof(buf)) != NULL ||
579             hostapd_ip_txt(&addr, buf, 1) != buf || buf[0] != '\0' ||
580             hostapd_ip_txt(&addr, buf, 0) != NULL ||
581             hostapd_ip_txt(&addr, buf, sizeof(buf)) != buf)
582                 errors++;
583
584         if (hostapd_parse_ip_addr("::", &addr) != 0 ||
585             addr.af != AF_INET6 ||
586             hostapd_ip_txt(&addr, buf, 1) != buf || buf[0] != '\0' ||
587             hostapd_ip_txt(&addr, buf, sizeof(buf)) != buf)
588                 errors++;
589
590         if (errors) {
591                 wpa_printf(MSG_ERROR, "%d ip_addr test(s) failed", errors);
592                 return -1;
593         }
594
595         return 0;
596 }
597
598
599 struct test_eloop {
600         unsigned int magic;
601         int close_in_timeout;
602         int pipefd1[2];
603         int pipefd2[2];
604 };
605
606
607 static void eloop_tests_start(int close_in_timeout);
608
609
610 static void eloop_test_read_2(int sock, void *eloop_ctx, void *sock_ctx)
611 {
612         struct test_eloop *t = eloop_ctx;
613         ssize_t res;
614         char buf[10];
615
616         wpa_printf(MSG_INFO, "%s: sock=%d", __func__, sock);
617
618         if (t->magic != 0x12345678) {
619                 wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
620                            __func__, t->magic);
621         }
622
623         if (t->pipefd2[0] != sock) {
624                 wpa_printf(MSG_INFO, "%s: unexpected sock %d != %d",
625                            __func__, sock, t->pipefd2[0]);
626         }
627
628         res = read(sock, buf, sizeof(buf));
629         wpa_printf(MSG_INFO, "%s: sock=%d --> res=%d",
630                    __func__, sock, (int) res);
631 }
632
633
634 static void eloop_test_read_2_wrong(int sock, void *eloop_ctx, void *sock_ctx)
635 {
636         struct test_eloop *t = eloop_ctx;
637
638         wpa_printf(MSG_INFO, "%s: sock=%d", __func__, sock);
639
640         if (t->magic != 0x12345678) {
641                 wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
642                            __func__, t->magic);
643         }
644
645         if (t->pipefd2[0] != sock) {
646                 wpa_printf(MSG_INFO, "%s: unexpected sock %d != %d",
647                            __func__, sock, t->pipefd2[0]);
648         }
649
650         /*
651          * This is expected to block due to the original socket with data having
652          * been closed and no new data having been written to the new socket
653          * with the same fd. To avoid blocking the process during test, skip the
654          * read here.
655          */
656         wpa_printf(MSG_ERROR, "%s: FAIL - should not have called this function",
657                    __func__);
658 }
659
660
661 static void reopen_pipefd2(struct test_eloop *t)
662 {
663         if (t->pipefd2[0] < 0) {
664                 wpa_printf(MSG_INFO, "pipefd2 had been closed");
665         } else {
666                 int res;
667
668                 wpa_printf(MSG_INFO, "close pipefd2");
669                 eloop_unregister_read_sock(t->pipefd2[0]);
670                 close(t->pipefd2[0]);
671                 t->pipefd2[0] = -1;
672                 close(t->pipefd2[1]);
673                 t->pipefd2[1] = -1;
674
675                 res = pipe(t->pipefd2);
676                 if (res < 0) {
677                         wpa_printf(MSG_INFO, "pipe: %s", strerror(errno));
678                         t->pipefd2[0] = -1;
679                         t->pipefd2[1] = -1;
680                         return;
681                 }
682
683                 wpa_printf(MSG_INFO,
684                            "re-register pipefd2 with new sockets %d,%d",
685                            t->pipefd2[0], t->pipefd2[1]);
686                 eloop_register_read_sock(t->pipefd2[0], eloop_test_read_2_wrong,
687                                          t, NULL);
688         }
689 }
690
691
692 static void eloop_test_read_1(int sock, void *eloop_ctx, void *sock_ctx)
693 {
694         struct test_eloop *t = eloop_ctx;
695         ssize_t res;
696         char buf[10];
697
698         wpa_printf(MSG_INFO, "%s: sock=%d", __func__, sock);
699
700         if (t->magic != 0x12345678) {
701                 wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
702                            __func__, t->magic);
703         }
704
705         if (t->pipefd1[0] != sock) {
706                 wpa_printf(MSG_INFO, "%s: unexpected sock %d != %d",
707                            __func__, sock, t->pipefd1[0]);
708         }
709
710         res = read(sock, buf, sizeof(buf));
711         wpa_printf(MSG_INFO, "%s: sock=%d --> res=%d",
712                    __func__, sock, (int) res);
713
714         if (!t->close_in_timeout)
715                 reopen_pipefd2(t);
716 }
717
718
719 static void eloop_test_cb(void *eloop_data, void *user_ctx)
720 {
721         struct test_eloop *t = eloop_data;
722
723         wpa_printf(MSG_INFO, "%s", __func__);
724
725         if (t->magic != 0x12345678) {
726                 wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
727                            __func__, t->magic);
728         }
729
730         if (t->close_in_timeout)
731                 reopen_pipefd2(t);
732 }
733
734
735 static void eloop_test_timeout(void *eloop_data, void *user_ctx)
736 {
737         struct test_eloop *t = eloop_data;
738         int next_run = 0;
739
740         wpa_printf(MSG_INFO, "%s", __func__);
741
742         if (t->magic != 0x12345678) {
743                 wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
744                            __func__, t->magic);
745         }
746
747         if (t->pipefd1[0] >= 0) {
748                 wpa_printf(MSG_INFO, "pipefd1 had not been closed");
749                 eloop_unregister_read_sock(t->pipefd1[0]);
750                 close(t->pipefd1[0]);
751                 t->pipefd1[0] = -1;
752                 close(t->pipefd1[1]);
753                 t->pipefd1[1] = -1;
754         }
755
756         if (t->pipefd2[0] >= 0) {
757                 wpa_printf(MSG_INFO, "pipefd2 had not been closed");
758                 eloop_unregister_read_sock(t->pipefd2[0]);
759                 close(t->pipefd2[0]);
760                 t->pipefd2[0] = -1;
761                 close(t->pipefd2[1]);
762                 t->pipefd2[1] = -1;
763         }
764
765         next_run = t->close_in_timeout;
766         t->magic = 0;
767         wpa_printf(MSG_INFO, "%s - free(%p)", __func__, t);
768         os_free(t);
769
770         if (next_run)
771                 eloop_tests_start(0);
772 }
773
774
775 static void eloop_tests_start(int close_in_timeout)
776 {
777         struct test_eloop *t;
778         int res;
779
780         t = os_zalloc(sizeof(*t));
781         if (!t)
782                 return;
783         t->magic = 0x12345678;
784         t->close_in_timeout = close_in_timeout;
785
786         wpa_printf(MSG_INFO, "starting eloop tests (%p) (close_in_timeout=%d)",
787                    t, close_in_timeout);
788
789         res = pipe(t->pipefd1);
790         if (res < 0) {
791                 wpa_printf(MSG_INFO, "pipe: %s", strerror(errno));
792                 os_free(t);
793                 return;
794         }
795
796         res = pipe(t->pipefd2);
797         if (res < 0) {
798                 wpa_printf(MSG_INFO, "pipe: %s", strerror(errno));
799                 close(t->pipefd1[0]);
800                 close(t->pipefd1[1]);
801                 os_free(t);
802                 return;
803         }
804
805         wpa_printf(MSG_INFO, "pipe fds: %d,%d %d,%d",
806                    t->pipefd1[0], t->pipefd1[1],
807                    t->pipefd2[0], t->pipefd2[1]);
808
809         eloop_register_read_sock(t->pipefd1[0], eloop_test_read_1, t, NULL);
810         eloop_register_read_sock(t->pipefd2[0], eloop_test_read_2, t, NULL);
811         eloop_register_timeout(0, 0, eloop_test_cb, t, NULL);
812         eloop_register_timeout(0, 200000, eloop_test_timeout, t, NULL);
813
814         if (write(t->pipefd1[1], "HELLO", 5) < 0)
815                 wpa_printf(MSG_INFO, "write: %s", strerror(errno));
816         if (write(t->pipefd2[1], "TEST", 4) < 0)
817                 wpa_printf(MSG_INFO, "write: %s", strerror(errno));
818         os_sleep(0, 50000);
819         wpa_printf(MSG_INFO, "waiting for eloop callbacks");
820 }
821
822
823 static void eloop_tests_run(void *eloop_data, void *user_ctx)
824 {
825         eloop_tests_start(1);
826 }
827
828
829 static int eloop_tests(void)
830 {
831         wpa_printf(MSG_INFO, "schedule eloop tests to be run");
832
833         /*
834          * Cannot return error from these without a significant design change,
835          * so for now, run the tests from a scheduled timeout and require
836          * separate verification of the results from the debug log.
837          */
838         eloop_register_timeout(0, 0, eloop_tests_run, NULL, NULL);
839
840         return 0;
841 }
842
843
844 #ifdef CONFIG_JSON
845 struct json_test_data {
846         const char *json;
847         const char *tree;
848 };
849
850 static const struct json_test_data json_test_cases[] = {
851         { "{}", "[1:OBJECT:]" },
852         { "[]", "[1:ARRAY:]" },
853         { "{", NULL },
854         { "[", NULL },
855         { "}", NULL },
856         { "]", NULL },
857         { "[[]]", "[1:ARRAY:][2:ARRAY:]" },
858         { "{\"t\":\"test\"}", "[1:OBJECT:][2:STRING:t]" },
859         { "{\"t\":123}", "[1:OBJECT:][2:NUMBER:t]" },
860         { "{\"t\":true}", "[1:OBJECT:][2:BOOLEAN:t]" },
861         { "{\"t\":false}", "[1:OBJECT:][2:BOOLEAN:t]" },
862         { "{\"t\":null}", "[1:OBJECT:][2:NULL:t]" },
863         { "{\"t\":truetrue}", NULL },
864         { "\"test\"", "[1:STRING:]" },
865         { "123", "[1:NUMBER:]" },
866         { "true", "[1:BOOLEAN:]" },
867         { "false", "[1:BOOLEAN:]" },
868         { "null", "[1:NULL:]" },
869         { "truetrue", NULL },
870         { " {\t\n\r\"a\"\n:\r1\n,\n\"b\":3\n}\n",
871           "[1:OBJECT:][2:NUMBER:a][2:NUMBER:b]" },
872         { ",", NULL },
873         { "{,}", NULL },
874         { "[,]", NULL },
875         { ":", NULL },
876         { "{:}", NULL },
877         { "[:]", NULL },
878         { "{ \"\\u005c\" : \"\\u005c\" }", "[1:OBJECT:][2:STRING:\\]" },
879         { "[{},{}]", "[1:ARRAY:][2:OBJECT:][2:OBJECT:]" },
880         { "[1,2]", "[1:ARRAY:][2:NUMBER:][2:NUMBER:]" },
881         { "[\"1\",\"2\"]", "[1:ARRAY:][2:STRING:][2:STRING:]" },
882         { "[true,false]", "[1:ARRAY:][2:BOOLEAN:][2:BOOLEAN:]" },
883 };
884 #endif /* CONFIG_JSON */
885
886
887 static int json_tests(void)
888 {
889 #ifdef CONFIG_JSON
890         unsigned int i;
891         struct json_token *root;
892         char buf[1000];
893
894         wpa_printf(MSG_INFO, "JSON tests");
895
896         for (i = 0; i < ARRAY_SIZE(json_test_cases); i++) {
897                 const struct json_test_data *test = &json_test_cases[i];
898                 int res = 0;
899
900                 root = json_parse(test->json, os_strlen(test->json));
901                 if ((root && !test->tree) || (!root && test->tree)) {
902                         wpa_printf(MSG_INFO, "JSON test %u failed", i);
903                         res = -1;
904                 } else if (root) {
905                         json_print_tree(root, buf, sizeof(buf));
906                         if (os_strcmp(buf, test->tree) != 0) {
907                                 wpa_printf(MSG_INFO,
908                                            "JSON test %u tree mismatch: %s %s",
909                                            i, buf, test->tree);
910                                 res = -1;
911                         }
912                 }
913                 json_free(root);
914                 if (res < 0)
915                         return -1;
916
917         }
918 #endif /* CONFIG_JSON */
919         return 0;
920 }
921
922
923 static int const_time_tests(void)
924 {
925         struct const_time_fill_msb_test {
926                 unsigned int val;
927                 unsigned int expected;
928         } const_time_fill_msb_tests[] = {
929                 { 0, 0 },
930                 { 1, 0 },
931                 { 2, 0 },
932                 { 1 << (sizeof(unsigned int) * 8 - 1), ~0 },
933                 { ~0 - 1, ~0 },
934                 { ~0, ~0 }
935         };
936         struct const_time_is_zero_test {
937                 unsigned int val;
938                 unsigned int expected;
939         } const_time_is_zero_tests[] = {
940                 { 0, ~0 },
941                 { 1, 0 },
942                 { 2, 0 },
943                 { 1 << (sizeof(unsigned int) * 8 - 1), 0 },
944                 { ~0 - 1, 0 },
945                 { ~0, 0 }
946         };
947         struct const_time_eq_test {
948                 unsigned int a;
949                 unsigned int b;
950                 unsigned int expected;
951                 unsigned int expected_u8;
952         } const_time_eq_tests[] = {
953                 { 0, 1, 0, 0 },
954                 { 1, 2, 0, 0 },
955                 { 1, 1, ~0, 0xff },
956                 { ~0, ~0, ~0, 0xff },
957                 { ~0, ~0 - 1, 0, 0 },
958                 { 0, 0, ~0, 0xff }
959         };
960         struct const_time_eq_bin_test {
961                 u8 *a;
962                 u8 *b;
963                 size_t len;
964                 unsigned int expected;
965         } const_time_eq_bin_tests[] = {
966                 { (u8 *) "", (u8 *) "", 0, ~0 },
967                 { (u8 *) "abcde", (u8 *) "abcde", 5, ~0 },
968                 { (u8 *) "abcde", (u8 *) "Abcde", 5, 0 },
969                 { (u8 *) "abcde", (u8 *) "aBcde", 5, 0 },
970                 { (u8 *) "abcde", (u8 *) "abCde", 5, 0 },
971                 { (u8 *) "abcde", (u8 *) "abcDe", 5, 0 },
972                 { (u8 *) "abcde", (u8 *) "abcdE", 5, 0 },
973                 { (u8 *) "\x00", (u8 *) "\x01", 1, 0 },
974                 { (u8 *) "\x00", (u8 *) "\x80", 1, 0 },
975                 { (u8 *) "\x00", (u8 *) "\x00", 1, ~0 }
976         };
977         struct const_time_select_test {
978                 unsigned int mask;
979                 unsigned int true_val;
980                 unsigned int false_val;
981                 unsigned int expected;
982         } const_time_select_tests[] = {
983                 { ~0, ~0, ~0, ~0 },
984                 { 0, ~0, ~0, ~0 },
985                 { ~0, ~0, 0, ~0 },
986                 { 0, ~0, 0, 0 },
987                 { ~0, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa },
988                 { 0, 0xaaaaaaaa, 0x55555555, 0x55555555 },
989                 { ~0, 3, 3, 3 },
990                 { 0, 3, 3, 3 },
991                 { ~0, 1, 2, 1 },
992                 { 0, 1, 2, 2 }
993         };
994         struct const_time_select_int_test {
995                 unsigned int mask;
996                 int true_val;
997                 int false_val;
998                 int expected;
999         } const_time_select_int_tests[] = {
1000                 { ~0, -128, 127, -128 },
1001                 { 0, -128, 127, 127 },
1002                 { ~0, -2147483648, 2147483647, -2147483648 },
1003                 { 0, -2147483648, 2147483647, 2147483647 },
1004                 { ~0, 0, 0, 0 },
1005                 { 0, 0, 0, 0 },
1006                 { ~0, -1, 1, -1 },
1007                 { 0, -1, 1, 1 }
1008         };
1009         struct const_time_select_u8_test {
1010                 u8 mask;
1011                 u8 true_val;
1012                 u8 false_val;
1013                 u8 expected;
1014         } const_time_select_u8_tests[] = {
1015                 { ~0, ~0, ~0, ~0 },
1016                 { 0, ~0, ~0, ~0 },
1017                 { ~0, ~0, 0, ~0 },
1018                 { 0, ~0, 0, 0 },
1019                 { ~0, 0xaa, 0x55, 0xaa },
1020                 { 0, 0xaa, 0x55, 0x55 },
1021                 { ~0, 1, 2, 1 },
1022                 { 0, 1, 2, 2 }
1023         };
1024         struct const_time_select_s8_test {
1025                 u8 mask;
1026                 s8 true_val;
1027                 s8 false_val;
1028                 s8 expected;
1029         } const_time_select_s8_tests[] = {
1030                 { ~0, -128, 127, -128 },
1031                 { 0, -128, 127, 127 },
1032                 { ~0, 0, 0, 0 },
1033                 { 0, 0, 0, 0 },
1034                 { ~0, -1, 1, -1 },
1035                 { 0, -1, 1, 1 }
1036         };
1037         struct const_time_select_bin_test {
1038                 u8 mask;
1039                 u8 *true_val;
1040                 u8 *false_val;
1041                 size_t len;
1042                 u8 *expected;
1043         } const_time_select_bin_tests[] = {
1044                 { ~0, (u8 *) "abcde", (u8 *) "ABCDE", 5, (u8 *) "abcde" },
1045                 { 0, (u8 *) "abcde", (u8 *) "ABCDE", 5, (u8 *) "ABCDE" },
1046                 { ~0, (u8 *) "", (u8 *) "", 0, (u8 *) "" },
1047                 { 0, (u8 *) "", (u8 *) "", 0, (u8 *) "" }
1048         };
1049         struct const_time_memcmp_test {
1050                 char *a;
1051                 char *b;
1052                 size_t len;
1053                 int expected;
1054         } const_time_memcmp_tests[] = {
1055                 { "abcde", "abcde", 5, 0 },
1056                 { "abcde", "bbcde", 5, -1 },
1057                 { "bbcde", "abcde", 5, 1 },
1058                 { "accde", "abcde", 5, 1 },
1059                 { "abcee", "abcde", 5, 1 },
1060                 { "abcdf", "abcde", 5, 1 },
1061                 { "cbcde", "aXXXX", 5, 2 },
1062                 { "a", "d", 1, -3 },
1063                 { "", "", 0, 0 }
1064         };
1065         unsigned int i;
1066         int ret = 0;
1067
1068         wpa_printf(MSG_INFO, "constant time tests");
1069
1070         for (i = 0; i < ARRAY_SIZE(const_time_fill_msb_tests); i++) {
1071                 struct const_time_fill_msb_test *test;
1072
1073                 test = &const_time_fill_msb_tests[i];
1074                 if (const_time_fill_msb(test->val) != test->expected) {
1075                         wpa_printf(MSG_ERROR,
1076                                    "const_time_fill_msb(0x%x) test failed",
1077                                    test->val);
1078                         ret = -1;
1079                 }
1080         }
1081
1082         for (i = 0; i < ARRAY_SIZE(const_time_is_zero_tests); i++) {
1083                 struct const_time_is_zero_test *test;
1084
1085                 test = &const_time_is_zero_tests[i];
1086                 if (const_time_is_zero(test->val) != test->expected) {
1087                         wpa_printf(MSG_ERROR,
1088                                    "const_time_is_zero(0x%x) test failed",
1089                                    test->val);
1090                         ret = -1;
1091                 }
1092         }
1093
1094         for (i = 0; i < ARRAY_SIZE(const_time_eq_tests); i++) {
1095                 struct const_time_eq_test *test;
1096
1097                 test = &const_time_eq_tests[i];
1098                 if (const_time_eq(test->a, test->b) != test->expected) {
1099                         wpa_printf(MSG_ERROR,
1100                                    "const_time_eq(0x%x,0x%x) test failed",
1101                                    test->a, test->b);
1102                         ret = -1;
1103                 }
1104                 if (const_time_eq_u8(test->a, test->b) != test->expected_u8) {
1105                         wpa_printf(MSG_ERROR,
1106                                    "const_time_eq_u8(0x%x,0x%x) test failed",
1107                                    test->a, test->b);
1108                         ret = -1;
1109                 }
1110         }
1111
1112         for (i = 0; i < ARRAY_SIZE(const_time_eq_bin_tests); i++) {
1113                 struct const_time_eq_bin_test *test;
1114
1115                 test = &const_time_eq_bin_tests[i];
1116                 if (const_time_eq_bin(test->a, test->b, test->len) !=
1117                     test->expected) {
1118                         wpa_printf(MSG_ERROR,
1119                                    "const_time_eq_bin(len=%u) test failed",
1120                                    (unsigned int) test->len);
1121                         ret = -1;
1122                 }
1123         }
1124
1125         for (i = 0; i < ARRAY_SIZE(const_time_select_tests); i++) {
1126                 struct const_time_select_test *test;
1127
1128                 test = &const_time_select_tests[i];
1129                 if (const_time_select(test->mask, test->true_val,
1130                                       test->false_val) != test->expected) {
1131                         wpa_printf(MSG_ERROR,
1132                                    "const_time_select(0x%x,0x%x,0x%x) test failed",
1133                                    test->mask, test->true_val, test->false_val);
1134                         ret = -1;
1135                 }
1136         }
1137
1138         for (i = 0; i < ARRAY_SIZE(const_time_select_int_tests); i++) {
1139                 struct const_time_select_int_test *test;
1140
1141                 test = &const_time_select_int_tests[i];
1142                 if (const_time_select_int(test->mask, test->true_val,
1143                                           test->false_val) != test->expected) {
1144                         wpa_printf(MSG_ERROR,
1145                                    "const_time_select_int(0x%x,%d,%d) test failed",
1146                                    test->mask, test->true_val, test->false_val);
1147                         ret = -1;
1148                 }
1149         }
1150
1151         for (i = 0; i < ARRAY_SIZE(const_time_select_u8_tests); i++) {
1152                 struct const_time_select_u8_test *test;
1153
1154                 test = &const_time_select_u8_tests[i];
1155                 if (const_time_select_u8(test->mask, test->true_val,
1156                                          test->false_val) != test->expected) {
1157                         wpa_printf(MSG_ERROR,
1158                                    "const_time_select_u8(0x%x,0x%x,0x%x) test failed",
1159                                    test->mask, test->true_val, test->false_val);
1160                         ret = -1;
1161                 }
1162         }
1163
1164         for (i = 0; i < ARRAY_SIZE(const_time_select_s8_tests); i++) {
1165                 struct const_time_select_s8_test *test;
1166
1167                 test = &const_time_select_s8_tests[i];
1168                 if (const_time_select_s8(test->mask, test->true_val,
1169                                          test->false_val) != test->expected) {
1170                         wpa_printf(MSG_ERROR,
1171                                    "const_time_select_s8(0x%x,0x%x,0x%x) test failed",
1172                                    test->mask, test->true_val, test->false_val);
1173                         ret = -1;
1174                 }
1175         }
1176
1177         for (i = 0; i < ARRAY_SIZE(const_time_select_bin_tests); i++) {
1178                 struct const_time_select_bin_test *test;
1179                 u8 dst[100];
1180
1181                 test = &const_time_select_bin_tests[i];
1182                 const_time_select_bin(test->mask, test->true_val,
1183                                       test->false_val, test->len, dst);
1184                 if (os_memcmp(dst, test->expected, test->len) != 0) {
1185                         wpa_printf(MSG_ERROR,
1186                                    "const_time_select_bin(0x%x,%u) test failed",
1187                                    test->mask, (unsigned int) test->len);
1188                         ret = -1;
1189                 }
1190         }
1191
1192         for (i = 0; i < ARRAY_SIZE(const_time_memcmp_tests); i++) {
1193                 struct const_time_memcmp_test *test;
1194                 int res;
1195
1196                 test = &const_time_memcmp_tests[i];
1197                 res = const_time_memcmp(test->a, test->b, test->len);
1198                 if (res != test->expected) {
1199                         wpa_printf(MSG_ERROR,
1200                                    "const_time_memcmp(%s,%s,%d) test failed (%d != %d)",
1201                                    test->a, test->b, (int) test->len,
1202                                    res, test->expected);
1203                         ret = -1;
1204                 }
1205         }
1206
1207         return ret;
1208 }
1209
1210
1211 int utils_module_tests(void)
1212 {
1213         int ret = 0;
1214
1215         wpa_printf(MSG_INFO, "utils module tests");
1216
1217         if (printf_encode_decode_tests() < 0 ||
1218             ext_password_tests() < 0 ||
1219             trace_tests() < 0 ||
1220             bitfield_tests() < 0 ||
1221             base64_tests() < 0 ||
1222             common_tests() < 0 ||
1223             os_tests() < 0 ||
1224             wpabuf_tests() < 0 ||
1225             ip_addr_tests() < 0 ||
1226             eloop_tests() < 0 ||
1227             json_tests() < 0 ||
1228             const_time_tests() < 0 ||
1229             int_array_tests() < 0)
1230                 ret = -1;
1231
1232         return ret;
1233 }