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
import kotlinx.io.core.BytePacketBuilder
import kotlinx.io.core.ByteReadPacket
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.toReadPacket
/**
......@@ -11,7 +14,7 @@ import net.mamoe.mirai.utils.io.encryptAndWrite
*/
interface DecrypterByteArray : Decrypter {
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 {
*/
interface DecrypterIoBuffer : Decrypter {
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 {
override fun decrypt(input: ByteReadPacket): ByteReadPacket = block(input)
inline class LinkedDecrypter(inline val block: (input: ByteReadPacket, offset: Int, length: Int) -> ByteReadPacket) : Decrypter {
override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket = block(input, offset, length)
}
object NoDecrypter : Decrypter,
DecrypterType<NoDecrypter> {
override fun decrypt(input: ByteReadPacket): ByteReadPacket = input
object NoDecrypter : Decrypter, DecrypterType<NoDecrypter> {
override fun decrypt(input: ByteReadPacket, offset: Int, length: Int): ByteReadPacket {
if (offset == 0 && length == input.remaining.toInt()) {
return input
}
ByteArrayPool.useInstance { buffer ->
input.readFully(buffer, offset, length)
return buffer.toReadPacket()
}
}
}
/**
* 解密器
*/
*/
interface Decrypter {
fun decrypt(input: ByteReadPacket): ByteReadPacket
fun decrypt(input: ByteReadPacket, offset: Int = 0, length: Int = (input.remaining - offset).toInt()): ByteReadPacket
/**
* 连接后将会先用 this 解密, 再用 [another] 解密
*/
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>
inline fun BytePacketBuilder.encryptAndWrite(key: DecrypterByteArray, encoder: BytePacketBuilder.() -> Unit) =
......
......@@ -94,9 +94,9 @@ fun IoBuffer.decryptBy(key: ByteArray, offset: Int = 0, length: Int = readRemain
// 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 =
ByteArrayPool.useInstance {
......
......@@ -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.readGroup(): Long = this.readUInt().toLong()
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