Merge branch 'bugfix/wps_config_method_war' into 'release/v3.2'

wpa_supplicant: WPS Inter operatability Fixes

See merge request espressif/esp-idf!8589
This commit is contained in:
Jiang Jiang Jian 2020-05-22 01:07:18 +08:00
commit 2ebd93e1d2
3 changed files with 59 additions and 2 deletions

View file

@ -0,0 +1,21 @@
menu "Supplicant"
config WPA_WPS_WARS
bool "Enable WPS Inter operatability Fixes"
default n
help
Select this option to enable WPS related IOT fixes with different
APs. This option fixes IOT related issues with APs which do not
follow some of the standard of WPS-2.0 specification. However
these do not include any of the security related bypassing, just
simple configuration corrections. Current fixes under this flag:
1. Allow NULL-padded WPS attributes: Some APs keep NULL-padding
at the end of some variable length WPS Attributes. This is not
as par the WPS2.0 specs, but to avoid interop issues, ignore the
padding by reducing the attribute length by 1.
2. Bypass WPS-Config method validation: Some APs set display/pbc
button bit without setting virtual/phycial display/button bit
which will cause M2 validation fail, bypassing WPS-Config method
validation.
endmenu

View file

@ -128,10 +128,44 @@ static int wps_parse_vendor_ext(struct wps_parse_attr *attr, const u8 *pos,
return 0; return 0;
} }
static u16 wps_ignore_null_padding_in_attr(const u8 *pos, u16 type, u16 attr_data_len)
{
u16 len = attr_data_len;
#ifdef CONFIG_WPA_WPS_WARS
if (len == 0)
return 0;
/*
* Some AP's keep NULL-padding at the end of some variable length WPS Attributes.
* This is not as par the WPS2.0 specs, but to avoid interop issues, ignore the
* padding by reducing the attribute length by 1.
*/
switch (type) {
case ATTR_MANUFACTURER:
case ATTR_MODEL_NAME:
case ATTR_MODEL_NUMBER:
case ATTR_SERIAL_NUMBER:
case ATTR_DEV_NAME:
case ATTR_SSID:
case ATTR_NETWORK_KEY:
if (pos[len - 1] == 0)
len--;
break;
default:
break;
}
#endif
return len;
}
static int wps_set_attr(struct wps_parse_attr *attr, u16 type, static int wps_set_attr(struct wps_parse_attr *attr, u16 type,
const u8 *pos, u16 len) const u8 *pos, u16 attr_data_len)
{ {
u16 len;
len = wps_ignore_null_padding_in_attr(pos, type, attr_data_len);
switch (type) { switch (type) {
case ATTR_VERSION: case ATTR_VERSION:
if (len != 1) { if (len != 1) {

View file

@ -95,6 +95,7 @@ static int wps_validate_response_type(const u8 *response_type, int mandatory)
static int valid_config_methods(u16 val, int wps2) static int valid_config_methods(u16 val, int wps2)
{ {
#ifndef CONFIG_WPA_WPS_WARS
if (wps2) { if (wps2) {
if (!(val & 0x6000) && (val & WPS_CONFIG_DISPLAY)) { if (!(val & 0x6000) && (val & WPS_CONFIG_DISPLAY)) {
wpa_printf(MSG_INFO, "WPS-STRICT: Display flag " wpa_printf(MSG_INFO, "WPS-STRICT: Display flag "
@ -108,6 +109,7 @@ static int valid_config_methods(u16 val, int wps2)
} }
} }
#endif
return 1; return 1;
} }