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
|
||||
endif
|
||||
|
||||
ifdef CONFIG_WPS_TESTING
|
||||
CFLAGS += -DCONFIG_WPS_TESTING
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
ifdef CONFIG_EAP_IKEV2
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "ap/accounting.h"
|
||||
#include "ap/wps_hostapd.h"
|
||||
#include "ap/ctrl_iface_ap.h"
|
||||
#include "wps/wps_defs.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 */
|
||||
|
||||
|
||||
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,
|
||||
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, reply_size);
|
||||
#endif /* CONFIG_WPS */
|
||||
} else if (os_strncmp(buf, "SET ", 4) == 0) {
|
||||
if (hostapd_ctrl_iface_set(hapd, buf + 4))
|
||||
reply_len = -1;
|
||||
} else {
|
||||
os_memcpy(reply, "UNKNOWN COMMAND\n", 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 {
|
||||
const char *cmd;
|
||||
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 },
|
||||
{ "license", hostapd_cli_cmd_license },
|
||||
{ "quit", hostapd_cli_cmd_quit },
|
||||
{ "set", hostapd_cli_cmd_set },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -21,6 +21,12 @@
|
|||
#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
|
||||
* @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);
|
||||
#endif /* CONFIG_WPS2 */
|
||||
|
||||
#ifdef CONFIG_WPS_EXTENSIBILITY_TESTING
|
||||
wpa_printf(MSG_DEBUG, "WPS: * Extensibility Testing - extra "
|
||||
"attribute";
|
||||
wpabuf_put_be16(msg, ATTR_EXTENSIBILITY_TEST);
|
||||
wpabuf_put_be16(msg, 1);
|
||||
wpabuf_put_u8(msg, 42);
|
||||
#endif /* CONFIG_WPS_EXTENSIBILITY_TESTING */
|
||||
#ifdef CONFIG_WPS_TESTING
|
||||
if (WPS_VERSION > 0x20) {
|
||||
wpa_printf(MSG_DEBUG, "WPS: * Extensibility Testing - extra "
|
||||
"attribute");
|
||||
wpabuf_put_be16(msg, ATTR_EXTENSIBILITY_TEST);
|
||||
wpabuf_put_be16(msg, 1);
|
||||
wpabuf_put_u8(msg, 42);
|
||||
}
|
||||
#endif /* CONFIG_WPS_TESTING */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,16 +15,22 @@
|
|||
#ifndef 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_WPS_EXTENSIBILITY_TESTING
|
||||
#define WPS_VERSION 0x57
|
||||
#else /* CONFIG_WPS_EXTENSIBILITY_TESTING */
|
||||
#define WPS_VERSION 0x20
|
||||
#endif /* CONFIG_WPS_EXTENSIBILITY_TESTING */
|
||||
#else /* CONFIG_WPS2 */
|
||||
#define WPS_VERSION 0x10
|
||||
#endif /* CONFIG_WPS2 */
|
||||
|
||||
#endif /* CONFIG_WPS_TESTING */
|
||||
|
||||
/* Diffie-Hellman 1536-bit MODP Group; RFC 3526, Group 5 */
|
||||
#define WPS_DH_GROUP 5
|
||||
|
||||
|
|
|
@ -1465,8 +1465,11 @@ int wps_build_cred(struct wps_data *wps, struct wpabuf *msg)
|
|||
}
|
||||
|
||||
use_provided:
|
||||
#ifdef CONFIG_WPS_TESTING_EXTRA_CRED
|
||||
cred = wpabuf_alloc(200);
|
||||
#ifdef CONFIG_WPS_TESTING
|
||||
if (wps_testing_dummy_cred)
|
||||
cred = wpabuf_alloc(200);
|
||||
else
|
||||
cred = NULL;
|
||||
if (cred) {
|
||||
struct wps_credential dummy;
|
||||
wpa_printf(MSG_DEBUG, "WPS: Add dummy credential");
|
||||
|
@ -1487,7 +1490,7 @@ use_provided:
|
|||
|
||||
wpabuf_free(cred);
|
||||
}
|
||||
#endif /* CONFIG_WPS_TESTING_EXTRA_CRED */
|
||||
#endif /* CONFIG_WPS_TESTING */
|
||||
|
||||
cred = wpabuf_alloc(200);
|
||||
if (cred == NULL)
|
||||
|
|
|
@ -559,6 +559,10 @@ CFLAGS += -DCONFIG_WPS_STRICT
|
|||
OBJS += ../src/wps/wps_validate.o
|
||||
endif
|
||||
|
||||
ifdef CONFIG_WPS_TESTING
|
||||
CFLAGS += -DCONFIG_WPS_TESTING
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
ifdef CONFIG_EAP_IKEV2
|
||||
|
|
|
@ -84,6 +84,26 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
|
|||
ret = -1;
|
||||
} else if (os_strcasecmp(cmd, "wps_fragment_size") == 0) {
|
||||
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) {
|
||||
if (wpa_drv_ampdu(wpa_s, atoi(value)) < 0)
|
||||
ret = -1;
|
||||
|
|
Loading…
Reference in a new issue