| /* |
| * Copyright (C) 2017 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; |
| |
| import android.annotation.Nullable; |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| |
| /** |
| * This class encapsulates all the configuration parameters needed to create IPsec transforms and |
| * policies. |
| * |
| * @hide |
| */ |
| public final class IpSecConfig implements Parcelable { |
| private static final String TAG = "IpSecConfig"; |
| |
| // MODE_TRANSPORT or MODE_TUNNEL |
| private int mMode = IpSecTransform.MODE_TRANSPORT; |
| |
| // Preventing this from being null simplifies Java->Native binder |
| private String mSourceAddress = ""; |
| |
| // Preventing this from being null simplifies Java->Native binder |
| private String mDestinationAddress = ""; |
| |
| // The underlying Network that represents the "gateway" Network |
| // for outbound packets. It may also be used to select packets. |
| private Network mNetwork; |
| |
| // Minimum requirements for identifying a transform |
| // SPI identifying the IPsec SA in packet processing |
| // and a destination IP address |
| private int mSpiResourceId = IpSecManager.INVALID_RESOURCE_ID; |
| |
| // Encryption Algorithm |
| private IpSecAlgorithm mEncryption; |
| |
| // Authentication Algorithm |
| private IpSecAlgorithm mAuthentication; |
| |
| // Authenticated Encryption Algorithm |
| private IpSecAlgorithm mAuthenticatedEncryption; |
| |
| // For tunnel mode IPv4 UDP Encapsulation |
| // IpSecTransform#ENCAP_ESP_*, such as ENCAP_ESP_OVER_UDP_IKE |
| private int mEncapType = IpSecTransform.ENCAP_NONE; |
| private int mEncapSocketResourceId = IpSecManager.INVALID_RESOURCE_ID; |
| private int mEncapRemotePort; |
| |
| // An interval, in seconds between the NattKeepalive packets |
| private int mNattKeepaliveInterval; |
| |
| // XFRM mark and mask; defaults to 0 (no mark/mask) |
| private int mMarkValue; |
| private int mMarkMask; |
| |
| // XFRM interface id |
| private int mXfrmInterfaceId; |
| |
| /** Set the mode for this IPsec transform */ |
| public void setMode(int mode) { |
| mMode = mode; |
| } |
| |
| /** Set the source IP addres for this IPsec transform */ |
| public void setSourceAddress(String sourceAddress) { |
| mSourceAddress = sourceAddress; |
| } |
| |
| /** Set the destination IP address for this IPsec transform */ |
| public void setDestinationAddress(String destinationAddress) { |
| mDestinationAddress = destinationAddress; |
| } |
| |
| /** Set the SPI by resource ID */ |
| public void setSpiResourceId(int resourceId) { |
| mSpiResourceId = resourceId; |
| } |
| |
| /** Set the encryption algorithm */ |
| public void setEncryption(IpSecAlgorithm encryption) { |
| mEncryption = encryption; |
| } |
| |
| /** Set the authentication algorithm */ |
| public void setAuthentication(IpSecAlgorithm authentication) { |
| mAuthentication = authentication; |
| } |
| |
| /** Set the authenticated encryption algorithm */ |
| public void setAuthenticatedEncryption(IpSecAlgorithm authenticatedEncryption) { |
| mAuthenticatedEncryption = authenticatedEncryption; |
| } |
| |
| /** Set the underlying network that will carry traffic for this transform */ |
| public void setNetwork(Network network) { |
| mNetwork = network; |
| } |
| |
| public void setEncapType(int encapType) { |
| mEncapType = encapType; |
| } |
| |
| public void setEncapSocketResourceId(int resourceId) { |
| mEncapSocketResourceId = resourceId; |
| } |
| |
| public void setEncapRemotePort(int port) { |
| mEncapRemotePort = port; |
| } |
| |
| public void setNattKeepaliveInterval(int interval) { |
| mNattKeepaliveInterval = interval; |
| } |
| |
| /** |
| * Sets the mark value |
| * |
| * <p>Internal (System server) use only. Marks passed in by users will be overwritten or |
| * ignored. |
| */ |
| public void setMarkValue(int mark) { |
| mMarkValue = mark; |
| } |
| |
| /** |
| * Sets the mark mask |
| * |
| * <p>Internal (System server) use only. Marks passed in by users will be overwritten or |
| * ignored. |
| */ |
| public void setMarkMask(int mask) { |
| mMarkMask = mask; |
| } |
| |
| public void setXfrmInterfaceId(int xfrmInterfaceId) { |
| mXfrmInterfaceId = xfrmInterfaceId; |
| } |
| |
| // Transport or Tunnel |
| public int getMode() { |
| return mMode; |
| } |
| |
| public String getSourceAddress() { |
| return mSourceAddress; |
| } |
| |
| public int getSpiResourceId() { |
| return mSpiResourceId; |
| } |
| |
| public String getDestinationAddress() { |
| return mDestinationAddress; |
| } |
| |
| public IpSecAlgorithm getEncryption() { |
| return mEncryption; |
| } |
| |
| public IpSecAlgorithm getAuthentication() { |
| return mAuthentication; |
| } |
| |
| public IpSecAlgorithm getAuthenticatedEncryption() { |
| return mAuthenticatedEncryption; |
| } |
| |
| public Network getNetwork() { |
| return mNetwork; |
| } |
| |
| public int getEncapType() { |
| return mEncapType; |
| } |
| |
| public int getEncapSocketResourceId() { |
| return mEncapSocketResourceId; |
| } |
| |
| public int getEncapRemotePort() { |
| return mEncapRemotePort; |
| } |
| |
| public int getNattKeepaliveInterval() { |
| return mNattKeepaliveInterval; |
| } |
| |
| public int getMarkValue() { |
| return mMarkValue; |
| } |
| |
| public int getMarkMask() { |
| return mMarkMask; |
| } |
| |
| public int getXfrmInterfaceId() { |
| return mXfrmInterfaceId; |
| } |
| |
| // Parcelable Methods |
| |
| @Override |
| public int describeContents() { |
| return 0; |
| } |
| |
| @Override |
| public void writeToParcel(Parcel out, int flags) { |
| out.writeInt(mMode); |
| out.writeString(mSourceAddress); |
| out.writeString(mDestinationAddress); |
| out.writeParcelable(mNetwork, flags); |
| out.writeInt(mSpiResourceId); |
| out.writeParcelable(mEncryption, flags); |
| out.writeParcelable(mAuthentication, flags); |
| out.writeParcelable(mAuthenticatedEncryption, flags); |
| out.writeInt(mEncapType); |
| out.writeInt(mEncapSocketResourceId); |
| out.writeInt(mEncapRemotePort); |
| out.writeInt(mNattKeepaliveInterval); |
| out.writeInt(mMarkValue); |
| out.writeInt(mMarkMask); |
| out.writeInt(mXfrmInterfaceId); |
| } |
| |
| @VisibleForTesting |
| public IpSecConfig() {} |
| |
| /** Copy constructor */ |
| @VisibleForTesting |
| public IpSecConfig(IpSecConfig c) { |
| mMode = c.mMode; |
| mSourceAddress = c.mSourceAddress; |
| mDestinationAddress = c.mDestinationAddress; |
| mNetwork = c.mNetwork; |
| mSpiResourceId = c.mSpiResourceId; |
| mEncryption = c.mEncryption; |
| mAuthentication = c.mAuthentication; |
| mAuthenticatedEncryption = c.mAuthenticatedEncryption; |
| mEncapType = c.mEncapType; |
| mEncapSocketResourceId = c.mEncapSocketResourceId; |
| mEncapRemotePort = c.mEncapRemotePort; |
| mNattKeepaliveInterval = c.mNattKeepaliveInterval; |
| mMarkValue = c.mMarkValue; |
| mMarkMask = c.mMarkMask; |
| mXfrmInterfaceId = c.mXfrmInterfaceId; |
| } |
| |
| private IpSecConfig(Parcel in) { |
| mMode = in.readInt(); |
| mSourceAddress = in.readString(); |
| mDestinationAddress = in.readString(); |
| mNetwork = (Network) in.readParcelable(Network.class.getClassLoader(), android.net.Network.class); |
| mSpiResourceId = in.readInt(); |
| mEncryption = |
| (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader(), android.net.IpSecAlgorithm.class); |
| mAuthentication = |
| (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader(), android.net.IpSecAlgorithm.class); |
| mAuthenticatedEncryption = |
| (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader(), android.net.IpSecAlgorithm.class); |
| mEncapType = in.readInt(); |
| mEncapSocketResourceId = in.readInt(); |
| mEncapRemotePort = in.readInt(); |
| mNattKeepaliveInterval = in.readInt(); |
| mMarkValue = in.readInt(); |
| mMarkMask = in.readInt(); |
| mXfrmInterfaceId = in.readInt(); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder strBuilder = new StringBuilder(); |
| strBuilder |
| .append("{mMode=") |
| .append(mMode == IpSecTransform.MODE_TUNNEL ? "TUNNEL" : "TRANSPORT") |
| .append(", mSourceAddress=") |
| .append(mSourceAddress) |
| .append(", mDestinationAddress=") |
| .append(mDestinationAddress) |
| .append(", mNetwork=") |
| .append(mNetwork) |
| .append(", mEncapType=") |
| .append(mEncapType) |
| .append(", mEncapSocketResourceId=") |
| .append(mEncapSocketResourceId) |
| .append(", mEncapRemotePort=") |
| .append(mEncapRemotePort) |
| .append(", mNattKeepaliveInterval=") |
| .append(mNattKeepaliveInterval) |
| .append("{mSpiResourceId=") |
| .append(mSpiResourceId) |
| .append(", mEncryption=") |
| .append(mEncryption) |
| .append(", mAuthentication=") |
| .append(mAuthentication) |
| .append(", mAuthenticatedEncryption=") |
| .append(mAuthenticatedEncryption) |
| .append(", mMarkValue=") |
| .append(mMarkValue) |
| .append(", mMarkMask=") |
| .append(mMarkMask) |
| .append(", mXfrmInterfaceId=") |
| .append(mXfrmInterfaceId) |
| .append("}"); |
| |
| return strBuilder.toString(); |
| } |
| |
| public static final @android.annotation.NonNull Parcelable.Creator<IpSecConfig> CREATOR = |
| new Parcelable.Creator<IpSecConfig>() { |
| public IpSecConfig createFromParcel(Parcel in) { |
| return new IpSecConfig(in); |
| } |
| |
| public IpSecConfig[] newArray(int size) { |
| return new IpSecConfig[size]; |
| } |
| }; |
| |
| @Override |
| public boolean equals(@Nullable Object other) { |
| if (!(other instanceof IpSecConfig)) return false; |
| final IpSecConfig rhs = (IpSecConfig) other; |
| return (mMode == rhs.mMode |
| && mSourceAddress.equals(rhs.mSourceAddress) |
| && mDestinationAddress.equals(rhs.mDestinationAddress) |
| && ((mNetwork != null && mNetwork.equals(rhs.mNetwork)) |
| || (mNetwork == rhs.mNetwork)) |
| && mEncapType == rhs.mEncapType |
| && mEncapSocketResourceId == rhs.mEncapSocketResourceId |
| && mEncapRemotePort == rhs.mEncapRemotePort |
| && mNattKeepaliveInterval == rhs.mNattKeepaliveInterval |
| && mSpiResourceId == rhs.mSpiResourceId |
| && IpSecAlgorithm.equals(mEncryption, rhs.mEncryption) |
| && IpSecAlgorithm.equals(mAuthenticatedEncryption, rhs.mAuthenticatedEncryption) |
| && IpSecAlgorithm.equals(mAuthentication, rhs.mAuthentication) |
| && mMarkValue == rhs.mMarkValue |
| && mMarkMask == rhs.mMarkMask |
| && mXfrmInterfaceId == rhs.mXfrmInterfaceId); |
| } |
| } |