18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant / dbus-based control interface (WPS)
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license.
604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <dbus/dbus.h>
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../config.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wpa_supplicant_i.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "../wps_supplicant.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_old.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dbus_old_handlers.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_iface_wps_pbc - Request credentials using WPS PBC method
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a UINT32 indicating success (1) or
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0)
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "wpsPbc" method call
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_iface_wps_pbc(DBusMessage *message,
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_supplicant *wpa_s)
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *arg_bssid = NULL;
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 bssid[ETH_ALEN];
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   DBUS_TYPE_INVALID))
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_new_invalid_opts_error(message, NULL);
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (os_strcmp(arg_bssid, "any") == 0)
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpas_wps_start_pbc(wpa_s, NULL, 0);
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (!hwaddr_aton(arg_bssid, bssid))
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpas_wps_start_pbc(wpa_s, bssid, 0);
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else {
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_new_invalid_opts_error(message,
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							"Invalid BSSID");
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0) {
49fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		return dbus_message_new_error(
50fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt			message, WPAS_ERROR_WPS_PBC_ERROR,
51fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt			"Could not start PBC negotiation");
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_new_success_reply(message);
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_iface_wps_pin - Establish the PIN number of the enrollee
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a UINT32 indicating success (1) or
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0)
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "wpsPin" method call
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_iface_wps_pin(DBusMessage *message,
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_supplicant *wpa_s)
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DBusMessage *reply = NULL;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *arg_bssid;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pin = NULL;
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 bssid[ETH_ALEN], *_bssid = NULL;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
75fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	char npin[9];
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_new_invalid_opts_error(message, NULL);
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
81fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (os_strcmp(arg_bssid, "any") == 0)
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		_bssid = NULL;
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (!hwaddr_aton(arg_bssid, bssid))
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		_bssid = bssid;
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else {
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_new_invalid_opts_error(message,
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							"Invalid BSSID");
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_strlen(pin) > 0)
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpas_wps_start_pin(wpa_s, _bssid, pin, 0,
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DEV_PW_DEFAULT);
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpas_wps_start_pin(wpa_s, _bssid, NULL, 0,
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 DEV_PW_DEFAULT);
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0) {
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      WPAS_ERROR_WPS_PIN_ERROR,
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Could not init PIN");
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply = dbus_message_new_method_return(message);
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (reply == NULL)
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
107fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (ret > 0) {
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(npin, sizeof(npin), "%08d", ret);
109fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		pin = npin;
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
111fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	dbus_message_append_args(reply, DBUS_TYPE_STRING, &pin,
112fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt				 DBUS_TYPE_INVALID);
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return reply;
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/**
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpas_dbus_iface_wps_reg - Request credentials using the PIN of the AP
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @message: Pointer to incoming dbus message
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @wpa_s: %wpa_supplicant data structure
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: A dbus message containing a UINT32 indicating success (1) or
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *          failure (0)
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Handler function for "wpsReg" method call
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtDBusMessage * wpas_dbus_iface_wps_reg(DBusMessage *message,
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_supplicant *wpa_s)
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *arg_bssid;
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pin = NULL;
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 bssid[ETH_ALEN];
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &arg_bssid,
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   DBUS_TYPE_STRING, &pin, DBUS_TYPE_INVALID))
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_new_invalid_opts_error(message, NULL);
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (!hwaddr_aton(arg_bssid, bssid))
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpas_wps_start_reg(wpa_s, bssid, pin, NULL);
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else {
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpas_dbus_new_invalid_opts_error(message,
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							"Invalid BSSID");
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0) {
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return dbus_message_new_error(message,
147746bde5f922dfd627d25111da4313395bc4ed6afDmitry Shmidt					      WPAS_ERROR_WPS_REG_ERROR,
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      "Could not request credentials");
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpas_dbus_new_success_reply(message);
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
153