Skip to content

Commit b0c5675

Browse files
committed
fix apksecurity
1 parent d51609f commit b0c5675

2 files changed

Lines changed: 23 additions & 14 deletions

File tree

‎app/src/main/java/com/mg4/control/update/ApkInstaller.kt‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ object ApkInstaller {
3636
// Contrôle de signature (T-901) mis en commentaire à la demande explicite du
3737
// propriétaire du projet : l'OTA ne pointe que vers son propre dépôt GitHub.
3838
//
39-
// CE QUI RESTE EN PLACE : ApkUrlPolicy (origine https + hôtes autorisés) et le
40-
// contrôle de complétude du téléchargement dans ApkDownloader — c'est ce dernier
41-
// qui traitait réellement la panne du 18/08 (APK tronqué), pas ce bloc-ci.
39+
// CE QUI RESTE EN PLACE : ApkUrlPolicy (origine https + hôtes autorisés).
40+
// NB : ApkDownloader n'a aucun appelant — l'OTA télécharge via le DownloadManager
41+
// d'Android (voir UpdateDialogManager) ; son contrôle de complétude ne protège donc
42+
// pas ce flux. La panne du 18/08 n'était pas un APK tronqué mais une lecture de
43+
// signature d'archive erronée, corrigée dans ApkSecurity.fingerprintsOfArchive.
4244
//
4345
// CE QUI N'EST PLUS COUVERT : un APK servi par un hôte autorisé mais signé par une
4446
// AUTRE clé s'installera désormais sans objection, alors que l'app tourne en

‎app/src/main/java/com/mg4/control/update/ApkSecurity.kt‎

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,17 @@ object ApkSignatureVerifier {
127127

128128
/** Empreintes SHA-256 des certificats signant le fichier APK [apk]. */
129129
private fun fingerprintsOfArchive(context: Context, apk: File): Set<String> = try {
130+
// ⚠️ CAUSE RACINE du « archive=0 cert » observé le 18/08 sur un APK pourtant complet et
131+
// signé v1+v2+v3 : sur API 28, getPackageArchiveInfo() ne renseigne PAS `signingInfo`
132+
// pour une ARCHIVE — seul le champ déprécié `signatures` l'est, et uniquement si
133+
// GET_SIGNATURES est demandé. Ne demander que GET_SIGNING_CERTIFICATES rendait donc
134+
// zéro certificat, alors que la même lecture sur le paquet INSTALLÉ fonctionnait : d'où
135+
// le « archive=0, installee=1 » qui a fait accuser tour à tour la clé puis le réseau.
136+
// On demande les DEUX drapeaux et [signatureDigests] prend celui qui est rempli.
130137
@Suppress("DEPRECATION")
131-
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
132-
PackageManager.GET_SIGNING_CERTIFICATES
133-
else
134-
PackageManager.GET_SIGNATURES
138+
val flags = PackageManager.GET_SIGNATURES or
139+
(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
140+
PackageManager.GET_SIGNING_CERTIFICATES else 0)
135141
val info = context.packageManager.getPackageArchiveInfo(apk.absolutePath, flags)
136142
signatureDigests(info)
137143
} catch (e: Exception) {
@@ -155,14 +161,15 @@ object ApkSignatureVerifier {
155161

156162
private fun signatureDigests(info: android.content.pm.PackageInfo?): Set<String> {
157163
if (info == null) return emptySet()
164+
val moderne = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
165+
info.signingInfo?.let { si ->
166+
if (si.hasMultipleSigners()) si.apkContentsSigners else si.signingCertificateHistory
167+
}
168+
} else null
169+
// Repli volontaire sur l'API dépréciée : pour une archive sur API 28, `signatures` est le
170+
// SEUL champ renseigné. Ne pas « moderniser » ce repli sans l'avoir testé sur véhicule.
158171
@Suppress("DEPRECATION")
159-
val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
160-
val signingInfo = info.signingInfo ?: return emptySet()
161-
if (signingInfo.hasMultipleSigners()) signingInfo.apkContentsSigners
162-
else signingInfo.signingCertificateHistory
163-
} else {
164-
info.signatures
165-
} ?: return emptySet()
172+
val signatures = moderne ?: info.signatures ?: return emptySet()
166173

167174
val md = MessageDigest.getInstance("SHA-256")
168175
return signatures.mapNotNull { sig ->

0 commit comments

Comments
 (0)