From d7472d0ff6b2234c2816e2390b0a39337e4fff4c Mon Sep 17 00:00:00 2001 From: Mohammad Samiul Islam Date: Mon, 11 Nov 2019 17:53:47 +0000 Subject: [PATCH] Allow apex packages to be signed with key that has rollback capability When a key is rotated with a new key, it may continue to trust the old one. As such, trusted old key should be able to update. We no longer need to handle "key-downgrade" separately in any situation. An update will be installed iff it is signed by a trusted key (even during Rollbacks/Downgrades). Bug: 136002636 Test: atest StagedInstallTest#testTrustedOldKeyIsAccepted Change-Id: I3455bd00e13a9271fe25cfaac1476ad7e55eb5f3 --- .../com/android/server/pm/StagingManager.java | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 6b4ef698a8f4c..b5da3aa30ba2c 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -113,18 +113,17 @@ public class StagingManager { * Validates the signature used to sign the container of the new apex package * * @param newApexPkg The new apex package that is being installed - * @param installFlags flags related to the session * @throws PackageManagerException */ - private void validateApexSignature(PackageInfo newApexPkg, int installFlags) + private void validateApexSignature(PackageInfo newApexPkg) throws PackageManagerException { // Get signing details of the new package final String apexPath = newApexPkg.applicationInfo.sourceDir; final String packageName = newApexPkg.packageName; - final SigningDetails signingDetails; + final SigningDetails newSigningDetails; try { - signingDetails = ApkSignatureVerifier.verify(apexPath, SignatureSchemeVersion.JAR); + newSigningDetails = ApkSignatureVerifier.verify(apexPath, SignatureSchemeVersion.JAR); } catch (PackageParserException e) { throw new PackageManagerException(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, "Failed to parse APEX package " + apexPath, e); @@ -149,16 +148,10 @@ public class StagingManager { } // Verify signing details for upgrade - if (signingDetails.checkCapability(existingSigningDetails, - PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) { - return; - } - - // Verify signing details for downgrade - // Allow downgrading from B to A iff it is possible to upgrade from A to B - if (existingApexPkg.getLongVersionCode() > newApexPkg.getLongVersionCode() - && existingSigningDetails.checkCapability(signingDetails, - PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) { + if (newSigningDetails.checkCapability(existingSigningDetails, + SigningDetails.CertCapabilities.INSTALLED_DATA) + || existingSigningDetails.checkCapability(newSigningDetails, + SigningDetails.CertCapabilities.ROLLBACK)) { return; } @@ -825,8 +818,7 @@ public class StagingManager { final List apexPackages = submitSessionToApexService(session); for (PackageInfo apexPackage : apexPackages) { - validateApexSignature( - apexPackage, session.params.installFlags); + validateApexSignature(apexPackage); } } catch (PackageManagerException e) { session.setStagedSessionFailed(e.error, e.getMessage());