xref: /freebsd/contrib/wpa/src/wps/wps_module_tests.c (revision 780fb4a2fa9a9aee5ac48a60b790f567c0dc13e9)
15b9c547cSRui Paulo /*
25b9c547cSRui Paulo  * WPS module tests
35b9c547cSRui Paulo  * Copyright (c) 2014, Jouni Malinen <j@w1.fi>
45b9c547cSRui Paulo  *
55b9c547cSRui Paulo  * This software may be distributed under the terms of the BSD license.
65b9c547cSRui Paulo  * See README for more details.
75b9c547cSRui Paulo  */
85b9c547cSRui Paulo 
95b9c547cSRui Paulo #include "utils/includes.h"
105b9c547cSRui Paulo 
115b9c547cSRui Paulo #include "utils/common.h"
12*780fb4a2SCy Schubert #include "utils/module_tests.h"
135b9c547cSRui Paulo #include "wps_attr_parse.h"
145b9c547cSRui Paulo 
155b9c547cSRui Paulo struct wps_attr_parse_test {
165b9c547cSRui Paulo 	const char *data;
175b9c547cSRui Paulo 	int result;
185b9c547cSRui Paulo 	int extra;
195b9c547cSRui Paulo };
205b9c547cSRui Paulo 
21*780fb4a2SCy Schubert static const struct wps_attr_parse_test wps_attr_parse_test_cases[] = {
225b9c547cSRui Paulo 	/* Empty message */
235b9c547cSRui Paulo 	{ "", 0, 0 },
245b9c547cSRui Paulo 	/* Truncated attribute header */
255b9c547cSRui Paulo 	{ "10", -1, 0 },
265b9c547cSRui Paulo 	{ "1010", -1, 0 },
275b9c547cSRui Paulo 	{ "101000", -1, 0 },
285b9c547cSRui Paulo 	/* Attribute overflow */
295b9c547cSRui Paulo 	{ "10100001", -1, 0 },
305b9c547cSRui Paulo #ifdef CONFIG_WPS_STRICT
315b9c547cSRui Paulo 	{ "10270000001057000101", -1, 0 },
325b9c547cSRui Paulo 	{ "1027000010570001010000000000", -1, 0 },
335b9c547cSRui Paulo #else /* CONFIG_WPS_STRICT */
345b9c547cSRui Paulo 	/* Network Key workaround */
355b9c547cSRui Paulo 	{ "10270000001057000101", 0, 1 },
365b9c547cSRui Paulo 	{ "10230000001057000101", -1, 0 },
375b9c547cSRui Paulo 	{ "10270000101057000101", -1, 0 },
385b9c547cSRui Paulo 	/* Mac OS X 10.6 padding workaround */
395b9c547cSRui Paulo 	{ "1027000010570001010000000000", 0, 1 },
405b9c547cSRui Paulo 	{ "1027000010570001010000000000000001000000", -1, 0 },
415b9c547cSRui Paulo #endif /* CONFIG_WPS_STRICT */
425b9c547cSRui Paulo 	/* Version */
435b9c547cSRui Paulo 	{ "104a000110", 0, 0 },
445b9c547cSRui Paulo 	{ "104a0000", -1, 0 },
455b9c547cSRui Paulo 	/* Message Type */
465b9c547cSRui Paulo 	{ "1022000101", 0, 0 },
475b9c547cSRui Paulo 	{ "10220000", -1, 0 },
485b9c547cSRui Paulo 	/* Enrollee Nonce */
495b9c547cSRui Paulo 	{ "101a001000112233445566778899aabbccddeeff", 0, 0 },
505b9c547cSRui Paulo 	{ "101a00111122334455667788990011223344556677", -1, 0 },
515b9c547cSRui Paulo 	/* Registrar Nonce */
525b9c547cSRui Paulo 	{ "1039001000112233445566778899aabbccddeeff", 0, 0 },
535b9c547cSRui Paulo 	{ "103900111122334455667788990011223344556677", -1, 0 },
545b9c547cSRui Paulo 	/* UUID-E */
555b9c547cSRui Paulo 	{ "1047001000112233445566778899aabbccddeeff", 0, 0 },
565b9c547cSRui Paulo 	{ "10470000", -1, 0 },
575b9c547cSRui Paulo 	{ "104700111122334455667788990011223344556677", -1, 0 },
585b9c547cSRui Paulo 	/* UUID-R */
595b9c547cSRui Paulo 	{ "1048001000112233445566778899aabbccddeeff", 0, 0 },
605b9c547cSRui Paulo 	{ "10480000", -1, 0 },
615b9c547cSRui Paulo 	{ "104800111122334455667788990011223344556677", -1, 0 },
625b9c547cSRui Paulo 	/* Auth Type Flags */
635b9c547cSRui Paulo 	{ "100400021122", 0, 0 },
645b9c547cSRui Paulo 	{ "10040001ff", -1, 0 },
655b9c547cSRui Paulo 	/* Encr Type Flags */
665b9c547cSRui Paulo 	{ "101000021122", 0, 0 },
675b9c547cSRui Paulo 	{ "10100001ff", -1, 0 },
685b9c547cSRui Paulo 	/* Connection Type Flags */
695b9c547cSRui Paulo 	{ "100d0001ff", 0, 0 },
705b9c547cSRui Paulo 	{ "100d0002ffff", -1, 0 },
715b9c547cSRui Paulo 	/* Config Methods */
725b9c547cSRui Paulo 	{ "10080002ffff", 0, 0 },
735b9c547cSRui Paulo 	{ "10080001ff", -1, 0 },
745b9c547cSRui Paulo 	/* Selected Registrar Config Methods */
755b9c547cSRui Paulo 	{ "10530002ffff", 0, 0 },
765b9c547cSRui Paulo 	{ "10530001ff", -1, 0 },
775b9c547cSRui Paulo 	/* Primary Device Type */
785b9c547cSRui Paulo 	{ "105400081122334455667788", 0, 0 },
795b9c547cSRui Paulo 	{ "105400111122334455667788990011223344556677", -1, 0 },
805b9c547cSRui Paulo 	/* RF Bands */
815b9c547cSRui Paulo 	{ "103c0001ff", 0, 0 },
825b9c547cSRui Paulo 	{ "103c0002ffff", -1, 0 },
835b9c547cSRui Paulo 	/* Association State */
845b9c547cSRui Paulo 	{ "10020002ffff", 0, 0 },
855b9c547cSRui Paulo 	{ "10020001ff", -1, 0 },
865b9c547cSRui Paulo 	/* Config Error */
875b9c547cSRui Paulo 	{ "100900020001", 0, 0 },
885b9c547cSRui Paulo 	{ "10090001ff", -1, 0 },
895b9c547cSRui Paulo 	/* Device Password ID */
905b9c547cSRui Paulo 	{ "101200020004", 0, 0 },
915b9c547cSRui Paulo 	{ "10120001ff", -1, 0 },
925b9c547cSRui Paulo 	/* OOB Device Password */
935b9c547cSRui Paulo 	{ "102c001611223344556677889900112233445566778899000007", 0, 0 },
945b9c547cSRui Paulo 	{ "102c0036112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344", 0, 0 },
955b9c547cSRui Paulo 	{ "102c0001ff", -1, 0 },
965b9c547cSRui Paulo 	{ "102c003711223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455", -1, 0 },
975b9c547cSRui Paulo 	{ "102c002511223344556677889900112233445566778899001122334455667788990011223344556677", -1, 0 },
985b9c547cSRui Paulo 	/* OS Version */
995b9c547cSRui Paulo 	{ "102d000411223344", 0, 0 },
1005b9c547cSRui Paulo 	{ "102d00111122334455667788990011223344556677", -1, 0 },
1015b9c547cSRui Paulo 	/* WPS State */
1025b9c547cSRui Paulo 	{ "1044000101", 0, 0 },
1035b9c547cSRui Paulo 	{ "10440002ffff", -1, 0 },
1045b9c547cSRui Paulo 	/* Authenticator */
1055b9c547cSRui Paulo 	{ "100500081122334455667788", 0, 0 },
1065b9c547cSRui Paulo 	{ "10050000", -1, 0 },
1075b9c547cSRui Paulo 	{ "100500111122334455667788990011223344556677", -1, 0 },
1085b9c547cSRui Paulo 	/* R-Hash1 */
1095b9c547cSRui Paulo 	{ "103d00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1105b9c547cSRui Paulo 	{ "103d0000", -1, 0 },
1115b9c547cSRui Paulo 	{ "103d0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1125b9c547cSRui Paulo 	/* R-Hash2 */
1135b9c547cSRui Paulo 	{ "103e00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1145b9c547cSRui Paulo 	{ "103e0000", -1, 0 },
1155b9c547cSRui Paulo 	{ "103e0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1165b9c547cSRui Paulo 	/* E-Hash1 */
1175b9c547cSRui Paulo 	{ "101400201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1185b9c547cSRui Paulo 	{ "10140000", -1, 0 },
1195b9c547cSRui Paulo 	{ "10140021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1205b9c547cSRui Paulo 	/* E-Hash2 */
1215b9c547cSRui Paulo 	{ "101500201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1225b9c547cSRui Paulo 	{ "10150000", -1, 0 },
1235b9c547cSRui Paulo 	{ "10150021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1245b9c547cSRui Paulo 	/* R-SNonce1 */
1255b9c547cSRui Paulo 	{ "103f001011223344556677889900112233445566", 0, 0 },
1265b9c547cSRui Paulo 	{ "103f0000", -1, 0 },
1275b9c547cSRui Paulo 	{ "103f00111122334455667788990011223344556677", -1, 0 },
1285b9c547cSRui Paulo 	/* R-SNonce2 */
1295b9c547cSRui Paulo 	{ "1040001011223344556677889900112233445566", 0, 0 },
1305b9c547cSRui Paulo 	{ "10400000", -1, 0 },
1315b9c547cSRui Paulo 	{ "104000111122334455667788990011223344556677", -1, 0 },
1325b9c547cSRui Paulo 	/* E-SNonce1 */
1335b9c547cSRui Paulo 	{ "1016001011223344556677889900112233445566", 0, 0 },
1345b9c547cSRui Paulo 	{ "10160000", -1, 0 },
1355b9c547cSRui Paulo 	{ "101600111122334455667788990011223344556677", -1, 0 },
1365b9c547cSRui Paulo 	/* E-SNonce2 */
1375b9c547cSRui Paulo 	{ "1017001011223344556677889900112233445566", 0, 0 },
1385b9c547cSRui Paulo 	{ "10170000", -1, 0 },
1395b9c547cSRui Paulo 	{ "101700111122334455667788990011223344556677", -1, 0 },
1405b9c547cSRui Paulo 	/* Key Wrap Authenticator */
1415b9c547cSRui Paulo 	{ "101e00081122334455667788", 0, 0 },
1425b9c547cSRui Paulo 	{ "101e0000", -1, 0 },
1435b9c547cSRui Paulo 	{ "101e0009112233445566778899", -1, 0 },
1445b9c547cSRui Paulo 	/* Authentication Type */
1455b9c547cSRui Paulo 	{ "100300020001", 0, 0 },
1465b9c547cSRui Paulo 	{ "10030001ff", -1, 0 },
1475b9c547cSRui Paulo 	/* Encryption Type */
1485b9c547cSRui Paulo 	{ "100f00020001", 0, 0 },
1495b9c547cSRui Paulo 	{ "100f0001ff", -1, 0 },
1505b9c547cSRui Paulo 	/* Network Index */
1515b9c547cSRui Paulo 	{ "1026000101", 0, 0 },
1525b9c547cSRui Paulo 	{ "10260002ffff", -1, 0 },
1535b9c547cSRui Paulo 	/* Network Key Index */
1545b9c547cSRui Paulo 	{ "1028000101", 0, 3 },
1555b9c547cSRui Paulo 	{ "10280002ffff", -1, 0 },
1565b9c547cSRui Paulo 	/* MAC Address */
1575b9c547cSRui Paulo 	{ "10200006112233445566", 0, 0 },
1585b9c547cSRui Paulo 	{ "10200000", -1, 0 },
1595b9c547cSRui Paulo 	{ "1020000711223344556677", -1, 0 },
1605b9c547cSRui Paulo 	/* Selected Registrar */
1615b9c547cSRui Paulo 	{ "1041000101", 0, 0 },
1625b9c547cSRui Paulo 	{ "10410002ffff", -1, 0 },
1635b9c547cSRui Paulo 	/* Request Type */
1645b9c547cSRui Paulo 	{ "103a000101", 0, 0 },
1655b9c547cSRui Paulo 	{ "103a0002ffff", -1, 0 },
1665b9c547cSRui Paulo 	/* Response Type */
1675b9c547cSRui Paulo 	{ "103b000101", 0, 0 },
1685b9c547cSRui Paulo 	{ "103b0002ffff", -1, 0 },
1695b9c547cSRui Paulo 	/* Manufacturer */
1705b9c547cSRui Paulo 	{ "10210000", 0, 0 },
1715b9c547cSRui Paulo 	/* Model Name */
1725b9c547cSRui Paulo 	{ "10230000", 0, 0 },
1735b9c547cSRui Paulo 	/* Model Number */
1745b9c547cSRui Paulo 	{ "10240000", 0, 0 },
1755b9c547cSRui Paulo 	/* Serial Number */
1765b9c547cSRui Paulo 	{ "10420000", 0, 0 },
1775b9c547cSRui Paulo 	/* Device Name */
1785b9c547cSRui Paulo 	{ "10110000", 0, 0 },
1795b9c547cSRui Paulo 	/* Public Key */
1805b9c547cSRui Paulo 	{ "10320000", 0, 0 },
1815b9c547cSRui Paulo 	/* Enc Settings */
1825b9c547cSRui Paulo 	{ "10180000", 0, 0 },
1835b9c547cSRui Paulo 	/* SSID */
1845b9c547cSRui Paulo 	{ "10450000", 0, 0 },
1855b9c547cSRui Paulo 	/* AP Setup Locked */
1865b9c547cSRui Paulo 	{ "1057000101", 0, 0 },
1875b9c547cSRui Paulo 	{ "10570002ffff", -1, 0 },
1885b9c547cSRui Paulo 	/* Requested Device Type */
1895b9c547cSRui Paulo 	{ "106a00081122334455667788", 0, 0 },
1905b9c547cSRui Paulo 	{ "106a0000", -1, 0 },
1915b9c547cSRui Paulo 	{ "106a0009112233445566778899", -1, 0 },
1925b9c547cSRui Paulo 	/* More than maximum Requested Device Type attributes */
1935b9c547cSRui Paulo 	{ "106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788", 0, 4 },
1945b9c547cSRui Paulo 	/* Secondary Device Type List */
1955b9c547cSRui Paulo 	{ "105500081122334455667788", 0, 0 },
1965b9c547cSRui Paulo 	{ "1055000711223344556677", -1, 0 },
1975b9c547cSRui Paulo 	{ "1055008811223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566", -1, 0 },
1985b9c547cSRui Paulo 	/* AP Channel */
1995b9c547cSRui Paulo 	{ "100100020001", 0, 0 },
2005b9c547cSRui Paulo 	{ "1001000101", -1, 0 },
2015b9c547cSRui Paulo 	/* Skip invalid Vendor Extension */
2025b9c547cSRui Paulo 	{ "10490000", 0, 0 },
2035b9c547cSRui Paulo 	{ "1049000100", 0, 0 },
2045b9c547cSRui Paulo 	{ "104900020000", 0, 0 },
2055b9c547cSRui Paulo 	/* Too long unknown vendor extension */
2065b9c547cSRui Paulo 	{ "10490401"
2075b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2085b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2095b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2105b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2115b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2125b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2135b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2145b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2155b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2165b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2175b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2185b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2195b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2205b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2215b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2225b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2235b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2245b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2255b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2265b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2275b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2285b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2295b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2305b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2315b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2325b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2335b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2345b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2355b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2365b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2375b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2385b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2395b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2405b9c547cSRui Paulo 	  "112233445566778899001122334455667788990011223344556677889900"
2415b9c547cSRui Paulo 	  "1122334455", -1, 0 },
2425b9c547cSRui Paulo 	/* Maximum unknown vendor extensions */
2435b9c547cSRui Paulo 	{ "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA", 0, 5 },
2445b9c547cSRui Paulo 	/* More than maximum unknown vendor extensions */
2455b9c547cSRui Paulo 	{ "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA10490003BBBBBB", -1, 0 },
2465b9c547cSRui Paulo 	/* WFA vendor extensions */
2475b9c547cSRui Paulo 	{ "1049000300372a", 0, 0 },
2485b9c547cSRui Paulo 	{ "1049000400372a00", 0, 0 },
2495b9c547cSRui Paulo 	{ "1049000500372a0001", 0, 0 },
2505b9c547cSRui Paulo 	{ "1049001600372a0001ff0100020101030101040101ff00fe0101", 0, 6 },
2515b9c547cSRui Paulo 	/* Invalid Version2 length */
2525b9c547cSRui Paulo 	{ "1049000500372a0000", -1, 0 },
2535b9c547cSRui Paulo 	/* Invalid Network Key Shareable length */
2545b9c547cSRui Paulo 	{ "1049000500372a0200", -1, 0 },
2555b9c547cSRui Paulo 	/* Invalid Requedt To Enroll length */
2565b9c547cSRui Paulo 	{ "1049000500372a0300", -1, 0 },
2575b9c547cSRui Paulo 	/* Invalid Settings Delay Time length */
2585b9c547cSRui Paulo 	{ "1049000500372a0400", -1, 0 },
2595b9c547cSRui Paulo 	/* More than maximum Credential attributes */
2605b9c547cSRui Paulo 	{ "100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000", 0, 2 },
2615b9c547cSRui Paulo };
2625b9c547cSRui Paulo 
2635b9c547cSRui Paulo 
wps_attr_parse_tests(void)2645b9c547cSRui Paulo static int wps_attr_parse_tests(void)
2655b9c547cSRui Paulo {
2665b9c547cSRui Paulo 	struct wps_parse_attr attr;
2675b9c547cSRui Paulo 	unsigned int i;
2685b9c547cSRui Paulo 	int ret = 0;
2695b9c547cSRui Paulo 
2705b9c547cSRui Paulo 	wpa_printf(MSG_INFO, "WPS attribute parsing tests");
2715b9c547cSRui Paulo 
2725b9c547cSRui Paulo 	for (i = 0; i < ARRAY_SIZE(wps_attr_parse_test_cases); i++) {
2735b9c547cSRui Paulo 		struct wpabuf *buf;
2745b9c547cSRui Paulo 		size_t len;
275325151a3SRui Paulo 		const struct wps_attr_parse_test *test =
2765b9c547cSRui Paulo 			&wps_attr_parse_test_cases[i];
2775b9c547cSRui Paulo 
2785b9c547cSRui Paulo 		len = os_strlen(test->data) / 2;
2795b9c547cSRui Paulo 		buf = wpabuf_alloc(len);
2805b9c547cSRui Paulo 		if (buf == NULL)
2815b9c547cSRui Paulo 			return -1;
2825b9c547cSRui Paulo 		if (hexstr2bin(test->data, wpabuf_put(buf, len), len) < 0) {
2835b9c547cSRui Paulo 			wpabuf_free(buf);
2845b9c547cSRui Paulo 			return -1;
2855b9c547cSRui Paulo 		}
2865b9c547cSRui Paulo 		if (wps_parse_msg(buf, &attr) != test->result) {
2875b9c547cSRui Paulo 			wpa_printf(MSG_ERROR, "WPS attribute parsing test %u failed: %s",
2885b9c547cSRui Paulo 				   i, test->data);
2895b9c547cSRui Paulo 			ret = -1;
2905b9c547cSRui Paulo 		}
2915b9c547cSRui Paulo 		switch (test->extra) {
2925b9c547cSRui Paulo 		case 1:
2935b9c547cSRui Paulo 			if (!attr.network_key || !attr.ap_setup_locked)
2945b9c547cSRui Paulo 				ret = -1;
2955b9c547cSRui Paulo 			break;
2965b9c547cSRui Paulo 		case 2:
2975b9c547cSRui Paulo 			if (attr.num_cred != MAX_CRED_COUNT)
2985b9c547cSRui Paulo 				ret = -1;
2995b9c547cSRui Paulo 			break;
3005b9c547cSRui Paulo 		case 3:
3015b9c547cSRui Paulo 			if (!attr.network_key_idx)
3025b9c547cSRui Paulo 				ret = -1;
3035b9c547cSRui Paulo 			break;
3045b9c547cSRui Paulo 		case 4:
3055b9c547cSRui Paulo 			if (attr.num_req_dev_type != MAX_REQ_DEV_TYPE_COUNT)
3065b9c547cSRui Paulo 				ret = -1;
3075b9c547cSRui Paulo 			break;
3085b9c547cSRui Paulo 		case 5:
3095b9c547cSRui Paulo 			if (attr.num_vendor_ext != MAX_WPS_PARSE_VENDOR_EXT)
3105b9c547cSRui Paulo 				ret = -1;
3115b9c547cSRui Paulo 			break;
3125b9c547cSRui Paulo 		case 6:
3135b9c547cSRui Paulo 			if (!attr.version2 ||
3145b9c547cSRui Paulo 			    !attr.authorized_macs ||
3155b9c547cSRui Paulo 			    !attr.network_key_shareable ||
3165b9c547cSRui Paulo 			    !attr.request_to_enroll ||
3175b9c547cSRui Paulo 			    !attr.settings_delay_time)
3185b9c547cSRui Paulo 				ret = -1;
3195b9c547cSRui Paulo 			break;
3205b9c547cSRui Paulo 		}
3215b9c547cSRui Paulo 		wpabuf_free(buf);
3225b9c547cSRui Paulo 	}
3235b9c547cSRui Paulo 
3245b9c547cSRui Paulo 	return ret;
3255b9c547cSRui Paulo }
3265b9c547cSRui Paulo 
3275b9c547cSRui Paulo 
wps_module_tests(void)3285b9c547cSRui Paulo int wps_module_tests(void)
3295b9c547cSRui Paulo {
3305b9c547cSRui Paulo 	int ret = 0;
3315b9c547cSRui Paulo 
3325b9c547cSRui Paulo 	wpa_printf(MSG_INFO, "WPS module tests");
3335b9c547cSRui Paulo 
3345b9c547cSRui Paulo 	if (wps_attr_parse_tests() < 0)
3355b9c547cSRui Paulo 		ret = -1;
3365b9c547cSRui Paulo 
3375b9c547cSRui Paulo 	return ret;
3385b9c547cSRui Paulo }
339