summaryrefslogtreecommitdiff
path: root/core/java/android/util/PackageUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/util/PackageUtils.java')
-rw-r--r--core/java/android/util/PackageUtils.java43
1 files changed, 36 insertions, 7 deletions
diff --git a/core/java/android/util/PackageUtils.java b/core/java/android/util/PackageUtils.java
index 8061bf36fa6a..ff04825f788f 100644
--- a/core/java/android/util/PackageUtils.java
+++ b/core/java/android/util/PackageUtils.java
@@ -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;
@@ -39,18 +40,27 @@ public final class PackageUtils {
}
/**
+ * @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 {
}
/**
+ * @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;
}
- 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);
}
}