| /* |
| * 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 "utils/module_tests.h" |
| #include "wps_attr_parse.h" |
| |
| struct wps_attr_parse_test { |
| const char *data; |
| int result; |
| int extra; |
| }; |
| |
| static const 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; |
| const 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; |
| } |