diff options
| author | 2019-05-08 14:39:50 -0700 | |
|---|---|---|
| committer | 2019-05-10 13:44:49 -0700 | |
| commit | 1c93718074d77b64897ab1d865e32fd6714f2d5f (patch) | |
| tree | bc9751e172346ebfdff9a3d5f5dc045d2b530060 | |
| parent | aaaadd579a9b42bd3ca82c13294d7ac4e2a404ea (diff) | |
[WPA3] Fix connectivity issues with PSK-SAE Transtion mode
Fix two reported issues regarding PSK-SAE transition mode:
1. When phone supports SAE, creating a manual saved network with PSK
and manually connecting would cause the phone to connect but Settings
does not display any connected AP. Phone would not autoconnect.
2. When phone doesn't support SAE, phone cannot connect to an AP in
PSK-SAE Transition mode because the framework always targets the highest
security.
Bug: 132278271
Test: Connect to WPA2 network
Test: Connect to WPA3 network (w/capable phone)
Test: Connect to WPA2/3 Transition w/SAE capable phone
Test: Connect to WPA2/3 Transition w/SAE not-capable phone
Change-Id: I2e2db7a7583b0a8fabbe927e6ab1d04e3edbc000
| -rw-r--r-- | packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index baa3544bd3fd..4d332b9a95b4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -179,7 +179,8 @@ public class AccessPoint implements Comparable<AccessPoint> { public static final int SECURITY_OWE = 4; public static final int SECURITY_SAE = 5; public static final int SECURITY_EAP_SUITE_B = 6; - public static final int SECURITY_MAX_VAL = 7; // Has to be the last + public static final int SECURITY_PSK_SAE_TRANSITION = 7; + public static final int SECURITY_MAX_VAL = 8; // Has to be the last private static final int PSK_UNKNOWN = 0; private static final int PSK_WPA = 1; @@ -782,7 +783,8 @@ public class AccessPoint implements Comparable<AccessPoint> { ssid = bestResult.SSID; bssid = bestResult.BSSID; security = getSecurity(bestResult); - if (security == SECURITY_PSK || security == SECURITY_SAE) { + if (security == SECURITY_PSK || security == SECURITY_SAE + || security == SECURITY_PSK_SAE_TRANSITION) { pskType = getPskType(bestResult); } if (security == SECURITY_EAP) { @@ -859,6 +861,7 @@ public class AccessPoint implements Comparable<AccessPoint> { return concise ? context.getString(R.string.wifi_security_short_wep) : context.getString(R.string.wifi_security_wep); case SECURITY_SAE: + case SECURITY_PSK_SAE_TRANSITION: if (pskType == PSK_SAE) { return concise ? context.getString(R.string.wifi_security_short_psk_sae) : context.getString(R.string.wifi_security_psk_sae); @@ -1150,7 +1153,7 @@ public class AccessPoint implements Comparable<AccessPoint> { if (networkId != WifiConfiguration.INVALID_NETWORK_ID) { return networkId == info.getNetworkId(); } else if (config != null) { - return TextUtils.equals(getKey(config), getKey()); + return isKeyEqual(getKey(config)); } else { // Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID. // (Note that we only do this if the WifiConfiguration explicitly equals INVALID). @@ -1223,6 +1226,26 @@ public class AccessPoint implements Comparable<AccessPoint> { mAccessPointListener = listener; } + private static final String sPskSuffix = "," + String.valueOf(SECURITY_PSK); + private static final String sSaeSuffix = "," + String.valueOf(SECURITY_SAE); + private static final String sPskSaeSuffix = "," + String.valueOf(SECURITY_PSK_SAE_TRANSITION); + + private boolean isKeyEqual(String compareTo) { + if (mKey == null) { + return false; + } + + if (compareTo.endsWith(sPskSuffix) || compareTo.endsWith(sSaeSuffix)) { + if (mKey.endsWith(sPskSaeSuffix)) { + // Special handling for PSK-SAE transition mode. If the AP has advertised both, + // we compare the key with both PSK and SAE for a match. + return TextUtils.equals(mKey.substring(0, mKey.lastIndexOf(',')), + compareTo.substring(0, mKey.lastIndexOf(','))); + } + } + return mKey.equals(compareTo); + } + /** * Sets {@link #mScanResults} to the given collection and updates info based on the best RSSI * scan result. @@ -1240,7 +1263,7 @@ public class AccessPoint implements Comparable<AccessPoint> { if (mKey != null && !isPasspoint() && !isOsuProvider()) { for (ScanResult result : scanResults) { String scanResultKey = AccessPoint.getKey(result); - if (mKey != null && !mKey.equals(scanResultKey)) { + if (!isKeyEqual(scanResultKey)) { Log.d(TAG, String.format( "ScanResult %s\nkey of %s did not match current AP key %s", result, scanResultKey, mKey)); @@ -1546,6 +1569,8 @@ public class AccessPoint implements Comparable<AccessPoint> { private static int getSecurity(ScanResult result) { if (result.capabilities.contains("WEP")) { return SECURITY_WEP; + } else if (result.capabilities.contains("PSK+SAE")) { + return SECURITY_PSK_SAE_TRANSITION; } else if (result.capabilities.contains("SAE")) { return SECURITY_SAE; } else if (result.capabilities.contains("PSK")) { @@ -1601,6 +1626,8 @@ public class AccessPoint implements Comparable<AccessPoint> { return "SUITE_B"; } else if (security == SECURITY_OWE) { return "OWE"; + } else if (security == SECURITY_PSK_SAE_TRANSITION) { + return "PSK+SAE"; } return "NONE"; } |