Commit c3ccb0b4 authored by Him188's avatar Him188

Add offset and length params

parent 9bc3d933
...@@ -3,7 +3,10 @@ package net.mamoe.mirai.utils.cryptor ...@@ -3,7 +3,10 @@ package net.mamoe.mirai.utils.cryptor
import kotlinx.io.core.BytePacketBuilder import kotlinx.io.core.BytePacketBuilder
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.IoBuffer import kotlinx.io.core.IoBuffer
import kotlinx.io.pool.useInstance
import net.mamoe.mirai.utils.io.ByteArrayPool
import net.mamoe.mirai.utils.io.encryptAndWrite import net.mamoe.mirai.utils.io.encryptAndWrite
import net.mamoe.mirai.utils.io.toReadPacket
/** /**
...@@ -11,7 +14,7 @@ import net.mamoe.mirai.utils.io.encryptAndWrite ...@@ -11,7 +14,7 @@ import net.mamoe.mirai.utils.io.encryptAndWrite
*/ */
interface DecrypterByteArray : Decrypter { interface DecrypterByteArray : Decrypter {
val value: ByteArray val value: ByteArray
override fun decrypt(input: ByteReadPacket): ByteReadPacket = input.decryptBy(value) override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket = input.decryptBy(value, offset, length)
} }
/** /**
...@@ -19,33 +22,41 @@ interface DecrypterByteArray : Decrypter { ...@@ -19,33 +22,41 @@ interface DecrypterByteArray : Decrypter {
*/ */
interface DecrypterIoBuffer : Decrypter { interface DecrypterIoBuffer : Decrypter {
val value: IoBuffer val value: IoBuffer
override fun decrypt(input: ByteReadPacket): ByteReadPacket = input.decryptBy(value) override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket = input.decryptBy(value, offset, length)
} }
/** /**
* 连接在一起的解密器 * 连接在一起的解密器
*/ */
inline class LinkedDecrypter(inline val block: (ByteReadPacket) -> ByteReadPacket) : Decrypter { inline class LinkedDecrypter(inline val block: (input: ByteReadPacket, offset: Int, length: Int) -> ByteReadPacket) : Decrypter {
override fun decrypt(input: ByteReadPacket): ByteReadPacket = block(input) override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket = block(input, offset, length)
} }
object NoDecrypter : Decrypter, object NoDecrypter : Decrypter, DecrypterType<NoDecrypter> {
DecrypterType<NoDecrypter> { override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket {
override fun decrypt(input: ByteReadPacket): ByteReadPacket = input if (offset == 0 && length == input.remaining.toInt()) {
return input
}
ByteArrayPool.useInstance { buffer ->
input.readFully(buffer, offset, length)
return buffer.toReadPacket()
}
}
} }
/** /**
* 解密器 * 解密器
*/ */
interface Decrypter { interface Decrypter {
fun decrypt(input: ByteReadPacket): ByteReadPacket fun decrypt(input: ByteReadPacket, offset: Int = 0, length: Int = (input.remaining - offset).toInt()): ByteReadPacket
/** /**
* 连接后将会先用 this 解密, 再用 [another] 解密 * 连接后将会先用 this 解密, 再用 [another] 解密
*/ */
operator fun plus(another: Decrypter): Decrypter = operator fun plus(another: Decrypter): Decrypter =
LinkedDecrypter { another.decrypt(this.decrypt(it)) } LinkedDecrypter { input: ByteReadPacket, offset: Int, length: Int -> another.decrypt(this.decrypt(input, offset, length)) }
} }
interface DecrypterType<D : Decrypter> interface DecrypterType<D : Decrypter>
inline fun BytePacketBuilder.encryptAndWrite(key: DecrypterByteArray, encoder: BytePacketBuilder.() -> Unit) = inline fun BytePacketBuilder.encryptAndWrite(key: DecrypterByteArray, encoder: BytePacketBuilder.() -> Unit) =
......
...@@ -94,9 +94,9 @@ fun IoBuffer.decryptBy(key: ByteArray, offset: Int = 0, length: Int = readRemain ...@@ -94,9 +94,9 @@ fun IoBuffer.decryptBy(key: ByteArray, offset: Int = 0, length: Int = readRemain
// region ByteReadPacket extension // region ByteReadPacket extension
fun ByteReadPacket.decryptBy(key: ByteArray): ByteReadPacket = decryptAsByteArray(key) { data -> ByteReadPacket(data, 0) } 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: IoBuffer): ByteReadPacket = decryptAsByteArray(key) { data -> ByteReadPacket(data, 0) } fun ByteReadPacket.decryptBy(key: IoBuffer, offset: Int = 0, length: Int = key.readRemaining - offset): ByteReadPacket = decryptAsByteArray(key) { data -> ByteReadPacket(data, offset, length) }
inline fun <R> ByteReadPacket.decryptAsByteArray(key: ByteArray, consumer: (ByteArray) -> R): R = inline fun <R> ByteReadPacket.decryptAsByteArray(key: ByteArray, consumer: (ByteArray) -> R): R =
ByteArrayPool.useInstance { ByteArrayPool.useInstance {
......
...@@ -52,8 +52,6 @@ fun Input.readIP(): String = buildString(4 + 3) { ...@@ -52,8 +52,6 @@ fun Input.readIP(): String = buildString(4 + 3) {
} }
} }
fun Input.readPacket(length: Int): ByteReadPacket = this.readBytes(length).toReadPacket()
fun Input.readQQ(): Long = this.readUInt().toLong() fun Input.readQQ(): Long = this.readUInt().toLong()
fun Input.readGroup(): Long = this.readUInt().toLong() fun Input.readGroup(): Long = this.readUInt().toLong()
fun Input.readGroupId(): GroupId = this.readUInt().toLong().groupId() fun Input.readGroupId(): GroupId = this.readUInt().toLong().groupId()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment