Merge changes from topics "encrypted-tunnel-interface", "iketunnelparams", "vcn-encrypted-tunnel" am: bc545c8a8a am: 7a52d5a3eb

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1652997

Change-Id: I3ad0d93a976c7f4dc875e21f337405401164f1c5
This commit is contained in:
Yan Yan
2021-04-22 09:43:16 +00:00
committed by Automerger Merge Worker
9 changed files with 75 additions and 441 deletions

View File

@@ -25701,15 +25701,6 @@ package android.net.vcn {
method @NonNull public android.net.vcn.VcnConfig build();
}
public abstract class VcnControlPlaneConfig {
}
public final class VcnControlPlaneIkeConfig extends android.net.vcn.VcnControlPlaneConfig {
ctor public VcnControlPlaneIkeConfig(@NonNull android.net.ipsec.ike.IkeSessionParams, @NonNull android.net.ipsec.ike.TunnelModeChildSessionParams);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams getChildSessionParams();
method @NonNull public android.net.ipsec.ike.IkeSessionParams getIkeSessionParams();
}
public final class VcnGatewayConnectionConfig {
method @NonNull public int[] getExposedCapabilities();
method @NonNull public String getGatewayConnectionName();
@@ -25718,7 +25709,7 @@ package android.net.vcn {
}
public static final class VcnGatewayConnectionConfig.Builder {
ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.vcn.VcnControlPlaneConfig);
ctor public VcnGatewayConnectionConfig.Builder(@NonNull String, @NonNull android.net.TunnelConnectionParams);
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder addExposedCapability(int);
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig build();
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int);

View File

@@ -1,112 +0,0 @@
/*
* Copyright (C) 2021 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.vcn;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.os.PersistableBundle;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
/**
* This class represents a control plane configuration for a Virtual Carrier Network connection.
*
* <p>Each {@link VcnGatewayConnectionConfig} must have a {@link VcnControlPlaneConfig}, containing
* all connection, authentication and authorization parameters required to establish a Gateway
* Connection with a remote endpoint.
*
* <p>A {@link VcnControlPlaneConfig} object can be shared by multiple {@link
* VcnGatewayConnectionConfig}(s) if they will used for connecting with the same remote endpoint.
*
* @see VcnManager
* @see VcnGatewayConnectionConfig
*/
public abstract class VcnControlPlaneConfig {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef({CONFIG_TYPE_IKE})
public @interface ConfigType {}
/** @hide */
public static final int CONFIG_TYPE_IKE = 1;
private static final String CONFIG_TYPE_KEY = "mConfigType";
@ConfigType private final int mConfigType;
/**
* Package private constructor.
*
* @hide
*/
VcnControlPlaneConfig(int configType) {
mConfigType = configType;
}
/**
* Constructs a VcnControlPlaneConfig object by deserializing a PersistableBundle.
*
* @param in the {@link PersistableBundle} containing an {@link VcnControlPlaneConfig} object
* @hide
*/
public static VcnControlPlaneConfig fromPersistableBundle(@NonNull PersistableBundle in) {
Objects.requireNonNull(in, "PersistableBundle was null");
int configType = in.getInt(CONFIG_TYPE_KEY);
switch (configType) {
case CONFIG_TYPE_IKE:
return new VcnControlPlaneIkeConfig(in);
default:
throw new IllegalStateException("Unrecognized configType: " + configType);
}
}
/**
* Converts this VcnControlPlaneConfig to a PersistableBundle.
*
* @hide
*/
@NonNull
public PersistableBundle toPersistableBundle() {
final PersistableBundle result = new PersistableBundle();
result.putInt(CONFIG_TYPE_KEY, mConfigType);
return result;
}
/** @hide */
@Override
public int hashCode() {
return Objects.hash(mConfigType);
}
/** @hide */
@Override
public boolean equals(Object o) {
if (!(o instanceof VcnControlPlaneConfig)) {
return false;
}
return mConfigType == ((VcnControlPlaneConfig) o).mConfigType;
}
/**
* Returns a deep copy of this object.
*
* @hide
*/
public abstract VcnControlPlaneConfig copy();
}

View File

@@ -1,158 +0,0 @@
/*
* Copyright (C) 2021 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.vcn;
import static android.net.vcn.VcnControlPlaneConfig.CONFIG_TYPE_IKE;
import android.annotation.NonNull;
import android.net.ipsec.ike.IkeSessionParams;
import android.net.ipsec.ike.TunnelModeChildSessionParams;
import android.net.vcn.persistablebundleutils.IkeSessionParamsUtils;
import android.net.vcn.persistablebundleutils.TunnelModeChildSessionParamsUtils;
import android.os.PersistableBundle;
import android.util.ArraySet;
import android.util.Log;
import java.util.Objects;
/**
* This class is an IKEv2 control plane configuration for a Virtual Carrier Network connection.
*
* <p>This class is an extension of the {@link VcnControlPlaneConfig}, containing IKEv2-specific
* configuration, authentication and authorization parameters.
*
* @see VcnControlPlaneConfig
*/
public final class VcnControlPlaneIkeConfig extends VcnControlPlaneConfig {
private static final String TAG = VcnControlPlaneIkeConfig.class.getSimpleName();
private static final String IKE_PARAMS_KEY = "mIkeParams";
@NonNull private final IkeSessionParams mIkeParams;
private static final String CHILD_PARAMS_KEY = "mChildParams";
@NonNull private final TunnelModeChildSessionParams mChildParams;
private static final ArraySet<String> BUNDLE_KEY_SET = new ArraySet<>();
{
BUNDLE_KEY_SET.add(IKE_PARAMS_KEY);
BUNDLE_KEY_SET.add(CHILD_PARAMS_KEY);
}
/**
* Constructs a VcnControlPlaneIkeConfig object.
*
* @param ikeParams the IKE Session negotiation parameters
* @param childParams the tunnel mode Child Session negotiation parameters
*/
public VcnControlPlaneIkeConfig(
@NonNull IkeSessionParams ikeParams,
@NonNull TunnelModeChildSessionParams childParams) {
super(CONFIG_TYPE_IKE);
mIkeParams = ikeParams;
mChildParams = childParams;
validate();
}
/**
* Constructs a VcnControlPlaneIkeConfig object by deserializing a PersistableBundle.
*
* @param in the {@link PersistableBundle} containing an {@link VcnControlPlaneIkeConfig} object
* @hide
*/
public VcnControlPlaneIkeConfig(@NonNull PersistableBundle in) {
super(CONFIG_TYPE_IKE);
final PersistableBundle ikeParamsBundle = in.getPersistableBundle(IKE_PARAMS_KEY);
final PersistableBundle childParamsBundle = in.getPersistableBundle(CHILD_PARAMS_KEY);
Objects.requireNonNull(ikeParamsBundle, "IKE Session Params was null");
Objects.requireNonNull(childParamsBundle, "Child Session Params was null");
mIkeParams = IkeSessionParamsUtils.fromPersistableBundle(ikeParamsBundle);
mChildParams = TunnelModeChildSessionParamsUtils.fromPersistableBundle(childParamsBundle);
for (String key : in.keySet()) {
if (!BUNDLE_KEY_SET.contains(key)) {
Log.w(TAG, "Found an unexpected key in the PersistableBundle: " + key);
}
}
validate();
}
private void validate() {
Objects.requireNonNull(mIkeParams, "mIkeParams was null");
Objects.requireNonNull(mChildParams, "mChildParams was null");
}
/**
* Converts this VcnControlPlaneConfig to a PersistableBundle.
*
* @hide
*/
@Override
@NonNull
public PersistableBundle toPersistableBundle() {
final PersistableBundle result = super.toPersistableBundle();
result.putPersistableBundle(
IKE_PARAMS_KEY, IkeSessionParamsUtils.toPersistableBundle(mIkeParams));
result.putPersistableBundle(
CHILD_PARAMS_KEY,
TunnelModeChildSessionParamsUtils.toPersistableBundle(mChildParams));
return result;
}
/** Retrieves the IKE Session configuration. */
@NonNull
public IkeSessionParams getIkeSessionParams() {
return mIkeParams;
}
/** Retrieves the tunnel mode Child Session configuration. */
@NonNull
public TunnelModeChildSessionParams getChildSessionParams() {
return mChildParams;
}
/** @hide */
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), mIkeParams, mChildParams);
}
/** @hide */
@Override
public boolean equals(Object o) {
if (!(o instanceof VcnControlPlaneIkeConfig)) {
return false;
}
VcnControlPlaneIkeConfig other = (VcnControlPlaneIkeConfig) o;
return super.equals(o)
&& Objects.equals(mIkeParams, other.mIkeParams)
&& Objects.equals(mChildParams, other.mChildParams);
}
/** @hide */
@Override
public VcnControlPlaneConfig copy() {
return new VcnControlPlaneIkeConfig(
new IkeSessionParams.Builder(mIkeParams).build(),
new TunnelModeChildSessionParams.Builder(mChildParams).build());
}
}

View File

@@ -24,6 +24,8 @@ import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.TunnelConnectionParams;
import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtils;
import android.os.PersistableBundle;
import android.util.ArraySet;
@@ -151,8 +153,8 @@ public final class VcnGatewayConnectionConfig {
private static final String GATEWAY_CONNECTION_NAME_KEY = "mGatewayConnectionName";
@NonNull private final String mGatewayConnectionName;
private static final String CTRL_PLANE_CONFIG_KEY = "mCtrlPlaneConfig";
@NonNull private VcnControlPlaneConfig mCtrlPlaneConfig;
private static final String TUNNEL_CONNECTION_PARAMS_KEY = "mTunnelConnectionParams";
@NonNull private TunnelConnectionParams mTunnelConnectionParams;
private static final String EXPOSED_CAPABILITIES_KEY = "mExposedCapabilities";
@NonNull private final SortedSet<Integer> mExposedCapabilities;
@@ -169,13 +171,13 @@ public final class VcnGatewayConnectionConfig {
/** Builds a VcnGatewayConnectionConfig with the specified parameters. */
private VcnGatewayConnectionConfig(
@NonNull String gatewayConnectionName,
@NonNull VcnControlPlaneConfig ctrlPlaneConfig,
@NonNull TunnelConnectionParams tunnelConnectionParams,
@NonNull Set<Integer> exposedCapabilities,
@NonNull Set<Integer> underlyingCapabilities,
@NonNull long[] retryIntervalsMs,
@IntRange(from = MIN_MTU_V6) int maxMtu) {
mGatewayConnectionName = gatewayConnectionName;
mCtrlPlaneConfig = ctrlPlaneConfig;
mTunnelConnectionParams = tunnelConnectionParams;
mExposedCapabilities = new TreeSet(exposedCapabilities);
mUnderlyingCapabilities = new TreeSet(underlyingCapabilities);
mRetryIntervalsMs = retryIntervalsMs;
@@ -187,9 +189,10 @@ public final class VcnGatewayConnectionConfig {
/** @hide */
@VisibleForTesting(visibility = Visibility.PRIVATE)
public VcnGatewayConnectionConfig(@NonNull PersistableBundle in) {
final PersistableBundle ctrlPlaneConfigBundle =
in.getPersistableBundle(CTRL_PLANE_CONFIG_KEY);
Objects.requireNonNull(ctrlPlaneConfigBundle, "ctrlPlaneConfigBundle was null");
final PersistableBundle tunnelConnectionParamsBundle =
in.getPersistableBundle(TUNNEL_CONNECTION_PARAMS_KEY);
Objects.requireNonNull(
tunnelConnectionParamsBundle, "tunnelConnectionParamsBundle was null");
final PersistableBundle exposedCapsBundle =
in.getPersistableBundle(EXPOSED_CAPABILITIES_KEY);
@@ -197,7 +200,8 @@ public final class VcnGatewayConnectionConfig {
in.getPersistableBundle(UNDERLYING_CAPABILITIES_KEY);
mGatewayConnectionName = in.getString(GATEWAY_CONNECTION_NAME_KEY);
mCtrlPlaneConfig = VcnControlPlaneConfig.fromPersistableBundle(ctrlPlaneConfigBundle);
mTunnelConnectionParams =
TunnelConnectionParamsUtils.fromPersistableBundle(tunnelConnectionParamsBundle);
mExposedCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
mUnderlyingCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
@@ -210,7 +214,7 @@ public final class VcnGatewayConnectionConfig {
private void validate() {
Objects.requireNonNull(mGatewayConnectionName, "gatewayConnectionName was null");
Objects.requireNonNull(mCtrlPlaneConfig, "control plane config was null");
Objects.requireNonNull(mTunnelConnectionParams, "tunnel connection parameter was null");
Preconditions.checkArgument(
mExposedCapabilities != null && !mExposedCapabilities.isEmpty(),
@@ -262,13 +266,13 @@ public final class VcnGatewayConnectionConfig {
}
/**
* Returns control plane configuration.
* Returns tunnel connection parameters.
*
* @hide
*/
@NonNull
public VcnControlPlaneConfig getControlPlaneConfig() {
return mCtrlPlaneConfig.copy();
public TunnelConnectionParams getTunnelConnectionParams() {
return mTunnelConnectionParams;
}
/**
@@ -360,7 +364,8 @@ public final class VcnGatewayConnectionConfig {
public PersistableBundle toPersistableBundle() {
final PersistableBundle result = new PersistableBundle();
final PersistableBundle ctrlPlaneConfigBundle = mCtrlPlaneConfig.toPersistableBundle();
final PersistableBundle tunnelConnectionParamsBundle =
TunnelConnectionParamsUtils.toPersistableBundle(mTunnelConnectionParams);
final PersistableBundle exposedCapsBundle =
PersistableBundleUtils.fromList(
new ArrayList<>(mExposedCapabilities),
@@ -371,7 +376,7 @@ public final class VcnGatewayConnectionConfig {
PersistableBundleUtils.INTEGER_SERIALIZER);
result.putString(GATEWAY_CONNECTION_NAME_KEY, mGatewayConnectionName);
result.putPersistableBundle(CTRL_PLANE_CONFIG_KEY, ctrlPlaneConfigBundle);
result.putPersistableBundle(TUNNEL_CONNECTION_PARAMS_KEY, tunnelConnectionParamsBundle);
result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
result.putPersistableBundle(UNDERLYING_CAPABILITIES_KEY, underlyingCapsBundle);
result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
@@ -409,7 +414,7 @@ public final class VcnGatewayConnectionConfig {
*/
public static final class Builder {
@NonNull private final String mGatewayConnectionName;
@NonNull private final VcnControlPlaneConfig mCtrlPlaneConfig;
@NonNull private final TunnelConnectionParams mTunnelConnectionParams;
@NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
@NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet();
@NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
@@ -427,18 +432,18 @@ public final class VcnGatewayConnectionConfig {
* VcnConfig} must be given a unique name. This name is used by the caller to
* distinguish between VcnGatewayConnectionConfigs configured on a single {@link
* VcnConfig}. This will be used as the identifier in VcnStatusCallback invocations.
* @param ctrlPlaneConfig the control plane configuration
* @see VcnControlPlaneConfig
* @param tunnelConnectionParams the tunnel connection configuration
* @see TunnelConnectionParams
* @see VcnManager.VcnStatusCallback#onGatewayConnectionError
*/
public Builder(
@NonNull String gatewayConnectionName,
@NonNull VcnControlPlaneConfig ctrlPlaneConfig) {
@NonNull TunnelConnectionParams tunnelConnectionParams) {
Objects.requireNonNull(gatewayConnectionName, "gatewayConnectionName was null");
Objects.requireNonNull(ctrlPlaneConfig, "ctrlPlaneConfig was null");
Objects.requireNonNull(tunnelConnectionParams, "tunnelConnectionParams was null");
mGatewayConnectionName = gatewayConnectionName;
mCtrlPlaneConfig = ctrlPlaneConfig;
mTunnelConnectionParams = tunnelConnectionParams;
}
/**
@@ -583,7 +588,7 @@ public final class VcnGatewayConnectionConfig {
public VcnGatewayConnectionConfig build() {
return new VcnGatewayConnectionConfig(
mGatewayConnectionName,
mCtrlPlaneConfig,
mTunnelConnectionParams,
mExposedCapabilities,
mUnderlyingCapabilities,
mRetryIntervalsMs,

View File

@@ -52,6 +52,7 @@ import android.net.NetworkProvider;
import android.net.NetworkScore;
import android.net.RouteInfo;
import android.net.TelephonyNetworkSpecifier;
import android.net.TunnelConnectionParams;
import android.net.Uri;
import android.net.annotations.PolicyDirection;
import android.net.ipsec.ike.ChildSessionCallback;
@@ -61,10 +62,10 @@ import android.net.ipsec.ike.IkeSession;
import android.net.ipsec.ike.IkeSessionCallback;
import android.net.ipsec.ike.IkeSessionConfiguration;
import android.net.ipsec.ike.IkeSessionParams;
import android.net.ipsec.ike.IkeTunnelConnectionParams;
import android.net.ipsec.ike.exceptions.IkeException;
import android.net.ipsec.ike.exceptions.IkeInternalException;
import android.net.ipsec.ike.exceptions.IkeProtocolException;
import android.net.vcn.VcnControlPlaneIkeConfig;
import android.net.vcn.VcnGatewayConnectionConfig;
import android.net.vcn.VcnTransportInfo;
import android.net.wifi.WifiInfo;
@@ -1923,8 +1924,14 @@ public class VcnGatewayConnection extends StateMachine {
@NonNull IpSecTunnelInterface tunnelIface,
@NonNull VcnChildSessionConfiguration childConfig,
@Nullable UnderlyingNetworkRecord underlying) {
final VcnControlPlaneIkeConfig controlPlaneConfig =
(VcnControlPlaneIkeConfig) gatewayConnectionConfig.getControlPlaneConfig();
final TunnelConnectionParams tunnelParams =
gatewayConnectionConfig.getTunnelConnectionParams();
if (!(tunnelParams instanceof IkeTunnelConnectionParams)) {
throw new IllegalStateException(
"TunnelConnectionParams is not IkeTunnelConnectionParams");
}
final IkeTunnelConnectionParams ikeTunnelParams = (IkeTunnelConnectionParams) tunnelParams;
final LinkProperties lp = new LinkProperties();
lp.setInterfaceName(tunnelIface.getInterfaceName());
@@ -1943,7 +1950,7 @@ public class VcnGatewayConnection extends StateMachine {
final int underlyingMtu = (underlying == null) ? 0 : underlying.linkProperties.getMtu();
lp.setMtu(
MtuUtils.getMtu(
controlPlaneConfig.getChildSessionParams().getSaProposals(),
ikeTunnelParams.getTunnelModeChildSessionParams().getSaProposals(),
gatewayConnectionConfig.getMaxMtu(),
underlyingMtu));
@@ -2131,19 +2138,32 @@ public class VcnGatewayConnection extends StateMachine {
}
private IkeSessionParams buildIkeParams(@NonNull Network network) {
final VcnControlPlaneIkeConfig controlPlaneConfig =
(VcnControlPlaneIkeConfig) mConnectionConfig.getControlPlaneConfig();
final IkeSessionParams.Builder builder =
new IkeSessionParams.Builder(controlPlaneConfig.getIkeSessionParams());
builder.setNetwork(network);
final TunnelConnectionParams tunnelConnectionParams =
mConnectionConfig.getTunnelConnectionParams();
return builder.build();
if (tunnelConnectionParams instanceof IkeTunnelConnectionParams) {
final IkeTunnelConnectionParams ikeTunnelConnectionParams =
(IkeTunnelConnectionParams) tunnelConnectionParams;
final IkeSessionParams.Builder builder =
new IkeSessionParams.Builder(ikeTunnelConnectionParams.getIkeSessionParams());
builder.setNetwork(network);
return builder.build();
}
throw new IllegalStateException("TunnelConnectionParams is not IkeTunnelConnectionParams");
}
private ChildSessionParams buildChildParams() {
final VcnControlPlaneIkeConfig controlPlaneConfig =
(VcnControlPlaneIkeConfig) mConnectionConfig.getControlPlaneConfig();
return controlPlaneConfig.getChildSessionParams();
final TunnelConnectionParams tunnelConnectionParams =
mConnectionConfig.getTunnelConnectionParams();
if (tunnelConnectionParams instanceof IkeTunnelConnectionParams) {
return ((IkeTunnelConnectionParams) tunnelConnectionParams)
.getTunnelModeChildSessionParams();
}
throw new IllegalStateException("TunnelConnectionParams is not IkeTunnelConnectionParams");
}
@VisibleForTesting(visibility = Visibility.PRIVATE)

View File

@@ -1,113 +0,0 @@
/*
* Copyright (C) 2020 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.vcn;
import static android.net.ipsec.ike.SaProposal.DH_GROUP_2048_BIT_MODP;
import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_12;
import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_AES128_XCBC;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import android.net.ipsec.ike.ChildSaProposal;
import android.net.ipsec.ike.IkeFqdnIdentification;
import android.net.ipsec.ike.IkeSaProposal;
import android.net.ipsec.ike.IkeSessionParams;
import android.net.ipsec.ike.SaProposal;
import android.net.ipsec.ike.TunnelModeChildSessionParams;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class VcnControlPlaneIkeConfigTest {
private static final IkeSessionParams IKE_PARAMS;
private static final TunnelModeChildSessionParams CHILD_PARAMS;
static {
IkeSaProposal ikeProposal =
new IkeSaProposal.Builder()
.addEncryptionAlgorithm(
ENCRYPTION_ALGORITHM_AES_GCM_12, SaProposal.KEY_LEN_AES_128)
.addDhGroup(DH_GROUP_2048_BIT_MODP)
.addPseudorandomFunction(PSEUDORANDOM_FUNCTION_AES128_XCBC)
.build();
final String serverHostname = "192.0.2.100";
final String testLocalId = "test.client.com";
final String testRemoteId = "test.server.com";
final byte[] psk = "psk".getBytes();
IKE_PARAMS =
new IkeSessionParams.Builder()
.setServerHostname(serverHostname)
.addSaProposal(ikeProposal)
.setLocalIdentification(new IkeFqdnIdentification(testLocalId))
.setRemoteIdentification(new IkeFqdnIdentification(testRemoteId))
.setAuthPsk(psk)
.build();
ChildSaProposal childProposal =
new ChildSaProposal.Builder()
.addEncryptionAlgorithm(
ENCRYPTION_ALGORITHM_AES_GCM_12, SaProposal.KEY_LEN_AES_128)
.build();
CHILD_PARAMS =
new TunnelModeChildSessionParams.Builder().addSaProposal(childProposal).build();
}
// Package private for use in VcnGatewayConnectionConfigTest
static VcnControlPlaneIkeConfig buildTestConfig() {
return new VcnControlPlaneIkeConfig(IKE_PARAMS, CHILD_PARAMS);
}
@Test
public void testGetters() {
final VcnControlPlaneIkeConfig config = buildTestConfig();
assertEquals(IKE_PARAMS, config.getIkeSessionParams());
assertEquals(CHILD_PARAMS, config.getChildSessionParams());
}
@Test
public void testPersistableBundle() {
final VcnControlPlaneIkeConfig config = buildTestConfig();
assertEquals(config, new VcnControlPlaneIkeConfig(config.toPersistableBundle()));
}
@Test
public void testConstructConfigWithoutIkeParams() {
try {
new VcnControlPlaneIkeConfig(null, CHILD_PARAMS);
fail("Expect to fail because ikeParams was null");
} catch (NullPointerException expected) {
}
}
@Test
public void testBuilderConfigWithoutChildParams() {
try {
new VcnControlPlaneIkeConfig(IKE_PARAMS, null);
fail("Expect to fail because childParams was null");
} catch (NullPointerException expected) {
}
}
}

View File

@@ -18,11 +18,12 @@ package android.net.vcn;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.net.NetworkCapabilities;
import android.net.TunnelConnectionParams;
import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtilsTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -59,8 +60,8 @@ public class VcnGatewayConnectionConfigTest {
};
public static final int MAX_MTU = 1360;
public static final VcnControlPlaneConfig CONTROL_PLANE_CONFIG =
VcnControlPlaneIkeConfigTest.buildTestConfig();
public static final TunnelConnectionParams TUNNEL_CONNECTION_PARAMS =
TunnelConnectionParamsUtilsTest.buildTestParams();
public static final String GATEWAY_CONNECTION_NAME_PREFIX = "gatewayConnectionName-";
private static int sGatewayConnectionConfigCount = 0;
@@ -75,7 +76,7 @@ public class VcnGatewayConnectionConfigTest {
// VcnGatewayConnectionConfigs have a unique name (required by VcnConfig).
return new VcnGatewayConnectionConfig.Builder(
GATEWAY_CONNECTION_NAME_PREFIX + sGatewayConnectionConfigCount++,
CONTROL_PLANE_CONFIG);
TUNNEL_CONNECTION_PARAMS);
}
// Public for use in VcnGatewayConnectionTest
@@ -98,7 +99,7 @@ public class VcnGatewayConnectionConfigTest {
public void testBuilderRequiresNonNullGatewayConnectionName() {
try {
new VcnGatewayConnectionConfig.Builder(
null /* gatewayConnectionName */, CONTROL_PLANE_CONFIG)
null /* gatewayConnectionName */, TUNNEL_CONNECTION_PARAMS)
.build();
fail("Expected exception due to invalid gateway connection name");
@@ -107,13 +108,13 @@ public class VcnGatewayConnectionConfigTest {
}
@Test
public void testBuilderRequiresNonNullControlPlaneConfig() {
public void testBuilderRequiresNonNullTunnelConnectionParams() {
try {
new VcnGatewayConnectionConfig.Builder(
GATEWAY_CONNECTION_NAME_PREFIX, null /* ctrlPlaneConfig */)
GATEWAY_CONNECTION_NAME_PREFIX, null /* tunnelConnectionParams */)
.build();
fail("Expected exception due to invalid control plane config");
fail("Expected exception due to the absence of tunnel connection parameters");
} catch (NullPointerException e) {
}
}
@@ -171,8 +172,7 @@ public class VcnGatewayConnectionConfigTest {
Arrays.sort(underlyingCaps);
assertArrayEquals(UNDERLYING_CAPS, underlyingCaps);
assertEquals(CONTROL_PLANE_CONFIG, config.getControlPlaneConfig());
assertFalse(CONTROL_PLANE_CONFIG == config.getControlPlaneConfig());
assertEquals(TUNNEL_CONNECTION_PARAMS, config.getTunnelConnectionParams());
assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs());
assertEquals(MAX_MTU, config.getMaxMtu());

View File

@@ -29,7 +29,8 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class TunnelConnectionParamsUtilsTest {
private static IkeTunnelConnectionParams buildTestParams() {
// Public for use in VcnGatewayConnectionConfigTest
public static IkeTunnelConnectionParams buildTestParams() {
return new IkeTunnelConnectionParams(
IkeSessionParamsUtilsTest.createBuilderMinimum().build(),
TunnelModeChildSessionParamsUtilsTest.createBuilderMinimum().build());

View File

@@ -51,10 +51,10 @@ import android.net.LinkProperties;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.ipsec.ike.ChildSaProposal;
import android.net.ipsec.ike.IkeTunnelConnectionParams;
import android.net.ipsec.ike.exceptions.IkeException;
import android.net.ipsec.ike.exceptions.IkeInternalException;
import android.net.ipsec.ike.exceptions.IkeProtocolException;
import android.net.vcn.VcnControlPlaneIkeConfig;
import android.net.vcn.VcnManager.VcnErrorCode;
import androidx.test.filters.SmallTest;
@@ -181,8 +181,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState());
final List<ChildSaProposal> saProposals =
((VcnControlPlaneIkeConfig) mConfig.getControlPlaneConfig())
.getChildSessionParams()
((IkeTunnelConnectionParams) mConfig.getTunnelConnectionParams())
.getTunnelModeChildSessionParams()
.getSaProposals();
final int expectedMtu =
MtuUtils.getMtu(