|
@@ -649,16 +649,6 @@ int hostapd_init_wps(struct hostapd_data *hapd,
|
|
|
}
|
|
|
#endif /* CONFIG_WPS_UPNP */
|
|
|
|
|
|
- wps->dh_pubkey = dh_init(dh_groups_get(WPS_DH_GROUP),
|
|
|
- &wps->dh_privkey);
|
|
|
- wps->dh_pubkey = wpabuf_zeropad(wps->dh_pubkey, 192);
|
|
|
- if (wps->dh_pubkey == NULL) {
|
|
|
- wpa_printf(MSG_ERROR, "WPS: Failed to initialize "
|
|
|
- "Diffie-Hellman handshake");
|
|
|
- os_free(wps);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
hapd->wps = wps;
|
|
|
|
|
|
return 0;
|
|
@@ -721,16 +711,41 @@ int hostapd_wps_start_oob(struct hostapd_data *hapd, char *device_type,
|
|
|
oob_dev->device_path = path;
|
|
|
wps->oob_conf.oob_method = wps_get_oob_method(method);
|
|
|
|
|
|
+ if (wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_R) {
|
|
|
+ /*
|
|
|
+ * Use pre-configured DH keys in order to be able to write the
|
|
|
+ * key hash into the OOB file.
|
|
|
+ */
|
|
|
+ wpabuf_free(wps->dh_pubkey);
|
|
|
+ wpabuf_free(wps->dh_privkey);
|
|
|
+ wps->dh_privkey = NULL;
|
|
|
+ wps->dh_pubkey = dh_init(dh_groups_get(WPS_DH_GROUP),
|
|
|
+ &wps->dh_privkey);
|
|
|
+ wps->dh_pubkey = wpabuf_zeropad(wps->dh_pubkey, 192);
|
|
|
+ if (wps->dh_pubkey == NULL) {
|
|
|
+ wpa_printf(MSG_ERROR, "WPS: Failed to initialize "
|
|
|
+ "Diffie-Hellman handshake");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (wps_process_oob(wps, oob_dev, 1) < 0)
|
|
|
- return -1;
|
|
|
+ goto error;
|
|
|
|
|
|
if ((wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_E ||
|
|
|
wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_R) &&
|
|
|
hostapd_wps_add_pin(hapd, "any",
|
|
|
wpabuf_head(wps->oob_conf.dev_password)) < 0)
|
|
|
- return -1;
|
|
|
+ goto error;
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+error:
|
|
|
+ wpabuf_free(wps->dh_pubkey);
|
|
|
+ wps->dh_pubkey = NULL;
|
|
|
+ wpabuf_free(wps->dh_privkey);
|
|
|
+ wps->dh_privkey = NULL;
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
|