diff options
author | Paul Lawrence <paullawrence@google.com> | 2014-02-14 15:24:59 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-02-14 15:25:01 +0000 |
commit | a9f387bdf0a836de8bcb12a46a5cdfcb544fbb1a (patch) | |
tree | 228c451ee85ae004dc62b1eedc79522efa40fdf9 /services | |
parent | ee904d4d3ee710f292b607224a6017e843827360 (diff) | |
parent | 8e39736f91a08961cf59c87075e61d9026833b50 (diff) | |
download | frameworks_base-a9f387bdf0a836de8bcb12a46a5cdfcb544fbb1a.zip frameworks_base-a9f387bdf0a836de8bcb12a46a5cdfcb544fbb1a.tar.gz frameworks_base-a9f387bdf0a836de8bcb12a46a5cdfcb544fbb1a.tar.bz2 |
Merge "Support default, pattern, pin and password encryption types"
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/MountService.java | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index e6e4bca..0f2e56c 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -73,13 +73,16 @@ import com.android.server.pm.UserManagerService; import com.google.android.collect.Lists; import com.google.android.collect.Maps; +import org.apache.commons.codec.binary.Hex; import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; @@ -189,6 +192,12 @@ class MountService extends IMountService.Stub public static final int FstrimCompleted = 700; } + /** List of crypto types. + * These must match CRYPT_TYPE_XXX in cryptfs.h AND their + * corresponding commands in CommandListener.cpp */ + public static final String[] CRYPTO_TYPES + = { "password", "default", "pattern", "pin" }; + private Context mContext; private NativeDaemonConnector mConnector; @@ -2036,6 +2045,14 @@ class MountService extends IMountService.Stub } } + private String toHex(String password) { + if (password == null) { + return null; + } + byte[] bytes = password.getBytes(StandardCharsets.UTF_8); + return new String(Hex.encodeHex(bytes)); + } + @Override public int decryptStorage(String password) { if (TextUtils.isEmpty(password)) { @@ -2053,7 +2070,7 @@ class MountService extends IMountService.Stub final NativeDaemonEvent event; try { - event = mConnector.execute("cryptfs", "checkpw", new SensitiveArg(password)); + event = mConnector.execute("cryptfs", "checkpw", new SensitiveArg(toHex(password))); final int code = Integer.parseInt(event.getMessage()); if (code == 0) { @@ -2092,7 +2109,8 @@ class MountService extends IMountService.Stub } try { - mConnector.execute("cryptfs", "enablecrypto", "inplace", new SensitiveArg(password)); + mConnector.execute("cryptfs", "enablecrypto", "inplace", + new SensitiveArg(toHex(password))); } catch (NativeDaemonConnectorException e) { // Encryption failed return e.getCode(); @@ -2101,11 +2119,11 @@ class MountService extends IMountService.Stub return 0; } - public int changeEncryptionPassword(String password) { - if (TextUtils.isEmpty(password)) { - throw new IllegalArgumentException("password cannot be empty"); - } - + /** Set the password for encrypting the master key. + * @param type One of the CRYPTO_TYPE_XXX consts defined in StorageManager. + * @param password The password to set. + */ + public int changeEncryptionPassword(int type, String password) { mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, "no permission to access the crypt keeper"); @@ -2117,7 +2135,8 @@ class MountService extends IMountService.Stub final NativeDaemonEvent event; try { - event = mConnector.execute("cryptfs", "changepw", new SensitiveArg(password)); + event = mConnector.execute("cryptfs", "changepw", CRYPTO_TYPES[type], + new SensitiveArg(toHex(password))); return Integer.parseInt(event.getMessage()); } catch (NativeDaemonConnectorException e) { // Encryption failed @@ -2150,7 +2169,7 @@ class MountService extends IMountService.Stub final NativeDaemonEvent event; try { - event = mConnector.execute("cryptfs", "verifypw", new SensitiveArg(password)); + event = mConnector.execute("cryptfs", "verifypw", new SensitiveArg(toHex(password))); Slog.i(TAG, "cryptfs verifypw => " + event.getMessage()); return Integer.parseInt(event.getMessage()); } catch (NativeDaemonConnectorException e) { @@ -2159,6 +2178,29 @@ class MountService extends IMountService.Stub } } + /** + * Get the type of encryption used to encrypt the master key. + * @return The type, one of the CRYPT_TYPE_XXX consts from StorageManager. + */ + @Override + public int getPasswordType() throws RemoteException { + + waitForReady(); + + final NativeDaemonEvent event; + try { + event = mConnector.execute("cryptfs", "getpwtype"); + for (int i = 0; i < CRYPTO_TYPES.length; ++i) { + if (CRYPTO_TYPES[i].equals(event.getMessage())) + return i; + } + + throw new IllegalStateException("unexpected return from cryptfs"); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + @Override public int mkdirs(String callingPkg, String appPath) { final int userId = UserHandle.getUserId(Binder.getCallingUid()); |