mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-03 05:34:42 +08:00
Update to 8.4.18
This commit is contained in:
parent
0888cd3f5b
commit
c478f24db0
@ -215,7 +215,7 @@ public open class BotConfiguration { // open for Java
|
||||
/**
|
||||
* Android 手机.
|
||||
*/
|
||||
ANDROID_PHONE(537062845),
|
||||
ANDROID_PHONE(537066439),
|
||||
|
||||
/**
|
||||
* Android 平板.
|
||||
|
@ -29,7 +29,6 @@ import net.mamoe.mirai.internal.utils.cryptor.TEA
|
||||
import net.mamoe.mirai.network.LoginFailedException
|
||||
import net.mamoe.mirai.network.NoServerAvailableException
|
||||
import net.mamoe.mirai.utils.*
|
||||
import kotlin.jvm.Volatile
|
||||
import kotlin.random.Random
|
||||
|
||||
internal val DeviceInfo.guid: ByteArray get() = generateGuid(androidId, macAddress)
|
||||
@ -158,8 +157,8 @@ internal open class QQAndroidClient(
|
||||
|
||||
var openAppId: Long = 715019303L
|
||||
|
||||
val apkVersionName: ByteArray get() = "8.4.8".toByteArray()
|
||||
val buildVer: String get() = "8.4.8.4810" // 8.2.0.1296 // 8.4.8.4810 // 8.2.7.4410
|
||||
val apkVersionName: ByteArray get() = "8.4.18".toByteArray()
|
||||
val buildVer: String get() = "8.4.18.4810" // 8.2.0.1296 // 8.4.8.4810 // 8.2.7.4410
|
||||
|
||||
private val messageSequenceId: AtomicInt = atomic(22911)
|
||||
internal fun atomicNextMessageSequenceId(): Int = messageSequenceId.getAndAdd(2)
|
||||
|
@ -59,7 +59,7 @@ internal class EncryptMethodECDH135(override val ecdh: ECDH) :
|
||||
|
||||
internal class EncryptMethodECDH7(override val ecdh: ECDH) :
|
||||
EncryptMethodECDH {
|
||||
override val id: Int get() = 7
|
||||
override val id: Int get() = 7 // 135
|
||||
}
|
||||
|
||||
internal interface EncryptMethodECDH : EncryptMethod {
|
||||
@ -73,22 +73,30 @@ internal interface EncryptMethodECDH : EncryptMethod {
|
||||
|
||||
val ecdh: ECDH
|
||||
|
||||
override fun makeBody(client: QQAndroidClient, body: BytePacketBuilder.() -> Unit): ByteReadPacket =
|
||||
buildPacket {
|
||||
writeByte(1) // const
|
||||
writeByte(1) // const
|
||||
writeFully(client.randomKey)
|
||||
writeShort(258) // const
|
||||
override fun makeBody(client: QQAndroidClient, body: BytePacketBuilder.() -> Unit): ByteReadPacket = buildPacket {
|
||||
/* //new curve p-256
|
||||
writeByte(2) // const
|
||||
writeByte(1) // const
|
||||
writeFully(client.randomKey)
|
||||
writeShort(0x0131) // const
|
||||
writeShort(0x0001)
|
||||
*/
|
||||
|
||||
if (ecdh.keyPair === ECDHKeyPair.DefaultStub) {
|
||||
writeShortLVByteArray(ECDHKeyPair.DefaultStub.defaultPublicKey)
|
||||
encryptAndWrite(ECDHKeyPair.DefaultStub.defaultShareKey, body)
|
||||
} else {
|
||||
writeShortLVByteArray(ecdh.keyPair.publicKey.getEncoded().drop(23).take(49).toByteArray().also {
|
||||
check(it[0].toInt() == 0x04) { "Bad publicKey generated. Expected first element=0x04, got${it[0]}" }
|
||||
})
|
||||
writeByte(1) // version
|
||||
writeByte(1) // const
|
||||
writeFully(client.randomKey)
|
||||
writeShort(0x0102)
|
||||
|
||||
encryptAndWrite(ecdh.keyPair.initialShareKey, body)
|
||||
}
|
||||
if (ecdh.keyPair === ECDHKeyPair.DefaultStub) {
|
||||
writeShortLVByteArray(ECDHKeyPair.DefaultStub.defaultPublicKey)
|
||||
encryptAndWrite(ECDHKeyPair.DefaultStub.defaultShareKey, body)
|
||||
} else {
|
||||
// for p-256, drop(26). // but not really sure.
|
||||
writeShortLVByteArray(ecdh.keyPair.publicKey.getEncoded().drop(23).toByteArray().also {
|
||||
check(it[0].toInt() == 0x04) { "Bad publicKey generated. Expected first element=0x04, got${it[0]}" }
|
||||
})
|
||||
|
||||
encryptAndWrite(ecdh.keyPair.initialShareKey, body)
|
||||
}
|
||||
}
|
||||
}
|
@ -103,7 +103,7 @@ internal fun BytePacketBuilder.t106(
|
||||
encryptAndWrite(MiraiPlatformUtils.md5(passwordMd5 + ByteArray(4) + (salt.takeIf { it != 0L } ?: uin).toInt().toByteArray())) {
|
||||
writeShort(4)//TGTGTVer
|
||||
writeInt(Random.nextInt())
|
||||
writeInt(5)//ssoVer
|
||||
writeInt(13)//ssoVer
|
||||
writeInt(appId.toInt())
|
||||
writeInt(appClientVersion)
|
||||
|
||||
|
@ -160,7 +160,7 @@ internal class WtLogin {
|
||||
*/
|
||||
t116(client.miscBitMap, client.subSigMap)
|
||||
t100(appId, client.subAppId, client.appClientVersion)
|
||||
t107(0)
|
||||
t107(6)
|
||||
|
||||
// t108(byteArrayOf())
|
||||
// ignored: t104()
|
||||
@ -312,6 +312,7 @@ internal class WtLogin {
|
||||
discardExact(2)
|
||||
val tlvMap: TlvMap = this._readTLVMap()
|
||||
// tlvMap.printTLVMap()
|
||||
tlvMap[0x161]?.let { bot.client.analysisTlv161(it) }
|
||||
return when (type.toInt()) {
|
||||
0 -> onLoginSuccess(tlvMap, bot)
|
||||
2 -> onSolveLoginCaptcha(tlvMap, bot)
|
||||
|
@ -76,13 +76,24 @@ internal expect class ECDH(keyPair: ECDHKeyPair) {
|
||||
@Suppress("FunctionName")
|
||||
internal expect fun ECDH(): ECDH
|
||||
|
||||
// gen by p-256
|
||||
//3059301306072A8648CE3D020106082A8648CE3D03010703420004FA540CB3F755D0A6572338777A4D0BEAFA86664D53040B27331CBF1B7F3C226CE8A1C05EFA9028F85510B103D8175172895C9F9FE4C80A47894BCA2BE569BFCB
|
||||
//3059301306072A8648CE3D020106082A8648CE3D03010703420004949D41D7C14B92F0CB94B6232FB87BA51B0D5AB661FBAF95599A97472FFC4F50BC8CEC5865E79DB3782459A6E9A2298954CD198A25274CEEA8F925342D763D62
|
||||
|
||||
/*
|
||||
// p-256
|
||||
get() = ECDH.constructPublicKey(
|
||||
("3059301306072A8648CE3D020106082A8648CE3D03010703420004" +
|
||||
"EBCA94D733E399B2DB96EACDD3F69A8BB0F74224E2B44E3357812211D2E62EFB" +
|
||||
"C91BB553098E25E33A799ADC7F76FEB208DA7C6522CDB0719A305180CC54A82E"
|
||||
).chunkedHexToBytes()
|
||||
)
|
||||
* */
|
||||
|
||||
|
||||
// this is for old curve
|
||||
internal val initialPublicKey
|
||||
get() = ECDH.constructPublicKey("3046301006072A8648CE3D020106052B8104001F03320004928D8850673088B343264E0C6BACB8496D697799F37211DEB25BB73906CB089FEA9639B4E0260498B51A992D50813DA8".chunkedHexToBytes())
|
||||
private val commonHeadFor02 = "302E301006072A8648CE3D020106052B8104001F031A00".chunkedHexToBytes()
|
||||
private val commonHeadForNot02 = "3046301006072A8648CE3D020106052B8104001F033200".chunkedHexToBytes()
|
||||
private const val constantHead = "3046301006072A8648CE3D020106052B8104001F03320004"
|
||||
private val byteArray_04 = byteArrayOf(0x04)
|
||||
|
||||
|
||||
private val head1 = "302E301006072A8648CE3D020106052B8104001F031A00".chunkedHexToBytes()
|
||||
private val head2 = "3046301006072A8648CE3D020106052B8104001F03320004".chunkedHexToBytes()
|
||||
|
@ -28,8 +28,7 @@ internal actual class ECDHKeyPairImpl(
|
||||
override val privateKey: ECDHPrivateKey get() = delegate.private
|
||||
override val publicKey: ECDHPublicKey get() = delegate.public
|
||||
|
||||
override val initialShareKey: ByteArray =
|
||||
ECDH.calculateShareKey(privateKey, initialPublicKey)
|
||||
override val initialShareKey: ByteArray by lazy { ECDH.calculateShareKey(privateKey, initialPublicKey) }
|
||||
}
|
||||
|
||||
@Suppress("FunctionName")
|
||||
@ -38,6 +37,8 @@ internal actual fun ECDH() =
|
||||
|
||||
internal actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) {
|
||||
actual companion object {
|
||||
private const val curveName = "secp192k1" // p-256
|
||||
|
||||
actual val isECDHAvailable: Boolean
|
||||
|
||||
init {
|
||||
@ -45,7 +46,7 @@ internal actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) {
|
||||
fun testECDH() {
|
||||
ECDHKeyPairImpl(
|
||||
KeyPairGenerator.getInstance("ECDH")
|
||||
.also { it.initialize(ECGenParameterSpec("secp192k1")) }
|
||||
.also { it.initialize(ECGenParameterSpec(curveName)) }
|
||||
.genKeyPair()).let {
|
||||
calculateShareKey(it.privateKey, it.publicKey)
|
||||
}
|
||||
@ -60,6 +61,8 @@ internal actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) {
|
||||
}
|
||||
Security.addProvider(BouncyCastleProvider())
|
||||
testECDH()
|
||||
}.onFailure {
|
||||
it.printStackTrace()
|
||||
}.isSuccess
|
||||
}
|
||||
|
||||
@ -67,9 +70,10 @@ internal actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) {
|
||||
if (!isECDHAvailable) {
|
||||
return ECDHKeyPair.DefaultStub
|
||||
}
|
||||
return ECDHKeyPairImpl(KeyPairGenerator.getInstance("ECDH")
|
||||
.also { it.initialize(ECGenParameterSpec("secp192k1")) }
|
||||
.genKeyPair())
|
||||
return ECDHKeyPairImpl(
|
||||
KeyPairGenerator.getInstance("ECDH")
|
||||
.also { it.initialize(ECGenParameterSpec(curveName)) }
|
||||
.genKeyPair())
|
||||
}
|
||||
|
||||
actual fun calculateShareKey(
|
||||
|
Loading…
Reference in New Issue
Block a user