diff options
author | Paul Lawrence <paullawrence@google.com> | 2014-01-27 15:22:30 -0800 |
---|---|---|
committer | Paul Lawrence <paullawrence@google.com> | 2014-02-13 15:46:24 +0000 |
commit | 8e39736f91a08961cf59c87075e61d9026833b50 (patch) | |
tree | 1d90cec7e4777f195d634c7030d6c4592935b9aa /core | |
parent | f6475c7204759a57bc730e2bbaefb3448a77c141 (diff) | |
download | frameworks_base-8e39736f91a08961cf59c87075e61d9026833b50.zip frameworks_base-8e39736f91a08961cf59c87075e61d9026833b50.tar.gz frameworks_base-8e39736f91a08961cf59c87075e61d9026833b50.tar.bz2 |
Support default, pattern, pin and password encryption types
Java plumbing to expose methods to get/set encryption type in
IMountService, and hooking up of those methods to the Settings app
so the type is set correctly.
Needs matching vold changes from
https://googleplex-android-review.googlesource.com/#/c/412649/
Bug: 8769627
Change-Id: I70c0ed72d11f5ab6f0958a7f9c101b6822b13baa
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/os/storage/IMountService.java | 40 | ||||
-rw-r--r-- | core/java/android/os/storage/StorageManager.java | 10 | ||||
-rw-r--r-- | core/java/com/android/internal/widget/LockPatternUtils.java | 28 |
3 files changed, 69 insertions, 9 deletions
diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index 51ba2f6..b97734e 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -642,12 +642,13 @@ public interface IMountService extends IInterface { return _result; } - public int changeEncryptionPassword(String password) throws RemoteException { + public int changeEncryptionPassword(int type, String password) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); int _result; try { _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(type); _data.writeString(password); mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0); _reply.readException(); @@ -677,6 +678,22 @@ public interface IMountService extends IInterface { return _result; } + public int getPasswordType() throws RemoteException { + Parcel _data = Parcel.obtain(); + Parcel _reply = Parcel.obtain(); + int _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + mRemote.transact(Stub.TRANSACTION_getPasswordType, _data, _reply, 0); + _reply.readException(); + _result = _reply.readInt(); + } finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + public StorageVolume[] getVolumeList() throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); @@ -829,6 +846,8 @@ public interface IMountService extends IInterface { static final int TRANSACTION_mkdirs = IBinder.FIRST_CALL_TRANSACTION + 34; + static final int TRANSACTION_getPasswordType = IBinder.FIRST_CALL_TRANSACTION + 36; + /** * Cast an IBinder object into an IMountService interface, generating a * proxy if needed. @@ -1130,8 +1149,9 @@ public interface IMountService extends IInterface { } case TRANSACTION_changeEncryptionPassword: { data.enforceInterface(DESCRIPTOR); + int type = data.readInt(); String password = data.readString(); - int result = changeEncryptionPassword(password); + int result = changeEncryptionPassword(type, password); reply.writeNoException(); reply.writeInt(result); return true; @@ -1181,6 +1201,13 @@ public interface IMountService extends IInterface { reply.writeInt(result); return true; } + case TRANSACTION_getPasswordType: { + data.enforceInterface(DESCRIPTOR); + int result = getPasswordType(); + reply.writeNoException(); + reply.writeInt(result); + return true; + } } return super.onTransact(code, data, reply, flags); } @@ -1375,7 +1402,8 @@ public interface IMountService extends IInterface { /** * Changes the encryption password. */ - public int changeEncryptionPassword(String password) throws RemoteException; + public int changeEncryptionPassword(int type, String password) + throws RemoteException; /** * Verify the encryption password against the stored volume. This method @@ -1412,4 +1440,10 @@ public interface IMountService extends IInterface { * external storage data or OBB directory belonging to calling app. */ public int mkdirs(String callingPkg, String path) throws RemoteException; + + /** + * Determines the type of the encryption password + * @return PasswordType + */ + public int getPasswordType() throws RemoteException; } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index f5e728d..68b91cb 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -645,4 +645,14 @@ public class StorageManager { return Settings.Global.getLong(mResolver, Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES, DEFAULT_FULL_THRESHOLD_BYTES); } + + /// Consts to match the password types in cryptfs.h + /** @hide */ + public static final int CRYPT_TYPE_PASSWORD = 0; + /** @hide */ + public static final int CRYPT_TYPE_DEFAULT = 1; + /** @hide */ + public static final int CRYPT_TYPE_PATTERN = 2; + /** @hide */ + public static final int CRYPT_TYPE_PIN = 3; } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 3419f15..f5c18f5 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -30,10 +30,12 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; import android.os.storage.IMountService; +import android.os.storage.StorageManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; +import android.util.Slog; import android.view.IWindowManager; import android.view.View; import android.widget.Button; @@ -498,6 +500,13 @@ public class LockPatternUtils { getLockSettings().setLockPattern(patternToString(pattern), getCurrentOrCallingUserId()); DevicePolicyManager dpm = getDevicePolicyManager(); if (pattern != null) { + + int userHandle = getCurrentOrCallingUserId(); + if (userHandle == UserHandle.USER_OWNER) { + String stringPattern = patternToString(pattern); + updateEncryptionPassword(StorageManager.CRYPT_TYPE_PATTERN, stringPattern); + } + setBoolean(PATTERN_EVER_CHOSEN_KEY, true); if (!isFallback) { deleteGallery(); @@ -565,7 +574,7 @@ public class LockPatternUtils { } /** Update the encryption password if it is enabled **/ - private void updateEncryptionPassword(String password) { + private void updateEncryptionPassword(int type, String password) { DevicePolicyManager dpm = getDevicePolicyManager(); if (dpm.getStorageEncryptionStatus(getCurrentOrCallingUserId()) != DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE) { @@ -580,7 +589,7 @@ public class LockPatternUtils { IMountService mountService = IMountService.Stub.asInterface(service); try { - mountService.changeEncryptionPassword(password); + mountService.changeEncryptionPassword(type, password); } catch (RemoteException e) { Log.e(TAG, "Error changing encryption password", e); } @@ -623,12 +632,15 @@ public class LockPatternUtils { getLockSettings().setLockPassword(password, userHandle); DevicePolicyManager dpm = getDevicePolicyManager(); if (password != null) { + int computedQuality = computePasswordQuality(password); + if (userHandle == UserHandle.USER_OWNER) { // Update the encryption password. - updateEncryptionPassword(password); + int type = computedQuality == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC + ? StorageManager.CRYPT_TYPE_PIN : StorageManager.CRYPT_TYPE_PASSWORD; + updateEncryptionPassword(type, password); } - int computedQuality = computePasswordQuality(password); if (!isFallback) { deleteGallery(); setLong(PASSWORD_TYPE_KEY, Math.max(quality, computedQuality), userHandle); @@ -675,8 +687,7 @@ public class LockPatternUtils { 0, 0, 0, 0, 0, 0, 0, userHandle); } // Add the password to the password history. We assume all - // password - // hashes have the same length for simplicity of implementation. + // password hashes have the same length for simplicity of implementation. String passwordHistory = getString(PASSWORD_HISTORY_KEY, userHandle); if (passwordHistory == null) { passwordHistory = new String(); @@ -695,6 +706,11 @@ public class LockPatternUtils { } setString(PASSWORD_HISTORY_KEY, passwordHistory, userHandle); } else { + if (userHandle == UserHandle.USER_OWNER) { + // Update the encryption password. + updateEncryptionPassword(StorageManager.CRYPT_TYPE_DEFAULT, password); + } + dpm.setActivePasswordState( DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, 0, 0, 0, 0, 0, 0, 0, userHandle); |