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 1393793999 Lines: 35 47 74.5 %
Date: 2014-03-02 Functions: 2 2 100.0 %
Branches: 24 39 61.5 %

           Branch data     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                 :        134 :                         &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 [ +  - ][ +  - ]:          1 :                         if (!attr.version2 ||
     313         [ +  - ]:          1 :                             !attr.authorized_macs ||
     314         [ +  - ]:          1 :                             !attr.network_key_shareable ||
     315         [ -  + ]:          1 :                             !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.9