blob: 61b13a922dd4025375c4746f57d3874a047bf431 [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
23/** @hide */
24public final class IpSecConfig implements Parcelable {
Nathan Harold93962f32017-03-07 13:23:36 -080025 private static final String TAG = "IpSecConfig";
Nathan Harold330e1082017-01-12 18:38:57 -080026
Nathan Harolda10003d2017-08-23 13:46:33 -070027 // MODE_TRANSPORT or MODE_TUNNEL
28 private int mMode = IpSecTransform.MODE_TRANSPORT;
Nathan Harold330e1082017-01-12 18:38:57 -080029
Nathan Harolda10003d2017-08-23 13:46:33 -070030 // Needs to be valid only for tunnel mode
31 // Preventing this from being null simplifies Java->Native binder
32 private String mLocalAddress = "";
Nathan Harold330e1082017-01-12 18:38:57 -080033
Nathan Harolda10003d2017-08-23 13:46:33 -070034 // Preventing this from being null simplifies Java->Native binder
35 private String mRemoteAddress = "";
Nathan Harold330e1082017-01-12 18:38:57 -080036
Nathan Haroldd6f50b22017-10-04 12:58:55 -070037 // The underlying Network that represents the "gateway" Network
Nathan Harolda10003d2017-08-23 13:46:33 -070038 // for outbound packets. It may also be used to select packets.
39 private Network mNetwork;
Nathan Harold330e1082017-01-12 18:38:57 -080040
41 public static class Flow {
42 // Minimum requirements for identifying a transform
43 // SPI identifying the IPsec flow in packet processing
44 // and a remote IP address
Nathan Harolda10003d2017-08-23 13:46:33 -070045 private int mSpiResourceId = IpSecManager.INVALID_RESOURCE_ID;
Nathan Harold330e1082017-01-12 18:38:57 -080046
47 // Encryption Algorithm
Nathan Harolda10003d2017-08-23 13:46:33 -070048 private IpSecAlgorithm mEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -080049
50 // Authentication Algorithm
Nathan Harolda10003d2017-08-23 13:46:33 -070051 private IpSecAlgorithm mAuthentication;
ludib0c95b12017-05-22 10:52:23 -070052
Benedict Wong0febe5e2017-08-22 21:42:33 -070053 // Authenticated Encryption Algorithm
54 private IpSecAlgorithm mAuthenticatedEncryption;
55
ludib0c95b12017-05-22 10:52:23 -070056 @Override
57 public String toString() {
58 return new StringBuilder()
Nathan Harolda10003d2017-08-23 13:46:33 -070059 .append("{mSpiResourceId=")
60 .append(mSpiResourceId)
61 .append(", mEncryption=")
62 .append(mEncryption)
63 .append(", mAuthentication=")
64 .append(mAuthentication)
Benedict Wong0febe5e2017-08-22 21:42:33 -070065 .append(", mAuthenticatedEncryption=")
66 .append(mAuthenticatedEncryption)
ludib0c95b12017-05-22 10:52:23 -070067 .append("}")
68 .toString();
69 }
Nathan Harold19ce70b2017-09-25 19:33:13 -070070
71 static boolean equals(IpSecConfig.Flow lhs, IpSecConfig.Flow rhs) {
72 if (lhs == null || rhs == null) return (lhs == rhs);
73 return (lhs.mSpiResourceId == rhs.mSpiResourceId
74 && IpSecAlgorithm.equals(lhs.mEncryption, rhs.mEncryption)
75 && IpSecAlgorithm.equals(lhs.mAuthentication, rhs.mAuthentication));
76 }
Nathan Harold330e1082017-01-12 18:38:57 -080077 }
78
Nathan Harolda10003d2017-08-23 13:46:33 -070079 private final Flow[] mFlow = new Flow[] {new Flow(), new Flow()};
Nathan Harold330e1082017-01-12 18:38:57 -080080
81 // For tunnel mode IPv4 UDP Encapsulation
82 // IpSecTransform#ENCAP_ESP_*, such as ENCAP_ESP_OVER_UDP_IKE
Nathan Harolda10003d2017-08-23 13:46:33 -070083 private int mEncapType = IpSecTransform.ENCAP_NONE;
84 private int mEncapSocketResourceId = IpSecManager.INVALID_RESOURCE_ID;
85 private int mEncapRemotePort;
Nathan Harold330e1082017-01-12 18:38:57 -080086
Nathan Harold330e1082017-01-12 18:38:57 -080087 // An interval, in seconds between the NattKeepalive packets
Nathan Harolda10003d2017-08-23 13:46:33 -070088 private int mNattKeepaliveInterval;
89
90 /** Set the mode for this IPsec transform */
91 public void setMode(int mode) {
92 mMode = mode;
93 }
94
95 /** Set the local IP address for Tunnel mode */
96 public void setLocalAddress(String localAddress) {
97 if (localAddress == null) {
98 throw new IllegalArgumentException("localAddress may not be null!");
99 }
100 mLocalAddress = localAddress;
101 }
102
103 /** Set the remote IP address for this IPsec transform */
104 public void setRemoteAddress(String remoteAddress) {
105 if (remoteAddress == null) {
106 throw new IllegalArgumentException("remoteAddress may not be null!");
107 }
108 mRemoteAddress = remoteAddress;
109 }
110
111 /** Set the SPI for a given direction by resource ID */
112 public void setSpiResourceId(int direction, int resourceId) {
113 mFlow[direction].mSpiResourceId = resourceId;
114 }
115
116 /** Set the encryption algorithm for a given direction */
117 public void setEncryption(int direction, IpSecAlgorithm encryption) {
118 mFlow[direction].mEncryption = encryption;
119 }
120
121 /** Set the authentication algorithm for a given direction */
122 public void setAuthentication(int direction, IpSecAlgorithm authentication) {
123 mFlow[direction].mAuthentication = authentication;
124 }
125
Benedict Wong0febe5e2017-08-22 21:42:33 -0700126 /** Set the authenticated encryption algorithm for a given direction */
127 public void setAuthenticatedEncryption(int direction, IpSecAlgorithm authenticatedEncryption) {
128 mFlow[direction].mAuthenticatedEncryption = authenticatedEncryption;
129 }
130
Nathan Harolda10003d2017-08-23 13:46:33 -0700131 public void setNetwork(Network network) {
132 mNetwork = network;
133 }
134
135 public void setEncapType(int encapType) {
136 mEncapType = encapType;
137 }
138
139 public void setEncapSocketResourceId(int resourceId) {
140 mEncapSocketResourceId = resourceId;
141 }
142
143 public void setEncapRemotePort(int port) {
144 mEncapRemotePort = port;
145 }
146
147 public void setNattKeepaliveInterval(int interval) {
148 mNattKeepaliveInterval = interval;
149 }
Nathan Harold330e1082017-01-12 18:38:57 -0800150
Nathan Harold93962f32017-03-07 13:23:36 -0800151 // Transport or Tunnel
152 public int getMode() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700153 return mMode;
Nathan Harold93962f32017-03-07 13:23:36 -0800154 }
155
Nathan Harolda10003d2017-08-23 13:46:33 -0700156 public String getLocalAddress() {
157 return mLocalAddress;
Nathan Harold330e1082017-01-12 18:38:57 -0800158 }
159
Nathan Harold8dc1fd02017-04-04 19:37:48 -0700160 public int getSpiResourceId(int direction) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700161 return mFlow[direction].mSpiResourceId;
Nathan Harold330e1082017-01-12 18:38:57 -0800162 }
163
Nathan Harolda10003d2017-08-23 13:46:33 -0700164 public String getRemoteAddress() {
165 return mRemoteAddress;
Nathan Harold330e1082017-01-12 18:38:57 -0800166 }
167
Nathan Harold93962f32017-03-07 13:23:36 -0800168 public IpSecAlgorithm getEncryption(int direction) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700169 return mFlow[direction].mEncryption;
Nathan Harold330e1082017-01-12 18:38:57 -0800170 }
171
Nathan Harold93962f32017-03-07 13:23:36 -0800172 public IpSecAlgorithm getAuthentication(int direction) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700173 return mFlow[direction].mAuthentication;
Nathan Harold330e1082017-01-12 18:38:57 -0800174 }
175
Benedict Wong0febe5e2017-08-22 21:42:33 -0700176 public IpSecAlgorithm getAuthenticatedEncryption(int direction) {
177 return mFlow[direction].mAuthenticatedEncryption;
178 }
179
Nathan Harold93962f32017-03-07 13:23:36 -0800180 public Network getNetwork() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700181 return mNetwork;
Nathan Harold330e1082017-01-12 18:38:57 -0800182 }
183
184 public int getEncapType() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700185 return mEncapType;
Nathan Harold330e1082017-01-12 18:38:57 -0800186 }
187
Nathan Harolda10003d2017-08-23 13:46:33 -0700188 public int getEncapSocketResourceId() {
189 return mEncapSocketResourceId;
Nathan Harold330e1082017-01-12 18:38:57 -0800190 }
191
192 public int getEncapRemotePort() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700193 return mEncapRemotePort;
Nathan Harold330e1082017-01-12 18:38:57 -0800194 }
195
Nathan Harold93962f32017-03-07 13:23:36 -0800196 public int getNattKeepaliveInterval() {
Nathan Harolda10003d2017-08-23 13:46:33 -0700197 return mNattKeepaliveInterval;
Nathan Harold330e1082017-01-12 18:38:57 -0800198 }
199
Nathan Harold330e1082017-01-12 18:38:57 -0800200 // Parcelable Methods
201
202 @Override
203 public int describeContents() {
204 return 0;
205 }
206
207 @Override
208 public void writeToParcel(Parcel out, int flags) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700209 out.writeInt(mMode);
210 out.writeString(mLocalAddress);
211 out.writeString(mRemoteAddress);
212 out.writeParcelable(mNetwork, flags);
213 out.writeInt(mFlow[IpSecTransform.DIRECTION_IN].mSpiResourceId);
214 out.writeParcelable(mFlow[IpSecTransform.DIRECTION_IN].mEncryption, flags);
215 out.writeParcelable(mFlow[IpSecTransform.DIRECTION_IN].mAuthentication, flags);
Benedict Wong0febe5e2017-08-22 21:42:33 -0700216 out.writeParcelable(mFlow[IpSecTransform.DIRECTION_IN].mAuthenticatedEncryption, flags);
Nathan Harolda10003d2017-08-23 13:46:33 -0700217 out.writeInt(mFlow[IpSecTransform.DIRECTION_OUT].mSpiResourceId);
218 out.writeParcelable(mFlow[IpSecTransform.DIRECTION_OUT].mEncryption, flags);
219 out.writeParcelable(mFlow[IpSecTransform.DIRECTION_OUT].mAuthentication, flags);
Benedict Wong0febe5e2017-08-22 21:42:33 -0700220 out.writeParcelable(mFlow[IpSecTransform.DIRECTION_OUT].mAuthenticatedEncryption, flags);
Nathan Harolda10003d2017-08-23 13:46:33 -0700221 out.writeInt(mEncapType);
222 out.writeInt(mEncapSocketResourceId);
223 out.writeInt(mEncapRemotePort);
Nathan Harold19ce70b2017-09-25 19:33:13 -0700224 out.writeInt(mNattKeepaliveInterval);
Nathan Harold330e1082017-01-12 18:38:57 -0800225 }
226
Nathan Harolda10003d2017-08-23 13:46:33 -0700227 @VisibleForTesting
228 public IpSecConfig() {}
Nathan Harold330e1082017-01-12 18:38:57 -0800229
230 private IpSecConfig(Parcel in) {
Nathan Harolda10003d2017-08-23 13:46:33 -0700231 mMode = in.readInt();
232 mLocalAddress = in.readString();
233 mRemoteAddress = in.readString();
234 mNetwork = (Network) in.readParcelable(Network.class.getClassLoader());
235 mFlow[IpSecTransform.DIRECTION_IN].mSpiResourceId = in.readInt();
236 mFlow[IpSecTransform.DIRECTION_IN].mEncryption =
Nathan Harold330e1082017-01-12 18:38:57 -0800237 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda10003d2017-08-23 13:46:33 -0700238 mFlow[IpSecTransform.DIRECTION_IN].mAuthentication =
Nathan Harold330e1082017-01-12 18:38:57 -0800239 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Benedict Wong0febe5e2017-08-22 21:42:33 -0700240 mFlow[IpSecTransform.DIRECTION_IN].mAuthenticatedEncryption =
241 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda10003d2017-08-23 13:46:33 -0700242 mFlow[IpSecTransform.DIRECTION_OUT].mSpiResourceId = in.readInt();
243 mFlow[IpSecTransform.DIRECTION_OUT].mEncryption =
Nathan Harold330e1082017-01-12 18:38:57 -0800244 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda10003d2017-08-23 13:46:33 -0700245 mFlow[IpSecTransform.DIRECTION_OUT].mAuthentication =
Nathan Harold330e1082017-01-12 18:38:57 -0800246 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Benedict Wong0febe5e2017-08-22 21:42:33 -0700247 mFlow[IpSecTransform.DIRECTION_OUT].mAuthenticatedEncryption =
248 (IpSecAlgorithm) in.readParcelable(IpSecAlgorithm.class.getClassLoader());
Nathan Harolda10003d2017-08-23 13:46:33 -0700249 mEncapType = in.readInt();
250 mEncapSocketResourceId = in.readInt();
251 mEncapRemotePort = in.readInt();
Nathan Harold19ce70b2017-09-25 19:33:13 -0700252 mNattKeepaliveInterval = in.readInt();
Nathan Harold330e1082017-01-12 18:38:57 -0800253 }
254
ludib0c95b12017-05-22 10:52:23 -0700255 @Override
256 public String toString() {
257 StringBuilder strBuilder = new StringBuilder();
258 strBuilder
Nathan Harolda10003d2017-08-23 13:46:33 -0700259 .append("{mMode=")
260 .append(mMode == IpSecTransform.MODE_TUNNEL ? "TUNNEL" : "TRANSPORT")
261 .append(", mLocalAddress=")
262 .append(mLocalAddress)
263 .append(", mRemoteAddress=")
264 .append(mRemoteAddress)
265 .append(", mNetwork=")
266 .append(mNetwork)
267 .append(", mEncapType=")
268 .append(mEncapType)
269 .append(", mEncapSocketResourceId=")
270 .append(mEncapSocketResourceId)
271 .append(", mEncapRemotePort=")
272 .append(mEncapRemotePort)
273 .append(", mNattKeepaliveInterval=")
274 .append(mNattKeepaliveInterval)
275 .append(", mFlow[OUT]=")
276 .append(mFlow[IpSecTransform.DIRECTION_OUT])
277 .append(", mFlow[IN]=")
278 .append(mFlow[IpSecTransform.DIRECTION_IN])
ludib0c95b12017-05-22 10:52:23 -0700279 .append("}");
280
281 return strBuilder.toString();
282 }
283
Nathan Harold330e1082017-01-12 18:38:57 -0800284 public static final Parcelable.Creator<IpSecConfig> CREATOR =
285 new Parcelable.Creator<IpSecConfig>() {
286 public IpSecConfig createFromParcel(Parcel in) {
287 return new IpSecConfig(in);
288 }
289
290 public IpSecConfig[] newArray(int size) {
291 return new IpSecConfig[size];
292 }
293 };
Nathan Harold19ce70b2017-09-25 19:33:13 -0700294
295 @VisibleForTesting
Nathan Haroldd6f50b22017-10-04 12:58:55 -0700296 /** Equals method used for testing */
Nathan Harold19ce70b2017-09-25 19:33:13 -0700297 public static boolean equals(IpSecConfig lhs, IpSecConfig rhs) {
298 if (lhs == null || rhs == null) return (lhs == rhs);
299 return (lhs.mMode == rhs.mMode
300 && lhs.mLocalAddress.equals(rhs.mLocalAddress)
301 && lhs.mRemoteAddress.equals(rhs.mRemoteAddress)
302 && ((lhs.mNetwork != null && lhs.mNetwork.equals(rhs.mNetwork))
303 || (lhs.mNetwork == rhs.mNetwork))
304 && lhs.mEncapType == rhs.mEncapType
305 && lhs.mEncapSocketResourceId == rhs.mEncapSocketResourceId
306 && lhs.mEncapRemotePort == rhs.mEncapRemotePort
307 && lhs.mNattKeepaliveInterval == rhs.mNattKeepaliveInterval
308 && IpSecConfig.Flow.equals(lhs.mFlow[IpSecTransform.DIRECTION_OUT],
309 rhs.mFlow[IpSecTransform.DIRECTION_OUT])
310 && IpSecConfig.Flow.equals(lhs.mFlow[IpSecTransform.DIRECTION_IN],
311 rhs.mFlow[IpSecTransform.DIRECTION_IN]));
312 }
Nathan Harold330e1082017-01-12 18:38:57 -0800313}