WPS: Testing mechanism to force auth/encr type flags

The new wps_force_{auth,encr}_types parameters can be used in test build
(CONFIG_WPS_TESTING) to force wpa_supplicant to use the specified value
in the Authentication/Encryption Type flags attribute. This can be used
to test AP behavior on various error cases for which there are
workarounds to cover deployed device behavior.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2016-01-01 13:03:25 +02:00
parent ea319127e4
commit 6e379c6c16
4 changed files with 45 additions and 3 deletions

View file

@ -19,6 +19,10 @@
int wps_version_number = 0x20; int wps_version_number = 0x20;
int wps_testing_dummy_cred = 0; int wps_testing_dummy_cred = 0;
int wps_corrupt_pkhash = 0; int wps_corrupt_pkhash = 0;
int wps_force_auth_types_in_use = 0;
u16 wps_force_auth_types = 0;
int wps_force_encr_types_in_use = 0;
u16 wps_force_encr_types = 0;
#endif /* CONFIG_WPS_TESTING */ #endif /* CONFIG_WPS_TESTING */

View file

@ -1,6 +1,6 @@
/* /*
* Wi-Fi Protected Setup - attribute building * Wi-Fi Protected Setup - attribute building
* Copyright (c) 2008, Jouni Malinen <j@w1.fi> * Copyright (c) 2008-2016, 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.
@ -298,7 +298,16 @@ int wps_build_auth_type_flags(struct wps_data *wps, struct wpabuf *msg)
auth_types &= ~WPS_AUTH_WPA; auth_types &= ~WPS_AUTH_WPA;
auth_types &= ~WPS_AUTH_WPA2; auth_types &= ~WPS_AUTH_WPA2;
auth_types &= ~WPS_AUTH_SHARED; auth_types &= ~WPS_AUTH_SHARED;
wpa_printf(MSG_DEBUG, "WPS: * Authentication Type Flags"); #ifdef CONFIG_WPS_TESTING
if (wps_force_auth_types_in_use) {
wpa_printf(MSG_DEBUG,
"WPS: Testing - replace auth type 0x%x with 0x%x",
auth_types, wps_force_auth_types);
auth_types = wps_force_auth_types;
}
#endif /* CONFIG_WPS_TESTING */
wpa_printf(MSG_DEBUG, "WPS: * Authentication Type Flags (0x%x)",
auth_types);
wpabuf_put_be16(msg, ATTR_AUTH_TYPE_FLAGS); wpabuf_put_be16(msg, ATTR_AUTH_TYPE_FLAGS);
wpabuf_put_be16(msg, 2); wpabuf_put_be16(msg, 2);
wpabuf_put_be16(msg, auth_types); wpabuf_put_be16(msg, auth_types);
@ -310,7 +319,16 @@ int wps_build_encr_type_flags(struct wps_data *wps, struct wpabuf *msg)
{ {
u16 encr_types = WPS_ENCR_TYPES; u16 encr_types = WPS_ENCR_TYPES;
encr_types &= ~WPS_ENCR_WEP; encr_types &= ~WPS_ENCR_WEP;
wpa_printf(MSG_DEBUG, "WPS: * Encryption Type Flags"); #ifdef CONFIG_WPS_TESTING
if (wps_force_encr_types_in_use) {
wpa_printf(MSG_DEBUG,
"WPS: Testing - replace encr type 0x%x with 0x%x",
encr_types, wps_force_encr_types);
encr_types = wps_force_encr_types;
}
#endif /* CONFIG_WPS_TESTING */
wpa_printf(MSG_DEBUG, "WPS: * Encryption Type Flags (0x%x)",
encr_types);
wpabuf_put_be16(msg, ATTR_ENCR_TYPE_FLAGS); wpabuf_put_be16(msg, ATTR_ENCR_TYPE_FLAGS);
wpabuf_put_be16(msg, 2); wpabuf_put_be16(msg, 2);
wpabuf_put_be16(msg, encr_types); wpabuf_put_be16(msg, encr_types);

View file

@ -14,6 +14,10 @@
extern int wps_version_number; extern int wps_version_number;
extern int wps_testing_dummy_cred; extern int wps_testing_dummy_cred;
extern int wps_corrupt_pkhash; extern int wps_corrupt_pkhash;
extern int wps_force_auth_types_in_use;
extern u16 wps_force_auth_types;
extern int wps_force_encr_types_in_use;
extern u16 wps_force_encr_types;
#define WPS_VERSION wps_version_number #define WPS_VERSION wps_version_number
#else /* CONFIG_WPS_TESTING */ #else /* CONFIG_WPS_TESTING */

View file

@ -371,6 +371,20 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
wps_corrupt_pkhash = atoi(value); wps_corrupt_pkhash = atoi(value);
wpa_printf(MSG_DEBUG, "WPS: Testing - wps_corrupt_pkhash=%d", wpa_printf(MSG_DEBUG, "WPS: Testing - wps_corrupt_pkhash=%d",
wps_corrupt_pkhash); wps_corrupt_pkhash);
} else if (os_strcasecmp(cmd, "wps_force_auth_types") == 0) {
if (value[0] == '\0') {
wps_force_auth_types_in_use = 0;
} else {
wps_force_auth_types = strtol(value, NULL, 0);
wps_force_auth_types_in_use = 1;
}
} else if (os_strcasecmp(cmd, "wps_force_encr_types") == 0) {
if (value[0] == '\0') {
wps_force_encr_types_in_use = 0;
} else {
wps_force_encr_types = strtol(value, NULL, 0);
wps_force_encr_types_in_use = 1;
}
#endif /* CONFIG_WPS_TESTING */ #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)
@ -6979,6 +6993,8 @@ static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s)
wps_version_number = 0x20; wps_version_number = 0x20;
wps_testing_dummy_cred = 0; wps_testing_dummy_cred = 0;
wps_corrupt_pkhash = 0; wps_corrupt_pkhash = 0;
wps_force_auth_types_in_use = 0;
wps_force_encr_types_in_use = 0;
#endif /* CONFIG_WPS_TESTING */ #endif /* CONFIG_WPS_TESTING */
#ifdef CONFIG_WPS #ifdef CONFIG_WPS
wpa_s->wps_fragment_size = 0; wpa_s->wps_fragment_size = 0;