diff options
author | Ecco Park <eccopark@google.com> | 2018-04-12 18:33:18 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-04-12 18:33:18 +0000 |
commit | 356af575e0317a61da154b97139bdc2cbc1d2c09 (patch) | |
tree | d28708b0a32fc16bd62205c041d4493c54234e76 | |
parent | 03b2a94a34ab39bc7d8a26824808d7b2e99ee650 (diff) | |
parent | 2e889dc0b3f348f45cc5f5006d8784bed30583a9 (diff) |
Merge changes from topic "passpoint_r1" into pi-dev
* changes:
Wifi: Allow Hotspot 2.0 connection without Roaming Consortium ANQP-element
Wifi: Allow Hotspot 2.0 credential without realm matching
9 files changed, 166 insertions, 28 deletions
diff --git a/service/java/com/android/server/wifi/hotspot2/ANQPMatcher.java b/service/java/com/android/server/wifi/hotspot2/ANQPMatcher.java index 649534662..a144874b8 100644 --- a/service/java/com/android/server/wifi/hotspot2/ANQPMatcher.java +++ b/service/java/com/android/server/wifi/hotspot2/ANQPMatcher.java @@ -163,7 +163,7 @@ public class ANQPMatcher { } } - if (realmMatch == AuthMatch.NONE || realmData.getEAPMethods().isEmpty()) { + if (realmData.getEAPMethods().isEmpty()) { return realmMatch; } @@ -179,6 +179,10 @@ public class ANQPMatcher { if (eapMethodMatch == AuthMatch.NONE) { return AuthMatch.NONE; } + + if (realmMatch == AuthMatch.NONE) { + return eapMethodMatch; + } return realmMatch | eapMethodMatch; } diff --git a/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java b/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java index 0c7716286..edee2da1a 100644 --- a/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java +++ b/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java @@ -253,7 +253,7 @@ public class NetworkDetail { mHSRelease = vsa.hsRelease; mAnqpDomainID = vsa.anqpDomainID; mAnqpOICount = roamingConsortium.anqpOICount; - mRoamingConsortiums = roamingConsortium.roamingConsortiums; + mRoamingConsortiums = roamingConsortium.getRoamingConsortiums(); mExtendedCapabilities = extendedCapabilities; mANQPElements = null; //set up channel info diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java index 9423edea9..a0915fa52 100644 --- a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java +++ b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java @@ -411,7 +411,7 @@ public class PasspointManager { for (Map.Entry<String, PasspointProvider> entry : mProviders.entrySet()) { PasspointProvider provider = entry.getValue(); - PasspointMatch matchStatus = provider.match(anqpEntry.getElements()); + PasspointMatch matchStatus = provider.match(anqpEntry.getElements(), roamingConsortium); if (matchStatus == PasspointMatch.HomeProvider || matchStatus == PasspointMatch.RoamingProvider) { allMatches.add(Pair.create(provider, matchStatus)); diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java b/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java index 23ab57ff4..f86a938d7 100644 --- a/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java +++ b/service/java/com/android/server/wifi/hotspot2/PasspointProvider.java @@ -40,6 +40,7 @@ import com.android.server.wifi.hotspot2.anqp.RoamingConsortiumElement; import com.android.server.wifi.hotspot2.anqp.ThreeGPPNetworkElement; import com.android.server.wifi.hotspot2.anqp.eap.AuthParam; import com.android.server.wifi.hotspot2.anqp.eap.NonEAPInnerAuth; +import com.android.server.wifi.util.InformationElementUtil.RoamingConsortium; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -253,10 +254,12 @@ public class PasspointProvider { * Return the matching status with the given AP, based on the ANQP elements from the AP. * * @param anqpElements ANQP elements from the AP + * @param roamingConsortium Roaming Consortium information element from the AP * @return {@link PasspointMatch} */ - public PasspointMatch match(Map<ANQPElementType, ANQPElement> anqpElements) { - PasspointMatch providerMatch = matchProvider(anqpElements); + public PasspointMatch match(Map<ANQPElementType, ANQPElement> anqpElements, + RoamingConsortium roamingConsortium) { + PasspointMatch providerMatch = matchProvider(anqpElements, roamingConsortium); // Perform authentication match against the NAI Realm. int authMatch = ANQPMatcher.matchNAIRealm( @@ -454,9 +457,11 @@ public class PasspointProvider { * Perform a provider match based on the given ANQP elements. * * @param anqpElements List of ANQP elements + * @param roamingConsortium Roaming Consortium information element from the AP * @return {@link PasspointMatch} */ - private PasspointMatch matchProvider(Map<ANQPElementType, ANQPElement> anqpElements) { + private PasspointMatch matchProvider(Map<ANQPElementType, ANQPElement> anqpElements, + RoamingConsortium roamingConsortium) { // Domain name matching. if (ANQPMatcher.matchDomainName( (DomainNameElement) anqpElements.get(ANQPElementType.ANQPDomName), @@ -464,13 +469,26 @@ public class PasspointProvider { return PasspointMatch.HomeProvider; } - // Roaming Consortium OI matching. + // ANQP Roaming Consortium OI matching. + long[] providerOIs = mConfig.getHomeSp().getRoamingConsortiumOis(); if (ANQPMatcher.matchRoamingConsortium( (RoamingConsortiumElement) anqpElements.get(ANQPElementType.ANQPRoamingConsortium), - mConfig.getHomeSp().getRoamingConsortiumOis())) { + providerOIs)) { return PasspointMatch.RoamingProvider; } + long[] roamingConsortiums = roamingConsortium.getRoamingConsortiums(); + // Roaming Consortium OI information element matching. + if (roamingConsortiums != null && providerOIs != null) { + for (long sta_oi: roamingConsortiums) { + for (long ap_oi: providerOIs) { + if (sta_oi == ap_oi) { + return PasspointMatch.RoamingProvider; + } + } + } + } + // 3GPP Network matching. if (ANQPMatcher.matchThreeGPPNetwork( (ThreeGPPNetworkElement) anqpElements.get(ANQPElementType.ANQP3GPPNetwork), diff --git a/service/java/com/android/server/wifi/util/InformationElementUtil.java b/service/java/com/android/server/wifi/util/InformationElementUtil.java index 14912b5f5..2128a410d 100644 --- a/service/java/com/android/server/wifi/util/InformationElementUtil.java +++ b/service/java/com/android/server/wifi/util/InformationElementUtil.java @@ -259,7 +259,12 @@ public class InformationElementUtil { public static class RoamingConsortium { public int anqpOICount = 0; - public long[] roamingConsortiums = null; + + private long[] roamingConsortiums = null; + + public long[] getRoamingConsortiums() { + return roamingConsortiums; + } public void from(InformationElement ie) { if (ie.id != InformationElement.EID_ROAMING_CONSORTIUM) { diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPMatcherTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPMatcherTest.java index a86d6708c..101fe16f6 100644 --- a/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPMatcherTest.java +++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPMatcherTest.java @@ -158,6 +158,30 @@ public class ANQPMatcherTest { } /** + * Verify that method match will be returned when the specified EAP + * method only matches a eap method in the NAI Realm ANQP element. + * + * @throws Exception + */ + @Test + public void matchNAIRealmWithMethodMatch() throws Exception { + // Test data. + String providerRealm = "test.com"; + String anqpRealm = "test2.com"; + int eapMethodID = EAPConstants.EAP_TLS; + + // Setup NAI Realm element. + EAPMethod method = new EAPMethod(eapMethodID, new HashMap<Integer, Set<AuthParam>>()); + NAIRealmData realmData = new NAIRealmData( + Arrays.asList(new String[] {anqpRealm}), Arrays.asList(new EAPMethod[] {method})); + NAIRealmElement element = new NAIRealmElement( + Arrays.asList(new NAIRealmData[] {realmData})); + + assertEquals(AuthMatch.METHOD, + ANQPMatcher.matchNAIRealm(element, providerRealm, eapMethodID, null)); + } + + /** * Verify that a realm and method match will be returned when the specified realm and EAP * method matches a realm in the NAI Realm ANQP element. * diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java index 0e04a05a7..2a76d6a32 100644 --- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java @@ -82,6 +82,7 @@ import com.android.server.wifi.hotspot2.anqp.DomainNameElement; import com.android.server.wifi.hotspot2.anqp.HSOsuProvidersElement; import com.android.server.wifi.hotspot2.anqp.I18Name; import com.android.server.wifi.hotspot2.anqp.OsuProviderInfo; +import com.android.server.wifi.util.InformationElementUtil.RoamingConsortium; import com.android.server.wifi.util.ScanResultUtil; import org.junit.Before; @@ -698,7 +699,8 @@ public class PasspointManagerTest { ANQPData entry = new ANQPData(mClock, null); when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(provider.match(anyMap())).thenReturn(PasspointMatch.HomeProvider); + when(provider.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.HomeProvider); Pair<PasspointProvider, PasspointMatch> result = mManager.matchProvider(createTestScanResult()); assertEquals(PasspointMatch.HomeProvider, result.second); @@ -716,7 +718,8 @@ public class PasspointManagerTest { ANQPData entry = new ANQPData(mClock, null); when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(provider.match(anyMap())).thenReturn(PasspointMatch.RoamingProvider); + when(provider.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.RoamingProvider); Pair<PasspointProvider, PasspointMatch> result = mManager.matchProvider(createTestScanResult()); assertEquals(PasspointMatch.RoamingProvider, result.second); @@ -734,7 +737,8 @@ public class PasspointManagerTest { ANQPData entry = new ANQPData(mClock, null); when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(provider.match(anyMap())).thenReturn(PasspointMatch.None); + when(provider.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.None); assertNull(mManager.matchProvider(createTestScanResult())); } @@ -789,7 +793,8 @@ public class PasspointManagerTest { ANQPData entry = new ANQPData(mClock, null); when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(provider.match(anyMap())).thenReturn(PasspointMatch.HomeProvider); + when(provider.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.HomeProvider); when(provider.getWifiConfig()).thenReturn(new WifiConfiguration()); WifiConfiguration config = mManager.getMatchingWifiConfig(createTestScanResult()); assertEquals(ScanResultUtil.createQuotedSSID(TEST_SSID), config.SSID); @@ -808,7 +813,8 @@ public class PasspointManagerTest { ANQPData entry = new ANQPData(mClock, null); when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(provider.match(anyMap())).thenReturn(PasspointMatch.RoamingProvider); + when(provider.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.RoamingProvider); when(provider.getWifiConfig()).thenReturn(new WifiConfiguration()); WifiConfiguration config = mManager.getMatchingWifiConfig(createTestScanResult()); assertEquals(ScanResultUtil.createQuotedSSID(TEST_SSID), config.SSID); @@ -827,7 +833,8 @@ public class PasspointManagerTest { ANQPData entry = new ANQPData(mClock, null); when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(provider.match(anyMap())).thenReturn(PasspointMatch.None); + when(provider.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.None); assertNull(mManager.getMatchingWifiConfig(createTestScanResult())); verify(provider, never()).getWifiConfig(); } @@ -897,9 +904,12 @@ public class PasspointManagerTest { when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(entry); - when(providerHome.match(anyMap())).thenReturn(PasspointMatch.HomeProvider); - when(providerRoaming.match(anyMap())).thenReturn(PasspointMatch.RoamingProvider); - when(providerNone.match(anyMap())).thenReturn(PasspointMatch.None); + when(providerHome.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.HomeProvider); + when(providerRoaming.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.RoamingProvider); + when(providerNone.match(anyMap(), any(RoamingConsortium.class))) + .thenReturn(PasspointMatch.None); when(providerHome.getWifiConfig()).thenReturn(new WifiConfiguration()); when(providerRoaming.getWifiConfig()).thenReturn(new WifiConfiguration()); diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java index 53feae67a..0055fbaaa 100644 --- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java +++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointProviderTest.java @@ -48,6 +48,7 @@ import com.android.server.wifi.hotspot2.anqp.eap.AuthParam; import com.android.server.wifi.hotspot2.anqp.eap.EAPMethod; import com.android.server.wifi.hotspot2.anqp.eap.NonEAPInnerAuth; +import com.android.server.wifi.util.InformationElementUtil.RoamingConsortium; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -77,12 +78,14 @@ public class PasspointProviderTest { @Mock WifiKeyStore mKeyStore; @Mock SIMAccessor mSimAccessor; + @Mock RoamingConsortium mRoamingConsortium; PasspointProvider mProvider; /** Sets up test. */ @Before public void setUp() throws Exception { initMocks(this); + when(mRoamingConsortium.getRoamingConsortiums()).thenReturn(null); } /** @@ -362,7 +365,8 @@ public class PasspointProviderTest { anqpElementMap.put(ANQPElementType.ANQPDomName, createDomainNameElement(new String[] {testDomain})); - assertEquals(PasspointMatch.HomeProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.HomeProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -397,7 +401,8 @@ public class PasspointProviderTest { createNAIRealmElement(testRealm, EAPConstants.EAP_TTLS, new NonEAPInnerAuth(NonEAPInnerAuth.AUTH_TYPE_MSCHAPV2))); - assertEquals(PasspointMatch.HomeProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.HomeProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -432,7 +437,7 @@ public class PasspointProviderTest { anqpElementMap.put(ANQPElementType.ANQPNAIRealm, createNAIRealmElement(testRealm, EAPConstants.EAP_TLS, null)); - assertEquals(PasspointMatch.None, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.None, mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -462,7 +467,8 @@ public class PasspointProviderTest { anqpElementMap.put(ANQPElementType.ANQPDomName, createDomainNameElement(new String[] {"wlan.mnc456.mcc123.3gppnetwork.org"})); - assertEquals(PasspointMatch.HomeProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.HomeProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -493,7 +499,75 @@ public class PasspointProviderTest { anqpElementMap.put(ANQPElementType.ANQPRoamingConsortium, createRoamingConsortiumElement(anqpRCOIs)); - assertEquals(PasspointMatch.RoamingProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.RoamingProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); + } + + /** + * Verify that a provider is a roaming provider when a roaming consortium OI matches an OI + * in the roaming consortium information element. + * + * @throws Exception + */ + @Test + public void matchRoamingConsortiumIe() throws Exception { + long[] providerRCOIs = new long[] {0x1234L, 0x2345L}; + long[] ieRCOIs = new long[] {0x1234L, 0x2133L}; + + // Setup test provider. + PasspointConfiguration config = new PasspointConfiguration(); + HomeSp homeSp = new HomeSp(); + homeSp.setRoamingConsortiumOis(providerRCOIs); + config.setHomeSp(homeSp); + Credential credential = new Credential(); + Credential.UserCredential userCredential = new Credential.UserCredential(); + userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2); + credential.setUserCredential(userCredential); + config.setCredential(credential); + mProvider = createProvider(config); + + // Setup Roaming Consortium ANQP element. + Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>(); + + // Setup Roaming Consortium Information element. + when(mRoamingConsortium.getRoamingConsortiums()).thenReturn(ieRCOIs); + + assertEquals(PasspointMatch.RoamingProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); + } + + /** + * Verify that none of matched providers are not found when a roaming consortium OI doesn't + * matches an OI in the roaming consortium information element and + * none of NAI realms match each other. + * + * @throws Exception + */ + @Test + public void misMatchForRoamingConsortiumIeAndNAIRealm() throws Exception { + long[] providerRCOIs = new long[] {0x1234L, 0x2345L}; + long[] ieRCOIs = new long[] {0x2255L, 0x2133L}; + + // Setup test provider. + PasspointConfiguration config = new PasspointConfiguration(); + HomeSp homeSp = new HomeSp(); + homeSp.setRoamingConsortiumOis(providerRCOIs); + config.setHomeSp(homeSp); + Credential credential = new Credential(); + Credential.UserCredential userCredential = new Credential.UserCredential(); + userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2); + credential.setUserCredential(userCredential); + config.setCredential(credential); + mProvider = createProvider(config); + + // Setup Roaming Consortium ANQP element. + Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>(); + + // Setup Roaming Consortium Information element. + when(mRoamingConsortium.getRoamingConsortiums()).thenReturn(ieRCOIs); + + assertEquals(PasspointMatch.None, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -523,7 +597,8 @@ public class PasspointProviderTest { anqpElementMap.put(ANQPElementType.ANQP3GPPNetwork, createThreeGPPNetworkElement(new String[] {"123456"})); - assertEquals(PasspointMatch.RoamingProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.RoamingProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -553,7 +628,8 @@ public class PasspointProviderTest { createNAIRealmElement(testRealm, EAPConstants.EAP_TTLS, new NonEAPInnerAuth(NonEAPInnerAuth.AUTH_TYPE_MSCHAPV2))); - assertEquals(PasspointMatch.RoamingProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.RoamingProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** @@ -595,7 +671,8 @@ public class PasspointProviderTest { anqpElementMap.put(ANQPElementType.ANQP3GPPNetwork, createThreeGPPNetworkElement(new String[] {"123456"})); - assertEquals(PasspointMatch.HomeProvider, mProvider.match(anqpElementMap)); + assertEquals(PasspointMatch.HomeProvider, + mProvider.match(anqpElementMap, mRoamingConsortium)); } /** diff --git a/tests/wifitests/src/com/android/server/wifi/util/InformationElementUtilTest.java b/tests/wifitests/src/com/android/server/wifi/util/InformationElementUtilTest.java index 8c4b2ff58..a1b37ff7b 100644 --- a/tests/wifitests/src/com/android/server/wifi/util/InformationElementUtilTest.java +++ b/tests/wifitests/src/com/android/server/wifi/util/InformationElementUtilTest.java @@ -692,8 +692,8 @@ public class InformationElementUtilTest { InformationElementUtil.RoamingConsortium roamingConsortium = InformationElementUtil.getRoamingConsortiumIE(new InformationElement[] {ie}); assertEquals(1, roamingConsortium.anqpOICount); - assertEquals(1, roamingConsortium.roamingConsortiums.length); - assertEquals(0x112233, roamingConsortium.roamingConsortiums[0]); + assertEquals(1, roamingConsortium.getRoamingConsortiums().length); + assertEquals(0x112233, roamingConsortium.getRoamingConsortiums()[0]); } /** |