Skip to content

Commit 4972f8e

Browse files
committed
feat: add certificate hashes to AppInfo
1 parent 720a95f commit 4972f8e

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ import android.content.Context
44
import android.content.pm.ApplicationInfo
55
import android.content.pm.PackageInfo
66
import android.content.pm.PackageManager
7+
import android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES
8+
import android.os.Build
79
import android.os.Build.VERSION.SDK_INT
810
import android.os.Build.VERSION_CODES.P
11+
import android.util.Base64
912
import android.util.Log
1013
import java.io.File
14+
import java.security.MessageDigest
1115

1216
class Util {
1317
companion object {
@@ -38,6 +42,7 @@ class Util {
3842
map["is_system_app"] = isSystemApp(packageManager, packageInfo.packageName)
3943
map["is_launchable_app"] =
4044
isLaunchableApp(packageManager, packageInfo.packageName)
45+
map["certificate_hashes"] = getCertificateHashes(packageManager, packageInfo.packageName)
4146
}
4247
} else {
4348
map["name"] = "Unknown"
@@ -75,5 +80,26 @@ class Util {
7580
false
7681
}
7782
}
83+
84+
fun getCertificateHashes(packageManager: PackageManager, packageName: String): List<String> {
85+
val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
86+
val signingInfo = packageInfo.signingInfo
87+
val signatures = if (signingInfo.hasMultipleSigners()) {
88+
signingInfo.apkContentsSigners
89+
} else {
90+
signingInfo.signingCertificateHistory
91+
}
92+
93+
val hashes = signatures.map {
94+
signature -> MessageDigest
95+
.getInstance("SHA-256")
96+
.digest(signature.toByteArray())
97+
.joinToString(":") {
98+
"%02X".format(it)
99+
}
100+
}
101+
102+
return hashes
103+
}
78104
}
79105
}

lib/app_info.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class AppInfo {
1010
final int installedTimestamp;
1111
final bool isSystemApp;
1212
final bool isLaunchableApp;
13+
final List<String> certificateHashes;
1314

1415
const AppInfo({
1516
required this.name,
@@ -21,6 +22,7 @@ class AppInfo {
2122
required this.installedTimestamp,
2223
required this.isSystemApp,
2324
required this.isLaunchableApp,
25+
required this.certificateHashes,
2426
});
2527

2628
factory AppInfo.create(dynamic data) {
@@ -34,6 +36,7 @@ class AppInfo {
3436
installedTimestamp: data["installed_timestamp"] ?? 0,
3537
isSystemApp: data["is_system_app"] ?? false,
3638
isLaunchableApp: data["is_launchable_app"] ?? true,
39+
certificateHashes: data["certificate_hashes"].cast<String>() ?? [],
3740
);
3841
}
3942

0 commit comments

Comments
 (0)