Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d184ba54 authored by Jong Wook Kim's avatar Jong Wook Kim
Browse files

"02:00:00:00:00:00" invalid for MAC randomization

Since we are using "02:00:00:00:00:00" as the default/invalid MAC
address in the Wifi Framework, we should make it invalid for Connected
MAC Randomization for consistency.

Updated the configuration to use "02:00:00:00:00:00" as the default
invalid MAC and attempt multiple time to generate valid random MAC.

Bug: 74436465
Bug: 74446723
Test: Unittest
Change-Id: Ia5ac806d478191d7e8fad247d5c3a1b97d16498f
parent b2637dac
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -25,11 +25,13 @@ import android.net.MacAddress;
import android.net.ProxyInfo;
import android.net.StaticIpConfiguration;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.BackupUtils;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
@@ -76,6 +78,8 @@ public class WifiConfiguration implements Parcelable {

    /** {@hide} */
    private String mPasspointManagementObjectTree;
    /** {@hide} */
    private static final int MAXIMUM_RANDOM_MAC_GENERATION_RETRY = 3;

    /**
     * Recognized key management schemes.
@@ -798,27 +802,37 @@ public class WifiConfiguration implements Parcelable {
     * @hide
     * Randomized MAC address to use with this particular network
     */
    @NonNull
    private MacAddress mRandomizedMacAddress;

    /**
     * @hide
     * Checks if the given MAC address can be used for Connected Mac Randomization
     * by verifying that it is non-null, unicast, and locally assigned.
     * by verifying that it is non-null, unicast, locally assigned, and not default mac.
     * @param mac MacAddress to check
     * @return true if mac is good to use
     */
    private boolean isValidMacAddressForRandomization(MacAddress mac) {
        return mac != null && !mac.isMulticastAddress() && mac.isLocallyAssigned();
    public static boolean isValidMacAddressForRandomization(MacAddress mac) {
        return mac != null && !mac.isMulticastAddress() && mac.isLocallyAssigned()
                && !MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS).equals(mac);
    }

    /**
     * @hide
     * Returns Randomized MAC address to use with the network.
     * If it is not set/valid, create a new randomized address.
     * If it is not set/valid, creates a new randomized address.
     * If it can't generate a valid mac, returns the default MAC.
     */
    public MacAddress getOrCreateRandomizedMacAddress() {
        if (!isValidMacAddressForRandomization(mRandomizedMacAddress)) {
    public @NonNull MacAddress getOrCreateRandomizedMacAddress() {
        int randomMacGenerationCount = 0;
        while (!isValidMacAddressForRandomization(mRandomizedMacAddress)
                && randomMacGenerationCount < MAXIMUM_RANDOM_MAC_GENERATION_RETRY) {
            mRandomizedMacAddress = MacAddress.createRandomUnicastAddress();
            randomMacGenerationCount++;
        }

        if (!isValidMacAddressForRandomization(mRandomizedMacAddress)) {
            mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
        }
        return mRandomizedMacAddress;
    }
@@ -828,10 +842,7 @@ public class WifiConfiguration implements Parcelable {
     * Returns MAC address set to be the local randomized MAC address.
     * Does not guarantee that the returned address is valid for use.
     */
    public MacAddress getRandomizedMacAddress() {
        if (mRandomizedMacAddress == null) {
            mRandomizedMacAddress = MacAddress.ALL_ZEROS_ADDRESS;
        }
    public @NonNull MacAddress getRandomizedMacAddress() {
        return mRandomizedMacAddress;
    }

@@ -839,7 +850,11 @@ public class WifiConfiguration implements Parcelable {
     * @hide
     * @param mac MacAddress to change into
     */
    public void setRandomizedMacAddress(MacAddress mac) {
    public void setRandomizedMacAddress(@NonNull MacAddress mac) {
        if (mac == null) {
            Log.e(TAG, "setRandomizedMacAddress received null MacAddress.");
            return;
        }
        mRandomizedMacAddress = mac;
    }

@@ -1532,7 +1547,7 @@ public class WifiConfiguration implements Parcelable {
        creatorUid = -1;
        shared = true;
        dtimInterval = 0;
        mRandomizedMacAddress = MacAddress.ALL_ZEROS_ADDRESS;
        mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
    }

    /**
+25 −7
Original line number Diff line number Diff line
@@ -18,12 +18,14 @@ package android.net.wifi;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;

import android.os.Parcel;
import android.net.MacAddress;
import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
import android.net.wifi.WifiInfo;

import org.junit.Before;
import org.junit.Test;
@@ -176,22 +178,25 @@ public class WifiConfigurationTest {
    @Test
    public void testGetOrCreateRandomizedMacAddress_SavesAndReturnsSameAddress() {
        WifiConfiguration config = new WifiConfiguration();
        assertEquals(MacAddress.ALL_ZEROS_ADDRESS, config.getRandomizedMacAddress());
        MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
        assertEquals(defaultMac, config.getRandomizedMacAddress());

        MacAddress firstMacAddress = config.getOrCreateRandomizedMacAddress();
        MacAddress secondMacAddress = config.getOrCreateRandomizedMacAddress();

        assertNotEquals(defaultMac, firstMacAddress);
        assertEquals(firstMacAddress, secondMacAddress);
    }

    @Test
    public void testSetRandomizedMacAddress_ChangesSavedAddress() {
        WifiConfiguration config = new WifiConfiguration();
        assertEquals(MacAddress.ALL_ZEROS_ADDRESS, config.getRandomizedMacAddress());
        MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
        assertEquals(defaultMac, config.getRandomizedMacAddress());

        MacAddress macToChangeInto = MacAddress.createRandomUnicastAddress();
        config.setRandomizedMacAddress(macToChangeInto);
        MacAddress macAfterChange = config.getOrCreateRandomizedMacAddress();
        MacAddress macAfterChange = config.getRandomizedMacAddress();

        assertEquals(macToChangeInto, macAfterChange);
    }
@@ -200,24 +205,37 @@ public class WifiConfigurationTest {
    public void testGetOrCreateRandomizedMacAddress_ReRandomizesInvalidAddress() {
        WifiConfiguration config =  new WifiConfiguration();

        MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
        MacAddress macAddressZeroes = MacAddress.ALL_ZEROS_ADDRESS;
        MacAddress macAddressMulticast = MacAddress.fromString("03:ff:ff:ff:ff:ff");
        MacAddress macAddressGlobal = MacAddress.fromString("fc:ff:ff:ff:ff:ff");

        config.setRandomizedMacAddress(null);
        MacAddress macAfterChange = config.getOrCreateRandomizedMacAddress();
        assertFalse(macAfterChange.equals(null));
        assertNotEquals(macAfterChange, null);

        config.setRandomizedMacAddress(defaultMac);
        macAfterChange = config.getOrCreateRandomizedMacAddress();
        assertNotEquals(macAfterChange, defaultMac);

        config.setRandomizedMacAddress(macAddressZeroes);
        macAfterChange = config.getOrCreateRandomizedMacAddress();
        assertFalse(macAfterChange.equals(macAddressZeroes));
        assertNotEquals(macAfterChange, macAddressZeroes);

        config.setRandomizedMacAddress(macAddressMulticast);
        macAfterChange = config.getOrCreateRandomizedMacAddress();
        assertFalse(macAfterChange.equals(macAddressMulticast));
        assertNotEquals(macAfterChange, macAddressMulticast);

        config.setRandomizedMacAddress(macAddressGlobal);
        macAfterChange = config.getOrCreateRandomizedMacAddress();
        assertFalse(macAfterChange.equals(macAddressGlobal));
        assertNotEquals(macAfterChange, macAddressGlobal);
    }

    @Test
    public void testSetRandomizedMacAddress_DoesNothingWhenNull() {
        WifiConfiguration config = new WifiConfiguration();
        MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
        config.setRandomizedMacAddress(null);
        assertEquals(defaultMac, config.getRandomizedMacAddress());
    }
}