Updated to hostap_2_6
[mech_eap.git] / libeap / src / wps / wps_module_tests.c
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
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
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 }