blob: 575c5ed968f8fae6d0e9036d499e4798da8f81f2 [file] [log] [blame]
Nathan Harold330e1082017-01-12 18:38:57 -08001/*
2 * Copyright (C) 2017 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 */
16package android.net;
17
Chalard Jean9c0ff1b2019-05-30 17:11:14 +090018import android.annotation.Nullable;
Nathan Harold330e1082017-01-12 18:38:57 -080019import android.os.Parcel;
20import android.os.Parcelable;
Nathan Harolda10003d2017-08-23 13:46:33 -070021
22import com.android.internal.annotations.VisibleForTesting;
Nathan Harold330e1082017-01-12 18:38:57 -080023
Jonathan Basseric61b70d2017-04-21 15:53:51 -070024/**
25 * This class encapsulates all the configuration parameters needed to create IPsec transforms and
26 * policies.
27 *
28 * @hide
29 */
Nathan Harold330e1082017-01-12 18:38:57 -080030public final class IpSecConfig implements Parcelable {
Nathan Harold93962f32017-03-07 13:23:36 -080031 private static final String TAG = "IpSecConfig";
Nathan Harold330e1082017-01-12 18:38:57 -080032
Nathan Harolda10003d2017-08-23 13:46:33 -070033 // MODE_TRANSPORT or MODE_TUNNEL
34 private int mMode = IpSecTransform.MODE_TRANSPORT;
Nathan Harold330e1082017-01-12 18:38:57 -080035
Nathan Harolda10003d2017-08-23 13:46:33 -070036 // Preventing this from being null simplifies Java->Native binder
Nathan Harolda2523312018-01-05 19:25:13 -080037 private String mSourceAddress = "";
Nathan Harold330e1082017-01-12 18:38:57 -080038
Nathan Harolda10003d2017-08-23 13:46:33 -070039 // Preventing this from being null simplifies Java->Native binder
Nathan Harolda2523312018-01-05 19:25:13 -080040 private String mDestinationAddress = "";
Nathan Harold330e1082017-01-12 18:38:57 -080041
Nathan Haroldd6f50b22017-10-04 12:58:55 -070042 // The underlying Network that represents the "gateway" Network
Nathan Harolda10003d2017-08-23 13:46:33 -070043 // for outbound packets. It may also be used to select packets.
44 private Network mNetwork;
Nathan Harold330e1082017-01-12 18:38:57 -080045
Nathan Harolda2523312018-01-05 19:25:13 -080046 // Minimum requirements for identifying a transform
47 // SPI identifying the IPsec SA in packet processing
48 // and a destination IP address
49 private int mSpiResourceId = IpSecManager.INVALID_RESOURCE_ID;
Nathan Harold330e1082017-01-12 18:38:57 -080050
Nathan Harolda2523312018-01-05 19:25:13 -080051 // Encryption Algorithm
52 private IpSecAlgorithm mEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -080053
Nathan Harolda2523312018-01-05 19:25:13 -080054 // Authentication Algorithm
55 private IpSecAlgorithm mAuthentication;
ludib0c95b12017-05-22 10:52:23 -070056
Nathan Harolda2523312018-01-05 19:25:13 -080057 // Authenticated Encryption Algorithm
58 private IpSecAlgorithm mAuthenticatedEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -080059
60 // For tunnel mode IPv4 UDP Encapsulation
61 // IpSecTransform#ENCAP_ESP_*, such as ENCAP_ESP_OVER_UDP_IKE
Nathan Harolda10003d2017-08-23 13:46:33 -070062 private int mEncapType = IpSecTransform.ENCAP_NONE;
63 private int mEncapSocketResourceId = IpSecManager.INVALID_RESOURCE_ID;
64 private int mEncapRemotePort;
Nathan Harold330e1082017-01-12 18:38:57 -080065
Nathan Harold330e1082017-01-12 18:38:57 -080066 // An interval, in seconds between the NattKeepalive packets
Nathan Harolda10003d2017-08-23 13:46:33 -070067 private int mNattKeepaliveInterval;
68
Benedict Wongab80e1f2018-07-25 18:46:19 -070069 // XFRM mark and mask; defaults to 0 (no mark/mask)
Di Lu0b611f42018-01-11 11:35:25 -080070 private int mMarkValue;
71 private int mMarkMask;
72
Benedict Wong781dae62018-09-06 11:31:25 -070073 // XFRM interface id
74 private int mXfrmInterfaceId;
75
Nathan Harolda10003d2017-08-23 13:46:33 -070076 /** Set the mode for this IPsec transform */
77 public void setMode(int mode) {
78 mMode = mode;
79 }
80
Nathan Harolda2523312018-01-05 19:25:13 -080081 /** Set the source IP addres for this IPsec transform */
82 public void setSourceAddress(String sourceAddress) {
83 mSourceAddress = sourceAddress;
Nathan Harolda10003d2017-08-23 13:46:33 -070084 }
85
Nathan Harolda2523312018-01-05 19:25:13 -080086 /** Set the destination IP address for this IPsec transform */
87 public void setDestinationAddress(String destinationAddress) {
88 mDestinationAddress = destinationAddress;
Nathan Harolda10003d2017-08-23 13:46:33 -070089 }
90
Nathan Harolda2523312018-01-05 19:25:13 -080091 /** Set the SPI by resource ID */
92 public void setSpiResourceId(int resourceId) {
93 mSpiResourceId = resourceId;
Nathan Harolda10003d2017-08-23 13:46:33 -070094 }
95
Nathan Harolda2523312018-01-05 19:25:13 -080096 /** Set the encryption algorithm */
97 public void setEncryption(IpSecAlgorithm encryption) {
98 mEncryption = encryption;
Nathan Harolda10003d2017-08-23 13:46:33 -070099 }
100
Nathan Harolda2523312018-01-05 19:25:13 -0800101 /** Set the authentication algorithm */
102 public void setAuthentication(IpSecAlgorithm authentication) {
103 mAuthentication = authentication;
Nathan Harolda10003d2017-08-23 13:46:33 -0700104 }
105
Nathan Harolda2523312018-01-05 19:25:13 -0800106 /** Set the authenticated encryption algorithm */
107 public void setAuthenticatedEncryption(IpSecAlgorithm authenticatedEncryption) {
108 mAuthenticatedEncryption = authenticatedEncryption;
Benedict Wong0febe5e2017-08-22 21:42:33 -0700109 }
110
Nathan Harolda2523312018-01-05 19:25:13 -0800111 /** Set the underlying network that will carry traffic for this transform */
Nathan Harolda10003d2017-08-23 13:46:33 -0700112 public void setNetwork(Network network) {
113 mNetwork = network;
114 }
115
116 public void setEncapType(int encapType) {
117 mEncapType = encapType;
118 }
119
120 public void setEncapSocketResourceId(int resourceId) {
121 mEncapSocketResourceId = resourceId;
122 }
123
124 public void setEncapRemotePort(int port) {
125 mEncapRemotePort = port;
126 }
127
128 public void setNattKeepaliveInterval(int interval) {
129 mNattKeepaliveInterval = interval;
130 }
Nathan Harold330e1082017-01-12 18:38:57 -0800131
Benedict Wongab80e1f2018-07-25 18:46:19 -0700132 /**
133 * Sets the mark value
134 *
135 * <p>Internal (System server) use only. Marks passed in by users will be overwritten or
136 * ignored.
137 */
Di Lu0b611f42018-01-11 11:35:25 -0800138 public void setMarkValue(int mark) {
139 mMarkValue = mark;
140 }
141
Benedict Wongab80e1f2018-07-25 18:46:19 -0700142 /**
143 * Sets the mark mask
144 *
145 * <p>Internal (System server) use only. Marks passed in by users will be overwritten or
146 * ignored.
147 */
Di Lu0b611f42018-01-11 11:35:25 -0800148 public void setMarkMask(int mask) {
149 mMarkMask = mask;
150 }
151
Benedict Wong781dae62018-09-06 11:31:25 -0700152 public void setXfrmInterfaceId(int xfrmInterfaceId) {
153 mXfrmInterfaceId = xfrmInterfaceId;
154 }
155
Nathan Harold93962f32017-03-07 13:23:36 -0800156 // Transport or Tunnel
157 public int getMode() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700158 return mMode;
Nathan Harold93962f32017-03-07 13:23:36 -0800159 }
160
Nathan Harolda2523312018-01-05 19:25:13 -0800161 public String getSourceAddress() {
162 return mSourceAddress;
Nathan Harold330e1082017-01-12 18:38:57 -0800163 }
164
Nathan Harolda2523312018-01-05 19:25:13 -0800165 public int getSpiResourceId() {
166 return mSpiResourceId;
Nathan Harold330e1082017-01-12 18:38:57 -0800167 }
168
Nathan Harolda2523312018-01-05 19:25:13 -0800169 public String getDestinationAddress() {
170 return mDestinationAddress;
Nathan Harold330e1082017-01-12 18:38:57 -0800171 }
172
Nathan Harolda2523312018-01-05 19:25:13 -0800173 public IpSecAlgorithm getEncryption() {
174 return mEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -0800175 }
176
Nathan Harolda2523312018-01-05 19:25:13 -0800177 public IpSecAlgorithm getAuthentication() {
178 return mAuthentication;
Nathan Harold330e1082017-01-12 18:38:57 -0800179 }
180
Nathan Harolda2523312018-01-05 19:25:13 -0800181 public IpSecAlgorithm getAuthenticatedEncryption() {
182 return mAuthenticatedEncryption;
Benedict Wong0febe5e2017-08-22 21:42:33 -0700183 }
184
Nathan Harold93962f32017-03-07 13:23:36 -0800185 public Network getNetwork() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700186 return mNetwork;
Nathan Harold330e1082017-01-12 18:38:57 -0800187 }
188
189 public int getEncapType() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700190 return mEncapType;
Nathan Harold330e1082017-01-12 18:38:57 -0800191 }
192
Nathan Harolda10003d2017-08-23 13:46:33 -0700193 public int getEncapSocketResourceId() {
194 return mEncapSocketResourceId;
Nathan Harold330e1082017-01-12 18:38:57 -0800195 }
196
197 public int getEncapRemotePort() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700198 return mEncapRemotePort;
Nathan Harold330e1082017-01-12 18:38:57 -0800199 }
200
Nathan Harold93962f32017-03-07 13:23:36 -0800201 public int getNattKeepaliveInterval() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700202 return mNattKeepaliveInterval;
Nathan Harold330e1082017-01-12 18:38:57 -0800203 }
204
Di Lu0b611f42018-01-11 11:35:25 -0800205 public int getMarkValue() {
206 return mMarkValue;
207 }
208
209 public int getMarkMask() {
210 return mMarkMask;
211 }
212
Benedict Wong781dae62018-09-06 11:31:25 -0700213 public int getXfrmInterfaceId() {
214 return mXfrmInterfaceId;
215 }
216
Nathan Harold330e1082017-01-12 18:38:57 -0800217 // Parcelable Methods
218
219 @Override
220 public int describeContents() {
221 return 0;
222 }
223
224 @Override
225 public void writeToParcel(Parcel out, int flags) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700226 out.writeInt(mMode);
Nathan Harolda2523312018-01-05 19:25:13 -0800227 out.writeString(mSourceAddress);
228 out.writeString(mDestinationAddress);
Nathan Harolda10003d2017-08-23 13:46:33 -0700229 out.writeParcelable(mNetwork, flags);
Nathan Harolda2523312018-01-05 19:25:13 -0800230 out.writeInt(mSpiResourceId);
231 out.writeParcelable(mEncryption, flags);
232 out.writeParcelable(mAuthentication, flags);
233 out.writeParcelable(mAuthenticatedEncryption, flags);
Nathan Harolda10003d2017-08-23 13:46:33 -0700234 out.writeInt(mEncapType);
235 out.writeInt(mEncapSocketResourceId);
236 out.writeInt(mEncapRemotePort);
Nathan Harold19ce70b2017-09-25 19:33:13 -0700237 out.writeInt(mNattKeepaliveInterval);
Di Lu0b611f42018-01-11 11:35:25 -0800238 out.writeInt(mMarkValue);
239 out.writeInt(mMarkMask);
Benedict Wong781dae62018-09-06 11:31:25 -0700240 out.writeInt(mXfrmInterfaceId);
Nathan Harold330e1082017-01-12 18:38:57 -0800241 }
242
Nathan Harolda10003d2017-08-23 13:46:33 -0700243 @VisibleForTesting
244 public IpSecConfig() {}
Nathan Harold330e1082017-01-12 18:38:57 -0800245
Benedict Wong9dd3a382018-02-06 20:43:21 -0800246 /** Copy constructor */
247 @VisibleForTesting
248 public IpSecConfig(IpSecConfig c) {
249 mMode = c.mMode;
250 mSourceAddress = c.mSourceAddress;
251 mDestinationAddress = c.mDestinationAddress;
252 mNetwork = c.mNetwork;
253 mSpiResourceId = c.mSpiResourceId;
254 mEncryption = c.mEncryption;
255 mAuthentication = c.mAuthentication;
256 mAuthenticatedEncryption = c.mAuthenticatedEncryption;
257 mEncapType = c.mEncapType;
258 mEncapSocketResourceId = c.mEncapSocketResourceId;
259 mEncapRemotePort = c.mEncapRemotePort;
260 mNattKeepaliveInterval = c.mNattKeepaliveInterval;
261 mMarkValue = c.mMarkValue;
262 mMarkMask = c.mMarkMask;
Benedict Wong781dae62018-09-06 11:31:25 -0700263 mXfrmInterfaceId = c.mXfrmInterfaceId;
Benedict Wong9dd3a382018-02-06 20:43:21 -0800264 }
265
Nathan Harold330e1082017-01-12 18:38:57 -0800266 private IpSecConfig(Parcel in) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700267 mMode = in.readInt();
Nathan Harolda2523312018-01-05 19:25:13 -0800268 mSourceAddress = in.readString();
269 mDestinationAddress = in.readString();
Nathan Harolda10003d2017-08-23 13:46:33 -0700270 mNetwork = (Network) in.readParcelable(Network.class.getClassLoader());
Nathan Harolda2523312018-01-05 19:25:13 -0800271 mSpiResourceId = in.readInt();
272 mEncryption =
Nathan Harold330e1082017-01-12 18:38:57 -0800273 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda2523312018-01-05 19:25:13 -0800274 mAuthentication =
Nathan Harold330e1082017-01-12 18:38:57 -0800275 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda2523312018-01-05 19:25:13 -0800276 mAuthenticatedEncryption =
Benedict Wong0febe5e2017-08-22 21:42:33 -0700277 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda10003d2017-08-23 13:46:33 -0700278 mEncapType = in.readInt();
279 mEncapSocketResourceId = in.readInt();
280 mEncapRemotePort = in.readInt();
Nathan Harold19ce70b2017-09-25 19:33:13 -0700281 mNattKeepaliveInterval = in.readInt();
Di Lu0b611f42018-01-11 11:35:25 -0800282 mMarkValue = in.readInt();
283 mMarkMask = in.readInt();
Benedict Wong781dae62018-09-06 11:31:25 -0700284 mXfrmInterfaceId = in.readInt();
Nathan Harold330e1082017-01-12 18:38:57 -0800285 }
286
ludib0c95b12017-05-22 10:52:23 -0700287 @Override
288 public String toString() {
289 StringBuilder strBuilder = new StringBuilder();
290 strBuilder
Nathan Harolda10003d2017-08-23 13:46:33 -0700291 .append("{mMode=")
292 .append(mMode == IpSecTransform.MODE_TUNNEL ? "TUNNEL" : "TRANSPORT")
Nathan Harolda2523312018-01-05 19:25:13 -0800293 .append(", mSourceAddress=")
294 .append(mSourceAddress)
295 .append(", mDestinationAddress=")
296 .append(mDestinationAddress)
Nathan Harolda10003d2017-08-23 13:46:33 -0700297 .append(", mNetwork=")
298 .append(mNetwork)
299 .append(", mEncapType=")
300 .append(mEncapType)
301 .append(", mEncapSocketResourceId=")
302 .append(mEncapSocketResourceId)
303 .append(", mEncapRemotePort=")
304 .append(mEncapRemotePort)
305 .append(", mNattKeepaliveInterval=")
306 .append(mNattKeepaliveInterval)
Nathan Harolda2523312018-01-05 19:25:13 -0800307 .append("{mSpiResourceId=")
308 .append(mSpiResourceId)
309 .append(", mEncryption=")
310 .append(mEncryption)
311 .append(", mAuthentication=")
312 .append(mAuthentication)
313 .append(", mAuthenticatedEncryption=")
314 .append(mAuthenticatedEncryption)
Di Lu0b611f42018-01-11 11:35:25 -0800315 .append(", mMarkValue=")
316 .append(mMarkValue)
317 .append(", mMarkMask=")
318 .append(mMarkMask)
Benedict Wong781dae62018-09-06 11:31:25 -0700319 .append(", mXfrmInterfaceId=")
320 .append(mXfrmInterfaceId)
ludib0c95b12017-05-22 10:52:23 -0700321 .append("}");
322
323 return strBuilder.toString();
324 }
325
Jeff Sharkey9e8f83d2019-02-28 12:06:45 -0700326 public static final @android.annotation.NonNull Parcelable.Creator<IpSecConfig> CREATOR =
Nathan Harold330e1082017-01-12 18:38:57 -0800327 new Parcelable.Creator<IpSecConfig>() {
328 public IpSecConfig createFromParcel(Parcel in) {
329 return new IpSecConfig(in);
330 }
331
332 public IpSecConfig[] newArray(int size) {
333 return new IpSecConfig[size];
334 }
335 };
Nathan Harold19ce70b2017-09-25 19:33:13 -0700336
Chalard Jean9c0ff1b2019-05-30 17:11:14 +0900337 @Override
338 public boolean equals(@Nullable Object other) {
339 if (!(other instanceof IpSecConfig)) return false;
340 final IpSecConfig rhs = (IpSecConfig) other;
341 return (mMode == rhs.mMode
342 && mSourceAddress.equals(rhs.mSourceAddress)
343 && mDestinationAddress.equals(rhs.mDestinationAddress)
344 && ((mNetwork != null && mNetwork.equals(rhs.mNetwork))
345 || (mNetwork == rhs.mNetwork))
346 && mEncapType == rhs.mEncapType
347 && mEncapSocketResourceId == rhs.mEncapSocketResourceId
348 && mEncapRemotePort == rhs.mEncapRemotePort
349 && mNattKeepaliveInterval == rhs.mNattKeepaliveInterval
350 && mSpiResourceId == rhs.mSpiResourceId
351 && IpSecAlgorithm.equals(mEncryption, rhs.mEncryption)
352 && IpSecAlgorithm.equals(mAuthenticatedEncryption, rhs.mAuthenticatedEncryption)
353 && IpSecAlgorithm.equals(mAuthentication, rhs.mAuthentication)
354 && mMarkValue == rhs.mMarkValue
355 && mMarkMask == rhs.mMarkMask
356 && mXfrmInterfaceId == rhs.mXfrmInterfaceId);
Nathan Harold19ce70b2017-09-25 19:33:13 -0700357 }
Nathan Harold330e1082017-01-12 18:38:57 -0800358}