Skip to content

Commit 02c1d9a

Browse files
committed
Improve readability of singer info
In the What's New dialog, display the subject line along with the first four characters of SHA-256. In the Main page, display signer info in a more readable format. Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
1 parent 3d11bcb commit 02c1d9a

3 files changed

Lines changed: 74 additions & 13 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
package io.github.muntashirakon.AppManager.apk.signing;
4+
5+
import org.bouncycastle.asn1.x500.X500Name;
6+
import org.bouncycastle.asn1.x500.style.BCStyle;
7+
8+
import java.security.cert.X509Certificate;
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
import java.util.regex.Matcher;
12+
import java.util.regex.Pattern;
13+
import java.util.stream.Collectors;
14+
import java.util.stream.Stream;
15+
16+
public final class CertUtils {
17+
public static String getReadableSubject(X509Certificate cert) {
18+
return Stream.of(BCStyle.CN, BCStyle.O, BCStyle.L, BCStyle.ST, BCStyle.C)
19+
.map(oid -> X500Name.getInstance(cert.getSubjectX500Principal().getEncoded()).getRDNs(oid))
20+
.filter(rdns -> rdns.length > 0)
21+
.map(rdns -> rdns[0].getFirst().getValue().toString())
22+
.collect(Collectors.joining(", "));
23+
}
24+
25+
public static String getReadableSubject(String subjectLine) {
26+
Map<String, String> rdnMap = new HashMap<>();
27+
Matcher matcher = Pattern.compile("([^=,]+)=(((?<=\\\\),|[^,])+)").matcher(subjectLine);
28+
while (matcher.find()) {
29+
String key = matcher.group(1).trim().toUpperCase();
30+
String value = matcher.group(2).trim().replaceAll("\\\\,", ",");
31+
rdnMap.put(key, value);
32+
}
33+
34+
return Stream.of("CN", "O", "L", "ST", "C")
35+
.map(rdnMap::get)
36+
.filter(value -> value != null && !value.isEmpty())
37+
.collect(Collectors.joining(", "));
38+
}
39+
}

app/src/main/java/io/github/muntashirakon/AppManager/apk/whatsnew/ApkWhatsNewFinder.java

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212

1313
import androidx.annotation.IntDef;
1414
import androidx.annotation.NonNull;
15+
import androidx.annotation.Nullable;
1516
import androidx.annotation.WorkerThread;
1617
import androidx.core.content.pm.PackageInfoCompat;
1718

1819
import java.lang.annotation.Retention;
1920
import java.lang.annotation.RetentionPolicy;
21+
import java.security.cert.CertificateEncodingException;
22+
import java.security.cert.X509Certificate;
2023
import java.util.ArrayList;
2124
import java.util.Arrays;
2225
import java.util.HashMap;
@@ -25,9 +28,12 @@
2528
import java.util.Set;
2629

2730
import io.github.muntashirakon.AppManager.R;
31+
import io.github.muntashirakon.AppManager.apk.signing.CertUtils;
32+
import io.github.muntashirakon.AppManager.apk.signing.SignerInfo;
2833
import io.github.muntashirakon.AppManager.rules.RuleType;
2934
import io.github.muntashirakon.AppManager.rules.compontents.ComponentUtils;
3035
import io.github.muntashirakon.AppManager.utils.ArrayUtils;
36+
import io.github.muntashirakon.AppManager.utils.DigestUtils;
3137
import io.github.muntashirakon.AppManager.utils.LangUtils;
3238
import io.github.muntashirakon.AppManager.utils.PackageUtils;
3339
import io.github.muntashirakon.AppManager.utils.ThreadUtils;
@@ -48,12 +54,12 @@ public class ApkWhatsNewFinder {
4854
public static final int CHANGE_INFO = 3;
4955

5056
public static final int VERSION_INFO = 0;
51-
public static final int TRACKER_INFO = 1;
52-
public static final int SIGNING_CERT_SHA256 = 2;
53-
public static final int PERMISSION_INFO = 3;
54-
public static final int COMPONENT_INFO = 4;
55-
public static final int FEATURE_INFO = 5;
56-
public static final int SDK_INFO = 6;
57+
public static final int SDK_INFO = 1;
58+
public static final int TRACKER_INFO = 2;
59+
public static final int SIGNING_CERT_SHA256 = 3;
60+
public static final int PERMISSION_INFO = 4;
61+
public static final int COMPONENT_INFO = 5;
62+
public static final int FEATURE_INFO = 6;
5763

5864
private static final int INFO_COUNT = 7;
5965

@@ -129,8 +135,8 @@ public Change[][] getWhatsNew(@NonNull Context context, @NonNull PackageInfo new
129135
return changes;
130136
}
131137
// Sha256 of signing certificates
132-
Set<String> newCertSha256 = new HashSet<>(Arrays.asList(PackageUtils.getSigningCertSha256Checksum(newPkgInfo, true)));
133-
Set<String> oldCertSha256 = new HashSet<>(Arrays.asList(PackageUtils.getSigningCertSha256Checksum(oldPkgInfo)));
138+
Set<String> newCertSha256 = getReadableSignerInfo(PackageUtils.getSignerInfo(newPkgInfo, true));
139+
Set<String> oldCertSha256 = getReadableSignerInfo(PackageUtils.getSignerInfo(oldPkgInfo, false));
134140
List<Change> certSha256Changes = new ArrayList<>();
135141
certSha256Changes.add(new Change(CHANGE_INFO, componentInfo[SIGNING_CERT_SHA256]));
136142
certSha256Changes.addAll(findChanges(newCertSha256, oldCertSha256));
@@ -211,6 +217,25 @@ private List<Change> findChanges(Set<String> newInfo, Set<String> oldInfo) {
211217
return changeList;
212218
}
213219

220+
private Set<String> getReadableSignerInfo(@Nullable SignerInfo signerInfo) {
221+
Set<String> readableSignerInfo = new HashSet<>();
222+
X509Certificate[] x509Certificates = signerInfo == null ? null : signerInfo.getAllSignerCerts();
223+
if (x509Certificates != null) {
224+
for (X509Certificate cert : x509Certificates) {
225+
StringBuilder builder = new StringBuilder();
226+
try {
227+
String sha = DigestUtils.getHexDigest(DigestUtils.SHA_256, cert.getEncoded());
228+
builder.append(sha.substring(0, 4)).append(" - ");
229+
} catch (CertificateEncodingException e) {
230+
throw new RuntimeException(e);
231+
}
232+
builder.append(CertUtils.getReadableSubject(cert));
233+
readableSignerInfo.add(builder.toString());
234+
}
235+
}
236+
return readableSignerInfo;
237+
}
238+
214239
public static class Change {
215240
@ChangeType
216241
public int changeType;

app/src/main/java/io/github/muntashirakon/AppManager/main/ApplicationItem.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
import aosp.libcore.util.EmptyArray;
4747
import io.github.muntashirakon.AppManager.StaticDataset;
48+
import io.github.muntashirakon.AppManager.apk.signing.CertUtils;
4849
import io.github.muntashirakon.AppManager.apk.signing.SignerInfo;
4950
import io.github.muntashirakon.AppManager.backup.BackupUtils;
5051
import io.github.muntashirakon.AppManager.compat.AppOpsManagerCompat;
@@ -250,11 +251,7 @@ public void generateOtherInfo() {
250251
} else uidOrAppIds = "";
251252
// Cert short name
252253
if (sha != null) {
253-
try {
254-
issuerShortName = "CN=" + (sha.first).split("CN=", 2)[1];
255-
} catch (ArrayIndexOutOfBoundsException e) {
256-
issuerShortName = sha.first;
257-
}
254+
issuerShortName = CertUtils.getReadableSubject(sha.first);
258255
if (TextUtils.isEmpty(sha.second)) {
259256
sha = null;
260257
}

0 commit comments

Comments
 (0)