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