WPS: Workaround mixed-mode WPA+WPA2 auth type in credentials
authorJouni Malinen <j@w1.fi>
Sat, 15 Aug 2009 17:40:45 +0000 (20:40 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 15 Aug 2009 17:40:45 +0000 (20:40 +0300)
An SMC router was reported to use 0x22 (WPAPSK + WPA2PSK) in the
authentication type of the provisioned credential and wpa_supplicant
rejected this as invalid. Work around this by replacing WPAPSK + WPA2PSK
with WPA2PSK.

wpa_supplicant/wps_supplicant.c

index a4efc6e..6fb1aa3 100644 (file)
@@ -188,6 +188,7 @@ static int wpa_supplicant_wps_cred(void *ctx,
        struct wpa_supplicant *wpa_s = ctx;
        struct wpa_ssid *ssid = wpa_s->current_ssid;
        u8 key_idx = 0;
+       u16 auth_type;
 
        if ((wpa_s->conf->wps_cred_processing == 1 ||
             wpa_s->conf->wps_cred_processing == 2) && cred->cred_attr) {
@@ -220,13 +221,20 @@ static int wpa_supplicant_wps_cred(void *ctx,
        wpa_printf(MSG_DEBUG, "WPS: MAC Address " MACSTR,
                   MAC2STR(cred->mac_addr));
 
-       if (cred->auth_type != WPS_AUTH_OPEN &&
-           cred->auth_type != WPS_AUTH_SHARED &&
-           cred->auth_type != WPS_AUTH_WPAPSK &&
-           cred->auth_type != WPS_AUTH_WPA2PSK) {
+       auth_type = cred->auth_type;
+       if (auth_type == (WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK)) {
+               wpa_printf(MSG_DEBUG, "WPS: Workaround - convert mixed-mode "
+                          "auth_type into WPA2PSK");
+               auth_type = WPS_AUTH_WPA2PSK;
+       }
+
+       if (auth_type != WPS_AUTH_OPEN &&
+           auth_type != WPS_AUTH_SHARED &&
+           auth_type != WPS_AUTH_WPAPSK &&
+           auth_type != WPS_AUTH_WPA2PSK) {
                wpa_printf(MSG_DEBUG, "WPS: Ignored credentials for "
-                          "unsupported authentication type %d",
-                          cred->auth_type);
+                          "unsupported authentication type 0x%x",
+                          auth_type);
                return 0;
        }
 
@@ -300,7 +308,7 @@ static int wpa_supplicant_wps_cred(void *ctx,
                break;
        }
 
-       switch (cred->auth_type) {
+       switch (auth_type) {
        case WPS_AUTH_OPEN:
                ssid->auth_alg = WPA_AUTH_ALG_OPEN;
                ssid->key_mgmt = WPA_KEY_MGMT_NONE;