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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user