From 883f89e6a9b27a46f2306f004ad119f132761979 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Wed, 12 Feb 2020 09:55:25 -0800 Subject: [PATCH] Resume-on-Reboot: add logs to aid in debugging There are some failures during CTS tests which fail to arm the RebootEscrow HAL, but the reason is unclear due to lack of logging during error cases. This adds the missing error logging for cases that shouldn't happen. It also adds logs for success cases that should only happen once per boot: escrow key restoration per user and escrow key arming per boot. Test: atest CtsAppSecurityHostTestCases:android.appsecurity.cts.ResumeOnRebootHostTests Change-Id: Ia2d015dda3eae3b1bbba2d898a485cd2b174ad1a --- .../locksettings/RebootEscrowManager.java | 15 +++++++------ .../recoverysystem/RecoverySystemService.java | 21 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java index e991f96b208fd..c9e356ec14703 100644 --- a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java +++ b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java @@ -150,6 +150,7 @@ class RebootEscrowManager { private RebootEscrowKey getAndClearRebootEscrowKey() { IRebootEscrow rebootEscrow = mInjector.getRebootEscrow(); if (rebootEscrow == null) { + Slog.w(TAG, "Had reboot escrow data for users, but RebootEscrow HAL is unavailable"); return null; } @@ -197,11 +198,12 @@ class RebootEscrowManager { mCallbacks.onRebootEscrowRestored(escrowData.getSpVersion(), escrowData.getSyntheticPassword(), userId); + Slog.i(TAG, "Restored reboot escrow data for user " + userId); return true; } catch (IOException e) { Slog.w(TAG, "Could not load reboot escrow data for user " + userId, e); + return false; } - return false; } void callToRebootEscrowIfNeeded(@UserIdInt int userId, byte spVersion, @@ -212,16 +214,13 @@ class RebootEscrowManager { IRebootEscrow rebootEscrow = mInjector.getRebootEscrow(); if (rebootEscrow == null) { - mRebootEscrowWanted = false; - setRebootEscrowReady(false); + Slog.w(TAG, "Reboot escrow requested, but RebootEscrow HAL is unavailable"); return; } RebootEscrowKey escrowKey = generateEscrowKeyIfNeeded(); if (escrowKey == null) { Slog.e(TAG, "Could not generate escrow key"); - mRebootEscrowWanted = false; - setRebootEscrowReady(false); return; } @@ -250,6 +249,7 @@ class RebootEscrowManager { try { key = RebootEscrowKey.generate(); } catch (IOException e) { + Slog.w(TAG, "Could not generate reboot escrow key"); return null; } @@ -286,6 +286,7 @@ class RebootEscrowManager { IRebootEscrow rebootEscrow = mInjector.getRebootEscrow(); if (rebootEscrow == null) { + Slog.w(TAG, "Escrow marked as ready, but RebootEscrow HAL is unavailable"); return false; } @@ -295,6 +296,7 @@ class RebootEscrowManager { } if (escrowKey == null) { + Slog.e(TAG, "Escrow key is null, but escrow was marked as ready"); return false; } @@ -302,8 +304,9 @@ class RebootEscrowManager { try { rebootEscrow.storeKey(escrowKey.getKeyBytes()); armedRebootEscrow = true; + Slog.i(TAG, "Reboot escrow key stored with RebootEscrow HAL"); } catch (RemoteException e) { - Slog.w(TAG, "Failed escrow secret to RebootEscrow HAL", e); + Slog.e(TAG, "Failed escrow secret to RebootEscrow HAL", e); } return armedRebootEscrow; } diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java index 7164a303121ad..e0701e867cad7 100644 --- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java +++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java @@ -359,20 +359,23 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); if (!mPreparedForReboot) { + Slog.i(TAG, "Reboot requested before prepare completed"); return false; } - if (updateToken != null && updateToken.equals(mUnattendedRebootToken)) { - if (!mInjector.getLockSettingsService().armRebootEscrow()) { - return false; - } - - PowerManager pm = mInjector.getPowerManager(); - pm.reboot(reason); - return true; + if (updateToken != null && !updateToken.equals(mUnattendedRebootToken)) { + Slog.i(TAG, "Reboot requested after preparation, but with mismatching token"); + return false; } - return false; + if (!mInjector.getLockSettingsService().armRebootEscrow()) { + Slog.w(TAG, "Failure to escrow key for reboot"); + return false; + } + + PowerManager pm = mInjector.getPowerManager(); + pm.reboot(reason); + return true; } /**