1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.ipsec.ike.cts; 18 19 import static android.ipsec.ike.cts.IkeSessionTestBase.EXPECTED_DNS_SERVERS_ONE; 20 import static android.ipsec.ike.cts.IkeSessionTestBase.EXPECTED_DNS_SERVERS_TWO; 21 import static android.ipsec.ike.cts.IkeSessionTestBase.EXPECTED_INTERNAL_ADDR; 22 import static android.ipsec.ike.cts.IkeSessionTestBase.EXPECTED_INTERNAL_ADDR_V6; 23 import static android.ipsec.ike.cts.IkeSessionTestBase.EXPECTED_INTERNAL_LINK_ADDR; 24 import static android.ipsec.ike.cts.IkeSessionTestBase.EXPECTED_INTERNAL_LINK_ADDR_V6; 25 import static android.net.ipsec.ike.IkeSessionConfiguration.EXTENSION_TYPE_FRAGMENTATION; 26 import static android.net.ipsec.ike.IkeSessionConfiguration.EXTENSION_TYPE_MOBIKE; 27 28 import static org.junit.Assert.assertArrayEquals; 29 import static org.junit.Assert.assertEquals; 30 import static org.junit.Assert.assertFalse; 31 import static org.junit.Assert.assertTrue; 32 33 import android.net.InetAddresses; 34 import android.net.IpPrefix; 35 import android.net.Network; 36 import android.net.eap.EapAkaInfo; 37 import android.net.ipsec.ike.ChildSessionConfiguration; 38 import android.net.ipsec.ike.IkeSessionConfiguration; 39 import android.net.ipsec.ike.IkeSessionConnectionInfo; 40 import android.net.ipsec.ike.IkeTrafficSelector; 41 42 import androidx.test.ext.junit.runners.AndroidJUnit4; 43 44 import org.junit.Test; 45 import org.junit.runner.RunWith; 46 47 import java.net.InetAddress; 48 import java.nio.charset.StandardCharsets; 49 import java.util.Arrays; 50 import java.util.List; 51 52 @RunWith(AndroidJUnit4.class) 53 public class SessionConfigurationTest extends IkeTestNetworkBase { 54 private static final byte[] REMOTE_VENDOR_ID_1 = "REMOTE_VENDOR_ID_1".getBytes(); 55 private static final byte[] REMOTE_VENDOR_ID_2 = "REMOTE_VENDOR_ID_2".getBytes(); 56 private static final String REMOTE_APP_VERSION = "REMOTE_APP_VERSION"; 57 private static final String REMOTE_APP_VERSION_NONE = ""; 58 59 private static final List<IkeTrafficSelector> IN_TS_LIST = 60 Arrays.asList(INBOUND_V4_TS, INBOUND_V6_TS); 61 private static final List<IkeTrafficSelector> OUT_TS_LIST = 62 Arrays.asList(OUTBOUND_V4_TS, OUTBOUND_V6_TS); 63 64 private static final IpPrefix SUBNET_V4 = new IpPrefix(EXPECTED_INTERNAL_ADDR, 24); 65 private static final IpPrefix SUBNET_V6 = new IpPrefix(EXPECTED_INTERNAL_ADDR_V6, 64); 66 private static final InetAddress DHCP_SERVER = 67 InetAddresses.parseNumericAddress("198.51.100.111"); 68 private static final byte[] REAUTH_ID = 69 "testFastReauth@android.net".getBytes(StandardCharsets.UTF_8); 70 71 private interface IkeSessionConnectionInfoTestRunner { run(IkeSessionConnectionInfo connectionInfo, Network network)72 void run(IkeSessionConnectionInfo connectionInfo, Network network) throws Exception; 73 } 74 runTestWithIkeSessionConnectionInfo(IkeSessionConnectionInfoTestRunner testRunner)75 private void runTestWithIkeSessionConnectionInfo(IkeSessionConnectionInfoTestRunner testRunner) 76 throws Exception { 77 try (TunNetworkContext tunNwContext = new TunNetworkContext(IPV6_ADDRESS_LOCAL)) { 78 final IkeSessionConnectionInfo connectionInfo = 79 new IkeSessionConnectionInfo( 80 IPV6_ADDRESS_LOCAL, IPV6_ADDRESS_REMOTE, tunNwContext.tunNetwork); 81 testRunner.run(connectionInfo, tunNwContext.tunNetwork); 82 } 83 } 84 85 @Test testIkeConnectionInfo()86 public void testIkeConnectionInfo() throws Exception { 87 runTestWithIkeSessionConnectionInfo( 88 (connectionInfo, network) -> { 89 assertEquals(IPV6_ADDRESS_LOCAL, connectionInfo.getLocalAddress()); 90 assertEquals(IPV6_ADDRESS_REMOTE, connectionInfo.getRemoteAddress()); 91 assertEquals(network, connectionInfo.getNetwork()); 92 }); 93 } 94 addToIkeSessionConfigBuilder(IkeSessionConfiguration.Builder builder)95 private void addToIkeSessionConfigBuilder(IkeSessionConfiguration.Builder builder) { 96 builder.addIkeExtension(EXTENSION_TYPE_FRAGMENTATION) 97 .addIkeExtension(EXTENSION_TYPE_MOBIKE) 98 .addPcscfServer(PCSCF_IPV4_ADDRESS_1) 99 .addPcscfServer(PCSCF_IPV6_ADDRESS_1) 100 .addRemoteVendorId(REMOTE_VENDOR_ID_1) 101 .addRemoteVendorId(REMOTE_VENDOR_ID_2) 102 .setRemoteApplicationVersion(REMOTE_APP_VERSION) 103 .setEapInfo(new EapAkaInfo.Builder().setReauthId(REAUTH_ID).build()); 104 } 105 106 @Test testIkeSessionConfiguration()107 public void testIkeSessionConfiguration() throws Exception { 108 runTestWithIkeSessionConnectionInfo( 109 (connectionInfo, network) -> { 110 final IkeSessionConfiguration.Builder builder = 111 new IkeSessionConfiguration.Builder(connectionInfo); 112 addToIkeSessionConfigBuilder(builder); 113 final IkeSessionConfiguration config = builder.build(); 114 115 assertEquals(connectionInfo, config.getIkeSessionConnectionInfo()); 116 assertTrue(config.isIkeExtensionEnabled(EXTENSION_TYPE_FRAGMENTATION)); 117 assertTrue(config.isIkeExtensionEnabled(EXTENSION_TYPE_MOBIKE)); 118 assertEquals( 119 Arrays.asList(PCSCF_IPV4_ADDRESS_1, PCSCF_IPV6_ADDRESS_1), 120 config.getPcscfServers()); 121 assertEquals( 122 Arrays.asList(REMOTE_VENDOR_ID_1, REMOTE_VENDOR_ID_2), 123 config.getRemoteVendorIds()); 124 assertEquals(REMOTE_APP_VERSION, config.getRemoteApplicationVersion()); 125 assertArrayEquals(REAUTH_ID, ((EapAkaInfo) config.getEapInfo()).getReauthId()); 126 }); 127 } 128 129 @Test testIkeSessionConfigurationClearMethods()130 public void testIkeSessionConfigurationClearMethods() throws Exception { 131 runTestWithIkeSessionConnectionInfo( 132 (connectionInfo, network) -> { 133 final IkeSessionConfiguration.Builder builder = 134 new IkeSessionConfiguration.Builder(connectionInfo); 135 addToIkeSessionConfigBuilder(builder); 136 final IkeSessionConfiguration config = 137 builder.clearIkeExtensions() 138 .clearPcscfServers() 139 .clearRemoteVendorIds() 140 .clearRemoteApplicationVersion() 141 .build(); 142 143 assertEquals(connectionInfo, config.getIkeSessionConnectionInfo()); 144 assertFalse(config.isIkeExtensionEnabled(EXTENSION_TYPE_FRAGMENTATION)); 145 assertFalse(config.isIkeExtensionEnabled(EXTENSION_TYPE_MOBIKE)); 146 assertTrue(config.getPcscfServers().isEmpty()); 147 assertTrue(config.getRemoteVendorIds().isEmpty()); 148 assertEquals(REMOTE_APP_VERSION_NONE, config.getRemoteApplicationVersion()); 149 }); 150 } 151 createChildSessionConfigBuilder()152 private ChildSessionConfiguration.Builder createChildSessionConfigBuilder() { 153 return new ChildSessionConfiguration.Builder(IN_TS_LIST, OUT_TS_LIST) 154 .addInternalAddress(EXPECTED_INTERNAL_LINK_ADDR) 155 .addInternalAddress(EXPECTED_INTERNAL_LINK_ADDR_V6) 156 .addInternalSubnet(SUBNET_V4) 157 .addInternalSubnet(SUBNET_V6) 158 .addInternalDnsServer(EXPECTED_DNS_SERVERS_ONE) 159 .addInternalDnsServer(EXPECTED_DNS_SERVERS_TWO) 160 .addInternalDhcpServer(DHCP_SERVER); 161 } 162 163 @Test testChildSessionConfiguration()164 public void testChildSessionConfiguration() throws Exception { 165 final ChildSessionConfiguration config = createChildSessionConfigBuilder().build(); 166 167 assertEquals(IN_TS_LIST, config.getInboundTrafficSelectors()); 168 assertEquals(OUT_TS_LIST, config.getOutboundTrafficSelectors()); 169 assertEquals( 170 Arrays.asList(EXPECTED_INTERNAL_LINK_ADDR, EXPECTED_INTERNAL_LINK_ADDR_V6), 171 config.getInternalAddresses()); 172 assertEquals(Arrays.asList(SUBNET_V4, SUBNET_V6), config.getInternalSubnets()); 173 assertEquals( 174 Arrays.asList(EXPECTED_DNS_SERVERS_ONE, EXPECTED_DNS_SERVERS_TWO), 175 config.getInternalDnsServers()); 176 assertEquals(Arrays.asList(DHCP_SERVER), config.getInternalDhcpServers()); 177 } 178 179 @Test testChildSessionConfigurationClearMethods()180 public void testChildSessionConfigurationClearMethods() throws Exception { 181 final ChildSessionConfiguration config = 182 createChildSessionConfigBuilder() 183 .clearInternalAddresses() 184 .clearInternalDhcpServers() 185 .clearInternalDnsServers() 186 .clearInternalSubnets() 187 .build(); 188 189 assertEquals(IN_TS_LIST, config.getInboundTrafficSelectors()); 190 assertEquals(OUT_TS_LIST, config.getOutboundTrafficSelectors()); 191 assertTrue(config.getInternalAddresses().isEmpty()); 192 assertTrue(config.getInternalDhcpServers().isEmpty()); 193 assertTrue(config.getInternalDnsServers().isEmpty()); 194 assertTrue(config.getInternalSubnets().isEmpty()); 195 } 196 } 197