Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23d97b2e authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Public API to allow creation of SigningInfo.

Bug: 297916136
Test: adb shell device_config put package_manager_service android.content.pm.archiving true && atest PackageManagerTest
Test: adb shell device_config put package_manager_service android.content.pm.archiving false && atest PackageManagerTest
Change-Id: Id0fd1a2bc6c042454a9a6783841bcec7a74c1166
parent 79067094
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -13322,9 +13322,12 @@ package android.content.pm {
  public final class SigningInfo implements android.os.Parcelable {
    ctor public SigningInfo();
    ctor @FlaggedApi("android.content.pm.archiving") public SigningInfo(@IntRange(from=0) int, @Nullable java.util.Collection<android.content.pm.Signature>, @Nullable java.util.Collection<java.security.PublicKey>, @Nullable java.util.Collection<android.content.pm.Signature>);
    ctor public SigningInfo(android.content.pm.SigningInfo);
    method public int describeContents();
    method public android.content.pm.Signature[] getApkContentsSigners();
    method @FlaggedApi("android.content.pm.archiving") @NonNull public java.util.Collection<java.security.PublicKey> getPublicKeys();
    method @FlaggedApi("android.content.pm.archiving") @IntRange(from=0) public int getSchemeVersion();
    method public android.content.pm.Signature[] getSigningCertificateHistory();
    method public boolean hasMultipleSigners();
    method public boolean hasPastSigningCertificates();
+64 −0
Original line number Diff line number Diff line
@@ -16,9 +16,16 @@

package android.content.pm;

import android.annotation.FlaggedApi;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;

import java.security.PublicKey;
import java.util.Collection;

/**
 * Information pertaining to the signing certificates used to sign a package.
@@ -32,6 +39,43 @@ public final class SigningInfo implements Parcelable {
        mSigningDetails = SigningDetails.UNKNOWN;
    }

    /**
     * Creates a new instance of information used to sign the APK.
     *
     * @param schemeVersion version of signing schema.
     * @param apkContentsSigners signing certificates.
     * @param publicKeys for the signing certificates.
     * @param signingCertificateHistory All signing certificates the package has proven it is
     *                                  authorized to use.
     *
     * @see
     * <a href="https://source.android.com/docs/security/features/apksigning#schemes">APK signing
     * schemas</a>
     */
    @FlaggedApi(Flags.FLAG_ARCHIVING)
    public SigningInfo(@IntRange(from = 0) int schemeVersion,
            @Nullable Collection<Signature> apkContentsSigners,
            @Nullable Collection<PublicKey> publicKeys,
            @Nullable Collection<Signature> signingCertificateHistory) {
        if (schemeVersion <= 0 || apkContentsSigners == null) {
            mSigningDetails = SigningDetails.UNKNOWN;
            return;
        }
        Signature[] signatures = apkContentsSigners != null && !apkContentsSigners.isEmpty()
                ? apkContentsSigners.toArray(new Signature[apkContentsSigners.size()])
                : null;
        Signature[] pastSignatures =
                signingCertificateHistory != null && !signingCertificateHistory.isEmpty()
                ? signingCertificateHistory.toArray(new Signature[signingCertificateHistory.size()])
                : null;
        if (Signature.areExactArraysMatch(signatures, pastSignatures)) {
            pastSignatures = null;
        }
        ArraySet<PublicKey> keys =
                publicKeys != null && !publicKeys.isEmpty() ? new ArraySet<>(publicKeys) : null;
        mSigningDetails = new SigningDetails(signatures, schemeVersion, keys, pastSignatures);
    }

    /**
     * @hide only packagemanager should be populating this
     */
@@ -116,6 +160,26 @@ public final class SigningInfo implements Parcelable {
        return mSigningDetails.getSignatures();
    }

    /**
     * Returns the version of signing schema used to sign the APK.
     *
     * @see
     * <a href="https://source.android.com/docs/security/features/apksigning#schemes">APK signing
     * schemas</a>
     */
    @FlaggedApi(Flags.FLAG_ARCHIVING)
    public @IntRange(from = 0) int getSchemeVersion() {
        return mSigningDetails.getSignatureSchemeVersion();
    }

    /**
     * Returns the public keys for the signing certificates.
     */
    @FlaggedApi(Flags.FLAG_ARCHIVING)
    public @NonNull Collection<PublicKey> getPublicKeys() {
        return mSigningDetails.getPublicKeys();
    }

    @Override
    public int describeContents() {
        return 0;