diff options
author | 2025-02-14 16:32:22 -0800 | |
---|---|---|
committer | 2025-02-20 14:18:05 -0800 | |
commit | 286d6525f095e435266cbc6fb0b4983a1a4d9218 (patch) | |
tree | 96acba67e6a2a6e9cd4fd0456449242a8b25ced4 /framework | |
parent | 6a4bacc6259e75f70885ea56cc13c8a88d6ea606 (diff) |
Fix RangingResult parcelling
Bug: 397709104
Test: atest com.android.server.wifi.rtt
Flag: EXEMPT bug fix
Change-Id: I775b85765de05a0403705a1720c76fdfbf650ef4
Diffstat (limited to 'framework')
3 files changed, 183 insertions, 2 deletions
diff --git a/framework/java/android/net/wifi/rtt/RangingResult.java b/framework/java/android/net/wifi/rtt/RangingResult.java index 604c879daa..166a13b1d9 100644 --- a/framework/java/android/net/wifi/rtt/RangingResult.java +++ b/framework/java/android/net/wifi/rtt/RangingResult.java @@ -1168,6 +1168,12 @@ public final class RangingResult implements Parcelable { if (SdkLevel.isAtLeastV()) { dest.writeList(mVendorData); } + dest.writeBoolean(mIsRangingAuthenticated); + dest.writeBoolean(mIsRangingFrameProtected); + dest.writeBoolean(mIsSecureHeLtfEnabled); + dest.writeLong(mPasnComebackAfterMillis); + dest.writeByteArray(mPasnComebackCookie); + dest.writeInt(mSecureHeLtfProtocolVersion); } public static final @android.annotation.NonNull Creator<RangingResult> CREATOR = @@ -1208,6 +1214,12 @@ public final class RangingResult implements Parcelable { if (SdkLevel.isAtLeastV()) { builder.setVendorData(ParcelUtil.readOuiKeyedDataList(in)); } + builder.setRangingAuthenticated(in.readBoolean()) + .setRangingFrameProtected(in.readBoolean()) + .setSecureHeLtfEnabled(in.readBoolean()) + .setPasnComebackAfterMillis(in.readLong()) + .setPasnComebackCookie(in.createByteArray()) + .setSecureHeLtfProtocolVersion(in.readInt()); return builder.build(); } }; diff --git a/framework/java/android/net/wifi/rtt/ResponderConfig.java b/framework/java/android/net/wifi/rtt/ResponderConfig.java index 5b4f2da08a..ffa98499ed 100644 --- a/framework/java/android/net/wifi/rtt/ResponderConfig.java +++ b/framework/java/android/net/wifi/rtt/ResponderConfig.java @@ -514,13 +514,14 @@ public final class ResponderConfig implements Parcelable { if (scanResult.getWifiSsid() != null) { pasnConfigBuilder.setWifiSsid(scanResult.getWifiSsid()); } + // If the responder is capable of PASN, always enable frame protection for secure ranging + // irrespective of responder mandates or not. return new SecureRangingConfig.Builder(pasnConfigBuilder.build()) .setSecureHeLtfEnabled(scanResult.isSecureHeLtfSupported()) - .setRangingFrameProtectionEnabled(scanResult.isRangingFrameProtectionRequired()) + .setRangingFrameProtectionEnabled(true) .build(); } - /** * Creates a Responder configuration from a MAC address corresponding to a Wi-Fi Aware * Responder. The Responder parameters are set to defaults. diff --git a/framework/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java b/framework/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java index f59fbc9243..08d5f40385 100644 --- a/framework/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java +++ b/framework/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java @@ -16,9 +16,11 @@ package android.net.wifi.rtt; +import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.fail; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,6 +34,7 @@ import android.net.MacAddress; import android.net.wifi.OuiKeyedData; import android.net.wifi.OuiKeyedDataUtil; import android.net.wifi.ScanResult; +import android.net.wifi.WifiSsid; import android.net.wifi.aware.PeerHandle; import android.os.Bundle; import android.os.IBinder; @@ -520,6 +523,64 @@ public class WifiRttManagerTest { } /** + * Validate that RangingResults parcel works with secure ranging enabled (produces same + * object on write/read). + */ + @Test + public void testSecureRangingResultsParcel() { + int status = RangingResult.STATUS_SUCCESS; + final MacAddress mac = MacAddress.fromString("00:01:02:03:04:05"); + int distanceCm = 105; + int distanceStdDevCm = 10; + int rssi = 5; + int numAttemptedMeasurements = 8; + int numSuccessfulMeasurements = 3; + long timestamp = System.currentTimeMillis(); + byte[] lci = { 0x5, 0x6, 0x7 }; + byte[] lcr = { 0x1, 0x2, 0x3, 0xA, 0xB, 0xC }; + List<OuiKeyedData> vendorData = OuiKeyedDataUtil.createTestOuiKeyedDataList(5); + + RangingResult.Builder resultBuilder = new RangingResult.Builder() + .setStatus(status) + .setMacAddress(mac) + .setDistanceMm(distanceCm) + .setDistanceStdDevMm(distanceStdDevCm) + .setRssi(rssi) + .setNumAttemptedMeasurements(numAttemptedMeasurements) + .setNumSuccessfulMeasurements(numSuccessfulMeasurements) + .setLci(lci) + .setLcr(lcr) + .setRangingTimestampMillis(timestamp) + .set80211mcMeasurement(false) + .set80211azNtbMeasurement(true) + .set80211azInitiatorTxLtfRepetitionsCount(2) + .set80211azResponderTxLtfRepetitionsCount(2) + .set80211azNumberOfRxSpatialStreams(2) + .setPasnComebackCookie(new byte[] {1, 2, 3}) + .setMaxTimeBetweenNtbMeasurementsMicros(1000) + .setMinTimeBetweenNtbMeasurementsMicros(100) + .setRangingAuthenticated(true) + .setRangingFrameProtected(true); + + if (SdkLevel.isAtLeastV()) { + resultBuilder.setVendorData(vendorData); + } + RangingResult result = resultBuilder.build(); + + Parcel parcelW = Parcel.obtain(); + result.writeToParcel(parcelW, 0); + byte[] bytes = parcelW.marshall(); + parcelW.recycle(); + + Parcel parcelR = Parcel.obtain(); + parcelR.unmarshall(bytes, 0, bytes.length); + parcelR.setDataPosition(0); + RangingResult rereadResult = RangingResult.CREATOR.createFromParcel(parcelR); + + assertEquals(result, rereadResult); + } + + /** * Validate that RangingResults tests equal even if LCI/LCR is empty (length == 0) and null. */ @Test @@ -568,6 +629,17 @@ public class WifiRttManagerTest { */ @Test public void testResponderConfigParcel() { + // Create SecureRangingConfig + PasnConfig pasnConfig = new PasnConfig.Builder(PasnConfig.AKM_SAE | PasnConfig.AKM_PASN, + PasnConfig.CIPHER_CCMP_256 | PasnConfig.CIPHER_GCMP_256) + .setPassword("password") + .setWifiSsid(WifiSsid.fromString("\"SSID\"")) + .setPasnComebackCookie(new byte[]{1, 2, 3}) + .build(); + SecureRangingConfig secureRangingConfig = new SecureRangingConfig.Builder(pasnConfig) + .setSecureHeLtfEnabled(true) + .setRangingFrameProtectionEnabled(true) + .build(); // ResponderConfig constructed with a MAC address ResponderConfig config = new ResponderConfig.Builder() .setMacAddress(MacAddress.fromString("00:01:02:03:04:05")) @@ -577,6 +649,10 @@ public class WifiRttManagerTest { .setCenterFreq0Mhz(2345) .setCenterFreq1Mhz(2555) .setPreamble(ScanResult.PREAMBLE_LEGACY) + .set80211azNtbSupported(true) + .setNtbMaxTimeBetweenMeasurementsMicros(10000) + .setNtbMinTimeBetweenMeasurementsMicros(100) + .setSecureRangingConfig(secureRangingConfig) .build(); Parcel parcelW = Parcel.obtain(); @@ -753,4 +829,96 @@ public class WifiRttManagerTest { verify(mockRttService).getRttCharacteristics(); assertEquals(0, characteristics.size()); } + + /** + * Validate secure ranging request call flow with successful results. + */ + @Test + public void testSecureRangeSuccess() throws Exception { + // Build a scan result with secure ranging support + ScanResult.InformationElement htCap = new ScanResult.InformationElement(); + htCap.id = ScanResult.InformationElement.EID_HT_CAPABILITIES; + + ScanResult.InformationElement vhtCap = new ScanResult.InformationElement(); + vhtCap.id = ScanResult.InformationElement.EID_VHT_CAPABILITIES; + + ScanResult.InformationElement vsa = new ScanResult.InformationElement(); + vsa.id = ScanResult.InformationElement.EID_VSA; + + ScanResult.InformationElement heCap = new ScanResult.InformationElement(); + heCap.id = ScanResult.InformationElement.EID_EXTENSION_PRESENT; + heCap.idExt = ScanResult.InformationElement.EID_EXT_HE_CAPABILITIES; + + ScanResult.InformationElement ehtCap = new ScanResult.InformationElement(); + ehtCap.id = ScanResult.InformationElement.EID_EXTENSION_PRESENT; + ehtCap.idExt = ScanResult.InformationElement.EID_EXT_EHT_CAPABILITIES; + + ScanResult.InformationElement[] ie = new ScanResult.InformationElement[3]; + ie[0] = vhtCap; + ie[1] = heCap; + ie[2] = ehtCap; + + // Build a secure ranging request + ScanResult scanResult = new ScanResult(); + scanResult.BSSID = "00:01:02:03:04:05"; + scanResult.setFlag( + ScanResult.FLAG_80211az_NTB_RESPONDER | ScanResult.FLAG_SECURE_HE_LTF_SUPPORTED); + scanResult.informationElements = ie; + scanResult.capabilities = "[RSN-PASN-SAE+SAE_EXT_KEY-GCMP-128]"; + scanResult.setWifiSsid(WifiSsid.fromString("\"TEST_SSID\"")); + + RangingRequest.Builder builder = new RangingRequest.Builder(); + builder.addAccessPoint(scanResult); + builder.setSecurityMode(RangingRequest.SECURITY_MODE_SECURE_AUTH); + RangingRequest secureRangingRequest = builder.build(); + + // Make sure responder is configured correctly for secure ranging + ResponderConfig responderConfig = secureRangingRequest.getRttResponders().get(0); + assertNotNull(responderConfig); + SecureRangingConfig secureRangingConfig = responderConfig.getSecureRangingConfig(); + assertNotNull(secureRangingConfig); + assertTrue(secureRangingConfig.isRangingFrameProtectionEnabled()); + assertTrue(secureRangingConfig.isSecureHeLtfEnabled()); + PasnConfig pasnConfig = secureRangingConfig.getPasnConfig(); + assertNotNull(pasnConfig); + assertEquals(PasnConfig.AKM_PASN | PasnConfig.AKM_SAE, pasnConfig.getBaseAkms()); + assertEquals(PasnConfig.CIPHER_GCMP_128, pasnConfig.getCiphers()); + assertNull(pasnConfig.getPasnComebackCookie()); + assertEquals(WifiSsid.fromString("\"TEST_SSID\""), pasnConfig.getWifiSsid()); + assertEquals(RangingRequest.SECURITY_MODE_SECURE_AUTH, + secureRangingRequest.getSecurityMode()); + + List<RangingResult> results = new ArrayList<>(); + results.add(new RangingResult.Builder() + .setStatus(RangingResult.STATUS_SUCCESS) + .setMacAddress(MacAddress.fromString(scanResult.BSSID)) + .setDistanceMm(15) + .setDistanceStdDevMm(5) + .setRssi(10) + .setNumAttemptedMeasurements(8) + .setNumSuccessfulMeasurements(5) + .setRangingTimestampMillis(666) + .set80211mcMeasurement(false) + .set80211azNtbMeasurement(true) + .setRangingFrameProtected(true) + .setSecureHeLtfEnabled(true) + .setSecureHeLtfProtocolVersion(0) + .build()); + RangingResultCallback callbackMock = mock(RangingResultCallback.class); + ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class); + + // verify ranging request passed to service + mDut.startRanging(secureRangingRequest, mMockLooperExecutor, callbackMock); + verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(featureId), + eq(null), eq(secureRangingRequest), callbackCaptor.capture(), + any(Bundle.class)); + + // service calls back with success + callbackCaptor.getValue().onRangingResults(results); + mMockLooper.dispatchAll(); + verify(callbackMock).onRangingResults(results); + + verifyNoMoreInteractions(mockRttService, callbackMock); + } + } |