Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2017 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License |
| 15 | */ |
| 16 | |
Andrew Scull | 507d11c | 2017-05-03 17:19:01 +0100 | [diff] [blame] | 17 | package com.android.server.locksettings; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 18 | |
| 19 | import static org.mockito.Mockito.mock; |
| 20 | |
| 21 | import android.app.IActivityManager; |
| 22 | import android.content.Context; |
Andrew Scull | e6527c1 | 2018-01-05 18:33:58 +0000 | [diff] [blame] | 23 | import android.hardware.authsecret.V1_0.IAuthSecret; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 24 | import android.os.Handler; |
Rubin Xu | 7cf4509 | 2017-08-28 11:47:35 +0100 | [diff] [blame] | 25 | import android.os.Looper; |
Rubin Xu | 3bf722a | 2016-12-15 16:07:38 +0000 | [diff] [blame] | 26 | import android.os.Process; |
| 27 | import android.os.RemoteException; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 28 | import android.os.storage.IStorageManager; |
| 29 | import android.security.KeyStore; |
Rubin Xu | 3bf722a | 2016-12-15 16:07:38 +0000 | [diff] [blame] | 30 | import android.security.keystore.KeyPermanentlyInvalidatedException; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 31 | |
| 32 | import com.android.internal.widget.LockPatternUtils; |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 33 | import com.android.server.locksettings.recoverablekeystore.RecoverableKeyStoreManager; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 34 | |
| 35 | import java.io.FileNotFoundException; |
| 36 | |
| 37 | public class LockSettingsServiceTestable extends LockSettingsService { |
| 38 | |
| 39 | private static class MockInjector extends LockSettingsService.Injector { |
| 40 | |
| 41 | private LockSettingsStorage mLockSettingsStorage; |
| 42 | private KeyStore mKeyStore; |
| 43 | private IActivityManager mActivityManager; |
| 44 | private LockPatternUtils mLockPatternUtils; |
| 45 | private IStorageManager mStorageManager; |
Rubin Xu | 7b7424b | 2017-03-31 18:03:20 +0100 | [diff] [blame] | 46 | private SyntheticPasswordManager mSpManager; |
Andrew Scull | e6527c1 | 2018-01-05 18:33:58 +0000 | [diff] [blame] | 47 | private IAuthSecret mAuthSecretService; |
David Anderson | 6ebc25b | 2019-02-12 16:25:56 -0800 | [diff] [blame] | 48 | private FakeGsiService mGsiService; |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 49 | private RecoverableKeyStoreManager mRecoverableKeyStoreManager; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 50 | |
| 51 | public MockInjector(Context context, LockSettingsStorage storage, KeyStore keyStore, |
| 52 | IActivityManager activityManager, LockPatternUtils lockPatternUtils, |
Andrew Scull | e6527c1 | 2018-01-05 18:33:58 +0000 | [diff] [blame] | 53 | IStorageManager storageManager, SyntheticPasswordManager spManager, |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 54 | IAuthSecret authSecretService, FakeGsiService gsiService, |
| 55 | RecoverableKeyStoreManager recoverableKeyStoreManager) { |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 56 | super(context); |
| 57 | mLockSettingsStorage = storage; |
| 58 | mKeyStore = keyStore; |
| 59 | mActivityManager = activityManager; |
| 60 | mLockPatternUtils = lockPatternUtils; |
| 61 | mStorageManager = storageManager; |
Rubin Xu | 7b7424b | 2017-03-31 18:03:20 +0100 | [diff] [blame] | 62 | mSpManager = spManager; |
David Anderson | 6ebc25b | 2019-02-12 16:25:56 -0800 | [diff] [blame] | 63 | mGsiService = gsiService; |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 64 | mRecoverableKeyStoreManager = recoverableKeyStoreManager; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 65 | } |
| 66 | |
| 67 | @Override |
| 68 | public Handler getHandler() { |
Rubin Xu | 7cf4509 | 2017-08-28 11:47:35 +0100 | [diff] [blame] | 69 | return new Handler(Looper.getMainLooper()); |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | @Override |
| 73 | public LockSettingsStorage getStorage() { |
| 74 | return mLockSettingsStorage; |
| 75 | } |
| 76 | |
| 77 | @Override |
| 78 | public LockSettingsStrongAuth getStrongAuth() { |
| 79 | return mock(LockSettingsStrongAuth.class); |
| 80 | } |
| 81 | |
| 82 | @Override |
| 83 | public SynchronizedStrongAuthTracker getStrongAuthTracker() { |
| 84 | return mock(SynchronizedStrongAuthTracker.class); |
| 85 | } |
| 86 | |
| 87 | @Override |
| 88 | public IActivityManager getActivityManager() { |
| 89 | return mActivityManager; |
| 90 | } |
| 91 | |
| 92 | @Override |
| 93 | public LockPatternUtils getLockPatternUtils() { |
| 94 | return mLockPatternUtils; |
| 95 | } |
| 96 | |
| 97 | @Override |
| 98 | public KeyStore getKeyStore() { |
| 99 | return mKeyStore; |
| 100 | } |
| 101 | |
| 102 | @Override |
| 103 | public IStorageManager getStorageManager() { |
| 104 | return mStorageManager; |
| 105 | } |
Rubin Xu | 3bf722a | 2016-12-15 16:07:38 +0000 | [diff] [blame] | 106 | |
| 107 | @Override |
| 108 | public SyntheticPasswordManager getSyntheticPasswordManager(LockSettingsStorage storage) { |
Rubin Xu | 7b7424b | 2017-03-31 18:03:20 +0100 | [diff] [blame] | 109 | return mSpManager; |
Rubin Xu | 3bf722a | 2016-12-15 16:07:38 +0000 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | @Override |
Kevin Chyn | 71db85f | 2019-05-14 15:32:47 -0700 | [diff] [blame] | 113 | public boolean hasEnrolledBiometrics() { |
Kevin Chyn | cf1a62e | 2019-02-21 11:11:59 -0800 | [diff] [blame] | 114 | return false; |
| 115 | } |
| 116 | |
| 117 | @Override |
Rubin Xu | 3bf722a | 2016-12-15 16:07:38 +0000 | [diff] [blame] | 118 | public int binderGetCallingUid() { |
| 119 | return Process.SYSTEM_UID; |
| 120 | } |
David Anderson | 6ebc25b | 2019-02-12 16:25:56 -0800 | [diff] [blame] | 121 | |
| 122 | @Override |
| 123 | public boolean isGsiRunning() { |
| 124 | return mGsiService.isGsiRunning(); |
| 125 | } |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 126 | |
| 127 | @Override |
| 128 | public RecoverableKeyStoreManager getRecoverableKeyStoreManager(KeyStore keyStore) { |
| 129 | return mRecoverableKeyStoreManager; |
| 130 | } |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | protected LockSettingsServiceTestable(Context context, LockPatternUtils lockPatternUtils, |
Rubin Xu | 16c823e | 2017-06-27 14:44:58 +0100 | [diff] [blame] | 134 | LockSettingsStorage storage, FakeGateKeeperService gatekeeper, KeyStore keystore, |
Rubin Xu | 7b7424b | 2017-03-31 18:03:20 +0100 | [diff] [blame] | 135 | IStorageManager storageManager, IActivityManager mActivityManager, |
David Anderson | 6ebc25b | 2019-02-12 16:25:56 -0800 | [diff] [blame] | 136 | SyntheticPasswordManager spManager, IAuthSecret authSecretService, |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 137 | FakeGsiService gsiService, RecoverableKeyStoreManager recoverableKeyStoreManager) { |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 138 | super(new MockInjector(context, storage, keystore, mActivityManager, lockPatternUtils, |
Annie Meng | 086ddc8 | 2019-03-29 17:43:35 +0000 | [diff] [blame] | 139 | storageManager, spManager, authSecretService, gsiService, |
| 140 | recoverableKeyStoreManager)); |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 141 | mGateKeeperService = gatekeeper; |
Andrew Scull | e6527c1 | 2018-01-05 18:33:58 +0000 | [diff] [blame] | 142 | mAuthSecretService = authSecretService; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 143 | } |
| 144 | |
| 145 | @Override |
Rich Cannings | f64ec63 | 2019-02-21 12:40:36 -0800 | [diff] [blame] | 146 | protected void tieProfileLockToParent(int userId, byte[] password) { |
| 147 | mStorage.writeChildProfileLock(userId, password); |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 148 | } |
| 149 | |
| 150 | @Override |
Rich Cannings | f64ec63 | 2019-02-21 12:40:36 -0800 | [diff] [blame] | 151 | protected byte[] getDecryptedPasswordForTiedProfile(int userId) throws FileNotFoundException, |
Rubin Xu | 7b7424b | 2017-03-31 18:03:20 +0100 | [diff] [blame] | 152 | KeyPermanentlyInvalidatedException { |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 153 | byte[] storedData = mStorage.readChildProfileLock(userId); |
| 154 | if (storedData == null) { |
| 155 | throw new FileNotFoundException("Child profile lock file not found"); |
| 156 | } |
Rubin Xu | 3bf722a | 2016-12-15 16:07:38 +0000 | [diff] [blame] | 157 | try { |
| 158 | if (mGateKeeperService.getSecureUserId(userId) == 0) { |
| 159 | throw new KeyPermanentlyInvalidatedException(); |
| 160 | } |
| 161 | } catch (RemoteException e) { |
| 162 | // shouldn't happen. |
| 163 | } |
Rich Cannings | f64ec63 | 2019-02-21 12:40:36 -0800 | [diff] [blame] | 164 | return storedData; |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 165 | } |
Rubin Xu | 0cbc19e | 2016-12-09 14:00:21 +0000 | [diff] [blame] | 166 | } |