• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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