tests: Add module tests for WPS attribute parsing
Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
ea449b5bfe
commit
3cdcb3a4b3
3 changed files with 352 additions and 1 deletions
337
src/wps/wps_module_tests.c
Normal file
337
src/wps/wps_module_tests.c
Normal file
|
@ -0,0 +1,337 @@
|
|||
/*
|
||||
* WPS module tests
|
||||
* Copyright (c) 2014, Jouni Malinen <j@w1.fi>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "utils/includes.h"
|
||||
|
||||
#include "utils/common.h"
|
||||
#include "wps_attr_parse.h"
|
||||
|
||||
struct wps_attr_parse_test {
|
||||
const char *data;
|
||||
int result;
|
||||
int extra;
|
||||
};
|
||||
|
||||
struct wps_attr_parse_test wps_attr_parse_test_cases[] = {
|
||||
/* Empty message */
|
||||
{ "", 0, 0 },
|
||||
/* Truncated attribute header */
|
||||
{ "10", -1, 0 },
|
||||
{ "1010", -1, 0 },
|
||||
{ "101000", -1, 0 },
|
||||
/* Attribute overflow */
|
||||
{ "10100001", -1, 0 },
|
||||
#ifdef CONFIG_WPS_STRICT
|
||||
{ "10270000001057000101", -1, 0 },
|
||||
{ "1027000010570001010000000000", -1, 0 },
|
||||
#else /* CONFIG_WPS_STRICT */
|
||||
/* Network Key workaround */
|
||||
{ "10270000001057000101", 0, 1 },
|
||||
{ "10230000001057000101", -1, 0 },
|
||||
{ "10270000101057000101", -1, 0 },
|
||||
/* Mac OS X 10.6 padding workaround */
|
||||
{ "1027000010570001010000000000", 0, 1 },
|
||||
{ "1027000010570001010000000000000001000000", -1, 0 },
|
||||
#endif /* CONFIG_WPS_STRICT */
|
||||
/* Version */
|
||||
{ "104a000110", 0, 0 },
|
||||
{ "104a0000", -1, 0 },
|
||||
/* Message Type */
|
||||
{ "1022000101", 0, 0 },
|
||||
{ "10220000", -1, 0 },
|
||||
/* Enrollee Nonce */
|
||||
{ "101a001000112233445566778899aabbccddeeff", 0, 0 },
|
||||
{ "101a00111122334455667788990011223344556677", -1, 0 },
|
||||
/* Registrar Nonce */
|
||||
{ "1039001000112233445566778899aabbccddeeff", 0, 0 },
|
||||
{ "103900111122334455667788990011223344556677", -1, 0 },
|
||||
/* UUID-E */
|
||||
{ "1047001000112233445566778899aabbccddeeff", 0, 0 },
|
||||
{ "10470000", -1, 0 },
|
||||
{ "104700111122334455667788990011223344556677", -1, 0 },
|
||||
/* UUID-R */
|
||||
{ "1048001000112233445566778899aabbccddeeff", 0, 0 },
|
||||
{ "10480000", -1, 0 },
|
||||
{ "104800111122334455667788990011223344556677", -1, 0 },
|
||||
/* Auth Type Flags */
|
||||
{ "100400021122", 0, 0 },
|
||||
{ "10040001ff", -1, 0 },
|
||||
/* Encr Type Flags */
|
||||
{ "101000021122", 0, 0 },
|
||||
{ "10100001ff", -1, 0 },
|
||||
/* Connection Type Flags */
|
||||
{ "100d0001ff", 0, 0 },
|
||||
{ "100d0002ffff", -1, 0 },
|
||||
/* Config Methods */
|
||||
{ "10080002ffff", 0, 0 },
|
||||
{ "10080001ff", -1, 0 },
|
||||
/* Selected Registrar Config Methods */
|
||||
{ "10530002ffff", 0, 0 },
|
||||
{ "10530001ff", -1, 0 },
|
||||
/* Primary Device Type */
|
||||
{ "105400081122334455667788", 0, 0 },
|
||||
{ "105400111122334455667788990011223344556677", -1, 0 },
|
||||
/* RF Bands */
|
||||
{ "103c0001ff", 0, 0 },
|
||||
{ "103c0002ffff", -1, 0 },
|
||||
/* Association State */
|
||||
{ "10020002ffff", 0, 0 },
|
||||
{ "10020001ff", -1, 0 },
|
||||
/* Config Error */
|
||||
{ "100900020001", 0, 0 },
|
||||
{ "10090001ff", -1, 0 },
|
||||
/* Device Password ID */
|
||||
{ "101200020004", 0, 0 },
|
||||
{ "10120001ff", -1, 0 },
|
||||
/* OOB Device Password */
|
||||
{ "102c001611223344556677889900112233445566778899000007", 0, 0 },
|
||||
{ "102c0036112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344", 0, 0 },
|
||||
{ "102c0001ff", -1, 0 },
|
||||
{ "102c003711223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455", -1, 0 },
|
||||
{ "102c002511223344556677889900112233445566778899001122334455667788990011223344556677", -1, 0 },
|
||||
/* OS Version */
|
||||
{ "102d000411223344", 0, 0 },
|
||||
{ "102d00111122334455667788990011223344556677", -1, 0 },
|
||||
/* WPS State */
|
||||
{ "1044000101", 0, 0 },
|
||||
{ "10440002ffff", -1, 0 },
|
||||
/* Authenticator */
|
||||
{ "100500081122334455667788", 0, 0 },
|
||||
{ "10050000", -1, 0 },
|
||||
{ "100500111122334455667788990011223344556677", -1, 0 },
|
||||
/* R-Hash1 */
|
||||
{ "103d00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
|
||||
{ "103d0000", -1, 0 },
|
||||
{ "103d0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
|
||||
/* R-Hash2 */
|
||||
{ "103e00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
|
||||
{ "103e0000", -1, 0 },
|
||||
{ "103e0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
|
||||
/* E-Hash1 */
|
||||
{ "101400201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
|
||||
{ "10140000", -1, 0 },
|
||||
{ "10140021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
|
||||
/* E-Hash2 */
|
||||
{ "101500201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
|
||||
{ "10150000", -1, 0 },
|
||||
{ "10150021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
|
||||
/* R-SNonce1 */
|
||||
{ "103f001011223344556677889900112233445566", 0, 0 },
|
||||
{ "103f0000", -1, 0 },
|
||||
{ "103f00111122334455667788990011223344556677", -1, 0 },
|
||||
/* R-SNonce2 */
|
||||
{ "1040001011223344556677889900112233445566", 0, 0 },
|
||||
{ "10400000", -1, 0 },
|
||||
{ "104000111122334455667788990011223344556677", -1, 0 },
|
||||
/* E-SNonce1 */
|
||||
{ "1016001011223344556677889900112233445566", 0, 0 },
|
||||
{ "10160000", -1, 0 },
|
||||
{ "101600111122334455667788990011223344556677", -1, 0 },
|
||||
/* E-SNonce2 */
|
||||
{ "1017001011223344556677889900112233445566", 0, 0 },
|
||||
{ "10170000", -1, 0 },
|
||||
{ "101700111122334455667788990011223344556677", -1, 0 },
|
||||
/* Key Wrap Authenticator */
|
||||
{ "101e00081122334455667788", 0, 0 },
|
||||
{ "101e0000", -1, 0 },
|
||||
{ "101e0009112233445566778899", -1, 0 },
|
||||
/* Authentication Type */
|
||||
{ "100300020001", 0, 0 },
|
||||
{ "10030001ff", -1, 0 },
|
||||
/* Encryption Type */
|
||||
{ "100f00020001", 0, 0 },
|
||||
{ "100f0001ff", -1, 0 },
|
||||
/* Network Index */
|
||||
{ "1026000101", 0, 0 },
|
||||
{ "10260002ffff", -1, 0 },
|
||||
/* Network Key Index */
|
||||
{ "1028000101", 0, 3 },
|
||||
{ "10280002ffff", -1, 0 },
|
||||
/* MAC Address */
|
||||
{ "10200006112233445566", 0, 0 },
|
||||
{ "10200000", -1, 0 },
|
||||
{ "1020000711223344556677", -1, 0 },
|
||||
/* Selected Registrar */
|
||||
{ "1041000101", 0, 0 },
|
||||
{ "10410002ffff", -1, 0 },
|
||||
/* Request Type */
|
||||
{ "103a000101", 0, 0 },
|
||||
{ "103a0002ffff", -1, 0 },
|
||||
/* Response Type */
|
||||
{ "103b000101", 0, 0 },
|
||||
{ "103b0002ffff", -1, 0 },
|
||||
/* Manufacturer */
|
||||
{ "10210000", 0, 0 },
|
||||
/* Model Name */
|
||||
{ "10230000", 0, 0 },
|
||||
/* Model Number */
|
||||
{ "10240000", 0, 0 },
|
||||
/* Serial Number */
|
||||
{ "10420000", 0, 0 },
|
||||
/* Device Name */
|
||||
{ "10110000", 0, 0 },
|
||||
/* Public Key */
|
||||
{ "10320000", 0, 0 },
|
||||
/* Enc Settings */
|
||||
{ "10180000", 0, 0 },
|
||||
/* SSID */
|
||||
{ "10450000", 0, 0 },
|
||||
/* AP Setup Locked */
|
||||
{ "1057000101", 0, 0 },
|
||||
{ "10570002ffff", -1, 0 },
|
||||
/* Requested Device Type */
|
||||
{ "106a00081122334455667788", 0, 0 },
|
||||
{ "106a0000", -1, 0 },
|
||||
{ "106a0009112233445566778899", -1, 0 },
|
||||
/* More than maximum Requested Device Type attributes */
|
||||
{ "106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788", 0, 4 },
|
||||
/* Secondary Device Type List */
|
||||
{ "105500081122334455667788", 0, 0 },
|
||||
{ "1055000711223344556677", -1, 0 },
|
||||
{ "1055008811223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566", -1, 0 },
|
||||
/* AP Channel */
|
||||
{ "100100020001", 0, 0 },
|
||||
{ "1001000101", -1, 0 },
|
||||
/* Skip invalid Vendor Extension */
|
||||
{ "10490000", 0, 0 },
|
||||
{ "1049000100", 0, 0 },
|
||||
{ "104900020000", 0, 0 },
|
||||
/* Too long unknown vendor extension */
|
||||
{ "10490401"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"112233445566778899001122334455667788990011223344556677889900"
|
||||
"1122334455", -1, 0 },
|
||||
/* Maximum unknown vendor extensions */
|
||||
{ "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA", 0, 5 },
|
||||
/* More than maximum unknown vendor extensions */
|
||||
{ "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA10490003BBBBBB", -1, 0 },
|
||||
/* WFA vendor extensions */
|
||||
{ "1049000300372a", 0, 0 },
|
||||
{ "1049000400372a00", 0, 0 },
|
||||
{ "1049000500372a0001", 0, 0 },
|
||||
{ "1049001600372a0001ff0100020101030101040101ff00fe0101", 0, 6 },
|
||||
/* Invalid Version2 length */
|
||||
{ "1049000500372a0000", -1, 0 },
|
||||
/* Invalid Network Key Shareable length */
|
||||
{ "1049000500372a0200", -1, 0 },
|
||||
/* Invalid Requedt To Enroll length */
|
||||
{ "1049000500372a0300", -1, 0 },
|
||||
/* Invalid Settings Delay Time length */
|
||||
{ "1049000500372a0400", -1, 0 },
|
||||
/* More than maximum Credential attributes */
|
||||
{ "100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000", 0, 2 },
|
||||
};
|
||||
|
||||
|
||||
static int wps_attr_parse_tests(void)
|
||||
{
|
||||
struct wps_parse_attr attr;
|
||||
unsigned int i;
|
||||
int ret = 0;
|
||||
|
||||
wpa_printf(MSG_INFO, "WPS attribute parsing tests");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(wps_attr_parse_test_cases); i++) {
|
||||
struct wpabuf *buf;
|
||||
size_t len;
|
||||
struct wps_attr_parse_test *test =
|
||||
&wps_attr_parse_test_cases[i];
|
||||
|
||||
len = os_strlen(test->data) / 2;
|
||||
buf = wpabuf_alloc(len);
|
||||
if (buf == NULL)
|
||||
return -1;
|
||||
if (hexstr2bin(test->data, wpabuf_put(buf, len), len) < 0) {
|
||||
wpabuf_free(buf);
|
||||
return -1;
|
||||
}
|
||||
if (wps_parse_msg(buf, &attr) != test->result) {
|
||||
wpa_printf(MSG_ERROR, "WPS attribute parsing test %u failed: %s",
|
||||
i, test->data);
|
||||
ret = -1;
|
||||
}
|
||||
switch (test->extra) {
|
||||
case 1:
|
||||
if (!attr.network_key || !attr.ap_setup_locked)
|
||||
ret = -1;
|
||||
break;
|
||||
case 2:
|
||||
if (attr.num_cred != MAX_CRED_COUNT)
|
||||
ret = -1;
|
||||
break;
|
||||
case 3:
|
||||
if (!attr.network_key_idx)
|
||||
ret = -1;
|
||||
break;
|
||||
case 4:
|
||||
if (attr.num_req_dev_type != MAX_REQ_DEV_TYPE_COUNT)
|
||||
ret = -1;
|
||||
break;
|
||||
case 5:
|
||||
if (attr.num_vendor_ext != MAX_WPS_PARSE_VENDOR_EXT)
|
||||
ret = -1;
|
||||
break;
|
||||
case 6:
|
||||
if (!attr.version2 ||
|
||||
!attr.authorized_macs ||
|
||||
!attr.network_key_shareable ||
|
||||
!attr.request_to_enroll ||
|
||||
!attr.settings_delay_time)
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
wpabuf_free(buf);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int wps_module_tests(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
wpa_printf(MSG_INFO, "WPS module tests");
|
||||
|
||||
if (wps_attr_parse_tests() < 0)
|
||||
ret = -1;
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -100,6 +100,9 @@ OBJS_c += ../src/utils/os_$(CONFIG_OS).o
|
|||
ifdef CONFIG_MODULE_TESTS
|
||||
CFLAGS += -DCONFIG_MODULE_TESTS
|
||||
OBJS += wpas_module_tests.o
|
||||
ifdef CONFIG_WPS
|
||||
OBJS += ../src/wps/wps_module_tests.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef CONFIG_WPA_TRACE
|
||||
|
|
|
@ -12,6 +12,17 @@
|
|||
|
||||
int wpas_module_tests(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
wpa_printf(MSG_INFO, "wpa_supplicant module tests");
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_WPS
|
||||
{
|
||||
int wps_module_tests(void);
|
||||
if (wps_module_tests() < 0)
|
||||
ret = -1;
|
||||
}
|
||||
#endif /* CONFIG_WPS */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue