196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne/*
296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Copyright (C) 2017 The Android Open Source Project
396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne *
496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Licensed under the Apache License, Version 2.0 (the "License");
596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * you may not use this file except in compliance with the License.
696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * You may obtain a copy of the License at
796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne *
896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne *      http://www.apache.org/licenses/LICENSE-2.0
996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne *
1096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Unless required by applicable law or agreed to in writing, software
1196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * distributed under the License is distributed on an "AS IS" BASIS,
1296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * See the License for the specific language governing permissions and
1496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * limitations under the License.
1596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */
1696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhnepackage com.android.server.wifi;
1796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
18c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Piusimport android.content.Context;
1996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork;
2096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetworkCallback;
2196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatus;
2296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode;
2366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.net.wifi.WifiConfiguration;
2466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.net.wifi.WifiEnterpriseConfig;
2596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.os.RemoteException;
2666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.text.TextUtils;
2796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.util.Log;
2896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.util.MutableBoolean;
2996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
30c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Piusimport com.android.internal.R;
3166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport com.android.internal.annotations.VisibleForTesting;
3266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport com.android.internal.util.ArrayUtils;
332104cc5eaf4ed7b9047ca1de460838a8ca6d0fe1Roshan Piusimport com.android.server.wifi.util.NativeUtil;
3466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
35b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusimport org.json.JSONException;
36b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusimport org.json.JSONObject;
37b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
38b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusimport java.io.UnsupportedEncodingException;
39b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusimport java.net.URLDecoder;
40b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusimport java.net.URLEncoder;
4196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport java.util.ArrayList;
4266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport java.util.BitSet;
4366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport java.util.HashMap;
44b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Piusimport java.util.Iterator;
4566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport java.util.Map;
46445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Piusimport java.util.regex.Matcher;
47445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Piusimport java.util.regex.Pattern;
48445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius
49c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Piusimport javax.annotation.concurrent.ThreadSafe;
50c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius
51c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius
5296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne/**
5396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Wrapper class for ISupplicantStaNetwork HAL calls. Gets and sets supplicant sta network variables
5496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * and interacts with networks.
5596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Public fields should be treated as invalid until their 'get' method is called, which will set the
5696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * value if it returns true
57c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius * To maintain thread-safety, the locking protocol is that every non-static method (regardless of
58c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius * access level) acquires mLock.
5996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */
60c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius@ThreadSafe
6196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhnepublic class SupplicantStaNetworkHal {
6296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private static final String TAG = "SupplicantStaNetworkHal";
6366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    @VisibleForTesting
6466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public static final String ID_STRING_KEY_FQDN = "fqdn";
6566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    @VisibleForTesting
6666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public static final String ID_STRING_KEY_CREATOR_UID = "creatorUid";
6766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    @VisibleForTesting
6866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public static final String ID_STRING_KEY_CONFIG_KEY = "configKey";
6996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
70445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
71445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Regex pattern for extracting the GSM sim authentication response params from a string.
72dd685b34596b790c76e2cc03fc825c1249c9174fRoshan Pius     * Matches a strings like the following: "[:<kc_value>:<sres_value>]";
73445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
74445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    private static final Pattern GSM_AUTH_RESPONSE_PARAMS_PATTERN =
75dd685b34596b790c76e2cc03fc825c1249c9174fRoshan Pius            Pattern.compile(":([0-9a-fA-F]+):([0-9a-fA-F]+)");
76445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
77445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Regex pattern for extracting the UMTS sim authentication response params from a string.
78dd685b34596b790c76e2cc03fc825c1249c9174fRoshan Pius     * Matches a strings like the following: ":<ik_value>:<ck_value>:<res_value>";
79445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
80445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    private static final Pattern UMTS_AUTH_RESPONSE_PARAMS_PATTERN =
81dd685b34596b790c76e2cc03fc825c1249c9174fRoshan Pius            Pattern.compile("^:([0-9a-fA-F]+):([0-9a-fA-F]+):([0-9a-fA-F]+)$");
82445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
83445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Regex pattern for extracting the UMTS sim auts response params from a string.
84445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Matches a strings like the following: ":<auts_value>";
85445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
865f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius    private static final Pattern UMTS_AUTS_RESPONSE_PARAMS_PATTERN =
875f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius            Pattern.compile("^:([0-9a-fA-F]+)$");
88445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius
8996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private final Object mLock = new Object();
9003fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius    private final String mIfaceName;
91c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    private final WifiMonitor mWifiMonitor;
9203fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius    private ISupplicantStaNetwork mISupplicantStaNetwork;
93b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius    private ISupplicantStaNetworkCallback mISupplicantStaNetworkCallback;
9403fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius
95511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius    private boolean mVerboseLoggingEnabled = false;
96c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    // Indicates whether the system is capable of 802.11r fast BSS transition.
97c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    private boolean mSystemSupportsFastBssTransition = false;
98c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius
99c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    // Network variables read from wpa_supplicant.
10066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private int mNetworkId;
10166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private ArrayList<Byte> mSsid;
10266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private byte[/* 6 */] mBssid;
10396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean mScanSsid;
10496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mKeyMgmtMask;
10596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mProtoMask;
10696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mAuthAlgMask;
10796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mGroupCipherMask;
10896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mPairwiseCipherMask;
10996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mPskPassphrase;
110f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    private byte[] mPsk;
11196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private ArrayList<Byte> mWepKey;
11296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mWepTxKeyIdx;
11396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean mRequirePmf;
11464950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius    private String mIdStr;
11596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mEapMethod;
11696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int mEapPhase2Method;
11796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private ArrayList<Byte> mEapIdentity;
11896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private ArrayList<Byte> mEapAnonymousIdentity;
11996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private ArrayList<Byte> mEapPassword;
12096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapCACert;
12196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapCAPath;
12296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapClientCert;
1231f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius    private String mEapPrivateKeyId;
12496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapSubjectMatch;
12596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapAltSubjectMatch;
12696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean mEapEngine;
12796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapEngineID;
12896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String mEapDomainSuffixMatch;
12996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
13003fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius    SupplicantStaNetworkHal(ISupplicantStaNetwork iSupplicantStaNetwork, String ifaceName,
131c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                            Context context, WifiMonitor monitor) {
13296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        mISupplicantStaNetwork = iSupplicantStaNetwork;
13303fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius        mIfaceName = ifaceName;
134c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius        mWifiMonitor = monitor;
135c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius        mSystemSupportsFastBssTransition =
136c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                context.getResources().getBoolean(R.bool.config_wifi_fast_bss_transition_enabled);
13766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
13866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
13966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
140511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius     * Enable/Disable verbose logging.
141511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius     *
142511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius     * @param enable true to enable, false to disable.
143511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius     */
144511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius    void enableVerboseLogging(boolean enable) {
145c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
146c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            mVerboseLoggingEnabled = enable;
147c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        }
148511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius    }
149511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius
150511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius    /**
15166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * Read network variables from wpa_supplicant into the provided WifiConfiguration object.
15266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     *
15366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param config        WifiConfiguration object to be populated.
15466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param networkExtras Map of network extras parsed from wpa_supplicant.
15566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @return true if succeeds, false otherwise.
15645a984619e338090981499e4823e0177649e3c28Roshan Pius     * @throws IllegalArgumentException on malformed configuration params.
15766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
15866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public boolean loadWifiConfiguration(WifiConfiguration config,
15966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                                         Map<String, String> networkExtras) {
160c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
161c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config == null) return false;
162c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** SSID */
163c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.SSID = null;
164c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getSsid() && !ArrayUtils.isEmpty(mSsid)) {
165c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.SSID = NativeUtil.encodeSsid(mSsid);
166c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else {
167c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to read ssid");
168c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
169c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
170c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Network Id */
171c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.networkId = -1;
172c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getId()) {
173c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.networkId = mNetworkId;
174c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else {
175c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "getId failed");
176c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
177c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
178c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** BSSID */
179c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.getNetworkSelectionStatus().setNetworkSelectionBSSID(null);
180c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getBssid() && !ArrayUtils.isEmpty(mBssid)) {
181c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionBSSID(
182c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        NativeUtil.macAddressFromByteArray(mBssid));
183c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
184c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Scan SSID (Is Hidden Network?) */
185c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.hiddenSSID = false;
186c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getScanSsid()) {
187c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.hiddenSSID = mScanSsid;
188c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
189c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Require PMF*/
190c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.requirePMF = false;
191c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getRequirePmf()) {
192c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.requirePMF = mRequirePmf;
193c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
194c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** WEP keys **/
195c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.wepTxKeyIndex = -1;
196c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getWepTxKeyIdx()) {
197c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.wepTxKeyIndex = mWepTxKeyIdx;
198c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
199c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            for (int i = 0; i < 4; i++) {
200c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.wepKeys[i] = null;
201c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (getWepKey(i) && !ArrayUtils.isEmpty(mWepKey)) {
202e5f9b2bbc9f9c5f34d6ad9d290bfb63e48b79587Roshan Pius                    config.wepKeys[i] = NativeUtil.bytesToHexOrQuotedString(mWepKey);
203c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
204c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
205c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** PSK pass phrase */
206c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            config.preSharedKey = null;
207c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getPskPassphrase() && !TextUtils.isEmpty(mPskPassphrase)) {
208c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.preSharedKey = NativeUtil.addEnclosingQuotes(mPskPassphrase);
209c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else if (getPsk() && !ArrayUtils.isEmpty(mPsk)) {
210c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.preSharedKey = NativeUtil.hexStringFromByteArray(mPsk);
211c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
212c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** allowedKeyManagement */
213c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getKeyMgmt()) {
214c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                BitSet keyMgmtMask = supplicantToWifiConfigurationKeyMgmtMask(mKeyMgmtMask);
215c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.allowedKeyManagement = removeFastTransitionFlags(keyMgmtMask);
216c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
217c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** allowedProtocols */
218c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getProto()) {
219c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.allowedProtocols =
220c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        supplicantToWifiConfigurationProtoMask(mProtoMask);
221c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
222c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** allowedAuthAlgorithms */
223c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getAuthAlg()) {
224c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.allowedAuthAlgorithms =
225c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        supplicantToWifiConfigurationAuthAlgMask(mAuthAlgMask);
226c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
227c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** allowedGroupCiphers */
228c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getGroupCipher()) {
229c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.allowedGroupCiphers =
230c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        supplicantToWifiConfigurationGroupCipherMask(mGroupCipherMask);
231c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
232c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** allowedPairwiseCiphers */
233c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getPairwiseCipher()) {
234c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                config.allowedPairwiseCiphers =
235c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        supplicantToWifiConfigurationPairwiseCipherMask(mPairwiseCipherMask);
236c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
237c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** metadata: idstr */
238c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getIdStr() && !TextUtils.isEmpty(mIdStr)) {
239c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Map<String, String> metadata = parseNetworkExtra(mIdStr);
240c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                networkExtras.putAll(metadata);
241c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else {
242c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.w(TAG, "getIdStr failed or empty");
243c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
244c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return loadWifiEnterpriseConfig(config.SSID, config.enterpriseConfig);
245c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        }
24666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
24766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
24866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
24966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * Save an entire WifiConfiguration to wpa_supplicant via HIDL.
25066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     *
25166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param config WifiConfiguration object to be saved.
25266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @return true if succeeds, false otherwise.
25345a984619e338090981499e4823e0177649e3c28Roshan Pius     * @throws IllegalArgumentException on malformed configuration params.
25466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
25566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public boolean saveWifiConfiguration(WifiConfiguration config) {
256c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
257c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config == null) return false;
258c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** SSID */
259c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.SSID != null) {
260c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!setSsid(NativeUtil.decodeSsid(config.SSID))) {
261c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "failed to set SSID: " + config.SSID);
262f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                    return false;
263f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                }
264c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
265c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** BSSID */
266c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            String bssidStr = config.getNetworkSelectionStatus().getNetworkSelectionBSSID();
267c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (bssidStr != null) {
268c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                byte[] bssid = NativeUtil.macAddressToByteArray(bssidStr);
269c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!setBssid(bssid)) {
270c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "failed to set BSSID: " + bssidStr);
271f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                    return false;
272f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                }
273f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            }
274c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Pre Shared Key */
275c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            // This can either be quoted ASCII passphrase or hex string for raw psk.
276c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.preSharedKey != null) {
277c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (config.preSharedKey.startsWith("\"")) {
278c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    if (!setPskPassphrase(NativeUtil.removeEnclosingQuotes(config.preSharedKey))) {
279c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        Log.e(TAG, "failed to set psk passphrase");
280c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        return false;
281c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    }
282c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                } else {
283c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    if (!setPsk(NativeUtil.hexStringToByteArray(config.preSharedKey))) {
284c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        Log.e(TAG, "failed to set psk");
28566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                        return false;
28666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    }
28766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                }
28866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
289c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius
290c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Wep Keys */
291c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            boolean hasSetKey = false;
292c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.wepKeys != null) {
293c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                for (int i = 0; i < config.wepKeys.length; i++) {
294c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    if (config.wepKeys[i] != null) {
295c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        if (!setWepKey(
296e5f9b2bbc9f9c5f34d6ad9d290bfb63e48b79587Roshan Pius                                i, NativeUtil.hexOrQuotedStringToBytes(config.wepKeys[i]))) {
297c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                            Log.e(TAG, "failed to set wep_key " + i);
298c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                            return false;
299c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        }
300c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        hasSetKey = true;
301c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    }
302c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
303c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
304c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Wep Tx Key Idx */
305c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (hasSetKey) {
306c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!setWepTxKeyIdx(config.wepTxKeyIndex)) {
307c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "failed to set wep_tx_keyidx: " + config.wepTxKeyIndex);
308c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
309c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
310c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
311c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** HiddenSSID */
312c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!setScanSsid(config.hiddenSSID)) {
313c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, config.SSID + ": failed to set hiddenSSID: " + config.hiddenSSID);
31466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return false;
31566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
316c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** RequirePMF */
317c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!setRequirePmf(config.requirePMF)) {
318c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, config.SSID + ": failed to set requirePMF: " + config.requirePMF);
319c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                return false;
320c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius            }
321c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Key Management Scheme */
322c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.allowedKeyManagement.cardinality() != 0) {
323c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                // Add FT flags if supported.
324c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                BitSet keyMgmtMask = addFastTransitionFlags(config.allowedKeyManagement);
325c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!setKeyMgmt(wifiConfigurationToSupplicantKeyMgmtMask(keyMgmtMask))) {
326c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "failed to set Key Management");
327c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
328c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
329c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
330c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Security Protocol */
331c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.allowedProtocols.cardinality() != 0
332c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setProto(wifiConfigurationToSupplicantProtoMask(config.allowedProtocols))) {
333c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to set Security Protocol");
334c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                return false;
335c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            }
336c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Auth Algorithm */
337c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.allowedAuthAlgorithms.cardinality() != 0
338c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setAuthAlg(wifiConfigurationToSupplicantAuthAlgMask(
339c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    config.allowedAuthAlgorithms))) {
340c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to set AuthAlgorithm");
341c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
342c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
343c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Group Cipher */
344c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.allowedGroupCiphers.cardinality() != 0
345c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setGroupCipher(wifiConfigurationToSupplicantGroupCipherMask(
346c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    config.allowedGroupCiphers))) {
347c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to set Group Cipher");
348c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
349c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
350c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** Pairwise Cipher*/
351c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.allowedPairwiseCiphers.cardinality() != 0
352c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setPairwiseCipher(wifiConfigurationToSupplicantPairwiseCipherMask(
353c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    config.allowedPairwiseCiphers))) {
354c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to set PairwiseCipher");
355c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
356c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
357c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** metadata: FQDN + ConfigKey + CreatorUid */
358c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            final Map<String, String> metadata = new HashMap<String, String>();
359c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.isPasspoint()) {
360c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                metadata.put(ID_STRING_KEY_FQDN, config.FQDN);
361c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
362c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            metadata.put(ID_STRING_KEY_CONFIG_KEY, config.configKey());
363c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            metadata.put(ID_STRING_KEY_CREATOR_UID, Integer.toString(config.creatorUid));
364c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!setIdStr(createNetworkExtra(metadata))) {
365c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to set id string");
366c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
367c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
368c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** UpdateIdentifier */
369c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.updateIdentifier != null
370c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setUpdateIdentifier(Integer.parseInt(config.updateIdentifier))) {
371c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to set update identifier");
372c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
373c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
374c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            // Finish here if no EAP config to set
375c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (config.enterpriseConfig != null
376c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && config.enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE) {
377c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!saveWifiEnterpriseConfig(config.SSID, config.enterpriseConfig)) {
378c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
379c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
380c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
381c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius
382c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            // Now that the network is configured fully, start listening for callback events.
383c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            mISupplicantStaNetworkCallback =
384c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    new SupplicantStaNetworkHalCallback(config.networkId, config.SSID);
385c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!registerCallback(mISupplicantStaNetworkCallback)) {
386c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Failed to register callback");
387c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
388c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
389c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return true;
390c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        }
39166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
39266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
39366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
39466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * Read network variables from wpa_supplicant into the provided WifiEnterpriseConfig object.
39566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     *
39666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param ssid SSID of the network. (Used for logging purposes only)
39766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param eapConfig WifiEnterpriseConfig object to be populated.
39866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @return true if succeeds, false otherwise.
39966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
40066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private boolean loadWifiEnterpriseConfig(String ssid, WifiEnterpriseConfig eapConfig) {
401c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
402c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (eapConfig == null) return false;
403c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP method */
404c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapMethod()) {
405c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setEapMethod(supplicantToWifiConfigurationEapMethod(mEapMethod));
406c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else {
407c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                // Invalid eap method could be because it's not an enterprise config.
408c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to get eap method. Assumimg not an enterprise network");
409c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return true;
410c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
411c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Phase 2 method */
412c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapPhase2Method()) {
413c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setPhase2Method(
414c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        supplicantToWifiConfigurationEapPhase2Method(mEapPhase2Method));
415c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else {
416c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                // We cannot have an invalid eap phase 2 method. Return failure.
417c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "failed to get eap phase2 method");
418c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
419c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
420c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Identity */
421c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapIdentity() && !ArrayUtils.isEmpty(mEapIdentity)) {
422c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(
423c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        WifiEnterpriseConfig.IDENTITY_KEY,
424c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        NativeUtil.stringFromByteArrayList(mEapIdentity));
425c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
426c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Anonymous Identity */
427c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapAnonymousIdentity() && !ArrayUtils.isEmpty(mEapAnonymousIdentity)) {
428c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(
429c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        WifiEnterpriseConfig.ANON_IDENTITY_KEY,
430c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        NativeUtil.stringFromByteArrayList(mEapAnonymousIdentity));
431c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
432c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Password */
433c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapPassword() && !ArrayUtils.isEmpty(mEapPassword)) {
434c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(
435c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        WifiEnterpriseConfig.PASSWORD_KEY,
436c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        NativeUtil.stringFromByteArrayList(mEapPassword));
437c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
438c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Client Cert */
439c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapClientCert() && !TextUtils.isEmpty(mEapClientCert)) {
440c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY, mEapClientCert);
441c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
442c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP CA Cert */
443c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapCACert() && !TextUtils.isEmpty(mEapCACert)) {
444c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, mEapCACert);
445c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
446c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Subject Match */
447c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapSubjectMatch() && !TextUtils.isEmpty(mEapSubjectMatch)) {
448c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY, mEapSubjectMatch);
449c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
450c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Engine ID */
451c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapEngineID() && !TextUtils.isEmpty(mEapEngineID)) {
452c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY, mEapEngineID);
453c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
454c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Engine. Set this only if the engine id is non null. */
455c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapEngine() && !TextUtils.isEmpty(mEapEngineID)) {
456c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(
457c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        WifiEnterpriseConfig.ENGINE_KEY,
458c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        mEapEngine
459c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                                ? WifiEnterpriseConfig.ENGINE_ENABLE
460c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                                : WifiEnterpriseConfig.ENGINE_DISABLE);
461c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
462c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Private Key */
463c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapPrivateKeyId() && !TextUtils.isEmpty(mEapPrivateKeyId)) {
464c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, mEapPrivateKeyId);
465c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
466c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Alt Subject Match */
467c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapAltSubjectMatch() && !TextUtils.isEmpty(mEapAltSubjectMatch)) {
468c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(
469c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, mEapAltSubjectMatch);
470c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
471c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Domain Suffix Match */
472c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapDomainSuffixMatch() && !TextUtils.isEmpty(mEapDomainSuffixMatch)) {
473c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(
474c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY, mEapDomainSuffixMatch);
475c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
476c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP CA Path*/
477c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (getEapCAPath() && !TextUtils.isEmpty(mEapCAPath)) {
478c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                eapConfig.setFieldValue(WifiEnterpriseConfig.CA_PATH_KEY, mEapCAPath);
479c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
48064950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius            return true;
48164950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius        }
48266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
48366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
48466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
48566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * Save network variables from the provided WifiEnterpriseConfig object to wpa_supplicant.
48666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     *
48766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param ssid SSID of the network. (Used for logging purposes only)
48866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param eapConfig WifiEnterpriseConfig object to be saved.
48966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @return true if succeeds, false otherwise.
49066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
49166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private boolean saveWifiEnterpriseConfig(String ssid, WifiEnterpriseConfig eapConfig) {
492c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
493c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (eapConfig == null) return false;
494c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP method */
495c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!setEapMethod(wifiConfigurationToSupplicantEapMethod(eapConfig.getEapMethod()))) {
496c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap method: " + eapConfig.getEapMethod());
497c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
498c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
499c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Phase 2 method */
500c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!setEapPhase2Method(wifiConfigurationToSupplicantEapPhase2Method(
501c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    eapConfig.getPhase2Method()))) {
502c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap phase 2 method: "
503c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        + eapConfig.getPhase2Method());
504c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
505c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
506c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            String eapParam = null;
507c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Identity */
508c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.IDENTITY_KEY);
509c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam)
510c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setEapIdentity(NativeUtil.stringToByteArrayList(eapParam))) {
511c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap identity: " + eapParam);
512c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
513c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
514c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Anonymous Identity */
515c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.ANON_IDENTITY_KEY);
516c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam)
517c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setEapAnonymousIdentity(NativeUtil.stringToByteArrayList(eapParam))) {
518c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap anonymous identity: " + eapParam);
519c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
520c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
521c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Password */
522c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.PASSWORD_KEY);
523c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam)
524c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setEapPassword(NativeUtil.stringToByteArrayList(eapParam))) {
525c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap password");
526c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
527c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
528c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Client Cert */
529c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.CLIENT_CERT_KEY);
530c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapClientCert(eapParam)) {
531c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap client cert: " + eapParam);
532c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
533c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
534c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP CA Cert */
535c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.CA_CERT_KEY);
536c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapCACert(eapParam)) {
537c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap ca cert: " + eapParam);
538c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
539c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
540c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Subject Match */
541c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.SUBJECT_MATCH_KEY);
542c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapSubjectMatch(eapParam)) {
543c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap subject match: " + eapParam);
544c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
545c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
546c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Engine ID */
547c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.ENGINE_ID_KEY);
548c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapEngineID(eapParam)) {
549c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap engine id: " + eapParam);
550c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
551c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
552c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Engine */
553c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.ENGINE_KEY);
554c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapEngine(
555c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    eapParam.equals(WifiEnterpriseConfig.ENGINE_ENABLE) ? true : false)) {
556c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap engine: " + eapParam);
557c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
558c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
559c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Private Key */
560c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY);
561c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapPrivateKeyId(eapParam)) {
562c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap private key: " + eapParam);
563c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
564c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
565c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Alt Subject Match */
566c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY);
567c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapAltSubjectMatch(eapParam)) {
568c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap alt subject match: " + eapParam);
569c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
570c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
571c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Domain Suffix Match */
572c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY);
573c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapDomainSuffixMatch(eapParam)) {
574c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap domain suffix match: " + eapParam);
575c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
576c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
577c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP CA Path*/
578c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.CA_PATH_KEY);
579c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam) && !setEapCAPath(eapParam)) {
580c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set eap ca path: " + eapParam);
581c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
582c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
583c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius
584c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            /** EAP Proactive Key Caching */
585c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.OPP_KEY_CACHING);
586c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!TextUtils.isEmpty(eapParam)
587c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    && !setEapProactiveKeyCaching(eapParam.equals("1") ? true : false)) {
588c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, ssid + ": failed to set proactive key caching: " + eapParam);
589c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
590c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
591c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return true;
592c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        }
59366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
59466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
59566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
59666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * Maps WifiConfiguration Key Management BitSet to Supplicant HIDL bitmask int
59766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * TODO(b/32571829): Update mapping when fast transition keys are added
59866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @return bitmask int describing the allowed Key Management schemes, readable by the Supplicant
59966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     *         HIDL hal
60066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
60166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantKeyMgmtMask(BitSet keyMgmt) {
60266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        int mask = 0;
60366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        for (int bit = keyMgmt.nextSetBit(0); bit != -1; bit = keyMgmt.nextSetBit(bit + 1)) {
60466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            switch (bit) {
60566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.NONE:
60666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.NONE;
60766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
60866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.WPA_PSK:
60966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.WPA_PSK;
61066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
61166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.WPA_EAP:
61266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.WPA_EAP;
61366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
61466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.IEEE8021X:
61566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.IEEE8021X;
61666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
61766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.OSEN:
61866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.OSEN;
61966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
62066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.FT_PSK:
62166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.FT_PSK;
62266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
62366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.FT_EAP:
62466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.KeyMgmtMask.FT_EAP;
62566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
62666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.KeyMgmt.WPA2_PSK: // This should never happen
62766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                default:
62866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    throw new IllegalArgumentException(
62966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                            "Invalid protoMask bit in keyMgmt: " + bit);
63066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
63166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
63266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return mask;
63366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
63466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
63566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantProtoMask(BitSet protoMask) {
63666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        int mask = 0;
63766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        for (int bit = protoMask.nextSetBit(0); bit != -1; bit = protoMask.nextSetBit(bit + 1)) {
63866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            switch (bit) {
63966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.Protocol.WPA:
64066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.ProtoMask.WPA;
64166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
64266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.Protocol.RSN:
64366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.ProtoMask.RSN;
64466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
64566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.Protocol.OSEN:
64666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.ProtoMask.OSEN;
64766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
64866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                default:
64966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    throw new IllegalArgumentException(
65066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                            "Invalid protoMask bit in wificonfig: " + bit);
65166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
65266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
65366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return mask;
65466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
65566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
65666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantAuthAlgMask(BitSet authAlgMask) {
65766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        int mask = 0;
65866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        for (int bit = authAlgMask.nextSetBit(0); bit != -1;
65966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                bit = authAlgMask.nextSetBit(bit + 1)) {
66066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            switch (bit) {
66166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.AuthAlgorithm.OPEN:
66266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.AuthAlgMask.OPEN;
66366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
66466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.AuthAlgorithm.SHARED:
66566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.AuthAlgMask.SHARED;
66666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
66766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.AuthAlgorithm.LEAP:
66866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.AuthAlgMask.LEAP;
66966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
67066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                default:
67166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    throw new IllegalArgumentException(
67266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                            "Invalid authAlgMask bit in wificonfig: " + bit);
67366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
67466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
67566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return mask;
67666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
67766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
67866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantGroupCipherMask(BitSet groupCipherMask) {
67966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        int mask = 0;
68066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        for (int bit = groupCipherMask.nextSetBit(0); bit != -1; bit =
68166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                groupCipherMask.nextSetBit(bit + 1)) {
68266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            switch (bit) {
68366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.GroupCipher.WEP40:
68466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.GroupCipherMask.WEP40;
68566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
68666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.GroupCipher.WEP104:
68766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.GroupCipherMask.WEP104;
68866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
68966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.GroupCipher.TKIP:
69066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.GroupCipherMask.TKIP;
69166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
69266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.GroupCipher.CCMP:
69366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.GroupCipherMask.CCMP;
69466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
69566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.GroupCipher.GTK_NOT_USED:
69666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.GroupCipherMask.GTK_NOT_USED;
69766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
69866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                default:
69966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    throw new IllegalArgumentException(
70066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                            "Invalid GroupCipherMask bit in wificonfig: " + bit);
70166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
70266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
70366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return mask;
70466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
70566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
70666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantPairwiseCipherMask(BitSet pairwiseCipherMask) {
70766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        int mask = 0;
70866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        for (int bit = pairwiseCipherMask.nextSetBit(0); bit != -1;
70966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                bit = pairwiseCipherMask.nextSetBit(bit + 1)) {
71066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            switch (bit) {
71166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.PairwiseCipher.NONE:
71266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.PairwiseCipherMask.NONE;
71366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
71466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.PairwiseCipher.TKIP:
71566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.PairwiseCipherMask.TKIP;
71666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
71766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                case WifiConfiguration.PairwiseCipher.CCMP:
71866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    mask |= ISupplicantStaNetwork.PairwiseCipherMask.CCMP;
71966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    break;
72066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                default:
72166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    throw new IllegalArgumentException(
72266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                            "Invalid pairwiseCipherMask bit in wificonfig: " + bit);
72366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
72466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
72566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return mask;
72666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
72766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
72866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int supplicantToWifiConfigurationEapMethod(int value) {
72966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        switch (value) {
73066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.PEAP:
73166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.PEAP;
73266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.TLS:
73366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.TLS;
73466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.TTLS:
73566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.TTLS;
73666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.PWD:
73766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.PWD;
73866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.SIM:
73966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.SIM;
74066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.AKA:
74166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.AKA;
74266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.AKA_PRIME:
74366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.AKA_PRIME;
74466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapMethod.WFA_UNAUTH_TLS:
74566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Eap.UNAUTH_TLS;
74666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            // WifiEnterpriseConfig.Eap.NONE:
74766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            default:
74866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                Log.e(TAG, "invalid eap method value from supplicant: " + value);
74966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return -1;
75066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
75166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
75266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
75366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int supplicantToWifiConfigurationEapPhase2Method(int value) {
75466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        switch (value) {
75566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapPhase2Method.NONE:
75666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Phase2.NONE;
75766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapPhase2Method.PAP:
75866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Phase2.PAP;
75966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapPhase2Method.MSPAP:
76066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Phase2.MSCHAP;
76166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapPhase2Method.MSPAPV2:
76266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Phase2.MSCHAPV2;
76366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case ISupplicantStaNetwork.EapPhase2Method.GTC:
76466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return WifiEnterpriseConfig.Phase2.GTC;
765cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius            case ISupplicantStaNetwork.EapPhase2Method.SIM:
766cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius                return WifiEnterpriseConfig.Phase2.SIM;
767cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius            case ISupplicantStaNetwork.EapPhase2Method.AKA:
768cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius                return WifiEnterpriseConfig.Phase2.AKA;
769cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius            case ISupplicantStaNetwork.EapPhase2Method.AKA_PRIME:
770cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius                return WifiEnterpriseConfig.Phase2.AKA_PRIME;
77166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            default:
77266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                Log.e(TAG, "invalid eap phase2 method value from supplicant: " + value);
77366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return -1;
77466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
77566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
77666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
77766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int supplicantMaskValueToWifiConfigurationBitSet(int supplicantMask,
77866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                                                             int supplicantValue, BitSet bitset,
77966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                                                             int bitSetPosition) {
78066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        bitset.set(bitSetPosition, (supplicantMask & supplicantValue) == supplicantValue);
78166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        int modifiedSupplicantMask = supplicantMask & ~supplicantValue;
78266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return modifiedSupplicantMask;
78396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
78496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
78566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static BitSet supplicantToWifiConfigurationKeyMgmtMask(int mask) {
78666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        BitSet bitset = new BitSet();
78766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
78866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.NONE, bitset,
78966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.NONE);
79066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
79166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.WPA_PSK, bitset,
79266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.WPA_PSK);
79366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
79466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.WPA_EAP, bitset,
79566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.WPA_EAP);
79666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
79766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.IEEE8021X, bitset,
79866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.IEEE8021X);
79966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
80066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.OSEN, bitset,
80166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.OSEN);
80266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
80366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.FT_PSK, bitset,
80466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.FT_PSK);
80566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
80666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.KeyMgmtMask.FT_EAP, bitset,
80766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.KeyMgmt.FT_EAP);
80866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (mask != 0) {
80966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            throw new IllegalArgumentException(
81066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    "invalid key mgmt mask from supplicant: " + mask);
81166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
81266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return bitset;
81366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
81466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
81566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static BitSet supplicantToWifiConfigurationProtoMask(int mask) {
81666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        BitSet bitset = new BitSet();
81766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
81866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.ProtoMask.WPA, bitset,
81966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.Protocol.WPA);
82066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
82166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.ProtoMask.RSN, bitset,
82266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.Protocol.RSN);
82366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
82466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.ProtoMask.OSEN, bitset,
82566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.Protocol.OSEN);
82666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (mask != 0) {
82766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            throw new IllegalArgumentException(
82866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    "invalid proto mask from supplicant: " + mask);
82966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
83066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return bitset;
83166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
83266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
83366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static BitSet supplicantToWifiConfigurationAuthAlgMask(int mask) {
83466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        BitSet bitset = new BitSet();
83566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
83666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.AuthAlgMask.OPEN, bitset,
83766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.AuthAlgorithm.OPEN);
83866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
83966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.AuthAlgMask.SHARED, bitset,
84066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.AuthAlgorithm.SHARED);
84166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
84266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.AuthAlgMask.LEAP, bitset,
84366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.AuthAlgorithm.LEAP);
84466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (mask != 0) {
84566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            throw new IllegalArgumentException(
84666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    "invalid auth alg mask from supplicant: " + mask);
84766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
84866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return bitset;
84966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
85066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
85166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static BitSet supplicantToWifiConfigurationGroupCipherMask(int mask) {
85266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        BitSet bitset = new BitSet();
85366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
85466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.GroupCipherMask.WEP40, bitset,
85566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.GroupCipher.WEP40);
85666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
85766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.GroupCipherMask.WEP104, bitset,
85866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.GroupCipher.WEP104);
85966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
86066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.GroupCipherMask.TKIP, bitset,
86166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.GroupCipher.TKIP);
86266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
86366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.GroupCipherMask.CCMP, bitset,
86466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.GroupCipher.CCMP);
86566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
86666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.GroupCipherMask.GTK_NOT_USED, bitset,
86766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.GroupCipher.GTK_NOT_USED);
86866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (mask != 0) {
86966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            throw new IllegalArgumentException(
87066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    "invalid group cipher mask from supplicant: " + mask);
87166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
87266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return bitset;
87366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
87466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
87566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static BitSet supplicantToWifiConfigurationPairwiseCipherMask(int mask) {
87666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        BitSet bitset = new BitSet();
87766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
87866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.PairwiseCipherMask.NONE, bitset,
87966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.PairwiseCipher.NONE);
88066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
88166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.PairwiseCipherMask.TKIP, bitset,
88266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.PairwiseCipher.TKIP);
88366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        mask = supplicantMaskValueToWifiConfigurationBitSet(
88466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                mask, ISupplicantStaNetwork.PairwiseCipherMask.CCMP, bitset,
88566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                WifiConfiguration.PairwiseCipher.CCMP);
88666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (mask != 0) {
88766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            throw new IllegalArgumentException(
88866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    "invalid pairwise cipher mask from supplicant: " + mask);
88966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
89066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return bitset;
89166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
89266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
89366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantEapMethod(int value) {
89466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        switch (value) {
89566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.PEAP:
89666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.PEAP;
89766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.TLS:
89866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.TLS;
89966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.TTLS:
90066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.TTLS;
90166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.PWD:
90266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.PWD;
90366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.SIM:
90466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.SIM;
90566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.AKA:
90666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.AKA;
90766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.AKA_PRIME:
90866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.AKA_PRIME;
90966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Eap.UNAUTH_TLS:
91066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapMethod.WFA_UNAUTH_TLS;
91166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            // WifiEnterpriseConfig.Eap.NONE:
91266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            default:
91366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                Log.e(TAG, "invalid eap method value from WifiConfiguration: " + value);
91466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return -1;
91566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
91666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
91766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
91866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private static int wifiConfigurationToSupplicantEapPhase2Method(int value) {
91966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        switch (value) {
92066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Phase2.NONE:
92166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapPhase2Method.NONE;
92266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Phase2.PAP:
92366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapPhase2Method.PAP;
92466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Phase2.MSCHAP:
92566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapPhase2Method.MSPAP;
92666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Phase2.MSCHAPV2:
92766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapPhase2Method.MSPAPV2;
92866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            case WifiEnterpriseConfig.Phase2.GTC:
92966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return ISupplicantStaNetwork.EapPhase2Method.GTC;
930cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius            case WifiEnterpriseConfig.Phase2.SIM:
931cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius                return ISupplicantStaNetwork.EapPhase2Method.SIM;
932cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius            case WifiEnterpriseConfig.Phase2.AKA:
933cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius                return ISupplicantStaNetwork.EapPhase2Method.AKA;
934cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius            case WifiEnterpriseConfig.Phase2.AKA_PRIME:
935cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius                return ISupplicantStaNetwork.EapPhase2Method.AKA_PRIME;
93666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            default:
93766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                Log.e(TAG, "invalid eap phase2 method value from WifiConfiguration: " + value);
93866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return -1;
93966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
94066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    };
94166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
94296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantNetwork.hal for documentation */
943727ba04029935d4faee3c7fce8a5a0ba6ed0a4eaRoshan Pius    private boolean getId() {
94496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
94596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getId";
94696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
94796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
94896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
94996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getId((SupplicantStatus status, int idValue) -> {
95096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
95196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
95266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                        this.mNetworkId = idValue;
95396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
954b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
95596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
95696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
95796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
95896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
95996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
96096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
96196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
96296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
96396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
96496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
96596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
96696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean registerCallback(ISupplicantStaNetworkCallback callback) {
96796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
96896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "registerCallback";
96996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
97096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
97196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.registerCallback(callback);
97296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
97396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
97496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
97596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
97696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
97796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
97896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
97996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
98096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
98196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setSsid(java.util.ArrayList<Byte> ssid) {
98296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
98396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setSsid";
98496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
98596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
98696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setSsid(ssid);
98796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
98896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
98996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
99096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
99196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
99296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
99396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
9947c0ec884188660f72977c8a80366049705c48ffaRoshan Pius
9957c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    /**
9967c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * Set the BSSID for this network.
9977c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     *
9987c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @param bssidStr MAC address in "XX:XX:XX:XX:XX:XX" form or "any" to reset the mac address.
9997c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @return true if it succeeds, false otherwise.
10007c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     */
10017c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    public boolean setBssid(String bssidStr) {
1002c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
1003c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            try {
1004c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return setBssid(NativeUtil.macAddressToByteArray(bssidStr));
1005c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } catch (IllegalArgumentException e) {
1006c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Illegal argument " + bssidStr, e);
1007c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
1008c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
100945a984619e338090981499e4823e0177649e3c28Roshan Pius        }
10107c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    }
10117c0ec884188660f72977c8a80366049705c48ffaRoshan Pius
101296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
101396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setBssid(byte[/* 6 */] bssid) {
101496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
101596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setBssid";
101696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
101796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
101896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setBssid(bssid);
101996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
102096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
102196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
102296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
102396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
102496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
102596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
102696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
102796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setScanSsid(boolean enable) {
102896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
102996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setScanSsid";
103096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
103196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
103296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setScanSsid(enable);
103396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
103496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
103596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
103696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
103796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
103896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
103996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
104096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
104196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setKeyMgmt(int keyMgmtMask) {
104296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
104396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setKeyMgmt";
104496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
104596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
104696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setKeyMgmt(keyMgmtMask);
104796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
104896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
104996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
105096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
105196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
105296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
105396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
105496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
105596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setProto(int protoMask) {
105696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
105796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setProto";
105896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
105996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
106096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setProto(protoMask);
106196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
106296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
106396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
106496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
106596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
106696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
106796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
106896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
106996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setAuthAlg(int authAlgMask) {
107096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
107196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setAuthAlg";
107296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
107396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
107496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setAuthAlg(authAlgMask);
107596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
107696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
107796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
107896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
107996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
108096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
108196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
108296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
108396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setGroupCipher(int groupCipherMask) {
108496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
108596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setGroupCipher";
108696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
108796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
108896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setGroupCipher(groupCipherMask);
108996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
109096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
109196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
109296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
109396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
109496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
109596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
109696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
109796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setPairwiseCipher(int pairwiseCipherMask) {
109896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
109996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setPairwiseCipher";
110096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
110196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
110296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
110396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaNetwork.setPairwiseCipher(pairwiseCipherMask);
110496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
110596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
110696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
110796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
110896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
110996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
111096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
111196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
111296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setPskPassphrase(String psk) {
111396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
111496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setPskPassphrase";
111596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
111696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
111796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setPskPassphrase(psk);
111896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
111996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
112096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
112196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
112296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
112396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
112496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
112596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
1126f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    private boolean setPsk(byte[] psk) {
1127f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius        synchronized (mLock) {
1128f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            final String methodStr = "setPsk";
1129f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
1130f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            try {
1131f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                SupplicantStatus status =  mISupplicantStaNetwork.setPsk(psk);
1132f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
1133f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            } catch (RemoteException e) {
1134f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                handleRemoteException(e, methodStr);
1135f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                return false;
1136f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            }
1137f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius        }
1138f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    }
1139f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    /** See ISupplicantStaNetwork.hal for documentation */
114096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setWepKey(int keyIdx, java.util.ArrayList<Byte> wepKey) {
114196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
114296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setWepKey";
114396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
114496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
114596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setWepKey(keyIdx, wepKey);
114696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
114796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
114896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
114996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
115096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
115196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
115296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
115396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
115496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setWepTxKeyIdx(int keyIdx) {
115596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
115696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setWepTxKeyIdx";
115796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
115896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
115996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setWepTxKeyIdx(keyIdx);
116096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
116196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
116296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
116396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
116496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
116596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
116696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
116796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
116896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setRequirePmf(boolean enable) {
116996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
117096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setRequirePmf";
117196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
117296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
117396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setRequirePmf(enable);
117496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
117596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
117696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
117796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
117896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
117996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
118096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
118196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
118266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private boolean setUpdateIdentifier(int identifier) {
118366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        synchronized (mLock) {
118466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            final String methodStr = "setUpdateIdentifier";
118566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
118666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            try {
118766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setUpdateIdentifier(identifier);
118866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return checkStatusAndLogFailure(status, methodStr);
118966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            } catch (RemoteException e) {
119066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                handleRemoteException(e, methodStr);
119166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return false;
119266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
119366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
119466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
119566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
119696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapMethod(int method) {
119796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
119896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapMethod";
119996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
120096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
120196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapMethod(method);
120296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
120396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
120496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
120596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
120696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
120796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
120896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
120996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
121096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapPhase2Method(int method) {
121196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
121296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapPhase2Method";
121396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
121496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
121596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapPhase2Method(method);
121696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
121796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
121896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
121996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
122096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
122196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
122296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
122396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
122496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapIdentity(java.util.ArrayList<Byte> identity) {
122596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
122696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapIdentity";
122796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
122896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
122996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapIdentity(identity);
123096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
123196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
123296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
123396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
123496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
123596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
123696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
123796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
123896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapAnonymousIdentity(java.util.ArrayList<Byte> identity) {
123996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
124096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapAnonymousIdentity";
124196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
124296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
124396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapAnonymousIdentity(identity);
124496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
124596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
124696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
124796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
124896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
124996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
125096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
125196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
125296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapPassword(java.util.ArrayList<Byte> password) {
125396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
125496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapPassword";
125596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
125696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
125796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapPassword(password);
125896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
125996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
126096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
126196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
126296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
126396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
126496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
126596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
126696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapCACert(String path) {
126796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
126896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapCACert";
126996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
127096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
127196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapCACert(path);
127296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
127396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
127496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
127596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
127696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
127796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
127896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
127996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
128096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapCAPath(String path) {
128196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
128296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapCAPath";
128396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
128496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
128596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapCAPath(path);
128696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
128796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
128896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
128996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
129096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
129196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
129296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
129396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
129496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapClientCert(String path) {
129596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
129696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapClientCert";
129796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
129896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
129996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapClientCert(path);
130096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
130196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
130296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
130396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
130496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
130596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
130696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
130796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
13081f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius    private boolean setEapPrivateKeyId(String id) {
130996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
13101f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius            final String methodStr = "setEapPrivateKeyId";
131196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
131296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
13131f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius                SupplicantStatus status =  mISupplicantStaNetwork.setEapPrivateKeyId(id);
131496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
131596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
131696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
131796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
131896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
131996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
132096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
132196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
132296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapSubjectMatch(String match) {
132396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
132496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapSubjectMatch";
132596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
132696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
132796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapSubjectMatch(match);
132896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
132996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
133096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
133196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
133296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
133396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
133496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
133596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
133696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapAltSubjectMatch(String match) {
133796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
133896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapAltSubjectMatch";
133996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
134096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
134196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapAltSubjectMatch(match);
134296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
134396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
134496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
134596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
134696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
134796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
134896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
134996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
135096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapEngine(boolean enable) {
135196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
135296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapEngine";
135396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
135496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
135596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapEngine(enable);
135696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
135796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
135896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
135996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
136096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
136196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
136296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
136396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
136496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapEngineID(String id) {
136596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
136696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapEngineID";
136796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
136896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
136996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapEngineID(id);
137096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
137196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
137296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
137396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
137496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
137596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
137696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
137796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
137896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setEapDomainSuffixMatch(String match) {
137996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
138096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setEapDomainSuffixMatch";
138196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
138296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
138396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setEapDomainSuffixMatch(match);
138496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
138596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
138696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
138796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
138896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
138996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
139096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
139196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
139264950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius    private boolean setEapProactiveKeyCaching(boolean enable) {
139364950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius        synchronized (mLock) {
139464950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius            final String methodStr = "setEapProactiveKeyCaching";
139564950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
139664950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius            try {
139764950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius                SupplicantStatus status =  mISupplicantStaNetwork.setProactiveKeyCaching(enable);
139864950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius                return checkStatusAndLogFailure(status, methodStr);
139964950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius            } catch (RemoteException e) {
140064950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius                handleRemoteException(e, methodStr);
140164950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius                return false;
140264950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius            }
140364950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius        }
140464950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius    }
140564950d46f5469e5e6ce32ccc81a1f751c40f4202Roshan Pius    /** See ISupplicantStaNetwork.hal for documentation */
140696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setIdStr(String idString) {
140796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
140896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setIdStr";
140996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
141096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
141196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.setIdStr(idString);
141296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
141396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
141496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
141596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
141696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
141796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
141896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
141996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
142096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getSsid() {
142196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
142296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getSsid";
142396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
142496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
142596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
142696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getSsid((SupplicantStatus status,
142796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        java.util.ArrayList<Byte> ssidValue) -> {
142896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
142996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
143066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                        this.mSsid = ssidValue;
143196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1432b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
143396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
143496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
143596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
143696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
143796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
143896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
143996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
144096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
144196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
144296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
144396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getBssid() {
144496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
144596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getBssid";
144696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
144796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
144896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
144996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getBssid((SupplicantStatus status,
145096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        byte[/* 6 */] bssidValue) -> {
145196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
145296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
145366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                        this.mBssid = bssidValue;
145496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1455b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
145696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
145796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
145896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
145996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
146096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
146196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
146296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
146396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
146496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
146596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
146696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getScanSsid() {
146796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
146896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getScanSsid";
146996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
147096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
147196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
147296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getScanSsid((SupplicantStatus status,
147396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        boolean enabledValue) -> {
147496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
147596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
147696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mScanSsid = enabledValue;
147796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1478b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
147996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
148096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
148196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
148296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
148396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
148496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
148596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
148696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
148796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
148896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
148996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getKeyMgmt() {
149096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
149196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getKeyMgmt";
149296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
149396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
149496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
149596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getKeyMgmt((SupplicantStatus status,
149696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int keyMgmtMaskValue) -> {
149796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
149896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
149996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mKeyMgmtMask = keyMgmtMaskValue;
150096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1501b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
150296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
150396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
150496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
150596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
150696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
150796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
150896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
150996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
151096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
151196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
151296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getProto() {
151396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
151496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getProto";
151596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
151696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
151796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
151896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getProto((SupplicantStatus status, int protoMaskValue) -> {
151996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
152096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
152196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mProtoMask = protoMaskValue;
152296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1523b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
152496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
152596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
152696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
152796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
152896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
152996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
153096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
153196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
153296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
153396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
153496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getAuthAlg() {
153596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
153696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getAuthAlg";
153796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
153896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
153996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
154096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getAuthAlg((SupplicantStatus status,
154196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int authAlgMaskValue) -> {
154296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
154396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
154496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mAuthAlgMask = authAlgMaskValue;
154596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1546b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
154796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
154896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
154996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
155096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
155196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
155296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
155396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
155496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
155596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
155696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
155796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getGroupCipher() {
155896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
155996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getGroupCipher";
156096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
156196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
156296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
156396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getGroupCipher((SupplicantStatus status,
156496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int groupCipherMaskValue) -> {
156596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
156696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
156796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mGroupCipherMask = groupCipherMaskValue;
156896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1569b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
157096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
157196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
157296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
157396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
157496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
157596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
157696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
157796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
157896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
157996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
158096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getPairwiseCipher() {
158196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
158296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getPairwiseCipher";
158396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
158496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
158596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
158696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getPairwiseCipher((SupplicantStatus status,
158796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int pairwiseCipherMaskValue) -> {
158896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
158996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
159096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mPairwiseCipherMask = pairwiseCipherMaskValue;
159196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1592b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
159396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
159496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
159596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
159696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
159796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
159896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
159996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
160096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
160196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
160296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
160396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getPskPassphrase() {
160496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
160596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getPskPassphrase";
160696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
160796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
160896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
160996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getPskPassphrase((SupplicantStatus status,
161096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        String pskValue) -> {
161196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
161296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
161396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mPskPassphrase = pskValue;
161496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1615b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
161696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
161796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
161896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
161996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
1620f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                handleRemoteException(e, methodStr);
1621f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                return false;
1622f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            }
1623f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius        }
1624f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    }
1625f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    /** See ISupplicantStaNetwork.hal for documentation */
1626f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius    private boolean getPsk() {
1627f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius        synchronized (mLock) {
1628f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            final String methodStr = "getPsk";
1629f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
1630f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            try {
1631f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                MutableBoolean statusOk = new MutableBoolean(false);
1632f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                mISupplicantStaNetwork.getPsk((SupplicantStatus status, byte[] pskValue) -> {
1633f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
1634f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                    if (statusOk.value) {
1635f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                        this.mPsk = pskValue;
1636f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                    } else {
1637f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
1638f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                    }
1639f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                });
1640f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius                return statusOk.value;
1641f50550926a7bddc24adf822876f35812d7d8c7beRoshan Pius            } catch (RemoteException e) {
164296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
164396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
164496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
164596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
164696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
164796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
164866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private boolean getWepKey(int keyIdx) {
164996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
165096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "keyIdx";
165196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
165296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
165396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
165496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getWepKey(keyIdx, (SupplicantStatus status,
165596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        java.util.ArrayList<Byte> wepKeyValue) -> {
165696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
165796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
165896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mWepKey = wepKeyValue;
165996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
166096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + ",  failed: " + status.debugMessage);
166196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
166296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
166396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
166496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
166596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
166696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
166796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
166896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
166996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
167096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
167196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getWepTxKeyIdx() {
167296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
167396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getWepTxKeyIdx";
167496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
167596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
167696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
167796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getWepTxKeyIdx((SupplicantStatus status,
167896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int keyIdxValue) -> {
167996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
168096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
168196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mWepTxKeyIdx = keyIdxValue;
168296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1683b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
168496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
168596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
168696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
168796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
168896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
168996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
169096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
169196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
169296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
169396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
169496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getRequirePmf() {
169596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
169696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getRequirePmf";
169796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
169896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
169996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
170096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getRequirePmf((SupplicantStatus status,
170196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        boolean enabledValue) -> {
170296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
170396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
170496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mRequirePmf = enabledValue;
170596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1706b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
170796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
170896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
170996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
171096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
171196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
171296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
171396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
171496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
171596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
171696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
171796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapMethod() {
171896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
171996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapMethod";
172096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
172196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
172296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
172396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapMethod((SupplicantStatus status,
172496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int methodValue) -> {
172596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
172696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
172796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapMethod = methodValue;
172896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1729b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
173096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
173196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
173296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
173396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
173496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
173596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
173696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
173796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
173896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
173996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
174096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapPhase2Method() {
174196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
174296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapPhase2Method";
174396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
174496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
174596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
174696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapPhase2Method((SupplicantStatus status,
174796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        int methodValue) -> {
174896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
174996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
175096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapPhase2Method = methodValue;
175196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1752b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
175396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
175496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
175596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
175696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
175796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
175896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
175996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
176096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
176196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
176296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
176396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapIdentity() {
176496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
176596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapIdentity";
176696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
176796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
176896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
176996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapIdentity((SupplicantStatus status,
177096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ArrayList<Byte> identityValue) -> {
177196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
177296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
177396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapIdentity = identityValue;
177496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1775b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
177696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
177796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
177896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
177996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
178096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
178196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
178296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
178396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
178496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
178596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
178696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapAnonymousIdentity() {
178796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
178896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapAnonymousIdentity";
178996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
179096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
179196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
179296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapAnonymousIdentity((SupplicantStatus status,
179396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ArrayList<Byte> identityValue) -> {
179496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
179596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
179696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapAnonymousIdentity = identityValue;
179796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1798b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
179996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
180096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
180196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
180296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
180396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
180496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
180596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
180696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
180796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
1808a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang
1809a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang    /**
1810a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     * A wrapping method for getEapAnonymousIdentity().
1811a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     * This get anonymous identity from supplicant and returns it as a string.
1812a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     *
1813a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     * @return anonymous identity string if succeeds, null otherwise.
1814a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     */
1815a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang    public String fetchEapAnonymousIdentity() {
1816c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
1817c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!getEapAnonymousIdentity()) {
1818c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return null;
1819c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
1820c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return NativeUtil.stringFromByteArrayList(mEapAnonymousIdentity);
1821a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang        }
1822a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang    }
1823a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang
182496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
182596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapPassword() {
182696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
182796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapPassword";
182896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
182996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
183096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
183196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapPassword((SupplicantStatus status,
183296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ArrayList<Byte> passwordValue) -> {
183396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
183496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
183596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapPassword = passwordValue;
183696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1837b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
183896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
183996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
184096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
184196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
184296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
184396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
184496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
184596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
184696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
184796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
184896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapCACert() {
184996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
185096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapCACert";
185196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
185296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
185396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
185496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapCACert((SupplicantStatus status, String pathValue) -> {
185596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
185696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
185796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapCACert = pathValue;
185896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1859b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
186096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
186196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
186296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
186396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
186496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
186596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
186696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
186796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
186896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
186996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
187096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapCAPath() {
187196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
187296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapCAPath";
187396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
187496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
187596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
187696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapCAPath((SupplicantStatus status, String pathValue) -> {
187796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
187896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
187996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapCAPath = pathValue;
188096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1881b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
188296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
188396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
188496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
188596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
188696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
188796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
188896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
188996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
189096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
189196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
189296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapClientCert() {
189396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
189496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapClientCert";
189596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
189696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
189796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
189896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapClientCert((SupplicantStatus status,
189996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        String pathValue) -> {
190096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
190196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
190296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapClientCert = pathValue;
190396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1904b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
190596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
190696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
190796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
190896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
190996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
191096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
191196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
191296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
191396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
191496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
19151f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius    private boolean getEapPrivateKeyId() {
191696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
19171f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius            final String methodStr = "getEapPrivateKeyId";
191896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
191996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
192096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
19211f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius                mISupplicantStaNetwork.getEapPrivateKeyId((SupplicantStatus status,
19221f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius                        String idValue) -> {
192396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
192496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
19251f5dee32716a2709ca2e1e491cbc2f09ca35a2faRoshan Pius                        this.mEapPrivateKeyId = idValue;
192696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1927b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
192896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
192996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
193096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
193196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
193296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
193396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
193496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
193596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
193696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
193796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
193896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapSubjectMatch() {
193996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
194096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapSubjectMatch";
194196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
194296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
194396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
194496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapSubjectMatch((SupplicantStatus status,
194596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        String matchValue) -> {
194696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
194796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
194896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapSubjectMatch = matchValue;
194996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1950b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
195196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
195296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
195396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
195496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
195596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
195696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
195796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
195896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
195996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
196096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
196196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapAltSubjectMatch() {
196296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
196396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapAltSubjectMatch";
196496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
196596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
196696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
196796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapAltSubjectMatch((SupplicantStatus status,
196896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        String matchValue) -> {
196996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
197096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
197196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapAltSubjectMatch = matchValue;
197296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1973b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
197496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
197596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
197696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
197796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
197896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
197996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
198096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
198196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
198296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
198396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
198496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapEngine() {
198596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
198696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapEngine";
198796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
198896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
198996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
199096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapEngine((SupplicantStatus status,
199196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        boolean enabledValue) -> {
199296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
199396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
199496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapEngine = enabledValue;
199596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
1996b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
199796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
199896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
199996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
200096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
200196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
200296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
200396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
200496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
200596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
200696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
200796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapEngineID() {
200896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
200996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapEngineID";
201096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
201196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
201296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
201396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapEngineID((SupplicantStatus status, String idValue) -> {
201496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
201596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
201696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapEngineID = idValue;
201796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
2018b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
201996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
202096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
202196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
202296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
202396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
202496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
202596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
202696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
202796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
202896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
202996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getEapDomainSuffixMatch() {
203096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
203196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getEapDomainSuffixMatch";
203296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
203396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
203496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
203596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getEapDomainSuffixMatch((SupplicantStatus status,
203696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        String matchValue) -> {
203796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
203896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
203996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mEapDomainSuffixMatch = matchValue;
204096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
2041b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
204296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
204396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
204496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
204596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
204696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
204796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
204896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
204996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
205096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
205196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
205296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean getIdStr() {
205396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
205496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getIdStr";
205596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
205696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
205796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                MutableBoolean statusOk = new MutableBoolean(false);
205896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaNetwork.getIdStr((SupplicantStatus status, String idString) -> {
205996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusOk.value = status.code == SupplicantStatusCode.SUCCESS;
206096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (statusOk.value) {
206196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        this.mIdStr = idString;
206296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
2063b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius                        checkStatusAndLogFailure(status, methodStr);
206496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
206596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
206696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return statusOk.value;
206796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
206896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
206996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
207096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
207196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
207296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
207396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
207496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean enable(boolean noConnect) {
207596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
207696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "enable";
207796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
207896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
207996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.enable(noConnect);
208096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
208196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
208296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
208396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
208496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
208596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
208696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
208796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
208896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean disable() {
208996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
209096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "disable";
209196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
209296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
209396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.disable();
209496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
209596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
209696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
209796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
209896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
209996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
210096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
2101d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
2102d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
2103d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Trigger a connection to this network.
2104d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
2105d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if it succeeds, false otherwise.
2106d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
210766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public boolean select() {
210896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
210996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "select";
211096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
211196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
211296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =  mISupplicantStaNetwork.select();
211396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
211496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
211596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
211696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
211796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
211896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
211996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
2120d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
2121445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
2122445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Send GSM auth response.
2123445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     *
2124445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @param paramsStr Response params as a string.
2125445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @return true if succeeds, false otherwise.
2126445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
2127445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    public boolean sendNetworkEapSimGsmAuthResponse(String paramsStr) {
2128c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2129c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            try {
2130c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Matcher match = GSM_AUTH_RESPONSE_PARAMS_PATTERN.matcher(paramsStr);
2131c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                ArrayList<ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams> params =
2132c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        new ArrayList<>();
2133c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                while (match.find()) {
2134c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    if (match.groupCount() != 2) {
2135c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        Log.e(TAG, "Malformed gsm auth response params: " + paramsStr);
2136c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        return false;
2137c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    }
2138c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams param =
2139c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                            new ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams();
2140c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    byte[] kc = NativeUtil.hexStringToByteArray(match.group(1));
2141c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    if (kc == null || kc.length != param.kc.length) {
2142c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        Log.e(TAG, "Invalid kc value: " + match.group(1));
2143c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        return false;
2144c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    }
2145c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    byte[] sres = NativeUtil.hexStringToByteArray(match.group(2));
2146c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    if (sres == null || sres.length != param.sres.length) {
2147c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        Log.e(TAG, "Invalid sres value: " + match.group(2));
2148c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        return false;
2149c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    }
2150c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    System.arraycopy(kc, 0, param.kc, 0, param.kc.length);
2151c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    System.arraycopy(sres, 0, param.sres, 0, param.sres.length);
2152c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    params.add(param);
215345a984619e338090981499e4823e0177649e3c28Roshan Pius                }
2154c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                // The number of kc/sres pairs can either be 2 or 3 depending on the request.
2155c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (params.size() > 3 || params.size() < 2) {
2156c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Malformed gsm auth response params: " + paramsStr);
215745a984619e338090981499e4823e0177649e3c28Roshan Pius                    return false;
215845a984619e338090981499e4823e0177649e3c28Roshan Pius                }
2159c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return sendNetworkEapSimGsmAuthResponse(params);
2160c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } catch (IllegalArgumentException e) {
2161c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Illegal argument " + paramsStr, e);
2162445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius                return false;
2163445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius            }
2164445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius        }
2165445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    }
2166d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
216796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
216896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean sendNetworkEapSimGsmAuthResponse(
216996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            ArrayList<ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams> params) {
217096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
217196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "sendNetworkEapSimGsmAuthResponse";
217296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
217396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
217496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
217596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaNetwork.sendNetworkEapSimGsmAuthResponse(params);
217696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
217796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
217896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
217996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
218096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
218196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
218296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
218396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
2184445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    public boolean sendNetworkEapSimGsmAuthFailure() {
218596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
218696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "sendNetworkEapSimGsmAuthFailure";
218796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
218896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
218996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaNetwork.sendNetworkEapSimGsmAuthFailure();
219096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
219196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
219296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
219396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
219496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
219596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
219696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
2197445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
2198445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Send UMTS auth response.
2199445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     *
2200445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @param paramsStr Response params as a string.
2201445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @return true if succeeds, false otherwise.
2202445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
2203445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    public boolean sendNetworkEapSimUmtsAuthResponse(String paramsStr) {
2204c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2205c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            try {
2206c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Matcher match = UMTS_AUTH_RESPONSE_PARAMS_PATTERN.matcher(paramsStr);
2207c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!match.find() || match.groupCount() != 3) {
2208c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Malformed umts auth response params: " + paramsStr);
2209c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
2210c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2211c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams params =
2212c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        new ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams();
2213c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                byte[] ik = NativeUtil.hexStringToByteArray(match.group(1));
2214c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (ik == null || ik.length != params.ik.length) {
2215c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Invalid ik value: " + match.group(1));
2216c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
2217c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2218c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                byte[] ck = NativeUtil.hexStringToByteArray(match.group(2));
2219c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (ck == null || ck.length != params.ck.length) {
2220c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Invalid ck value: " + match.group(2));
2221c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
2222c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2223c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                byte[] res = NativeUtil.hexStringToByteArray(match.group(3));
2224c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (res == null || res.length == 0) {
2225c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Invalid res value: " + match.group(3));
2226c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
2227c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2228c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                System.arraycopy(ik, 0, params.ik, 0, params.ik.length);
2229c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                System.arraycopy(ck, 0, params.ck, 0, params.ck.length);
2230c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                for (byte b : res) {
2231c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    params.res.add(b);
2232c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2233c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return sendNetworkEapSimUmtsAuthResponse(params);
2234c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } catch (IllegalArgumentException e) {
2235c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Illegal argument " + paramsStr, e);
223645a984619e338090981499e4823e0177649e3c28Roshan Pius                return false;
223745a984619e338090981499e4823e0177649e3c28Roshan Pius            }
2238445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius        }
2239445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    }
224045a984619e338090981499e4823e0177649e3c28Roshan Pius
224196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
224296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean sendNetworkEapSimUmtsAuthResponse(
224396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams params) {
224496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
224596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "sendNetworkEapSimUmtsAuthResponse";
224696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
224796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
224896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
224996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaNetwork.sendNetworkEapSimUmtsAuthResponse(params);
225096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
225196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
225296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
225396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
225496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
225596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
225696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
2257445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
2258445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Send UMTS auts response.
2259445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     *
2260445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @param paramsStr Response params as a string.
2261445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @return true if succeeds, false otherwise.
2262445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
2263445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    public boolean sendNetworkEapSimUmtsAutsResponse(String paramsStr) {
2264c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2265c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            try {
2266c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Matcher match = UMTS_AUTS_RESPONSE_PARAMS_PATTERN.matcher(paramsStr);
2267c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (!match.find() || match.groupCount() != 1) {
2268c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Malformed umts auts response params: " + paramsStr);
2269c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
2270c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2271c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                byte[] auts = NativeUtil.hexStringToByteArray(match.group(1));
2272c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (auts == null || auts.length != 14) {
2273c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.e(TAG, "Invalid auts value: " + match.group(1));
2274c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    return false;
2275c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2276c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return sendNetworkEapSimUmtsAutsResponse(auts);
2277c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } catch (IllegalArgumentException e) {
2278c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Illegal argument " + paramsStr, e);
227945a984619e338090981499e4823e0177649e3c28Roshan Pius                return false;
228045a984619e338090981499e4823e0177649e3c28Roshan Pius            }
2281445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius        }
2282445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    }
228396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
228496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean sendNetworkEapSimUmtsAutsResponse(byte[/* 14 */] auts) {
228596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
228696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "sendNetworkEapSimUmtsAutsResponse";
228796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
228896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
228996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
229096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaNetwork.sendNetworkEapSimUmtsAutsResponse(auts);
229196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
229296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
229396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
229496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
229596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
229696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
229796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
229896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
2299445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    public boolean sendNetworkEapSimUmtsAuthFailure() {
230096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
230196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "sendNetworkEapSimUmtsAuthFailure";
230296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
230396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
230496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaNetwork.sendNetworkEapSimUmtsAuthFailure();
230596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
230696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
230796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
230896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
230996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
231096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
231196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
2312445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    /**
2313445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * Send eap identity response.
2314445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     *
2315445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @param identityStr Identity as a string.
2316445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     * @return true if succeeds, false otherwise.
2317445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius     */
2318445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    public boolean sendNetworkEapIdentityResponse(String identityStr) {
2319c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2320c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            try {
2321c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                ArrayList<Byte> identity = NativeUtil.stringToByteArrayList(identityStr);
2322c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return sendNetworkEapIdentityResponse(identity);
2323c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } catch (IllegalArgumentException e) {
2324c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Illegal argument " + identityStr, e);
2325c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
2326c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
232745a984619e338090981499e4823e0177649e3c28Roshan Pius        }
2328445b5f46264af0a2e9c043c9badb2b4f38044f11Roshan Pius    }
232996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See ISupplicantStaNetwork.hal for documentation */
233096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean sendNetworkEapIdentityResponse(ArrayList<Byte> identity) {
233196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
233296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "sendNetworkEapIdentityResponse";
233396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
233496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
233596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
233696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaNetwork.sendNetworkEapIdentityResponse(identity);
233796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
233896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
233996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                handleRemoteException(e, methodStr);
234096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
234196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
234296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
234396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
234496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
23450a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius    /**
23460a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius     * Retrieve the NFC token for this network.
23470a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius     *
23480a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius     * @return Hex string corresponding to the NFC token or null for failure.
23490a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius     */
23500a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius    public String getWpsNfcConfigurationToken() {
2351c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2352c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            ArrayList<Byte> token = getWpsNfcConfigurationTokenInternal();
2353c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (token == null) {
2354c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return null;
2355c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
2356c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return NativeUtil.hexStringFromByteArray(NativeUtil.byteArrayFromArrayList(token));
23570a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius        }
23580a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius    }
23590a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius
23607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaNetwork.hal for documentation */
23610a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius    private ArrayList<Byte> getWpsNfcConfigurationTokenInternal() {
23627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
23637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "getWpsNfcConfigurationToken";
23647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return null;
23657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final Mutable<ArrayList<Byte>> gotToken = new Mutable<>();
23667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
23677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                mISupplicantStaNetwork.getWpsNfcConfigurationToken(
23687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                        (SupplicantStatus status, ArrayList<Byte> token) -> {
23697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                            if (checkStatusAndLogFailure(status, methodStr)) {
23707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                                gotToken.value = token;
23717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                            }
23727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                        });
23737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
23747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                handleRemoteException(e, methodStr);
23757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
23767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            return gotToken.value;
23777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
23787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
23797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
238096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
238196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Returns true if provided status code is SUCCESS, logs debug message and returns false
238296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * otherwise
238396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
238496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean checkStatusAndLogFailure(SupplicantStatus status, final String methodStr) {
2385c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2386c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (status.code != SupplicantStatusCode.SUCCESS) {
2387c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "ISupplicantStaNetwork." + methodStr + " failed: "
2388c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        + SupplicantStaIfaceHal.supplicantStatusCodeToString(status.code) + ", "
2389c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                        + status.debugMessage);
2390c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
2391c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            } else {
2392c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                if (mVerboseLoggingEnabled) {
2393c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                    Log.d(TAG, "ISupplicantStaNetwork." + methodStr + " succeeded");
2394c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                }
2395c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return true;
2396511c6a204fefd7d295cb3728e6d4665106a29ae7Roshan Pius            }
239796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
239896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
239996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
240096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
2401b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius     * Helper function to log callbacks.
2402b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius     */
2403b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius    private void logCallback(final String methodStr) {
2404c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2405c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (mVerboseLoggingEnabled) {
2406c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.d(TAG, "ISupplicantStaNetworkCallback." + methodStr + " received");
2407c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
2408b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius        }
2409b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius    }
2410b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius
2411b70d1e046a5eb7e87c6b96beec30bcb985ee9c3cRoshan Pius    /**
241296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Returns false if ISupplicantStaNetwork is null, and logs failure of methodStr
241396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
241496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean checkISupplicantStaNetworkAndLogFailure(final String methodStr) {
2415c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2416c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (mISupplicantStaNetwork == null) {
2417c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                Log.e(TAG, "Can't call " + methodStr + ", ISupplicantStaNetwork is null");
2418c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return false;
2419c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
2420c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return true;
242196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
242296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
242396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
2424b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius    private void handleRemoteException(RemoteException e, String methodStr) {
2425c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2426c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            mISupplicantStaNetwork = null;
2427c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            Log.e(TAG, "ISupplicantStaNetwork." + methodStr + " failed with exception", e);
2428c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        }
2429b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius    }
2430b850a6ae6fe8470fd9338bbc9978caadc7ca2c4bRoshan Pius
2431c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    /**
2432c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius     * Adds FT flags for networks if the device supports it.
2433c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius     */
2434c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    private BitSet addFastTransitionFlags(BitSet keyManagementFlags) {
2435c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2436c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (!mSystemSupportsFastBssTransition) {
2437c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                return keyManagementFlags;
2438c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
2439c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            BitSet modifiedFlags = (BitSet) keyManagementFlags.clone();
2440c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (keyManagementFlags.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
2441c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                modifiedFlags.set(WifiConfiguration.KeyMgmt.FT_PSK);
2442c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
2443c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            if (keyManagementFlags.get(WifiConfiguration.KeyMgmt.WPA_EAP)) {
2444c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                modifiedFlags.set(WifiConfiguration.KeyMgmt.FT_EAP);
2445c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            }
2446c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return modifiedFlags;
2447c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius        }
2448c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    }
2449c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius
2450c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    /**
2451c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius     * Removes FT flags for networks if the device supports it.
2452c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius     */
2453c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    private BitSet removeFastTransitionFlags(BitSet keyManagementFlags) {
2454c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        synchronized (mLock) {
2455c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            BitSet modifiedFlags = (BitSet) keyManagementFlags.clone();
2456c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            modifiedFlags.clear(WifiConfiguration.KeyMgmt.FT_PSK);
2457c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            modifiedFlags.clear(WifiConfiguration.KeyMgmt.FT_EAP);
2458c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius            return modifiedFlags;
2459c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius        }
2460c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    }
2461c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius
2462b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
2463b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Creates the JSON encoded network extra using the map of string key, value pairs.
2464b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
2465b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static String createNetworkExtra(Map<String, String> values) {
2466b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        final String encoded;
2467b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        try {
2468b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            encoded = URLEncoder.encode(new JSONObject(values).toString(), "UTF-8");
2469b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        } catch (NullPointerException e) {
2470b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(TAG, "Unable to serialize networkExtra: " + e.toString());
2471b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return null;
2472b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        } catch (UnsupportedEncodingException e) {
2473b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(TAG, "Unable to serialize networkExtra: " + e.toString());
2474b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return null;
2475b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        }
2476b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return encoded;
2477b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
2478b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
2479b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
2480b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Parse the network extra JSON encoded string to a map of string key, value pairs.
2481b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
2482b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static Map<String, String> parseNetworkExtra(String encoded) {
2483b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (TextUtils.isEmpty(encoded)) {
2484b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return null;
2485b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        }
2486b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        try {
2487b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // This method reads a JSON dictionary that was written by setNetworkExtra(). However,
2488b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // on devices that upgraded from Marshmallow, it may encounter a legacy value instead -
2489b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // an FQDN stored as a plain string. If such a value is encountered, the JSONObject
2490b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // constructor will thrown a JSONException and the method will return null.
2491b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            final JSONObject json = new JSONObject(URLDecoder.decode(encoded, "UTF-8"));
2492b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            final Map<String, String> values = new HashMap<>();
2493b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            final Iterator<?> it = json.keys();
2494b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            while (it.hasNext()) {
2495b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                final String key = (String) it.next();
2496b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                final Object value = json.get(key);
2497b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                if (value instanceof String) {
2498b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                    values.put(key, (String) value);
2499b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                }
2500b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            }
2501b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return values;
2502b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        } catch (UnsupportedEncodingException e) {
2503b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(TAG, "Unable to deserialize networkExtra: " + e.toString());
2504b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return null;
2505b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        } catch (JSONException e) {
2506b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // This is not necessarily an error. This exception will also occur if we encounter a
2507b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // legacy FQDN stored as a plain string. We want to return null in this case as no JSON
2508b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            // dictionary of extras was found.
2509b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return null;
2510b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        }
2511b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
2512b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
25137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private static class Mutable<E> {
25147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        public E value;
25157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
25167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        Mutable() {
25177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            value = null;
25187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
25197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
25207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        Mutable(E value) {
25217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            this.value = value;
25227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
25237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
2524c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius
2525c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius    private class SupplicantStaNetworkHalCallback extends ISupplicantStaNetworkCallback.Stub {
2526c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        /**
2527c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius         * Current configured network's framework network id.
2528c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius         */
2529c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        private final int mFramewokNetworkId;
2530c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        /**
2531c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius         * Current configured network's ssid.
2532c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius         */
2533c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        private final String mSsid;
2534c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius
2535c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        SupplicantStaNetworkHalCallback(int framewokNetworkId, String ssid) {
2536c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            mFramewokNetworkId = framewokNetworkId;
2537c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            mSsid = ssid;
2538c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        }
2539c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius
2540c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        @Override
2541c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        public void onNetworkEapSimGsmAuthRequest(
2542c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                ISupplicantStaNetworkCallback.NetworkRequestEapSimGsmAuthParams params) {
2543c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            synchronized (mLock) {
2544c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                logCallback("onNetworkEapSimGsmAuthRequest");
2545c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                String[] data = new String[params.rands.size()];
2546c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                int i = 0;
2547c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                for (byte[] rand : params.rands) {
2548c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                    data[i++] = NativeUtil.hexStringFromByteArray(rand);
2549c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                }
2550c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                mWifiMonitor.broadcastNetworkGsmAuthRequestEvent(
2551c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                        mIfaceName, mFramewokNetworkId, mSsid, data);
2552c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            }
2553c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        }
2554c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius
2555c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        @Override
2556c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        public void onNetworkEapSimUmtsAuthRequest(
2557c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                ISupplicantStaNetworkCallback.NetworkRequestEapSimUmtsAuthParams params) {
2558c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            synchronized (mLock) {
2559c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                logCallback("onNetworkEapSimUmtsAuthRequest");
2560c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                String randHex = NativeUtil.hexStringFromByteArray(params.rand);
2561dd685b34596b790c76e2cc03fc825c1249c9174fRoshan Pius                String autnHex = NativeUtil.hexStringFromByteArray(params.autn);
2562dd685b34596b790c76e2cc03fc825c1249c9174fRoshan Pius                String[] data = {randHex, autnHex};
2563c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                mWifiMonitor.broadcastNetworkUmtsAuthRequestEvent(
2564c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                        mIfaceName, mFramewokNetworkId, mSsid, data);
2565c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            }
2566c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        }
2567c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius
2568c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        @Override
2569c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        public void onNetworkEapIdentityRequest() {
2570c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            synchronized (mLock) {
2571c0203e2c4ffeae355c88939fb180c2e1913c108dRoshan Pius                logCallback("onNetworkEapIdentityRequest");
2572c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                mWifiMonitor.broadcastNetworkIdentityRequestEvent(
2573c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius                        mIfaceName, mFramewokNetworkId, mSsid);
2574c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius            }
2575c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius        }
2576c3d81dbf035c205ca1baf16b84a41b67eda9ae4aRoshan Pius    }
257796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne}
2578