/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net.wifi; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_EAP; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OPEN; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OSEN; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OWE; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_PASSPOINT_R1_R2; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_PASSPOINT_R3; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_PSK; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_SAE; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_WAPI_CERT; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_WAPI_PSK; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_WEP; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; import android.net.MacAddress; import android.net.wifi.WifiConfiguration.GroupCipher; import android.net.wifi.WifiConfiguration.KeyMgmt; import android.net.wifi.WifiConfiguration.NetworkSelectionStatus; import android.net.wifi.WifiConfiguration.PairwiseCipher; import android.net.wifi.WifiConfiguration.Protocol; import android.os.Parcel; import android.util.Pair; import androidx.test.filters.SmallTest; import com.android.modules.utils.build.SdkLevel; import com.android.net.module.util.MacAddressUtils; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.BitSet; import java.util.List; /** * Unit tests for {@link android.net.wifi.WifiConfiguration}. */ @SmallTest public class WifiConfigurationTest { private static final String TEST_PASSPOINT_UNIQUE_ID = "uniqueId"; private static final int TEST_CARRIER_ID = 1234; private static final int TEST_SUB_ID = 3; private static final String TEST_PACKAGE_NAME = "google.com"; @Before public void setUp() { } /** * Check that parcel marshalling/unmarshalling works * * Create and populate a WifiConfiguration. * Marshall and unmashall it, and expect to recover a copy of the original. * Marshall the resulting object, and expect the bytes to match the * first marshall result. */ @Test public void testWifiConfigurationParcel() { String cookie = "C O.o | params.getAllowedKeyManagement().get(akm))); } } private void verifyAllowedProtocols(WifiConfiguration config, int[] aps) { for (int ap: aps) { assertTrue(config.getSecurityParamsList().stream() .anyMatch(params -> params.getAllowedProtocols().get(ap))); } } private void verifyAllowedPairwiseCiphers(WifiConfiguration config, int[] apcs) { for (int apc: apcs) { assertTrue(config.getSecurityParamsList().stream() .anyMatch(params -> params.getAllowedPairwiseCiphers().get(apc))); } } private void verifyAllowedGroupCiphers(WifiConfiguration config, int[] agcs) { for (int agc: agcs) { assertTrue(config.getSecurityParamsList().stream() .anyMatch(params -> params.getAllowedGroupCiphers().get(agc))); } } /** Verify that adding security types works as expected. */ @Test public void testAddSecurityTypes() { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_WAPI_PSK); List paramsList = config.getSecurityParamsList(); assertEquals(3, paramsList.size()); verifyAllowedKeyManagement(config, new int[] { KeyMgmt.WPA_PSK, KeyMgmt.SAE, KeyMgmt.WAPI_PSK}); verifyAllowedProtocols(config, new int[] {Protocol.WPA, Protocol.RSN, Protocol.WAPI}); verifyAllowedPairwiseCiphers(config, new int[] { PairwiseCipher.CCMP, PairwiseCipher.TKIP, PairwiseCipher.GCMP_128, PairwiseCipher.GCMP_256, PairwiseCipher.SMS4}); verifyAllowedGroupCiphers(config, new int[] { GroupCipher.CCMP, GroupCipher.TKIP, GroupCipher.GCMP_128, GroupCipher.GCMP_256, GroupCipher.SMS4}); } /** Check that a personal security type can be added to a personal configuration. */ @Test public void testAddPersonalTypeToPersonalConfiguration() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); } /** Check that an enterprise security type can be added to an enterprise configuration. */ @Test public void testAddEnterpriseTypeToEnterpriseConfiguration() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE); } /** Verify that adding an enterprise type to a personal configuration. */ @Test (expected = IllegalArgumentException.class) public void testAddEnterpriseTypeToPersonalConfig() { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); } /** Verify that adding a personal type to an enterprise configuration. */ @Test (expected = IllegalArgumentException.class) public void testAddPersonalTypeToEnterpriseConfig() { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); } /** Check that an open security cannot be added to a non-open configuration. */ @Test(expected = IllegalArgumentException.class) public void testAddOpenTypeToNonOpenConfiguration() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN); } /** Check that a non-open security cannot be added to an open configuration. */ @Test(expected = IllegalArgumentException.class) public void testAddNonOpenTypeToOpenConfiguration() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); } /** Check that a OSEN security cannot be added as additional type. */ @Test(expected = IllegalArgumentException.class) public void testAddOsenTypeToConfiguration() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_OSEN); } /** Verify that adding duplicate security types raises the exception. */ @Test (expected = IllegalArgumentException.class) public void testAddDuplicateSecurityTypes() { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); } /** Verify that adding duplicate security params raises the exception. */ @Test (expected = IllegalArgumentException.class) public void testAddDuplicateSecurityParams() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); } /** Verify that Suite-B type works as expected. */ @Test public void testAddSuiteBSecurityType() { WifiConfiguration config = new WifiConfiguration(); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE); config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT); assertFalse(config.isSuiteBCipherEcdheRsaEnabled()); config.enableSuiteBCiphers(false, true); assertTrue(config.isSuiteBCipherEcdheRsaEnabled()); } /** Verify that FILS bit can be set correctly. */ @Test public void testFilsKeyMgmt() { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); config.enableFils(false, true); assertFalse(config.isFilsSha256Enabled()); assertTrue(config.isFilsSha384Enabled()); } /** Verify that SAE mode can be configured correctly. */ @Test public void testSaeTypeMethods() { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); config.addSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); SecurityParams saeParams = config.getSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); assertNotNull(saeParams); assertFalse(saeParams.isSaeH2eOnlyMode()); assertFalse(saeParams.isSaePkOnlyMode()); config.enableSaeH2eOnlyMode(true); config.enableSaePkOnlyMode(true); saeParams = config.getSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); assertNotNull(saeParams); assertTrue(saeParams.isSaeH2eOnlyMode()); assertTrue(saeParams.isSaePkOnlyMode()); } /** Verify the legacy configuration conversion */ @Test public void testLegacyConfigurationConversion() { Pair[] keyMgmtSecurityTypePairs = new Pair[] { new Pair<>(KeyMgmt.WAPI_CERT, SECURITY_TYPE_WAPI_CERT), new Pair<>(KeyMgmt.WAPI_PSK, SECURITY_TYPE_WAPI_PSK), new Pair<>(KeyMgmt.SUITE_B_192, SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT), new Pair<>(KeyMgmt.OWE, SECURITY_TYPE_OWE), new Pair<>(KeyMgmt.SAE, SECURITY_TYPE_SAE), new Pair<>(KeyMgmt.OSEN, SECURITY_TYPE_OSEN), new Pair<>(KeyMgmt.WPA2_PSK, SECURITY_TYPE_PSK), new Pair<>(KeyMgmt.WPA_EAP, SECURITY_TYPE_EAP), new Pair<>(KeyMgmt.WPA_PSK, SECURITY_TYPE_PSK), new Pair<>(KeyMgmt.NONE, SECURITY_TYPE_OPEN), }; for (Pair pair: keyMgmtSecurityTypePairs) { WifiConfiguration config = new WifiConfiguration(); config.allowedKeyManagement.set((int) pair.first); config.convertLegacyFieldsToSecurityParamsIfNeeded(); assertNotNull(config.getSecurityParams((int) pair.second)); } // If none of key management is set, it should be open. WifiConfiguration emptyConfig = new WifiConfiguration(); emptyConfig.convertLegacyFieldsToSecurityParamsIfNeeded(); assertNotNull(emptyConfig.getSecurityParams(SECURITY_TYPE_OPEN)); // If EAP key management is set and requirePmf is true, it is WPA3 Enterprise. WifiConfiguration wpa3EnterpriseConfig = new WifiConfiguration(); wpa3EnterpriseConfig.allowedKeyManagement.set(KeyMgmt.WPA_EAP); wpa3EnterpriseConfig.requirePmf = true; wpa3EnterpriseConfig.convertLegacyFieldsToSecurityParamsIfNeeded(); assertNotNull(wpa3EnterpriseConfig.getSecurityParams(SECURITY_TYPE_EAP_WPA3_ENTERPRISE)); // If key management is NONE and wep key is set, it is WEP type. WifiConfiguration wepConfig = new WifiConfiguration(); wepConfig.allowedKeyManagement.set(KeyMgmt.NONE); wepConfig.wepKeys = new String[] {"\"abcdef\""}; wepConfig.convertLegacyFieldsToSecurityParamsIfNeeded(); assertNotNull(wepConfig.getSecurityParams(SECURITY_TYPE_WEP)); } /** Verify the set security params by SecurityParams objects. */ @Test public void testSetBySecurityParamsObject() { int[] securityTypes = new int[] { SECURITY_TYPE_WAPI_CERT, SECURITY_TYPE_WAPI_PSK, SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT, SECURITY_TYPE_OWE, SECURITY_TYPE_SAE, SECURITY_TYPE_OSEN, SECURITY_TYPE_EAP, SECURITY_TYPE_PSK, SECURITY_TYPE_OPEN, SECURITY_TYPE_PASSPOINT_R1_R2, SECURITY_TYPE_PASSPOINT_R3, }; for (int type: securityTypes) { WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(type); assertTrue(config.isSecurityType(type)); assertNotNull(config.getSecurityParams(type)); } } /** Verify the set security params by an allowed key management mask. */ @Test public void testSetSecurityParamsByAllowedKeyManagement() { Pair[] keyMgmtSecurityTypePairs = new Pair[] { new Pair<>(KeyMgmt.WAPI_CERT, SECURITY_TYPE_WAPI_CERT), new Pair<>(KeyMgmt.WAPI_PSK, SECURITY_TYPE_WAPI_PSK), new Pair<>(KeyMgmt.SUITE_B_192, SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT), new Pair<>(KeyMgmt.OWE, SECURITY_TYPE_OWE), new Pair<>(KeyMgmt.SAE, SECURITY_TYPE_SAE), new Pair<>(KeyMgmt.OSEN, SECURITY_TYPE_OSEN), new Pair<>(KeyMgmt.WPA2_PSK, SECURITY_TYPE_PSK), new Pair<>(KeyMgmt.WPA_EAP, SECURITY_TYPE_EAP), new Pair<>(KeyMgmt.WPA_PSK, SECURITY_TYPE_PSK), new Pair<>(KeyMgmt.NONE, SECURITY_TYPE_OPEN), }; for (Pair pair: keyMgmtSecurityTypePairs) { BitSet akm = new BitSet(); akm.set((int) pair.first); WifiConfiguration config = new WifiConfiguration(); config.setSecurityParams(akm); assertNotNull(config.getSecurityParams((int) pair.second)); } } /** Verify the set security params by an invalid allowed key management mask. */ @Test (expected = IllegalArgumentException.class) public void testSetSecurityParamsByInvalidAllowedKeyManagement() { WifiConfiguration config = new WifiConfiguration(); BitSet akm = null; config.setSecurityParams(akm); } /** Verify the set security params by a security params list. */ @Test public void testSetSecurityParamsBySecurityParamsList() { WifiConfiguration config = new WifiConfiguration(); config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); config.addSecurityParams(SECURITY_TYPE_EAP); config.addSecurityParams(SECURITY_TYPE_EAP_WPA3_ENTERPRISE); assertTrue(config.isSecurityType(SECURITY_TYPE_EAP)); assertTrue(config.isSecurityType(SECURITY_TYPE_EAP_WPA3_ENTERPRISE)); assertFalse(config.isSecurityType(SECURITY_TYPE_PSK)); assertFalse(config.isSecurityType(SECURITY_TYPE_SAE)); List list = new ArrayList<>(); list.add(SecurityParams.createSecurityParamsBySecurityType(SECURITY_TYPE_PSK)); list.add(SecurityParams.createSecurityParamsBySecurityType(SECURITY_TYPE_SAE)); config.setSecurityParams(list); assertFalse(config.isSecurityType(SECURITY_TYPE_EAP)); assertFalse(config.isSecurityType(SECURITY_TYPE_EAP_WPA3_ENTERPRISE)); assertTrue(config.isSecurityType(SECURITY_TYPE_PSK)); assertTrue(config.isSecurityType(SECURITY_TYPE_SAE)); } /** Verify the set security params by an empty security params list. */ @Test (expected = IllegalArgumentException.class) public void testSetSecurityParamsByEmptySecurityParamsList() { WifiConfiguration config = new WifiConfiguration(); List list = new ArrayList<>(); config.setSecurityParams(list); } /** Verify the set security params by a null security params list. */ @Test (expected = IllegalArgumentException.class) public void testSetSecurityParamsByNullSecurityParamsList() { WifiConfiguration config = new WifiConfiguration(); List list = null; config.setSecurityParams(list); } }