From d6e4c0ee702465d262e05718006dfab41533ff31 Mon Sep 17 00:00:00 2001 From: Him188 <Him188@mamoe.net> Date: Mon, 6 Jan 2020 21:49:29 +0800 Subject: [PATCH] Fix missing params --- .../network/packet/login/PasswordSubmission.kt | 4 ++-- .../src/jvmTest/kotlin/PacketDebugger.kt | 5 +---- .../net.mamoe.mirai/utils/cryptor/Decrypters.kt | 5 ++++- .../kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt | 14 ++++++-------- .../kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt | 6 +++--- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt index c6ea1822d..e635ae10d 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt @@ -27,7 +27,7 @@ internal inline class PrivateKey(override val value: ByteArray) : DecrypterByteA internal inline class SubmitPasswordResponseDecrypter(private val privateKey: PrivateKey) : Decrypter { override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket { - var decrypted = ShareKey.decrypt(input) + var decrypted = ShareKey.decrypt(input, offset, length) (decrypted.remaining).let { if (it.toInt() % 8 == 0 && it >= 16) { decrypted = try { @@ -263,7 +263,7 @@ internal object SubmitPasswordPacket : PacketFactory<SubmitPasswordPacket.LoginR } internal inline class SessionResponseDecryptionKey(private val delegate: IoBuffer) : Decrypter { - override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket = input.decryptBy(delegate) + override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket = input.decryptBy(delegate, offset, length) override fun toString(): String = "SessionResponseDecryptionKey" diff --git a/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt b/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt index 823b491ec..85097b2c4 100644 --- a/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt +++ b/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt @@ -24,10 +24,7 @@ import net.mamoe.mirai.timpc.network.packet.login.CaptchaKey import net.mamoe.mirai.timpc.network.packet.login.HeartbeatPacket import net.mamoe.mirai.timpc.network.packet.login.ShareKey import net.mamoe.mirai.timpc.network.packet.login.TouchKey -import net.mamoe.mirai.utils.cryptor.Decrypter -import net.mamoe.mirai.utils.cryptor.DecryptionFailedException -import net.mamoe.mirai.utils.cryptor.NoDecrypter -import net.mamoe.mirai.utils.cryptor.decryptBy +import net.mamoe.mirai.utils.cryptor.* import net.mamoe.mirai.utils.io.* import org.pcap4j.core.BpfProgram.BpfCompileMode import org.pcap4j.core.PacketListener diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt index 630c7b5dc..666fd6450 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt @@ -45,11 +45,14 @@ object NoDecrypter : Decrypter, DecrypterType<NoDecrypter> { } } +fun Decrypter.decrypt(input: ByteReadPacket): ByteReadPacket = this.decrypt(input, 0, input.remaining.toInt()) + /** * 解密器 */ interface Decrypter { - fun decrypt(input: ByteReadPacket, offset: Int = 0, length: Int = (input.remaining - offset).toInt()): ByteReadPacket + // do not write with default args. NoSuchMethodError when inline classes override this function + fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket /** * 连接后将会先用 this 解密, 再用 [another] 解密 */ diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt index c08ef64c0..b921fcfbf 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt @@ -94,21 +94,19 @@ fun IoBuffer.decryptBy(key: ByteArray, offset: Int = 0, length: Int = readRemain // region ByteReadPacket extension -fun ByteReadPacket.decryptBy(key: ByteArray, offset: Int = 0, length: Int = key.size - offset): ByteReadPacket = decryptAsByteArray(key) { data -> ByteReadPacket(data, offset, length) } +fun ByteReadPacket.decryptBy(key: ByteArray, offset: Int = 0, length: Int = key.size - offset): ByteReadPacket = decryptAsByteArray(key, offset, length) { data -> ByteReadPacket(data) } -fun ByteReadPacket.decryptBy(key: IoBuffer, offset: Int = 0, length: Int = key.readRemaining - offset): ByteReadPacket = decryptAsByteArray(key) { data -> ByteReadPacket(data, offset, length) } +fun ByteReadPacket.decryptBy(key: IoBuffer, offset: Int = 0, length: Int = key.readRemaining - offset): ByteReadPacket = decryptAsByteArray(key, offset, length) { data -> ByteReadPacket(data) } -inline fun <R> ByteReadPacket.decryptAsByteArray(key: ByteArray, consumer: (ByteArray) -> R): R = +inline fun <R> ByteReadPacket.decryptAsByteArray(key: ByteArray, offset: Int = 0, length: Int = key.size - offset, consumer: (ByteArray) -> R): R = ByteArrayPool.useInstance { - val length = remaining.toInt() - readFully(it, 0, length) + readFully(it, offset, length) consumer(it.decryptBy(key, length)) }.also { close() } -inline fun <R> ByteReadPacket.decryptAsByteArray(key: IoBuffer, consumer: (ByteArray) -> R): R = +inline fun <R> ByteReadPacket.decryptAsByteArray(key: IoBuffer, offset: Int = 0, length: Int = key.readRemaining - offset, consumer: (ByteArray) -> R): R = ByteArrayPool.useInstance { - val length = remaining.toInt() - readFully(it, 0, length) + readFully(it, offset, length) consumer(it.decryptBy(key, length)) }.also { close() } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt index 091b9e543..2704b7a3e 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt @@ -47,7 +47,7 @@ fun BytePacketBuilder.writeShortLVByteArray(byteArray: ByteArray): Int { inline fun BytePacketBuilder.writeIntLVPacket(tag: UByte? = null, lengthOffset: ((Long) -> Long) = {it}, builder: BytePacketBuilder.() -> Unit): Int = BytePacketBuilder().apply(builder).build().use { if (tag != null) writeUByte(tag) - val length = (lengthOffset.invoke(it.remaining) ?: it.remaining).coerceAtMostOrFail(0xFFFFL) + val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFL) writeInt(length.toInt()) writePacket(it) return length.toInt() @@ -56,7 +56,7 @@ inline fun BytePacketBuilder.writeIntLVPacket(tag: UByte? = null, lengthOffset: inline fun BytePacketBuilder.writeShortLVPacket(tag: UByte? = null, lengthOffset: ((Long) -> Long) = {it}, builder: BytePacketBuilder.() -> Unit): Int = BytePacketBuilder().apply(builder).build().use { if (tag != null) writeUByte(tag) - val length = (lengthOffset.invoke(it.remaining) ?: it.remaining).coerceAtMostOrFail(0xFFFFL) + val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFL) writeUShort(length.toUShort()) writePacket(it) return length.toInt() @@ -65,7 +65,7 @@ inline fun BytePacketBuilder.writeShortLVPacket(tag: UByte? = null, lengthOffset inline fun BytePacketBuilder.writeUVarIntLVPacket(tag: UByte? = null, lengthOffset: ((Long) -> Long) = {it}, builder: BytePacketBuilder.() -> Unit) = BytePacketBuilder().apply(builder).build().use { if (tag != null) writeUByte(tag) - writeUVarInt((lengthOffset.invoke(it.remaining) ?: it.remaining).coerceAtMostOrFail(0xFFFFL)) + writeUVarInt(lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFL)) writePacket(it) }