Workaround number of compiler warnings with newer MinGW version
[libeap.git] / src / wps / wps_registrar.c
1 /*
2  * Wi-Fi Protected Setup - Registrar
3  * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #include "includes.h"
16
17 #include "common.h"
18 #include "sha256.h"
19 #include "base64.h"
20 #include "ieee802_11_defs.h"
21 #include "eloop.h"
22 #include "wps_i.h"
23 #include "wps_dev_attr.h"
24
25
26 struct wps_uuid_pin {
27         struct wps_uuid_pin *next;
28         u8 uuid[WPS_UUID_LEN];
29         int wildcard_uuid;
30         u8 *pin;
31         size_t pin_len;
32         int locked;
33 };
34
35
36 static void wps_free_pin(struct wps_uuid_pin *pin)
37 {
38         os_free(pin->pin);
39         os_free(pin);
40 }
41
42
43 static void wps_free_pins(struct wps_uuid_pin *pins)
44 {
45         struct wps_uuid_pin *pin, *prev;
46
47         pin = pins;
48         while (pin) {
49                 prev = pin;
50                 pin = pin->next;
51                 wps_free_pin(prev);
52         }
53 }
54
55
56 struct wps_pbc_session {
57         struct wps_pbc_session *next;
58         u8 addr[ETH_ALEN];
59         u8 uuid_e[WPS_UUID_LEN];
60         struct os_time timestamp;
61 };
62
63
64 static void wps_free_pbc_sessions(struct wps_pbc_session *pbc)
65 {
66         struct wps_pbc_session *prev;
67
68         while (pbc) {
69                 prev = pbc;
70                 pbc = pbc->next;
71                 os_free(prev);
72         }
73 }
74
75
76 struct wps_registrar {
77         struct wps_context *wps;
78
79         int pbc;
80         int selected_registrar;
81
82         int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *psk,
83                           size_t psk_len);
84         int (*set_ie_cb)(void *ctx, const u8 *beacon_ie, size_t beacon_ie_len,
85                          const u8 *probe_resp_ie, size_t probe_resp_ie_len);
86         void (*pin_needed_cb)(void *ctx, const u8 *uuid_e,
87                               const struct wps_device_data *dev);
88         void *cb_ctx;
89
90         struct wps_uuid_pin *pins;
91         struct wps_pbc_session *pbc_sessions;
92 };
93
94
95 static int wps_set_ie(struct wps_registrar *reg);
96 static void wps_registrar_pbc_timeout(void *eloop_ctx, void *timeout_ctx);
97
98
99 static void wps_registrar_add_pbc_session(struct wps_registrar *reg,
100                                           const u8 *addr, const u8 *uuid_e)
101 {
102         struct wps_pbc_session *pbc, *prev = NULL;
103         struct os_time now;
104
105         os_get_time(&now);
106
107         pbc = reg->pbc_sessions;
108         while (pbc) {
109                 if (os_memcmp(pbc->addr, addr, ETH_ALEN) == 0 &&
110                     os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0) {
111                         if (prev)
112                                 prev->next = pbc->next;
113                         else
114                                 reg->pbc_sessions = pbc->next;
115                         break;
116                 }
117                 prev = pbc;
118                 pbc = pbc->next;
119         }
120
121         if (!pbc) {
122                 pbc = os_zalloc(sizeof(*pbc));
123                 if (pbc == NULL)
124                         return;
125                 os_memcpy(pbc->addr, addr, ETH_ALEN);
126                 if (uuid_e)
127                         os_memcpy(pbc->uuid_e, uuid_e, WPS_UUID_LEN);
128         }
129
130         pbc->next = reg->pbc_sessions;
131         reg->pbc_sessions = pbc;
132         pbc->timestamp = now;
133
134         /* remove entries that have timed out */
135         prev = pbc;
136         pbc = pbc->next;
137
138         while (pbc) {
139                 if (now.sec > pbc->timestamp.sec + WPS_PBC_WALK_TIME) {
140                         prev->next = NULL;
141                         wps_free_pbc_sessions(pbc);
142                         break;
143                 }
144                 prev = pbc;
145                 pbc = pbc->next;
146         }
147 }
148
149
150 static void wps_registrar_remove_pbc_session(struct wps_registrar *reg,
151                                              const u8 *addr, const u8 *uuid_e)
152 {
153         struct wps_pbc_session *pbc, *prev = NULL;
154
155         pbc = reg->pbc_sessions;
156         while (pbc) {
157                 if (os_memcmp(pbc->addr, addr, ETH_ALEN) == 0 &&
158                     os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0) {
159                         if (prev)
160                                 prev->next = pbc->next;
161                         else
162                                 reg->pbc_sessions = pbc->next;
163                         os_free(pbc);
164                         break;
165                 }
166                 prev = pbc;
167                 pbc = pbc->next;
168         }
169 }
170
171
172 int wps_registrar_pbc_overlap(struct wps_registrar *reg,
173                               const u8 *addr, const u8 *uuid_e)
174 {
175         int count = 0;
176         struct wps_pbc_session *pbc;
177         struct os_time now;
178
179         os_get_time(&now);
180
181         for (pbc = reg->pbc_sessions; pbc; pbc = pbc->next) {
182                 if (now.sec > pbc->timestamp.sec + WPS_PBC_WALK_TIME)
183                         break;
184                 if (addr == NULL || os_memcmp(addr, pbc->addr, ETH_ALEN) ||
185                     uuid_e == NULL ||
186                     os_memcmp(uuid_e, pbc->uuid_e, WPS_UUID_LEN))
187                         count++;
188         }
189
190         if (addr || uuid_e)
191                 count++;
192
193         return count > 1 ? 1 : 0;
194 }
195
196
197 static int wps_build_wps_state(struct wps_context *wps, struct wpabuf *msg)
198 {
199         wpa_printf(MSG_DEBUG, "WPS:  * Wi-Fi Protected Setup State (%d)",
200                    wps->wps_state);
201         wpabuf_put_be16(msg, ATTR_WPS_STATE);
202         wpabuf_put_be16(msg, 1);
203         wpabuf_put_u8(msg, wps->wps_state);
204         return 0;
205 }
206
207
208 static int wps_build_ap_setup_locked(struct wps_context *wps,
209                                      struct wpabuf *msg)
210 {
211         if (wps->ap_setup_locked) {
212                 wpa_printf(MSG_DEBUG, "WPS:  * AP Setup Locked");
213                 wpabuf_put_be16(msg, ATTR_AP_SETUP_LOCKED);
214                 wpabuf_put_be16(msg, 1);
215                 wpabuf_put_u8(msg, 1);
216         }
217         return 0;
218 }
219
220
221 static int wps_build_selected_registrar(struct wps_registrar *reg,
222                                         struct wpabuf *msg)
223 {
224         if (!reg->selected_registrar)
225                 return 0;
226         wpa_printf(MSG_DEBUG, "WPS:  * Selected Registrar");
227         wpabuf_put_be16(msg, ATTR_SELECTED_REGISTRAR);
228         wpabuf_put_be16(msg, 1);
229         wpabuf_put_u8(msg, 1);
230         return 0;
231 }
232
233
234 static int wps_build_sel_reg_dev_password_id(struct wps_registrar *reg,
235                                              struct wpabuf *msg)
236 {
237         u16 id = reg->pbc ? DEV_PW_PUSHBUTTON : DEV_PW_DEFAULT;
238         if (!reg->selected_registrar)
239                 return 0;
240         wpa_printf(MSG_DEBUG, "WPS:  * Device Password ID (%d)", id);
241         wpabuf_put_be16(msg, ATTR_DEV_PASSWORD_ID);
242         wpabuf_put_be16(msg, 2);
243         wpabuf_put_be16(msg, id);
244         return 0;
245 }
246
247
248 static int wps_build_sel_reg_config_methods(struct wps_registrar *reg,
249                                             struct wpabuf *msg)
250 {
251         u16 methods;
252         if (!reg->selected_registrar)
253                 return 0;
254         methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON;
255         if (reg->pbc)
256                 methods |= WPS_CONFIG_PUSHBUTTON;
257         wpa_printf(MSG_DEBUG, "WPS:  * Selected Registrar Config Methods (%x)",
258                    methods);
259         wpabuf_put_be16(msg, ATTR_SELECTED_REGISTRAR_CONFIG_METHODS);
260         wpabuf_put_be16(msg, 2);
261         wpabuf_put_be16(msg, methods);
262         return 0;
263 }
264
265
266 static int wps_build_probe_config_methods(struct wps_registrar *reg,
267                                           struct wpabuf *msg)
268 {
269         u16 methods;
270         methods = 0;
271         wpa_printf(MSG_DEBUG, "WPS:  * Config Methods (%x)", methods);
272         wpabuf_put_be16(msg, ATTR_CONFIG_METHODS);
273         wpabuf_put_be16(msg, 2);
274         wpabuf_put_be16(msg, methods);
275         return 0;
276 }
277
278
279 static int wps_build_config_methods_r(struct wps_registrar *reg,
280                                       struct wpabuf *msg)
281 {
282         u16 methods;
283         methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON;
284         if (reg->pbc)
285                 methods |= WPS_CONFIG_PUSHBUTTON;
286         return wps_build_config_methods(msg, methods);
287 }
288
289
290 static int wps_build_resp_type(struct wps_registrar *reg, struct wpabuf *msg)
291 {
292         u8 resp = reg->wps->ap ? WPS_RESP_AP : WPS_RESP_REGISTRAR;
293         wpa_printf(MSG_DEBUG, "WPS:  * Response Type (%d)", resp);
294         wpabuf_put_be16(msg, ATTR_RESPONSE_TYPE);
295         wpabuf_put_be16(msg, 1);
296         wpabuf_put_u8(msg, resp);
297         return 0;
298 }
299
300
301 struct wps_registrar *
302 wps_registrar_init(struct wps_context *wps,
303                    const struct wps_registrar_config *cfg)
304 {
305         struct wps_registrar *reg = os_zalloc(sizeof(*reg));
306         if (reg == NULL)
307                 return NULL;
308
309         reg->wps = wps;
310         reg->new_psk_cb = cfg->new_psk_cb;
311         reg->set_ie_cb = cfg->set_ie_cb;
312         reg->pin_needed_cb = cfg->pin_needed_cb;
313         reg->cb_ctx = cfg->cb_ctx;
314
315         if (wps_set_ie(reg)) {
316                 wps_registrar_deinit(reg);
317                 return NULL;
318         }
319
320         return reg;
321 }
322
323
324 void wps_registrar_deinit(struct wps_registrar *reg)
325 {
326         if (reg == NULL)
327                 return;
328         eloop_cancel_timeout(wps_registrar_pbc_timeout, reg, NULL);
329         wps_free_pins(reg->pins);
330         wps_free_pbc_sessions(reg->pbc_sessions);
331         os_free(reg);
332 }
333
334
335 int wps_registrar_add_pin(struct wps_registrar *reg, const u8 *uuid,
336                           const u8 *pin, size_t pin_len)
337 {
338         struct wps_uuid_pin *p;
339
340         p = os_zalloc(sizeof(*p));
341         if (p == NULL)
342                 return -1;
343         if (uuid == NULL)
344                 p->wildcard_uuid = 1;
345         else
346                 os_memcpy(p->uuid, uuid, WPS_UUID_LEN);
347         p->pin = os_malloc(pin_len);
348         if (p->pin == NULL) {
349                 os_free(p);
350                 return -1;
351         }
352         os_memcpy(p->pin, pin, pin_len);
353         p->pin_len = pin_len;
354
355         p->next = reg->pins;
356         reg->pins = p;
357
358         wpa_printf(MSG_DEBUG, "WPS: A new PIN configured");
359         wpa_hexdump(MSG_DEBUG, "WPS: UUID", uuid, WPS_UUID_LEN);
360         wpa_hexdump_ascii_key(MSG_DEBUG, "WPS: PIN", pin, pin_len);
361         reg->selected_registrar = 1;
362         reg->pbc = 0;
363         wps_set_ie(reg);
364
365         return 0;
366 }
367
368
369 int wps_registrar_invalidate_pin(struct wps_registrar *reg, const u8 *uuid)
370 {
371         struct wps_uuid_pin *pin, *prev;
372
373         prev = NULL;
374         pin = reg->pins;
375         while (pin) {
376                 if (os_memcmp(pin->uuid, uuid, WPS_UUID_LEN) == 0) {
377                         if (prev == NULL)
378                                 reg->pins = pin->next;
379                         else
380                                 prev->next = pin->next;
381                         wpa_hexdump(MSG_DEBUG, "WPS: Invalidated PIN for UUID",
382                                     pin->uuid, WPS_UUID_LEN);
383                         wps_free_pin(pin);
384                         return 0;
385                 }
386                 prev = pin;
387                 pin = pin->next;
388         }
389
390         return -1;
391 }
392
393
394 static const u8 * wps_registrar_get_pin(struct wps_registrar *reg,
395                                         const u8 *uuid, size_t *pin_len)
396 {
397         struct wps_uuid_pin *pin;
398
399         pin = reg->pins;
400         while (pin) {
401                 if (!pin->wildcard_uuid &&
402                     os_memcmp(pin->uuid, uuid, WPS_UUID_LEN) == 0)
403                         break;
404                 pin = pin->next;
405         }
406
407         if (!pin) {
408                 /* Check for wildcard UUIDs since none of the UUID-specific
409                  * PINs matched */
410                 pin = reg->pins;
411                 while (pin) {
412                         if (pin->wildcard_uuid == 1) {
413                                 wpa_printf(MSG_DEBUG, "WPS: Found a wildcard "
414                                            "PIN. Assigned it for this UUID-E");
415                                 pin->wildcard_uuid = 2;
416                                 os_memcpy(pin->uuid, uuid, WPS_UUID_LEN);
417                                 break;
418                         }
419                         pin = pin->next;
420                 }
421         }
422
423         if (!pin)
424                 return NULL;
425
426         /*
427          * Lock the PIN to avoid attacks based on concurrent re-use of the PIN
428          * that could otherwise avoid PIN invalidations.
429          */
430         if (pin->locked) {
431                 wpa_printf(MSG_DEBUG, "WPS: Selected PIN locked - do not "
432                            "allow concurrent re-use");
433                 return NULL;
434         }
435         *pin_len = pin->pin_len;
436         pin->locked = 1;
437         return pin->pin;
438 }
439
440
441 int wps_registrar_unlock_pin(struct wps_registrar *reg, const u8 *uuid)
442 {
443         struct wps_uuid_pin *pin;
444
445         pin = reg->pins;
446         while (pin) {
447                 if (os_memcmp(pin->uuid, uuid, WPS_UUID_LEN) == 0) {
448                         if (pin->wildcard_uuid == 2) {
449                                 wpa_printf(MSG_DEBUG, "WPS: Invalidating used "
450                                            "wildcard PIN");
451                                 return wps_registrar_invalidate_pin(reg, uuid);
452                         }
453                         pin->locked = 0;
454                         return 0;
455                 }
456                 pin = pin->next;
457         }
458
459         return -1;
460 }
461
462
463 static void wps_registrar_pbc_timeout(void *eloop_ctx, void *timeout_ctx)
464 {
465         struct wps_registrar *reg = eloop_ctx;
466
467         wpa_printf(MSG_DEBUG, "WPS: PBC timed out - disable PBC mode");
468         reg->selected_registrar = 0;
469         reg->pbc = 0;
470         wps_set_ie(reg);
471 }
472
473
474 int wps_registrar_button_pushed(struct wps_registrar *reg)
475 {
476         if (wps_registrar_pbc_overlap(reg, NULL, NULL)) {
477                 wpa_printf(MSG_DEBUG, "WPS: PBC overlap - do not start PBC "
478                            "mode");
479                 return -1;
480         }
481         wpa_printf(MSG_DEBUG, "WPS: Button pushed - PBC mode started");
482         reg->selected_registrar = 1;
483         reg->pbc = 1;
484         wps_set_ie(reg);
485
486         eloop_cancel_timeout(wps_registrar_pbc_timeout, reg, NULL);
487         eloop_register_timeout(WPS_PBC_WALK_TIME, 0, wps_registrar_pbc_timeout,
488                                reg, NULL);
489         return 0;
490 }
491
492
493 static void wps_registrar_pbc_completed(struct wps_registrar *reg)
494 {
495         wpa_printf(MSG_DEBUG, "WPS: PBC completed - stopping PBC mode");
496         eloop_cancel_timeout(wps_registrar_pbc_timeout, reg, NULL);
497         reg->selected_registrar = 0;
498         reg->pbc = 0;
499         wps_set_ie(reg);
500 }
501
502
503 void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr,
504                                 const struct wpabuf *wps_data)
505 {
506         struct wps_parse_attr attr;
507         u16 methods;
508
509         wpa_hexdump_buf(MSG_MSGDUMP,
510                         "WPS: Probe Request with WPS data received",
511                         wps_data);
512
513         if (wps_parse_msg(wps_data, &attr) < 0 ||
514             attr.version == NULL || *attr.version != WPS_VERSION) {
515                 wpa_printf(MSG_DEBUG, "WPS: Unsupported ProbeReq WPS IE "
516                            "version 0x%x", attr.version ? *attr.version : 0);
517                 return;
518         }
519
520         if (attr.config_methods == NULL) {
521                 wpa_printf(MSG_DEBUG, "WPS: No Config Methods attribute in "
522                            "Probe Request");
523                 return;
524         }
525
526         methods = WPA_GET_BE16(attr.config_methods);
527         if (!(methods & WPS_CONFIG_PUSHBUTTON))
528                 return; /* Not PBC */
529
530         wpa_printf(MSG_DEBUG, "WPS: Probe Request for PBC received from "
531                    MACSTR, MAC2STR(addr));
532
533         wps_registrar_add_pbc_session(reg, addr, attr.uuid_e);
534 }
535
536
537 static int wps_cb_new_psk(struct wps_registrar *reg, const u8 *mac_addr,
538                           const u8 *psk, size_t psk_len)
539 {
540         if (reg->new_psk_cb == NULL)
541                 return 0;
542
543         return reg->new_psk_cb(reg->cb_ctx, mac_addr, psk, psk_len);
544 }
545
546
547 static void wps_cb_pin_needed(struct wps_registrar *reg, const u8 *uuid_e,
548                               const struct wps_device_data *dev)
549 {
550         if (reg->pin_needed_cb == NULL)
551                 return;
552
553         reg->pin_needed_cb(reg->cb_ctx, uuid_e, dev);
554 }
555
556
557 static int wps_cb_set_ie(struct wps_registrar *reg,
558                          const struct wpabuf *beacon_ie,
559                          const struct wpabuf *probe_resp_ie)
560 {
561         if (reg->set_ie_cb == NULL)
562                 return 0;
563
564         return reg->set_ie_cb(reg->cb_ctx, wpabuf_head(beacon_ie),
565                               wpabuf_len(beacon_ie),
566                               wpabuf_head(probe_resp_ie),
567                               wpabuf_len(probe_resp_ie));
568 }
569
570
571 /* Encapsulate WPS IE data with one (or more, if needed) IE headers */
572 static struct wpabuf * wps_ie_encapsulate(struct wpabuf *data)
573 {
574         struct wpabuf *ie;
575         const u8 *pos, *end;
576
577         ie = wpabuf_alloc(wpabuf_len(data) + 100);
578         if (ie == NULL) {
579                 wpabuf_free(data);
580                 return NULL;
581         }
582
583         pos = wpabuf_head(data);
584         end = pos + wpabuf_len(data);
585
586         while (end > pos) {
587                 size_t frag_len = end - pos;
588                 if (frag_len > 251)
589                         frag_len = 251;
590                 wpabuf_put_u8(ie, WLAN_EID_VENDOR_SPECIFIC);
591                 wpabuf_put_u8(ie, 4 + frag_len);
592                 wpabuf_put_be32(ie, WPS_DEV_OUI_WFA);
593                 wpabuf_put_data(ie, pos, frag_len);
594                 pos += frag_len;
595         }
596
597         wpabuf_free(data);
598
599         return ie;
600 }
601
602
603 static int wps_set_ie(struct wps_registrar *reg)
604 {
605         struct wpabuf *beacon;
606         struct wpabuf *probe;
607         int ret;
608
609         wpa_printf(MSG_DEBUG, "WPS: Build Beacon and Probe Response IEs");
610
611         beacon = wpabuf_alloc(300);
612         if (beacon == NULL)
613                 return -1;
614         probe = wpabuf_alloc(400);
615         if (probe == NULL) {
616                 wpabuf_free(beacon);
617                 return -1;
618         }
619
620         if (wps_build_version(beacon) ||
621             wps_build_wps_state(reg->wps, beacon) ||
622             wps_build_ap_setup_locked(reg->wps, beacon) ||
623             wps_build_selected_registrar(reg, beacon) ||
624             wps_build_sel_reg_dev_password_id(reg, beacon) ||
625             wps_build_sel_reg_config_methods(reg, beacon) ||
626             wps_build_version(probe) ||
627             wps_build_wps_state(reg->wps, probe) ||
628             wps_build_ap_setup_locked(reg->wps, probe) ||
629             wps_build_selected_registrar(reg, probe) ||
630             wps_build_sel_reg_dev_password_id(reg, probe) ||
631             wps_build_sel_reg_config_methods(reg, probe) ||
632             wps_build_resp_type(reg, probe) ||
633             wps_build_uuid_e(probe, reg->wps->uuid) ||
634             wps_build_device_attrs(&reg->wps->dev, probe) ||
635             wps_build_probe_config_methods(reg, probe) ||
636             wps_build_rf_bands(&reg->wps->dev, probe)) {
637                 wpabuf_free(beacon);
638                 wpabuf_free(probe);
639                 return -1;
640         }
641
642         beacon = wps_ie_encapsulate(beacon);
643         probe = wps_ie_encapsulate(probe);
644
645         if (!beacon || !probe) {
646                 wpabuf_free(beacon);
647                 wpabuf_free(probe);
648                 return -1;
649         }
650
651         ret = wps_cb_set_ie(reg, beacon, probe);
652         wpabuf_free(beacon);
653         wpabuf_free(probe);
654
655         return ret;
656 }
657
658
659 static int wps_get_dev_password(struct wps_data *wps)
660 {
661         const u8 *pin;
662         size_t pin_len = 0;
663
664         os_free(wps->dev_password);
665         wps->dev_password = NULL;
666
667         if (wps->pbc) {
668                 wpa_printf(MSG_DEBUG, "WPS: Use default PIN for PBC");
669                 pin = (const u8 *) "00000000";
670                 pin_len = 8;
671         } else {
672                 pin = wps_registrar_get_pin(wps->registrar, wps->uuid_e,
673                                             &pin_len);
674         }
675         if (pin == NULL) {
676                 wpa_printf(MSG_DEBUG, "WPS: No Device Password available for "
677                            "the Enrollee");
678                 wps_cb_pin_needed(wps->registrar, wps->uuid_e, &wps->peer_dev);
679                 return -1;
680         }
681
682         wps->dev_password = os_malloc(pin_len);
683         if (wps->dev_password == NULL)
684                 return -1;
685         os_memcpy(wps->dev_password, pin, pin_len);
686         wps->dev_password_len = pin_len;
687
688         return 0;
689 }
690
691
692 static int wps_build_uuid_r(struct wps_data *wps, struct wpabuf *msg)
693 {
694         wpa_printf(MSG_DEBUG, "WPS:  * UUID-R");
695         wpabuf_put_be16(msg, ATTR_UUID_R);
696         wpabuf_put_be16(msg, WPS_UUID_LEN);
697         wpabuf_put_data(msg, wps->uuid_r, WPS_UUID_LEN);
698         return 0;
699 }
700
701
702 static int wps_build_r_hash(struct wps_data *wps, struct wpabuf *msg)
703 {
704         u8 *hash;
705         const u8 *addr[4];
706         size_t len[4];
707
708         if (os_get_random(wps->snonce, 2 * WPS_SECRET_NONCE_LEN) < 0)
709                 return -1;
710         wpa_hexdump(MSG_DEBUG, "WPS: R-S1", wps->snonce, WPS_SECRET_NONCE_LEN);
711         wpa_hexdump(MSG_DEBUG, "WPS: R-S2",
712                     wps->snonce + WPS_SECRET_NONCE_LEN, WPS_SECRET_NONCE_LEN);
713
714         if (wps->dh_pubkey_e == NULL || wps->dh_pubkey_r == NULL) {
715                 wpa_printf(MSG_DEBUG, "WPS: DH public keys not available for "
716                            "R-Hash derivation");
717                 return -1;
718         }
719
720         wpa_printf(MSG_DEBUG, "WPS:  * R-Hash1");
721         wpabuf_put_be16(msg, ATTR_R_HASH1);
722         wpabuf_put_be16(msg, SHA256_MAC_LEN);
723         hash = wpabuf_put(msg, SHA256_MAC_LEN);
724         /* R-Hash1 = HMAC_AuthKey(R-S1 || PSK1 || PK_E || PK_R) */
725         addr[0] = wps->snonce;
726         len[0] = WPS_SECRET_NONCE_LEN;
727         addr[1] = wps->psk1;
728         len[1] = WPS_PSK_LEN;
729         addr[2] = wpabuf_head(wps->dh_pubkey_e);
730         len[2] = wpabuf_len(wps->dh_pubkey_e);
731         addr[3] = wpabuf_head(wps->dh_pubkey_r);
732         len[3] = wpabuf_len(wps->dh_pubkey_r);
733         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
734         wpa_hexdump(MSG_DEBUG, "WPS: R-Hash1", hash, SHA256_MAC_LEN);
735
736         wpa_printf(MSG_DEBUG, "WPS:  * R-Hash2");
737         wpabuf_put_be16(msg, ATTR_R_HASH2);
738         wpabuf_put_be16(msg, SHA256_MAC_LEN);
739         hash = wpabuf_put(msg, SHA256_MAC_LEN);
740         /* R-Hash2 = HMAC_AuthKey(R-S2 || PSK2 || PK_E || PK_R) */
741         addr[0] = wps->snonce + WPS_SECRET_NONCE_LEN;
742         addr[1] = wps->psk2;
743         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
744         wpa_hexdump(MSG_DEBUG, "WPS: R-Hash2", hash, SHA256_MAC_LEN);
745
746         return 0;
747 }
748
749
750 static int wps_build_r_snonce1(struct wps_data *wps, struct wpabuf *msg)
751 {
752         wpa_printf(MSG_DEBUG, "WPS:  * R-SNonce1");
753         wpabuf_put_be16(msg, ATTR_R_SNONCE1);
754         wpabuf_put_be16(msg, WPS_SECRET_NONCE_LEN);
755         wpabuf_put_data(msg, wps->snonce, WPS_SECRET_NONCE_LEN);
756         return 0;
757 }
758
759
760 static int wps_build_r_snonce2(struct wps_data *wps, struct wpabuf *msg)
761 {
762         wpa_printf(MSG_DEBUG, "WPS:  * R-SNonce2");
763         wpabuf_put_be16(msg, ATTR_R_SNONCE2);
764         wpabuf_put_be16(msg, WPS_SECRET_NONCE_LEN);
765         wpabuf_put_data(msg, wps->snonce + WPS_SECRET_NONCE_LEN,
766                         WPS_SECRET_NONCE_LEN);
767         return 0;
768 }
769
770
771 static int wps_build_cred_network_idx(struct wpabuf *msg,
772                                       struct wps_credential *cred)
773 {
774         wpa_printf(MSG_DEBUG, "WPS:  * Network Index");
775         wpabuf_put_be16(msg, ATTR_NETWORK_INDEX);
776         wpabuf_put_be16(msg, 1);
777         wpabuf_put_u8(msg, 0);
778         return 0;
779 }
780
781
782 static int wps_build_cred_ssid(struct wpabuf *msg,
783                                struct wps_credential *cred)
784 {
785         wpa_printf(MSG_DEBUG, "WPS:  * SSID");
786         wpabuf_put_be16(msg, ATTR_SSID);
787         wpabuf_put_be16(msg, cred->ssid_len);
788         wpabuf_put_data(msg, cred->ssid, cred->ssid_len);
789         return 0;
790 }
791
792
793 static int wps_build_cred_auth_type(struct wpabuf *msg,
794                                     struct wps_credential *cred)
795 {
796         wpa_printf(MSG_DEBUG, "WPS:  * Authentication Type (0x%x)",
797                    cred->auth_type);
798         wpabuf_put_be16(msg, ATTR_AUTH_TYPE);
799         wpabuf_put_be16(msg, 2);
800         wpabuf_put_be16(msg, cred->auth_type);
801         return 0;
802 }
803
804
805 static int wps_build_cred_encr_type(struct wpabuf *msg,
806                                     struct wps_credential *cred)
807 {
808         wpa_printf(MSG_DEBUG, "WPS:  * Encryption Type (0x%x)",
809                    cred->encr_type);
810         wpabuf_put_be16(msg, ATTR_ENCR_TYPE);
811         wpabuf_put_be16(msg, 2);
812         wpabuf_put_be16(msg, cred->encr_type);
813         return 0;
814 }
815
816
817 static int wps_build_cred_network_key(struct wpabuf *msg,
818                                       struct wps_credential *cred)
819 {
820         wpa_printf(MSG_DEBUG, "WPS:  * Network Key");
821         wpabuf_put_be16(msg, ATTR_NETWORK_KEY);
822         wpabuf_put_be16(msg, cred->key_len);
823         wpabuf_put_data(msg, cred->key, cred->key_len);
824         return 0;
825 }
826
827
828 static int wps_build_cred_mac_addr(struct wpabuf *msg,
829                                    struct wps_credential *cred)
830 {
831         wpa_printf(MSG_DEBUG, "WPS:  * MAC Address");
832         wpabuf_put_be16(msg, ATTR_MAC_ADDR);
833         wpabuf_put_be16(msg, ETH_ALEN);
834         wpabuf_put_data(msg, cred->mac_addr, ETH_ALEN);
835         return 0;
836 }
837
838
839 static int wps_build_credential(struct wpabuf *msg,
840                                 struct wps_credential *cred)
841 {
842         if (wps_build_cred_network_idx(msg, cred) ||
843             wps_build_cred_ssid(msg, cred) ||
844             wps_build_cred_auth_type(msg, cred) ||
845             wps_build_cred_encr_type(msg, cred) ||
846             wps_build_cred_network_key(msg, cred) ||
847             wps_build_cred_mac_addr(msg, cred))
848                 return -1;
849         return 0;
850 }
851
852
853 static int wps_build_cred(struct wps_data *wps, struct wpabuf *msg)
854 {
855         struct wpabuf *cred;
856
857         wpa_printf(MSG_DEBUG, "WPS:  * Credential");
858         os_memset(&wps->cred, 0, sizeof(wps->cred));
859
860         os_memcpy(wps->cred.ssid, wps->wps->ssid, wps->wps->ssid_len);
861         wps->cred.ssid_len = wps->wps->ssid_len;
862
863         /* Select the best authentication and encryption type */
864         if (wps->auth_type & WPS_AUTH_WPA2PSK)
865                 wps->auth_type = WPS_AUTH_WPA2PSK;
866         else if (wps->auth_type & WPS_AUTH_WPAPSK)
867                 wps->auth_type = WPS_AUTH_WPAPSK;
868         else if (wps->auth_type & WPS_AUTH_OPEN)
869                 wps->auth_type = WPS_AUTH_OPEN;
870         else if (wps->auth_type & WPS_AUTH_SHARED)
871                 wps->auth_type = WPS_AUTH_SHARED;
872         else {
873                 wpa_printf(MSG_DEBUG, "WPS: Unsupported auth_type 0x%x",
874                            wps->auth_type);
875                 return -1;
876         }
877         wps->cred.auth_type = wps->auth_type;
878
879         if (wps->auth_type == WPS_AUTH_WPA2PSK ||
880             wps->auth_type == WPS_AUTH_WPAPSK) {
881                 if (wps->encr_type & WPS_ENCR_AES)
882                         wps->encr_type = WPS_ENCR_AES;
883                 else if (wps->encr_type & WPS_ENCR_TKIP)
884                         wps->encr_type = WPS_ENCR_TKIP;
885                 else {
886                         wpa_printf(MSG_DEBUG, "WPS: No suitable encryption "
887                                    "type for WPA/WPA2");
888                         return -1;
889                 }
890         } else {
891                 if (wps->encr_type & WPS_ENCR_WEP)
892                         wps->encr_type = WPS_ENCR_WEP;
893                 else if (wps->encr_type & WPS_ENCR_NONE)
894                         wps->encr_type = WPS_ENCR_NONE;
895                 else {
896                         wpa_printf(MSG_DEBUG, "WPS: No suitable encryption "
897                                    "type for non-WPA/WPA2 mode");
898                         return -1;
899                 }
900         }
901         wps->cred.encr_type = wps->encr_type;
902         os_memcpy(wps->cred.mac_addr, wps->mac_addr_e, ETH_ALEN);
903
904         if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->wps->ap) {
905                 u8 r[16];
906                 /* Generate a random passphrase */
907                 if (os_get_random(r, sizeof(r)) < 0)
908                         return -1;
909                 os_free(wps->new_psk);
910                 wps->new_psk = base64_encode(r, sizeof(r), &wps->new_psk_len);
911                 if (wps->new_psk == NULL)
912                         return -1;
913                 wps->new_psk_len--; /* remove newline */
914                 while (wps->new_psk_len &&
915                        wps->new_psk[wps->new_psk_len - 1] == '=')
916                         wps->new_psk_len--;
917                 wpa_hexdump_ascii_key(MSG_DEBUG, "WPS: Generated passphrase",
918                                       wps->new_psk, wps->new_psk_len);
919                 os_memcpy(wps->cred.key, wps->new_psk, wps->new_psk_len);
920                 wps->cred.key_len = wps->new_psk_len;
921         } else if (wps->wps->network_key) {
922                 os_memcpy(wps->cred.key, wps->wps->network_key,
923                           wps->wps->network_key_len);
924                 wps->cred.key_len = wps->wps->network_key_len;
925         } else if (wps->auth_type & (WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK)) {
926                 char hex[65];
927                 /* Generate a random per-device PSK */
928                 os_free(wps->new_psk);
929                 wps->new_psk_len = 32;
930                 wps->new_psk = os_malloc(wps->new_psk_len);
931                 if (wps->new_psk == NULL)
932                         return -1;
933                 if (os_get_random(wps->new_psk, wps->new_psk_len) < 0) {
934                         os_free(wps->new_psk);
935                         wps->new_psk = NULL;
936                         return -1;
937                 }
938                 wpa_hexdump_key(MSG_DEBUG, "WPS: Generated per-device PSK",
939                                 wps->new_psk, wps->new_psk_len);
940                 wpa_snprintf_hex(hex, sizeof(hex), wps->new_psk,
941                                  wps->new_psk_len);
942                 os_memcpy(wps->cred.key, hex, wps->new_psk_len * 2);
943                 wps->cred.key_len = wps->new_psk_len * 2;
944         }
945
946         cred = wpabuf_alloc(200);
947         if (cred == NULL)
948                 return -1;
949
950         if (wps_build_credential(cred, &wps->cred)) {
951                 wpabuf_free(cred);
952                 return -1;
953         }
954
955         wpabuf_put_be16(msg, ATTR_CRED);
956         wpabuf_put_be16(msg, wpabuf_len(cred));
957         wpabuf_put_buf(msg, cred);
958         wpabuf_free(cred);
959
960         return 0;
961 }
962
963
964 static int wps_build_ap_settings(struct wps_data *wps, struct wpabuf *msg)
965 {
966         wpa_printf(MSG_DEBUG, "WPS:  * AP Settings");
967
968         if (wps_build_credential(msg, &wps->cred))
969                 return -1;
970
971         return 0;
972 }
973
974
975 static struct wpabuf * wps_build_m2(struct wps_data *wps)
976 {
977         struct wpabuf *msg;
978
979         if (os_get_random(wps->nonce_r, WPS_NONCE_LEN) < 0)
980                 return NULL;
981         wpa_hexdump(MSG_DEBUG, "WPS: Registrar Nonce",
982                     wps->nonce_r, WPS_NONCE_LEN);
983         os_memcpy(wps->uuid_r, wps->wps->uuid, WPS_UUID_LEN);
984         wpa_hexdump(MSG_DEBUG, "WPS: UUID-R", wps->uuid_r, WPS_UUID_LEN);
985
986         wpa_printf(MSG_DEBUG, "WPS: Building Message M2");
987         msg = wpabuf_alloc(1000);
988         if (msg == NULL)
989                 return NULL;
990
991         if (wps_build_version(msg) ||
992             wps_build_msg_type(msg, WPS_M2) ||
993             wps_build_enrollee_nonce(wps, msg) ||
994             wps_build_registrar_nonce(wps, msg) ||
995             wps_build_uuid_r(wps, msg) ||
996             wps_build_public_key(wps, msg) ||
997             wps_derive_keys(wps) ||
998             wps_build_auth_type_flags(wps, msg) ||
999             wps_build_encr_type_flags(wps, msg) ||
1000             wps_build_conn_type_flags(wps, msg) ||
1001             wps_build_config_methods_r(wps->registrar, msg) ||
1002             wps_build_device_attrs(&wps->wps->dev, msg) ||
1003             wps_build_rf_bands(&wps->wps->dev, msg) ||
1004             wps_build_assoc_state(wps, msg) ||
1005             wps_build_config_error(msg, WPS_CFG_NO_ERROR) ||
1006             wps_build_dev_password_id(msg, DEV_PW_DEFAULT) ||
1007             wps_build_os_version(&wps->wps->dev, msg) ||
1008             wps_build_authenticator(wps, msg)) {
1009                 wpabuf_free(msg);
1010                 return NULL;
1011         }
1012
1013         wps->state = RECV_M3;
1014         return msg;
1015 }
1016
1017
1018 static struct wpabuf * wps_build_m2d(struct wps_data *wps)
1019 {
1020         struct wpabuf *msg;
1021         u16 err = WPS_CFG_NO_ERROR;
1022
1023         wpa_printf(MSG_DEBUG, "WPS: Building Message M2D");
1024         msg = wpabuf_alloc(1000);
1025         if (msg == NULL)
1026                 return NULL;
1027
1028         if (wps->authenticator && wps->wps->ap_setup_locked)
1029                 err = WPS_CFG_SETUP_LOCKED;
1030
1031         if (wps_build_version(msg) ||
1032             wps_build_msg_type(msg, WPS_M2D) ||
1033             wps_build_enrollee_nonce(wps, msg) ||
1034             wps_build_registrar_nonce(wps, msg) ||
1035             wps_build_uuid_r(wps, msg) ||
1036             wps_build_auth_type_flags(wps, msg) ||
1037             wps_build_encr_type_flags(wps, msg) ||
1038             wps_build_conn_type_flags(wps, msg) ||
1039             wps_build_config_methods_r(wps->registrar, msg) ||
1040             wps_build_device_attrs(&wps->wps->dev, msg) ||
1041             wps_build_rf_bands(&wps->wps->dev, msg) ||
1042             wps_build_assoc_state(wps, msg) ||
1043             wps_build_config_error(msg, err) ||
1044             wps_build_os_version(&wps->wps->dev, msg)) {
1045                 wpabuf_free(msg);
1046                 return NULL;
1047         }
1048
1049         wps->state = RECV_M2D_ACK;
1050         return msg;
1051 }
1052
1053
1054 static struct wpabuf * wps_build_m4(struct wps_data *wps)
1055 {
1056         struct wpabuf *msg, *plain;
1057
1058         wpa_printf(MSG_DEBUG, "WPS: Building Message M4");
1059
1060         wps_derive_psk(wps, wps->dev_password, wps->dev_password_len);
1061
1062         plain = wpabuf_alloc(200);
1063         if (plain == NULL)
1064                 return NULL;
1065
1066         msg = wpabuf_alloc(1000);
1067         if (msg == NULL) {
1068                 wpabuf_free(plain);
1069                 return NULL;
1070         }
1071
1072         if (wps_build_version(msg) ||
1073             wps_build_msg_type(msg, WPS_M4) ||
1074             wps_build_enrollee_nonce(wps, msg) ||
1075             wps_build_r_hash(wps, msg) ||
1076             wps_build_r_snonce1(wps, plain) ||
1077             wps_build_key_wrap_auth(wps, plain) ||
1078             wps_build_encr_settings(wps, msg, plain) ||
1079             wps_build_authenticator(wps, msg)) {
1080                 wpabuf_free(plain);
1081                 wpabuf_free(msg);
1082                 return NULL;
1083         }
1084         wpabuf_free(plain);
1085
1086         wps->state = RECV_M5;
1087         return msg;
1088 }
1089
1090
1091 static struct wpabuf * wps_build_m6(struct wps_data *wps)
1092 {
1093         struct wpabuf *msg, *plain;
1094
1095         wpa_printf(MSG_DEBUG, "WPS: Building Message M6");
1096
1097         plain = wpabuf_alloc(200);
1098         if (plain == NULL)
1099                 return NULL;
1100
1101         msg = wpabuf_alloc(1000);
1102         if (msg == NULL) {
1103                 wpabuf_free(plain);
1104                 return NULL;
1105         }
1106
1107         if (wps_build_version(msg) ||
1108             wps_build_msg_type(msg, WPS_M6) ||
1109             wps_build_enrollee_nonce(wps, msg) ||
1110             wps_build_r_snonce2(wps, plain) ||
1111             wps_build_key_wrap_auth(wps, plain) ||
1112             wps_build_encr_settings(wps, msg, plain) ||
1113             wps_build_authenticator(wps, msg)) {
1114                 wpabuf_free(plain);
1115                 wpabuf_free(msg);
1116                 return NULL;
1117         }
1118         wpabuf_free(plain);
1119
1120         wps->wps_pin_revealed = 1;
1121         wps->state = RECV_M7;
1122         return msg;
1123 }
1124
1125
1126 static struct wpabuf * wps_build_m8(struct wps_data *wps)
1127 {
1128         struct wpabuf *msg, *plain;
1129
1130         wpa_printf(MSG_DEBUG, "WPS: Building Message M8");
1131
1132         plain = wpabuf_alloc(500);
1133         if (plain == NULL)
1134                 return NULL;
1135
1136         msg = wpabuf_alloc(1000);
1137         if (msg == NULL) {
1138                 wpabuf_free(plain);
1139                 return NULL;
1140         }
1141
1142         if (wps_build_version(msg) ||
1143             wps_build_msg_type(msg, WPS_M8) ||
1144             wps_build_enrollee_nonce(wps, msg) ||
1145             (wps->wps->ap && wps_build_cred(wps, plain)) ||
1146             (!wps->wps->ap && wps_build_ap_settings(wps, plain)) ||
1147             wps_build_key_wrap_auth(wps, plain) ||
1148             wps_build_encr_settings(wps, msg, plain) ||
1149             wps_build_authenticator(wps, msg)) {
1150                 wpabuf_free(plain);
1151                 wpabuf_free(msg);
1152                 return NULL;
1153         }
1154         wpabuf_free(plain);
1155
1156         wps->state = RECV_DONE;
1157         return msg;
1158 }
1159
1160
1161 static struct wpabuf * wps_build_wsc_ack(struct wps_data *wps)
1162 {
1163         struct wpabuf *msg;
1164
1165         wpa_printf(MSG_DEBUG, "WPS: Building Message WSC_ACK");
1166
1167         msg = wpabuf_alloc(1000);
1168         if (msg == NULL)
1169                 return NULL;
1170
1171         if (wps_build_version(msg) ||
1172             wps_build_msg_type(msg, WPS_WSC_ACK) ||
1173             wps_build_enrollee_nonce(wps, msg) ||
1174             wps_build_registrar_nonce(wps, msg)) {
1175                 wpabuf_free(msg);
1176                 return NULL;
1177         }
1178
1179         return msg;
1180 }
1181
1182
1183 struct wpabuf * wps_registrar_get_msg(struct wps_data *wps, u8 *op_code)
1184 {
1185         struct wpabuf *msg;
1186
1187         switch (wps->state) {
1188         case SEND_M2:
1189                 if (wps_get_dev_password(wps) < 0)
1190                         msg = wps_build_m2d(wps);
1191                 else
1192                         msg = wps_build_m2(wps);
1193                 *op_code = WSC_MSG;
1194                 break;
1195         case SEND_M2D:
1196                 msg = wps_build_m2d(wps);
1197                 *op_code = WSC_MSG;
1198                 break;
1199         case SEND_M4:
1200                 msg = wps_build_m4(wps);
1201                 *op_code = WSC_MSG;
1202                 break;
1203         case SEND_M6:
1204                 msg = wps_build_m6(wps);
1205                 *op_code = WSC_MSG;
1206                 break;
1207         case SEND_M8:
1208                 msg = wps_build_m8(wps);
1209                 *op_code = WSC_MSG;
1210                 break;
1211         case RECV_DONE:
1212                 msg = wps_build_wsc_ack(wps);
1213                 *op_code = WSC_ACK;
1214                 break;
1215         default:
1216                 wpa_printf(MSG_DEBUG, "WPS: Unsupported state %d for building "
1217                            "a message", wps->state);
1218                 msg = NULL;
1219                 break;
1220         }
1221
1222         if (*op_code == WSC_MSG && msg) {
1223                 /* Save a copy of the last message for Authenticator derivation
1224                  */
1225                 wpabuf_free(wps->last_msg);
1226                 wps->last_msg = wpabuf_dup(msg);
1227         }
1228
1229         return msg;
1230 }
1231
1232
1233 static int wps_process_enrollee_nonce(struct wps_data *wps, const u8 *e_nonce)
1234 {
1235         if (e_nonce == NULL) {
1236                 wpa_printf(MSG_DEBUG, "WPS: No Enrollee Nonce received");
1237                 return -1;
1238         }
1239
1240         os_memcpy(wps->nonce_e, e_nonce, WPS_NONCE_LEN);
1241         wpa_hexdump(MSG_DEBUG, "WPS: Enrollee Nonce",
1242                     wps->nonce_e, WPS_NONCE_LEN);
1243
1244         return 0;
1245 }
1246
1247
1248 static int wps_process_registrar_nonce(struct wps_data *wps, const u8 *r_nonce)
1249 {
1250         if (r_nonce == NULL) {
1251                 wpa_printf(MSG_DEBUG, "WPS: No Registrar Nonce received");
1252                 return -1;
1253         }
1254
1255         if (os_memcmp(wps->nonce_r, r_nonce, WPS_NONCE_LEN) != 0) {
1256                 wpa_printf(MSG_DEBUG, "WPS: Invalid Registrar Nonce received");
1257                 return -1;
1258         }
1259
1260         return 0;
1261 }
1262
1263
1264 static int wps_process_uuid_e(struct wps_data *wps, const u8 *uuid_e)
1265 {
1266         if (uuid_e == NULL) {
1267                 wpa_printf(MSG_DEBUG, "WPS: No UUID-E received");
1268                 return -1;
1269         }
1270
1271         os_memcpy(wps->uuid_e, uuid_e, WPS_UUID_LEN);
1272         wpa_hexdump(MSG_DEBUG, "WPS: UUID-E", wps->uuid_e, WPS_UUID_LEN);
1273
1274         return 0;
1275 }
1276
1277
1278 static int wps_process_dev_password_id(struct wps_data *wps, const u8 *pw_id)
1279 {
1280         if (pw_id == NULL) {
1281                 wpa_printf(MSG_DEBUG, "WPS: No Device Password ID received");
1282                 return -1;
1283         }
1284
1285         wps->dev_pw_id = WPA_GET_BE16(pw_id);
1286         wpa_printf(MSG_DEBUG, "WPS: Device Password ID %d", wps->dev_pw_id);
1287
1288         return 0;
1289 }
1290
1291
1292 static int wps_process_e_hash1(struct wps_data *wps, const u8 *e_hash1)
1293 {
1294         if (e_hash1 == NULL) {
1295                 wpa_printf(MSG_DEBUG, "WPS: No E-Hash1 received");
1296                 return -1;
1297         }
1298
1299         os_memcpy(wps->peer_hash1, e_hash1, WPS_HASH_LEN);
1300         wpa_hexdump(MSG_DEBUG, "WPS: E-Hash1", wps->peer_hash1, WPS_HASH_LEN);
1301
1302         return 0;
1303 }
1304
1305
1306 static int wps_process_e_hash2(struct wps_data *wps, const u8 *e_hash2)
1307 {
1308         if (e_hash2 == NULL) {
1309                 wpa_printf(MSG_DEBUG, "WPS: No E-Hash2 received");
1310                 return -1;
1311         }
1312
1313         os_memcpy(wps->peer_hash2, e_hash2, WPS_HASH_LEN);
1314         wpa_hexdump(MSG_DEBUG, "WPS: E-Hash2", wps->peer_hash2, WPS_HASH_LEN);
1315
1316         return 0;
1317 }
1318
1319
1320 static int wps_process_e_snonce1(struct wps_data *wps, const u8 *e_snonce1)
1321 {
1322         u8 hash[SHA256_MAC_LEN];
1323         const u8 *addr[4];
1324         size_t len[4];
1325
1326         if (e_snonce1 == NULL) {
1327                 wpa_printf(MSG_DEBUG, "WPS: No E-SNonce1 received");
1328                 return -1;
1329         }
1330
1331         wpa_hexdump_key(MSG_DEBUG, "WPS: E-SNonce1", e_snonce1,
1332                         WPS_SECRET_NONCE_LEN);
1333
1334         /* E-Hash1 = HMAC_AuthKey(E-S1 || PSK1 || PK_E || PK_R) */
1335         addr[0] = e_snonce1;
1336         len[0] = WPS_SECRET_NONCE_LEN;
1337         addr[1] = wps->psk1;
1338         len[1] = WPS_PSK_LEN;
1339         addr[2] = wpabuf_head(wps->dh_pubkey_e);
1340         len[2] = wpabuf_len(wps->dh_pubkey_e);
1341         addr[3] = wpabuf_head(wps->dh_pubkey_r);
1342         len[3] = wpabuf_len(wps->dh_pubkey_r);
1343         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
1344
1345         if (os_memcmp(wps->peer_hash1, hash, WPS_HASH_LEN) != 0) {
1346                 wpa_printf(MSG_DEBUG, "WPS: E-Hash1 derived from E-S1 does "
1347                            "not match with the pre-committed value");
1348                 return -1;
1349         }
1350
1351         wpa_printf(MSG_DEBUG, "WPS: Enrollee proved knowledge of the first "
1352                    "half of the device password");
1353
1354         return 0;
1355 }
1356
1357
1358 static int wps_process_e_snonce2(struct wps_data *wps, const u8 *e_snonce2)
1359 {
1360         u8 hash[SHA256_MAC_LEN];
1361         const u8 *addr[4];
1362         size_t len[4];
1363
1364         if (e_snonce2 == NULL) {
1365                 wpa_printf(MSG_DEBUG, "WPS: No E-SNonce2 received");
1366                 return -1;
1367         }
1368
1369         wpa_hexdump_key(MSG_DEBUG, "WPS: E-SNonce2", e_snonce2,
1370                         WPS_SECRET_NONCE_LEN);
1371
1372         /* E-Hash2 = HMAC_AuthKey(E-S2 || PSK2 || PK_E || PK_R) */
1373         addr[0] = e_snonce2;
1374         len[0] = WPS_SECRET_NONCE_LEN;
1375         addr[1] = wps->psk2;
1376         len[1] = WPS_PSK_LEN;
1377         addr[2] = wpabuf_head(wps->dh_pubkey_e);
1378         len[2] = wpabuf_len(wps->dh_pubkey_e);
1379         addr[3] = wpabuf_head(wps->dh_pubkey_r);
1380         len[3] = wpabuf_len(wps->dh_pubkey_r);
1381         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
1382
1383         if (os_memcmp(wps->peer_hash2, hash, WPS_HASH_LEN) != 0) {
1384                 wpa_printf(MSG_DEBUG, "WPS: E-Hash2 derived from E-S2 does "
1385                            "not match with the pre-committed value");
1386                 wps_registrar_invalidate_pin(wps->registrar, wps->uuid_e);
1387                 return -1;
1388         }
1389
1390         wpa_printf(MSG_DEBUG, "WPS: Enrollee proved knowledge of the second "
1391                    "half of the device password");
1392         wps->wps_pin_revealed = 0;
1393         wps_registrar_unlock_pin(wps->registrar, wps->uuid_e);
1394
1395         return 0;
1396 }
1397
1398
1399 static int wps_process_mac_addr(struct wps_data *wps, const u8 *mac_addr)
1400 {
1401         if (mac_addr == NULL) {
1402                 wpa_printf(MSG_DEBUG, "WPS: No MAC Address received");
1403                 return -1;
1404         }
1405
1406         wpa_printf(MSG_DEBUG, "WPS: Enrollee MAC Address " MACSTR,
1407                    MAC2STR(mac_addr));
1408         os_memcpy(wps->mac_addr_e, mac_addr, ETH_ALEN);
1409         os_memcpy(wps->peer_dev.mac_addr, mac_addr, ETH_ALEN);
1410
1411         return 0;
1412 }
1413
1414
1415 static int wps_process_pubkey(struct wps_data *wps, const u8 *pk,
1416                               size_t pk_len)
1417 {
1418         if (pk == NULL || pk_len == 0) {
1419                 wpa_printf(MSG_DEBUG, "WPS: No Public Key received");
1420                 return -1;
1421         }
1422
1423         wpabuf_free(wps->dh_pubkey_e);
1424         wps->dh_pubkey_e = wpabuf_alloc_copy(pk, pk_len);
1425         if (wps->dh_pubkey_e == NULL)
1426                 return -1;
1427
1428         return 0;
1429 }
1430
1431
1432 static int wps_process_auth_type_flags(struct wps_data *wps, const u8 *auth)
1433 {
1434         u16 auth_types;
1435
1436         if (auth == NULL) {
1437                 wpa_printf(MSG_DEBUG, "WPS: No Authentication Type flags "
1438                            "received");
1439                 return -1;
1440         }
1441
1442         auth_types = WPA_GET_BE16(auth);
1443
1444         wpa_printf(MSG_DEBUG, "WPS: Enrollee Authentication Type flags 0x%x",
1445                    auth_types);
1446         wps->auth_type = wps->wps->auth_types & auth_types;
1447         if (wps->auth_type == 0) {
1448                 wpa_printf(MSG_DEBUG, "WPS: No match in supported "
1449                            "authentication types (own 0x%x Enrollee 0x%x)",
1450                            wps->wps->auth_types, auth_types);
1451                 return -1;
1452         }
1453
1454         return 0;
1455 }
1456
1457
1458 static int wps_process_encr_type_flags(struct wps_data *wps, const u8 *encr)
1459 {
1460         u16 encr_types;
1461
1462         if (encr == NULL) {
1463                 wpa_printf(MSG_DEBUG, "WPS: No Encryption Type flags "
1464                            "received");
1465                 return -1;
1466         }
1467
1468         encr_types = WPA_GET_BE16(encr);
1469
1470         wpa_printf(MSG_DEBUG, "WPS: Enrollee Encryption Type flags 0x%x",
1471                    encr_types);
1472         wps->encr_type = wps->wps->encr_types & encr_types;
1473         if (wps->encr_type == 0) {
1474                 wpa_printf(MSG_DEBUG, "WPS: No match in supported "
1475                            "encryption types");
1476                 return -1;
1477         }
1478
1479         return 0;
1480 }
1481
1482
1483 static int wps_process_conn_type_flags(struct wps_data *wps, const u8 *conn)
1484 {
1485         if (conn == NULL) {
1486                 wpa_printf(MSG_DEBUG, "WPS: No Connection Type flags "
1487                            "received");
1488                 return -1;
1489         }
1490
1491         wpa_printf(MSG_DEBUG, "WPS: Enrollee Connection Type flags 0x%x",
1492                    *conn);
1493
1494         return 0;
1495 }
1496
1497
1498 static int wps_process_config_methods(struct wps_data *wps, const u8 *methods)
1499 {
1500         u16 m;
1501
1502         if (methods == NULL) {
1503                 wpa_printf(MSG_DEBUG, "WPS: No Config Methods received");
1504                 return -1;
1505         }
1506
1507         m = WPA_GET_BE16(methods);
1508
1509         wpa_printf(MSG_DEBUG, "WPS: Enrollee Config Methods 0x%x", m);
1510
1511         return 0;
1512 }
1513
1514
1515 static int wps_process_wps_state(struct wps_data *wps, const u8 *state)
1516 {
1517         if (state == NULL) {
1518                 wpa_printf(MSG_DEBUG, "WPS: No Wi-Fi Protected Setup State "
1519                            "received");
1520                 return -1;
1521         }
1522
1523         wpa_printf(MSG_DEBUG, "WPS: Enrollee Wi-Fi Protected Setup State %d",
1524                    *state);
1525
1526         return 0;
1527 }
1528
1529
1530 static int wps_process_assoc_state(struct wps_data *wps, const u8 *assoc)
1531 {
1532         u16 a;
1533
1534         if (assoc == NULL) {
1535                 wpa_printf(MSG_DEBUG, "WPS: No Association State received");
1536                 return -1;
1537         }
1538
1539         a = WPA_GET_BE16(assoc);
1540         wpa_printf(MSG_DEBUG, "WPS: Enrollee Association State %d", a);
1541
1542         return 0;
1543 }
1544
1545
1546 static int wps_process_config_error(struct wps_data *wps, const u8 *err)
1547 {
1548         u16 e;
1549
1550         if (err == NULL) {
1551                 wpa_printf(MSG_DEBUG, "WPS: No Configuration Error received");
1552                 return -1;
1553         }
1554
1555         e = WPA_GET_BE16(err);
1556         wpa_printf(MSG_DEBUG, "WPS: Enrollee Configuration Error %d", e);
1557
1558         return 0;
1559 }
1560
1561
1562 static enum wps_process_res wps_process_m1(struct wps_data *wps,
1563                                            struct wps_parse_attr *attr)
1564 {
1565         wpa_printf(MSG_DEBUG, "WPS: Received M1");
1566
1567         if (wps->state != RECV_M1) {
1568                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
1569                            "receiving M1", wps->state);
1570                 return WPS_FAILURE;
1571         }
1572
1573         if (wps_process_uuid_e(wps, attr->uuid_e) ||
1574             wps_process_mac_addr(wps, attr->mac_addr) ||
1575             wps_process_enrollee_nonce(wps, attr->enrollee_nonce) ||
1576             wps_process_pubkey(wps, attr->public_key, attr->public_key_len) ||
1577             wps_process_auth_type_flags(wps, attr->auth_type_flags) ||
1578             wps_process_encr_type_flags(wps, attr->encr_type_flags) ||
1579             wps_process_conn_type_flags(wps, attr->conn_type_flags) ||
1580             wps_process_config_methods(wps, attr->config_methods) ||
1581             wps_process_wps_state(wps, attr->wps_state) ||
1582             wps_process_device_attrs(&wps->peer_dev, attr) ||
1583             wps_process_rf_bands(&wps->peer_dev, attr->rf_bands) ||
1584             wps_process_assoc_state(wps, attr->assoc_state) ||
1585             wps_process_dev_password_id(wps, attr->dev_password_id) ||
1586             wps_process_config_error(wps, attr->config_error) ||
1587             wps_process_os_version(&wps->peer_dev, attr->os_version))
1588                 return WPS_FAILURE;
1589
1590         if (wps->dev_pw_id != DEV_PW_DEFAULT &&
1591             wps->dev_pw_id != DEV_PW_USER_SPECIFIED &&
1592             wps->dev_pw_id != DEV_PW_MACHINE_SPECIFIED &&
1593             wps->dev_pw_id != DEV_PW_REGISTRAR_SPECIFIED &&
1594             (wps->dev_pw_id != DEV_PW_PUSHBUTTON || !wps->registrar->pbc)) {
1595                 wpa_printf(MSG_DEBUG, "WPS: Unsupported Device Password ID %d",
1596                            wps->dev_pw_id);
1597                 wps->state = SEND_M2D;
1598                 return WPS_CONTINUE;
1599         }
1600
1601         if (wps->dev_pw_id == DEV_PW_PUSHBUTTON) {
1602                 if (wps_registrar_pbc_overlap(wps->registrar, wps->mac_addr_e,
1603                                               wps->uuid_e)) {
1604                         wpa_printf(MSG_DEBUG, "WPS: PBC overlap - deny PBC "
1605                                    "negotiation");
1606                         wps->state = SEND_M2D;
1607                         return WPS_CONTINUE;
1608                 }
1609                 wps_registrar_add_pbc_session(wps->registrar, wps->mac_addr_e,
1610                                               wps->uuid_e);
1611                 wps->pbc = 1;
1612         }
1613
1614         wps->state = SEND_M2;
1615         return WPS_CONTINUE;
1616 }
1617
1618
1619 static enum wps_process_res wps_process_m3(struct wps_data *wps,
1620                                            const struct wpabuf *msg,
1621                                            struct wps_parse_attr *attr)
1622 {
1623         wpa_printf(MSG_DEBUG, "WPS: Received M3");
1624
1625         if (wps->state != RECV_M3) {
1626                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
1627                            "receiving M3", wps->state);
1628                 return WPS_FAILURE;
1629         }
1630
1631         if (wps_process_registrar_nonce(wps, attr->registrar_nonce) ||
1632             wps_process_authenticator(wps, attr->authenticator, msg) ||
1633             wps_process_e_hash1(wps, attr->e_hash1) ||
1634             wps_process_e_hash2(wps, attr->e_hash2))
1635                 return WPS_FAILURE;
1636
1637         wps->state = SEND_M4;
1638         return WPS_CONTINUE;
1639 }
1640
1641
1642 static enum wps_process_res wps_process_m5(struct wps_data *wps,
1643                                            const struct wpabuf *msg,
1644                                            struct wps_parse_attr *attr)
1645 {
1646         struct wpabuf *decrypted;
1647         struct wps_parse_attr eattr;
1648
1649         wpa_printf(MSG_DEBUG, "WPS: Received M5");
1650
1651         if (wps->state != RECV_M5) {
1652                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
1653                            "receiving M5", wps->state);
1654                 return WPS_FAILURE;
1655         }
1656
1657         if (wps_process_registrar_nonce(wps, attr->registrar_nonce) ||
1658             wps_process_authenticator(wps, attr->authenticator, msg))
1659                 return WPS_FAILURE;
1660
1661         decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings,
1662                                               attr->encr_settings_len);
1663         if (decrypted == NULL) {
1664                 wpa_printf(MSG_DEBUG, "WPS: Failed to decrypted Encrypted "
1665                            "Settings attribute");
1666                 return WPS_FAILURE;
1667         }
1668
1669         wpa_printf(MSG_DEBUG, "WPS: Processing decrypted Encrypted Settings "
1670                    "attribute");
1671         if (wps_parse_msg(decrypted, &eattr) < 0 ||
1672             wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) ||
1673             wps_process_e_snonce1(wps, eattr.e_snonce1)) {
1674                 wpabuf_free(decrypted);
1675                 return WPS_FAILURE;
1676         }
1677         wpabuf_free(decrypted);
1678
1679         wps->state = SEND_M6;
1680         return WPS_CONTINUE;
1681 }
1682
1683
1684 static int wps_process_ap_settings_r(struct wps_data *wps,
1685                                      struct wps_parse_attr *attr)
1686 {
1687         if (wps->wps->ap)
1688                 return 0;
1689
1690         /* AP Settings Attributes in M7 when Enrollee is an AP */
1691         if (wps_process_ap_settings(attr, &wps->cred) < 0)
1692                 return -1;
1693
1694         wpa_printf(MSG_INFO, "WPS: Received old AP configuration from AP");
1695
1696         /*
1697          * TODO: Provide access to AP settings and allow changes before sending
1698          * out M8. For now, just copy the settings unchanged into M8.
1699          */
1700
1701         return 0;
1702 }
1703
1704
1705 static enum wps_process_res wps_process_m7(struct wps_data *wps,
1706                                            const struct wpabuf *msg,
1707                                            struct wps_parse_attr *attr)
1708 {
1709         struct wpabuf *decrypted;
1710         struct wps_parse_attr eattr;
1711
1712         wpa_printf(MSG_DEBUG, "WPS: Received M7");
1713
1714         if (wps->state != RECV_M7) {
1715                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
1716                            "receiving M7", wps->state);
1717                 return WPS_FAILURE;
1718         }
1719
1720         if (wps_process_registrar_nonce(wps, attr->registrar_nonce) ||
1721             wps_process_authenticator(wps, attr->authenticator, msg))
1722                 return WPS_FAILURE;
1723
1724         decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings,
1725                                               attr->encr_settings_len);
1726         if (decrypted == NULL) {
1727                 wpa_printf(MSG_DEBUG, "WPS: Failed to decrypted Encrypted "
1728                            "Settings attribute");
1729                 return WPS_FAILURE;
1730         }
1731
1732         wpa_printf(MSG_DEBUG, "WPS: Processing decrypted Encrypted Settings "
1733                    "attribute");
1734         if (wps_parse_msg(decrypted, &eattr) < 0 ||
1735             wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) ||
1736             wps_process_e_snonce2(wps, eattr.e_snonce2) ||
1737             wps_process_ap_settings_r(wps, &eattr)) {
1738                 wpabuf_free(decrypted);
1739                 return WPS_FAILURE;
1740         }
1741
1742         wpabuf_free(decrypted);
1743
1744         wps->state = SEND_M8;
1745         return WPS_CONTINUE;
1746 }
1747
1748
1749 static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
1750                                                 const struct wpabuf *msg)
1751 {
1752         struct wps_parse_attr attr;
1753         enum wps_process_res ret = WPS_CONTINUE;
1754
1755         wpa_printf(MSG_DEBUG, "WPS: Received WSC_MSG");
1756
1757         if (wps_parse_msg(msg, &attr) < 0)
1758                 return WPS_FAILURE;
1759
1760         if (attr.version == NULL || *attr.version != WPS_VERSION) {
1761                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
1762                            attr.version ? *attr.version : 0);
1763                 return WPS_FAILURE;
1764         }
1765
1766         if (attr.msg_type == NULL) {
1767                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
1768                 return WPS_FAILURE;
1769         }
1770
1771         if (*attr.msg_type != WPS_M1 &&
1772             (attr.registrar_nonce == NULL ||
1773              os_memcmp(wps->nonce_r, attr.registrar_nonce,
1774                        WPS_NONCE_LEN != 0))) {
1775                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
1776                 return WPS_FAILURE;
1777         }
1778
1779         switch (*attr.msg_type) {
1780         case WPS_M1:
1781                 ret = wps_process_m1(wps, &attr);
1782                 break;
1783         case WPS_M3:
1784                 ret = wps_process_m3(wps, msg, &attr);
1785                 break;
1786         case WPS_M5:
1787                 ret = wps_process_m5(wps, msg, &attr);
1788                 break;
1789         case WPS_M7:
1790                 ret = wps_process_m7(wps, msg, &attr);
1791                 break;
1792         default:
1793                 wpa_printf(MSG_DEBUG, "WPS: Unsupported Message Type %d",
1794                            *attr.msg_type);
1795                 return WPS_FAILURE;
1796         }
1797
1798         if (ret == WPS_CONTINUE) {
1799                 /* Save a copy of the last message for Authenticator derivation
1800                  */
1801                 wpabuf_free(wps->last_msg);
1802                 wps->last_msg = wpabuf_dup(msg);
1803         }
1804
1805         return ret;
1806 }
1807
1808
1809 static enum wps_process_res wps_process_wsc_ack(struct wps_data *wps,
1810                                                 const struct wpabuf *msg)
1811 {
1812         struct wps_parse_attr attr;
1813
1814         wpa_printf(MSG_DEBUG, "WPS: Received WSC_ACK");
1815
1816         if (wps_parse_msg(msg, &attr) < 0)
1817                 return WPS_FAILURE;
1818
1819         if (attr.version == NULL || *attr.version != WPS_VERSION) {
1820                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
1821                            attr.version ? *attr.version : 0);
1822                 return WPS_FAILURE;
1823         }
1824
1825         if (attr.msg_type == NULL) {
1826                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
1827                 return WPS_FAILURE;
1828         }
1829
1830         if (*attr.msg_type != WPS_WSC_ACK) {
1831                 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
1832                            *attr.msg_type);
1833                 return WPS_FAILURE;
1834         }
1835
1836         if (attr.registrar_nonce == NULL ||
1837             os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
1838         {
1839                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
1840                 return WPS_FAILURE;
1841         }
1842
1843         if (attr.enrollee_nonce == NULL ||
1844             os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
1845                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
1846                 return WPS_FAILURE;
1847         }
1848
1849         if (wps->state == RECV_M2D_ACK) {
1850                 /* TODO: support for multiple registrars and sending of
1851                  * multiple M2/M2D messages */
1852
1853                 wpa_printf(MSG_DEBUG, "WPS: No more registrars available - "
1854                            "terminate negotiation");
1855         }
1856
1857         return WPS_FAILURE;
1858 }
1859
1860
1861 static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps,
1862                                                  const struct wpabuf *msg)
1863 {
1864         struct wps_parse_attr attr;
1865
1866         wpa_printf(MSG_DEBUG, "WPS: Received WSC_NACK");
1867
1868         if (wps_parse_msg(msg, &attr) < 0)
1869                 return WPS_FAILURE;
1870
1871         if (attr.version == NULL || *attr.version != WPS_VERSION) {
1872                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
1873                            attr.version ? *attr.version : 0);
1874                 return WPS_FAILURE;
1875         }
1876
1877         if (attr.msg_type == NULL) {
1878                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
1879                 return WPS_FAILURE;
1880         }
1881
1882         if (*attr.msg_type != WPS_WSC_NACK) {
1883                 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
1884                            *attr.msg_type);
1885                 return WPS_FAILURE;
1886         }
1887
1888         if (attr.registrar_nonce == NULL ||
1889             os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
1890         {
1891                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
1892                 return WPS_FAILURE;
1893         }
1894
1895         if (attr.enrollee_nonce == NULL ||
1896             os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
1897                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
1898                 return WPS_FAILURE;
1899         }
1900
1901         if (attr.config_error == NULL) {
1902                 wpa_printf(MSG_DEBUG, "WPS: No Configuration Error attribute "
1903                            "in WSC_NACK");
1904                 return WPS_FAILURE;
1905         }
1906
1907         wpa_printf(MSG_DEBUG, "WPS: Enrollee terminated negotiation with "
1908                    "Configuration Error %d", WPA_GET_BE16(attr.config_error));
1909
1910         return WPS_FAILURE;
1911 }
1912
1913
1914 static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,
1915                                                  const struct wpabuf *msg)
1916 {
1917         struct wps_parse_attr attr;
1918
1919         wpa_printf(MSG_DEBUG, "WPS: Received WSC_Done");
1920
1921         if (wps->state != RECV_DONE) {
1922                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
1923                            "receiving WSC_Done", wps->state);
1924                 return WPS_FAILURE;
1925         }
1926
1927         if (wps_parse_msg(msg, &attr) < 0)
1928                 return WPS_FAILURE;
1929
1930         if (attr.version == NULL || *attr.version != WPS_VERSION) {
1931                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
1932                            attr.version ? *attr.version : 0);
1933                 return WPS_FAILURE;
1934         }
1935
1936         if (attr.msg_type == NULL) {
1937                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
1938                 return WPS_FAILURE;
1939         }
1940
1941         if (*attr.msg_type != WPS_WSC_DONE) {
1942                 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
1943                            *attr.msg_type);
1944                 return WPS_FAILURE;
1945         }
1946
1947         if (attr.registrar_nonce == NULL ||
1948             os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
1949         {
1950                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
1951                 return WPS_FAILURE;
1952         }
1953
1954         if (attr.enrollee_nonce == NULL ||
1955             os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
1956                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
1957                 return WPS_FAILURE;
1958         }
1959
1960         wpa_printf(MSG_DEBUG, "WPS: Negotiation completed successfully");
1961
1962         if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->new_psk &&
1963             wps->wps->ap) {
1964                 struct wps_credential cred;
1965
1966                 wpa_printf(MSG_DEBUG, "WPS: Moving to Configured state based "
1967                            "on first Enrollee connection");
1968
1969                 os_memset(&cred, 0, sizeof(cred));
1970                 os_memcpy(cred.ssid, wps->wps->ssid, wps->wps->ssid_len);
1971                 cred.ssid_len = wps->wps->ssid_len;
1972                 cred.auth_type = WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK;
1973                 cred.encr_type = WPS_ENCR_TKIP | WPS_ENCR_AES;
1974                 os_memcpy(cred.key, wps->new_psk, wps->new_psk_len);
1975                 cred.key_len = wps->new_psk_len;
1976
1977                 wps->wps->wps_state = WPS_STATE_CONFIGURED;
1978                 wpa_hexdump_ascii_key(MSG_DEBUG,
1979                                       "WPS: Generated random passphrase",
1980                                       wps->new_psk, wps->new_psk_len);
1981                 if (wps->wps->cred_cb)
1982                         wps->wps->cred_cb(wps->wps->cb_ctx, &cred);
1983
1984                 os_free(wps->new_psk);
1985                 wps->new_psk = NULL;
1986         }
1987
1988         if (!wps->wps->ap) {
1989                 wpa_printf(MSG_DEBUG, "WPS: Update local configuration based "
1990                            "on the modified AP configuration");
1991                 if (wps->wps->cred_cb)
1992                         wps->wps->cred_cb(wps->wps->cb_ctx, &wps->cred);
1993         }
1994
1995         if (wps->new_psk) {
1996                 if (wps_cb_new_psk(wps->registrar, wps->mac_addr_e,
1997                                    wps->new_psk, wps->new_psk_len)) {
1998                         wpa_printf(MSG_DEBUG, "WPS: Failed to configure the "
1999                                    "new PSK");
2000                 }
2001                 os_free(wps->new_psk);
2002                 wps->new_psk = NULL;
2003         }
2004
2005         if (wps->pbc) {
2006                 wps_registrar_remove_pbc_session(wps->registrar,
2007                                                  wps->mac_addr_e, wps->uuid_e);
2008                 wps_registrar_pbc_completed(wps->registrar);
2009         }
2010
2011         return WPS_DONE;
2012 }
2013
2014
2015 enum wps_process_res wps_registrar_process_msg(struct wps_data *wps,
2016                                                u8 op_code,
2017                                                const struct wpabuf *msg)
2018 {
2019
2020         wpa_printf(MSG_DEBUG, "WPS: Processing received message (len=%lu "
2021                    "op_code=%d)",
2022                    (unsigned long) wpabuf_len(msg), op_code);
2023
2024         switch (op_code) {
2025         case WSC_MSG:
2026                 return wps_process_wsc_msg(wps, msg);
2027         case WSC_ACK:
2028                 return wps_process_wsc_ack(wps, msg);
2029         case WSC_NACK:
2030                 return wps_process_wsc_nack(wps, msg);
2031         case WSC_Done:
2032                 return wps_process_wsc_done(wps, msg);
2033         default:
2034                 wpa_printf(MSG_DEBUG, "WPS: Unsupported op_code %d", op_code);
2035                 return WPS_FAILURE;
2036         }
2037 }