Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[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 "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 }