From c9fcc0f0f81cb71cd91a3133f0ae824ad53ba82a Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Mon, 27 Nov 2023 08:56:49 +0530 Subject: [PATCH] Improve signature check --- .../koitharu/kotatsu/core/os/AppValidator.kt | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt index da18d57a4..035d46313 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/os/AppValidator.kt @@ -1,16 +1,9 @@ package org.koitharu.kotatsu.core.os -import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager +import androidx.core.content.pm.PackageInfoCompat import dagger.hilt.android.qualifiers.ApplicationContext -import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug -import org.koitharu.kotatsu.parsers.util.byte2HexFormatted -import java.io.ByteArrayInputStream -import java.io.InputStream -import java.security.MessageDigest -import java.security.cert.CertificateFactory -import java.security.cert.X509Certificate import javax.inject.Inject import javax.inject.Singleton @@ -18,29 +11,13 @@ import javax.inject.Singleton class AppValidator @Inject constructor( @ApplicationContext private val context: Context, ) { - + @Suppress("NewApi") val isOriginalApp by lazy { - getCertificateSHA1Fingerprint() == CERT_SHA1 + val certificates = mapOf(CERT_SHA256.toByteArray() to PackageManager.CERT_INPUT_SHA256) + PackageInfoCompat.hasSignatures(context.packageManager, context.packageName, certificates, false) } - @Suppress("DEPRECATION") - @SuppressLint("PackageManagerGetSignatures") - private fun getCertificateSHA1Fingerprint(): String? = runCatching { - val packageInfo = context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_SIGNATURES) - val signatures = requireNotNull(packageInfo?.signatures) - val cert: ByteArray = signatures.first().toByteArray() - val input: InputStream = ByteArrayInputStream(cert) - val cf = CertificateFactory.getInstance("X509") - val c = cf.generateCertificate(input) as X509Certificate - val md: MessageDigest = MessageDigest.getInstance("SHA1") - val publicKey: ByteArray = md.digest(c.encoded) - return publicKey.byte2HexFormatted() - }.onFailure { error -> - error.printStackTraceDebug() - }.getOrNull() - private companion object { - - private const val CERT_SHA1 = "2C:19:C7:E8:07:61:2B:8E:94:51:1B:FD:72:67:07:64:5D:C2:58:AE" + private const val CERT_SHA256 = "67e15100bb809301783edcb6348fa3bbf83034d91e62868a91053dbd70db3f18" } }