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