hostapd: Fix internal crypto build without TLS
[wpasupplicant] / wpa_supplicant / ctrl_iface_dbus_handlers.c
index 3fbe5d3..e9dd9a5 100644 (file)
@@ -25,6 +25,7 @@
 #include "ieee802_11_defs.h"
 #include "wpas_glue.h"
 #include "eapol_supp/eapol_supp_sm.h"
+#include "wps_supplicant.h"
 
 extern int wpa_debug_level;
 extern int wpa_debug_show_keys;
@@ -1460,3 +1461,146 @@ DBusMessage * wpas_dbus_iface_remove_blobs(DBusMessage *message,
 
        return wpas_dbus_new_success_reply(message);
 }
+
+
+#ifdef CONFIG_WPS
+
+/**
+ * wpas_dbus_iface_wps_pbc - Request credentials using WPS PBC method
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: %wpa_supplicant data structure
+ * Returns: A dbus message containing a UINT32 indicating success (1) or
+ *          failure (0)
+ *
+ * Handler function for "wpsPbc" method call
+ */
+DBusMessage * wpas_dbus_iface_wps_pbc(DBusMessage *message,
+                                     struct wpa_supplicant *wpa_s)
+{
+       char *arg_bssid = NULL;
+       u8 bssid[ETH_ALEN];
+       int ret = 0;
+
+       if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
+                                  DBUS_TYPE_INVALID))
+               return wpas_dbus_new_invalid_opts_error(message, NULL);
+
+       if (!os_strcmp(arg_bssid, "any"))
+               ret = wpas_wps_start_pbc(wpa_s, NULL);
+       else if (!hwaddr_aton(arg_bssid, bssid))
+               ret = wpas_wps_start_pbc(wpa_s, bssid);
+       else {
+               return wpas_dbus_new_invalid_opts_error(message,
+                                                       "Invalid BSSID");
+       }
+
+       if (ret < 0) {
+               return dbus_message_new_error(message,
+                                             WPAS_ERROR_WPS_PBC_ERROR,
+                                             "Could not start PBC "
+                                             "negotiation");
+       }
+
+       return wpas_dbus_new_success_reply(message);
+}
+
+
+/**
+ * wpas_dbus_iface_wps_pin - Establish the PIN number of the enrollee
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: %wpa_supplicant data structure
+ * Returns: A dbus message containing a UINT32 indicating success (1) or
+ *          failure (0)
+ *
+ * Handler function for "wpsPin" method call
+ */
+DBusMessage * wpas_dbus_iface_wps_pin(DBusMessage *message,
+                                     struct wpa_supplicant *wpa_s)
+{
+       DBusMessage *reply = NULL;
+       char *arg_bssid;
+       char *pin = NULL;
+       u8 bssid[ETH_ALEN], *_bssid = NULL;
+       int ret = 0;
+
+       if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
+                                  DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
+               return wpas_dbus_new_invalid_opts_error(message, NULL);
+
+       if (!os_strcmp(arg_bssid, "any"))
+               _bssid = NULL;
+       else if (!hwaddr_aton(arg_bssid, bssid))
+               _bssid = bssid;
+       else {
+               return wpas_dbus_new_invalid_opts_error(message,
+                                                       "Invalid BSSID");
+       }
+
+       if (os_strlen(pin) > 0)
+               ret = wpas_wps_start_pin(wpa_s, _bssid, pin);
+       else
+               ret = wpas_wps_start_pin(wpa_s, _bssid, NULL);
+
+       if (ret < 0) {
+               return dbus_message_new_error(message,
+                                             WPAS_ERROR_WPS_PIN_ERROR,
+                                             "Could not init PIN");
+       }
+
+       reply = dbus_message_new_method_return(message);
+       if (reply == NULL)
+               return NULL;
+
+       if (ret == 0) {
+               dbus_message_append_args(reply, DBUS_TYPE_STRING, &pin,
+                                        DBUS_TYPE_INVALID);
+       } else {
+               char npin[9];
+               sprintf(npin, "%08d", ret);
+               dbus_message_append_args(reply, DBUS_TYPE_STRING, &npin,
+                                        DBUS_TYPE_INVALID);
+       }
+       return reply;
+}
+
+
+/**
+ * wpas_dbus_iface_wps_reg - Request credentials using the PIN of the AP
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: %wpa_supplicant data structure
+ * Returns: A dbus message containing a UINT32 indicating success (1) or
+ *          failure (0)
+ *
+ * Handler function for "wpsReg" method call
+ */
+DBusMessage * wpas_dbus_iface_wps_reg(DBusMessage *message,
+                                     struct wpa_supplicant *wpa_s)
+{
+       char *arg_bssid;
+       char *pin = NULL;
+       u8 bssid[ETH_ALEN];
+       int ret = 0;
+
+       if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
+                                  DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
+               return wpas_dbus_new_invalid_opts_error(message, NULL);
+
+       if (!os_strcmp(arg_bssid, "any"))
+               ret = wpas_wps_start_reg(wpa_s, NULL, pin);
+       else if (!hwaddr_aton(arg_bssid, bssid))
+               ret = wpas_wps_start_reg(wpa_s, bssid, pin);
+       else {
+               return wpas_dbus_new_invalid_opts_error(message,
+                                                       "Invalid BSSID");
+       }
+
+       if (ret < 0) {
+               return dbus_message_new_error(message,
+                                             WPAS_ERROR_WPS_PBC_ERROR,
+                                             "Could not request credentials");
+       }
+
+       return wpas_dbus_new_success_reply(message);
+}
+
+#endif /* CONFIG_WPS */