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

Commit b406e6b4 authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Android (Google) Code Review
Browse files

Merge "Rollforward: Digest API: allow installer to provide digests for an APK."

parents f902391f d15391e4
Loading
Loading
Loading
Loading
+26 −17
Original line number Diff line number Diff line
@@ -11447,6 +11447,16 @@ package android.content.pm {
    field public final float widthFraction;
  }
  public final class ApkChecksum implements android.os.Parcelable {
    method public int describeContents();
    method public int getKind();
    method @Nullable public java.security.cert.Certificate getSourceCertificate() throws java.security.cert.CertificateException;
    method @Nullable public String getSplitName();
    method @NonNull public byte[] getValue();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.ApkChecksum> CREATOR;
  }
  public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
    ctor public ApplicationInfo();
    ctor public ApplicationInfo(android.content.pm.ApplicationInfo);
@@ -11548,6 +11558,21 @@ package android.content.pm {
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.ChangedPackages> CREATOR;
  }
  public final class Checksum implements android.os.Parcelable {
    method public int describeContents();
    method public int getKind();
    method @NonNull public byte[] getValue();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.Checksum> CREATOR;
    field public static final int PARTIAL_MERKLE_ROOT_1M_SHA256 = 32; // 0x20
    field public static final int PARTIAL_MERKLE_ROOT_1M_SHA512 = 64; // 0x40
    field public static final int WHOLE_MD5 = 2; // 0x2
    field public static final int WHOLE_MERKLE_ROOT_4K_SHA256 = 1; // 0x1
    field public static final int WHOLE_SHA1 = 4; // 0x4
    field public static final int WHOLE_SHA256 = 8; // 0x8
    field public static final int WHOLE_SHA512 = 16; // 0x10
  }
  public class ComponentInfo extends android.content.pm.PackageItemInfo {
    ctor public ComponentInfo();
    ctor public ComponentInfo(android.content.pm.ComponentInfo);
@@ -11619,16 +11644,6 @@ package android.content.pm {
    field public int version;
  }
  public final class FileChecksum implements android.os.Parcelable {
    method public int describeContents();
    method public int getKind();
    method @Nullable public java.security.cert.Certificate getSourceCertificate() throws java.security.cert.CertificateException;
    method @Nullable public String getSplitName();
    method @NonNull public byte[] getValue();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.FileChecksum> CREATOR;
  }
  public final class InstallSourceInfo implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public String getInitiatingPackageName();
@@ -11849,6 +11864,7 @@ package android.content.pm {
  public static class PackageInstaller.Session implements java.io.Closeable {
    method public void abandon();
    method public void addChecksums(@NonNull String, @NonNull java.util.List<android.content.pm.Checksum>) throws java.io.IOException;
    method public void addChildSessionId(int);
    method public void close();
    method public void commit(@NonNull android.content.IntentSender);
@@ -12250,8 +12266,6 @@ package android.content.pm {
    field public static final int MATCH_SYSTEM_ONLY = 1048576; // 0x100000
    field public static final int MATCH_UNINSTALLED_PACKAGES = 8192; // 0x2000
    field public static final long MAXIMUM_VERIFICATION_TIMEOUT = 3600000L; // 0x36ee80L
    field public static final int PARTIAL_MERKLE_ROOT_1M_SHA256 = 32; // 0x20
    field public static final int PARTIAL_MERKLE_ROOT_1M_SHA512 = 64; // 0x40
    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
    field public static final int PERMISSION_GRANTED = 0; // 0x0
    field public static final int SIGNATURE_FIRST_NOT_SIGNED = -1; // 0xffffffff
@@ -12266,11 +12280,6 @@ package android.content.pm {
    field public static final int VERIFICATION_ALLOW = 1; // 0x1
    field public static final int VERIFICATION_REJECT = -1; // 0xffffffff
    field public static final int VERSION_CODE_HIGHEST = -1; // 0xffffffff
    field public static final int WHOLE_MD5 = 2; // 0x2
    field public static final int WHOLE_MERKLE_ROOT_4K_SHA256 = 1; // 0x1
    field public static final int WHOLE_SHA1 = 4; // 0x4
    field public static final int WHOLE_SHA256 = 8; // 0x8
    field public static final int WHOLE_SHA512 = 16; // 0x10
  }
  public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
+10 −1
Original line number Diff line number Diff line
@@ -16,6 +16,14 @@

package android.app;

import static android.content.pm.Checksum.PARTIAL_MERKLE_ROOT_1M_SHA256;
import static android.content.pm.Checksum.PARTIAL_MERKLE_ROOT_1M_SHA512;
import static android.content.pm.Checksum.WHOLE_MD5;
import static android.content.pm.Checksum.WHOLE_MERKLE_ROOT_4K_SHA256;
import static android.content.pm.Checksum.WHOLE_SHA1;
import static android.content.pm.Checksum.WHOLE_SHA256;
import static android.content.pm.Checksum.WHOLE_SHA512;

import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -32,6 +40,7 @@ import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ChangedPackages;
import android.content.pm.Checksum;
import android.content.pm.ComponentInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDataObserver;
@@ -973,7 +982,7 @@ public class ApplicationPackageManager extends PackageManager {

    @Override
    public void getChecksums(@NonNull String packageName, boolean includeSplits,
            @FileChecksumKind int required, @Nullable List<Certificate> trustedInstallers,
            @Checksum.Kind int required, @Nullable List<Certificate> trustedInstallers,
            @NonNull IntentSender statusReceiver)
            throws CertificateEncodingException, IOException, NameNotFoundException {
        Objects.requireNonNull(packageName);
+1 −1
Original line number Diff line number Diff line
@@ -16,5 +16,5 @@

package android.content.pm;

parcelable FileChecksum;
parcelable ApkChecksum;
+58 −65
Original line number Diff line number Diff line
@@ -34,51 +34,71 @@ import java.security.cert.X509Certificate;
import java.util.List;

/**
 * A typed checksum.
 * A typed checksum of an APK.
 *
 * @see PackageManager#getChecksums(String, boolean, int, List, IntentSender)
 */
@DataClass(genHiddenConstructor = true)
public final class FileChecksum implements Parcelable {
@DataClass.Suppress({"getChecksum"})
public final class ApkChecksum implements Parcelable {
    /**
     * Checksum for which split. Null indicates base.apk.
     */
    private final @Nullable String mSplitName;
    /**
     * Checksum kind.
     * Checksum.
     */
    private final @PackageManager.FileChecksumKind int mKind;
    /**
     * Checksum value.
     */
    private final @NonNull byte[] mValue;
    private final @NonNull Checksum mChecksum;
    /**
     * For Installer-provided checksums, certificate of the Installer/AppStore.
     */
    private final @Nullable byte[] mSourceCertificate;

    /**
     * Constructor, internal use only
     * Constructor, internal use only.
     *
     * @hide
     */
    public FileChecksum(@Nullable String splitName, @PackageManager.FileChecksumKind int kind,
    public ApkChecksum(@Nullable String splitName, @Checksum.Kind int kind,
            @NonNull byte[] value) {
        this(splitName, kind, value, (byte[]) null);
        this(splitName, new Checksum(kind, value), (byte[]) null);
    }

    /**
     * Constructor, internal use only
     * Constructor, internal use only.
     *
     * @hide
     */
    public FileChecksum(@Nullable String splitName, @PackageManager.FileChecksumKind int kind,
    public ApkChecksum(@Nullable String splitName, @Checksum.Kind int kind,
            @NonNull byte[] value, @Nullable Certificate sourceCertificate)
            throws CertificateEncodingException {
        this(splitName, kind, value,
        this(splitName, new Checksum(kind, value),
                (sourceCertificate != null) ? sourceCertificate.getEncoded() : null);
    }


    /**
     * Checksum kind.
     */
    public @Checksum.Kind int getKind() {
        return mChecksum.getKind();
    }

    /**
     * Checksum value.
     */
    public @NonNull byte[] getValue() {
        return mChecksum.getValue();
    }

    /**
     * Returns raw bytes representing encoded certificate of the source of this checksum.
     * @hide
     */
    public @Nullable byte[] getSourceCertificateBytes() {
        return mSourceCertificate;
    }

    /**
     * Certificate of the source of this checksum.
     * @throws CertificateException in case when certificate can't be re-created from serialized
@@ -102,7 +122,7 @@ public final class FileChecksum implements Parcelable {
    // CHECKSTYLE:OFF Generated code
    //
    // To regenerate run:
    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/FileChecksum.java
    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/ApkChecksum.java
    //
    // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
    //   Settings > Editor > Code Style > Formatter Control
@@ -110,31 +130,25 @@ public final class FileChecksum implements Parcelable {


    /**
     * Creates a new FileChecksum.
     * Creates a new ApkChecksum.
     *
     * @param splitName
     *   Checksum for which split. Null indicates base.apk.
     * @param kind
     *   Checksum kind.
     * @param value
     *   Checksum value.
     * @param checksum
     *   Checksum.
     * @param sourceCertificate
     *   For Installer-provided checksums, certificate of the Installer/AppStore.
     * @hide
     */
    @DataClass.Generated.Member
    public FileChecksum(
    public ApkChecksum(
            @Nullable String splitName,
            @PackageManager.FileChecksumKind int kind,
            @NonNull byte[] value,
            @NonNull Checksum checksum,
            @Nullable byte[] sourceCertificate) {
        this.mSplitName = splitName;
        this.mKind = kind;
        com.android.internal.util.AnnotationValidations.validate(
                PackageManager.FileChecksumKind.class, null, mKind);
        this.mValue = value;
        this.mChecksum = checksum;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mValue);
                NonNull.class, null, mChecksum);
        this.mSourceCertificate = sourceCertificate;

        // onConstructed(); // You can define this method to get a callback
@@ -148,22 +162,6 @@ public final class FileChecksum implements Parcelable {
        return mSplitName;
    }

    /**
     * Checksum kind.
     */
    @DataClass.Generated.Member
    public @PackageManager.FileChecksumKind int getKind() {
        return mKind;
    }

    /**
     * Checksum value.
     */
    @DataClass.Generated.Member
    public @NonNull byte[] getValue() {
        return mValue;
    }

    @Override
    @DataClass.Generated.Member
    public void writeToParcel(@NonNull Parcel dest, int flags) {
@@ -172,11 +170,10 @@ public final class FileChecksum implements Parcelable {

        byte flg = 0;
        if (mSplitName != null) flg |= 0x1;
        if (mSourceCertificate != null) flg |= 0x8;
        if (mSourceCertificate != null) flg |= 0x4;
        dest.writeByte(flg);
        if (mSplitName != null) dest.writeString(mSplitName);
        dest.writeInt(mKind);
        dest.writeByteArray(mValue);
        dest.writeTypedObject(mChecksum, flags);
        if (mSourceCertificate != null) dest.writeByteArray(mSourceCertificate);
    }

@@ -187,47 +184,43 @@ public final class FileChecksum implements Parcelable {
    /** @hide */
    @SuppressWarnings({"unchecked", "RedundantCast"})
    @DataClass.Generated.Member
    /* package-private */ FileChecksum(@NonNull Parcel in) {
    /* package-private */ ApkChecksum(@NonNull Parcel in) {
        // You can override field unparcelling by defining methods like:
        // static FieldType unparcelFieldName(Parcel in) { ... }

        byte flg = in.readByte();
        String splitName = (flg & 0x1) == 0 ? null : in.readString();
        int kind = in.readInt();
        byte[] value = in.createByteArray();
        byte[] sourceCertificate = (flg & 0x8) == 0 ? null : in.createByteArray();
        Checksum checksum = (Checksum) in.readTypedObject(Checksum.CREATOR);
        byte[] sourceCertificate = (flg & 0x4) == 0 ? null : in.createByteArray();

        this.mSplitName = splitName;
        this.mKind = kind;
        com.android.internal.util.AnnotationValidations.validate(
                PackageManager.FileChecksumKind.class, null, mKind);
        this.mValue = value;
        this.mChecksum = checksum;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mValue);
                NonNull.class, null, mChecksum);
        this.mSourceCertificate = sourceCertificate;

        // onConstructed(); // You can define this method to get a callback
    }

    @DataClass.Generated.Member
    public static final @NonNull Parcelable.Creator<FileChecksum> CREATOR
            = new Parcelable.Creator<FileChecksum>() {
    public static final @NonNull Parcelable.Creator<ApkChecksum> CREATOR
            = new Parcelable.Creator<ApkChecksum>() {
        @Override
        public FileChecksum[] newArray(int size) {
            return new FileChecksum[size];
        public ApkChecksum[] newArray(int size) {
            return new ApkChecksum[size];
        }

        @Override
        public FileChecksum createFromParcel(@NonNull Parcel in) {
            return new FileChecksum(in);
        public ApkChecksum createFromParcel(@NonNull Parcel in) {
            return new ApkChecksum(in);
        }
    };

    @DataClass.Generated(
            time = 1598322801861L,
            time = 1599845645160L,
            codegenVersion = "1.0.15",
            sourceFile = "frameworks/base/core/java/android/content/pm/FileChecksum.java",
            inputSignatures = "private final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.content.pm.PackageManager.FileChecksumKind int mKind\nprivate final @android.annotation.NonNull byte[] mValue\nprivate final @android.annotation.Nullable byte[] mSourceCertificate\npublic @android.annotation.Nullable java.security.cert.Certificate getSourceCertificate()\nclass FileChecksum extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstructor=true)")
            sourceFile = "frameworks/base/core/java/android/content/pm/ApkChecksum.java",
            inputSignatures = "private final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.NonNull android.content.pm.Checksum mChecksum\nprivate final @android.annotation.Nullable byte[] mSourceCertificate\npublic @android.content.pm.Checksum.Kind int getKind()\npublic @android.annotation.NonNull byte[] getValue()\npublic @android.annotation.Nullable byte[] getSourceCertificateBytes()\npublic @android.annotation.Nullable java.security.cert.Certificate getSourceCertificate()\nclass ApkChecksum extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstructor=true)")
    @Deprecated
    private void __metadata() {}

+20 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.content.pm;

parcelable Checksum;
Loading