def2d42bb5225f94b747ecee72a5b3773c547cc4
[libeap.git] / src / wps / wps_registrar.c
1 /*
2  * Wi-Fi Protected Setup - Registrar
3  * Copyright (c) 2008-2009, 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 #include "wps_upnp.h"
25 #include "crypto.h"
26 #include "uuid.h"
27
28 #define WPS_WORKAROUNDS
29
30 struct wps_uuid_pin {
31         struct wps_uuid_pin *next;
32         u8 uuid[WPS_UUID_LEN];
33         int wildcard_uuid;
34         u8 *pin;
35         size_t pin_len;
36 #define PIN_LOCKED BIT(0)
37 #define PIN_EXPIRES BIT(1)
38         int flags;
39         struct os_time expiration;
40 };
41
42
43 static void wps_free_pin(struct wps_uuid_pin *pin)
44 {
45         os_free(pin->pin);
46         os_free(pin);
47 }
48
49
50 static void wps_free_pins(struct wps_uuid_pin *pins)
51 {
52         struct wps_uuid_pin *pin, *prev;
53
54         pin = pins;
55         while (pin) {
56                 prev = pin;
57                 pin = pin->next;
58                 wps_free_pin(prev);
59         }
60 }
61
62
63 struct wps_pbc_session {
64         struct wps_pbc_session *next;
65         u8 addr[ETH_ALEN];
66         u8 uuid_e[WPS_UUID_LEN];
67         struct os_time timestamp;
68 };
69
70
71 static void wps_free_pbc_sessions(struct wps_pbc_session *pbc)
72 {
73         struct wps_pbc_session *prev;
74
75         while (pbc) {
76                 prev = pbc;
77                 pbc = pbc->next;
78                 os_free(prev);
79         }
80 }
81
82
83 struct wps_registrar_device {
84         struct wps_registrar_device *next;
85         struct wps_device_data dev;
86         u8 uuid[WPS_UUID_LEN];
87 };
88
89
90 struct wps_registrar {
91         struct wps_context *wps;
92
93         int pbc;
94         int selected_registrar;
95
96         int (*new_psk_cb)(void *ctx, const u8 *mac_addr, const u8 *psk,
97                           size_t psk_len);
98         int (*set_ie_cb)(void *ctx, const u8 *beacon_ie, size_t beacon_ie_len,
99                          const u8 *probe_resp_ie, size_t probe_resp_ie_len);
100         void (*pin_needed_cb)(void *ctx, const u8 *uuid_e,
101                               const struct wps_device_data *dev);
102         void (*reg_success_cb)(void *ctx, const u8 *mac_addr,
103                                const u8 *uuid_e);
104         void (*set_sel_reg_cb)(void *ctx, int sel_reg, u16 dev_passwd_id,
105                                u16 sel_reg_config_methods);
106         void *cb_ctx;
107
108         struct wps_uuid_pin *pins;
109         struct wps_pbc_session *pbc_sessions;
110
111         int skip_cred_build;
112         struct wpabuf *extra_cred;
113         int disable_auto_conf;
114         int sel_reg_dev_password_id_override;
115         int sel_reg_config_methods_override;
116         int static_wep_only;
117
118         struct wps_registrar_device *devices;
119
120         int force_pbc_overlap;
121 };
122
123
124 static int wps_set_ie(struct wps_registrar *reg);
125 static void wps_cb_set_sel_reg(struct wps_registrar *reg);
126 static void wps_registrar_pbc_timeout(void *eloop_ctx, void *timeout_ctx);
127 static void wps_registrar_set_selected_timeout(void *eloop_ctx,
128                                                void *timeout_ctx);
129
130
131 static void wps_free_devices(struct wps_registrar_device *dev)
132 {
133         struct wps_registrar_device *prev;
134
135         while (dev) {
136                 prev = dev;
137                 dev = dev->next;
138                 wps_device_data_free(&prev->dev);
139                 os_free(prev);
140         }
141 }
142
143
144 static struct wps_registrar_device * wps_device_get(struct wps_registrar *reg,
145                                                     const u8 *addr)
146 {
147         struct wps_registrar_device *dev;
148
149         for (dev = reg->devices; dev; dev = dev->next) {
150                 if (os_memcmp(dev->dev.mac_addr, addr, ETH_ALEN) == 0)
151                         return dev;
152         }
153         return NULL;
154 }
155
156
157 static void wps_device_clone_data(struct wps_device_data *dst,
158                                   struct wps_device_data *src)
159 {
160         os_memcpy(dst->mac_addr, src->mac_addr, ETH_ALEN);
161         dst->categ = src->categ;
162         dst->oui = src->oui;
163         dst->sub_categ = src->sub_categ;
164
165 #define WPS_STRDUP(n) \
166         os_free(dst->n); \
167         dst->n = src->n ? os_strdup(src->n) : NULL
168
169         WPS_STRDUP(device_name);
170         WPS_STRDUP(manufacturer);
171         WPS_STRDUP(model_name);
172         WPS_STRDUP(model_number);
173         WPS_STRDUP(serial_number);
174 #undef WPS_STRDUP
175 }
176
177
178 int wps_device_store(struct wps_registrar *reg,
179                      struct wps_device_data *dev, const u8 *uuid)
180 {
181         struct wps_registrar_device *d;
182
183         d = wps_device_get(reg, dev->mac_addr);
184         if (d == NULL) {
185                 d = os_zalloc(sizeof(*d));
186                 if (d == NULL)
187                         return -1;
188                 d->next = reg->devices;
189                 reg->devices = d;
190         }
191
192         wps_device_clone_data(&d->dev, dev);
193         os_memcpy(d->uuid, uuid, WPS_UUID_LEN);
194
195         return 0;
196 }
197
198
199 static void wps_registrar_add_pbc_session(struct wps_registrar *reg,
200                                           const u8 *addr, const u8 *uuid_e)
201 {
202         struct wps_pbc_session *pbc, *prev = NULL;
203         struct os_time now;
204
205         os_get_time(&now);
206
207         pbc = reg->pbc_sessions;
208         while (pbc) {
209                 if (os_memcmp(pbc->addr, addr, ETH_ALEN) == 0 &&
210                     os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0) {
211                         if (prev)
212                                 prev->next = pbc->next;
213                         else
214                                 reg->pbc_sessions = pbc->next;
215                         break;
216                 }
217                 prev = pbc;
218                 pbc = pbc->next;
219         }
220
221         if (!pbc) {
222                 pbc = os_zalloc(sizeof(*pbc));
223                 if (pbc == NULL)
224                         return;
225                 os_memcpy(pbc->addr, addr, ETH_ALEN);
226                 if (uuid_e)
227                         os_memcpy(pbc->uuid_e, uuid_e, WPS_UUID_LEN);
228         }
229
230         pbc->next = reg->pbc_sessions;
231         reg->pbc_sessions = pbc;
232         pbc->timestamp = now;
233
234         /* remove entries that have timed out */
235         prev = pbc;
236         pbc = pbc->next;
237
238         while (pbc) {
239                 if (now.sec > pbc->timestamp.sec + WPS_PBC_WALK_TIME) {
240                         prev->next = NULL;
241                         wps_free_pbc_sessions(pbc);
242                         break;
243                 }
244                 prev = pbc;
245                 pbc = pbc->next;
246         }
247 }
248
249
250 static void wps_registrar_remove_pbc_session(struct wps_registrar *reg,
251                                              const u8 *addr, const u8 *uuid_e)
252 {
253         struct wps_pbc_session *pbc, *prev = NULL;
254
255         pbc = reg->pbc_sessions;
256         while (pbc) {
257                 if (os_memcmp(pbc->addr, addr, ETH_ALEN) == 0 &&
258                     os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0) {
259                         if (prev)
260                                 prev->next = pbc->next;
261                         else
262                                 reg->pbc_sessions = pbc->next;
263                         os_free(pbc);
264                         break;
265                 }
266                 prev = pbc;
267                 pbc = pbc->next;
268         }
269 }
270
271
272 static int wps_registrar_pbc_overlap(struct wps_registrar *reg,
273                                      const u8 *addr, const u8 *uuid_e)
274 {
275         int count = 0;
276         struct wps_pbc_session *pbc;
277         struct os_time now;
278
279         os_get_time(&now);
280
281         for (pbc = reg->pbc_sessions; pbc; pbc = pbc->next) {
282                 if (now.sec > pbc->timestamp.sec + WPS_PBC_WALK_TIME)
283                         break;
284                 if (addr == NULL || os_memcmp(addr, pbc->addr, ETH_ALEN) ||
285                     uuid_e == NULL ||
286                     os_memcmp(uuid_e, pbc->uuid_e, WPS_UUID_LEN))
287                         count++;
288         }
289
290         if (addr || uuid_e)
291                 count++;
292
293         return count > 1 ? 1 : 0;
294 }
295
296
297 static int wps_build_wps_state(struct wps_context *wps, struct wpabuf *msg)
298 {
299         wpa_printf(MSG_DEBUG, "WPS:  * Wi-Fi Protected Setup State (%d)",
300                    wps->wps_state);
301         wpabuf_put_be16(msg, ATTR_WPS_STATE);
302         wpabuf_put_be16(msg, 1);
303         wpabuf_put_u8(msg, wps->wps_state);
304         return 0;
305 }
306
307
308 #ifdef CONFIG_WPS_UPNP
309 static void wps_registrar_free_pending_m2(struct wps_context *wps)
310 {
311         struct upnp_pending_message *p, *p2, *prev = NULL;
312         p = wps->upnp_msgs;
313         while (p) {
314                 if (p->type == WPS_M2 || p->type == WPS_M2D) {
315                         if (prev == NULL)
316                                 wps->upnp_msgs = p->next;
317                         else
318                                 prev->next = p->next;
319                         wpa_printf(MSG_DEBUG, "WPS UPnP: Drop pending M2/M2D");
320                         p2 = p;
321                         p = p->next;
322                         wpabuf_free(p2->msg);
323                         os_free(p2);
324                         continue;
325                 }
326                 prev = p;
327                 p = p->next;
328         }
329 }
330 #endif /* CONFIG_WPS_UPNP */
331
332
333 static int wps_build_ap_setup_locked(struct wps_context *wps,
334                                      struct wpabuf *msg)
335 {
336         if (wps->ap_setup_locked) {
337                 wpa_printf(MSG_DEBUG, "WPS:  * AP Setup Locked");
338                 wpabuf_put_be16(msg, ATTR_AP_SETUP_LOCKED);
339                 wpabuf_put_be16(msg, 1);
340                 wpabuf_put_u8(msg, 1);
341         }
342         return 0;
343 }
344
345
346 static int wps_build_selected_registrar(struct wps_registrar *reg,
347                                         struct wpabuf *msg)
348 {
349         if (!reg->selected_registrar)
350                 return 0;
351         wpa_printf(MSG_DEBUG, "WPS:  * Selected Registrar");
352         wpabuf_put_be16(msg, ATTR_SELECTED_REGISTRAR);
353         wpabuf_put_be16(msg, 1);
354         wpabuf_put_u8(msg, 1);
355         return 0;
356 }
357
358
359 static int wps_build_sel_reg_dev_password_id(struct wps_registrar *reg,
360                                              struct wpabuf *msg)
361 {
362         u16 id = reg->pbc ? DEV_PW_PUSHBUTTON : DEV_PW_DEFAULT;
363         if (!reg->selected_registrar)
364                 return 0;
365         if (reg->sel_reg_dev_password_id_override >= 0)
366                 id = reg->sel_reg_dev_password_id_override;
367         wpa_printf(MSG_DEBUG, "WPS:  * Device Password ID (%d)", id);
368         wpabuf_put_be16(msg, ATTR_DEV_PASSWORD_ID);
369         wpabuf_put_be16(msg, 2);
370         wpabuf_put_be16(msg, id);
371         return 0;
372 }
373
374
375 static int wps_build_sel_reg_config_methods(struct wps_registrar *reg,
376                                             struct wpabuf *msg)
377 {
378         u16 methods;
379         if (!reg->selected_registrar)
380                 return 0;
381         methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON;
382         if (reg->pbc)
383                 methods |= WPS_CONFIG_PUSHBUTTON;
384         if (reg->sel_reg_config_methods_override >= 0)
385                 methods = reg->sel_reg_config_methods_override;
386         wpa_printf(MSG_DEBUG, "WPS:  * Selected Registrar Config Methods (%x)",
387                    methods);
388         wpabuf_put_be16(msg, ATTR_SELECTED_REGISTRAR_CONFIG_METHODS);
389         wpabuf_put_be16(msg, 2);
390         wpabuf_put_be16(msg, methods);
391         return 0;
392 }
393
394
395 static int wps_build_probe_config_methods(struct wps_registrar *reg,
396                                           struct wpabuf *msg)
397 {
398         u16 methods;
399         methods = 0;
400         wpa_printf(MSG_DEBUG, "WPS:  * Config Methods (%x)", methods);
401         wpabuf_put_be16(msg, ATTR_CONFIG_METHODS);
402         wpabuf_put_be16(msg, 2);
403         wpabuf_put_be16(msg, methods);
404         return 0;
405 }
406
407
408 static int wps_build_config_methods_r(struct wps_registrar *reg,
409                                       struct wpabuf *msg)
410 {
411         u16 methods;
412         methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON;
413         if (reg->pbc)
414                 methods |= WPS_CONFIG_PUSHBUTTON;
415         return wps_build_config_methods(msg, methods);
416 }
417
418
419 static int wps_build_resp_type(struct wps_registrar *reg, struct wpabuf *msg)
420 {
421         u8 resp = reg->wps->ap ? WPS_RESP_AP : WPS_RESP_REGISTRAR;
422         wpa_printf(MSG_DEBUG, "WPS:  * Response Type (%d)", resp);
423         wpabuf_put_be16(msg, ATTR_RESPONSE_TYPE);
424         wpabuf_put_be16(msg, 1);
425         wpabuf_put_u8(msg, resp);
426         return 0;
427 }
428
429
430 /**
431  * wps_registrar_init - Initialize WPS Registrar data
432  * @wps: Pointer to longterm WPS context
433  * @cfg: Registrar configuration
434  * Returns: Pointer to allocated Registrar data or %NULL on failure
435  *
436  * This function is used to initialize WPS Registrar functionality. It can be
437  * used for a single Registrar run (e.g., when run in a supplicant) or multiple
438  * runs (e.g., when run as an internal Registrar in an AP). Caller is
439  * responsible for freeing the returned data with wps_registrar_deinit() when
440  * Registrar functionality is not needed anymore.
441  */
442 struct wps_registrar *
443 wps_registrar_init(struct wps_context *wps,
444                    const struct wps_registrar_config *cfg)
445 {
446         struct wps_registrar *reg = os_zalloc(sizeof(*reg));
447         if (reg == NULL)
448                 return NULL;
449
450         reg->wps = wps;
451         reg->new_psk_cb = cfg->new_psk_cb;
452         reg->set_ie_cb = cfg->set_ie_cb;
453         reg->pin_needed_cb = cfg->pin_needed_cb;
454         reg->reg_success_cb = cfg->reg_success_cb;
455         reg->set_sel_reg_cb = cfg->set_sel_reg_cb;
456         reg->cb_ctx = cfg->cb_ctx;
457         reg->skip_cred_build = cfg->skip_cred_build;
458         if (cfg->extra_cred) {
459                 reg->extra_cred = wpabuf_alloc_copy(cfg->extra_cred,
460                                                     cfg->extra_cred_len);
461                 if (reg->extra_cred == NULL) {
462                         os_free(reg);
463                         return NULL;
464                 }
465         }
466         reg->disable_auto_conf = cfg->disable_auto_conf;
467         reg->sel_reg_dev_password_id_override = -1;
468         reg->sel_reg_config_methods_override = -1;
469         reg->static_wep_only = cfg->static_wep_only;
470
471         if (wps_set_ie(reg)) {
472                 wps_registrar_deinit(reg);
473                 return NULL;
474         }
475
476         return reg;
477 }
478
479
480 /**
481  * wps_registrar_deinit - Deinitialize WPS Registrar data
482  * @reg: Registrar data from wps_registrar_init()
483  */
484 void wps_registrar_deinit(struct wps_registrar *reg)
485 {
486         if (reg == NULL)
487                 return;
488         eloop_cancel_timeout(wps_registrar_pbc_timeout, reg, NULL);
489         eloop_cancel_timeout(wps_registrar_set_selected_timeout, reg, NULL);
490         wps_free_pins(reg->pins);
491         wps_free_pbc_sessions(reg->pbc_sessions);
492         wpabuf_free(reg->extra_cred);
493         wps_free_devices(reg->devices);
494         os_free(reg);
495 }
496
497
498 /**
499  * wps_registrar_add_pin - Configure a new PIN for Registrar
500  * @reg: Registrar data from wps_registrar_init()
501  * @uuid: UUID-E or %NULL for wildcard (any UUID)
502  * @pin: PIN (Device Password)
503  * @pin_len: Length of pin in octets
504  * @timeout: Time (in seconds) when the PIN will be invalidated; 0 = no timeout
505  * Returns: 0 on success, -1 on failure
506  */
507 int wps_registrar_add_pin(struct wps_registrar *reg, const u8 *uuid,
508                           const u8 *pin, size_t pin_len, int timeout)
509 {
510         struct wps_uuid_pin *p;
511
512         p = os_zalloc(sizeof(*p));
513         if (p == NULL)
514                 return -1;
515         if (uuid == NULL)
516                 p->wildcard_uuid = 1;
517         else
518                 os_memcpy(p->uuid, uuid, WPS_UUID_LEN);
519         p->pin = os_malloc(pin_len);
520         if (p->pin == NULL) {
521                 os_free(p);
522                 return -1;
523         }
524         os_memcpy(p->pin, pin, pin_len);
525         p->pin_len = pin_len;
526
527         if (timeout) {
528                 p->flags |= PIN_EXPIRES;
529                 os_get_time(&p->expiration);
530                 p->expiration.sec += timeout;
531         }
532
533         p->next = reg->pins;
534         reg->pins = p;
535
536         wpa_printf(MSG_DEBUG, "WPS: A new PIN configured (timeout=%d)",
537                    timeout);
538         wpa_hexdump(MSG_DEBUG, "WPS: UUID", uuid, WPS_UUID_LEN);
539         wpa_hexdump_ascii_key(MSG_DEBUG, "WPS: PIN", pin, pin_len);
540         reg->selected_registrar = 1;
541         reg->pbc = 0;
542         wps_set_ie(reg);
543         wps_cb_set_sel_reg(reg);
544         eloop_cancel_timeout(wps_registrar_set_selected_timeout, reg, NULL);
545         eloop_register_timeout(WPS_PBC_WALK_TIME, 0,
546                                wps_registrar_set_selected_timeout,
547                                reg, NULL);
548
549         return 0;
550 }
551
552
553 static void wps_registrar_expire_pins(struct wps_registrar *reg)
554 {
555         struct wps_uuid_pin *pin, *prev, *del;
556         struct os_time now;
557
558         os_get_time(&now);
559         prev = NULL;
560         pin = reg->pins;
561         while (pin) {
562                 if ((pin->flags & PIN_EXPIRES) &&
563                     os_time_before(&pin->expiration, &now)) {
564                         if (prev == NULL)
565                                 reg->pins = pin->next;
566                         else
567                                 prev->next = pin->next;
568                         del = pin;
569                         pin = pin->next;
570                         wpa_hexdump(MSG_DEBUG, "WPS: Expired PIN for UUID",
571                                     del->uuid, WPS_UUID_LEN);
572                         wps_free_pin(del);
573                         continue;
574                 }
575                 prev = pin;
576                 pin = pin->next;
577         }
578 }
579
580
581 /**
582  * wps_registrar_invalidate_pin - Invalidate a PIN for a specific UUID-E
583  * @reg: Registrar data from wps_registrar_init()
584  * @uuid: UUID-E
585  * Returns: 0 on success, -1 on failure (e.g., PIN not found)
586  */
587 int wps_registrar_invalidate_pin(struct wps_registrar *reg, const u8 *uuid)
588 {
589         struct wps_uuid_pin *pin, *prev;
590
591         prev = NULL;
592         pin = reg->pins;
593         while (pin) {
594                 if (os_memcmp(pin->uuid, uuid, WPS_UUID_LEN) == 0) {
595                         if (prev == NULL)
596                                 reg->pins = pin->next;
597                         else
598                                 prev->next = pin->next;
599                         wpa_hexdump(MSG_DEBUG, "WPS: Invalidated PIN for UUID",
600                                     pin->uuid, WPS_UUID_LEN);
601                         wps_free_pin(pin);
602                         return 0;
603                 }
604                 prev = pin;
605                 pin = pin->next;
606         }
607
608         return -1;
609 }
610
611
612 static const u8 * wps_registrar_get_pin(struct wps_registrar *reg,
613                                         const u8 *uuid, size_t *pin_len)
614 {
615         struct wps_uuid_pin *pin;
616
617         wps_registrar_expire_pins(reg);
618
619         pin = reg->pins;
620         while (pin) {
621                 if (!pin->wildcard_uuid &&
622                     os_memcmp(pin->uuid, uuid, WPS_UUID_LEN) == 0)
623                         break;
624                 pin = pin->next;
625         }
626
627         if (!pin) {
628                 /* Check for wildcard UUIDs since none of the UUID-specific
629                  * PINs matched */
630                 pin = reg->pins;
631                 while (pin) {
632                         if (pin->wildcard_uuid == 1) {
633                                 wpa_printf(MSG_DEBUG, "WPS: Found a wildcard "
634                                            "PIN. Assigned it for this UUID-E");
635                                 pin->wildcard_uuid = 2;
636                                 os_memcpy(pin->uuid, uuid, WPS_UUID_LEN);
637                                 break;
638                         }
639                         pin = pin->next;
640                 }
641         }
642
643         if (!pin)
644                 return NULL;
645
646         /*
647          * Lock the PIN to avoid attacks based on concurrent re-use of the PIN
648          * that could otherwise avoid PIN invalidations.
649          */
650         if (pin->flags & PIN_LOCKED) {
651                 wpa_printf(MSG_DEBUG, "WPS: Selected PIN locked - do not "
652                            "allow concurrent re-use");
653                 return NULL;
654         }
655         *pin_len = pin->pin_len;
656         pin->flags |= PIN_LOCKED;
657         return pin->pin;
658 }
659
660
661 /**
662  * wps_registrar_unlock_pin - Unlock a PIN for a specific UUID-E
663  * @reg: Registrar data from wps_registrar_init()
664  * @uuid: UUID-E
665  * Returns: 0 on success, -1 on failure
666  *
667  * PINs are locked to enforce only one concurrent use. This function unlocks a
668  * PIN to allow it to be used again. If the specified PIN was configured using
669  * a wildcard UUID, it will be removed instead of allowing multiple uses.
670  */
671 int wps_registrar_unlock_pin(struct wps_registrar *reg, const u8 *uuid)
672 {
673         struct wps_uuid_pin *pin;
674
675         pin = reg->pins;
676         while (pin) {
677                 if (os_memcmp(pin->uuid, uuid, WPS_UUID_LEN) == 0) {
678                         if (pin->wildcard_uuid == 2) {
679                                 wpa_printf(MSG_DEBUG, "WPS: Invalidating used "
680                                            "wildcard PIN");
681                                 return wps_registrar_invalidate_pin(reg, uuid);
682                         }
683                         pin->flags &= ~PIN_LOCKED;
684                         return 0;
685                 }
686                 pin = pin->next;
687         }
688
689         return -1;
690 }
691
692
693 static void wps_registrar_stop_pbc(struct wps_registrar *reg)
694 {
695         reg->selected_registrar = 0;
696         reg->pbc = 0;
697         wps_set_ie(reg);
698         wps_cb_set_sel_reg(reg);
699 }
700
701
702 static void wps_registrar_pbc_timeout(void *eloop_ctx, void *timeout_ctx)
703 {
704         struct wps_registrar *reg = eloop_ctx;
705
706         wpa_printf(MSG_DEBUG, "WPS: PBC timed out - disable PBC mode");
707         wps_pbc_timeout_event(reg->wps);
708         wps_registrar_stop_pbc(reg);
709 }
710
711
712 /**
713  * wps_registrar_button_pushed - Notify Registrar that AP button was pushed
714  * @reg: Registrar data from wps_registrar_init()
715  * Returns: 0 on success, -1 on failure
716  *
717  * This function is called on an AP when a push button is pushed to activate
718  * PBC mode. The PBC mode will be stopped after walk time (2 minutes) timeout
719  * or when a PBC registration is completed.
720  */
721 int wps_registrar_button_pushed(struct wps_registrar *reg)
722 {
723         if (wps_registrar_pbc_overlap(reg, NULL, NULL)) {
724                 wpa_printf(MSG_DEBUG, "WPS: PBC overlap - do not start PBC "
725                            "mode");
726                 wps_pbc_overlap_event(reg->wps);
727                 return -1;
728         }
729         wpa_printf(MSG_DEBUG, "WPS: Button pushed - PBC mode started");
730         reg->force_pbc_overlap = 0;
731         reg->selected_registrar = 1;
732         reg->pbc = 1;
733         wps_set_ie(reg);
734         wps_cb_set_sel_reg(reg);
735
736         eloop_cancel_timeout(wps_registrar_pbc_timeout, reg, NULL);
737         eloop_register_timeout(WPS_PBC_WALK_TIME, 0, wps_registrar_pbc_timeout,
738                                reg, NULL);
739         return 0;
740 }
741
742
743 static void wps_registrar_pbc_completed(struct wps_registrar *reg)
744 {
745         wpa_printf(MSG_DEBUG, "WPS: PBC completed - stopping PBC mode");
746         eloop_cancel_timeout(wps_registrar_pbc_timeout, reg, NULL);
747         wps_registrar_stop_pbc(reg);
748 }
749
750 static void wps_registrar_pin_completed(struct wps_registrar *reg)
751 {
752         wpa_printf(MSG_DEBUG, "WPS: PIN completed using internal Registrar");
753         eloop_cancel_timeout(wps_registrar_set_selected_timeout, reg, NULL);
754         reg->selected_registrar = 0;
755         wps_set_ie(reg);
756         wps_cb_set_sel_reg(reg);
757 }
758
759
760 /**
761  * wps_registrar_probe_req_rx - Notify Registrar of Probe Request
762  * @reg: Registrar data from wps_registrar_init()
763  * @addr: MAC address of the Probe Request sender
764  * @wps_data: WPS IE contents
765  *
766  * This function is called on an AP when a Probe Request with WPS IE is
767  * received. This is used to track PBC mode use and to detect possible overlap
768  * situation with other WPS APs.
769  */
770 void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr,
771                                 const struct wpabuf *wps_data)
772 {
773         struct wps_parse_attr attr;
774         u16 methods;
775
776         wpa_hexdump_buf(MSG_MSGDUMP,
777                         "WPS: Probe Request with WPS data received",
778                         wps_data);
779
780         if (wps_parse_msg(wps_data, &attr) < 0)
781                 return;
782         if (!wps_version_supported(attr.version)) {
783                 wpa_printf(MSG_DEBUG, "WPS: Unsupported ProbeReq WPS IE "
784                            "version 0x%x", attr.version ? *attr.version : 0);
785                 return;
786         }
787
788         if (attr.config_methods == NULL) {
789                 wpa_printf(MSG_DEBUG, "WPS: No Config Methods attribute in "
790                            "Probe Request");
791                 return;
792         }
793
794         methods = WPA_GET_BE16(attr.config_methods);
795         if (!(methods & WPS_CONFIG_PUSHBUTTON))
796                 return; /* Not PBC */
797
798         wpa_printf(MSG_DEBUG, "WPS: Probe Request for PBC received from "
799                    MACSTR, MAC2STR(addr));
800
801         wps_registrar_add_pbc_session(reg, addr, attr.uuid_e);
802         if (wps_registrar_pbc_overlap(reg, addr, attr.uuid_e)) {
803                 wpa_printf(MSG_DEBUG, "WPS: PBC session overlap detected");
804                 reg->force_pbc_overlap = 1;
805                 wps_pbc_overlap_event(reg->wps);
806         }
807 }
808
809
810 static int wps_cb_new_psk(struct wps_registrar *reg, const u8 *mac_addr,
811                           const u8 *psk, size_t psk_len)
812 {
813         if (reg->new_psk_cb == NULL)
814                 return 0;
815
816         return reg->new_psk_cb(reg->cb_ctx, mac_addr, psk, psk_len);
817 }
818
819
820 static void wps_cb_pin_needed(struct wps_registrar *reg, const u8 *uuid_e,
821                               const struct wps_device_data *dev)
822 {
823         if (reg->pin_needed_cb == NULL)
824                 return;
825
826         reg->pin_needed_cb(reg->cb_ctx, uuid_e, dev);
827 }
828
829
830 static void wps_cb_reg_success(struct wps_registrar *reg, const u8 *mac_addr,
831                                const u8 *uuid_e)
832 {
833         if (reg->reg_success_cb == NULL)
834                 return;
835
836         reg->reg_success_cb(reg->cb_ctx, mac_addr, uuid_e);
837 }
838
839
840 static int wps_cb_set_ie(struct wps_registrar *reg,
841                          const struct wpabuf *beacon_ie,
842                          const struct wpabuf *probe_resp_ie)
843 {
844         if (reg->set_ie_cb == NULL)
845                 return 0;
846
847         return reg->set_ie_cb(reg->cb_ctx, wpabuf_head(beacon_ie),
848                               wpabuf_len(beacon_ie),
849                               wpabuf_head(probe_resp_ie),
850                               wpabuf_len(probe_resp_ie));
851 }
852
853
854 static void wps_cb_set_sel_reg(struct wps_registrar *reg)
855 {
856         u16 methods = 0;
857         if (reg->set_sel_reg_cb == NULL)
858                 return;
859
860         if (reg->selected_registrar) {
861                 methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON;
862                 if (reg->pbc)
863                         methods |= WPS_CONFIG_PUSHBUTTON;
864         }
865
866         reg->set_sel_reg_cb(reg->cb_ctx, reg->selected_registrar,
867                             reg->pbc ? DEV_PW_PUSHBUTTON : DEV_PW_DEFAULT,
868                             methods);
869 }
870
871
872 /* Encapsulate WPS IE data with one (or more, if needed) IE headers */
873 static struct wpabuf * wps_ie_encapsulate(struct wpabuf *data)
874 {
875         struct wpabuf *ie;
876         const u8 *pos, *end;
877
878         ie = wpabuf_alloc(wpabuf_len(data) + 100);
879         if (ie == NULL) {
880                 wpabuf_free(data);
881                 return NULL;
882         }
883
884         pos = wpabuf_head(data);
885         end = pos + wpabuf_len(data);
886
887         while (end > pos) {
888                 size_t frag_len = end - pos;
889                 if (frag_len > 251)
890                         frag_len = 251;
891                 wpabuf_put_u8(ie, WLAN_EID_VENDOR_SPECIFIC);
892                 wpabuf_put_u8(ie, 4 + frag_len);
893                 wpabuf_put_be32(ie, WPS_DEV_OUI_WFA);
894                 wpabuf_put_data(ie, pos, frag_len);
895                 pos += frag_len;
896         }
897
898         wpabuf_free(data);
899
900         return ie;
901 }
902
903
904 static int wps_set_ie(struct wps_registrar *reg)
905 {
906         struct wpabuf *beacon;
907         struct wpabuf *probe;
908         int ret;
909
910         wpa_printf(MSG_DEBUG, "WPS: Build Beacon and Probe Response IEs");
911
912         beacon = wpabuf_alloc(300);
913         if (beacon == NULL)
914                 return -1;
915         probe = wpabuf_alloc(400);
916         if (probe == NULL) {
917                 wpabuf_free(beacon);
918                 return -1;
919         }
920
921         if (wps_build_version(beacon) ||
922             wps_build_wps_state(reg->wps, beacon) ||
923             wps_build_ap_setup_locked(reg->wps, beacon) ||
924             wps_build_selected_registrar(reg, beacon) ||
925             wps_build_sel_reg_dev_password_id(reg, beacon) ||
926             wps_build_sel_reg_config_methods(reg, beacon) ||
927             wps_build_version(probe) ||
928             wps_build_wps_state(reg->wps, probe) ||
929             wps_build_ap_setup_locked(reg->wps, probe) ||
930             wps_build_selected_registrar(reg, probe) ||
931             wps_build_sel_reg_dev_password_id(reg, probe) ||
932             wps_build_sel_reg_config_methods(reg, probe) ||
933             wps_build_resp_type(reg, probe) ||
934             wps_build_uuid_e(probe, reg->wps->uuid) ||
935             wps_build_device_attrs(&reg->wps->dev, probe) ||
936             wps_build_probe_config_methods(reg, probe) ||
937             wps_build_rf_bands(&reg->wps->dev, probe)) {
938                 wpabuf_free(beacon);
939                 wpabuf_free(probe);
940                 return -1;
941         }
942
943         beacon = wps_ie_encapsulate(beacon);
944         probe = wps_ie_encapsulate(probe);
945
946         if (!beacon || !probe) {
947                 wpabuf_free(beacon);
948                 wpabuf_free(probe);
949                 return -1;
950         }
951
952         if (reg->static_wep_only) {
953                 /*
954                  * Windows XP and Vista clients can get confused about
955                  * EAP-Identity/Request when they probe the network with
956                  * EAPOL-Start. In such a case, they may assume the network is
957                  * using IEEE 802.1X and prompt user for a certificate while
958                  * the correct (non-WPS) behavior would be to ask for the
959                  * static WEP key. As a workaround, use Microsoft Provisioning
960                  * IE to advertise that legacy 802.1X is not supported.
961                  */
962                 const u8 ms_wps[7] = {
963                         WLAN_EID_VENDOR_SPECIFIC, 5,
964                         /* Microsoft Provisioning IE (00:50:f2:5) */
965                         0x00, 0x50, 0xf2, 5,
966                         0x00 /* no legacy 802.1X or MS WPS */
967                 };
968                 wpa_printf(MSG_DEBUG, "WPS: Add Microsoft Provisioning IE "
969                            "into Beacon/Probe Response frames");
970                 wpabuf_put_data(beacon, ms_wps, sizeof(ms_wps));
971                 wpabuf_put_data(probe, ms_wps, sizeof(ms_wps));
972         }
973
974         ret = wps_cb_set_ie(reg, beacon, probe);
975         wpabuf_free(beacon);
976         wpabuf_free(probe);
977
978         return ret;
979 }
980
981
982 static int wps_get_dev_password(struct wps_data *wps)
983 {
984         const u8 *pin;
985         size_t pin_len = 0;
986
987         os_free(wps->dev_password);
988         wps->dev_password = NULL;
989
990         if (wps->pbc) {
991                 wpa_printf(MSG_DEBUG, "WPS: Use default PIN for PBC");
992                 pin = (const u8 *) "00000000";
993                 pin_len = 8;
994         } else {
995                 pin = wps_registrar_get_pin(wps->wps->registrar, wps->uuid_e,
996                                             &pin_len);
997         }
998         if (pin == NULL) {
999                 wpa_printf(MSG_DEBUG, "WPS: No Device Password available for "
1000                            "the Enrollee");
1001                 wps_cb_pin_needed(wps->wps->registrar, wps->uuid_e,
1002                                   &wps->peer_dev);
1003                 return -1;
1004         }
1005
1006         wps->dev_password = os_malloc(pin_len);
1007         if (wps->dev_password == NULL)
1008                 return -1;
1009         os_memcpy(wps->dev_password, pin, pin_len);
1010         wps->dev_password_len = pin_len;
1011
1012         return 0;
1013 }
1014
1015
1016 static int wps_build_uuid_r(struct wps_data *wps, struct wpabuf *msg)
1017 {
1018         wpa_printf(MSG_DEBUG, "WPS:  * UUID-R");
1019         wpabuf_put_be16(msg, ATTR_UUID_R);
1020         wpabuf_put_be16(msg, WPS_UUID_LEN);
1021         wpabuf_put_data(msg, wps->uuid_r, WPS_UUID_LEN);
1022         return 0;
1023 }
1024
1025
1026 static int wps_build_r_hash(struct wps_data *wps, struct wpabuf *msg)
1027 {
1028         u8 *hash;
1029         const u8 *addr[4];
1030         size_t len[4];
1031
1032         if (os_get_random(wps->snonce, 2 * WPS_SECRET_NONCE_LEN) < 0)
1033                 return -1;
1034         wpa_hexdump(MSG_DEBUG, "WPS: R-S1", wps->snonce, WPS_SECRET_NONCE_LEN);
1035         wpa_hexdump(MSG_DEBUG, "WPS: R-S2",
1036                     wps->snonce + WPS_SECRET_NONCE_LEN, WPS_SECRET_NONCE_LEN);
1037
1038         if (wps->dh_pubkey_e == NULL || wps->dh_pubkey_r == NULL) {
1039                 wpa_printf(MSG_DEBUG, "WPS: DH public keys not available for "
1040                            "R-Hash derivation");
1041                 return -1;
1042         }
1043
1044         wpa_printf(MSG_DEBUG, "WPS:  * R-Hash1");
1045         wpabuf_put_be16(msg, ATTR_R_HASH1);
1046         wpabuf_put_be16(msg, SHA256_MAC_LEN);
1047         hash = wpabuf_put(msg, SHA256_MAC_LEN);
1048         /* R-Hash1 = HMAC_AuthKey(R-S1 || PSK1 || PK_E || PK_R) */
1049         addr[0] = wps->snonce;
1050         len[0] = WPS_SECRET_NONCE_LEN;
1051         addr[1] = wps->psk1;
1052         len[1] = WPS_PSK_LEN;
1053         addr[2] = wpabuf_head(wps->dh_pubkey_e);
1054         len[2] = wpabuf_len(wps->dh_pubkey_e);
1055         addr[3] = wpabuf_head(wps->dh_pubkey_r);
1056         len[3] = wpabuf_len(wps->dh_pubkey_r);
1057         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
1058         wpa_hexdump(MSG_DEBUG, "WPS: R-Hash1", hash, SHA256_MAC_LEN);
1059
1060         wpa_printf(MSG_DEBUG, "WPS:  * R-Hash2");
1061         wpabuf_put_be16(msg, ATTR_R_HASH2);
1062         wpabuf_put_be16(msg, SHA256_MAC_LEN);
1063         hash = wpabuf_put(msg, SHA256_MAC_LEN);
1064         /* R-Hash2 = HMAC_AuthKey(R-S2 || PSK2 || PK_E || PK_R) */
1065         addr[0] = wps->snonce + WPS_SECRET_NONCE_LEN;
1066         addr[1] = wps->psk2;
1067         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
1068         wpa_hexdump(MSG_DEBUG, "WPS: R-Hash2", hash, SHA256_MAC_LEN);
1069
1070         return 0;
1071 }
1072
1073
1074 static int wps_build_r_snonce1(struct wps_data *wps, struct wpabuf *msg)
1075 {
1076         wpa_printf(MSG_DEBUG, "WPS:  * R-SNonce1");
1077         wpabuf_put_be16(msg, ATTR_R_SNONCE1);
1078         wpabuf_put_be16(msg, WPS_SECRET_NONCE_LEN);
1079         wpabuf_put_data(msg, wps->snonce, WPS_SECRET_NONCE_LEN);
1080         return 0;
1081 }
1082
1083
1084 static int wps_build_r_snonce2(struct wps_data *wps, struct wpabuf *msg)
1085 {
1086         wpa_printf(MSG_DEBUG, "WPS:  * R-SNonce2");
1087         wpabuf_put_be16(msg, ATTR_R_SNONCE2);
1088         wpabuf_put_be16(msg, WPS_SECRET_NONCE_LEN);
1089         wpabuf_put_data(msg, wps->snonce + WPS_SECRET_NONCE_LEN,
1090                         WPS_SECRET_NONCE_LEN);
1091         return 0;
1092 }
1093
1094
1095 static int wps_build_cred_network_idx(struct wpabuf *msg,
1096                                       struct wps_credential *cred)
1097 {
1098         wpa_printf(MSG_DEBUG, "WPS:  * Network Index");
1099         wpabuf_put_be16(msg, ATTR_NETWORK_INDEX);
1100         wpabuf_put_be16(msg, 1);
1101         wpabuf_put_u8(msg, 1);
1102         return 0;
1103 }
1104
1105
1106 static int wps_build_cred_ssid(struct wpabuf *msg,
1107                                struct wps_credential *cred)
1108 {
1109         wpa_printf(MSG_DEBUG, "WPS:  * SSID");
1110         wpabuf_put_be16(msg, ATTR_SSID);
1111         wpabuf_put_be16(msg, cred->ssid_len);
1112         wpabuf_put_data(msg, cred->ssid, cred->ssid_len);
1113         return 0;
1114 }
1115
1116
1117 static int wps_build_cred_auth_type(struct wpabuf *msg,
1118                                     struct wps_credential *cred)
1119 {
1120         wpa_printf(MSG_DEBUG, "WPS:  * Authentication Type (0x%x)",
1121                    cred->auth_type);
1122         wpabuf_put_be16(msg, ATTR_AUTH_TYPE);
1123         wpabuf_put_be16(msg, 2);
1124         wpabuf_put_be16(msg, cred->auth_type);
1125         return 0;
1126 }
1127
1128
1129 static int wps_build_cred_encr_type(struct wpabuf *msg,
1130                                     struct wps_credential *cred)
1131 {
1132         wpa_printf(MSG_DEBUG, "WPS:  * Encryption Type (0x%x)",
1133                    cred->encr_type);
1134         wpabuf_put_be16(msg, ATTR_ENCR_TYPE);
1135         wpabuf_put_be16(msg, 2);
1136         wpabuf_put_be16(msg, cred->encr_type);
1137         return 0;
1138 }
1139
1140
1141 static int wps_build_cred_network_key(struct wpabuf *msg,
1142                                       struct wps_credential *cred)
1143 {
1144         wpa_printf(MSG_DEBUG, "WPS:  * Network Key");
1145         wpabuf_put_be16(msg, ATTR_NETWORK_KEY);
1146         wpabuf_put_be16(msg, cred->key_len);
1147         wpabuf_put_data(msg, cred->key, cred->key_len);
1148         return 0;
1149 }
1150
1151
1152 static int wps_build_cred_mac_addr(struct wpabuf *msg,
1153                                    struct wps_credential *cred)
1154 {
1155         wpa_printf(MSG_DEBUG, "WPS:  * MAC Address (" MACSTR ")",
1156                    MAC2STR(cred->mac_addr));
1157         wpabuf_put_be16(msg, ATTR_MAC_ADDR);
1158         wpabuf_put_be16(msg, ETH_ALEN);
1159         wpabuf_put_data(msg, cred->mac_addr, ETH_ALEN);
1160         return 0;
1161 }
1162
1163
1164 static int wps_build_credential(struct wpabuf *msg,
1165                                 struct wps_credential *cred)
1166 {
1167         if (wps_build_cred_network_idx(msg, cred) ||
1168             wps_build_cred_ssid(msg, cred) ||
1169             wps_build_cred_auth_type(msg, cred) ||
1170             wps_build_cred_encr_type(msg, cred) ||
1171             wps_build_cred_network_key(msg, cred) ||
1172             wps_build_cred_mac_addr(msg, cred))
1173                 return -1;
1174         return 0;
1175 }
1176
1177
1178 int wps_build_cred(struct wps_data *wps, struct wpabuf *msg)
1179 {
1180         struct wpabuf *cred;
1181
1182         if (wps->wps->registrar->skip_cred_build)
1183                 goto skip_cred_build;
1184
1185         wpa_printf(MSG_DEBUG, "WPS:  * Credential");
1186         os_memset(&wps->cred, 0, sizeof(wps->cred));
1187
1188         os_memcpy(wps->cred.ssid, wps->wps->ssid, wps->wps->ssid_len);
1189         wps->cred.ssid_len = wps->wps->ssid_len;
1190
1191         /* Select the best authentication and encryption type */
1192         if (wps->auth_type & WPS_AUTH_WPA2PSK)
1193                 wps->auth_type = WPS_AUTH_WPA2PSK;
1194         else if (wps->auth_type & WPS_AUTH_WPAPSK)
1195                 wps->auth_type = WPS_AUTH_WPAPSK;
1196         else if (wps->auth_type & WPS_AUTH_OPEN)
1197                 wps->auth_type = WPS_AUTH_OPEN;
1198         else if (wps->auth_type & WPS_AUTH_SHARED)
1199                 wps->auth_type = WPS_AUTH_SHARED;
1200         else {
1201                 wpa_printf(MSG_DEBUG, "WPS: Unsupported auth_type 0x%x",
1202                            wps->auth_type);
1203                 return -1;
1204         }
1205         wps->cred.auth_type = wps->auth_type;
1206
1207         if (wps->auth_type == WPS_AUTH_WPA2PSK ||
1208             wps->auth_type == WPS_AUTH_WPAPSK) {
1209                 if (wps->encr_type & WPS_ENCR_AES)
1210                         wps->encr_type = WPS_ENCR_AES;
1211                 else if (wps->encr_type & WPS_ENCR_TKIP)
1212                         wps->encr_type = WPS_ENCR_TKIP;
1213                 else {
1214                         wpa_printf(MSG_DEBUG, "WPS: No suitable encryption "
1215                                    "type for WPA/WPA2");
1216                         return -1;
1217                 }
1218         } else {
1219                 if (wps->encr_type & WPS_ENCR_WEP)
1220                         wps->encr_type = WPS_ENCR_WEP;
1221                 else if (wps->encr_type & WPS_ENCR_NONE)
1222                         wps->encr_type = WPS_ENCR_NONE;
1223                 else {
1224                         wpa_printf(MSG_DEBUG, "WPS: No suitable encryption "
1225                                    "type for non-WPA/WPA2 mode");
1226                         return -1;
1227                 }
1228         }
1229         wps->cred.encr_type = wps->encr_type;
1230         /* Set MAC address in the Credential to be the AP's address (BSSID) */
1231         os_memcpy(wps->cred.mac_addr, wps->wps->dev.mac_addr, ETH_ALEN);
1232
1233         if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->wps->ap &&
1234             !wps->wps->registrar->disable_auto_conf) {
1235                 u8 r[16];
1236                 /* Generate a random passphrase */
1237                 if (os_get_random(r, sizeof(r)) < 0)
1238                         return -1;
1239                 os_free(wps->new_psk);
1240                 wps->new_psk = base64_encode(r, sizeof(r), &wps->new_psk_len);
1241                 if (wps->new_psk == NULL)
1242                         return -1;
1243                 wps->new_psk_len--; /* remove newline */
1244                 while (wps->new_psk_len &&
1245                        wps->new_psk[wps->new_psk_len - 1] == '=')
1246                         wps->new_psk_len--;
1247                 wpa_hexdump_ascii_key(MSG_DEBUG, "WPS: Generated passphrase",
1248                                       wps->new_psk, wps->new_psk_len);
1249                 os_memcpy(wps->cred.key, wps->new_psk, wps->new_psk_len);
1250                 wps->cred.key_len = wps->new_psk_len;
1251         } else if (wps->wps->network_key) {
1252                 os_memcpy(wps->cred.key, wps->wps->network_key,
1253                           wps->wps->network_key_len);
1254                 wps->cred.key_len = wps->wps->network_key_len;
1255         } else if (wps->auth_type & (WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK)) {
1256                 char hex[65];
1257                 /* Generate a random per-device PSK */
1258                 os_free(wps->new_psk);
1259                 wps->new_psk_len = 32;
1260                 wps->new_psk = os_malloc(wps->new_psk_len);
1261                 if (wps->new_psk == NULL)
1262                         return -1;
1263                 if (os_get_random(wps->new_psk, wps->new_psk_len) < 0) {
1264                         os_free(wps->new_psk);
1265                         wps->new_psk = NULL;
1266                         return -1;
1267                 }
1268                 wpa_hexdump_key(MSG_DEBUG, "WPS: Generated per-device PSK",
1269                                 wps->new_psk, wps->new_psk_len);
1270                 wpa_snprintf_hex(hex, sizeof(hex), wps->new_psk,
1271                                  wps->new_psk_len);
1272                 os_memcpy(wps->cred.key, hex, wps->new_psk_len * 2);
1273                 wps->cred.key_len = wps->new_psk_len * 2;
1274         }
1275
1276         cred = wpabuf_alloc(200);
1277         if (cred == NULL)
1278                 return -1;
1279
1280         if (wps_build_credential(cred, &wps->cred)) {
1281                 wpabuf_free(cred);
1282                 return -1;
1283         }
1284
1285         wpabuf_put_be16(msg, ATTR_CRED);
1286         wpabuf_put_be16(msg, wpabuf_len(cred));
1287         wpabuf_put_buf(msg, cred);
1288         wpabuf_free(cred);
1289
1290 skip_cred_build:
1291         if (wps->wps->registrar->extra_cred) {
1292                 wpa_printf(MSG_DEBUG, "WPS:  * Credential (pre-configured)");
1293                 wpabuf_put_buf(msg, wps->wps->registrar->extra_cred);
1294         }
1295
1296         return 0;
1297 }
1298
1299
1300 static int wps_build_ap_settings(struct wps_data *wps, struct wpabuf *msg)
1301 {
1302         wpa_printf(MSG_DEBUG, "WPS:  * AP Settings");
1303
1304         if (wps_build_credential(msg, &wps->cred))
1305                 return -1;
1306
1307         return 0;
1308 }
1309
1310
1311 static struct wpabuf * wps_build_m2(struct wps_data *wps)
1312 {
1313         struct wpabuf *msg;
1314
1315         if (os_get_random(wps->nonce_r, WPS_NONCE_LEN) < 0)
1316                 return NULL;
1317         wpa_hexdump(MSG_DEBUG, "WPS: Registrar Nonce",
1318                     wps->nonce_r, WPS_NONCE_LEN);
1319         wpa_hexdump(MSG_DEBUG, "WPS: UUID-R", wps->uuid_r, WPS_UUID_LEN);
1320
1321         wpa_printf(MSG_DEBUG, "WPS: Building Message M2");
1322         msg = wpabuf_alloc(1000);
1323         if (msg == NULL)
1324                 return NULL;
1325
1326         if (wps_build_version(msg) ||
1327             wps_build_msg_type(msg, WPS_M2) ||
1328             wps_build_enrollee_nonce(wps, msg) ||
1329             wps_build_registrar_nonce(wps, msg) ||
1330             wps_build_uuid_r(wps, msg) ||
1331             wps_build_public_key(wps, msg) ||
1332             wps_derive_keys(wps) ||
1333             wps_build_auth_type_flags(wps, msg) ||
1334             wps_build_encr_type_flags(wps, msg) ||
1335             wps_build_conn_type_flags(wps, msg) ||
1336             wps_build_config_methods_r(wps->wps->registrar, msg) ||
1337             wps_build_device_attrs(&wps->wps->dev, msg) ||
1338             wps_build_rf_bands(&wps->wps->dev, msg) ||
1339             wps_build_assoc_state(wps, msg) ||
1340             wps_build_config_error(msg, WPS_CFG_NO_ERROR) ||
1341             wps_build_dev_password_id(msg, wps->dev_pw_id) ||
1342             wps_build_os_version(&wps->wps->dev, msg) ||
1343             wps_build_authenticator(wps, msg)) {
1344                 wpabuf_free(msg);
1345                 return NULL;
1346         }
1347
1348         wps->state = RECV_M3;
1349         return msg;
1350 }
1351
1352
1353 static struct wpabuf * wps_build_m2d(struct wps_data *wps)
1354 {
1355         struct wpabuf *msg;
1356         u16 err = wps->config_error;
1357
1358         wpa_printf(MSG_DEBUG, "WPS: Building Message M2D");
1359         msg = wpabuf_alloc(1000);
1360         if (msg == NULL)
1361                 return NULL;
1362
1363         if (wps->wps->ap && wps->wps->ap_setup_locked &&
1364             err == WPS_CFG_NO_ERROR)
1365                 err = WPS_CFG_SETUP_LOCKED;
1366
1367         if (wps_build_version(msg) ||
1368             wps_build_msg_type(msg, WPS_M2D) ||
1369             wps_build_enrollee_nonce(wps, msg) ||
1370             wps_build_registrar_nonce(wps, msg) ||
1371             wps_build_uuid_r(wps, msg) ||
1372             wps_build_auth_type_flags(wps, msg) ||
1373             wps_build_encr_type_flags(wps, msg) ||
1374             wps_build_conn_type_flags(wps, msg) ||
1375             wps_build_config_methods_r(wps->wps->registrar, msg) ||
1376             wps_build_device_attrs(&wps->wps->dev, msg) ||
1377             wps_build_rf_bands(&wps->wps->dev, msg) ||
1378             wps_build_assoc_state(wps, msg) ||
1379             wps_build_config_error(msg, err) ||
1380             wps_build_os_version(&wps->wps->dev, msg)) {
1381                 wpabuf_free(msg);
1382                 return NULL;
1383         }
1384
1385         wps->state = RECV_M2D_ACK;
1386         return msg;
1387 }
1388
1389
1390 static struct wpabuf * wps_build_m4(struct wps_data *wps)
1391 {
1392         struct wpabuf *msg, *plain;
1393
1394         wpa_printf(MSG_DEBUG, "WPS: Building Message M4");
1395
1396         wps_derive_psk(wps, wps->dev_password, wps->dev_password_len);
1397
1398         plain = wpabuf_alloc(200);
1399         if (plain == NULL)
1400                 return NULL;
1401
1402         msg = wpabuf_alloc(1000);
1403         if (msg == NULL) {
1404                 wpabuf_free(plain);
1405                 return NULL;
1406         }
1407
1408         if (wps_build_version(msg) ||
1409             wps_build_msg_type(msg, WPS_M4) ||
1410             wps_build_enrollee_nonce(wps, msg) ||
1411             wps_build_r_hash(wps, msg) ||
1412             wps_build_r_snonce1(wps, plain) ||
1413             wps_build_key_wrap_auth(wps, plain) ||
1414             wps_build_encr_settings(wps, msg, plain) ||
1415             wps_build_authenticator(wps, msg)) {
1416                 wpabuf_free(plain);
1417                 wpabuf_free(msg);
1418                 return NULL;
1419         }
1420         wpabuf_free(plain);
1421
1422         wps->state = RECV_M5;
1423         return msg;
1424 }
1425
1426
1427 static struct wpabuf * wps_build_m6(struct wps_data *wps)
1428 {
1429         struct wpabuf *msg, *plain;
1430
1431         wpa_printf(MSG_DEBUG, "WPS: Building Message M6");
1432
1433         plain = wpabuf_alloc(200);
1434         if (plain == NULL)
1435                 return NULL;
1436
1437         msg = wpabuf_alloc(1000);
1438         if (msg == NULL) {
1439                 wpabuf_free(plain);
1440                 return NULL;
1441         }
1442
1443         if (wps_build_version(msg) ||
1444             wps_build_msg_type(msg, WPS_M6) ||
1445             wps_build_enrollee_nonce(wps, msg) ||
1446             wps_build_r_snonce2(wps, plain) ||
1447             wps_build_key_wrap_auth(wps, plain) ||
1448             wps_build_encr_settings(wps, msg, plain) ||
1449             wps_build_authenticator(wps, msg)) {
1450                 wpabuf_free(plain);
1451                 wpabuf_free(msg);
1452                 return NULL;
1453         }
1454         wpabuf_free(plain);
1455
1456         wps->wps_pin_revealed = 1;
1457         wps->state = RECV_M7;
1458         return msg;
1459 }
1460
1461
1462 static struct wpabuf * wps_build_m8(struct wps_data *wps)
1463 {
1464         struct wpabuf *msg, *plain;
1465
1466         wpa_printf(MSG_DEBUG, "WPS: Building Message M8");
1467
1468         plain = wpabuf_alloc(500);
1469         if (plain == NULL)
1470                 return NULL;
1471
1472         msg = wpabuf_alloc(1000);
1473         if (msg == NULL) {
1474                 wpabuf_free(plain);
1475                 return NULL;
1476         }
1477
1478         if (wps_build_version(msg) ||
1479             wps_build_msg_type(msg, WPS_M8) ||
1480             wps_build_enrollee_nonce(wps, msg) ||
1481             (wps->wps->ap && wps_build_cred(wps, plain)) ||
1482             (!wps->wps->ap && wps_build_ap_settings(wps, plain)) ||
1483             wps_build_key_wrap_auth(wps, plain) ||
1484             wps_build_encr_settings(wps, msg, plain) ||
1485             wps_build_authenticator(wps, msg)) {
1486                 wpabuf_free(plain);
1487                 wpabuf_free(msg);
1488                 return NULL;
1489         }
1490         wpabuf_free(plain);
1491
1492         wps->state = RECV_DONE;
1493         return msg;
1494 }
1495
1496
1497 static struct wpabuf * wps_build_wsc_ack(struct wps_data *wps)
1498 {
1499         struct wpabuf *msg;
1500
1501         wpa_printf(MSG_DEBUG, "WPS: Building Message WSC_ACK");
1502
1503         msg = wpabuf_alloc(1000);
1504         if (msg == NULL)
1505                 return NULL;
1506
1507         if (wps_build_version(msg) ||
1508             wps_build_msg_type(msg, WPS_WSC_ACK) ||
1509             wps_build_enrollee_nonce(wps, msg) ||
1510             wps_build_registrar_nonce(wps, msg)) {
1511                 wpabuf_free(msg);
1512                 return NULL;
1513         }
1514
1515         return msg;
1516 }
1517
1518
1519 static struct wpabuf * wps_build_wsc_nack(struct wps_data *wps)
1520 {
1521         struct wpabuf *msg;
1522
1523         wpa_printf(MSG_DEBUG, "WPS: Building Message WSC_NACK");
1524
1525         msg = wpabuf_alloc(1000);
1526         if (msg == NULL)
1527                 return NULL;
1528
1529         if (wps_build_version(msg) ||
1530             wps_build_msg_type(msg, WPS_WSC_NACK) ||
1531             wps_build_enrollee_nonce(wps, msg) ||
1532             wps_build_registrar_nonce(wps, msg) ||
1533             wps_build_config_error(msg, wps->config_error)) {
1534                 wpabuf_free(msg);
1535                 return NULL;
1536         }
1537
1538         return msg;
1539 }
1540
1541
1542 struct wpabuf * wps_registrar_get_msg(struct wps_data *wps,
1543                                       enum wsc_op_code *op_code)
1544 {
1545         struct wpabuf *msg;
1546
1547 #ifdef CONFIG_WPS_UPNP
1548         if (wps->wps->wps_upnp) {
1549                 struct upnp_pending_message *p, *prev = NULL;
1550                 if (wps->ext_reg > 1)
1551                         wps_registrar_free_pending_m2(wps->wps);
1552                 p = wps->wps->upnp_msgs;
1553                 /* TODO: check pending message MAC address */
1554                 while (p && p->next) {
1555                         prev = p;
1556                         p = p->next;
1557                 }
1558                 if (p) {
1559                         wpa_printf(MSG_DEBUG, "WPS: Use pending message from "
1560                                    "UPnP");
1561                         if (prev)
1562                                 prev->next = NULL;
1563                         else
1564                                 wps->wps->upnp_msgs = NULL;
1565                         msg = p->msg;
1566                         switch (p->type) {
1567                         case WPS_WSC_ACK:
1568                                 *op_code = WSC_ACK;
1569                                 break;
1570                         case WPS_WSC_NACK:
1571                                 *op_code = WSC_NACK;
1572                                 break;
1573                         default:
1574                                 *op_code = WSC_MSG;
1575                                 break;
1576                         }
1577                         os_free(p);
1578                         if (wps->ext_reg == 0)
1579                                 wps->ext_reg = 1;
1580                         return msg;
1581                 }
1582         }
1583         if (wps->ext_reg) {
1584                 wpa_printf(MSG_DEBUG, "WPS: Using external Registrar, but no "
1585                            "pending message available");
1586                 return NULL;
1587         }
1588 #endif /* CONFIG_WPS_UPNP */
1589
1590         switch (wps->state) {
1591         case SEND_M2:
1592                 if (wps_get_dev_password(wps) < 0)
1593                         msg = wps_build_m2d(wps);
1594                 else
1595                         msg = wps_build_m2(wps);
1596                 *op_code = WSC_MSG;
1597                 break;
1598         case SEND_M2D:
1599                 msg = wps_build_m2d(wps);
1600                 *op_code = WSC_MSG;
1601                 break;
1602         case SEND_M4:
1603                 msg = wps_build_m4(wps);
1604                 *op_code = WSC_MSG;
1605                 break;
1606         case SEND_M6:
1607                 msg = wps_build_m6(wps);
1608                 *op_code = WSC_MSG;
1609                 break;
1610         case SEND_M8:
1611                 msg = wps_build_m8(wps);
1612                 *op_code = WSC_MSG;
1613                 break;
1614         case RECV_DONE:
1615                 msg = wps_build_wsc_ack(wps);
1616                 *op_code = WSC_ACK;
1617                 break;
1618         case SEND_WSC_NACK:
1619                 msg = wps_build_wsc_nack(wps);
1620                 *op_code = WSC_NACK;
1621                 break;
1622         default:
1623                 wpa_printf(MSG_DEBUG, "WPS: Unsupported state %d for building "
1624                            "a message", wps->state);
1625                 msg = NULL;
1626                 break;
1627         }
1628
1629         if (*op_code == WSC_MSG && msg) {
1630                 /* Save a copy of the last message for Authenticator derivation
1631                  */
1632                 wpabuf_free(wps->last_msg);
1633                 wps->last_msg = wpabuf_dup(msg);
1634         }
1635
1636         return msg;
1637 }
1638
1639
1640 static int wps_process_enrollee_nonce(struct wps_data *wps, const u8 *e_nonce)
1641 {
1642         if (e_nonce == NULL) {
1643                 wpa_printf(MSG_DEBUG, "WPS: No Enrollee Nonce received");
1644                 return -1;
1645         }
1646
1647         os_memcpy(wps->nonce_e, e_nonce, WPS_NONCE_LEN);
1648         wpa_hexdump(MSG_DEBUG, "WPS: Enrollee Nonce",
1649                     wps->nonce_e, WPS_NONCE_LEN);
1650
1651         return 0;
1652 }
1653
1654
1655 static int wps_process_registrar_nonce(struct wps_data *wps, const u8 *r_nonce)
1656 {
1657         if (r_nonce == NULL) {
1658                 wpa_printf(MSG_DEBUG, "WPS: No Registrar Nonce received");
1659                 return -1;
1660         }
1661
1662         if (os_memcmp(wps->nonce_r, r_nonce, WPS_NONCE_LEN) != 0) {
1663                 wpa_printf(MSG_DEBUG, "WPS: Invalid Registrar Nonce received");
1664                 return -1;
1665         }
1666
1667         return 0;
1668 }
1669
1670
1671 static int wps_process_uuid_e(struct wps_data *wps, const u8 *uuid_e)
1672 {
1673         if (uuid_e == NULL) {
1674                 wpa_printf(MSG_DEBUG, "WPS: No UUID-E received");
1675                 return -1;
1676         }
1677
1678         os_memcpy(wps->uuid_e, uuid_e, WPS_UUID_LEN);
1679         wpa_hexdump(MSG_DEBUG, "WPS: UUID-E", wps->uuid_e, WPS_UUID_LEN);
1680
1681         return 0;
1682 }
1683
1684
1685 static int wps_process_dev_password_id(struct wps_data *wps, const u8 *pw_id)
1686 {
1687         if (pw_id == NULL) {
1688                 wpa_printf(MSG_DEBUG, "WPS: No Device Password ID received");
1689                 return -1;
1690         }
1691
1692         wps->dev_pw_id = WPA_GET_BE16(pw_id);
1693         wpa_printf(MSG_DEBUG, "WPS: Device Password ID %d", wps->dev_pw_id);
1694
1695         return 0;
1696 }
1697
1698
1699 static int wps_process_e_hash1(struct wps_data *wps, const u8 *e_hash1)
1700 {
1701         if (e_hash1 == NULL) {
1702                 wpa_printf(MSG_DEBUG, "WPS: No E-Hash1 received");
1703                 return -1;
1704         }
1705
1706         os_memcpy(wps->peer_hash1, e_hash1, WPS_HASH_LEN);
1707         wpa_hexdump(MSG_DEBUG, "WPS: E-Hash1", wps->peer_hash1, WPS_HASH_LEN);
1708
1709         return 0;
1710 }
1711
1712
1713 static int wps_process_e_hash2(struct wps_data *wps, const u8 *e_hash2)
1714 {
1715         if (e_hash2 == NULL) {
1716                 wpa_printf(MSG_DEBUG, "WPS: No E-Hash2 received");
1717                 return -1;
1718         }
1719
1720         os_memcpy(wps->peer_hash2, e_hash2, WPS_HASH_LEN);
1721         wpa_hexdump(MSG_DEBUG, "WPS: E-Hash2", wps->peer_hash2, WPS_HASH_LEN);
1722
1723         return 0;
1724 }
1725
1726
1727 static int wps_process_e_snonce1(struct wps_data *wps, const u8 *e_snonce1)
1728 {
1729         u8 hash[SHA256_MAC_LEN];
1730         const u8 *addr[4];
1731         size_t len[4];
1732
1733         if (e_snonce1 == NULL) {
1734                 wpa_printf(MSG_DEBUG, "WPS: No E-SNonce1 received");
1735                 return -1;
1736         }
1737
1738         wpa_hexdump_key(MSG_DEBUG, "WPS: E-SNonce1", e_snonce1,
1739                         WPS_SECRET_NONCE_LEN);
1740
1741         /* E-Hash1 = HMAC_AuthKey(E-S1 || PSK1 || PK_E || PK_R) */
1742         addr[0] = e_snonce1;
1743         len[0] = WPS_SECRET_NONCE_LEN;
1744         addr[1] = wps->psk1;
1745         len[1] = WPS_PSK_LEN;
1746         addr[2] = wpabuf_head(wps->dh_pubkey_e);
1747         len[2] = wpabuf_len(wps->dh_pubkey_e);
1748         addr[3] = wpabuf_head(wps->dh_pubkey_r);
1749         len[3] = wpabuf_len(wps->dh_pubkey_r);
1750         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
1751
1752         if (os_memcmp(wps->peer_hash1, hash, WPS_HASH_LEN) != 0) {
1753                 wpa_printf(MSG_DEBUG, "WPS: E-Hash1 derived from E-S1 does "
1754                            "not match with the pre-committed value");
1755                 wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE;
1756                 wps_pwd_auth_fail_event(wps->wps, 0, 1);
1757                 return -1;
1758         }
1759
1760         wpa_printf(MSG_DEBUG, "WPS: Enrollee proved knowledge of the first "
1761                    "half of the device password");
1762
1763         return 0;
1764 }
1765
1766
1767 static int wps_process_e_snonce2(struct wps_data *wps, const u8 *e_snonce2)
1768 {
1769         u8 hash[SHA256_MAC_LEN];
1770         const u8 *addr[4];
1771         size_t len[4];
1772
1773         if (e_snonce2 == NULL) {
1774                 wpa_printf(MSG_DEBUG, "WPS: No E-SNonce2 received");
1775                 return -1;
1776         }
1777
1778         wpa_hexdump_key(MSG_DEBUG, "WPS: E-SNonce2", e_snonce2,
1779                         WPS_SECRET_NONCE_LEN);
1780
1781         /* E-Hash2 = HMAC_AuthKey(E-S2 || PSK2 || PK_E || PK_R) */
1782         addr[0] = e_snonce2;
1783         len[0] = WPS_SECRET_NONCE_LEN;
1784         addr[1] = wps->psk2;
1785         len[1] = WPS_PSK_LEN;
1786         addr[2] = wpabuf_head(wps->dh_pubkey_e);
1787         len[2] = wpabuf_len(wps->dh_pubkey_e);
1788         addr[3] = wpabuf_head(wps->dh_pubkey_r);
1789         len[3] = wpabuf_len(wps->dh_pubkey_r);
1790         hmac_sha256_vector(wps->authkey, WPS_AUTHKEY_LEN, 4, addr, len, hash);
1791
1792         if (os_memcmp(wps->peer_hash2, hash, WPS_HASH_LEN) != 0) {
1793                 wpa_printf(MSG_DEBUG, "WPS: E-Hash2 derived from E-S2 does "
1794                            "not match with the pre-committed value");
1795                 wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e);
1796                 wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE;
1797                 wps_pwd_auth_fail_event(wps->wps, 0, 2);
1798                 return -1;
1799         }
1800
1801         wpa_printf(MSG_DEBUG, "WPS: Enrollee proved knowledge of the second "
1802                    "half of the device password");
1803         wps->wps_pin_revealed = 0;
1804         wps_registrar_unlock_pin(wps->wps->registrar, wps->uuid_e);
1805
1806         return 0;
1807 }
1808
1809
1810 static int wps_process_mac_addr(struct wps_data *wps, const u8 *mac_addr)
1811 {
1812         if (mac_addr == NULL) {
1813                 wpa_printf(MSG_DEBUG, "WPS: No MAC Address received");
1814                 return -1;
1815         }
1816
1817         wpa_printf(MSG_DEBUG, "WPS: Enrollee MAC Address " MACSTR,
1818                    MAC2STR(mac_addr));
1819         os_memcpy(wps->mac_addr_e, mac_addr, ETH_ALEN);
1820         os_memcpy(wps->peer_dev.mac_addr, mac_addr, ETH_ALEN);
1821
1822         return 0;
1823 }
1824
1825
1826 static int wps_process_pubkey(struct wps_data *wps, const u8 *pk,
1827                               size_t pk_len)
1828 {
1829         if (pk == NULL || pk_len == 0) {
1830                 wpa_printf(MSG_DEBUG, "WPS: No Public Key received");
1831                 return -1;
1832         }
1833
1834 #ifdef CONFIG_WPS_OOB
1835         if (wps->wps->oob_conf.pubkey_hash != NULL) {
1836                 const u8 *addr[1];
1837                 u8 hash[WPS_HASH_LEN];
1838
1839                 addr[0] = pk;
1840                 sha256_vector(1, addr, &pk_len, hash);
1841                 if (os_memcmp(hash,
1842                               wpabuf_head(wps->wps->oob_conf.pubkey_hash),
1843                               WPS_OOB_PUBKEY_HASH_LEN) != 0) {
1844                         wpa_printf(MSG_ERROR, "WPS: Public Key hash error");
1845                         return -1;
1846                 }
1847         }
1848 #endif /* CONFIG_WPS_OOB */
1849
1850         wpabuf_free(wps->dh_pubkey_e);
1851         wps->dh_pubkey_e = wpabuf_alloc_copy(pk, pk_len);
1852         if (wps->dh_pubkey_e == NULL)
1853                 return -1;
1854
1855         return 0;
1856 }
1857
1858
1859 static int wps_process_auth_type_flags(struct wps_data *wps, const u8 *auth)
1860 {
1861         u16 auth_types;
1862
1863         if (auth == NULL) {
1864                 wpa_printf(MSG_DEBUG, "WPS: No Authentication Type flags "
1865                            "received");
1866                 return -1;
1867         }
1868
1869         auth_types = WPA_GET_BE16(auth);
1870
1871         wpa_printf(MSG_DEBUG, "WPS: Enrollee Authentication Type flags 0x%x",
1872                    auth_types);
1873         wps->auth_type = wps->wps->auth_types & auth_types;
1874         if (wps->auth_type == 0) {
1875                 wpa_printf(MSG_DEBUG, "WPS: No match in supported "
1876                            "authentication types (own 0x%x Enrollee 0x%x)",
1877                            wps->wps->auth_types, auth_types);
1878 #ifdef WPS_WORKAROUNDS
1879                 /*
1880                  * Some deployed implementations seem to advertise incorrect
1881                  * information in this attribute. For example, Linksys WRT350N
1882                  * seems to have a byteorder bug that breaks this negotiation.
1883                  * In order to interoperate with existing implementations,
1884                  * assume that the Enrollee supports everything we do.
1885                  */
1886                 wpa_printf(MSG_DEBUG, "WPS: Workaround - assume Enrollee "
1887                            "does not advertise supported authentication types "
1888                            "correctly");
1889                 wps->auth_type = wps->wps->auth_types;
1890 #else /* WPS_WORKAROUNDS */
1891                 return -1;
1892 #endif /* WPS_WORKAROUNDS */
1893         }
1894
1895         return 0;
1896 }
1897
1898
1899 static int wps_process_encr_type_flags(struct wps_data *wps, const u8 *encr)
1900 {
1901         u16 encr_types;
1902
1903         if (encr == NULL) {
1904                 wpa_printf(MSG_DEBUG, "WPS: No Encryption Type flags "
1905                            "received");
1906                 return -1;
1907         }
1908
1909         encr_types = WPA_GET_BE16(encr);
1910
1911         wpa_printf(MSG_DEBUG, "WPS: Enrollee Encryption Type flags 0x%x",
1912                    encr_types);
1913         wps->encr_type = wps->wps->encr_types & encr_types;
1914         if (wps->encr_type == 0) {
1915                 wpa_printf(MSG_DEBUG, "WPS: No match in supported "
1916                            "encryption types (own 0x%x Enrollee 0x%x)",
1917                            wps->wps->encr_types, encr_types);
1918 #ifdef WPS_WORKAROUNDS
1919                 /*
1920                  * Some deployed implementations seem to advertise incorrect
1921                  * information in this attribute. For example, Linksys WRT350N
1922                  * seems to have a byteorder bug that breaks this negotiation.
1923                  * In order to interoperate with existing implementations,
1924                  * assume that the Enrollee supports everything we do.
1925                  */
1926                 wpa_printf(MSG_DEBUG, "WPS: Workaround - assume Enrollee "
1927                            "does not advertise supported encryption types "
1928                            "correctly");
1929                 wps->encr_type = wps->wps->encr_types;
1930 #else /* WPS_WORKAROUNDS */
1931                 return -1;
1932 #endif /* WPS_WORKAROUNDS */
1933         }
1934
1935         return 0;
1936 }
1937
1938
1939 static int wps_process_conn_type_flags(struct wps_data *wps, const u8 *conn)
1940 {
1941         if (conn == NULL) {
1942                 wpa_printf(MSG_DEBUG, "WPS: No Connection Type flags "
1943                            "received");
1944                 return -1;
1945         }
1946
1947         wpa_printf(MSG_DEBUG, "WPS: Enrollee Connection Type flags 0x%x",
1948                    *conn);
1949
1950         return 0;
1951 }
1952
1953
1954 static int wps_process_config_methods(struct wps_data *wps, const u8 *methods)
1955 {
1956         u16 m;
1957
1958         if (methods == NULL) {
1959                 wpa_printf(MSG_DEBUG, "WPS: No Config Methods received");
1960                 return -1;
1961         }
1962
1963         m = WPA_GET_BE16(methods);
1964
1965         wpa_printf(MSG_DEBUG, "WPS: Enrollee Config Methods 0x%x", m);
1966
1967         return 0;
1968 }
1969
1970
1971 static int wps_process_wps_state(struct wps_data *wps, const u8 *state)
1972 {
1973         if (state == NULL) {
1974                 wpa_printf(MSG_DEBUG, "WPS: No Wi-Fi Protected Setup State "
1975                            "received");
1976                 return -1;
1977         }
1978
1979         wpa_printf(MSG_DEBUG, "WPS: Enrollee Wi-Fi Protected Setup State %d",
1980                    *state);
1981
1982         return 0;
1983 }
1984
1985
1986 static int wps_process_assoc_state(struct wps_data *wps, const u8 *assoc)
1987 {
1988         u16 a;
1989
1990         if (assoc == NULL) {
1991                 wpa_printf(MSG_DEBUG, "WPS: No Association State received");
1992                 return -1;
1993         }
1994
1995         a = WPA_GET_BE16(assoc);
1996         wpa_printf(MSG_DEBUG, "WPS: Enrollee Association State %d", a);
1997
1998         return 0;
1999 }
2000
2001
2002 static int wps_process_config_error(struct wps_data *wps, const u8 *err)
2003 {
2004         u16 e;
2005
2006         if (err == NULL) {
2007                 wpa_printf(MSG_DEBUG, "WPS: No Configuration Error received");
2008                 return -1;
2009         }
2010
2011         e = WPA_GET_BE16(err);
2012         wpa_printf(MSG_DEBUG, "WPS: Enrollee Configuration Error %d", e);
2013
2014         return 0;
2015 }
2016
2017
2018 static enum wps_process_res wps_process_m1(struct wps_data *wps,
2019                                            struct wps_parse_attr *attr)
2020 {
2021         wpa_printf(MSG_DEBUG, "WPS: Received M1");
2022
2023         if (wps->state != RECV_M1) {
2024                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
2025                            "receiving M1", wps->state);
2026                 return WPS_FAILURE;
2027         }
2028
2029         if (wps_process_uuid_e(wps, attr->uuid_e) ||
2030             wps_process_mac_addr(wps, attr->mac_addr) ||
2031             wps_process_enrollee_nonce(wps, attr->enrollee_nonce) ||
2032             wps_process_pubkey(wps, attr->public_key, attr->public_key_len) ||
2033             wps_process_auth_type_flags(wps, attr->auth_type_flags) ||
2034             wps_process_encr_type_flags(wps, attr->encr_type_flags) ||
2035             wps_process_conn_type_flags(wps, attr->conn_type_flags) ||
2036             wps_process_config_methods(wps, attr->config_methods) ||
2037             wps_process_wps_state(wps, attr->wps_state) ||
2038             wps_process_device_attrs(&wps->peer_dev, attr) ||
2039             wps_process_rf_bands(&wps->peer_dev, attr->rf_bands) ||
2040             wps_process_assoc_state(wps, attr->assoc_state) ||
2041             wps_process_dev_password_id(wps, attr->dev_password_id) ||
2042             wps_process_config_error(wps, attr->config_error) ||
2043             wps_process_os_version(&wps->peer_dev, attr->os_version))
2044                 return WPS_FAILURE;
2045
2046         if (wps->dev_pw_id < 0x10 &&
2047             wps->dev_pw_id != DEV_PW_DEFAULT &&
2048             wps->dev_pw_id != DEV_PW_USER_SPECIFIED &&
2049             wps->dev_pw_id != DEV_PW_MACHINE_SPECIFIED &&
2050             wps->dev_pw_id != DEV_PW_REGISTRAR_SPECIFIED &&
2051             (wps->dev_pw_id != DEV_PW_PUSHBUTTON ||
2052              !wps->wps->registrar->pbc)) {
2053                 wpa_printf(MSG_DEBUG, "WPS: Unsupported Device Password ID %d",
2054                            wps->dev_pw_id);
2055                 wps->state = SEND_M2D;
2056                 return WPS_CONTINUE;
2057         }
2058
2059 #ifdef CONFIG_WPS_OOB
2060         if (wps->dev_pw_id >= 0x10 &&
2061             wps->dev_pw_id != wps->wps->oob_dev_pw_id) {
2062                 wpa_printf(MSG_DEBUG, "WPS: OOB Device Password ID "
2063                            "%d mismatch", wps->dev_pw_id);
2064                 wps->state = SEND_M2D;
2065                 return WPS_CONTINUE;
2066         }
2067 #endif /* CONFIG_WPS_OOB */
2068
2069         if (wps->dev_pw_id == DEV_PW_PUSHBUTTON) {
2070                 if (wps->wps->registrar->force_pbc_overlap ||
2071                     wps_registrar_pbc_overlap(wps->wps->registrar,
2072                                               wps->mac_addr_e, wps->uuid_e)) {
2073                         wpa_printf(MSG_DEBUG, "WPS: PBC overlap - deny PBC "
2074                                    "negotiation");
2075                         wps->state = SEND_M2D;
2076                         wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED;
2077                         wps_pbc_overlap_event(wps->wps);
2078                         wps->wps->registrar->force_pbc_overlap = 1;
2079                         return WPS_CONTINUE;
2080                 }
2081                 wps_registrar_add_pbc_session(wps->wps->registrar,
2082                                               wps->mac_addr_e, wps->uuid_e);
2083                 wps->pbc = 1;
2084         }
2085
2086         wps->state = SEND_M2;
2087         return WPS_CONTINUE;
2088 }
2089
2090
2091 static enum wps_process_res wps_process_m3(struct wps_data *wps,
2092                                            const struct wpabuf *msg,
2093                                            struct wps_parse_attr *attr)
2094 {
2095         wpa_printf(MSG_DEBUG, "WPS: Received M3");
2096
2097         if (wps->state != RECV_M3) {
2098                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
2099                            "receiving M3", wps->state);
2100                 wps->state = SEND_WSC_NACK;
2101                 return WPS_CONTINUE;
2102         }
2103
2104         if (wps->pbc && wps->wps->registrar->force_pbc_overlap) {
2105                 wpa_printf(MSG_DEBUG, "WPS: Reject negotiation due to PBC "
2106                            "session overlap");
2107                 wps->state = SEND_WSC_NACK;
2108                 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED;
2109                 return WPS_CONTINUE;
2110         }
2111
2112         if (wps_process_registrar_nonce(wps, attr->registrar_nonce) ||
2113             wps_process_authenticator(wps, attr->authenticator, msg) ||
2114             wps_process_e_hash1(wps, attr->e_hash1) ||
2115             wps_process_e_hash2(wps, attr->e_hash2)) {
2116                 wps->state = SEND_WSC_NACK;
2117                 return WPS_CONTINUE;
2118         }
2119
2120         wps->state = SEND_M4;
2121         return WPS_CONTINUE;
2122 }
2123
2124
2125 static enum wps_process_res wps_process_m5(struct wps_data *wps,
2126                                            const struct wpabuf *msg,
2127                                            struct wps_parse_attr *attr)
2128 {
2129         struct wpabuf *decrypted;
2130         struct wps_parse_attr eattr;
2131
2132         wpa_printf(MSG_DEBUG, "WPS: Received M5");
2133
2134         if (wps->state != RECV_M5) {
2135                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
2136                            "receiving M5", wps->state);
2137                 wps->state = SEND_WSC_NACK;
2138                 return WPS_CONTINUE;
2139         }
2140
2141         if (wps->pbc && wps->wps->registrar->force_pbc_overlap) {
2142                 wpa_printf(MSG_DEBUG, "WPS: Reject negotiation due to PBC "
2143                            "session overlap");
2144                 wps->state = SEND_WSC_NACK;
2145                 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED;
2146                 return WPS_CONTINUE;
2147         }
2148
2149         if (wps_process_registrar_nonce(wps, attr->registrar_nonce) ||
2150             wps_process_authenticator(wps, attr->authenticator, msg)) {
2151                 wps->state = SEND_WSC_NACK;
2152                 return WPS_CONTINUE;
2153         }
2154
2155         decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings,
2156                                               attr->encr_settings_len);
2157         if (decrypted == NULL) {
2158                 wpa_printf(MSG_DEBUG, "WPS: Failed to decrypted Encrypted "
2159                            "Settings attribute");
2160                 wps->state = SEND_WSC_NACK;
2161                 return WPS_CONTINUE;
2162         }
2163
2164         wpa_printf(MSG_DEBUG, "WPS: Processing decrypted Encrypted Settings "
2165                    "attribute");
2166         if (wps_parse_msg(decrypted, &eattr) < 0 ||
2167             wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) ||
2168             wps_process_e_snonce1(wps, eattr.e_snonce1)) {
2169                 wpabuf_free(decrypted);
2170                 wps->state = SEND_WSC_NACK;
2171                 return WPS_CONTINUE;
2172         }
2173         wpabuf_free(decrypted);
2174
2175         wps->state = SEND_M6;
2176         return WPS_CONTINUE;
2177 }
2178
2179
2180 static void wps_sta_cred_cb(struct wps_data *wps)
2181 {
2182         /*
2183          * Update credential to only include a single authentication and
2184          * encryption type in case the AP configuration includes more than one
2185          * option.
2186          */
2187         if (wps->cred.auth_type & WPS_AUTH_WPA2PSK)
2188                 wps->cred.auth_type = WPS_AUTH_WPA2PSK;
2189         else if (wps->cred.auth_type & WPS_AUTH_WPAPSK)
2190                 wps->cred.auth_type = WPS_AUTH_WPAPSK;
2191         if (wps->cred.encr_type & WPS_ENCR_AES)
2192                 wps->cred.encr_type = WPS_ENCR_AES;
2193         else if (wps->cred.encr_type & WPS_ENCR_TKIP)
2194                 wps->cred.encr_type = WPS_ENCR_TKIP;
2195         wpa_printf(MSG_DEBUG, "WPS: Update local configuration based on the "
2196                    "AP configuration");
2197         if (wps->wps->cred_cb)
2198                 wps->wps->cred_cb(wps->wps->cb_ctx, &wps->cred);
2199 }
2200
2201
2202 static void wps_cred_update(struct wps_credential *dst,
2203                             struct wps_credential *src)
2204 {
2205         os_memcpy(dst->ssid, src->ssid, sizeof(dst->ssid));
2206         dst->ssid_len = src->ssid_len;
2207         dst->auth_type = src->auth_type;
2208         dst->encr_type = src->encr_type;
2209         dst->key_idx = src->key_idx;
2210         os_memcpy(dst->key, src->key, sizeof(dst->key));
2211         dst->key_len = src->key_len;
2212 }
2213
2214
2215 static int wps_process_ap_settings_r(struct wps_data *wps,
2216                                      struct wps_parse_attr *attr)
2217 {
2218         if (wps->wps->ap || wps->er)
2219                 return 0;
2220
2221         /* AP Settings Attributes in M7 when Enrollee is an AP */
2222         if (wps_process_ap_settings(attr, &wps->cred) < 0)
2223                 return -1;
2224
2225         wpa_printf(MSG_INFO, "WPS: Received old AP configuration from AP");
2226
2227         if (wps->new_ap_settings) {
2228                 wpa_printf(MSG_INFO, "WPS: Update AP configuration based on "
2229                            "new settings");
2230                 wps_cred_update(&wps->cred, wps->new_ap_settings);
2231                 return 0;
2232         } else {
2233                 /*
2234                  * Use the AP PIN only to receive the current AP settings, not
2235                  * to reconfigure the AP.
2236                  */
2237                 if (wps->ap_settings_cb) {
2238                         wps->ap_settings_cb(wps->ap_settings_cb_ctx,
2239                                             &wps->cred);
2240                         return 1;
2241                 }
2242                 wps_sta_cred_cb(wps);
2243                 return 1;
2244         }
2245 }
2246
2247
2248 static enum wps_process_res wps_process_m7(struct wps_data *wps,
2249                                            const struct wpabuf *msg,
2250                                            struct wps_parse_attr *attr)
2251 {
2252         struct wpabuf *decrypted;
2253         struct wps_parse_attr eattr;
2254
2255         wpa_printf(MSG_DEBUG, "WPS: Received M7");
2256
2257         if (wps->state != RECV_M7) {
2258                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
2259                            "receiving M7", wps->state);
2260                 wps->state = SEND_WSC_NACK;
2261                 return WPS_CONTINUE;
2262         }
2263
2264         if (wps->pbc && wps->wps->registrar->force_pbc_overlap) {
2265                 wpa_printf(MSG_DEBUG, "WPS: Reject negotiation due to PBC "
2266                            "session overlap");
2267                 wps->state = SEND_WSC_NACK;
2268                 wps->config_error = WPS_CFG_MULTIPLE_PBC_DETECTED;
2269                 return WPS_CONTINUE;
2270         }
2271
2272         if (wps_process_registrar_nonce(wps, attr->registrar_nonce) ||
2273             wps_process_authenticator(wps, attr->authenticator, msg)) {
2274                 wps->state = SEND_WSC_NACK;
2275                 return WPS_CONTINUE;
2276         }
2277
2278         decrypted = wps_decrypt_encr_settings(wps, attr->encr_settings,
2279                                               attr->encr_settings_len);
2280         if (decrypted == NULL) {
2281                 wpa_printf(MSG_DEBUG, "WPS: Failed to decrypt Encrypted "
2282                            "Settings attribute");
2283                 wps->state = SEND_WSC_NACK;
2284                 return WPS_CONTINUE;
2285         }
2286
2287         wpa_printf(MSG_DEBUG, "WPS: Processing decrypted Encrypted Settings "
2288                    "attribute");
2289         if (wps_parse_msg(decrypted, &eattr) < 0 ||
2290             wps_process_key_wrap_auth(wps, decrypted, eattr.key_wrap_auth) ||
2291             wps_process_e_snonce2(wps, eattr.e_snonce2) ||
2292             wps_process_ap_settings_r(wps, &eattr)) {
2293                 wpabuf_free(decrypted);
2294                 wps->state = SEND_WSC_NACK;
2295                 return WPS_CONTINUE;
2296         }
2297
2298         wpabuf_free(decrypted);
2299
2300         wps->state = SEND_M8;
2301         return WPS_CONTINUE;
2302 }
2303
2304
2305 static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
2306                                                 const struct wpabuf *msg)
2307 {
2308         struct wps_parse_attr attr;
2309         enum wps_process_res ret = WPS_CONTINUE;
2310
2311         wpa_printf(MSG_DEBUG, "WPS: Received WSC_MSG");
2312
2313         if (wps_parse_msg(msg, &attr) < 0)
2314                 return WPS_FAILURE;
2315
2316         if (!wps_version_supported(attr.version)) {
2317                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
2318                            attr.version ? *attr.version : 0);
2319                 return WPS_FAILURE;
2320         }
2321
2322         if (attr.msg_type == NULL) {
2323                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
2324                 return WPS_FAILURE;
2325         }
2326
2327         if (*attr.msg_type != WPS_M1 &&
2328             (attr.registrar_nonce == NULL ||
2329              os_memcmp(wps->nonce_r, attr.registrar_nonce,
2330                        WPS_NONCE_LEN != 0))) {
2331                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
2332                 return WPS_FAILURE;
2333         }
2334
2335         switch (*attr.msg_type) {
2336         case WPS_M1:
2337 #ifdef CONFIG_WPS_UPNP
2338                 if (wps->wps->wps_upnp && attr.mac_addr) {
2339                         /* Remove old pending messages when starting new run */
2340                         wps_free_pending_msgs(wps->wps->upnp_msgs);
2341                         wps->wps->upnp_msgs = NULL;
2342
2343                         upnp_wps_device_send_wlan_event(
2344                                 wps->wps->wps_upnp, attr.mac_addr,
2345                                 UPNP_WPS_WLANEVENT_TYPE_EAP, msg);
2346                 }
2347 #endif /* CONFIG_WPS_UPNP */
2348                 ret = wps_process_m1(wps, &attr);
2349                 break;
2350         case WPS_M3:
2351                 ret = wps_process_m3(wps, msg, &attr);
2352                 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
2353                         wps_fail_event(wps->wps, WPS_M3);
2354                 break;
2355         case WPS_M5:
2356                 ret = wps_process_m5(wps, msg, &attr);
2357                 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
2358                         wps_fail_event(wps->wps, WPS_M5);
2359                 break;
2360         case WPS_M7:
2361                 ret = wps_process_m7(wps, msg, &attr);
2362                 if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
2363                         wps_fail_event(wps->wps, WPS_M7);
2364                 break;
2365         default:
2366                 wpa_printf(MSG_DEBUG, "WPS: Unsupported Message Type %d",
2367                            *attr.msg_type);
2368                 return WPS_FAILURE;
2369         }
2370
2371         if (ret == WPS_CONTINUE) {
2372                 /* Save a copy of the last message for Authenticator derivation
2373                  */
2374                 wpabuf_free(wps->last_msg);
2375                 wps->last_msg = wpabuf_dup(msg);
2376         }
2377
2378         return ret;
2379 }
2380
2381
2382 static enum wps_process_res wps_process_wsc_ack(struct wps_data *wps,
2383                                                 const struct wpabuf *msg)
2384 {
2385         struct wps_parse_attr attr;
2386
2387         wpa_printf(MSG_DEBUG, "WPS: Received WSC_ACK");
2388
2389         if (wps_parse_msg(msg, &attr) < 0)
2390                 return WPS_FAILURE;
2391
2392         if (!wps_version_supported(attr.version)) {
2393                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
2394                            attr.version ? *attr.version : 0);
2395                 return WPS_FAILURE;
2396         }
2397
2398         if (attr.msg_type == NULL) {
2399                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
2400                 return WPS_FAILURE;
2401         }
2402
2403         if (*attr.msg_type != WPS_WSC_ACK) {
2404                 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
2405                            *attr.msg_type);
2406                 return WPS_FAILURE;
2407         }
2408
2409 #ifdef CONFIG_WPS_UPNP
2410         if (wps->wps->wps_upnp && wps->ext_reg && wps->state == RECV_M2D_ACK &&
2411             upnp_wps_subscribers(wps->wps->wps_upnp)) {
2412                 if (wps->wps->upnp_msgs)
2413                         return WPS_CONTINUE;
2414                 wpa_printf(MSG_DEBUG, "WPS: Wait for response from an "
2415                            "external Registrar");
2416                 return WPS_PENDING;
2417         }
2418 #endif /* CONFIG_WPS_UPNP */
2419
2420         if (attr.registrar_nonce == NULL ||
2421             os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
2422         {
2423                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
2424                 return WPS_FAILURE;
2425         }
2426
2427         if (attr.enrollee_nonce == NULL ||
2428             os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
2429                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
2430                 return WPS_FAILURE;
2431         }
2432
2433         if (wps->state == RECV_M2D_ACK) {
2434 #ifdef CONFIG_WPS_UPNP
2435                 if (wps->wps->wps_upnp &&
2436                     upnp_wps_subscribers(wps->wps->wps_upnp)) {
2437                         if (wps->wps->upnp_msgs)
2438                                 return WPS_CONTINUE;
2439                         if (wps->ext_reg == 0)
2440                                 wps->ext_reg = 1;
2441                         wpa_printf(MSG_DEBUG, "WPS: Wait for response from an "
2442                                    "external Registrar");
2443                         return WPS_PENDING;
2444                 }
2445 #endif /* CONFIG_WPS_UPNP */
2446
2447                 wpa_printf(MSG_DEBUG, "WPS: No more registrars available - "
2448                            "terminate negotiation");
2449         }
2450
2451         return WPS_FAILURE;
2452 }
2453
2454
2455 static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps,
2456                                                  const struct wpabuf *msg)
2457 {
2458         struct wps_parse_attr attr;
2459         int old_state;
2460
2461         wpa_printf(MSG_DEBUG, "WPS: Received WSC_NACK");
2462
2463         old_state = wps->state;
2464         wps->state = SEND_WSC_NACK;
2465
2466         if (wps_parse_msg(msg, &attr) < 0)
2467                 return WPS_FAILURE;
2468
2469         if (!wps_version_supported(attr.version)) {
2470                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
2471                            attr.version ? *attr.version : 0);
2472                 return WPS_FAILURE;
2473         }
2474
2475         if (attr.msg_type == NULL) {
2476                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
2477                 return WPS_FAILURE;
2478         }
2479
2480         if (*attr.msg_type != WPS_WSC_NACK) {
2481                 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
2482                            *attr.msg_type);
2483                 return WPS_FAILURE;
2484         }
2485
2486 #ifdef CONFIG_WPS_UPNP
2487         if (wps->wps->wps_upnp && wps->ext_reg) {
2488                 wpa_printf(MSG_DEBUG, "WPS: Negotiation using external "
2489                            "Registrar terminated by the Enrollee");
2490                 return WPS_FAILURE;
2491         }
2492 #endif /* CONFIG_WPS_UPNP */
2493
2494         if (attr.registrar_nonce == NULL ||
2495             os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
2496         {
2497                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
2498                 return WPS_FAILURE;
2499         }
2500
2501         if (attr.enrollee_nonce == NULL ||
2502             os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
2503                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
2504                 return WPS_FAILURE;
2505         }
2506
2507         if (attr.config_error == NULL) {
2508                 wpa_printf(MSG_DEBUG, "WPS: No Configuration Error attribute "
2509                            "in WSC_NACK");
2510                 return WPS_FAILURE;
2511         }
2512
2513         wpa_printf(MSG_DEBUG, "WPS: Enrollee terminated negotiation with "
2514                    "Configuration Error %d", WPA_GET_BE16(attr.config_error));
2515
2516         switch (old_state) {
2517         case RECV_M3:
2518                 wps_fail_event(wps->wps, WPS_M2);
2519                 break;
2520         case RECV_M5:
2521                 wps_fail_event(wps->wps, WPS_M4);
2522                 break;
2523         case RECV_M7:
2524                 wps_fail_event(wps->wps, WPS_M6);
2525                 break;
2526         case RECV_DONE:
2527                 wps_fail_event(wps->wps, WPS_M8);
2528                 break;
2529         default:
2530                 break;
2531         }
2532
2533         return WPS_FAILURE;
2534 }
2535
2536
2537 static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,
2538                                                  const struct wpabuf *msg)
2539 {
2540         struct wps_parse_attr attr;
2541
2542         wpa_printf(MSG_DEBUG, "WPS: Received WSC_Done");
2543
2544         if (wps->state != RECV_DONE &&
2545             (!wps->wps->wps_upnp || !wps->ext_reg)) {
2546                 wpa_printf(MSG_DEBUG, "WPS: Unexpected state (%d) for "
2547                            "receiving WSC_Done", wps->state);
2548                 return WPS_FAILURE;
2549         }
2550
2551         if (wps_parse_msg(msg, &attr) < 0)
2552                 return WPS_FAILURE;
2553
2554         if (!wps_version_supported(attr.version)) {
2555                 wpa_printf(MSG_DEBUG, "WPS: Unsupported message version 0x%x",
2556                            attr.version ? *attr.version : 0);
2557                 return WPS_FAILURE;
2558         }
2559
2560         if (attr.msg_type == NULL) {
2561                 wpa_printf(MSG_DEBUG, "WPS: No Message Type attribute");
2562                 return WPS_FAILURE;
2563         }
2564
2565         if (*attr.msg_type != WPS_WSC_DONE) {
2566                 wpa_printf(MSG_DEBUG, "WPS: Invalid Message Type %d",
2567                            *attr.msg_type);
2568                 return WPS_FAILURE;
2569         }
2570
2571 #ifdef CONFIG_WPS_UPNP
2572         if (wps->wps->wps_upnp && wps->ext_reg) {
2573                 wpa_printf(MSG_DEBUG, "WPS: Negotiation using external "
2574                            "Registrar completed successfully");
2575                 wps_device_store(wps->wps->registrar, &wps->peer_dev,
2576                                  wps->uuid_e);
2577                 return WPS_DONE;
2578         }
2579 #endif /* CONFIG_WPS_UPNP */
2580
2581         if (attr.registrar_nonce == NULL ||
2582             os_memcmp(wps->nonce_r, attr.registrar_nonce, WPS_NONCE_LEN != 0))
2583         {
2584                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in registrar nonce");
2585                 return WPS_FAILURE;
2586         }
2587
2588         if (attr.enrollee_nonce == NULL ||
2589             os_memcmp(wps->nonce_e, attr.enrollee_nonce, WPS_NONCE_LEN != 0)) {
2590                 wpa_printf(MSG_DEBUG, "WPS: Mismatch in enrollee nonce");
2591                 return WPS_FAILURE;
2592         }
2593
2594         wpa_printf(MSG_DEBUG, "WPS: Negotiation completed successfully");
2595         wps_device_store(wps->wps->registrar, &wps->peer_dev,
2596                          wps->uuid_e);
2597
2598         if (wps->wps->wps_state == WPS_STATE_NOT_CONFIGURED && wps->new_psk &&
2599             wps->wps->ap && !wps->wps->registrar->disable_auto_conf) {
2600                 struct wps_credential cred;
2601
2602                 wpa_printf(MSG_DEBUG, "WPS: Moving to Configured state based "
2603                            "on first Enrollee connection");
2604
2605                 os_memset(&cred, 0, sizeof(cred));
2606                 os_memcpy(cred.ssid, wps->wps->ssid, wps->wps->ssid_len);
2607                 cred.ssid_len = wps->wps->ssid_len;
2608                 cred.auth_type = WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK;
2609                 cred.encr_type = WPS_ENCR_TKIP | WPS_ENCR_AES;
2610                 os_memcpy(cred.key, wps->new_psk, wps->new_psk_len);
2611                 cred.key_len = wps->new_psk_len;
2612
2613                 wps->wps->wps_state = WPS_STATE_CONFIGURED;
2614                 wpa_hexdump_ascii_key(MSG_DEBUG,
2615                                       "WPS: Generated random passphrase",
2616                                       wps->new_psk, wps->new_psk_len);
2617                 if (wps->wps->cred_cb)
2618                         wps->wps->cred_cb(wps->wps->cb_ctx, &cred);
2619
2620                 os_free(wps->new_psk);
2621                 wps->new_psk = NULL;
2622         }
2623
2624         if (!wps->wps->ap)
2625                 wps_sta_cred_cb(wps);
2626
2627         if (wps->new_psk) {
2628                 if (wps_cb_new_psk(wps->wps->registrar, wps->mac_addr_e,
2629                                    wps->new_psk, wps->new_psk_len)) {
2630                         wpa_printf(MSG_DEBUG, "WPS: Failed to configure the "
2631                                    "new PSK");
2632                 }
2633                 os_free(wps->new_psk);
2634                 wps->new_psk = NULL;
2635         }
2636
2637         wps_cb_reg_success(wps->wps->registrar, wps->mac_addr_e, wps->uuid_e);
2638
2639         if (wps->pbc) {
2640                 wps_registrar_remove_pbc_session(wps->wps->registrar,
2641                                                  wps->mac_addr_e, wps->uuid_e);
2642                 wps_registrar_pbc_completed(wps->wps->registrar);
2643         } else {
2644                 wps_registrar_pin_completed(wps->wps->registrar);
2645         }
2646
2647         wps_success_event(wps->wps);
2648
2649         return WPS_DONE;
2650 }
2651
2652
2653 enum wps_process_res wps_registrar_process_msg(struct wps_data *wps,
2654                                                enum wsc_op_code op_code,
2655                                                const struct wpabuf *msg)
2656 {
2657         enum wps_process_res ret;
2658
2659         wpa_printf(MSG_DEBUG, "WPS: Processing received message (len=%lu "
2660                    "op_code=%d)",
2661                    (unsigned long) wpabuf_len(msg), op_code);
2662
2663 #ifdef CONFIG_WPS_UPNP
2664         if (wps->wps->wps_upnp && op_code == WSC_MSG && wps->ext_reg == 1) {
2665                 struct wps_parse_attr attr;
2666                 if (wps_parse_msg(msg, &attr) == 0 && attr.msg_type &&
2667                     *attr.msg_type == WPS_M3)
2668                         wps->ext_reg = 2; /* past M2/M2D phase */
2669         }
2670         if (wps->ext_reg > 1)
2671                 wps_registrar_free_pending_m2(wps->wps);
2672         if (wps->wps->wps_upnp && wps->ext_reg &&
2673             wps->wps->upnp_msgs == NULL &&
2674             (op_code == WSC_MSG || op_code == WSC_Done || op_code == WSC_NACK))
2675         {
2676                 struct wps_parse_attr attr;
2677                 int type;
2678                 if (wps_parse_msg(msg, &attr) < 0 || attr.msg_type == NULL)
2679                         type = -1;
2680                 else
2681                         type = *attr.msg_type;
2682                 wpa_printf(MSG_DEBUG, "WPS: Sending received message (type %d)"
2683                            " to external Registrar for processing", type);
2684                 upnp_wps_device_send_wlan_event(wps->wps->wps_upnp,
2685                                                 wps->mac_addr_e,
2686                                                 UPNP_WPS_WLANEVENT_TYPE_EAP,
2687                                                 msg);
2688                 if (op_code == WSC_MSG)
2689                         return WPS_PENDING;
2690         } else if (wps->wps->wps_upnp && wps->ext_reg && op_code == WSC_MSG) {
2691                 wpa_printf(MSG_DEBUG, "WPS: Skip internal processing - using "
2692                            "external Registrar");
2693                 return WPS_CONTINUE;
2694         }
2695 #endif /* CONFIG_WPS_UPNP */
2696
2697         switch (op_code) {
2698         case WSC_MSG:
2699                 return wps_process_wsc_msg(wps, msg);
2700         case WSC_ACK:
2701                 return wps_process_wsc_ack(wps, msg);
2702         case WSC_NACK:
2703                 return wps_process_wsc_nack(wps, msg);
2704         case WSC_Done:
2705                 ret = wps_process_wsc_done(wps, msg);
2706                 if (ret == WPS_FAILURE) {
2707                         wps->state = SEND_WSC_NACK;
2708                         wps_fail_event(wps->wps, WPS_WSC_DONE);
2709                 }
2710                 return ret;
2711         default:
2712                 wpa_printf(MSG_DEBUG, "WPS: Unsupported op_code %d", op_code);
2713                 return WPS_FAILURE;
2714         }
2715 }
2716
2717
2718 int wps_registrar_update_ie(struct wps_registrar *reg)
2719 {
2720         return wps_set_ie(reg);
2721 }
2722
2723
2724 static void wps_registrar_set_selected_timeout(void *eloop_ctx,
2725                                                void *timeout_ctx)
2726 {
2727         struct wps_registrar *reg = eloop_ctx;
2728
2729         wpa_printf(MSG_DEBUG, "WPS: SetSelectedRegistrar timed out - "
2730                    "unselect Registrar");
2731         reg->selected_registrar = 0;
2732         reg->pbc = 0;
2733         reg->sel_reg_dev_password_id_override = -1;
2734         reg->sel_reg_config_methods_override = -1;
2735         wps_set_ie(reg);
2736         wps_cb_set_sel_reg(reg);
2737 }
2738
2739
2740 /**
2741  * wps_registrar_set_selected_registrar - Notification of SetSelectedRegistrar
2742  * @reg: Registrar data from wps_registrar_init()
2743  * @msg: Received message from SetSelectedRegistrar
2744  * Returns: 0 on success, -1 on failure
2745  *
2746  * This function is called when an AP receives a SetSelectedRegistrar UPnP
2747  * message.
2748  */
2749 int wps_registrar_set_selected_registrar(struct wps_registrar *reg,
2750                                          const struct wpabuf *msg)
2751 {
2752         struct wps_parse_attr attr;
2753
2754         wpa_hexdump_buf(MSG_MSGDUMP, "WPS: SetSelectedRegistrar attributes",
2755                         msg);
2756
2757         if (wps_parse_msg(msg, &attr) < 0)
2758                 return -1;
2759         if (!wps_version_supported(attr.version)) {
2760                 wpa_printf(MSG_DEBUG, "WPS: Unsupported SetSelectedRegistrar "
2761                            "version 0x%x", attr.version ? *attr.version : 0);
2762                 return -1;
2763         }
2764
2765         if (attr.selected_registrar == NULL ||
2766             *attr.selected_registrar == 0) {
2767                 wpa_printf(MSG_DEBUG, "WPS: SetSelectedRegistrar: Disable "
2768                            "Selected Registrar");
2769                 eloop_cancel_timeout(wps_registrar_set_selected_timeout, reg,
2770                                      NULL);
2771                 wps_registrar_set_selected_timeout(reg, NULL);
2772                 return 0;
2773         }
2774
2775         reg->selected_registrar = 1;
2776         reg->sel_reg_dev_password_id_override = attr.dev_password_id ?
2777                 WPA_GET_BE16(attr.dev_password_id) : DEV_PW_DEFAULT;
2778         reg->sel_reg_config_methods_override = attr.sel_reg_config_methods ?
2779                 WPA_GET_BE16(attr.sel_reg_config_methods) : -1;
2780         wps_set_ie(reg);
2781
2782         eloop_cancel_timeout(wps_registrar_set_selected_timeout, reg, NULL);
2783         eloop_register_timeout(WPS_PBC_WALK_TIME, 0,
2784                                wps_registrar_set_selected_timeout,
2785                                reg, NULL);
2786         return 0;
2787 }
2788
2789
2790 int wps_registrar_get_info(struct wps_registrar *reg, const u8 *addr,
2791                            char *buf, size_t buflen)
2792 {
2793         struct wps_registrar_device *d;
2794         int len = 0, ret;
2795         char uuid[40];
2796
2797         d = wps_device_get(reg, addr);
2798         if (d == NULL)
2799                 return 0;
2800         if (uuid_bin2str(d->uuid, uuid, sizeof(uuid)))
2801                 return 0;
2802
2803         ret = os_snprintf(buf + len, buflen - len,
2804                           "wpsUuid=%s\n"
2805                           "wpsPrimaryDeviceType=%u-%08X-%u\n"
2806                           "wpsDeviceName=%s\n"
2807                           "wpsManufacturer=%s\n"
2808                           "wpsModelName=%s\n"
2809                           "wpsModelNumber=%s\n"
2810                           "wpsSerialNumber=%s\n",
2811                           uuid,
2812                           d->dev.categ, d->dev.oui, d->dev.sub_categ,
2813                           d->dev.device_name ? d->dev.device_name : "",
2814                           d->dev.manufacturer ? d->dev.manufacturer : "",
2815                           d->dev.model_name ? d->dev.model_name : "",
2816                           d->dev.model_number ? d->dev.model_number : "",
2817                           d->dev.serial_number ? d->dev.serial_number : "");
2818         if (ret < 0 || (size_t) ret >= buflen - len)
2819                 return len;
2820         len += ret;
2821
2822         return len;
2823 }