diff options
| author | 2021-02-20 11:42:26 +0000 | |
|---|---|---|
| committer | 2021-02-20 11:42:26 +0000 | |
| commit | 55cd97f94c7e821e42f43d61583dd66d17f2d95f (patch) | |
| tree | 38bc566d66d574ccb61b5254971ccc4290744b95 | |
| parent | 2540861d4fff04cdc0778fb64d5ba9a020a39b59 (diff) | |
| parent | 7fa15840a84480cee06715ba1c68d53ecd9fa4aa (diff) | |
Merge "Integrate IKeystoreUserManager aidl with LockSettingsService." am: bfc1f6b382 am: 7fa15840a8
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1578423
MUST ONLY BE SUBMITTED BY AUTOMERGER
Change-Id: I97ec4f0aa946c4847aaa5ff1ddc77c0d133d65f7
4 files changed, 111 insertions, 14 deletions
diff --git a/Android.bp b/Android.bp index 4f248d9d5c96..88ed676aae69 100644 --- a/Android.bp +++ b/Android.bp @@ -525,6 +525,7 @@ java_library {          "android.hardware.vibrator-V1.3-java",          "android.security.apc-java",          "android.security.authorization-java", +        "android.security.usermanager-java",          "android.system.keystore2-V1-java",          "android.system.suspend.control.internal-java",          "devicepolicyprotosnano", diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java new file mode 100644 index 000000000000..c81c8c54d88a --- /dev/null +++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.ServiceManager; +import android.os.ServiceSpecificException; +import android.security.usermanager.IKeystoreUserManager; +import android.system.keystore2.ResponseCode; +import android.util.Log; + +/** + * @hide This is the client side for IKeystoreUserManager AIDL. + * It shall only be used by the LockSettingsService. + */ +public class AndroidKeyStoreMaintenance { +    private static final String TAG = "AndroidKeyStoreMaintenance"; + +    public static final int SYSTEM_ERROR = ResponseCode.SYSTEM_ERROR; + +    private static IKeystoreUserManager getService() { +        return IKeystoreUserManager.Stub.asInterface( +                ServiceManager.checkService("android.security.usermanager")); +    } + +    /** +     * Informs keystore2 about adding a user +     * +     * @param userId - Android user id of the user being added +     * @return 0 if successful or a {@code ResponseCode} +     * @hide +     */ +    public static int onUserAdded(@NonNull int userId) { +        if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; +        try { +            getService().onUserAdded(userId); +            return 0; +        } catch (ServiceSpecificException e) { +            Log.e(TAG, "onUserAdded failed", e); +            return e.errorCode; +        } catch (Exception e) { +            Log.e(TAG, "Can not connect to keystore", e); +            return SYSTEM_ERROR; +        } +    } + +    /** +     * Informs keystore2 about removing a usergit mer +     * +     * @param userId - Android user id of the user being removed +     * @return 0 if successful or a {@code ResponseCode} +     * @hide +     */ +    public static int onUserRemoved(int userId) { +        if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; +        try { +            getService().onUserRemoved(userId); +            return 0; +        } catch (ServiceSpecificException e) { +            Log.e(TAG, "onUserRemoved failed", e); +            return e.errorCode; +        } catch (Exception e) { +            Log.e(TAG, "Can not connect to keystore", e); +            return SYSTEM_ERROR; +        } +    } + +    /** +     * Informs keystore2 about changing user's password +     * +     * @param userId   - Android user id of the user +     * @param password - a secret derived from the synthetic password provided by the +     *                 LockSettingService +     * @return 0 if successful or a {@code ResponseCode} +     * @hide +     */ +    public static int onUserPasswordChanged(int userId, @Nullable byte[] password) { +        if (!android.security.keystore2.AndroidKeyStoreProvider.isInstalled()) return 0; +        try { +            getService().onUserPasswordChanged(userId, password); +            return 0; +        } catch (ServiceSpecificException e) { +            Log.e(TAG, "onUserPasswordChanged failed", e); +            return e.errorCode; +        } catch (Exception e) { +            Log.e(TAG, "Can not connect to keystore", e); +            return SYSTEM_ERROR; +        } +    } +} diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index a589fedaec72..86cf9b5ae874 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -89,6 +89,7 @@ import android.os.storage.StorageManager;  import android.provider.Settings;  import android.provider.Settings.Secure;  import android.provider.Settings.SettingNotFoundException; +import android.security.AndroidKeyStoreMaintenance;  import android.security.Authorization;  import android.security.KeyStore;  import android.security.keystore.AndroidKeyStoreProvider; @@ -225,7 +226,6 @@ public class LockSettingsService extends ILockSettings.Stub {      private final SyntheticPasswordManager mSpManager;      private final KeyStore mKeyStore; -      private final RecoverableKeyStoreManager mRecoverableKeyStoreManager;      private ManagedProfilePasswordCache mManagedProfilePasswordCache; @@ -803,6 +803,7 @@ public class LockSettingsService extends ILockSettings.Stub {              if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) {                  // Notify keystore that a new user was added.                  final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); +                AndroidKeyStoreMaintenance.onUserAdded(userHandle);                  final KeyStore ks = KeyStore.getInstance();                  final UserInfo parentInfo = mUserManager.getProfileParent(userHandle);                  final int parentHandle = parentInfo != null ? parentInfo.id : -1; @@ -1270,6 +1271,7 @@ public class LockSettingsService extends ILockSettings.Stub {      }      private void setKeystorePassword(byte[] password, int userHandle) { +        AndroidKeyStoreMaintenance.onUserPasswordChanged(userHandle, password);          final KeyStore ks = KeyStore.getInstance();          // TODO(b/120484642): Update keystore to accept byte[] passwords          String passwordString = password == null ? null : new String(password); @@ -2301,6 +2303,7 @@ public class LockSettingsService extends ILockSettings.Stub {          mSpManager.removeUser(userId);          mStrongAuth.removeUser(userId); +        AndroidKeyStoreMaintenance.onUserRemoved(userId);          final KeyStore ks = KeyStore.getInstance();          ks.onUserRemoved(userId);          mManagedProfilePasswordCache.removePassword(userId); diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java index 6d420a95e26c..35e6489debcf 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java @@ -18,7 +18,6 @@ package com.android.server.locksettings;  import android.security.keystore.KeyProperties;  import android.security.keystore.KeyProtection; -import android.security.keystore2.AndroidKeyStoreProvider;  import android.util.Slog;  import java.io.ByteArrayOutputStream; @@ -141,19 +140,8 @@ public class SyntheticPasswordCrypto {          }      } -    /** -     * TODO This function redirects keystore access to the legacy keystore during a transitional -     *      phase during which not all calling code has been adjusted to use Keystore 2.0. -     *      This can be reverted to a constant of "AndroidKeyStore" when b/171305684 is complete. -     *      The specific bug for this component is b/171305115. -     */      static String androidKeystoreProviderName() { -        if (AndroidKeyStoreProvider.isInstalled()) { -            return "AndroidKeyStoreLegacy"; -        } else { -            return "AndroidKeystore"; -        } - +        return "AndroidKeyStore";      }      public static byte[] decryptBlob(String keyAlias, byte[] blob, byte[] applicationId) {  |