From 8bc9340b4c186a77dfd467c0e4e5106df77be06e Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Tue, 1 Mar 2022 21:19:10 +0000 Subject: [PATCH] Remove broken code for mounting encrypted OBB files Mounting encrypted OBB files has never worked reliably across devices, partly due to its reliance on Twofish encryption support in the kernel. This is because Twofish support (CONFIG_CRYPTO_TWOFISH) has never been required or even recommended for Android. It has never been enabled in GKI, but even before GKI it wasn't required or recommended. Moreover, this is now the only Android feature that still uses dm-crypt (CONFIG_DM_CRYPT), and some devices don't have that enabled either. Therefore, it appears that this feature is unused. That's perhaps not surprising, considering that the documentation for OBBs (https://developer.android.com/google/play/expansion-files) says that they are deprecated, and also it explains OBBs as being app files that are opaque to the platform; the ability of the platform to mount OBBs that happen to be in a particular format is never mentioned. That means that OBB mounting is probably rarely used even with unencrypted OBBs. Finally, the usefulness of OBBs having their own encryption layer (in addition to what the platform already provides via FBE) is not clear either, especially with such an unusual choice of cipher. To avoid the confusion that is being caused by having the broken code for mounting encrypted OBBs still sitting around, let's remove it. Test: atest StorageManagerTest # on Cuttlefish Test: atest StorageManagerIntegrationTest # on Cuttlefish Bug: 216475849 Change-Id: I6e6a6462ab8343299dc5e0145b87dc28b16b0bc1 --- .../android/os/storage/IStorageManager.aidl | 12 ++-- .../android/os/storage/StorageManager.java | 13 ++-- .../res/raw/obb_enc_file100_orig1.obb | Bin 275008 -> 0 bytes .../res/raw/obb_enc_file100_orig3.obb | Bin 298560 -> 0 bytes .../os/storage/StorageManagerBaseTest.java | 26 +++----- .../StorageManagerIntegrationTest.java | 59 +----------------- libs/storage/IMountService.cpp | 3 +- libs/storage/include/storage/IMountService.h | 4 +- native/android/storage_manager.cpp | 13 ++-- .../android/server/StorageManagerService.java | 40 ++---------- 10 files changed, 41 insertions(+), 129 deletions(-) delete mode 100644 core/tests/coretests/res/raw/obb_enc_file100_orig1.obb delete mode 100644 core/tests/coretests/res/raw/obb_enc_file100_orig3.obb diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl index 9385402c3d72..6c0a1f99e112 100644 --- a/core/java/android/os/storage/IStorageManager.aidl +++ b/core/java/android/os/storage/IStorageManager.aidl @@ -54,13 +54,13 @@ interface IStorageManager { */ void shutdown(IStorageShutdownObserver observer) = 19; /** - * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and - * only allows the calling process's UID access to the contents. - * StorageManagerService will call back to the supplied IObbActionListener to inform - * it of the terminal state of the call. + * Mounts an Opaque Binary Blob (OBB). Only allows the calling process's UID + * access to the contents. StorageManagerService will call back to the + * supplied IObbActionListener to inform it of the terminal state of the + * call. */ - void mountObb(in String rawPath, in String canonicalPath, in String key, - IObbActionListener token, int nonce, in ObbInfo obbInfo) = 21; + void mountObb(in String rawPath, in String canonicalPath, IObbActionListener token, + int nonce, in ObbInfo obbInfo) = 21; /** * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified, * any program using it will be forcibly killed to unmount the image. diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 77c794cd17a8..39f87d558098 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -665,9 +665,7 @@ public class StorageManager { } /** - * Mount an Opaque Binary Blob (OBB) file. If a key is - * specified, it is supplied to the mounting process to be used in any - * encryption used in the OBB. + * Mount an Opaque Binary Blob (OBB) file. *

* The OBB will remain mounted for as long as the StorageManager reference * is held by the application. As soon as this reference is lost, the OBBs @@ -680,19 +678,22 @@ public class StorageManager { * application's OBB that shares its UID. * * @param rawPath the path to the OBB file - * @param key secret used to encrypt the OBB; may be null if no - * encryption was used on the OBB. + * @param key must be null. Previously, some Android device + * implementations accepted a non-null key to mount + * an encrypted OBB file. However, this never worked reliably and + * is no longer supported. * @param listener will receive the success or failure of the operation * @return whether the mount call was successfully queued or not */ public boolean mountObb(String rawPath, String key, OnObbStateChangeListener listener) { Preconditions.checkNotNull(rawPath, "rawPath cannot be null"); + Preconditions.checkArgument(key == null, "mounting encrypted OBBs is no longer supported"); Preconditions.checkNotNull(listener, "listener cannot be null"); try { final String canonicalPath = new File(rawPath).getCanonicalPath(); final int nonce = mObbActionListener.addListener(listener); - mStorageManager.mountObb(rawPath, canonicalPath, key, mObbActionListener, nonce, + mStorageManager.mountObb(rawPath, canonicalPath, mObbActionListener, nonce, getObbInfo(canonicalPath)); return true; } catch (IOException e) { diff --git a/core/tests/coretests/res/raw/obb_enc_file100_orig1.obb b/core/tests/coretests/res/raw/obb_enc_file100_orig1.obb deleted file mode 100644 index 373b8e4bd01feeac424a30bd09c9fac3779fddda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275008 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%0Aw=4}Bdr{3hqFdAdMXZr^ueAprzkyT^Y%70kJQaC zQsZAJz5OAXYm#rKEZk5Sr-M$6oh|97khnJ3O5gQU;Su9E`O%b?#=YJ$|9X^ih3M>I z(b_lKNe+7dmCM;#=IqLHCx34D-;Oac>2?ahRi``YU0oR&3Vm7{gL?bh{_zUqt1E|X zXGuhoPs;+cV(i<8W)8xsOa26>lDE9k5n=>LR0&v*D#|H-i54e$_faN$4bbm%+#}&* zwj(+A(Duap6Z&I#bGALrvWur_km*$1{*Qza^{^w$RMb1Z&*$9~6pg2tcC zTz@`HWv#9k{3{|Tcr;&ubS0!I^l2$>KR&!of$m-A7zcgt{DcvQK0PePx42#eN z0ea*Uj*SM1S=@T!$3X`le_<7}b2Kpj2yCzsjNND0%;w>7RLd3H8O(d1z7grGJKVTP zFeygADb_2Pqf+|)7dC%S>q5Xi`^Yf7-~!3#@f)?1cu!7o>lF;Rj*>%P$Kx^^XdyOS zBtJ#8^|YCyL{{w-LY_HnA{Ajjr}9=Lt@|_cer5|T>1nh~`zBM3aRK8Me`&=_k%TM8 zD$i>~!o;(uSJh2`$UL$6;QFuT9f? zO^uNV{%RgSjPFw(dSdcBBBDNN{IM06z%`0m*!t5%@eQvJw(LwKVGX0FHGiWNw*%cc z;yd2S++TB$;M6Qceu&X7H$MGv@qwPK4cWh_N>t^$7m`$Faf6+ek)GiQ6p;p7rW>yG z6Vi;v9=IqEBpGw2OLHol%3pQSynJ}Bes>QJ5C8!X009sHf&V#yDS9_%m&bn?-`yjN zTupv$q@m}kb%vTD_~lolnFIxS8p7>;o|^Fm_wosyugzG-D!(}j#wT|u_|v9ZSPbq& zyegX-U;Vi&C~iV&!F2FgzohR7wf@=r?{W9kq%rUFj=U{jwh{S1vvH3teXbtQh1g!x zNVQueCOG{yYn1R$C_e7Vr4m0`8yy!!m2c$X_8}wfpZMa%Tp3C|&gCqeGHPn$77|%6 z=OPs@boHQWZlZ(i^|Qe{SL>f|cNz;jb_3%O-RGA68J(&Jep>55C(`^$5ys*zJEj>b z!I_V<>;3zmB7$}`T~|hf9g|AH(!n#~S4j!kBe@h*v8oFR%0DWw47kO+b?;`vSR(Zk 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 z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH z0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI 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 GiugavXTe4Q diff --git a/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java b/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java index 16dcff5e0c8c..e56c0ad0138a 100644 --- a/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java +++ b/core/tests/coretests/src/android/os/storage/StorageManagerBaseTest.java @@ -46,11 +46,7 @@ public class StorageManagerBaseTest extends InstrumentationTestCase { protected static String OBB_FILE_1_CONTENTS_1 = "OneToOneThousandInts.bin"; protected static String OBB_FILE_2 = "obb_file2.obb"; protected static String OBB_FILE_3 = "obb_file3.obb"; - protected static String OBB_FILE_1_PASSWORD = "password1"; - protected static String OBB_FILE_1_ENCRYPTED = "obb_enc_file100_orig1.obb"; protected static String OBB_FILE_2_UNSIGNED = "obb_file2_nosign.obb"; - protected static String OBB_FILE_3_PASSWORD = "password3"; - protected static String OBB_FILE_3_ENCRYPTED = "obb_enc_file100_orig3.obb"; protected static String OBB_FILE_3_BAD_PACKAGENAME = "obb_file3_bad_packagename.obb"; protected static boolean FORCE = true; @@ -180,22 +176,21 @@ public class StorageManagerBaseTest extends InstrumentationTestCase { * Mounts an OBB file * * @param obbFilePath The full path to the OBB file to mount - * @param key (optional) The key to use to unencrypt the OBB; pass null for no encryption * @param expectedState The expected state resulting from trying to mount the OBB * @return A {@link String} representing the normalized path to OBB file that was mounted */ - protected String mountObb(String obbFilePath, String key, int expectedState) { - return doMountObb(obbFilePath, key, expectedState); + protected String mountObb(String obbFilePath, int expectedState) { + return doMountObb(obbFilePath, expectedState); } /** - * Mounts an OBB file with default options (no encryption, mounting succeeds) + * Mounts an OBB file with default options. * * @param obbFilePath The full path to the OBB file to mount * @return A {@link String} representing the normalized path to OBB file that was mounted */ protected String mountObb(String obbFilePath) { - return doMountObb(obbFilePath, null, OnObbStateChangeListener.MOUNTED); + return doMountObb(obbFilePath, OnObbStateChangeListener.MOUNTED); } /** @@ -232,13 +227,13 @@ public class StorageManagerBaseTest extends InstrumentationTestCase { * @return true if the listener was signaled of a state change by the system; else a fail() * is triggered if we timed out */ - protected String doMountObb_noThrow(String obbFilePath, String key, int expectedState) { - Log.i(LOG_TAG, "doMountObb() on " + obbFilePath + " using key: " + key); + protected String doMountObb_noThrow(String obbFilePath, int expectedState) { + Log.i(LOG_TAG, "doMountObb() on " + obbFilePath); assertTrue ("Null path was passed in for OBB file!", obbFilePath != null); assertTrue ("Null path was passed in for OBB file!", obbFilePath != null); ObbListener obbListener = new ObbListener(); - boolean success = mSm.mountObb(obbFilePath, key, obbListener); + boolean success = mSm.mountObb(obbFilePath, null, obbListener); success &= obbFilePath.equals(doWaitForObbStateChange(obbListener)); success &= (expectedState == obbListener.state()); @@ -260,17 +255,16 @@ public class StorageManagerBaseTest extends InstrumentationTestCase { * Mounts an OBB file without throwing and synchronously waits for it to finish mounting * * @param obbFilePath The full path to the OBB file to mount - * @param key (optional) The key to use to unencrypt the OBB; pass null for no encryption * @param expectedState The expected state resulting from trying to mount the OBB * @return A {@link String} representing the actual normalized path to OBB file that was * mounted, or null if the mounting failed */ - protected String doMountObb(String obbFilePath, String key, int expectedState) { - Log.i(LOG_TAG, "doMountObb() on " + obbFilePath + " using key: " + key); + protected String doMountObb(String obbFilePath, int expectedState) { + Log.i(LOG_TAG, "doMountObb() on " + obbFilePath); assertTrue ("Null path was passed in for OBB file!", obbFilePath != null); ObbListener obbListener = new ObbListener(); - assertTrue("mountObb call failed", mSm.mountObb(obbFilePath, key, obbListener)); + assertTrue("mountObb call failed", mSm.mountObb(obbFilePath, null, obbListener)); assertTrue("Failed to get OBB mount status change for file: " + obbFilePath, doWaitForObbStateChange(obbListener)); assertEquals("OBB mount state not what was expected!", expectedState, diff --git a/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java b/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java index 62f2ac28a601..ecd2f76a5160 100644 --- a/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java +++ b/core/tests/coretests/src/android/os/storage/StorageManagerIntegrationTest.java @@ -82,58 +82,6 @@ public class StorageManagerIntegrationTest extends StorageManagerBaseTest { } } - /** - * Tests mounting a single encrypted OBB file and verifies its contents. - */ - @LargeTest - public void testMountSingleEncryptedObb() throws Exception { - final File file = createObbFile(OBB_FILE_3_ENCRYPTED, R.raw.obb_enc_file100_orig3); - String filePath = file.getAbsolutePath(); - mountObb(filePath, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.MOUNTED); - verifyObb3Contents(filePath); - unmountObb(filePath, DONT_FORCE); - } - - /** - * Tests mounting a single encrypted OBB file using an invalid password. - */ - @LargeTest - public void testMountSingleEncryptedObbInvalidPassword() throws Exception { - final File file = createObbFile("bad password@$%#@^*(!&)", R.raw.obb_enc_file100_orig3); - String filePath = file.getAbsolutePath(); - mountObb(filePath, OBB_FILE_1_PASSWORD, OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT); - } - - /** - * Tests simultaneously mounting 2 encrypted OBBs with different keys and verifies contents. - */ - @LargeTest - public void testMountTwoEncryptedObb() throws Exception { - File file3 = null; - File file1 = null; - try { - file3 = createObbFile(OBB_FILE_3_ENCRYPTED, R.raw.obb_enc_file100_orig3); - String filePath3 = file3.getAbsolutePath(); - mountObb(filePath3, OBB_FILE_3_PASSWORD, OnObbStateChangeListener.MOUNTED); - verifyObb3Contents(filePath3); - - file1 = createObbFile(OBB_FILE_1_ENCRYPTED, R.raw.obb_enc_file100_orig1); - String filePath1 = file1.getAbsolutePath(); - mountObb(filePath1, OBB_FILE_1_PASSWORD, OnObbStateChangeListener.MOUNTED); - verifyObb1Contents(filePath1); - - unmountObb(filePath3, DONT_FORCE); - unmountObb(filePath1, DONT_FORCE); - } finally { - if (file3 != null) { - file3.delete(); - } - if (file1 != null) { - file1.delete(); - } - } - } - /** * Tests mounting a single OBB that isn't signed. */ @@ -142,7 +90,7 @@ public class StorageManagerIntegrationTest extends StorageManagerBaseTest { final File file = createObbFile(OBB_FILE_2_UNSIGNED, R.raw.obb_file2_nosign); String filePath = file.getAbsolutePath(); try { - mountObb(filePath, OBB_FILE_2_UNSIGNED, OnObbStateChangeListener.ERROR_INTERNAL); + mountObb(filePath, OnObbStateChangeListener.ERROR_INTERNAL); fail("mountObb should've failed with an exception"); } catch (IllegalArgumentException e) { // Expected @@ -156,8 +104,7 @@ public class StorageManagerIntegrationTest extends StorageManagerBaseTest { public void testMountBadPackageNameObb() throws Exception { final File file = createObbFile(OBB_FILE_3_BAD_PACKAGENAME, R.raw.obb_file3_bad_packagename); String filePath = file.getAbsolutePath(); - mountObb(filePath, OBB_FILE_3_BAD_PACKAGENAME, - OnObbStateChangeListener.ERROR_PERMISSION_DENIED); + mountObb(filePath, OnObbStateChangeListener.ERROR_PERMISSION_DENIED); } /** @@ -169,7 +116,7 @@ public class StorageManagerIntegrationTest extends StorageManagerBaseTest { String filePath = file.getAbsolutePath(); mountObb(filePath); verifyObb1Contents(filePath); - mountObb(filePath, null, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED); + mountObb(filePath, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED); verifyObb1Contents(filePath); unmountObb(filePath, DONT_FORCE); } diff --git a/libs/storage/IMountService.cpp b/libs/storage/IMountService.cpp index fd6e6e932ebc..055dbb2b5c5e 100644 --- a/libs/storage/IMountService.cpp +++ b/libs/storage/IMountService.cpp @@ -442,14 +442,13 @@ public: reply.readExceptionCode(); } - void mountObb(const String16& rawPath, const String16& canonicalPath, const String16& key, + void mountObb(const String16& rawPath, const String16& canonicalPath, const sp& token, int32_t nonce, const sp& obbInfo) { Parcel data, reply; data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); data.writeString16(rawPath); data.writeString16(canonicalPath); - data.writeString16(key); data.writeStrongBinder(IInterface::asBinder(token)); data.writeInt32(nonce); obbInfo->writeToParcel(&data); diff --git a/libs/storage/include/storage/IMountService.h b/libs/storage/include/storage/IMountService.h index 2463e023efc1..5b07318f4432 100644 --- a/libs/storage/include/storage/IMountService.h +++ b/libs/storage/include/storage/IMountService.h @@ -64,8 +64,8 @@ public: virtual void shutdown(const sp& observer) = 0; virtual void finishMediaUpdate() = 0; virtual void mountObb(const String16& rawPath, const String16& canonicalPath, - const String16& key, const sp& token, - const int32_t nonce, const sp& obbInfo) = 0; + const sp& token, const int32_t nonce, + const sp& obbInfo) = 0; virtual void unmountObb(const String16& filename, const bool force, const sp& token, const int32_t nonce) = 0; virtual bool isObbMounted(const String16& filename) = 0; diff --git a/native/android/storage_manager.cpp b/native/android/storage_manager.cpp index 22725254fef6..9e0a6eb476d3 100644 --- a/native/android/storage_manager.cpp +++ b/native/android/storage_manager.cpp @@ -140,8 +140,7 @@ public: } } - void mountObb(const char* rawPath, const char* key, AStorageManager_obbCallbackFunc func, - void* data) { + void mountObb(const char* rawPath, AStorageManager_obbCallbackFunc func, void* data) { // Resolve path before sending to MountService char canonicalPath[PATH_MAX]; if (realpath(rawPath, canonicalPath) == NULL) { @@ -158,9 +157,7 @@ public: ObbCallback* cb = registerObbCallback(func, data); String16 rawPath16(rawPath); String16 canonicalPath16(canonicalPath); - String16 key16(key); - mMountService->mountObb(rawPath16, canonicalPath16, key16, mObbActionListener, - cb->nonce, obbInfo); + mMountService->mountObb(rawPath16, canonicalPath16, mObbActionListener, cb->nonce, obbInfo); } void unmountObb(const char* filename, const bool force, AStorageManager_obbCallbackFunc func, void* data) { @@ -207,7 +204,11 @@ void AStorageManager_delete(AStorageManager* mgr) { void AStorageManager_mountObb(AStorageManager* mgr, const char* filename, const char* key, AStorageManager_obbCallbackFunc cb, void* data) { - mgr->mountObb(filename, key, cb, data); + if (key != nullptr && key[0] != '\0') { + ALOGE("mounting encrypted OBBs is no longer supported"); + return; + } + mgr->mountObb(filename, cb, data); } void AStorageManager_unmountObb(AStorageManager* mgr, const char* filename, const int force, diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 9546496fd8e8..9266bb431aa5 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -173,9 +173,6 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import java.math.BigInteger; -import java.security.GeneralSecurityException; -import java.security.spec.KeySpec; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -194,10 +191,6 @@ import java.util.concurrent.TimeoutException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; - /** * Service responsible for various storage media. Connects to {@code vold} to * watch for and manage dynamically added storage, such as SD cards and USB mass @@ -3073,8 +3066,8 @@ class StorageManagerService extends IStorageManager.Stub } @Override - public void mountObb(String rawPath, String canonicalPath, String key, - IObbActionListener token, int nonce, ObbInfo obbInfo) { + public void mountObb(String rawPath, String canonicalPath, IObbActionListener token, + int nonce, ObbInfo obbInfo) { Objects.requireNonNull(rawPath, "rawPath cannot be null"); Objects.requireNonNull(canonicalPath, "canonicalPath cannot be null"); Objects.requireNonNull(token, "token cannot be null"); @@ -3083,7 +3076,7 @@ class StorageManagerService extends IStorageManager.Stub final int callingUid = Binder.getCallingUid(); final ObbState obbState = new ObbState(rawPath, canonicalPath, callingUid, token, nonce, null); - final ObbAction action = new MountObbAction(obbState, key, callingUid, obbInfo); + final ObbAction action = new MountObbAction(obbState, callingUid, obbInfo); mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(OBB_RUN_ACTION, action)); if (DEBUG_OBB) @@ -4428,13 +4421,11 @@ class StorageManagerService extends IStorageManager.Stub } class MountObbAction extends ObbAction { - private final String mKey; private final int mCallingUid; private ObbInfo mObbInfo; - MountObbAction(ObbState obbState, String key, int callingUid, ObbInfo obbInfo) { + MountObbAction(ObbState obbState, int callingUid, ObbInfo obbInfo) { super(obbState); - mKey = key; mCallingUid = callingUid; mObbInfo = obbInfo; } @@ -4457,29 +4448,8 @@ class StorageManagerService extends IStorageManager.Stub "Attempt to mount OBB which is already mounted: " + mObbInfo.filename); } - final String hashedKey; - final String binderKey; - if (mKey == null) { - hashedKey = "none"; - binderKey = ""; - } else { - try { - SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); - - KeySpec ks = new PBEKeySpec(mKey.toCharArray(), mObbInfo.salt, - PBKDF2_HASH_ROUNDS, CRYPTO_ALGORITHM_KEY_SIZE); - SecretKey key = factory.generateSecret(ks); - BigInteger bi = new BigInteger(key.getEncoded()); - hashedKey = bi.toString(16); - binderKey = hashedKey; - } catch (GeneralSecurityException e) { - throw new ObbException(ERROR_INTERNAL, e); - } - } - try { - mObbState.volId = mVold.createObb(mObbState.canonicalPath, binderKey, - mObbState.ownerGid); + mObbState.volId = mVold.createObb(mObbState.canonicalPath, mObbState.ownerGid); mVold.mount(mObbState.volId, 0, -1, null); if (DEBUG_OBB)