mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-04-16 11:21:24 +00:00
Remove test key
This commit is contained in:
parent
c4f37c550f
commit
f0fbd9214a
@ -82,7 +82,7 @@ object HideAPK {
|
|||||||
|
|
||||||
// Write apk changes
|
// Write apk changes
|
||||||
jar.getOutputStream(je).use { it.write(xml.bytes) }
|
jar.getOutputStream(je).use { it.write(xml.bytes) }
|
||||||
val keys = Keygen(context)
|
val keys = Keygen()
|
||||||
SignApk.sign(keys.cert, keys.key, jar, out)
|
SignApk.sign(keys.cert, keys.key, jar, out)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -104,6 +104,7 @@ object HideAPK {
|
|||||||
activity.finish()
|
activity.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("BlockingMethodInNonBlockingContext")
|
||||||
private suspend fun patchAndHide(activity: Activity, label: String, onFailure: Runnable): Boolean {
|
private suspend fun patchAndHide(activity: Activity, label: String, onFailure: Runnable): Boolean {
|
||||||
val stub = File(activity.cacheDir, "stub.apk")
|
val stub = File(activity.cacheDir, "stub.apk")
|
||||||
try {
|
try {
|
||||||
@ -130,7 +131,7 @@ object HideAPK {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val cmd = "adb_pm_install $repack ${activity.applicationInfo.uid}"
|
val cmd = "adb_pm_install $repack ${activity.applicationInfo.uid}"
|
||||||
if (Shell.su(cmd).exec().isSuccess) return true
|
if (Shell.cmd(cmd).exec().isSuccess) return true
|
||||||
|
|
||||||
try {
|
try {
|
||||||
session.install(activity, repack)
|
session.install(activity, repack)
|
||||||
@ -178,7 +179,7 @@ object HideAPK {
|
|||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
}
|
}
|
||||||
val cmd = "adb_pm_install $apk ${activity.applicationInfo.uid}"
|
val cmd = "adb_pm_install $apk ${activity.applicationInfo.uid}"
|
||||||
if (Shell.su(cmd).await().isSuccess) return
|
if (Shell.cmd(cmd).await().isSuccess) return
|
||||||
val success = withContext(Dispatchers.IO) {
|
val success = withContext(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
session.install(activity, apk)
|
session.install(activity, apk)
|
||||||
|
@ -1,23 +1,16 @@
|
|||||||
package com.topjohnwu.magisk.core.utils
|
package com.topjohnwu.magisk.core.utils
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.pm.PackageManager
|
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.util.Base64OutputStream
|
import android.util.Base64OutputStream
|
||||||
import com.topjohnwu.magisk.core.Config
|
import com.topjohnwu.magisk.core.Config
|
||||||
import com.topjohnwu.magisk.signing.CryptoUtils.readCertificate
|
|
||||||
import com.topjohnwu.magisk.signing.CryptoUtils.readPrivateKey
|
|
||||||
import com.topjohnwu.magisk.signing.KeyData
|
|
||||||
import org.bouncycastle.asn1.x500.X500Name
|
import org.bouncycastle.asn1.x500.X500Name
|
||||||
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter
|
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter
|
||||||
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder
|
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder
|
||||||
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder
|
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder
|
||||||
import java.io.ByteArrayInputStream
|
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.security.KeyPairGenerator
|
import java.security.KeyPairGenerator
|
||||||
import java.security.KeyStore
|
import java.security.KeyStore
|
||||||
import java.security.MessageDigest
|
|
||||||
import java.security.PrivateKey
|
import java.security.PrivateKey
|
||||||
import java.security.cert.X509Certificate
|
import java.security.cert.X509Certificate
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -29,13 +22,11 @@ private interface CertKeyProvider {
|
|||||||
val key: PrivateKey
|
val key: PrivateKey
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
class Keygen : CertKeyProvider {
|
||||||
class Keygen(context: Context) : CertKeyProvider {
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val ALIAS = "magisk"
|
private const val ALIAS = "magisk"
|
||||||
private val PASSWORD get() = "magisk".toCharArray()
|
private val PASSWORD get() = "magisk".toCharArray()
|
||||||
private const val TESTKEY_CERT = "61ed377e85d386a8dfee6b864bd85b0bfaa5af81"
|
|
||||||
private const val DNAME = "C=US,ST=California,L=Mountain View,O=Google Inc.,OU=Android,CN=Android"
|
private const val DNAME = "C=US,ST=California,L=Mountain View,O=Google Inc.,OU=Android,CN=Android"
|
||||||
private const val BASE64_FLAG = Base64.NO_PADDING or Base64.NO_WRAP
|
private const val BASE64_FLAG = Base64.NO_PADDING or Base64.NO_WRAP
|
||||||
}
|
}
|
||||||
@ -43,49 +34,9 @@ class Keygen(context: Context) : CertKeyProvider {
|
|||||||
private val start = Calendar.getInstance().apply { add(Calendar.MONTH, -3) }
|
private val start = Calendar.getInstance().apply { add(Calendar.MONTH, -3) }
|
||||||
private val end = (start.clone() as Calendar).apply { add(Calendar.YEAR, 30) }
|
private val end = (start.clone() as Calendar).apply { add(Calendar.YEAR, 30) }
|
||||||
|
|
||||||
override val cert get() = provider.cert
|
private val ks = init()
|
||||||
override val key get() = provider.key
|
override val cert = ks.getCertificate(ALIAS) as X509Certificate
|
||||||
|
override val key = ks.getKey(ALIAS, PASSWORD) as PrivateKey
|
||||||
private val provider: CertKeyProvider
|
|
||||||
|
|
||||||
inner class KeyStoreProvider :
|
|
||||||
CertKeyProvider {
|
|
||||||
private val ks by lazy { init() }
|
|
||||||
override val cert by lazy { ks.getCertificate(ALIAS) as X509Certificate }
|
|
||||||
override val key by lazy { ks.getKey(
|
|
||||||
ALIAS,
|
|
||||||
PASSWORD
|
|
||||||
) as PrivateKey }
|
|
||||||
}
|
|
||||||
|
|
||||||
class TestProvider : CertKeyProvider {
|
|
||||||
override val cert by lazy {
|
|
||||||
readCertificate(ByteArrayInputStream(KeyData.testCert()))
|
|
||||||
}
|
|
||||||
override val key by lazy {
|
|
||||||
readPrivateKey(ByteArrayInputStream(KeyData.testKey()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
val pm = context.packageManager
|
|
||||||
val info = pm.getPackageInfo(context.packageName, PackageManager.GET_SIGNATURES)
|
|
||||||
val sig = info.signatures[0]
|
|
||||||
val digest = MessageDigest.getInstance("SHA1")
|
|
||||||
val chksum = digest.digest(sig.toByteArray())
|
|
||||||
|
|
||||||
val sb = StringBuilder()
|
|
||||||
for (b in chksum) {
|
|
||||||
sb.append("%02x".format(0xFF and b.toInt()))
|
|
||||||
}
|
|
||||||
|
|
||||||
provider = if (sb.toString() == TESTKEY_CERT) {
|
|
||||||
// The app was signed by the test key, continue to use it (legacy mode)
|
|
||||||
TestProvider()
|
|
||||||
} else {
|
|
||||||
KeyStoreProvider()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun init(): KeyStore {
|
private fun init(): KeyStore {
|
||||||
val raw = Config.keyStoreRaw
|
val raw = Config.keyStoreRaw
|
||||||
@ -93,12 +44,8 @@ class Keygen(context: Context) : CertKeyProvider {
|
|||||||
if (raw.isEmpty()) {
|
if (raw.isEmpty()) {
|
||||||
ks.load(null)
|
ks.load(null)
|
||||||
} else {
|
} else {
|
||||||
GZIPInputStream(Base64.decode(raw,
|
GZIPInputStream(Base64.decode(raw, BASE64_FLAG).inputStream()).use {
|
||||||
BASE64_FLAG
|
ks.load(it, PASSWORD)
|
||||||
).inputStream()).use {
|
|
||||||
ks.load(it,
|
|
||||||
PASSWORD
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,16 +62,10 @@ class Keygen(context: Context) : CertKeyProvider {
|
|||||||
val cert = JcaX509CertificateConverter().getCertificate(builder.build(signer))
|
val cert = JcaX509CertificateConverter().getCertificate(builder.build(signer))
|
||||||
|
|
||||||
// Store them into keystore
|
// Store them into keystore
|
||||||
ks.setKeyEntry(
|
ks.setKeyEntry(ALIAS, kp.private, PASSWORD, arrayOf(cert))
|
||||||
ALIAS, kp.private,
|
|
||||||
PASSWORD, arrayOf(cert))
|
|
||||||
val bytes = ByteArrayOutputStream()
|
val bytes = ByteArrayOutputStream()
|
||||||
GZIPOutputStream(Base64OutputStream(bytes,
|
GZIPOutputStream(Base64OutputStream(bytes, BASE64_FLAG)).use {
|
||||||
BASE64_FLAG
|
ks.store(it, PASSWORD)
|
||||||
)).use {
|
|
||||||
ks.store(it,
|
|
||||||
PASSWORD
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
Config.keyStoreRaw = bytes.toString("UTF-8")
|
Config.keyStoreRaw = bytes.toString("UTF-8")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user