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 const 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 static int wps_attr_parse_tests(void) 264 { 265 struct wps_parse_attr attr; 266 unsigned int i; 267 int ret = 0; 268 269 wpa_printf(MSG_INFO, "WPS attribute parsing tests"); 270 271 for (i = 0; i < ARRAY_SIZE(wps_attr_parse_test_cases); i++) { 272 struct wpabuf *buf; 273 size_t len; 274 const struct wps_attr_parse_test *test = 275 &wps_attr_parse_test_cases[i]; 276 277 len = os_strlen(test->data) / 2; 278 buf = wpabuf_alloc(len); 279 if (buf == NULL) 280 return -1; 281 if (hexstr2bin(test->data, wpabuf_put(buf, len), len) < 0) { 282 wpabuf_free(buf); 283 return -1; 284 } 285 if (wps_parse_msg(buf, &attr) != test->result) { 286 wpa_printf(MSG_ERROR, "WPS attribute parsing test %u failed: %s", 287 i, test->data); 288 ret = -1; 289 } 290 switch (test->extra) { 291 case 1: 292 if (!attr.network_key || !attr.ap_setup_locked) 293 ret = -1; 294 break; 295 case 2: 296 if (attr.num_cred != MAX_CRED_COUNT) 297 ret = -1; 298 break; 299 case 3: 300 if (!attr.network_key_idx) 301 ret = -1; 302 break; 303 case 4: 304 if (attr.num_req_dev_type != MAX_REQ_DEV_TYPE_COUNT) 305 ret = -1; 306 break; 307 case 5: 308 if (attr.num_vendor_ext != MAX_WPS_PARSE_VENDOR_EXT) 309 ret = -1; 310 break; 311 case 6: 312 if (!attr.version2 || 313 !attr.authorized_macs || 314 !attr.network_key_shareable || 315 !attr.request_to_enroll || 316 !attr.settings_delay_time) 317 ret = -1; 318 break; 319 } 320 wpabuf_free(buf); 321 } 322 323 return ret; 324 } 325 326 327 int wps_module_tests(void) 328 { 329 int ret = 0; 330 331 wpa_printf(MSG_INFO, "WPS module tests"); 332 333 if (wps_attr_parse_tests() < 0) 334 ret = -1; 335 336 return ret; 337 } 338