Skip to content

Commit af72ec7

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

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ 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
78
import android.os.Build.VERSION.SDK_INT
89
import android.os.Build.VERSION_CODES.P
10+
import android.util.Base64
911
import android.util.Log
1012
import java.io.File
13+
import java.security.MessageDigest
1114

1215
class Util {
1316
companion object {
@@ -38,6 +41,7 @@ class Util {
3841
map["is_system_app"] = isSystemApp(packageManager, packageInfo.packageName)
3942
map["is_launchable_app"] =
4043
isLaunchableApp(packageManager, packageInfo.packageName)
44+
map["certificate_hashes"] = getCertificateHashes(packageManager, packageInfo.packageName)
4145
}
4246
} else {
4347
map["name"] = "Unknown"
@@ -75,5 +79,26 @@ class Util {
7579
false
7680
}
7781
}
82+
83+
fun getCertificateHashes(packageManager: PackageManager, packageName: String): List<String> {
84+
val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
85+
val signingInfo = packageInfo.signingInfo
86+
val signatures = if (signingInfo.hasMultipleSigners()) {
87+
signingInfo.apkContentsSigners
88+
} else {
89+
signingInfo.signingCertificateHistory
90+
}
91+
92+
val hashes = signatures.map {
93+
signature -> MessageDigest
94+
.getInstance("SHA-256")
95+
.digest(signature.toByteArray())
96+
.joinToString(":") {
97+
"%02X".format(it)
98+
}
99+
}
100+
101+
return hashes
102+
}
78103
}
79-
}
104+
}

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)