diff options
author | 2018-11-12 21:43:15 +0800 | |
---|---|---|
committer | 2019-02-20 15:12:42 +0800 | |
commit | 9c968fdb4f6535f45b0828e5c192164542d35821 (patch) | |
tree | 3e63dd814d9df3ef834f0762b7791c320fbbe9b8 | |
parent | ca9376cc4bae2b3d5ecb09083e9949c7ff4e2db4 (diff) |
MTP: remove usages of device identifiers with virtual serial number
Improving protection of user privacy
Use randomly generated virtual serial number that persists until factory reset
Bug: 117585389
Test: Open multiple MTP device
Check MTP device property
uninstall / re-install MTP driver
WMP sync with multiple MTP device
Enable MTP mode with multi-user
Malformed MTP ID file
Change-Id: I7ed4ce81d9ca1e1c6605c59c73bcd2d26419a5d3
-rwxr-xr-x | media/java/android/mtp/MtpDatabase.java | 7 | ||||
-rw-r--r-- | media/java/android/mtp/MtpServer.java | 54 |
2 files changed, 58 insertions, 3 deletions
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 474b671c0c2b..dc2d17753b1d 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -54,6 +54,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.IntStream; @@ -248,7 +249,7 @@ public class MtpDatabase implements AutoCloseable { public MtpDatabase(Context context, String volumeName, String[] subDirectories) { native_setup(); - mContext = context; + mContext = Objects.requireNonNull(context); mMediaProvider = context.getContentResolver() .acquireContentProviderClient(MediaStore.AUTHORITY); mVolumeName = volumeName; @@ -294,6 +295,10 @@ public class MtpDatabase implements AutoCloseable { } } + public Context getContext() { + return mContext; + } + @Override public void close() { mManager.close(); diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java index a555d37df40d..f0ab9a329953 100644 --- a/media/java/android/mtp/MtpServer.java +++ b/media/java/android/mtp/MtpServer.java @@ -18,7 +18,12 @@ package android.mtp; import com.android.internal.util.Preconditions; +import android.content.Context; +import android.content.SharedPreferences; +import android.util.ByteStringUtils; + import java.io.FileDescriptor; +import java.util.Random; /** * Java wrapper for MTP/PTP support as USB responder. @@ -29,6 +34,12 @@ public class MtpServer implements Runnable { private long mNativeContext; // accessed by native methods private final MtpDatabase mDatabase; private final Runnable mOnTerminate; + private final Context mContext; + +// It requires "exactly 32 characters, including any leading 0s" in MTP spec +// (5.1.1.14 Serial Number) + private static final int sID_LEN_BYTES = 16; + private static final int sID_LEN_STR = (sID_LEN_BYTES * 2); static { System.loadLibrary("media_jni"); @@ -41,10 +52,41 @@ public class MtpServer implements Runnable { Runnable onTerminate, String deviceInfoManufacturer, String deviceInfoModel, - String deviceInfoDeviceVersion, - String deviceInfoSerialNumber) { + String deviceInfoDeviceVersion) { mDatabase = Preconditions.checkNotNull(database); mOnTerminate = Preconditions.checkNotNull(onTerminate); + mContext = mDatabase.getContext(); + + final String strID_PREFS_NAME = "mtp-cfg"; + final String strID_PREFS_KEY = "mtp-id"; + String strRandomId = null; + String deviceInfoSerialNumber; + + SharedPreferences sharedPref = + mContext.getSharedPreferences(strID_PREFS_NAME, Context.MODE_PRIVATE); + if (sharedPref.contains(strID_PREFS_KEY)) { + strRandomId = sharedPref.getString(strID_PREFS_KEY, null); + + // Check for format consistence (regenerate upon corruption) + if (strRandomId.length() != sID_LEN_STR) { + strRandomId = null; + } else { + // Only accept hex digit + for (int ii = 0; ii < strRandomId.length(); ii++) + if (Character.digit(strRandomId.charAt(ii), 16) == -1) { + strRandomId = null; + break; + } + } + } + + if (strRandomId == null) { + strRandomId = getRandId(); + sharedPref.edit().putString(strID_PREFS_KEY, strRandomId).apply(); + } + + deviceInfoSerialNumber = strRandomId; + native_setup( database, controlFd, @@ -56,6 +98,14 @@ public class MtpServer implements Runnable { database.setServer(this); } + private String getRandId() { + Random randomVal = new Random(); + byte[] randomBytes = new byte[sID_LEN_BYTES]; + + randomVal.nextBytes(randomBytes); + return ByteStringUtils.toHexString(randomBytes); + } + public void start() { Thread thread = new Thread(this, "MtpServer"); thread.start(); |