summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author James Wei <jameswei@google.com> 2018-11-12 21:43:15 +0800
committer James Wei <jameswei@google.com> 2019-02-20 15:12:42 +0800
commit9c968fdb4f6535f45b0828e5c192164542d35821 (patch)
tree3e63dd814d9df3ef834f0762b7791c320fbbe9b8
parentca9376cc4bae2b3d5ecb09083e9949c7ff4e2db4 (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-xmedia/java/android/mtp/MtpDatabase.java7
-rw-r--r--media/java/android/mtp/MtpServer.java54
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();