@@ -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