1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.server.wifi; 17 18 import static org.junit.Assert.*; 19 import static org.mockito.Matchers.eq; 20 import static org.mockito.Mockito.any; 21 import static org.mockito.Mockito.anyString; 22 import static org.mockito.Mockito.doAnswer; 23 import static org.mockito.Mockito.never; 24 import static org.mockito.Mockito.verify; 25 import static org.mockito.Mockito.when; 26 27 import android.app.test.MockAnswerUtil.AnswerWithArguments; 28 import android.content.Context; 29 import android.hardware.wifi.supplicant.V1_0.ISupplicantNetwork; 30 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork; 31 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetworkCallback; 32 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetworkCallback 33 .NetworkRequestEapSimGsmAuthParams; 34 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetworkCallback 35 .NetworkRequestEapSimUmtsAuthParams; 36 import android.hardware.wifi.supplicant.V1_0.SupplicantStatus; 37 import android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode; 38 import android.net.wifi.WifiConfiguration; 39 import android.net.wifi.WifiEnterpriseConfig; 40 import android.os.RemoteException; 41 import android.text.TextUtils; 42 43 import com.android.internal.R; 44 import com.android.server.wifi.util.NativeUtil; 45 46 import org.junit.Before; 47 import org.junit.Test; 48 import org.mockito.Mock; 49 import org.mockito.MockitoAnnotations; 50 51 import java.util.ArrayList; 52 import java.util.HashMap; 53 import java.util.Map; 54 import java.util.Random; 55 56 /** 57 * Unit tests for SupplicantStaNetworkHal 58 */ 59 public class SupplicantStaNetworkHalTest { 60 private static final String IFACE_NAME = "wlan0"; 61 private static final Map<String, String> NETWORK_EXTRAS_VALUES = new HashMap<>(); 62 static { 63 NETWORK_EXTRAS_VALUES.put("key1", "value1"); 64 NETWORK_EXTRAS_VALUES.put("key2", "value2"); 65 } 66 private static final String NETWORK_EXTRAS_SERIALIZED = 67 "%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D"; 68 private static final String ANONYMOUS_IDENTITY = "aaa (at) bbb.cc.ddd"; 69 70 private SupplicantStaNetworkHal mSupplicantNetwork; 71 private SupplicantStatus mStatusSuccess; 72 private SupplicantStatus mStatusFailure; 73 @Mock private ISupplicantStaNetwork mISupplicantStaNetworkMock; 74 @Mock private Context mContext; 75 @Mock private WifiMonitor mWifiMonitor; 76 private SupplicantNetworkVariables mSupplicantVariables; 77 private MockResources mResources; 78 private ISupplicantStaNetworkCallback mISupplicantStaNetworkCallback; 79 80 @Before 81 public void setUp() throws Exception { 82 MockitoAnnotations.initMocks(this); 83 mStatusSuccess = createSupplicantStatus(SupplicantStatusCode.SUCCESS); 84 mStatusFailure = createSupplicantStatus(SupplicantStatusCode.FAILURE_UNKNOWN); 85 mSupplicantVariables = new SupplicantNetworkVariables(); 86 setupISupplicantNetworkMock(); 87 88 mResources = new MockResources(); 89 when(mContext.getResources()).thenReturn(mResources); 90 createSupplicantStaNetwork(); 91 } 92 93 /** 94 * Tests the saving of WifiConfiguration to wpa_supplicant. 95 */ 96 @Test 97 public void testOpenNetworkWifiConfigurationSaveLoad() throws Exception { 98 WifiConfiguration config = WifiConfigurationTestUtil.createOpenHiddenNetwork(); 99 config.updateIdentifier = "45"; 100 testWifiConfigurationSaveLoad(config); 101 } 102 103 /** 104 * Tests the saving/loading of WifiConfiguration to wpa_supplicant with psk passphrase. 105 */ 106 @Test 107 public void testPskPassphraseNetworkWifiConfigurationSaveLoad() throws Exception { 108 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 109 config.requirePMF = true; 110 testWifiConfigurationSaveLoad(config); 111 verify(mISupplicantStaNetworkMock).setPskPassphrase(anyString()); 112 verify(mISupplicantStaNetworkMock) 113 .getPskPassphrase(any(ISupplicantStaNetwork.getPskPassphraseCallback.class)); 114 verify(mISupplicantStaNetworkMock, never()).setPsk(any(byte[].class)); 115 verify(mISupplicantStaNetworkMock, never()) 116 .getPsk(any(ISupplicantStaNetwork.getPskCallback.class)); 117 } 118 119 /** 120 * Tests the saving/loading of WifiConfiguration to wpa_supplicant with raw psk. 121 */ 122 @Test 123 public void testPskNetworkWifiConfigurationSaveLoad() throws Exception { 124 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 125 config.preSharedKey = "945ef00c463c2a7c2496376b13263d1531366b46377179a4b17b393687450779"; 126 testWifiConfigurationSaveLoad(config); 127 verify(mISupplicantStaNetworkMock).setPsk(any(byte[].class)); 128 verify(mISupplicantStaNetworkMock) 129 .getPsk(any(ISupplicantStaNetwork.getPskCallback.class)); 130 verify(mISupplicantStaNetworkMock, never()).setPskPassphrase(anyString()); 131 verify(mISupplicantStaNetworkMock) 132 .getPskPassphrase(any(ISupplicantStaNetwork.getPskPassphraseCallback.class)); 133 } 134 135 /** 136 * Tests the saving of WifiConfiguration to wpa_supplicant removes enclosing quotes of psk 137 * passphrase 138 */ 139 @Test 140 public void testPskNetworkWifiConfigurationSaveRemovesPskQuotes() throws Exception { 141 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 142 config.preSharedKey = "\"quoted_psd\""; 143 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 144 assertEquals(mSupplicantVariables.pskPassphrase, 145 NativeUtil.removeEnclosingQuotes(config.preSharedKey)); 146 } 147 148 /** 149 * Tests the saving/loading of WifiConfiguration to wpa_supplicant. 150 */ 151 @Test 152 public void testWepNetworkWifiConfigurationSaveLoad() throws Exception { 153 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 154 config.BSSID = "34:45:19:09:45"; 155 testWifiConfigurationSaveLoad(config); 156 } 157 158 /** 159 * Tests the saving of WifiConfiguration to wpa_supplicant. 160 */ 161 @Test 162 public void testEapPeapGtcNetworkWifiConfigurationSaveLoad() throws Exception { 163 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 164 config.enterpriseConfig = 165 WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2(); 166 testWifiConfigurationSaveLoad(config); 167 } 168 169 /** 170 * Tests the saving of WifiConfiguration to wpa_supplicant. 171 */ 172 @Test 173 public void testEapTlsNoneNetworkWifiConfigurationSaveLoad() throws Exception { 174 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 175 config.enterpriseConfig = 176 WifiConfigurationTestUtil.createTLSWifiEnterpriseConfigWithNonePhase2(); 177 testWifiConfigurationSaveLoad(config); 178 } 179 180 /** 181 * Tests the saving of WifiConfiguration to wpa_supplicant. 182 */ 183 @Test 184 public void testEapTlsNoneClientCertNetworkWifiConfigurationSaveLoad() throws Exception { 185 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 186 config.enterpriseConfig = 187 WifiConfigurationTestUtil.createTLSWifiEnterpriseConfigWithNonePhase2(); 188 config.enterpriseConfig.setClientCertificateAlias("test_alias"); 189 testWifiConfigurationSaveLoad(config); 190 } 191 192 /** 193 * Tests the saving of WifiConfiguration to wpa_supplicant. 194 */ 195 @Test 196 public void testEapTlsAkaNetworkWifiConfigurationSaveLoad() throws Exception { 197 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 198 config.enterpriseConfig = 199 WifiConfigurationTestUtil.createTLSWifiEnterpriseConfigWithAkaPhase2(); 200 testWifiConfigurationSaveLoad(config); 201 } 202 203 /** 204 * Tests the loading of network ID. 205 */ 206 @Test 207 public void testNetworkIdLoad() throws Exception { 208 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 209 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 210 211 // Modify the supplicant variable directly. 212 mSupplicantVariables.networkId = 5; 213 WifiConfiguration loadConfig = new WifiConfiguration(); 214 Map<String, String> networkExtras = new HashMap<>(); 215 assertTrue(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 216 assertEquals(mSupplicantVariables.networkId, loadConfig.networkId); 217 } 218 219 /** 220 * Tests the failure to load ssid aborts the loading of network variables. 221 */ 222 @Test 223 public void testSsidLoadFailure() throws Exception { 224 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 225 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 226 227 doAnswer(new AnswerWithArguments() { 228 public void answer(ISupplicantStaNetwork.getSsidCallback cb) throws RemoteException { 229 cb.onValues(mStatusFailure, mSupplicantVariables.ssid); 230 } 231 }).when(mISupplicantStaNetworkMock) 232 .getSsid(any(ISupplicantStaNetwork.getSsidCallback.class)); 233 234 WifiConfiguration loadConfig = new WifiConfiguration(); 235 Map<String, String> networkExtras = new HashMap<>(); 236 assertFalse(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 237 } 238 239 /** 240 * Tests the failure to save ssid. 241 */ 242 @Test 243 public void testSsidSaveFailure() throws Exception { 244 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 245 246 doAnswer(new AnswerWithArguments() { 247 public SupplicantStatus answer(ArrayList<Byte> ssid) throws RemoteException { 248 return mStatusFailure; 249 } 250 }).when(mISupplicantStaNetworkMock).setSsid(any(ArrayList.class)); 251 252 assertFalse(mSupplicantNetwork.saveWifiConfiguration(config)); 253 } 254 255 /** 256 * Tests the failure to save invalid key mgmt (unknown bit set in the 257 * {@link WifiConfiguration#allowedKeyManagement} being saved). 258 */ 259 @Test 260 public void testInvalidKeyMgmtSaveFailure() throws Exception { 261 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 262 config.allowedKeyManagement.set(10); 263 try { 264 assertFalse(mSupplicantNetwork.saveWifiConfiguration(config)); 265 } catch (IllegalArgumentException e) { 266 return; 267 } 268 assertTrue(false); 269 } 270 271 /** 272 * Tests the failure to load invalid key mgmt (unkown bit set in the supplicant network key_mgmt 273 * variable read). 274 */ 275 @Test 276 public void testInvalidKeyMgmtLoadFailure() throws Exception { 277 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 278 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 279 280 // Modify the supplicant variable directly. 281 mSupplicantVariables.keyMgmtMask = 0xFFFFF; 282 WifiConfiguration loadConfig = new WifiConfiguration(); 283 Map<String, String> networkExtras = new HashMap<>(); 284 try { 285 assertFalse(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 286 } catch (IllegalArgumentException e) { 287 return; 288 } 289 assertTrue(false); 290 } 291 292 /** 293 * Tests the failure to save invalid bssid (less than 6 bytes in the 294 * {@link WifiConfiguration#BSSID} being saved). 295 */ 296 @Test 297 public void testInvalidBssidSaveFailure() throws Exception { 298 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 299 config.getNetworkSelectionStatus().setNetworkSelectionBSSID("45:34:23:12"); 300 try { 301 assertFalse(mSupplicantNetwork.saveWifiConfiguration(config)); 302 } catch (IllegalArgumentException e) { 303 return; 304 } 305 assertTrue(false); 306 } 307 308 /** 309 * Tests the failure to load invalid bssid (less than 6 bytes in the supplicant bssid variable 310 * read). 311 */ 312 @Test 313 public void testInvalidBssidLoadFailure() throws Exception { 314 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 315 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 316 317 // Modify the supplicant variable directly. 318 mSupplicantVariables.bssid = new byte[3]; 319 WifiConfiguration loadConfig = new WifiConfiguration(); 320 Map<String, String> networkExtras = new HashMap<>(); 321 try { 322 assertFalse(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 323 } catch (IllegalArgumentException e) { 324 return; 325 } 326 assertTrue(false); 327 } 328 329 /** 330 * Tests the loading of invalid ssid from wpa_supplicant. 331 */ 332 @Test 333 public void testInvalidSsidLoadFailure() throws Exception { 334 WifiConfiguration config = WifiConfigurationTestUtil.createWepHiddenNetwork(); 335 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 336 337 // Modify the supplicant variable directly. 338 mSupplicantVariables.ssid = null; 339 340 WifiConfiguration loadConfig = new WifiConfiguration(); 341 Map<String, String> networkExtras = new HashMap<>(); 342 assertFalse(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 343 } 344 345 /** 346 * Tests the loading of invalid eap method from wpa_supplicant. 347 * Invalid eap method is assumed to be a non enterprise network. So, the loading should 348 * succeed as a non-enterprise network. 349 */ 350 @Test 351 public void testInvalidEapMethodLoadFailure() throws Exception { 352 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 353 config.enterpriseConfig = 354 WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2(); 355 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 356 357 // Modify the supplicant variable directly. 358 mSupplicantVariables.eapMethod = -1; 359 360 WifiConfiguration loadConfig = new WifiConfiguration(); 361 Map<String, String> networkExtras = new HashMap<>(); 362 assertTrue(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 363 } 364 365 /** 366 * Tests the loading of invalid eap phase2 method from wpa_supplicant. 367 */ 368 @Test 369 public void testInvalidEapPhase2MethodLoadFailure() throws Exception { 370 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 371 config.enterpriseConfig = 372 WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2(); 373 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 374 375 // Modify the supplicant variable directly. 376 mSupplicantVariables.eapPhase2Method = -1; 377 378 WifiConfiguration loadConfig = new WifiConfiguration(); 379 Map<String, String> networkExtras = new HashMap<>(); 380 assertFalse(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 381 } 382 383 /** 384 * Tests the parsing of GSM auth response parameters. 385 */ 386 @Test 387 public void testSendNetworkEapSimGsmAuthResponseWith2KcSresPair() throws Exception { 388 final byte[] kc = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34, 0x12}; 389 final byte[] sres = new byte[]{0x12, 0x10, 0x32, 0x23}; 390 // Send 2 kc/sres pair for this request. 391 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(kc) 392 + ":" + NativeUtil.hexStringFromByteArray(sres) 393 + ":" + NativeUtil.hexStringFromByteArray(kc) 394 + ":" + NativeUtil.hexStringFromByteArray(sres); 395 396 doAnswer(new AnswerWithArguments() { 397 public SupplicantStatus answer( 398 ArrayList<ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams> params) 399 throws RemoteException { 400 assertEquals(2, params.size()); 401 assertArrayEquals(kc, params.get(0).kc); 402 assertArrayEquals(sres, params.get(0).sres); 403 assertArrayEquals(kc, params.get(1).kc); 404 assertArrayEquals(sres, params.get(1).sres); 405 return mStatusSuccess; 406 } 407 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimGsmAuthResponse(any(ArrayList.class)); 408 409 assertTrue(mSupplicantNetwork.sendNetworkEapSimGsmAuthResponse(paramsStr)); 410 } 411 412 /** 413 * Tests the parsing of GSM auth response parameters. 414 */ 415 @Test 416 public void testSendNetworkEapSimGsmAuthResponseWith3KcSresPair() throws Exception { 417 final byte[] kc1 = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34, 0x12}; 418 final byte[] sres1 = new byte[]{0x12, 0x10, 0x32, 0x23}; 419 final byte[] kc2 = new byte[]{0x45, 0x34, 0x12, 0x34, 0x45, 0x10, 0x34, 0x12}; 420 final byte[] sres2 = new byte[]{0x12, 0x23, 0x12, 0x23}; 421 final byte[] kc3 = new byte[]{0x25, 0x34, 0x12, 0x14, 0x45, 0x10, 0x34, 0x12}; 422 final byte[] sres3 = new byte[]{0x42, 0x23, 0x22, 0x23}; 423 // Send 3 kc/sres pair for this request. 424 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(kc1) 425 + ":" + NativeUtil.hexStringFromByteArray(sres1) 426 + ":" + NativeUtil.hexStringFromByteArray(kc2) 427 + ":" + NativeUtil.hexStringFromByteArray(sres2) 428 + ":" + NativeUtil.hexStringFromByteArray(kc3) 429 + ":" + NativeUtil.hexStringFromByteArray(sres3); 430 431 doAnswer(new AnswerWithArguments() { 432 public SupplicantStatus answer( 433 ArrayList<ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams> params) 434 throws RemoteException { 435 assertEquals(3, params.size()); 436 assertArrayEquals(kc1, params.get(0).kc); 437 assertArrayEquals(sres1, params.get(0).sres); 438 assertArrayEquals(kc2, params.get(1).kc); 439 assertArrayEquals(sres2, params.get(1).sres); 440 assertArrayEquals(kc3, params.get(2).kc); 441 assertArrayEquals(sres3, params.get(2).sres); 442 return mStatusSuccess; 443 } 444 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimGsmAuthResponse(any(ArrayList.class)); 445 446 assertTrue(mSupplicantNetwork.sendNetworkEapSimGsmAuthResponse(paramsStr)); 447 } 448 449 /** 450 * Tests the parsing of invalid GSM auth response parameters (invalid kc & sres lengths). 451 */ 452 @Test 453 public void testSendInvalidKcSresLenNetworkEapSimGsmAuthResponse() throws Exception { 454 final byte[] kc1 = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34}; 455 final byte[] sres1 = new byte[]{0x12, 0x10, 0x23}; 456 final byte[] kc2 = new byte[]{0x45, 0x34, 0x12, 0x34, 0x45, 0x10, 0x34, 0x12}; 457 final byte[] sres2 = new byte[]{0x12, 0x23, 0x12, 0x23}; 458 // Send 2 kc/sres pair for this request. 459 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(kc1) 460 + ":" + NativeUtil.hexStringFromByteArray(sres1) 461 + ":" + NativeUtil.hexStringFromByteArray(kc2) 462 + ":" + NativeUtil.hexStringFromByteArray(sres2); 463 464 doAnswer(new AnswerWithArguments() { 465 public SupplicantStatus answer( 466 ArrayList<ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams> params) 467 throws RemoteException { 468 return mStatusSuccess; 469 } 470 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimGsmAuthResponse(any(ArrayList.class)); 471 472 assertFalse(mSupplicantNetwork.sendNetworkEapSimGsmAuthResponse(paramsStr)); 473 } 474 475 /** 476 * Tests the parsing of invalid GSM auth response parameters (invalid number of kc/sres pairs). 477 */ 478 @Test 479 public void testSendInvalidKcSresPairNumNetworkEapSimGsmAuthResponse() throws Exception { 480 final byte[] kc = new byte[]{0x45, 0x34, 0x12, 0x34, 0x45, 0x10, 0x34, 0x12}; 481 final byte[] sres = new byte[]{0x12, 0x23, 0x12, 0x23}; 482 // Send 1 kc/sres pair for this request. 483 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(kc) 484 + ":" + NativeUtil.hexStringFromByteArray(sres); 485 486 doAnswer(new AnswerWithArguments() { 487 public SupplicantStatus answer( 488 ArrayList<ISupplicantStaNetwork.NetworkResponseEapSimGsmAuthParams> params) 489 throws RemoteException { 490 return mStatusSuccess; 491 } 492 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimGsmAuthResponse(any(ArrayList.class)); 493 494 assertFalse(mSupplicantNetwork.sendNetworkEapSimGsmAuthResponse(paramsStr)); 495 } 496 497 /** 498 * Tests the parsing of UMTS auth response parameters. 499 */ 500 @Test 501 public void testSendNetworkEapSimUmtsAuthResponse() throws Exception { 502 final byte[] ik = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34, 0x12, 0x23, 0x34, 503 0x33, 0x23, 0x34, 0x10, 0x40, 0x34}; 504 final byte[] ck = new byte[]{0x12, 0x10, 0x32, 0x23, 0x45, 0x10, 0x34, 0x12, 0x23, 0x34, 505 0x33, 0x23, 0x34, 0x10, 0x40, 0x34}; 506 final byte[] res = new byte[]{0x12, 0x10, 0x32, 0x23, 0x45, 0x10, 0x34, 0x12, 0x23, 0x34}; 507 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(ik) 508 + ":" + NativeUtil.hexStringFromByteArray(ck) 509 + ":" + NativeUtil.hexStringFromByteArray(res); 510 511 doAnswer(new AnswerWithArguments() { 512 public SupplicantStatus answer( 513 ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams params) 514 throws RemoteException { 515 assertArrayEquals(ik, params.ik); 516 assertArrayEquals(ck, params.ck); 517 // Convert to arraylist before comparison. 518 ArrayList<Byte> resList = new ArrayList<>(); 519 for (byte b : res) { 520 resList.add(b); 521 } 522 assertEquals(resList, params.res); 523 return mStatusSuccess; 524 } 525 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimUmtsAuthResponse( 526 any(ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams.class)); 527 528 assertTrue(mSupplicantNetwork.sendNetworkEapSimUmtsAuthResponse(paramsStr)); 529 } 530 531 /** 532 * Tests the parsing of invalid UMTS auth response parameters (invalid ik, ck lengths). 533 */ 534 @Test 535 public void testSendInvalidNetworkEapSimUmtsAuthResponse() throws Exception { 536 final byte[] ik = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34, 0x12}; 537 final byte[] ck = new byte[]{0x12, 0x10, 0x32, 0x23, 0x45, 0x10, 0x34, 0x12, 0x23, 0x34, 538 0x33, 0x23, 0x34, 0x10, 0x40}; 539 final byte[] res = new byte[]{0x12, 0x10, 0x32, 0x23, 0x45, 0x10, 0x34, 0x12, 0x23, 0x34}; 540 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(ik) 541 + ":" + NativeUtil.hexStringFromByteArray(ck) 542 + ":" + NativeUtil.hexStringFromByteArray(res); 543 544 doAnswer(new AnswerWithArguments() { 545 public SupplicantStatus answer( 546 ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams params) 547 throws RemoteException { 548 return mStatusSuccess; 549 } 550 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimUmtsAuthResponse( 551 any(ISupplicantStaNetwork.NetworkResponseEapSimUmtsAuthParams.class)); 552 553 assertFalse(mSupplicantNetwork.sendNetworkEapSimUmtsAuthResponse(paramsStr)); 554 } 555 556 /** 557 * Tests the parsing of UMTS auts response parameters. 558 */ 559 @Test 560 public void testSendNetworkEapSimUmtsAutsResponse() throws Exception { 561 final byte[] auts = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34, 0x12, 0x23, 0x34, 562 0x33, 0x23, 0x34, 0x10}; 563 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(auts); 564 565 doAnswer(new AnswerWithArguments() { 566 public SupplicantStatus answer(byte[] params) 567 throws RemoteException { 568 assertArrayEquals(auts, params); 569 return mStatusSuccess; 570 } 571 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimUmtsAutsResponse(any(byte[].class)); 572 573 assertTrue(mSupplicantNetwork.sendNetworkEapSimUmtsAutsResponse(paramsStr)); 574 } 575 576 /** 577 * Tests the parsing of invalid UMTS auts response parameters (invalid auts length). 578 */ 579 @Test 580 public void testSendInvalidNetworkEapSimUmtsAutsResponse() throws Exception { 581 final byte[] auts = new byte[]{0x45, 0x45, 0x32, 0x34, 0x45, 0x10, 0x34, 0x12, 0x23}; 582 String paramsStr = ":" + NativeUtil.hexStringFromByteArray(auts); 583 584 doAnswer(new AnswerWithArguments() { 585 public SupplicantStatus answer(byte[] params) 586 throws RemoteException { 587 assertArrayEquals(auts, params); 588 return mStatusSuccess; 589 } 590 }).when(mISupplicantStaNetworkMock).sendNetworkEapSimUmtsAutsResponse(any(byte[].class)); 591 592 assertFalse(mSupplicantNetwork.sendNetworkEapSimUmtsAutsResponse(paramsStr)); 593 } 594 595 /** 596 * Tests the parsing of identity string. 597 */ 598 @Test 599 public void testSendNetworkEapIdentityResponse() throws Exception { 600 final String identityStr = "test (at) test.com"; 601 602 doAnswer(new AnswerWithArguments() { 603 public SupplicantStatus answer(ArrayList<Byte> identity) 604 throws RemoteException { 605 assertEquals(identityStr, NativeUtil.stringFromByteArrayList(identity)); 606 return mStatusSuccess; 607 } 608 }).when(mISupplicantStaNetworkMock).sendNetworkEapIdentityResponse(any(ArrayList.class)); 609 610 assertTrue(mSupplicantNetwork.sendNetworkEapIdentityResponse(identityStr)); 611 } 612 613 /** 614 * Tests the addition of FT flags when the device supports it. 615 */ 616 @Test 617 public void testAddFtPskFlags() throws Exception { 618 mResources.setBoolean(R.bool.config_wifi_fast_bss_transition_enabled, true); 619 createSupplicantStaNetwork(); 620 621 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 622 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 623 624 // Check the supplicant variables to ensure that we have added the FT flags. 625 assertTrue((mSupplicantVariables.keyMgmtMask & ISupplicantStaNetwork.KeyMgmtMask.FT_PSK) 626 == ISupplicantStaNetwork.KeyMgmtMask.FT_PSK); 627 628 WifiConfiguration loadConfig = new WifiConfiguration(); 629 Map<String, String> networkExtras = new HashMap<>(); 630 assertTrue(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 631 // The FT flags should be stripped out when reading it back. 632 WifiConfigurationTestUtil.assertConfigurationEqualForSupplicant(config, loadConfig); 633 } 634 635 /** 636 * Tests the addition of FT flags when the device supports it. 637 */ 638 @Test 639 public void testAddFtEapFlags() throws Exception { 640 mResources.setBoolean(R.bool.config_wifi_fast_bss_transition_enabled, true); 641 createSupplicantStaNetwork(); 642 643 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 644 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 645 646 // Check the supplicant variables to ensure that we have added the FT flags. 647 assertTrue((mSupplicantVariables.keyMgmtMask & ISupplicantStaNetwork.KeyMgmtMask.FT_EAP) 648 == ISupplicantStaNetwork.KeyMgmtMask.FT_EAP); 649 650 WifiConfiguration loadConfig = new WifiConfiguration(); 651 Map<String, String> networkExtras = new HashMap<>(); 652 assertTrue(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 653 // The FT flags should be stripped out when reading it back. 654 WifiConfigurationTestUtil.assertConfigurationEqualForSupplicant(config, loadConfig); 655 } 656 657 /** 658 * Tests the retrieval of WPS NFC token. 659 */ 660 @Test 661 public void testGetWpsNfcConfigurationToken() throws Exception { 662 final ArrayList<Byte> token = new ArrayList<>(); 663 token.add(Byte.valueOf((byte) 0x45)); 664 token.add(Byte.valueOf((byte) 0x34)); 665 666 doAnswer(new AnswerWithArguments() { 667 public void answer(ISupplicantStaNetwork.getWpsNfcConfigurationTokenCallback cb) 668 throws RemoteException { 669 cb.onValues(mStatusSuccess, token); 670 } 671 }).when(mISupplicantStaNetworkMock) 672 .getWpsNfcConfigurationToken( 673 any(ISupplicantStaNetwork.getWpsNfcConfigurationTokenCallback.class)); 674 675 assertEquals("4534", mSupplicantNetwork.getWpsNfcConfigurationToken()); 676 } 677 678 /** 679 * Tests that callback registration failure triggers a failure in saving network config. 680 */ 681 @Test 682 public void testSaveFailureDueToCallbackReg() throws Exception { 683 when(mISupplicantStaNetworkMock.registerCallback(any(ISupplicantStaNetworkCallback.class))) 684 .thenReturn(mStatusFailure); 685 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 686 assertFalse(mSupplicantNetwork.saveWifiConfiguration(config)); 687 } 688 689 /** 690 * Tests the network gsm auth callback. 691 */ 692 @Test 693 public void testNetworkEapGsmAuthCallback() throws Exception { 694 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 695 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 696 assertNotNull(mISupplicantStaNetworkCallback); 697 698 // Now trigger eap gsm callback and ensure that the event is broadcast via WifiMonitor. 699 NetworkRequestEapSimGsmAuthParams params = new NetworkRequestEapSimGsmAuthParams(); 700 Random random = new Random(); 701 byte[] rand1 = new byte[16]; 702 byte[] rand2 = new byte[16]; 703 byte[] rand3 = new byte[16]; 704 random.nextBytes(rand1); 705 random.nextBytes(rand2); 706 random.nextBytes(rand3); 707 params.rands.add(rand1); 708 params.rands.add(rand2); 709 params.rands.add(rand3); 710 711 String[] expectedRands = { 712 NativeUtil.hexStringFromByteArray(rand1), NativeUtil.hexStringFromByteArray(rand2), 713 NativeUtil.hexStringFromByteArray(rand3) 714 }; 715 716 mISupplicantStaNetworkCallback.onNetworkEapSimGsmAuthRequest(params); 717 verify(mWifiMonitor).broadcastNetworkGsmAuthRequestEvent( 718 eq(IFACE_NAME), eq(config.networkId), eq(config.SSID), eq(expectedRands)); 719 } 720 721 /** 722 * Tests the network umts auth callback. 723 */ 724 @Test 725 public void testNetworkEapUmtsAuthCallback() throws Exception { 726 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 727 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 728 assertNotNull(mISupplicantStaNetworkCallback); 729 730 // Now trigger eap gsm callback and ensure that the event is broadcast via WifiMonitor. 731 NetworkRequestEapSimUmtsAuthParams params = new NetworkRequestEapSimUmtsAuthParams(); 732 Random random = new Random(); 733 random.nextBytes(params.autn); 734 random.nextBytes(params.rand); 735 736 String[] expectedRands = { 737 NativeUtil.hexStringFromByteArray(params.rand), 738 NativeUtil.hexStringFromByteArray(params.autn) 739 }; 740 741 mISupplicantStaNetworkCallback.onNetworkEapSimUmtsAuthRequest(params); 742 verify(mWifiMonitor).broadcastNetworkUmtsAuthRequestEvent( 743 eq(IFACE_NAME), eq(config.networkId), eq(config.SSID), eq(expectedRands)); 744 } 745 746 /** 747 * Tests the network identity callback. 748 */ 749 @Test 750 public void testNetworkIdentityCallback() throws Exception { 751 WifiConfiguration config = WifiConfigurationTestUtil.createPskNetwork(); 752 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 753 assertNotNull(mISupplicantStaNetworkCallback); 754 755 // Now trigger identity request callback and ensure that the event is broadcast via 756 // WifiMonitor. 757 mISupplicantStaNetworkCallback.onNetworkEapIdentityRequest(); 758 verify(mWifiMonitor).broadcastNetworkIdentityRequestEvent( 759 eq(IFACE_NAME), eq(config.networkId), eq(config.SSID)); 760 } 761 762 private void testWifiConfigurationSaveLoad(WifiConfiguration config) { 763 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 764 WifiConfiguration loadConfig = new WifiConfiguration(); 765 Map<String, String> networkExtras = new HashMap<>(); 766 assertTrue(mSupplicantNetwork.loadWifiConfiguration(loadConfig, networkExtras)); 767 WifiConfigurationTestUtil.assertConfigurationEqualForSupplicant(config, loadConfig); 768 assertEquals(config.configKey(), 769 networkExtras.get(SupplicantStaNetworkHal.ID_STRING_KEY_CONFIG_KEY)); 770 assertEquals( 771 config.creatorUid, 772 Integer.parseInt(networkExtras.get( 773 SupplicantStaNetworkHal.ID_STRING_KEY_CREATOR_UID))); 774 // There is no getter for this one, so check the supplicant variable. 775 if (!TextUtils.isEmpty(config.updateIdentifier)) { 776 assertEquals(Integer.parseInt(config.updateIdentifier), 777 mSupplicantVariables.updateIdentifier); 778 } 779 // There is no getter for this one, so check the supplicant variable. 780 String oppKeyCaching = 781 config.enterpriseConfig.getFieldValue(WifiEnterpriseConfig.OPP_KEY_CACHING); 782 if (!TextUtils.isEmpty(oppKeyCaching)) { 783 assertEquals( 784 Integer.parseInt(oppKeyCaching) == 1 ? true : false, 785 mSupplicantVariables.eapProactiveKeyCaching); 786 } 787 } 788 789 /** 790 * Verifies that createNetworkExtra() & parseNetworkExtra correctly writes a serialized and 791 * URL-encoded JSON object. 792 */ 793 @Test 794 public void testNetworkExtra() { 795 assertEquals(NETWORK_EXTRAS_SERIALIZED, 796 SupplicantStaNetworkHal.createNetworkExtra(NETWORK_EXTRAS_VALUES)); 797 assertEquals(NETWORK_EXTRAS_VALUES, 798 SupplicantStaNetworkHal.parseNetworkExtra(NETWORK_EXTRAS_SERIALIZED)); 799 } 800 801 /** 802 * Verifies that fetachEapAnonymousIdentity() can get the anonymous identity from supplicant. 803 */ 804 @Test 805 public void testFetchEapAnonymousIdentity() { 806 WifiConfiguration config = WifiConfigurationTestUtil.createEapNetwork(); 807 config.enterpriseConfig.setAnonymousIdentity(ANONYMOUS_IDENTITY); 808 assertTrue(mSupplicantNetwork.saveWifiConfiguration(config)); 809 assertEquals(ANONYMOUS_IDENTITY, mSupplicantNetwork.fetchEapAnonymousIdentity()); 810 } 811 812 /** 813 * Sets up the HIDL interface mock with all the setters/getter values. 814 * Note: This only sets up the mock to return success on all methods. 815 */ 816 private void setupISupplicantNetworkMock() throws Exception { 817 /** SSID */ 818 doAnswer(new AnswerWithArguments() { 819 public SupplicantStatus answer(ArrayList<Byte> ssid) throws RemoteException { 820 mSupplicantVariables.ssid = ssid; 821 return mStatusSuccess; 822 } 823 }).when(mISupplicantStaNetworkMock).setSsid(any(ArrayList.class)); 824 doAnswer(new AnswerWithArguments() { 825 public void answer(ISupplicantStaNetwork.getSsidCallback cb) throws RemoteException { 826 cb.onValues(mStatusSuccess, mSupplicantVariables.ssid); 827 } 828 }).when(mISupplicantStaNetworkMock) 829 .getSsid(any(ISupplicantStaNetwork.getSsidCallback.class)); 830 831 /** Network Id */ 832 doAnswer(new AnswerWithArguments() { 833 public void answer(ISupplicantNetwork.getIdCallback cb) throws RemoteException { 834 cb.onValues(mStatusSuccess, mSupplicantVariables.networkId); 835 } 836 }).when(mISupplicantStaNetworkMock).getId(any(ISupplicantNetwork.getIdCallback.class)); 837 838 /** BSSID */ 839 doAnswer(new AnswerWithArguments() { 840 public SupplicantStatus answer(byte[] bssid) throws RemoteException { 841 mSupplicantVariables.bssid = bssid; 842 return mStatusSuccess; 843 } 844 }).when(mISupplicantStaNetworkMock).setBssid(any(byte[].class)); 845 doAnswer(new AnswerWithArguments() { 846 public void answer(ISupplicantStaNetwork.getBssidCallback cb) throws RemoteException { 847 cb.onValues(mStatusSuccess, mSupplicantVariables.bssid); 848 } 849 }).when(mISupplicantStaNetworkMock) 850 .getBssid(any(ISupplicantStaNetwork.getBssidCallback.class)); 851 852 /** Scan SSID (Is Hidden Network?) */ 853 doAnswer(new AnswerWithArguments() { 854 public SupplicantStatus answer(boolean enable) throws RemoteException { 855 mSupplicantVariables.scanSsid = enable; 856 return mStatusSuccess; 857 } 858 }).when(mISupplicantStaNetworkMock).setScanSsid(any(boolean.class)); 859 doAnswer(new AnswerWithArguments() { 860 public void answer(ISupplicantStaNetwork.getScanSsidCallback cb) 861 throws RemoteException { 862 cb.onValues(mStatusSuccess, mSupplicantVariables.scanSsid); 863 } 864 }).when(mISupplicantStaNetworkMock) 865 .getScanSsid(any(ISupplicantStaNetwork.getScanSsidCallback.class)); 866 867 /** Require PMF*/ 868 doAnswer(new AnswerWithArguments() { 869 public SupplicantStatus answer(boolean enable) throws RemoteException { 870 mSupplicantVariables.requirePmf = enable; 871 return mStatusSuccess; 872 } 873 }).when(mISupplicantStaNetworkMock).setRequirePmf(any(boolean.class)); 874 doAnswer(new AnswerWithArguments() { 875 public void answer(ISupplicantStaNetwork.getRequirePmfCallback cb) 876 throws RemoteException { 877 cb.onValues(mStatusSuccess, mSupplicantVariables.requirePmf); 878 } 879 }).when(mISupplicantStaNetworkMock) 880 .getRequirePmf(any(ISupplicantStaNetwork.getRequirePmfCallback.class)); 881 882 /** PSK passphrase */ 883 doAnswer(new AnswerWithArguments() { 884 public SupplicantStatus answer(String pskPassphrase) throws RemoteException { 885 mSupplicantVariables.pskPassphrase = pskPassphrase; 886 return mStatusSuccess; 887 } 888 }).when(mISupplicantStaNetworkMock).setPskPassphrase(any(String.class)); 889 doAnswer(new AnswerWithArguments() { 890 public void answer(ISupplicantStaNetwork.getPskPassphraseCallback cb) 891 throws RemoteException { 892 cb.onValues(mStatusSuccess, mSupplicantVariables.pskPassphrase); 893 } 894 }).when(mISupplicantStaNetworkMock) 895 .getPskPassphrase(any(ISupplicantStaNetwork.getPskPassphraseCallback.class)); 896 897 /** PSK */ 898 doAnswer(new AnswerWithArguments() { 899 public SupplicantStatus answer(byte[] psk) throws RemoteException { 900 mSupplicantVariables.psk = psk; 901 return mStatusSuccess; 902 } 903 }).when(mISupplicantStaNetworkMock).setPsk(any(byte[].class)); 904 doAnswer(new AnswerWithArguments() { 905 public void answer(ISupplicantStaNetwork.getPskCallback cb) 906 throws RemoteException { 907 cb.onValues(mStatusSuccess, mSupplicantVariables.psk); 908 } 909 }).when(mISupplicantStaNetworkMock) 910 .getPsk(any(ISupplicantStaNetwork.getPskCallback.class)); 911 912 /** WEP keys **/ 913 doAnswer(new AnswerWithArguments() { 914 public SupplicantStatus answer(int keyIdx, ArrayList<Byte> key) throws RemoteException { 915 mSupplicantVariables.wepKey[keyIdx] = key; 916 return mStatusSuccess; 917 } 918 }).when(mISupplicantStaNetworkMock).setWepKey(any(int.class), any(ArrayList.class)); 919 doAnswer(new AnswerWithArguments() { 920 public void answer(int keyIdx, ISupplicantStaNetwork.getWepKeyCallback cb) 921 throws RemoteException { 922 cb.onValues(mStatusSuccess, mSupplicantVariables.wepKey[keyIdx]); 923 } 924 }).when(mISupplicantStaNetworkMock) 925 .getWepKey(any(int.class), any(ISupplicantStaNetwork.getWepKeyCallback.class)); 926 927 doAnswer(new AnswerWithArguments() { 928 public SupplicantStatus answer(int keyIdx) throws RemoteException { 929 mSupplicantVariables.wepTxKeyIdx = keyIdx; 930 return mStatusSuccess; 931 } 932 }).when(mISupplicantStaNetworkMock).setWepTxKeyIdx(any(int.class)); 933 doAnswer(new AnswerWithArguments() { 934 public void answer(ISupplicantStaNetwork.getWepTxKeyIdxCallback cb) 935 throws RemoteException { 936 cb.onValues(mStatusSuccess, mSupplicantVariables.wepTxKeyIdx); 937 } 938 }).when(mISupplicantStaNetworkMock) 939 .getWepTxKeyIdx(any(ISupplicantStaNetwork.getWepTxKeyIdxCallback.class)); 940 941 /** allowedKeyManagement */ 942 doAnswer(new AnswerWithArguments() { 943 public SupplicantStatus answer(int mask) throws RemoteException { 944 mSupplicantVariables.keyMgmtMask = mask; 945 return mStatusSuccess; 946 } 947 }).when(mISupplicantStaNetworkMock).setKeyMgmt(any(int.class)); 948 doAnswer(new AnswerWithArguments() { 949 public void answer(ISupplicantStaNetwork.getKeyMgmtCallback cb) throws RemoteException { 950 cb.onValues(mStatusSuccess, mSupplicantVariables.keyMgmtMask); 951 } 952 }).when(mISupplicantStaNetworkMock) 953 .getKeyMgmt(any(ISupplicantStaNetwork.getKeyMgmtCallback.class)); 954 955 /** allowedProtocols */ 956 doAnswer(new AnswerWithArguments() { 957 public SupplicantStatus answer(int mask) throws RemoteException { 958 mSupplicantVariables.protoMask = mask; 959 return mStatusSuccess; 960 } 961 }).when(mISupplicantStaNetworkMock).setProto(any(int.class)); 962 doAnswer(new AnswerWithArguments() { 963 public void answer(ISupplicantStaNetwork.getProtoCallback cb) throws RemoteException { 964 cb.onValues(mStatusSuccess, mSupplicantVariables.protoMask); 965 } 966 }).when(mISupplicantStaNetworkMock) 967 .getProto(any(ISupplicantStaNetwork.getProtoCallback.class)); 968 969 /** allowedAuthAlgorithms */ 970 doAnswer(new AnswerWithArguments() { 971 public SupplicantStatus answer(int mask) throws RemoteException { 972 mSupplicantVariables.authAlgMask = mask; 973 return mStatusSuccess; 974 } 975 }).when(mISupplicantStaNetworkMock).setAuthAlg(any(int.class)); 976 doAnswer(new AnswerWithArguments() { 977 public void answer(ISupplicantStaNetwork.getAuthAlgCallback cb) throws RemoteException { 978 cb.onValues(mStatusSuccess, mSupplicantVariables.authAlgMask); 979 } 980 }).when(mISupplicantStaNetworkMock) 981 .getAuthAlg(any(ISupplicantStaNetwork.getAuthAlgCallback.class)); 982 983 /** allowedGroupCiphers */ 984 doAnswer(new AnswerWithArguments() { 985 public SupplicantStatus answer(int mask) throws RemoteException { 986 mSupplicantVariables.groupCipherMask = mask; 987 return mStatusSuccess; 988 } 989 }).when(mISupplicantStaNetworkMock).setGroupCipher(any(int.class)); 990 doAnswer(new AnswerWithArguments() { 991 public void answer(ISupplicantStaNetwork.getGroupCipherCallback cb) 992 throws RemoteException { 993 cb.onValues(mStatusSuccess, mSupplicantVariables.groupCipherMask); 994 } 995 }).when(mISupplicantStaNetworkMock) 996 .getGroupCipher(any(ISupplicantStaNetwork.getGroupCipherCallback.class)); 997 998 /** allowedPairwiseCiphers */ 999 doAnswer(new AnswerWithArguments() { 1000 public SupplicantStatus answer(int mask) throws RemoteException { 1001 mSupplicantVariables.pairwiseCipherMask = mask; 1002 return mStatusSuccess; 1003 } 1004 }).when(mISupplicantStaNetworkMock).setPairwiseCipher(any(int.class)); 1005 doAnswer(new AnswerWithArguments() { 1006 public void answer(ISupplicantStaNetwork.getPairwiseCipherCallback cb) 1007 throws RemoteException { 1008 cb.onValues(mStatusSuccess, mSupplicantVariables.pairwiseCipherMask); 1009 } 1010 }).when(mISupplicantStaNetworkMock) 1011 .getPairwiseCipher(any(ISupplicantStaNetwork.getPairwiseCipherCallback.class)); 1012 1013 /** metadata: idstr */ 1014 doAnswer(new AnswerWithArguments() { 1015 public SupplicantStatus answer(String idStr) throws RemoteException { 1016 mSupplicantVariables.idStr = idStr; 1017 return mStatusSuccess; 1018 } 1019 }).when(mISupplicantStaNetworkMock).setIdStr(any(String.class)); 1020 doAnswer(new AnswerWithArguments() { 1021 public void answer(ISupplicantStaNetwork.getIdStrCallback cb) throws RemoteException { 1022 cb.onValues(mStatusSuccess, mSupplicantVariables.idStr); 1023 } 1024 }).when(mISupplicantStaNetworkMock) 1025 .getIdStr(any(ISupplicantStaNetwork.getIdStrCallback.class)); 1026 1027 /** UpdateIdentifier */ 1028 doAnswer(new AnswerWithArguments() { 1029 public SupplicantStatus answer(int identifier) throws RemoteException { 1030 mSupplicantVariables.updateIdentifier = identifier; 1031 return mStatusSuccess; 1032 } 1033 }).when(mISupplicantStaNetworkMock).setUpdateIdentifier(any(int.class)); 1034 1035 /** EAP method */ 1036 doAnswer(new AnswerWithArguments() { 1037 public SupplicantStatus answer(int method) throws RemoteException { 1038 mSupplicantVariables.eapMethod = method; 1039 return mStatusSuccess; 1040 } 1041 }).when(mISupplicantStaNetworkMock).setEapMethod(any(int.class)); 1042 doAnswer(new AnswerWithArguments() { 1043 public void answer(ISupplicantStaNetwork.getEapMethodCallback cb) 1044 throws RemoteException { 1045 // When not set, return failure. 1046 if (mSupplicantVariables.eapMethod == -1) { 1047 cb.onValues(mStatusFailure, mSupplicantVariables.eapMethod); 1048 } else { 1049 cb.onValues(mStatusSuccess, mSupplicantVariables.eapMethod); 1050 } 1051 } 1052 }).when(mISupplicantStaNetworkMock) 1053 .getEapMethod(any(ISupplicantStaNetwork.getEapMethodCallback.class)); 1054 1055 /** EAP Phase 2 method */ 1056 doAnswer(new AnswerWithArguments() { 1057 public SupplicantStatus answer(int method) throws RemoteException { 1058 mSupplicantVariables.eapPhase2Method = method; 1059 return mStatusSuccess; 1060 } 1061 }).when(mISupplicantStaNetworkMock).setEapPhase2Method(any(int.class)); 1062 doAnswer(new AnswerWithArguments() { 1063 public void answer(ISupplicantStaNetwork.getEapPhase2MethodCallback cb) 1064 throws RemoteException { 1065 // When not set, return failure. 1066 if (mSupplicantVariables.eapPhase2Method == -1) { 1067 cb.onValues(mStatusFailure, mSupplicantVariables.eapPhase2Method); 1068 } else { 1069 cb.onValues(mStatusSuccess, mSupplicantVariables.eapPhase2Method); 1070 } 1071 } 1072 }).when(mISupplicantStaNetworkMock) 1073 .getEapPhase2Method(any(ISupplicantStaNetwork.getEapPhase2MethodCallback.class)); 1074 1075 /** EAP Identity */ 1076 doAnswer(new AnswerWithArguments() { 1077 public SupplicantStatus answer(ArrayList<Byte> identity) throws RemoteException { 1078 mSupplicantVariables.eapIdentity = identity; 1079 return mStatusSuccess; 1080 } 1081 }).when(mISupplicantStaNetworkMock).setEapIdentity(any(ArrayList.class)); 1082 doAnswer(new AnswerWithArguments() { 1083 public void answer(ISupplicantStaNetwork.getEapIdentityCallback cb) 1084 throws RemoteException { 1085 cb.onValues(mStatusSuccess, mSupplicantVariables.eapIdentity); 1086 } 1087 }).when(mISupplicantStaNetworkMock) 1088 .getEapIdentity(any(ISupplicantStaNetwork.getEapIdentityCallback.class)); 1089 1090 /** EAP Anonymous Identity */ 1091 doAnswer(new AnswerWithArguments() { 1092 public SupplicantStatus answer(ArrayList<Byte> identity) throws RemoteException { 1093 mSupplicantVariables.eapAnonymousIdentity = identity; 1094 return mStatusSuccess; 1095 } 1096 }).when(mISupplicantStaNetworkMock).setEapAnonymousIdentity(any(ArrayList.class)); 1097 doAnswer(new AnswerWithArguments() { 1098 public void answer(ISupplicantStaNetwork.getEapAnonymousIdentityCallback cb) 1099 throws RemoteException { 1100 cb.onValues(mStatusSuccess, mSupplicantVariables.eapAnonymousIdentity); 1101 } 1102 }).when(mISupplicantStaNetworkMock) 1103 .getEapAnonymousIdentity( 1104 any(ISupplicantStaNetwork.getEapAnonymousIdentityCallback.class)); 1105 1106 /** EAP Password */ 1107 doAnswer(new AnswerWithArguments() { 1108 public SupplicantStatus answer(ArrayList<Byte> password) throws RemoteException { 1109 mSupplicantVariables.eapPassword = password; 1110 return mStatusSuccess; 1111 } 1112 }).when(mISupplicantStaNetworkMock).setEapPassword(any(ArrayList.class)); 1113 doAnswer(new AnswerWithArguments() { 1114 public void answer(ISupplicantStaNetwork.getEapPasswordCallback cb) 1115 throws RemoteException { 1116 cb.onValues(mStatusSuccess, mSupplicantVariables.eapPassword); 1117 } 1118 }).when(mISupplicantStaNetworkMock) 1119 .getEapPassword(any(ISupplicantStaNetwork.getEapPasswordCallback.class)); 1120 1121 /** EAP Client Cert */ 1122 doAnswer(new AnswerWithArguments() { 1123 public SupplicantStatus answer(String cert) throws RemoteException { 1124 mSupplicantVariables.eapClientCert = cert; 1125 return mStatusSuccess; 1126 } 1127 }).when(mISupplicantStaNetworkMock).setEapClientCert(any(String.class)); 1128 doAnswer(new AnswerWithArguments() { 1129 public void answer(ISupplicantStaNetwork.getEapClientCertCallback cb) 1130 throws RemoteException { 1131 cb.onValues(mStatusSuccess, mSupplicantVariables.eapClientCert); 1132 } 1133 }).when(mISupplicantStaNetworkMock) 1134 .getEapClientCert(any(ISupplicantStaNetwork.getEapClientCertCallback.class)); 1135 1136 /** EAP CA Cert */ 1137 doAnswer(new AnswerWithArguments() { 1138 public SupplicantStatus answer(String cert) throws RemoteException { 1139 mSupplicantVariables.eapCACert = cert; 1140 return mStatusSuccess; 1141 } 1142 }).when(mISupplicantStaNetworkMock).setEapCACert(any(String.class)); 1143 doAnswer(new AnswerWithArguments() { 1144 public void answer(ISupplicantStaNetwork.getEapCACertCallback cb) 1145 throws RemoteException { 1146 cb.onValues(mStatusSuccess, mSupplicantVariables.eapCACert); 1147 } 1148 }).when(mISupplicantStaNetworkMock) 1149 .getEapCACert(any(ISupplicantStaNetwork.getEapCACertCallback.class)); 1150 1151 /** EAP Subject Match */ 1152 doAnswer(new AnswerWithArguments() { 1153 public SupplicantStatus answer(String match) throws RemoteException { 1154 mSupplicantVariables.eapSubjectMatch = match; 1155 return mStatusSuccess; 1156 } 1157 }).when(mISupplicantStaNetworkMock).setEapSubjectMatch(any(String.class)); 1158 doAnswer(new AnswerWithArguments() { 1159 public void answer(ISupplicantStaNetwork.getEapSubjectMatchCallback cb) 1160 throws RemoteException { 1161 cb.onValues(mStatusSuccess, mSupplicantVariables.eapSubjectMatch); 1162 } 1163 }).when(mISupplicantStaNetworkMock) 1164 .getEapSubjectMatch(any(ISupplicantStaNetwork.getEapSubjectMatchCallback.class)); 1165 1166 /** EAP Engine */ 1167 doAnswer(new AnswerWithArguments() { 1168 public SupplicantStatus answer(boolean enable) throws RemoteException { 1169 mSupplicantVariables.eapEngine = enable; 1170 return mStatusSuccess; 1171 } 1172 }).when(mISupplicantStaNetworkMock).setEapEngine(any(boolean.class)); 1173 doAnswer(new AnswerWithArguments() { 1174 public void answer(ISupplicantStaNetwork.getEapEngineCallback cb) 1175 throws RemoteException { 1176 cb.onValues(mStatusSuccess, mSupplicantVariables.eapEngine); 1177 } 1178 }).when(mISupplicantStaNetworkMock) 1179 .getEapEngine(any(ISupplicantStaNetwork.getEapEngineCallback.class)); 1180 1181 /** EAP Engine ID */ 1182 doAnswer(new AnswerWithArguments() { 1183 public SupplicantStatus answer(String id) throws RemoteException { 1184 mSupplicantVariables.eapEngineID = id; 1185 return mStatusSuccess; 1186 } 1187 }).when(mISupplicantStaNetworkMock).setEapEngineID(any(String.class)); 1188 doAnswer(new AnswerWithArguments() { 1189 public void answer(ISupplicantStaNetwork.getEapEngineIDCallback cb) 1190 throws RemoteException { 1191 cb.onValues(mStatusSuccess, mSupplicantVariables.eapEngineID); 1192 } 1193 }).when(mISupplicantStaNetworkMock) 1194 .getEapEngineID(any(ISupplicantStaNetwork.getEapEngineIDCallback.class)); 1195 1196 /** EAP Private Key */ 1197 doAnswer(new AnswerWithArguments() { 1198 public SupplicantStatus answer(String key) throws RemoteException { 1199 mSupplicantVariables.eapPrivateKeyId = key; 1200 return mStatusSuccess; 1201 } 1202 }).when(mISupplicantStaNetworkMock).setEapPrivateKeyId(any(String.class)); 1203 doAnswer(new AnswerWithArguments() { 1204 public void answer(ISupplicantStaNetwork.getEapPrivateKeyIdCallback cb) 1205 throws RemoteException { 1206 cb.onValues(mStatusSuccess, mSupplicantVariables.eapPrivateKeyId); 1207 } 1208 }).when(mISupplicantStaNetworkMock) 1209 .getEapPrivateKeyId(any(ISupplicantStaNetwork.getEapPrivateKeyIdCallback.class)); 1210 1211 /** EAP Alt Subject Match */ 1212 doAnswer(new AnswerWithArguments() { 1213 public SupplicantStatus answer(String match) throws RemoteException { 1214 mSupplicantVariables.eapAltSubjectMatch = match; 1215 return mStatusSuccess; 1216 } 1217 }).when(mISupplicantStaNetworkMock).setEapAltSubjectMatch(any(String.class)); 1218 doAnswer(new AnswerWithArguments() { 1219 public void answer(ISupplicantStaNetwork.getEapAltSubjectMatchCallback cb) 1220 throws RemoteException { 1221 cb.onValues(mStatusSuccess, mSupplicantVariables.eapAltSubjectMatch); 1222 } 1223 }).when(mISupplicantStaNetworkMock) 1224 .getEapAltSubjectMatch( 1225 any(ISupplicantStaNetwork.getEapAltSubjectMatchCallback.class)); 1226 1227 /** EAP Domain Suffix Match */ 1228 doAnswer(new AnswerWithArguments() { 1229 public SupplicantStatus answer(String match) throws RemoteException { 1230 mSupplicantVariables.eapDomainSuffixMatch = match; 1231 return mStatusSuccess; 1232 } 1233 }).when(mISupplicantStaNetworkMock).setEapDomainSuffixMatch(any(String.class)); 1234 doAnswer(new AnswerWithArguments() { 1235 public void answer(ISupplicantStaNetwork.getEapDomainSuffixMatchCallback cb) 1236 throws RemoteException { 1237 cb.onValues(mStatusSuccess, mSupplicantVariables.eapDomainSuffixMatch); 1238 } 1239 }).when(mISupplicantStaNetworkMock) 1240 .getEapDomainSuffixMatch( 1241 any(ISupplicantStaNetwork.getEapDomainSuffixMatchCallback.class)); 1242 1243 /** EAP CA Path*/ 1244 doAnswer(new AnswerWithArguments() { 1245 public SupplicantStatus answer(String path) throws RemoteException { 1246 mSupplicantVariables.eapCAPath = path; 1247 return mStatusSuccess; 1248 } 1249 }).when(mISupplicantStaNetworkMock).setEapCAPath(any(String.class)); 1250 doAnswer(new AnswerWithArguments() { 1251 public void answer(ISupplicantStaNetwork.getEapCAPathCallback cb) 1252 throws RemoteException { 1253 cb.onValues(mStatusSuccess, mSupplicantVariables.eapCAPath); 1254 } 1255 }).when(mISupplicantStaNetworkMock) 1256 .getEapCAPath(any(ISupplicantStaNetwork.getEapCAPathCallback.class)); 1257 1258 /** EAP Proactive Key Caching */ 1259 doAnswer(new AnswerWithArguments() { 1260 public SupplicantStatus answer(boolean enable) throws RemoteException { 1261 mSupplicantVariables.eapProactiveKeyCaching = enable; 1262 return mStatusSuccess; 1263 } 1264 }).when(mISupplicantStaNetworkMock).setProactiveKeyCaching(any(boolean.class)); 1265 1266 /** Callback registeration */ 1267 doAnswer(new AnswerWithArguments() { 1268 public SupplicantStatus answer(ISupplicantStaNetworkCallback cb) 1269 throws RemoteException { 1270 mISupplicantStaNetworkCallback = cb; 1271 return mStatusSuccess; 1272 } 1273 }).when(mISupplicantStaNetworkMock) 1274 .registerCallback(any(ISupplicantStaNetworkCallback.class)); 1275 } 1276 1277 private SupplicantStatus createSupplicantStatus(int code) { 1278 SupplicantStatus status = new SupplicantStatus(); 1279 status.code = code; 1280 return status; 1281 } 1282 1283 /** 1284 * Need this for tests which wants to manipulate context before creating the instance. 1285 */ 1286 private void createSupplicantStaNetwork() { 1287 mSupplicantNetwork = 1288 new SupplicantStaNetworkHal( 1289 mISupplicantStaNetworkMock, IFACE_NAME, mContext, mWifiMonitor); 1290 } 1291 1292 // Private class to to store/inspect values set via the HIDL mock. 1293 private class SupplicantNetworkVariables { 1294 public ArrayList<Byte> ssid; 1295 public int networkId; 1296 public byte[/* 6 */] bssid; 1297 public int keyMgmtMask; 1298 public int protoMask; 1299 public int authAlgMask; 1300 public int groupCipherMask; 1301 public int pairwiseCipherMask; 1302 public boolean scanSsid; 1303 public boolean requirePmf; 1304 public String idStr; 1305 public int updateIdentifier; 1306 public String pskPassphrase; 1307 public byte[] psk; 1308 public ArrayList<Byte>[] wepKey = new ArrayList[4]; 1309 public int wepTxKeyIdx; 1310 public int eapMethod = -1; 1311 public int eapPhase2Method = -1; 1312 public ArrayList<Byte> eapIdentity; 1313 public ArrayList<Byte> eapAnonymousIdentity; 1314 public ArrayList<Byte> eapPassword; 1315 public String eapCACert; 1316 public String eapCAPath; 1317 public String eapClientCert; 1318 public String eapPrivateKeyId; 1319 public String eapSubjectMatch; 1320 public String eapAltSubjectMatch; 1321 public boolean eapEngine; 1322 public String eapEngineID; 1323 public String eapDomainSuffixMatch; 1324 public boolean eapProactiveKeyCaching; 1325 } 1326 } 1327