WPS: Make testing operations configurable at runtime
Instead of build time options (CONFIG_WPS_TESTING_EXTRA_CRED and CONFIG_WPS_EXTENSIBILITY_TESTING), use a single build option (CONFIG_WPS_TESTING) and runtime configuration of which testing operations are enabled. This allows a single binary to be used for various tests. The runtime configuration can be done through control interface with wpa_cli/hostapd_cli commands: Enable extensibility tests: set wps_version_number 0x57 Disable extensibility tests (WPS2 build): set wps_version_number 0x20 Enable extra credential tests: set wps_testing_dummy_cred 1 Disable extra credential tests: set wps_testing_dummy_cred 0
This commit is contained in:
parent
ab98525399
commit
b4e34f2fdf
9 changed files with 124 additions and 14 deletions
|
@ -361,6 +361,10 @@ CFLAGS += -DCONFIG_WPS_STRICT
|
||||||
OBJS += ../src/wps/wps_validate.o
|
OBJS += ../src/wps/wps_validate.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_WPS_TESTING
|
||||||
|
CFLAGS += -DCONFIG_WPS_TESTING
|
||||||
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_EAP_IKEV2
|
ifdef CONFIG_EAP_IKEV2
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "ap/accounting.h"
|
#include "ap/accounting.h"
|
||||||
#include "ap/wps_hostapd.h"
|
#include "ap/wps_hostapd.h"
|
||||||
#include "ap/ctrl_iface_ap.h"
|
#include "ap/ctrl_iface_ap.h"
|
||||||
|
#include "wps/wps_defs.h"
|
||||||
#include "ctrl_iface.h"
|
#include "ctrl_iface.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -446,6 +447,46 @@ static int hostapd_ctrl_iface_wps_ap_pin(struct hostapd_data *hapd, char *txt,
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
|
||||||
|
|
||||||
|
static int hostapd_ctrl_iface_set(struct hostapd_data *wpa_s, char *cmd)
|
||||||
|
{
|
||||||
|
char *value;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
value = os_strchr(cmd, ' ');
|
||||||
|
if (value == NULL)
|
||||||
|
return -1;
|
||||||
|
*value++ = '\0';
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "CTRL_IFACE SET '%s'='%s'", cmd, value);
|
||||||
|
if (0) {
|
||||||
|
#ifdef CONFIG_WPS_TESTING
|
||||||
|
} else if (os_strcasecmp(cmd, "wps_version_number") == 0) {
|
||||||
|
long int val;
|
||||||
|
val = strtol(value, NULL, 0);
|
||||||
|
if (val < 0 || val > 0xff) {
|
||||||
|
ret = -1;
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS: Invalid "
|
||||||
|
"wps_version_number %ld", val);
|
||||||
|
} else {
|
||||||
|
wps_version_number = val;
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS: Testing - force WPS "
|
||||||
|
"version %u.%u",
|
||||||
|
(wps_version_number & 0xf0) >> 4,
|
||||||
|
wps_version_number & 0x0f);
|
||||||
|
}
|
||||||
|
} else if (os_strcasecmp(cmd, "wps_testing_dummy_cred") == 0) {
|
||||||
|
wps_testing_dummy_cred = atoi(value);
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS: Testing - dummy_cred=%d",
|
||||||
|
wps_testing_dummy_cred);
|
||||||
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
|
} else {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
|
static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
|
||||||
void *sock_ctx)
|
void *sock_ctx)
|
||||||
{
|
{
|
||||||
|
@ -560,6 +601,9 @@ static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
|
||||||
reply_len = hostapd_ctrl_iface_wps_ap_pin(hapd, buf + 11,
|
reply_len = hostapd_ctrl_iface_wps_ap_pin(hapd, buf + 11,
|
||||||
reply, reply_size);
|
reply, reply_size);
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
} else if (os_strncmp(buf, "SET ", 4) == 0) {
|
||||||
|
if (hostapd_ctrl_iface_set(hapd, buf + 4))
|
||||||
|
reply_len = -1;
|
||||||
} else {
|
} else {
|
||||||
os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
|
os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
|
||||||
reply_len = 16;
|
reply_len = 16;
|
||||||
|
|
|
@ -570,6 +570,26 @@ static int hostapd_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int hostapd_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char cmd[256];
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("Invalid SET command: needs two arguments (variable "
|
||||||
|
"name and value)\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", argv[0], argv[1]);
|
||||||
|
if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
|
||||||
|
printf("Too long SET command.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return wpa_ctrl_command(ctrl, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct hostapd_cli_cmd {
|
struct hostapd_cli_cmd {
|
||||||
const char *cmd;
|
const char *cmd;
|
||||||
int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
|
int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
|
||||||
|
@ -599,6 +619,7 @@ static struct hostapd_cli_cmd hostapd_cli_commands[] = {
|
||||||
{ "level", hostapd_cli_cmd_level },
|
{ "level", hostapd_cli_cmd_level },
|
||||||
{ "license", hostapd_cli_cmd_license },
|
{ "license", hostapd_cli_cmd_license },
|
||||||
{ "quit", hostapd_cli_cmd_quit },
|
{ "quit", hostapd_cli_cmd_quit },
|
||||||
|
{ "set", hostapd_cli_cmd_set },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,12 @@
|
||||||
#include "wps_dev_attr.h"
|
#include "wps_dev_attr.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS_TESTING
|
||||||
|
int wps_version_number = 0x20;
|
||||||
|
int wps_testing_dummy_cred = 0;
|
||||||
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wps_init - Initialize WPS Registration protocol data
|
* wps_init - Initialize WPS Registration protocol data
|
||||||
* @cfg: WPS configuration
|
* @cfg: WPS configuration
|
||||||
|
|
|
@ -209,13 +209,15 @@ int wps_build_wfa_ext(struct wpabuf *msg, int req_to_enroll,
|
||||||
WPA_PUT_BE16(len, (u8 *) wpabuf_put(msg, 0) - len - 2);
|
WPA_PUT_BE16(len, (u8 *) wpabuf_put(msg, 0) - len - 2);
|
||||||
#endif /* CONFIG_WPS2 */
|
#endif /* CONFIG_WPS2 */
|
||||||
|
|
||||||
#ifdef CONFIG_WPS_EXTENSIBILITY_TESTING
|
#ifdef CONFIG_WPS_TESTING
|
||||||
|
if (WPS_VERSION > 0x20) {
|
||||||
wpa_printf(MSG_DEBUG, "WPS: * Extensibility Testing - extra "
|
wpa_printf(MSG_DEBUG, "WPS: * Extensibility Testing - extra "
|
||||||
"attribute";
|
"attribute");
|
||||||
wpabuf_put_be16(msg, ATTR_EXTENSIBILITY_TEST);
|
wpabuf_put_be16(msg, ATTR_EXTENSIBILITY_TEST);
|
||||||
wpabuf_put_be16(msg, 1);
|
wpabuf_put_be16(msg, 1);
|
||||||
wpabuf_put_u8(msg, 42);
|
wpabuf_put_u8(msg, 42);
|
||||||
#endif /* CONFIG_WPS_EXTENSIBILITY_TESTING */
|
}
|
||||||
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,16 +15,22 @@
|
||||||
#ifndef WPS_DEFS_H
|
#ifndef WPS_DEFS_H
|
||||||
#define WPS_DEFS_H
|
#define WPS_DEFS_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS_TESTING
|
||||||
|
|
||||||
|
extern int wps_version_number;
|
||||||
|
extern int wps_testing_dummy_cred;
|
||||||
|
#define WPS_VERSION wps_version_number
|
||||||
|
|
||||||
|
#else /* CONFIG_WPS_TESTING */
|
||||||
|
|
||||||
#ifdef CONFIG_WPS2
|
#ifdef CONFIG_WPS2
|
||||||
#ifdef CONFIG_WPS_EXTENSIBILITY_TESTING
|
|
||||||
#define WPS_VERSION 0x57
|
|
||||||
#else /* CONFIG_WPS_EXTENSIBILITY_TESTING */
|
|
||||||
#define WPS_VERSION 0x20
|
#define WPS_VERSION 0x20
|
||||||
#endif /* CONFIG_WPS_EXTENSIBILITY_TESTING */
|
|
||||||
#else /* CONFIG_WPS2 */
|
#else /* CONFIG_WPS2 */
|
||||||
#define WPS_VERSION 0x10
|
#define WPS_VERSION 0x10
|
||||||
#endif /* CONFIG_WPS2 */
|
#endif /* CONFIG_WPS2 */
|
||||||
|
|
||||||
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
|
|
||||||
/* Diffie-Hellman 1536-bit MODP Group; RFC 3526, Group 5 */
|
/* Diffie-Hellman 1536-bit MODP Group; RFC 3526, Group 5 */
|
||||||
#define WPS_DH_GROUP 5
|
#define WPS_DH_GROUP 5
|
||||||
|
|
||||||
|
|
|
@ -1465,8 +1465,11 @@ int wps_build_cred(struct wps_data *wps, struct wpabuf *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
use_provided:
|
use_provided:
|
||||||
#ifdef CONFIG_WPS_TESTING_EXTRA_CRED
|
#ifdef CONFIG_WPS_TESTING
|
||||||
|
if (wps_testing_dummy_cred)
|
||||||
cred = wpabuf_alloc(200);
|
cred = wpabuf_alloc(200);
|
||||||
|
else
|
||||||
|
cred = NULL;
|
||||||
if (cred) {
|
if (cred) {
|
||||||
struct wps_credential dummy;
|
struct wps_credential dummy;
|
||||||
wpa_printf(MSG_DEBUG, "WPS: Add dummy credential");
|
wpa_printf(MSG_DEBUG, "WPS: Add dummy credential");
|
||||||
|
@ -1487,7 +1490,7 @@ use_provided:
|
||||||
|
|
||||||
wpabuf_free(cred);
|
wpabuf_free(cred);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_WPS_TESTING_EXTRA_CRED */
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
|
|
||||||
cred = wpabuf_alloc(200);
|
cred = wpabuf_alloc(200);
|
||||||
if (cred == NULL)
|
if (cred == NULL)
|
||||||
|
|
|
@ -559,6 +559,10 @@ CFLAGS += -DCONFIG_WPS_STRICT
|
||||||
OBJS += ../src/wps/wps_validate.o
|
OBJS += ../src/wps/wps_validate.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_WPS_TESTING
|
||||||
|
CFLAGS += -DCONFIG_WPS_TESTING
|
||||||
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_EAP_IKEV2
|
ifdef CONFIG_EAP_IKEV2
|
||||||
|
|
|
@ -84,6 +84,26 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
|
||||||
ret = -1;
|
ret = -1;
|
||||||
} else if (os_strcasecmp(cmd, "wps_fragment_size") == 0) {
|
} else if (os_strcasecmp(cmd, "wps_fragment_size") == 0) {
|
||||||
wpa_s->wps_fragment_size = atoi(value);
|
wpa_s->wps_fragment_size = atoi(value);
|
||||||
|
#ifdef CONFIG_WPS_TESTING
|
||||||
|
} else if (os_strcasecmp(cmd, "wps_version_number") == 0) {
|
||||||
|
long int val;
|
||||||
|
val = strtol(value, NULL, 0);
|
||||||
|
if (val < 0 || val > 0xff) {
|
||||||
|
ret = -1;
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS: Invalid "
|
||||||
|
"wps_version_number %ld", val);
|
||||||
|
} else {
|
||||||
|
wps_version_number = val;
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS: Testing - force WPS "
|
||||||
|
"version %u.%u",
|
||||||
|
(wps_version_number & 0xf0) >> 4,
|
||||||
|
wps_version_number & 0x0f);
|
||||||
|
}
|
||||||
|
} else if (os_strcasecmp(cmd, "wps_testing_dummy_cred") == 0) {
|
||||||
|
wps_testing_dummy_cred = atoi(value);
|
||||||
|
wpa_printf(MSG_DEBUG, "WPS: Testing - dummy_cred=%d",
|
||||||
|
wps_testing_dummy_cred);
|
||||||
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
} else if (os_strcasecmp(cmd, "ampdu") == 0) {
|
} else if (os_strcasecmp(cmd, "ampdu") == 0) {
|
||||||
if (wpa_drv_ampdu(wpa_s, atoi(value)) < 0)
|
if (wpa_drv_ampdu(wpa_s, atoi(value)) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
Loading…
Reference in a new issue