17f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt/*
27f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt * WPS module tests
37f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt * Copyright (c) 2014, Jouni Malinen <j@w1.fi>
47f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt *
57f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
67f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt * See README for more details.
77f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt */
87f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
97f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt#include "utils/includes.h"
107f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
117f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt#include "utils/common.h"
124ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidt#include "utils/module_tests.h"
137f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt#include "wps_attr_parse.h"
147f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
157f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidtstruct wps_attr_parse_test {
167f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	const char *data;
177f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	int result;
187f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	int extra;
197f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt};
207f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
214ae50e65ef0eefe6d5c356acbc1839f8eac68af5Dmitry Shmidtstatic const struct wps_attr_parse_test wps_attr_parse_test_cases[] = {
227f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Empty message */
237f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "", 0, 0 },
247f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Truncated attribute header */
257f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10", -1, 0 },
267f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1010", -1, 0 },
277f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101000", -1, 0 },
287f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Attribute overflow */
297f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10100001", -1, 0 },
307f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt#ifdef CONFIG_WPS_STRICT
317f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10270000001057000101", -1, 0 },
327f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1027000010570001010000000000", -1, 0 },
337f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt#else /* CONFIG_WPS_STRICT */
347f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Network Key workaround */
357f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10270000001057000101", 0, 1 },
367f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10230000001057000101", -1, 0 },
377f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10270000101057000101", -1, 0 },
387f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Mac OS X 10.6 padding workaround */
397f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1027000010570001010000000000", 0, 1 },
407f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1027000010570001010000000000000001000000", -1, 0 },
417f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt#endif /* CONFIG_WPS_STRICT */
427f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Version */
437f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "104a000110", 0, 0 },
447f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "104a0000", -1, 0 },
457f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Message Type */
467f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1022000101", 0, 0 },
477f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10220000", -1, 0 },
487f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Enrollee Nonce */
497f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101a001000112233445566778899aabbccddeeff", 0, 0 },
507f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101a00111122334455667788990011223344556677", -1, 0 },
517f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Registrar Nonce */
527f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1039001000112233445566778899aabbccddeeff", 0, 0 },
537f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103900111122334455667788990011223344556677", -1, 0 },
547f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* UUID-E */
557f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1047001000112233445566778899aabbccddeeff", 0, 0 },
567f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10470000", -1, 0 },
577f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "104700111122334455667788990011223344556677", -1, 0 },
587f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* UUID-R */
597f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1048001000112233445566778899aabbccddeeff", 0, 0 },
607f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10480000", -1, 0 },
617f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "104800111122334455667788990011223344556677", -1, 0 },
627f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Auth Type Flags */
637f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100400021122", 0, 0 },
647f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10040001ff", -1, 0 },
657f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Encr Type Flags */
667f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101000021122", 0, 0 },
677f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10100001ff", -1, 0 },
687f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Connection Type Flags */
697f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100d0001ff", 0, 0 },
707f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100d0002ffff", -1, 0 },
717f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Config Methods */
727f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10080002ffff", 0, 0 },
737f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10080001ff", -1, 0 },
747f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Selected Registrar Config Methods */
757f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10530002ffff", 0, 0 },
767f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10530001ff", -1, 0 },
777f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Primary Device Type */
787f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "105400081122334455667788", 0, 0 },
797f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "105400111122334455667788990011223344556677", -1, 0 },
807f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* RF Bands */
817f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103c0001ff", 0, 0 },
827f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103c0002ffff", -1, 0 },
837f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Association State */
847f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10020002ffff", 0, 0 },
857f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10020001ff", -1, 0 },
867f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Config Error */
877f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100900020001", 0, 0 },
887f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10090001ff", -1, 0 },
897f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Device Password ID */
907f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101200020004", 0, 0 },
917f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10120001ff", -1, 0 },
927f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* OOB Device Password */
937f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102c001611223344556677889900112233445566778899000007", 0, 0 },
947f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102c0036112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344", 0, 0 },
957f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102c0001ff", -1, 0 },
967f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102c003711223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455", -1, 0 },
977f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102c002511223344556677889900112233445566778899001122334455667788990011223344556677", -1, 0 },
987f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* OS Version */
997f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102d000411223344", 0, 0 },
1007f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "102d00111122334455667788990011223344556677", -1, 0 },
1017f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* WPS State */
1027f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1044000101", 0, 0 },
1037f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10440002ffff", -1, 0 },
1047f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Authenticator */
1057f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100500081122334455667788", 0, 0 },
1067f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10050000", -1, 0 },
1077f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100500111122334455667788990011223344556677", -1, 0 },
1087f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* R-Hash1 */
1097f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103d00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1107f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103d0000", -1, 0 },
1117f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103d0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1127f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* R-Hash2 */
1137f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103e00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1147f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103e0000", -1, 0 },
1157f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103e0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1167f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* E-Hash1 */
1177f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101400201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1187f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10140000", -1, 0 },
1197f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10140021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1207f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* E-Hash2 */
1217f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101500201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
1227f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10150000", -1, 0 },
1237f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10150021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
1247f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* R-SNonce1 */
1257f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103f001011223344556677889900112233445566", 0, 0 },
1267f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103f0000", -1, 0 },
1277f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103f00111122334455667788990011223344556677", -1, 0 },
1287f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* R-SNonce2 */
1297f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1040001011223344556677889900112233445566", 0, 0 },
1307f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10400000", -1, 0 },
1317f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "104000111122334455667788990011223344556677", -1, 0 },
1327f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* E-SNonce1 */
1337f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1016001011223344556677889900112233445566", 0, 0 },
1347f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10160000", -1, 0 },
1357f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101600111122334455667788990011223344556677", -1, 0 },
1367f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* E-SNonce2 */
1377f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1017001011223344556677889900112233445566", 0, 0 },
1387f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10170000", -1, 0 },
1397f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101700111122334455667788990011223344556677", -1, 0 },
1407f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Key Wrap Authenticator */
1417f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101e00081122334455667788", 0, 0 },
1427f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101e0000", -1, 0 },
1437f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "101e0009112233445566778899", -1, 0 },
1447f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Authentication Type */
1457f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100300020001", 0, 0 },
1467f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10030001ff", -1, 0 },
1477f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Encryption Type */
1487f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100f00020001", 0, 0 },
1497f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100f0001ff", -1, 0 },
1507f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Network Index */
1517f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1026000101", 0, 0 },
1527f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10260002ffff", -1, 0 },
1537f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Network Key Index */
1547f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1028000101", 0, 3 },
1557f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10280002ffff", -1, 0 },
1567f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* MAC Address */
1577f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10200006112233445566", 0, 0 },
1587f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10200000", -1, 0 },
1597f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1020000711223344556677", -1, 0 },
1607f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Selected Registrar */
1617f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1041000101", 0, 0 },
1627f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10410002ffff", -1, 0 },
1637f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Request Type */
1647f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103a000101", 0, 0 },
1657f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103a0002ffff", -1, 0 },
1667f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Response Type */
1677f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103b000101", 0, 0 },
1687f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "103b0002ffff", -1, 0 },
1697f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Manufacturer */
1707f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10210000", 0, 0 },
1717f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Model Name */
1727f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10230000", 0, 0 },
1737f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Model Number */
1747f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10240000", 0, 0 },
1757f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Serial Number */
1767f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10420000", 0, 0 },
1777f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Device Name */
1787f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10110000", 0, 0 },
1797f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Public Key */
1807f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10320000", 0, 0 },
1817f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Enc Settings */
1827f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10180000", 0, 0 },
1837f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* SSID */
1847f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10450000", 0, 0 },
1857f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* AP Setup Locked */
1867f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1057000101", 0, 0 },
1877f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10570002ffff", -1, 0 },
1887f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Requested Device Type */
1897f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "106a00081122334455667788", 0, 0 },
1907f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "106a0000", -1, 0 },
1917f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "106a0009112233445566778899", -1, 0 },
1927f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* More than maximum Requested Device Type attributes */
1937f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788", 0, 4 },
1947f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Secondary Device Type List */
1957f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "105500081122334455667788", 0, 0 },
1967f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1055000711223344556677", -1, 0 },
1977f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1055008811223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566", -1, 0 },
1987f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* AP Channel */
1997f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100100020001", 0, 0 },
2007f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1001000101", -1, 0 },
2017f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Skip invalid Vendor Extension */
2027f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10490000", 0, 0 },
2037f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000100", 0, 0 },
2047f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "104900020000", 0, 0 },
2057f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Too long unknown vendor extension */
2067f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10490401"
2077f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2087f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2097f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2107f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2117f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2127f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2137f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2147f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2157f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2167f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2177f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2187f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2197f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2207f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2217f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2227f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2237f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2247f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2257f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2267f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2277f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2287f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2297f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2307f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2317f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2327f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2337f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2347f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2357f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2367f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2377f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2387f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2397f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2407f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "112233445566778899001122334455667788990011223344556677889900"
2417f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	  "1122334455", -1, 0 },
2427f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Maximum unknown vendor extensions */
2437f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA", 0, 5 },
2447f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* More than maximum unknown vendor extensions */
2457f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA10490003BBBBBB", -1, 0 },
2467f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* WFA vendor extensions */
2477f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000300372a", 0, 0 },
2487f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000400372a00", 0, 0 },
2497f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000500372a0001", 0, 0 },
2507f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049001600372a0001ff0100020101030101040101ff00fe0101", 0, 6 },
2517f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Invalid Version2 length */
2527f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000500372a0000", -1, 0 },
2537f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Invalid Network Key Shareable length */
2547f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000500372a0200", -1, 0 },
2557f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Invalid Requedt To Enroll length */
2567f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000500372a0300", -1, 0 },
2577f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* Invalid Settings Delay Time length */
2587f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "1049000500372a0400", -1, 0 },
2597f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	/* More than maximum Credential attributes */
2607f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	{ "100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000", 0, 2 },
2617f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt};
2627f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
2637f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
2647f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidtstatic int wps_attr_parse_tests(void)
2657f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt{
2667f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	struct wps_parse_attr attr;
2677f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	unsigned int i;
2687f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	int ret = 0;
2697f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
2707f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	wpa_printf(MSG_INFO, "WPS attribute parsing tests");
2717f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
2727f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	for (i = 0; i < ARRAY_SIZE(wps_attr_parse_test_cases); i++) {
2737f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		struct wpabuf *buf;
2747f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		size_t len;
2751d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt		const struct wps_attr_parse_test *test =
2767f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			&wps_attr_parse_test_cases[i];
2777f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
2787f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		len = os_strlen(test->data) / 2;
2797f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		buf = wpabuf_alloc(len);
2807f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		if (buf == NULL)
2817f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			return -1;
2827f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		if (hexstr2bin(test->data, wpabuf_put(buf, len), len) < 0) {
2837f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			wpabuf_free(buf);
2847f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			return -1;
2857f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		}
2867f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		if (wps_parse_msg(buf, &attr) != test->result) {
2877f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			wpa_printf(MSG_ERROR, "WPS attribute parsing test %u failed: %s",
2887f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				   i, test->data);
2897f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			ret = -1;
2907f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		}
2917f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		switch (test->extra) {
2927f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		case 1:
2937f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			if (!attr.network_key || !attr.ap_setup_locked)
2947f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				ret = -1;
2957f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			break;
2967f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		case 2:
2977f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			if (attr.num_cred != MAX_CRED_COUNT)
2987f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				ret = -1;
2997f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			break;
3007f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		case 3:
3017f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			if (!attr.network_key_idx)
3027f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				ret = -1;
3037f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			break;
3047f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		case 4:
3057f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			if (attr.num_req_dev_type != MAX_REQ_DEV_TYPE_COUNT)
3067f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				ret = -1;
3077f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			break;
3087f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		case 5:
3097f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			if (attr.num_vendor_ext != MAX_WPS_PARSE_VENDOR_EXT)
3107f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				ret = -1;
3117f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			break;
3127f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		case 6:
3137f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			if (!attr.version2 ||
3147f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			    !attr.authorized_macs ||
3157f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			    !attr.network_key_shareable ||
3167f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			    !attr.request_to_enroll ||
3177f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			    !attr.settings_delay_time)
3187f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt				ret = -1;
3197f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt			break;
3207f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		}
3217f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		wpabuf_free(buf);
3227f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	}
3237f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
3247f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	return ret;
3257f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt}
3267f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
3277f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
3287f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidtint wps_module_tests(void)
3297f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt{
3307f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	int ret = 0;
3317f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
3327f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	wpa_printf(MSG_INFO, "WPS module tests");
3337f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
3347f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	if (wps_attr_parse_tests() < 0)
3357f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt		ret = -1;
3367f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt
3377f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt	return ret;
3387f93d6fa14a343127754c33a03cf2f641b6ff6e4Dmitry Shmidt}
339