diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 7cc8af7fcab09..9284c388fa27b 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2241,6 +2241,15 @@ public abstract class PackageManager { */ public static final int INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE = -129; + /** + * Installation return code: this is passed in the {@link PackageInstaller#EXTRA_LEGACY_STATUS} + * if the new package declares bad certificate digest for a shared library in the package + * manifest. + * + * @hide + */ + public static final int INSTALL_FAILED_SHARED_LIBRARY_BAD_CERTIFICATE_DIGEST = -130; + /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, @@ -9689,6 +9698,8 @@ public abstract class PackageManager { case INSTALL_FAILED_WRONG_INSTALLED_VERSION: return "INSTALL_FAILED_WRONG_INSTALLED_VERSION"; case INSTALL_FAILED_PROCESS_NOT_DEFINED: return "INSTALL_FAILED_PROCESS_NOT_DEFINED"; case INSTALL_FAILED_SESSION_INVALID: return "INSTALL_FAILED_SESSION_INVALID"; + case INSTALL_FAILED_SHARED_LIBRARY_BAD_CERTIFICATE_DIGEST: + return "INSTALL_FAILED_SHARED_LIBRARY_BAD_CERTIFICATE_DIGEST"; default: return Integer.toString(status); } } diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java index d2ce23efd47c1..99878679431c9 100644 --- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java +++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java @@ -17,6 +17,7 @@ package com.android.server.pm; import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY; +import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_LIBRARY_BAD_CERTIFICATE_DIGEST; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; @@ -1035,8 +1036,17 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable } else { // lib signing cert could have rotated beyond the one expected, check to see // if the new one has been blessed by the old - byte[] digestBytes = HexEncoding.decode( - expectedCertDigests[0], false /* allowSingleChar */); + final byte[] digestBytes; + try { + digestBytes = HexEncoding.decode( + expectedCertDigests[0], false /* allowSingleChar */); + } catch (IllegalArgumentException e) { + throw new PackageManagerException( + INSTALL_FAILED_SHARED_LIBRARY_BAD_CERTIFICATE_DIGEST, + "Package " + packageName + " declares bad certificate digest " + + "for " + libraryType + " library " + libName + + "; failing!"); + } if (!libPkg.hasSha256Certificate(digestBytes)) { throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY, "Package " + packageName + " requires differently signed "