LCOV - code coverage report
Current view: top level - src/wps - wps_module_tests.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1401264779 Lines: 34 46 73.9 %
Date: 2014-05-28 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*
       2             :  * WPS module tests
       3             :  * Copyright (c) 2014, 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 "wps_attr_parse.h"
      13             : 
      14             : struct wps_attr_parse_test {
      15             :         const char *data;
      16             :         int result;
      17             :         int extra;
      18             : };
      19             : 
      20             : struct wps_attr_parse_test wps_attr_parse_test_cases[] = {
      21             :         /* Empty message */
      22             :         { "", 0, 0 },
      23             :         /* Truncated attribute header */
      24             :         { "10", -1, 0 },
      25             :         { "1010", -1, 0 },
      26             :         { "101000", -1, 0 },
      27             :         /* Attribute overflow */
      28             :         { "10100001", -1, 0 },
      29             : #ifdef CONFIG_WPS_STRICT
      30             :         { "10270000001057000101", -1, 0 },
      31             :         { "1027000010570001010000000000", -1, 0 },
      32             : #else /* CONFIG_WPS_STRICT */
      33             :         /* Network Key workaround */
      34             :         { "10270000001057000101", 0, 1 },
      35             :         { "10230000001057000101", -1, 0 },
      36             :         { "10270000101057000101", -1, 0 },
      37             :         /* Mac OS X 10.6 padding workaround */
      38             :         { "1027000010570001010000000000", 0, 1 },
      39             :         { "1027000010570001010000000000000001000000", -1, 0 },
      40             : #endif /* CONFIG_WPS_STRICT */
      41             :         /* Version */
      42             :         { "104a000110", 0, 0 },
      43             :         { "104a0000", -1, 0 },
      44             :         /* Message Type */
      45             :         { "1022000101", 0, 0 },
      46             :         { "10220000", -1, 0 },
      47             :         /* Enrollee Nonce */
      48             :         { "101a001000112233445566778899aabbccddeeff", 0, 0 },
      49             :         { "101a00111122334455667788990011223344556677", -1, 0 },
      50             :         /* Registrar Nonce */
      51             :         { "1039001000112233445566778899aabbccddeeff", 0, 0 },
      52             :         { "103900111122334455667788990011223344556677", -1, 0 },
      53             :         /* UUID-E */
      54             :         { "1047001000112233445566778899aabbccddeeff", 0, 0 },
      55             :         { "10470000", -1, 0 },
      56             :         { "104700111122334455667788990011223344556677", -1, 0 },
      57             :         /* UUID-R */
      58             :         { "1048001000112233445566778899aabbccddeeff", 0, 0 },
      59             :         { "10480000", -1, 0 },
      60             :         { "104800111122334455667788990011223344556677", -1, 0 },
      61             :         /* Auth Type Flags */
      62             :         { "100400021122", 0, 0 },
      63             :         { "10040001ff", -1, 0 },
      64             :         /* Encr Type Flags */
      65             :         { "101000021122", 0, 0 },
      66             :         { "10100001ff", -1, 0 },
      67             :         /* Connection Type Flags */
      68             :         { "100d0001ff", 0, 0 },
      69             :         { "100d0002ffff", -1, 0 },
      70             :         /* Config Methods */
      71             :         { "10080002ffff", 0, 0 },
      72             :         { "10080001ff", -1, 0 },
      73             :         /* Selected Registrar Config Methods */
      74             :         { "10530002ffff", 0, 0 },
      75             :         { "10530001ff", -1, 0 },
      76             :         /* Primary Device Type */
      77             :         { "105400081122334455667788", 0, 0 },
      78             :         { "105400111122334455667788990011223344556677", -1, 0 },
      79             :         /* RF Bands */
      80             :         { "103c0001ff", 0, 0 },
      81             :         { "103c0002ffff", -1, 0 },
      82             :         /* Association State */
      83             :         { "10020002ffff", 0, 0 },
      84             :         { "10020001ff", -1, 0 },
      85             :         /* Config Error */
      86             :         { "100900020001", 0, 0 },
      87             :         { "10090001ff", -1, 0 },
      88             :         /* Device Password ID */
      89             :         { "101200020004", 0, 0 },
      90             :         { "10120001ff", -1, 0 },
      91             :         /* OOB Device Password */
      92             :         { "102c001611223344556677889900112233445566778899000007", 0, 0 },
      93             :         { "102c0036112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344", 0, 0 },
      94             :         { "102c0001ff", -1, 0 },
      95             :         { "102c003711223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455", -1, 0 },
      96             :         { "102c002511223344556677889900112233445566778899001122334455667788990011223344556677", -1, 0 },
      97             :         /* OS Version */
      98             :         { "102d000411223344", 0, 0 },
      99             :         { "102d00111122334455667788990011223344556677", -1, 0 },
     100             :         /* WPS State */
     101             :         { "1044000101", 0, 0 },
     102             :         { "10440002ffff", -1, 0 },
     103             :         /* Authenticator */
     104             :         { "100500081122334455667788", 0, 0 },
     105             :         { "10050000", -1, 0 },
     106             :         { "100500111122334455667788990011223344556677", -1, 0 },
     107             :         /* R-Hash1 */
     108             :         { "103d00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
     109             :         { "103d0000", -1, 0 },
     110             :         { "103d0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
     111             :         /* R-Hash2 */
     112             :         { "103e00201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
     113             :         { "103e0000", -1, 0 },
     114             :         { "103e0021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
     115             :         /* E-Hash1 */
     116             :         { "101400201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
     117             :         { "10140000", -1, 0 },
     118             :         { "10140021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
     119             :         /* E-Hash2 */
     120             :         { "101500201122334455667788990011223344556677889900112233445566778899001122", 0, 0 },
     121             :         { "10150000", -1, 0 },
     122             :         { "10150021112233445566778899001122334455667788990011223344556677889900112233", -1, 0 },
     123             :         /* R-SNonce1 */
     124             :         { "103f001011223344556677889900112233445566", 0, 0 },
     125             :         { "103f0000", -1, 0 },
     126             :         { "103f00111122334455667788990011223344556677", -1, 0 },
     127             :         /* R-SNonce2 */
     128             :         { "1040001011223344556677889900112233445566", 0, 0 },
     129             :         { "10400000", -1, 0 },
     130             :         { "104000111122334455667788990011223344556677", -1, 0 },
     131             :         /* E-SNonce1 */
     132             :         { "1016001011223344556677889900112233445566", 0, 0 },
     133             :         { "10160000", -1, 0 },
     134             :         { "101600111122334455667788990011223344556677", -1, 0 },
     135             :         /* E-SNonce2 */
     136             :         { "1017001011223344556677889900112233445566", 0, 0 },
     137             :         { "10170000", -1, 0 },
     138             :         { "101700111122334455667788990011223344556677", -1, 0 },
     139             :         /* Key Wrap Authenticator */
     140             :         { "101e00081122334455667788", 0, 0 },
     141             :         { "101e0000", -1, 0 },
     142             :         { "101e0009112233445566778899", -1, 0 },
     143             :         /* Authentication Type */
     144             :         { "100300020001", 0, 0 },
     145             :         { "10030001ff", -1, 0 },
     146             :         /* Encryption Type */
     147             :         { "100f00020001", 0, 0 },
     148             :         { "100f0001ff", -1, 0 },
     149             :         /* Network Index */
     150             :         { "1026000101", 0, 0 },
     151             :         { "10260002ffff", -1, 0 },
     152             :         /* Network Key Index */
     153             :         { "1028000101", 0, 3 },
     154             :         { "10280002ffff", -1, 0 },
     155             :         /* MAC Address */
     156             :         { "10200006112233445566", 0, 0 },
     157             :         { "10200000", -1, 0 },
     158             :         { "1020000711223344556677", -1, 0 },
     159             :         /* Selected Registrar */
     160             :         { "1041000101", 0, 0 },
     161             :         { "10410002ffff", -1, 0 },
     162             :         /* Request Type */
     163             :         { "103a000101", 0, 0 },
     164             :         { "103a0002ffff", -1, 0 },
     165             :         /* Response Type */
     166             :         { "103b000101", 0, 0 },
     167             :         { "103b0002ffff", -1, 0 },
     168             :         /* Manufacturer */
     169             :         { "10210000", 0, 0 },
     170             :         /* Model Name */
     171             :         { "10230000", 0, 0 },
     172             :         /* Model Number */
     173             :         { "10240000", 0, 0 },
     174             :         /* Serial Number */
     175             :         { "10420000", 0, 0 },
     176             :         /* Device Name */
     177             :         { "10110000", 0, 0 },
     178             :         /* Public Key */
     179             :         { "10320000", 0, 0 },
     180             :         /* Enc Settings */
     181             :         { "10180000", 0, 0 },
     182             :         /* SSID */
     183             :         { "10450000", 0, 0 },
     184             :         /* AP Setup Locked */
     185             :         { "1057000101", 0, 0 },
     186             :         { "10570002ffff", -1, 0 },
     187             :         /* Requested Device Type */
     188             :         { "106a00081122334455667788", 0, 0 },
     189             :         { "106a0000", -1, 0 },
     190             :         { "106a0009112233445566778899", -1, 0 },
     191             :         /* More than maximum Requested Device Type attributes */
     192             :         { "106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788106a00081122334455667788", 0, 4 },
     193             :         /* Secondary Device Type List */
     194             :         { "105500081122334455667788", 0, 0 },
     195             :         { "1055000711223344556677", -1, 0 },
     196             :         { "1055008811223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566", -1, 0 },
     197             :         /* AP Channel */
     198             :         { "100100020001", 0, 0 },
     199             :         { "1001000101", -1, 0 },
     200             :         /* Skip invalid Vendor Extension */
     201             :         { "10490000", 0, 0 },
     202             :         { "1049000100", 0, 0 },
     203             :         { "104900020000", 0, 0 },
     204             :         /* Too long unknown vendor extension */
     205             :         { "10490401"
     206             :           "112233445566778899001122334455667788990011223344556677889900"
     207             :           "112233445566778899001122334455667788990011223344556677889900"
     208             :           "112233445566778899001122334455667788990011223344556677889900"
     209             :           "112233445566778899001122334455667788990011223344556677889900"
     210             :           "112233445566778899001122334455667788990011223344556677889900"
     211             :           "112233445566778899001122334455667788990011223344556677889900"
     212             :           "112233445566778899001122334455667788990011223344556677889900"
     213             :           "112233445566778899001122334455667788990011223344556677889900"
     214             :           "112233445566778899001122334455667788990011223344556677889900"
     215             :           "112233445566778899001122334455667788990011223344556677889900"
     216             :           "112233445566778899001122334455667788990011223344556677889900"
     217             :           "112233445566778899001122334455667788990011223344556677889900"
     218             :           "112233445566778899001122334455667788990011223344556677889900"
     219             :           "112233445566778899001122334455667788990011223344556677889900"
     220             :           "112233445566778899001122334455667788990011223344556677889900"
     221             :           "112233445566778899001122334455667788990011223344556677889900"
     222             :           "112233445566778899001122334455667788990011223344556677889900"
     223             :           "112233445566778899001122334455667788990011223344556677889900"
     224             :           "112233445566778899001122334455667788990011223344556677889900"
     225             :           "112233445566778899001122334455667788990011223344556677889900"
     226             :           "112233445566778899001122334455667788990011223344556677889900"
     227             :           "112233445566778899001122334455667788990011223344556677889900"
     228             :           "112233445566778899001122334455667788990011223344556677889900"
     229             :           "112233445566778899001122334455667788990011223344556677889900"
     230             :           "112233445566778899001122334455667788990011223344556677889900"
     231             :           "112233445566778899001122334455667788990011223344556677889900"
     232             :           "112233445566778899001122334455667788990011223344556677889900"
     233             :           "112233445566778899001122334455667788990011223344556677889900"
     234             :           "112233445566778899001122334455667788990011223344556677889900"
     235             :           "112233445566778899001122334455667788990011223344556677889900"
     236             :           "112233445566778899001122334455667788990011223344556677889900"
     237             :           "112233445566778899001122334455667788990011223344556677889900"
     238             :           "112233445566778899001122334455667788990011223344556677889900"
     239             :           "112233445566778899001122334455667788990011223344556677889900"
     240             :           "1122334455", -1, 0 },
     241             :         /* Maximum unknown vendor extensions */
     242             :         { "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA", 0, 5 },
     243             :         /* More than maximum unknown vendor extensions */
     244             :         { "10490003111111104900032222221049000333333310490003444444104900035555551049000366666610490003777777104900038888881049000399999910490003AAAAAA10490003BBBBBB", -1, 0 },
     245             :         /* WFA vendor extensions */
     246             :         { "1049000300372a", 0, 0 },
     247             :         { "1049000400372a00", 0, 0 },
     248             :         { "1049000500372a0001", 0, 0 },
     249             :         { "1049001600372a0001ff0100020101030101040101ff00fe0101", 0, 6 },
     250             :         /* Invalid Version2 length */
     251             :         { "1049000500372a0000", -1, 0 },
     252             :         /* Invalid Network Key Shareable length */
     253             :         { "1049000500372a0200", -1, 0 },
     254             :         /* Invalid Requedt To Enroll length */
     255             :         { "1049000500372a0300", -1, 0 },
     256             :         /* Invalid Settings Delay Time length */
     257             :         { "1049000500372a0400", -1, 0 },
     258             :         /* More than maximum Credential attributes */
     259             :         { "100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000100e0000", 0, 2 },
     260             : };
     261             : 
     262             : 
     263           1 : static int wps_attr_parse_tests(void)
     264             : {
     265             :         struct wps_parse_attr attr;
     266             :         unsigned int i;
     267           1 :         int ret = 0;
     268             : 
     269           1 :         wpa_printf(MSG_INFO, "WPS attribute parsing tests");
     270             : 
     271         135 :         for (i = 0; i < ARRAY_SIZE(wps_attr_parse_test_cases); i++) {
     272             :                 struct wpabuf *buf;
     273             :                 size_t len;
     274         134 :                 struct wps_attr_parse_test *test =
     275             :                         &wps_attr_parse_test_cases[i];
     276             : 
     277         134 :                 len = os_strlen(test->data) / 2;
     278         134 :                 buf = wpabuf_alloc(len);
     279         134 :                 if (buf == NULL)
     280           0 :                         return -1;
     281         134 :                 if (hexstr2bin(test->data, wpabuf_put(buf, len), len) < 0) {
     282           0 :                         wpabuf_free(buf);
     283           0 :                         return -1;
     284             :                 }
     285         134 :                 if (wps_parse_msg(buf, &attr) != test->result) {
     286           0 :                         wpa_printf(MSG_ERROR, "WPS attribute parsing test %u failed: %s",
     287             :                                    i, test->data);
     288           0 :                         ret = -1;
     289             :                 }
     290         134 :                 switch (test->extra) {
     291             :                 case 1:
     292           2 :                         if (!attr.network_key || !attr.ap_setup_locked)
     293           0 :                                 ret = -1;
     294           2 :                         break;
     295             :                 case 2:
     296           1 :                         if (attr.num_cred != MAX_CRED_COUNT)
     297           0 :                                 ret = -1;
     298           1 :                         break;
     299             :                 case 3:
     300           1 :                         if (!attr.network_key_idx)
     301           0 :                                 ret = -1;
     302           1 :                         break;
     303             :                 case 4:
     304           1 :                         if (attr.num_req_dev_type != MAX_REQ_DEV_TYPE_COUNT)
     305           0 :                                 ret = -1;
     306           1 :                         break;
     307             :                 case 5:
     308           1 :                         if (attr.num_vendor_ext != MAX_WPS_PARSE_VENDOR_EXT)
     309           0 :                                 ret = -1;
     310           1 :                         break;
     311             :                 case 6:
     312           2 :                         if (!attr.version2 ||
     313           2 :                             !attr.authorized_macs ||
     314           2 :                             !attr.network_key_shareable ||
     315           2 :                             !attr.request_to_enroll ||
     316           1 :                             !attr.settings_delay_time)
     317           0 :                                 ret = -1;
     318           1 :                         break;
     319             :                 }
     320         134 :                 wpabuf_free(buf);
     321             :         }
     322             : 
     323           1 :         return ret;
     324             : }
     325             : 
     326             : 
     327           1 : int wps_module_tests(void)
     328             : {
     329           1 :         int ret = 0;
     330             : 
     331           1 :         wpa_printf(MSG_INFO, "WPS module tests");
     332             : 
     333           1 :         if (wps_attr_parse_tests() < 0)
     334           0 :                 ret = -1;
     335             : 
     336           1 :         return ret;
     337             : }

Generated by: LCOV version 1.10