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
This commit is contained in:
Winson
2021-04-22 11:43:32 -07:00
committed by Winson Chiu
parent e12ebbb9cc
commit 032e3d008e
2 changed files with 39 additions and 10 deletions

View File

@@ -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);
}
/**
@@ -122,15 +132,34 @@ public final class PackageUtils {
}
/**
* Computes the SHA256 digest of some data.
* @param data The data.
* @return The digest or null if an error occurs.
* @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,
@Nullable String separator) {
byte[] sha256DigestBytes = computeSha256DigestBytes(data);
if (sha256DigestBytes == null) {
return null;
}
return HexEncoding.encodeToString(sha256DigestBytes, true /* uppercase */);
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);
}
}

View File

@@ -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();