Loading src/com/android/settings/CryptKeeperConfirm.java +7 −1 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; import com.android.settings.core.InstrumentedFragment; import java.util.Arrays; import java.util.Locale; public class CryptKeeperConfirm extends InstrumentedFragment { Loading Loading @@ -87,7 +88,12 @@ public class CryptKeeperConfirm extends InstrumentedFragment { IStorageManager storageManager = IStorageManager.Stub.asInterface(service); try { Bundle args = getIntent().getExtras(); storageManager.encryptStorage(args.getInt("type", -1), args.getString("password")); // TODO(b/120484642): Update vold to accept a password as a byte array byte[] passwordBytes = args.getByteArray("password"); String password = passwordBytes != null ? new String(passwordBytes) : null; Arrays.fill(passwordBytes, (byte) 0); storageManager.encryptStorage(args.getInt("type", -1), password); } catch (Exception e) { Log.e("CryptKeeper", "Error while encrypting...", e); } Loading src/com/android/settings/password/ChooseLockGeneric.java +10 −7 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedPreference; import java.util.Arrays; import java.util.List; public class ChooseLockGeneric extends SettingsActivity { Loading Loading @@ -144,7 +145,7 @@ public class ChooseLockGeneric extends SettingsActivity { private int mEncryptionRequestQuality; private boolean mEncryptionRequestDisabled; private boolean mForChangeCredRequiredForBoot = false; private String mUserPassword; private byte[] mUserPassword; private LockPatternUtils mLockPatternUtils; private FingerprintManager mFingerprintManager; private int mUserId; Loading Loading @@ -184,7 +185,7 @@ public class ChooseLockGeneric extends SettingsActivity { .getBooleanExtra(CONFIRM_CREDENTIALS, true); if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { mPasswordConfirmed = !confirmCredentials; mUserPassword = getActivity().getIntent().getStringExtra( mUserPassword = getActivity().getIntent().getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); Loading @@ -206,7 +207,7 @@ public class ChooseLockGeneric extends SettingsActivity { mEncryptionRequestDisabled = savedInstanceState.getBoolean( ENCRYPT_REQUESTED_DISABLED); if (mUserPassword == null) { mUserPassword = savedInstanceState.getString( mUserPassword = savedInstanceState.getByteArray( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } } Loading Loading @@ -351,10 +352,12 @@ public class ChooseLockGeneric extends SettingsActivity { mWaitingForConfirmation = false; if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { mPasswordConfirmed = true; mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mUserPassword = data != null ? data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD) : null; updatePreferencesOrFinish(false /* isRecreatingActivity */); if (mForChangeCredRequiredForBoot) { if (!TextUtils.isEmpty(mUserPassword)) { if (!(mUserPassword == null || mUserPassword.length == 0)) { maybeEnableEncryption( mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId), false); } else { Loading Loading @@ -414,7 +417,7 @@ public class ChooseLockGeneric extends SettingsActivity { outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality); outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); if (mUserPassword != null) { outState.putString(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword); outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword); } } Loading Loading @@ -590,7 +593,7 @@ public class ChooseLockGeneric extends SettingsActivity { setPreferenceSummary(ScreenLockType.MANAGED, R.string.secure_lock_encryption_warning); } protected Intent getLockManagedPasswordIntent(String password) { protected Intent getLockManagedPasswordIntent(byte[] password) { return mManagedPasswordProvider.createIntent(false, password); } Loading src/com/android/settings/password/ChooseLockPassword.java +49 −28 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ import com.android.settings.widget.ImeAwareEditText; import com.android.setupwizardlib.GlifLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ChooseLockPassword extends SettingsActivity { Loading Loading @@ -130,7 +131,7 @@ public class ChooseLockPassword extends SettingsActivity { return this; } public IntentBuilder setPassword(String password) { public IntentBuilder setPassword(byte[] password) { mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); return this; } Loading Loading @@ -176,8 +177,8 @@ public class ChooseLockPassword extends SettingsActivity { private static final String KEY_CURRENT_PASSWORD = "current_password"; private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; private String mCurrentPassword; private String mChosenPassword; private byte[] mCurrentPassword; private byte[] mChosenPassword; private boolean mHasChallenge; private long mChallenge; private ImeAwareEditText mPasswordEntry; Loading Loading @@ -208,7 +209,7 @@ public class ChooseLockPassword extends SettingsActivity { private GlifLayout mLayout; protected boolean mForFingerprint; private String mFirstPin; private byte[] mFirstPin; private RecyclerView mPasswordRestrictionView; protected boolean mIsAlphaMode; protected Button mSkipButton; Loading @@ -228,7 +229,7 @@ public class ChooseLockPassword extends SettingsActivity { private static final int MIN_NUMBER_IN_PASSWORD = 4; private static final int MIN_NON_LETTER_IN_PASSWORD = 5; // Error code returned from {@link #validatePassword(String)}. // Error code returned from {@link #validatePassword(byte[])}. static final int NO_ERROR = 0; static final int CONTAIN_INVALID_CHARACTERS = 1 << 0; static final int TOO_SHORT = 1 << 1; Loading Loading @@ -350,12 +351,13 @@ public class ChooseLockPassword extends SettingsActivity { SaveAndFinishWorker w = new SaveAndFinishWorker(); final boolean required = getActivity().getIntent().getBooleanExtra( EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); String current = intent.getStringExtra( byte[] currentBytes = intent.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); w.setBlocking(true); w.setListener(this); w.start(mChooseLockSettingsHelper.utils(), required, false, 0, current, current, mRequestedQuality, mUserId); w.start(mChooseLockSettingsHelper.utils(), required, false, 0, currentBytes, currentBytes, mRequestedQuality, mUserId); } mTextChangedHandler = new TextChangedHandler(); } Loading Loading @@ -416,7 +418,8 @@ public class ChooseLockPassword extends SettingsActivity { Intent intent = getActivity().getIntent(); final boolean confirmCredentials = intent.getBooleanExtra( ChooseLockGeneric.CONFIRM_CREDENTIALS, true); mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mCurrentPassword = intent.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mHasChallenge = intent.getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); Loading @@ -428,8 +431,9 @@ public class ChooseLockPassword extends SettingsActivity { mUserId); } } else { // restore from previous state mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN); mFirstPin = savedInstanceState.getByteArray(KEY_FIRST_PIN); final String state = savedInstanceState.getString(KEY_UI_STAGE); if (state != null) { mUiStage = Stage.valueOf(state); Loading @@ -437,7 +441,7 @@ public class ChooseLockPassword extends SettingsActivity { } if (mCurrentPassword == null) { mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD); mCurrentPassword = savedInstanceState.getByteArray(KEY_CURRENT_PASSWORD); } // Re-attach to the exiting worker if there is one. Loading Loading @@ -536,8 +540,8 @@ public class ChooseLockPassword extends SettingsActivity { public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(KEY_UI_STAGE, mUiStage.name()); outState.putString(KEY_FIRST_PIN, mFirstPin); outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword); outState.putByteArray(KEY_FIRST_PIN, mFirstPin); outState.putByteArray(KEY_CURRENT_PASSWORD, mCurrentPassword); } @Override Loading @@ -550,7 +554,7 @@ public class ChooseLockPassword extends SettingsActivity { getActivity().setResult(RESULT_FINISHED); getActivity().finish(); } else { mCurrentPassword = data.getStringExtra( mCurrentPassword = data.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } break; Loading Loading @@ -641,22 +645,22 @@ public class ChooseLockPassword extends SettingsActivity { * @param password the raw password the user typed in * @return the validation result. */ private int validatePassword(String password) { int validatePassword(byte[] password) { int errorCode = NO_ERROR; final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password); if (password.length() < mPasswordMinLength) { if (password == null || password.length < mPasswordMinLength) { if (mPasswordMinLength > mPasswordMinLengthToFulfillAllPolicies) { errorCode |= TOO_SHORT; } } else if (password.length() > mPasswordMaxLength) { } else if (password.length > mPasswordMaxLength) { errorCode |= TOO_LONG; } else { // The length requirements are fulfilled. final int dpmQuality = mLockPatternUtils.getRequestedPasswordQuality(mUserId); if (dpmQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX && metrics.numeric == password.length()) { metrics.numeric == password.length) { // Check for repeated characters or sequences (e.g. '1234', '0000', '2468') // if DevicePolicyManager requires a complex numeric password. There can be // two cases in the UI: 1. User chooses to enroll a PIN, 2. User chooses to Loading @@ -675,8 +679,8 @@ public class ChooseLockPassword extends SettingsActivity { } // Allow non-control Latin-1 characters only. for (int i = 0; i < password.length(); i++) { char c = password.charAt(i); for (int i = 0; i < password.length; i++) { char c = (char) password[i]; if (c < 32 || c > 127) { errorCode |= CONTAIN_INVALID_CHARACTERS; break; Loading Loading @@ -746,8 +750,9 @@ public class ChooseLockPassword extends SettingsActivity { public void handleNext() { if (mSaveAndFinishWorker != null) return; mChosenPassword = mPasswordEntry.getText().toString(); if (TextUtils.isEmpty(mChosenPassword)) { // TODO(b/120484642): This is a point of entry for passwords from the UI mChosenPassword = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText()); if (mChosenPassword == null || mChosenPassword.length == 0) { return; } if (mUiStage == Stage.Introduction) { Loading @@ -755,9 +760,11 @@ public class ChooseLockPassword extends SettingsActivity { mFirstPin = mChosenPassword; mPasswordEntry.setText(""); updateStage(Stage.NeedToConfirm); } else { Arrays.fill(mChosenPassword, (byte) 0); } } else if (mUiStage == Stage.NeedToConfirm) { if (mFirstPin.equals(mChosenPassword)) { if (Arrays.equals(mFirstPin, mChosenPassword)) { startSaveAndFinish(); } else { CharSequence tmp = mPasswordEntry.getText(); Loading @@ -765,6 +772,7 @@ public class ChooseLockPassword extends SettingsActivity { Selection.setSelection((Spannable) tmp, 0, tmp.length()); } updateStage(Stage.ConfirmWrong); Arrays.fill(mChosenPassword, (byte) 0); } } } Loading Loading @@ -875,8 +883,8 @@ public class ChooseLockPassword extends SettingsActivity { */ protected void updateUi() { final boolean canInput = mSaveAndFinishWorker == null; String password = mPasswordEntry.getText().toString(); final int length = password.length(); byte[] password = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText()); final int length = password.length; if (mUiStage == Stage.Introduction) { mPasswordRestrictionView.setVisibility(View.VISIBLE); final int errorCode = validatePassword(password); Loading Loading @@ -904,6 +912,7 @@ public class ChooseLockPassword extends SettingsActivity { setNextText(mUiStage.buttonText); mPasswordEntryInputDisabler.setInputEnabled(canInput); Arrays.fill(password, (byte) 0); } private int toVisibility(boolean visibleOrGone) { Loading Loading @@ -962,6 +971,18 @@ public class ChooseLockPassword extends SettingsActivity { public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { getActivity().setResult(RESULT_FINISHED, resultData); if (mChosenPassword != null) { Arrays.fill(mChosenPassword, (byte) 0); } if (mCurrentPassword != null) { Arrays.fill(mCurrentPassword, (byte) 0); } if (mFirstPin != null) { Arrays.fill(mFirstPin, (byte) 0); } mPasswordEntry.setText(""); if (!wasSecureBefore) { Intent intent = getRedactionInterstitialIntent(getActivity()); if (intent != null) { Loading Loading @@ -999,13 +1020,13 @@ public class ChooseLockPassword extends SettingsActivity { public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { private String mChosenPassword; private String mCurrentPassword; private byte[] mChosenPassword; private byte[] mCurrentPassword; private int mRequestedQuality; public void start(LockPatternUtils utils, boolean required, boolean hasChallenge, long challenge, String chosenPassword, String currentPassword, int requestedQuality, int userId) { byte[] chosenPassword, byte[] currentPassword, int requestedQuality, int userId) { prepare(utils, required, hasChallenge, challenge, userId); mChosenPassword = chosenPassword; Loading src/com/android/settings/password/ChooseLockPattern.java +21 −16 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import com.android.setupwizardlib.GlifLayout; import com.google.android.collect.Lists; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; Loading Loading @@ -111,7 +112,7 @@ public class ChooseLockPattern extends SettingsActivity { return this; } public IntentBuilder setPattern(String pattern) { public IntentBuilder setPattern(byte[] pattern) { mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern); return this; } Loading Loading @@ -170,7 +171,7 @@ public class ChooseLockPattern extends SettingsActivity { private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; private String mCurrentPattern; private byte[] mCurrentPattern; private boolean mHasChallenge; private long mChallenge; protected TextView mTitleText; Loading Loading @@ -208,7 +209,7 @@ public class ChooseLockPattern extends SettingsActivity { getActivity().setResult(RESULT_FINISHED); getActivity().finish(); } else { mCurrentPattern = data.getStringExtra( mCurrentPattern = data.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } Loading Loading @@ -441,12 +442,12 @@ public class ChooseLockPattern extends SettingsActivity { SaveAndFinishWorker w = new SaveAndFinishWorker(); final boolean required = getActivity().getIntent().getBooleanExtra( EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); String current = intent.getStringExtra( byte[] current = intent.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); w.setBlocking(true); w.setListener(this); w.start(mChooseLockSettingsHelper.utils(), required, false, 0, LockPatternUtils.stringToPattern(current), current, mUserId); false, 0, LockPatternUtils.byteArrayToPattern(current), current, mUserId); } mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); mForFingerprint = intent.getBooleanExtra( Loading Loading @@ -507,7 +508,8 @@ public class ChooseLockPattern extends SettingsActivity { final boolean confirmCredentials = getActivity().getIntent() .getBooleanExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, true); Intent intent = getActivity().getIntent(); mCurrentPattern = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mCurrentPattern = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mHasChallenge = intent.getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); Loading @@ -530,13 +532,13 @@ public class ChooseLockPattern extends SettingsActivity { } } else { // restore from previous state final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE); if (patternString != null) { mChosenPattern = LockPatternUtils.stringToPattern(patternString); final byte[] pattern = savedInstanceState.getByteArray(KEY_PATTERN_CHOICE); if (pattern != null) { mChosenPattern = LockPatternUtils.byteArrayToPattern(pattern); } if (mCurrentPattern == null) { mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN); mCurrentPattern = savedInstanceState.getByteArray(KEY_CURRENT_PATTERN); } updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]); Loading Loading @@ -632,13 +634,12 @@ public class ChooseLockPattern extends SettingsActivity { outState.putInt(KEY_UI_STAGE, mUiStage.ordinal()); if (mChosenPattern != null) { outState.putString(KEY_PATTERN_CHOICE, LockPatternUtils.patternToString(mChosenPattern)); outState.putByteArray(KEY_PATTERN_CHOICE, LockPatternUtils.patternToByteArray(mChosenPattern)); } if (mCurrentPattern != null) { outState.putString(KEY_CURRENT_PATTERN, mCurrentPattern); outState.putByteArray(KEY_CURRENT_PATTERN, mCurrentPattern); } } Loading Loading @@ -784,6 +785,10 @@ public class ChooseLockPattern extends SettingsActivity { public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { getActivity().setResult(RESULT_FINISHED, resultData); if (mCurrentPattern != null) { Arrays.fill(mCurrentPattern, (byte) 0); } if (!wasSecureBefore) { Intent intent = getRedactionInterstitialIntent(getActivity()); if (intent != null) { Loading @@ -798,12 +803,12 @@ public class ChooseLockPattern extends SettingsActivity { public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { private List<LockPatternView.Cell> mChosenPattern; private String mCurrentPattern; private byte[] mCurrentPattern; private boolean mLockVirgin; public void start(LockPatternUtils utils, boolean credentialRequired, boolean hasChallenge, long challenge, List<LockPatternView.Cell> chosenPattern, String currentPattern, int userId) { List<LockPatternView.Cell> chosenPattern, byte[] currentPattern, int userId) { prepare(utils, credentialRequired, hasChallenge, challenge, userId); mCurrentPattern = currentPattern; Loading src/com/android/settings/password/ConfirmLockPassword.java +5 −4 Original line number Diff line number Diff line Loading @@ -332,8 +332,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { return; } final String pin = mPasswordEntry.getText().toString(); if (TextUtils.isEmpty(pin)) { // TODO(b/120484642): This is a point of entry for passwords from the UI final byte[] pin = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText()); if (pin == null || pin.length == 0) { return; } Loading @@ -359,7 +360,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { return getActivity() instanceof ConfirmLockPassword.InternalActivity; } private void startVerifyPassword(final String pin, final Intent intent) { private void startVerifyPassword(final byte[] pin, final Intent intent) { long challenge = getActivity().getIntent().getLongExtra( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); final int localEffectiveUserId = mEffectiveUserId; Loading Loading @@ -390,7 +391,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { onVerifyCallback); } private void startCheckPassword(final String pin, final Intent intent) { private void startCheckPassword(final byte[] pin, final Intent intent) { final int localEffectiveUserId = mEffectiveUserId; mPendingLockCheck = LockPatternChecker.checkPassword( mLockPatternUtils, Loading Loading
src/com/android/settings/CryptKeeperConfirm.java +7 −1 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; import com.android.settings.core.InstrumentedFragment; import java.util.Arrays; import java.util.Locale; public class CryptKeeperConfirm extends InstrumentedFragment { Loading Loading @@ -87,7 +88,12 @@ public class CryptKeeperConfirm extends InstrumentedFragment { IStorageManager storageManager = IStorageManager.Stub.asInterface(service); try { Bundle args = getIntent().getExtras(); storageManager.encryptStorage(args.getInt("type", -1), args.getString("password")); // TODO(b/120484642): Update vold to accept a password as a byte array byte[] passwordBytes = args.getByteArray("password"); String password = passwordBytes != null ? new String(passwordBytes) : null; Arrays.fill(passwordBytes, (byte) 0); storageManager.encryptStorage(args.getInt("type", -1), password); } catch (Exception e) { Log.e("CryptKeeper", "Error while encrypting...", e); } Loading
src/com/android/settings/password/ChooseLockGeneric.java +10 −7 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedPreference; import java.util.Arrays; import java.util.List; public class ChooseLockGeneric extends SettingsActivity { Loading Loading @@ -144,7 +145,7 @@ public class ChooseLockGeneric extends SettingsActivity { private int mEncryptionRequestQuality; private boolean mEncryptionRequestDisabled; private boolean mForChangeCredRequiredForBoot = false; private String mUserPassword; private byte[] mUserPassword; private LockPatternUtils mLockPatternUtils; private FingerprintManager mFingerprintManager; private int mUserId; Loading Loading @@ -184,7 +185,7 @@ public class ChooseLockGeneric extends SettingsActivity { .getBooleanExtra(CONFIRM_CREDENTIALS, true); if (getActivity() instanceof ChooseLockGeneric.InternalActivity) { mPasswordConfirmed = !confirmCredentials; mUserPassword = getActivity().getIntent().getStringExtra( mUserPassword = getActivity().getIntent().getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); Loading @@ -206,7 +207,7 @@ public class ChooseLockGeneric extends SettingsActivity { mEncryptionRequestDisabled = savedInstanceState.getBoolean( ENCRYPT_REQUESTED_DISABLED); if (mUserPassword == null) { mUserPassword = savedInstanceState.getString( mUserPassword = savedInstanceState.getByteArray( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } } Loading Loading @@ -351,10 +352,12 @@ public class ChooseLockGeneric extends SettingsActivity { mWaitingForConfirmation = false; if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { mPasswordConfirmed = true; mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mUserPassword = data != null ? data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD) : null; updatePreferencesOrFinish(false /* isRecreatingActivity */); if (mForChangeCredRequiredForBoot) { if (!TextUtils.isEmpty(mUserPassword)) { if (!(mUserPassword == null || mUserPassword.length == 0)) { maybeEnableEncryption( mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId), false); } else { Loading Loading @@ -414,7 +417,7 @@ public class ChooseLockGeneric extends SettingsActivity { outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality); outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); if (mUserPassword != null) { outState.putString(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword); outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword); } } Loading Loading @@ -590,7 +593,7 @@ public class ChooseLockGeneric extends SettingsActivity { setPreferenceSummary(ScreenLockType.MANAGED, R.string.secure_lock_encryption_warning); } protected Intent getLockManagedPasswordIntent(String password) { protected Intent getLockManagedPasswordIntent(byte[] password) { return mManagedPasswordProvider.createIntent(false, password); } Loading
src/com/android/settings/password/ChooseLockPassword.java +49 −28 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ import com.android.settings.widget.ImeAwareEditText; import com.android.setupwizardlib.GlifLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ChooseLockPassword extends SettingsActivity { Loading Loading @@ -130,7 +131,7 @@ public class ChooseLockPassword extends SettingsActivity { return this; } public IntentBuilder setPassword(String password) { public IntentBuilder setPassword(byte[] password) { mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); return this; } Loading Loading @@ -176,8 +177,8 @@ public class ChooseLockPassword extends SettingsActivity { private static final String KEY_CURRENT_PASSWORD = "current_password"; private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; private String mCurrentPassword; private String mChosenPassword; private byte[] mCurrentPassword; private byte[] mChosenPassword; private boolean mHasChallenge; private long mChallenge; private ImeAwareEditText mPasswordEntry; Loading Loading @@ -208,7 +209,7 @@ public class ChooseLockPassword extends SettingsActivity { private GlifLayout mLayout; protected boolean mForFingerprint; private String mFirstPin; private byte[] mFirstPin; private RecyclerView mPasswordRestrictionView; protected boolean mIsAlphaMode; protected Button mSkipButton; Loading @@ -228,7 +229,7 @@ public class ChooseLockPassword extends SettingsActivity { private static final int MIN_NUMBER_IN_PASSWORD = 4; private static final int MIN_NON_LETTER_IN_PASSWORD = 5; // Error code returned from {@link #validatePassword(String)}. // Error code returned from {@link #validatePassword(byte[])}. static final int NO_ERROR = 0; static final int CONTAIN_INVALID_CHARACTERS = 1 << 0; static final int TOO_SHORT = 1 << 1; Loading Loading @@ -350,12 +351,13 @@ public class ChooseLockPassword extends SettingsActivity { SaveAndFinishWorker w = new SaveAndFinishWorker(); final boolean required = getActivity().getIntent().getBooleanExtra( EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); String current = intent.getStringExtra( byte[] currentBytes = intent.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); w.setBlocking(true); w.setListener(this); w.start(mChooseLockSettingsHelper.utils(), required, false, 0, current, current, mRequestedQuality, mUserId); w.start(mChooseLockSettingsHelper.utils(), required, false, 0, currentBytes, currentBytes, mRequestedQuality, mUserId); } mTextChangedHandler = new TextChangedHandler(); } Loading Loading @@ -416,7 +418,8 @@ public class ChooseLockPassword extends SettingsActivity { Intent intent = getActivity().getIntent(); final boolean confirmCredentials = intent.getBooleanExtra( ChooseLockGeneric.CONFIRM_CREDENTIALS, true); mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mCurrentPassword = intent.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mHasChallenge = intent.getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); Loading @@ -428,8 +431,9 @@ public class ChooseLockPassword extends SettingsActivity { mUserId); } } else { // restore from previous state mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN); mFirstPin = savedInstanceState.getByteArray(KEY_FIRST_PIN); final String state = savedInstanceState.getString(KEY_UI_STAGE); if (state != null) { mUiStage = Stage.valueOf(state); Loading @@ -437,7 +441,7 @@ public class ChooseLockPassword extends SettingsActivity { } if (mCurrentPassword == null) { mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD); mCurrentPassword = savedInstanceState.getByteArray(KEY_CURRENT_PASSWORD); } // Re-attach to the exiting worker if there is one. Loading Loading @@ -536,8 +540,8 @@ public class ChooseLockPassword extends SettingsActivity { public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(KEY_UI_STAGE, mUiStage.name()); outState.putString(KEY_FIRST_PIN, mFirstPin); outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword); outState.putByteArray(KEY_FIRST_PIN, mFirstPin); outState.putByteArray(KEY_CURRENT_PASSWORD, mCurrentPassword); } @Override Loading @@ -550,7 +554,7 @@ public class ChooseLockPassword extends SettingsActivity { getActivity().setResult(RESULT_FINISHED); getActivity().finish(); } else { mCurrentPassword = data.getStringExtra( mCurrentPassword = data.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } break; Loading Loading @@ -641,22 +645,22 @@ public class ChooseLockPassword extends SettingsActivity { * @param password the raw password the user typed in * @return the validation result. */ private int validatePassword(String password) { int validatePassword(byte[] password) { int errorCode = NO_ERROR; final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password); if (password.length() < mPasswordMinLength) { if (password == null || password.length < mPasswordMinLength) { if (mPasswordMinLength > mPasswordMinLengthToFulfillAllPolicies) { errorCode |= TOO_SHORT; } } else if (password.length() > mPasswordMaxLength) { } else if (password.length > mPasswordMaxLength) { errorCode |= TOO_LONG; } else { // The length requirements are fulfilled. final int dpmQuality = mLockPatternUtils.getRequestedPasswordQuality(mUserId); if (dpmQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX && metrics.numeric == password.length()) { metrics.numeric == password.length) { // Check for repeated characters or sequences (e.g. '1234', '0000', '2468') // if DevicePolicyManager requires a complex numeric password. There can be // two cases in the UI: 1. User chooses to enroll a PIN, 2. User chooses to Loading @@ -675,8 +679,8 @@ public class ChooseLockPassword extends SettingsActivity { } // Allow non-control Latin-1 characters only. for (int i = 0; i < password.length(); i++) { char c = password.charAt(i); for (int i = 0; i < password.length; i++) { char c = (char) password[i]; if (c < 32 || c > 127) { errorCode |= CONTAIN_INVALID_CHARACTERS; break; Loading Loading @@ -746,8 +750,9 @@ public class ChooseLockPassword extends SettingsActivity { public void handleNext() { if (mSaveAndFinishWorker != null) return; mChosenPassword = mPasswordEntry.getText().toString(); if (TextUtils.isEmpty(mChosenPassword)) { // TODO(b/120484642): This is a point of entry for passwords from the UI mChosenPassword = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText()); if (mChosenPassword == null || mChosenPassword.length == 0) { return; } if (mUiStage == Stage.Introduction) { Loading @@ -755,9 +760,11 @@ public class ChooseLockPassword extends SettingsActivity { mFirstPin = mChosenPassword; mPasswordEntry.setText(""); updateStage(Stage.NeedToConfirm); } else { Arrays.fill(mChosenPassword, (byte) 0); } } else if (mUiStage == Stage.NeedToConfirm) { if (mFirstPin.equals(mChosenPassword)) { if (Arrays.equals(mFirstPin, mChosenPassword)) { startSaveAndFinish(); } else { CharSequence tmp = mPasswordEntry.getText(); Loading @@ -765,6 +772,7 @@ public class ChooseLockPassword extends SettingsActivity { Selection.setSelection((Spannable) tmp, 0, tmp.length()); } updateStage(Stage.ConfirmWrong); Arrays.fill(mChosenPassword, (byte) 0); } } } Loading Loading @@ -875,8 +883,8 @@ public class ChooseLockPassword extends SettingsActivity { */ protected void updateUi() { final boolean canInput = mSaveAndFinishWorker == null; String password = mPasswordEntry.getText().toString(); final int length = password.length(); byte[] password = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText()); final int length = password.length; if (mUiStage == Stage.Introduction) { mPasswordRestrictionView.setVisibility(View.VISIBLE); final int errorCode = validatePassword(password); Loading Loading @@ -904,6 +912,7 @@ public class ChooseLockPassword extends SettingsActivity { setNextText(mUiStage.buttonText); mPasswordEntryInputDisabler.setInputEnabled(canInput); Arrays.fill(password, (byte) 0); } private int toVisibility(boolean visibleOrGone) { Loading Loading @@ -962,6 +971,18 @@ public class ChooseLockPassword extends SettingsActivity { public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { getActivity().setResult(RESULT_FINISHED, resultData); if (mChosenPassword != null) { Arrays.fill(mChosenPassword, (byte) 0); } if (mCurrentPassword != null) { Arrays.fill(mCurrentPassword, (byte) 0); } if (mFirstPin != null) { Arrays.fill(mFirstPin, (byte) 0); } mPasswordEntry.setText(""); if (!wasSecureBefore) { Intent intent = getRedactionInterstitialIntent(getActivity()); if (intent != null) { Loading Loading @@ -999,13 +1020,13 @@ public class ChooseLockPassword extends SettingsActivity { public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { private String mChosenPassword; private String mCurrentPassword; private byte[] mChosenPassword; private byte[] mCurrentPassword; private int mRequestedQuality; public void start(LockPatternUtils utils, boolean required, boolean hasChallenge, long challenge, String chosenPassword, String currentPassword, int requestedQuality, int userId) { byte[] chosenPassword, byte[] currentPassword, int requestedQuality, int userId) { prepare(utils, required, hasChallenge, challenge, userId); mChosenPassword = chosenPassword; Loading
src/com/android/settings/password/ChooseLockPattern.java +21 −16 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import com.android.setupwizardlib.GlifLayout; import com.google.android.collect.Lists; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; Loading Loading @@ -111,7 +112,7 @@ public class ChooseLockPattern extends SettingsActivity { return this; } public IntentBuilder setPattern(String pattern) { public IntentBuilder setPattern(byte[] pattern) { mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern); return this; } Loading Loading @@ -170,7 +171,7 @@ public class ChooseLockPattern extends SettingsActivity { private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; private String mCurrentPattern; private byte[] mCurrentPattern; private boolean mHasChallenge; private long mChallenge; protected TextView mTitleText; Loading Loading @@ -208,7 +209,7 @@ public class ChooseLockPattern extends SettingsActivity { getActivity().setResult(RESULT_FINISHED); getActivity().finish(); } else { mCurrentPattern = data.getStringExtra( mCurrentPattern = data.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); } Loading Loading @@ -441,12 +442,12 @@ public class ChooseLockPattern extends SettingsActivity { SaveAndFinishWorker w = new SaveAndFinishWorker(); final boolean required = getActivity().getIntent().getBooleanExtra( EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); String current = intent.getStringExtra( byte[] current = intent.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); w.setBlocking(true); w.setListener(this); w.start(mChooseLockSettingsHelper.utils(), required, false, 0, LockPatternUtils.stringToPattern(current), current, mUserId); false, 0, LockPatternUtils.byteArrayToPattern(current), current, mUserId); } mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); mForFingerprint = intent.getBooleanExtra( Loading Loading @@ -507,7 +508,8 @@ public class ChooseLockPattern extends SettingsActivity { final boolean confirmCredentials = getActivity().getIntent() .getBooleanExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, true); Intent intent = getActivity().getIntent(); mCurrentPattern = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mCurrentPattern = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); mHasChallenge = intent.getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); Loading @@ -530,13 +532,13 @@ public class ChooseLockPattern extends SettingsActivity { } } else { // restore from previous state final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE); if (patternString != null) { mChosenPattern = LockPatternUtils.stringToPattern(patternString); final byte[] pattern = savedInstanceState.getByteArray(KEY_PATTERN_CHOICE); if (pattern != null) { mChosenPattern = LockPatternUtils.byteArrayToPattern(pattern); } if (mCurrentPattern == null) { mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN); mCurrentPattern = savedInstanceState.getByteArray(KEY_CURRENT_PATTERN); } updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]); Loading Loading @@ -632,13 +634,12 @@ public class ChooseLockPattern extends SettingsActivity { outState.putInt(KEY_UI_STAGE, mUiStage.ordinal()); if (mChosenPattern != null) { outState.putString(KEY_PATTERN_CHOICE, LockPatternUtils.patternToString(mChosenPattern)); outState.putByteArray(KEY_PATTERN_CHOICE, LockPatternUtils.patternToByteArray(mChosenPattern)); } if (mCurrentPattern != null) { outState.putString(KEY_CURRENT_PATTERN, mCurrentPattern); outState.putByteArray(KEY_CURRENT_PATTERN, mCurrentPattern); } } Loading Loading @@ -784,6 +785,10 @@ public class ChooseLockPattern extends SettingsActivity { public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { getActivity().setResult(RESULT_FINISHED, resultData); if (mCurrentPattern != null) { Arrays.fill(mCurrentPattern, (byte) 0); } if (!wasSecureBefore) { Intent intent = getRedactionInterstitialIntent(getActivity()); if (intent != null) { Loading @@ -798,12 +803,12 @@ public class ChooseLockPattern extends SettingsActivity { public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { private List<LockPatternView.Cell> mChosenPattern; private String mCurrentPattern; private byte[] mCurrentPattern; private boolean mLockVirgin; public void start(LockPatternUtils utils, boolean credentialRequired, boolean hasChallenge, long challenge, List<LockPatternView.Cell> chosenPattern, String currentPattern, int userId) { List<LockPatternView.Cell> chosenPattern, byte[] currentPattern, int userId) { prepare(utils, credentialRequired, hasChallenge, challenge, userId); mCurrentPattern = currentPattern; Loading
src/com/android/settings/password/ConfirmLockPassword.java +5 −4 Original line number Diff line number Diff line Loading @@ -332,8 +332,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { return; } final String pin = mPasswordEntry.getText().toString(); if (TextUtils.isEmpty(pin)) { // TODO(b/120484642): This is a point of entry for passwords from the UI final byte[] pin = LockPatternUtils.charSequenceToByteArray(mPasswordEntry.getText()); if (pin == null || pin.length == 0) { return; } Loading @@ -359,7 +360,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { return getActivity() instanceof ConfirmLockPassword.InternalActivity; } private void startVerifyPassword(final String pin, final Intent intent) { private void startVerifyPassword(final byte[] pin, final Intent intent) { long challenge = getActivity().getIntent().getLongExtra( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); final int localEffectiveUserId = mEffectiveUserId; Loading Loading @@ -390,7 +391,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { onVerifyCallback); } private void startCheckPassword(final String pin, final Intent intent) { private void startCheckPassword(final byte[] pin, final Intent intent) { final int localEffectiveUserId = mEffectiveUserId; mPendingLockCheck = LockPatternChecker.checkPassword( mLockPatternUtils, Loading