blob: 8599f47c624540b0d74ce5470cf7106db82ccc8d [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
18import android.os.Parcel;
19import android.os.Parcelable;
Nathan Harolda10003d2017-08-23 13:46:33 -070020
21import com.android.internal.annotations.VisibleForTesting;
Nathan Harold330e1082017-01-12 18:38:57 -080022
Jonathan Basseric61b70d2017-04-21 15:53:51 -070023/**
24 * This class encapsulates all the configuration parameters needed to create IPsec transforms and
25 * policies.
26 *
27 * @hide
28 */
Nathan Harold330e1082017-01-12 18:38:57 -080029public final class IpSecConfig implements Parcelable {
Nathan Harold93962f32017-03-07 13:23:36 -080030 private static final String TAG = "IpSecConfig";
Nathan Harold330e1082017-01-12 18:38:57 -080031
Nathan Harolda10003d2017-08-23 13:46:33 -070032 // MODE_TRANSPORT or MODE_TUNNEL
33 private int mMode = IpSecTransform.MODE_TRANSPORT;
Nathan Harold330e1082017-01-12 18:38:57 -080034
Nathan Harolda10003d2017-08-23 13:46:33 -070035 // Preventing this from being null simplifies Java->Native binder
Nathan Harolda2523312018-01-05 19:25:13 -080036 private String mSourceAddress = "";
Nathan Harold330e1082017-01-12 18:38:57 -080037
Nathan Harolda10003d2017-08-23 13:46:33 -070038 // Preventing this from being null simplifies Java->Native binder
Nathan Harolda2523312018-01-05 19:25:13 -080039 private String mDestinationAddress = "";
Nathan Harold330e1082017-01-12 18:38:57 -080040
Nathan Haroldd6f50b22017-10-04 12:58:55 -070041 // The underlying Network that represents the "gateway" Network
Nathan Harolda10003d2017-08-23 13:46:33 -070042 // for outbound packets. It may also be used to select packets.
43 private Network mNetwork;
Nathan Harold330e1082017-01-12 18:38:57 -080044
Nathan Harolda2523312018-01-05 19:25:13 -080045 // Minimum requirements for identifying a transform
46 // SPI identifying the IPsec SA in packet processing
47 // and a destination IP address
48 private int mSpiResourceId = IpSecManager.INVALID_RESOURCE_ID;
Nathan Harold330e1082017-01-12 18:38:57 -080049
Nathan Harolda2523312018-01-05 19:25:13 -080050 // Encryption Algorithm
51 private IpSecAlgorithm mEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -080052
Nathan Harolda2523312018-01-05 19:25:13 -080053 // Authentication Algorithm
54 private IpSecAlgorithm mAuthentication;
ludib0c95b12017-05-22 10:52:23 -070055
Nathan Harolda2523312018-01-05 19:25:13 -080056 // Authenticated Encryption Algorithm
57 private IpSecAlgorithm mAuthenticatedEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -080058
59 // For tunnel mode IPv4 UDP Encapsulation
60 // IpSecTransform#ENCAP_ESP_*, such as ENCAP_ESP_OVER_UDP_IKE
Nathan Harolda10003d2017-08-23 13:46:33 -070061 private int mEncapType = IpSecTransform.ENCAP_NONE;
62 private int mEncapSocketResourceId = IpSecManager.INVALID_RESOURCE_ID;
63 private int mEncapRemotePort;
Nathan Harold330e1082017-01-12 18:38:57 -080064
Nathan Harold330e1082017-01-12 18:38:57 -080065 // An interval, in seconds between the NattKeepalive packets
Nathan Harolda10003d2017-08-23 13:46:33 -070066 private int mNattKeepaliveInterval;
67
Di Lu0b611f42018-01-11 11:35:25 -080068 // XFRM mark and mask
69 private int mMarkValue;
70 private int mMarkMask;
71
Nathan Harolda10003d2017-08-23 13:46:33 -070072 /** Set the mode for this IPsec transform */
73 public void setMode(int mode) {
74 mMode = mode;
75 }
76
Nathan Harolda2523312018-01-05 19:25:13 -080077 /** Set the source IP addres for this IPsec transform */
78 public void setSourceAddress(String sourceAddress) {
79 mSourceAddress = sourceAddress;
Nathan Harolda10003d2017-08-23 13:46:33 -070080 }
81
Nathan Harolda2523312018-01-05 19:25:13 -080082 /** Set the destination IP address for this IPsec transform */
83 public void setDestinationAddress(String destinationAddress) {
84 mDestinationAddress = destinationAddress;
Nathan Harolda10003d2017-08-23 13:46:33 -070085 }
86
Nathan Harolda2523312018-01-05 19:25:13 -080087 /** Set the SPI by resource ID */
88 public void setSpiResourceId(int resourceId) {
89 mSpiResourceId = resourceId;
Nathan Harolda10003d2017-08-23 13:46:33 -070090 }
91
Nathan Harolda2523312018-01-05 19:25:13 -080092 /** Set the encryption algorithm */
93 public void setEncryption(IpSecAlgorithm encryption) {
94 mEncryption = encryption;
Nathan Harolda10003d2017-08-23 13:46:33 -070095 }
96
Nathan Harolda2523312018-01-05 19:25:13 -080097 /** Set the authentication algorithm */
98 public void setAuthentication(IpSecAlgorithm authentication) {
99 mAuthentication = authentication;
Nathan Harolda10003d2017-08-23 13:46:33 -0700100 }
101
Nathan Harolda2523312018-01-05 19:25:13 -0800102 /** Set the authenticated encryption algorithm */
103 public void setAuthenticatedEncryption(IpSecAlgorithm authenticatedEncryption) {
104 mAuthenticatedEncryption = authenticatedEncryption;
Benedict Wong0febe5e2017-08-22 21:42:33 -0700105 }
106
Nathan Harolda2523312018-01-05 19:25:13 -0800107 /** Set the underlying network that will carry traffic for this transform */
Nathan Harolda10003d2017-08-23 13:46:33 -0700108 public void setNetwork(Network network) {
109 mNetwork = network;
110 }
111
112 public void setEncapType(int encapType) {
113 mEncapType = encapType;
114 }
115
116 public void setEncapSocketResourceId(int resourceId) {
117 mEncapSocketResourceId = resourceId;
118 }
119
120 public void setEncapRemotePort(int port) {
121 mEncapRemotePort = port;
122 }
123
124 public void setNattKeepaliveInterval(int interval) {
125 mNattKeepaliveInterval = interval;
126 }
Nathan Harold330e1082017-01-12 18:38:57 -0800127
Di Lu0b611f42018-01-11 11:35:25 -0800128 public void setMarkValue(int mark) {
129 mMarkValue = mark;
130 }
131
132 public void setMarkMask(int mask) {
133 mMarkMask = mask;
134 }
135
Nathan Harold93962f32017-03-07 13:23:36 -0800136 // Transport or Tunnel
137 public int getMode() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700138 return mMode;
Nathan Harold93962f32017-03-07 13:23:36 -0800139 }
140
Nathan Harolda2523312018-01-05 19:25:13 -0800141 public String getSourceAddress() {
142 return mSourceAddress;
Nathan Harold330e1082017-01-12 18:38:57 -0800143 }
144
Nathan Harolda2523312018-01-05 19:25:13 -0800145 public int getSpiResourceId() {
146 return mSpiResourceId;
Nathan Harold330e1082017-01-12 18:38:57 -0800147 }
148
Nathan Harolda2523312018-01-05 19:25:13 -0800149 public String getDestinationAddress() {
150 return mDestinationAddress;
Nathan Harold330e1082017-01-12 18:38:57 -0800151 }
152
Nathan Harolda2523312018-01-05 19:25:13 -0800153 public IpSecAlgorithm getEncryption() {
154 return mEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -0800155 }
156
Nathan Harolda2523312018-01-05 19:25:13 -0800157 public IpSecAlgorithm getAuthentication() {
158 return mAuthentication;
Nathan Harold330e1082017-01-12 18:38:57 -0800159 }
160
Nathan Harolda2523312018-01-05 19:25:13 -0800161 public IpSecAlgorithm getAuthenticatedEncryption() {
162 return mAuthenticatedEncryption;
Benedict Wong0febe5e2017-08-22 21:42:33 -0700163 }
164
Nathan Harold93962f32017-03-07 13:23:36 -0800165 public Network getNetwork() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700166 return mNetwork;
Nathan Harold330e1082017-01-12 18:38:57 -0800167 }
168
169 public int getEncapType() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700170 return mEncapType;
Nathan Harold330e1082017-01-12 18:38:57 -0800171 }
172
Nathan Harolda10003d2017-08-23 13:46:33 -0700173 public int getEncapSocketResourceId() {
174 return mEncapSocketResourceId;
Nathan Harold330e1082017-01-12 18:38:57 -0800175 }
176
177 public int getEncapRemotePort() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700178 return mEncapRemotePort;
Nathan Harold330e1082017-01-12 18:38:57 -0800179 }
180
Nathan Harold93962f32017-03-07 13:23:36 -0800181 public int getNattKeepaliveInterval() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700182 return mNattKeepaliveInterval;
Nathan Harold330e1082017-01-12 18:38:57 -0800183 }
184
Di Lu0b611f42018-01-11 11:35:25 -0800185 public int getMarkValue() {
186 return mMarkValue;
187 }
188
189 public int getMarkMask() {
190 return mMarkMask;
191 }
192
Nathan Harold330e1082017-01-12 18:38:57 -0800193 // Parcelable Methods
194
195 @Override
196 public int describeContents() {
197 return 0;
198 }
199
200 @Override
201 public void writeToParcel(Parcel out, int flags) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700202 out.writeInt(mMode);
Nathan Harolda2523312018-01-05 19:25:13 -0800203 out.writeString(mSourceAddress);
204 out.writeString(mDestinationAddress);
Nathan Harolda10003d2017-08-23 13:46:33 -0700205 out.writeParcelable(mNetwork, flags);
Nathan Harolda2523312018-01-05 19:25:13 -0800206 out.writeInt(mSpiResourceId);
207 out.writeParcelable(mEncryption, flags);
208 out.writeParcelable(mAuthentication, flags);
209 out.writeParcelable(mAuthenticatedEncryption, flags);
Nathan Harolda10003d2017-08-23 13:46:33 -0700210 out.writeInt(mEncapType);
211 out.writeInt(mEncapSocketResourceId);
212 out.writeInt(mEncapRemotePort);
Nathan Harold19ce70b2017-09-25 19:33:13 -0700213 out.writeInt(mNattKeepaliveInterval);
Di Lu0b611f42018-01-11 11:35:25 -0800214 out.writeInt(mMarkValue);
215 out.writeInt(mMarkMask);
Nathan Harold330e1082017-01-12 18:38:57 -0800216 }
217
Nathan Harolda10003d2017-08-23 13:46:33 -0700218 @VisibleForTesting
219 public IpSecConfig() {}
Nathan Harold330e1082017-01-12 18:38:57 -0800220
Benedict Wong9dd3a382018-02-06 20:43:21 -0800221 /** Copy constructor */
222 @VisibleForTesting
223 public IpSecConfig(IpSecConfig c) {
224 mMode = c.mMode;
225 mSourceAddress = c.mSourceAddress;
226 mDestinationAddress = c.mDestinationAddress;
227 mNetwork = c.mNetwork;
228 mSpiResourceId = c.mSpiResourceId;
229 mEncryption = c.mEncryption;
230 mAuthentication = c.mAuthentication;
231 mAuthenticatedEncryption = c.mAuthenticatedEncryption;
232 mEncapType = c.mEncapType;
233 mEncapSocketResourceId = c.mEncapSocketResourceId;
234 mEncapRemotePort = c.mEncapRemotePort;
235 mNattKeepaliveInterval = c.mNattKeepaliveInterval;
236 mMarkValue = c.mMarkValue;
237 mMarkMask = c.mMarkMask;
238 }
239
Nathan Harold330e1082017-01-12 18:38:57 -0800240 private IpSecConfig(Parcel in) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700241 mMode = in.readInt();
Nathan Harolda2523312018-01-05 19:25:13 -0800242 mSourceAddress = in.readString();
243 mDestinationAddress = in.readString();
Nathan Harolda10003d2017-08-23 13:46:33 -0700244 mNetwork = (Network) in.readParcelable(Network.class.getClassLoader());
Nathan Harolda2523312018-01-05 19:25:13 -0800245 mSpiResourceId = in.readInt();
246 mEncryption =
Nathan Harold330e1082017-01-12 18:38:57 -0800247 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda2523312018-01-05 19:25:13 -0800248 mAuthentication =
Nathan Harold330e1082017-01-12 18:38:57 -0800249 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda2523312018-01-05 19:25:13 -0800250 mAuthenticatedEncryption =
Benedict Wong0febe5e2017-08-22 21:42:33 -0700251 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda10003d2017-08-23 13:46:33 -0700252 mEncapType = in.readInt();
253 mEncapSocketResourceId = in.readInt();
254 mEncapRemotePort = in.readInt();
Nathan Harold19ce70b2017-09-25 19:33:13 -0700255 mNattKeepaliveInterval = in.readInt();
Di Lu0b611f42018-01-11 11:35:25 -0800256 mMarkValue = in.readInt();
257 mMarkMask = in.readInt();
Nathan Harold330e1082017-01-12 18:38:57 -0800258 }
259
ludib0c95b12017-05-22 10:52:23 -0700260 @Override
261 public String toString() {
262 StringBuilder strBuilder = new StringBuilder();
263 strBuilder
Nathan Harolda10003d2017-08-23 13:46:33 -0700264 .append("{mMode=")
265 .append(mMode == IpSecTransform.MODE_TUNNEL ? "TUNNEL" : "TRANSPORT")
Nathan Harolda2523312018-01-05 19:25:13 -0800266 .append(", mSourceAddress=")
267 .append(mSourceAddress)
268 .append(", mDestinationAddress=")
269 .append(mDestinationAddress)
Nathan Harolda10003d2017-08-23 13:46:33 -0700270 .append(", mNetwork=")
271 .append(mNetwork)
272 .append(", mEncapType=")
273 .append(mEncapType)
274 .append(", mEncapSocketResourceId=")
275 .append(mEncapSocketResourceId)
276 .append(", mEncapRemotePort=")
277 .append(mEncapRemotePort)
278 .append(", mNattKeepaliveInterval=")
279 .append(mNattKeepaliveInterval)
Nathan Harolda2523312018-01-05 19:25:13 -0800280 .append("{mSpiResourceId=")
281 .append(mSpiResourceId)
282 .append(", mEncryption=")
283 .append(mEncryption)
284 .append(", mAuthentication=")
285 .append(mAuthentication)
286 .append(", mAuthenticatedEncryption=")
287 .append(mAuthenticatedEncryption)
Di Lu0b611f42018-01-11 11:35:25 -0800288 .append(", mMarkValue=")
289 .append(mMarkValue)
290 .append(", mMarkMask=")
291 .append(mMarkMask)
ludib0c95b12017-05-22 10:52:23 -0700292 .append("}");
293
294 return strBuilder.toString();
295 }
296
Nathan Harold330e1082017-01-12 18:38:57 -0800297 public static final Parcelable.Creator<IpSecConfig> CREATOR =
298 new Parcelable.Creator<IpSecConfig>() {
299 public IpSecConfig createFromParcel(Parcel in) {
300 return new IpSecConfig(in);
301 }
302
303 public IpSecConfig[] newArray(int size) {
304 return new IpSecConfig[size];
305 }
306 };
Nathan Harold19ce70b2017-09-25 19:33:13 -0700307
308 @VisibleForTesting
Nathan Haroldd6f50b22017-10-04 12:58:55 -0700309 /** Equals method used for testing */
Nathan Harold19ce70b2017-09-25 19:33:13 -0700310 public static boolean equals(IpSecConfig lhs, IpSecConfig rhs) {
311 if (lhs == null || rhs == null) return (lhs == rhs);
312 return (lhs.mMode == rhs.mMode
Nathan Harolda2523312018-01-05 19:25:13 -0800313 && lhs.mSourceAddress.equals(rhs.mSourceAddress)
314 && lhs.mDestinationAddress.equals(rhs.mDestinationAddress)
Nathan Harold19ce70b2017-09-25 19:33:13 -0700315 && ((lhs.mNetwork != null && lhs.mNetwork.equals(rhs.mNetwork))
316 || (lhs.mNetwork == rhs.mNetwork))
317 && lhs.mEncapType == rhs.mEncapType
318 && lhs.mEncapSocketResourceId == rhs.mEncapSocketResourceId
319 && lhs.mEncapRemotePort == rhs.mEncapRemotePort
320 && lhs.mNattKeepaliveInterval == rhs.mNattKeepaliveInterval
Nathan Harolda2523312018-01-05 19:25:13 -0800321 && lhs.mSpiResourceId == rhs.mSpiResourceId
322 && IpSecAlgorithm.equals(lhs.mEncryption, rhs.mEncryption)
323 && IpSecAlgorithm.equals(
324 lhs.mAuthenticatedEncryption, rhs.mAuthenticatedEncryption)
Di Lu0b611f42018-01-11 11:35:25 -0800325 && IpSecAlgorithm.equals(lhs.mAuthentication, rhs.mAuthentication)
326 && lhs.mMarkValue == rhs.mMarkValue
327 && lhs.mMarkMask == rhs.mMarkMask);
Nathan Harold19ce70b2017-09-25 19:33:13 -0700328 }
Nathan Harold330e1082017-01-12 18:38:57 -0800329}