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

Commit 032e3d00 authored by Winson's avatar Winson Committed by Winson Chiu
Browse files

Add cert digest separator to pm app link output

For easy copy-paste if someone is configuring their server to host an
assetlinks.json.

Bug: 184954099

Test: manual, pm get-app-links on device

Merged-In: I5ed3505d72b5522202743a49559fbf1230b5767e
Change-Id: I5ed3505d72b5522202743a49559fbf1230b5767e
parent e12ebbb9
Loading
Loading
Loading
Loading
+36 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.util;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.Signature;
import android.text.TextUtils;

import libcore.util.HexEncoding;

@@ -38,19 +39,28 @@ public final class PackageUtils {
        /* hide constructor */
    }

    /**
     * @see #computeSignaturesSha256Digests(Signature[], String)
     */
    public static @NonNull String[] computeSignaturesSha256Digests(
            @NonNull Signature[] signatures) {
        return computeSignaturesSha256Digests(signatures, null);
    }

    /**
     * Computes the SHA256 digests of a list of signatures. Items in the
     * resulting array of hashes correspond to the signatures in the
     * input array.
     * @param signatures The signatures.
     * @param separator Separator between each pair of characters, such as a colon, or null to omit.
     * @return The digest array.
     */
    public static @NonNull String[] computeSignaturesSha256Digests(
            @NonNull Signature[] signatures) {
            @NonNull Signature[] signatures, @Nullable String separator) {
        final int signatureCount = signatures.length;
        final String[] digests = new String[signatureCount];
        for (int i = 0; i < signatureCount; i++) {
            digests[i] = computeSha256Digest(signatures[i].toByteArray());
            digests[i] = computeSha256Digest(signatures[i].toByteArray(), separator);
        }
        return digests;
    }
@@ -66,11 +76,11 @@ public final class PackageUtils {
            @NonNull Signature[] signatures) {
        // Shortcut for optimization - most apps singed by a single cert
        if (signatures.length == 1) {
            return computeSha256Digest(signatures[0].toByteArray());
            return computeSha256Digest(signatures[0].toByteArray(), null);
        }

        // Make sure these are sorted to handle reversed certificates
        final String[] sha256Digests = computeSignaturesSha256Digests(signatures);
        final String[] sha256Digests = computeSignaturesSha256Digests(signatures, null);
        return computeSignaturesSha256Digest(sha256Digests);
    }

@@ -99,7 +109,7 @@ public final class PackageUtils {
                /* ignore - can't happen */
            }
        }
        return computeSha256Digest(bytes.toByteArray());
        return computeSha256Digest(bytes.toByteArray(), null);
    }

    /**
@@ -121,16 +131,35 @@ public final class PackageUtils {
        return messageDigest.digest();
    }

    /**
     * @see #computeSha256Digest(byte[], String)
     */
    public static @Nullable String computeSha256Digest(@NonNull byte[] data) {
        return computeSha256Digest(data, null);
    }
    /**
     * Computes the SHA256 digest of some data.
     * @param data The data.
     * @param separator Separator between each pair of characters, such as a colon, or null to omit.
     * @return The digest or null if an error occurs.
     */
    public static @Nullable String computeSha256Digest(@NonNull byte[] data) {
    public static @Nullable String computeSha256Digest(@NonNull byte[] data,
            @Nullable String separator) {
        byte[] sha256DigestBytes = computeSha256DigestBytes(data);
        if (sha256DigestBytes == null) {
            return null;
        }

        if (separator == null) {
            return HexEncoding.encodeToString(sha256DigestBytes, true /* uppercase */);
        }

        int length = sha256DigestBytes.length;
        String[] pieces = new String[length];
        for (int index = 0; index < length; index++) {
            pieces[index] = HexEncoding.encodeToString(sha256DigestBytes[index], true);
        }

        return TextUtils.join(separator, pieces);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ public class DomainVerificationDebug {
                Signature[] signatures = pkg.getSigningDetails().signatures;
                String signaturesDigest = signatures == null ? null : Arrays.toString(
                        PackageUtils.computeSignaturesSha256Digests(
                                pkg.getSigningDetails().signatures));
                                pkg.getSigningDetails().signatures, ":"));

                writer.println(pkgState.getPackageName() + ":");
                writer.increaseIndent();