WPS ER: Add support for building NFC configuration token
WPS_ER_NFC_CONFIG_TOKEN command can now be used to build a NFC configuration token based on AP Settings learnt with WPS_ER_LEARN or set with WPS_ER_CONFIG. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
71892384da
commit
1cea09a9e2
6 changed files with 145 additions and 3 deletions
|
@ -835,6 +835,7 @@ int wps_er_set_config(struct wps_er *er, const u8 *uuid,
|
||||||
const struct wps_credential *cred);
|
const struct wps_credential *cred);
|
||||||
int wps_er_config(struct wps_er *er, const u8 *uuid, const u8 *pin,
|
int wps_er_config(struct wps_er *er, const u8 *uuid, const u8 *pin,
|
||||||
size_t pin_len, const struct wps_credential *cred);
|
size_t pin_len, const struct wps_credential *cred);
|
||||||
|
struct wpabuf * wps_er_nfc_config_token(struct wps_er *er, const u8 *uuid);
|
||||||
|
|
||||||
int wps_dev_type_str2bin(const char *str, u8 dev_type[WPS_DEV_TYPE_LEN]);
|
int wps_dev_type_str2bin(const char *str, u8 dev_type[WPS_DEV_TYPE_LEN]);
|
||||||
char * wps_dev_type_bin2str(const u8 dev_type[WPS_DEV_TYPE_LEN], char *buf,
|
char * wps_dev_type_bin2str(const u8 dev_type[WPS_DEV_TYPE_LEN], char *buf,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Wi-Fi Protected Setup - External Registrar
|
* Wi-Fi Protected Setup - External Registrar
|
||||||
* Copyright (c) 2009, Jouni Malinen <j@w1.fi>
|
* Copyright (c) 2009-2012, Jouni Malinen <j@w1.fi>
|
||||||
*
|
*
|
||||||
* This software may be distributed under the terms of the BSD license.
|
* This software may be distributed under the terms of the BSD license.
|
||||||
* See README for more details.
|
* See README for more details.
|
||||||
|
@ -1996,3 +1996,41 @@ int wps_er_config(struct wps_er *er, const u8 *uuid, const u8 *pin,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
struct wpabuf * wps_er_nfc_config_token(struct wps_er *er, const u8 *uuid)
|
||||||
|
{
|
||||||
|
struct wps_er_ap *ap;
|
||||||
|
struct wpabuf *ret;
|
||||||
|
struct wps_data data;
|
||||||
|
|
||||||
|
if (er == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ap = wps_er_ap_get(er, NULL, uuid);
|
||||||
|
if (ap == NULL)
|
||||||
|
return NULL;
|
||||||
|
if (ap->ap_settings == NULL) {
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS ER: No settings known for the "
|
||||||
|
"selected AP");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = wpabuf_alloc(500);
|
||||||
|
if (ret == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
os_memset(&data, 0, sizeof(data));
|
||||||
|
data.wps = er->wps;
|
||||||
|
data.use_cred = ap->ap_settings;
|
||||||
|
if (wps_build_version(ret) ||
|
||||||
|
wps_build_cred(&data, ret) ||
|
||||||
|
wps_build_wfa_ext(ret, 0, NULL, 0)) {
|
||||||
|
wpabuf_free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_WPS_NFC */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* WPA Supplicant / Control interface (shared code for all backends)
|
* WPA Supplicant / Control interface (shared code for all backends)
|
||||||
* Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi>
|
* Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi>
|
||||||
*
|
*
|
||||||
* This software may be distributed under the terms of the BSD license.
|
* This software may be distributed under the terms of the BSD license.
|
||||||
* See README for more details.
|
* See README for more details.
|
||||||
|
@ -892,6 +892,43 @@ static int wpa_supplicant_ctrl_iface_wps_er_config(
|
||||||
ap.key_hex = new_key;
|
ap.key_hex = new_key;
|
||||||
return wpas_wps_er_config(wpa_s, cmd, pin, &ap);
|
return wpas_wps_er_config(wpa_s, cmd, pin, &ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
static int wpa_supplicant_ctrl_iface_wps_er_nfc_config_token(
|
||||||
|
struct wpa_supplicant *wpa_s, char *cmd, char *reply, size_t max_len)
|
||||||
|
{
|
||||||
|
int ndef;
|
||||||
|
struct wpabuf *buf;
|
||||||
|
int res;
|
||||||
|
char *uuid;
|
||||||
|
|
||||||
|
uuid = os_strchr(cmd, ' ');
|
||||||
|
if (uuid == NULL)
|
||||||
|
return -1;
|
||||||
|
*uuid++ = '\0';
|
||||||
|
|
||||||
|
if (os_strcmp(cmd, "WPS") == 0)
|
||||||
|
ndef = 0;
|
||||||
|
else if (os_strcmp(cmd, "NDEF") == 0)
|
||||||
|
ndef = 1;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
buf = wpas_wps_er_nfc_config_token(wpa_s, ndef, uuid);
|
||||||
|
if (buf == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
res = wpa_snprintf_hex_uppercase(reply, max_len, wpabuf_head(buf),
|
||||||
|
wpabuf_len(buf));
|
||||||
|
reply[res++] = '\n';
|
||||||
|
reply[res] = '\0';
|
||||||
|
|
||||||
|
wpabuf_free(buf);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_WPS_NFC */
|
||||||
#endif /* CONFIG_WPS_ER */
|
#endif /* CONFIG_WPS_ER */
|
||||||
|
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
@ -4182,6 +4219,11 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
|
||||||
} else if (os_strncmp(buf, "WPS_ER_CONFIG ", 14) == 0) {
|
} else if (os_strncmp(buf, "WPS_ER_CONFIG ", 14) == 0) {
|
||||||
if (wpa_supplicant_ctrl_iface_wps_er_config(wpa_s, buf + 14))
|
if (wpa_supplicant_ctrl_iface_wps_er_config(wpa_s, buf + 14))
|
||||||
reply_len = -1;
|
reply_len = -1;
|
||||||
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
} else if (os_strncmp(buf, "WPS_ER_NFC_CONFIG_TOKEN ", 24) == 0) {
|
||||||
|
reply_len = wpa_supplicant_ctrl_iface_wps_er_nfc_config_token(
|
||||||
|
wpa_s, buf + 24, reply, reply_size);
|
||||||
|
#endif /* CONFIG_WPS_NFC */
|
||||||
#endif /* CONFIG_WPS_ER */
|
#endif /* CONFIG_WPS_ER */
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
#ifdef CONFIG_IBSS_RSN
|
#ifdef CONFIG_IBSS_RSN
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* WPA Supplicant - command line interface for wpa_supplicant daemon
|
* WPA Supplicant - command line interface for wpa_supplicant daemon
|
||||||
* Copyright (c) 2004-2011, Jouni Malinen <j@w1.fi>
|
* Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi>
|
||||||
*
|
*
|
||||||
* This software may be distributed under the terms of the BSD license.
|
* This software may be distributed under the terms of the BSD license.
|
||||||
* See README for more details.
|
* See README for more details.
|
||||||
|
@ -1175,6 +1175,32 @@ static int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
static int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
|
||||||
|
char *argv[])
|
||||||
|
{
|
||||||
|
char cmd[256];
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
|
||||||
|
"arguments:\n"
|
||||||
|
"- WPS/NDEF: token format\n"
|
||||||
|
"- UUID: specify which AP to use\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_NFC_CONFIG_TOKEN %s %s",
|
||||||
|
argv[0], argv[1]);
|
||||||
|
if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
|
||||||
|
printf("Too long WPS_ER_NFC_CONFIG_TOKEN command.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return wpa_ctrl_command(ctrl, cmd);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_WPS_NFC */
|
||||||
|
|
||||||
|
|
||||||
static int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
|
static int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char cmd[256];
|
char cmd[256];
|
||||||
|
@ -3152,6 +3178,11 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
|
||||||
{ "wps_er_config", wpa_cli_cmd_wps_er_config,
|
{ "wps_er_config", wpa_cli_cmd_wps_er_config,
|
||||||
cli_cmd_flag_sensitive,
|
cli_cmd_flag_sensitive,
|
||||||
"<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
|
"<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
|
||||||
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
{ "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token,
|
||||||
|
cli_cmd_flag_none,
|
||||||
|
"<WPS/NDEF> <UUID> = build NFC configuration token" },
|
||||||
|
#endif /* CONFIG_WPS_NFC */
|
||||||
{ "ibss_rsn", wpa_cli_cmd_ibss_rsn,
|
{ "ibss_rsn", wpa_cli_cmd_ibss_rsn,
|
||||||
cli_cmd_flag_none,
|
cli_cmd_flag_none,
|
||||||
"<addr> = request RSN authentication with <addr> in IBSS" },
|
"<addr> = request RSN authentication with <addr> in IBSS" },
|
||||||
|
|
|
@ -1674,6 +1674,34 @@ int wpas_wps_er_config(struct wpa_supplicant *wpa_s, const char *uuid,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS_NFC
|
||||||
|
struct wpabuf * wpas_wps_er_nfc_config_token(struct wpa_supplicant *wpa_s,
|
||||||
|
int ndef, const char *uuid)
|
||||||
|
{
|
||||||
|
struct wpabuf *ret;
|
||||||
|
u8 u[UUID_LEN];
|
||||||
|
|
||||||
|
if (!wpa_s->wps_er)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (uuid_str2bin(uuid, u))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ret = wps_er_nfc_config_token(wpa_s->wps_er, u);
|
||||||
|
if (ndef && ret) {
|
||||||
|
struct wpabuf *tmp;
|
||||||
|
tmp = ndef_build_wifi(ret);
|
||||||
|
wpabuf_free(ret);
|
||||||
|
if (tmp == NULL)
|
||||||
|
return NULL;
|
||||||
|
ret = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_WPS_NFC */
|
||||||
|
|
||||||
|
|
||||||
static int callbacks_pending = 0;
|
static int callbacks_pending = 0;
|
||||||
|
|
||||||
static void wpas_wps_terminate_cb(void *ctx)
|
static void wpas_wps_terminate_cb(void *ctx)
|
||||||
|
|
|
@ -59,6 +59,8 @@ int wpas_wps_er_set_config(struct wpa_supplicant *wpa_s, const char *uuid,
|
||||||
int id);
|
int id);
|
||||||
int wpas_wps_er_config(struct wpa_supplicant *wpa_s, const char *uuid,
|
int wpas_wps_er_config(struct wpa_supplicant *wpa_s, const char *uuid,
|
||||||
const char *pin, struct wps_new_ap_settings *settings);
|
const char *pin, struct wps_new_ap_settings *settings);
|
||||||
|
struct wpabuf * wpas_wps_er_nfc_config_token(struct wpa_supplicant *wpa_s,
|
||||||
|
int ndef, const char *uuid);
|
||||||
int wpas_wps_terminate_pending(struct wpa_supplicant *wpa_s);
|
int wpas_wps_terminate_pending(struct wpa_supplicant *wpa_s);
|
||||||
int wpas_wps_in_progress(struct wpa_supplicant *wpa_s);
|
int wpas_wps_in_progress(struct wpa_supplicant *wpa_s);
|
||||||
void wpas_wps_update_config(struct wpa_supplicant *wpa_s);
|
void wpas_wps_update_config(struct wpa_supplicant *wpa_s);
|
||||||
|
|
Loading…
Reference in a new issue