Commit 16d70c9f authored by Him188moe's avatar Him188moe

Login finished. Now working on Session

parent 4b889141
...@@ -58,7 +58,7 @@ S: 发送 `08 36 31 03` 告知登录结果. ...@@ -58,7 +58,7 @@ S: 发送 `08 36 31 03` 告知登录结果.
- 设备锁 - 设备锁
- 被回收 - 被回收
C: 回复 `08 28 04 34` C: 回复 `08 28 04 34`, 请求建立 Session
Sample Sample
```text ```text
...@@ -66,7 +66,7 @@ Sample ...@@ -66,7 +66,7 @@ Sample
``` ```
**Session** **Session**
S: 发送 `08 28 04 34`, 告知: S: 发送 `08 28 04 34`, 完成 session 建立, 告知:
- g_sessionKey - g_sessionKey
- g_tlv0105 - g_tlv0105
- g_loginStatus - g_loginStatus
......
...@@ -4,6 +4,8 @@ import lombok.Getter; ...@@ -4,6 +4,8 @@ import lombok.Getter;
import net.mamoe.mirai.event.MiraiEventManager; import net.mamoe.mirai.event.MiraiEventManager;
import net.mamoe.mirai.event.events.server.ServerDisableEvent; import net.mamoe.mirai.event.events.server.ServerDisableEvent;
import net.mamoe.mirai.event.events.server.ServerEnableEvent; import net.mamoe.mirai.event.events.server.ServerEnableEvent;
import net.mamoe.mirai.network.RobotNetworkHandler;
import net.mamoe.mirai.network.packet.client.touch.ClientTouchPacket;
import net.mamoe.mirai.task.MiraiTaskManager; import net.mamoe.mirai.task.MiraiTaskManager;
import net.mamoe.mirai.utils.LoggerTextFormat; import net.mamoe.mirai.utils.LoggerTextFormat;
import net.mamoe.mirai.utils.MiraiLogger; import net.mamoe.mirai.utils.MiraiLogger;
...@@ -15,6 +17,7 @@ import net.mamoe.mirai.utils.setting.MiraiSettingMapSection; ...@@ -15,6 +17,7 @@ import net.mamoe.mirai.utils.setting.MiraiSettingMapSection;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedList;
import java.util.Scanner; import java.util.Scanner;
public class MiraiServer { public class MiraiServer {
...@@ -135,8 +138,8 @@ public class MiraiServer { ...@@ -135,8 +138,8 @@ public class MiraiServer {
*/ */
/* Robot robot = new Robot(1994701021, "xiaoqqq", new LinkedList<>());
RobotNetworkHandler robotNetworkHandler = new RobotNetworkHandler(1994701021, "xiaoqqq"); RobotNetworkHandler robotNetworkHandler = robot.getHandler();
try { try {
//System.out.println(Protocol.Companion.getSERVER_IP().get(3)); //System.out.println(Protocol.Companion.getSERVER_IP().get(3));
//System.out.println(Protocol.Companion.getSERVER_IP().toString()); //System.out.println(Protocol.Companion.getSERVER_IP().toString());
......
...@@ -12,6 +12,7 @@ public class Robot { ...@@ -12,6 +12,7 @@ public class Robot {
private final int qq; private final int qq;
private final String password; private final String password;
@Getter
private final RobotNetworkHandler handler; private final RobotNetworkHandler handler;
/** /**
...@@ -40,19 +41,8 @@ public class Robot { ...@@ -40,19 +41,8 @@ public class Robot {
this.password = password; this.password = password;
this.owners = Collections.unmodifiableList(owners); this.owners = Collections.unmodifiableList(owners);
this.handler = new RobotNetworkHandler(this.qq, this.password); this.handler = new RobotNetworkHandler(this.qq, this.password);
}
public void connect() {
} }
public void onPacketReceive() {
}
} }
...@@ -4,6 +4,7 @@ import io.netty.channel.Channel ...@@ -4,6 +4,7 @@ import io.netty.channel.Channel
import net.mamoe.mirai.network.packet.client.ClientPacket import net.mamoe.mirai.network.packet.client.ClientPacket
import net.mamoe.mirai.network.packet.client.login.* import net.mamoe.mirai.network.packet.client.login.*
import net.mamoe.mirai.network.packet.client.writeHex import net.mamoe.mirai.network.packet.client.writeHex
import net.mamoe.mirai.network.packet.client.writeRandom
import net.mamoe.mirai.network.packet.server.ServerPacket import net.mamoe.mirai.network.packet.server.ServerPacket
import net.mamoe.mirai.network.packet.server.login.* import net.mamoe.mirai.network.packet.server.login.*
import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePacket import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePacket
...@@ -44,7 +45,18 @@ class RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -44,7 +45,18 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
/** /**
* Kind of key, similar to sessionKey * Kind of key, similar to sessionKey
*/ */
private lateinit var tlv0105: ByteArray private var tlv0105: ByteArray
init {
tlv0105 = lazyEncode {
it.writeHex("01 05 00 30")
it.writeHex("00 01 01 02 00 14 01 01 00 10")
it.writeRandom(16)
it.writeHex("00 14 01 02 00 10")
it.writeRandom(16)
}
}
private lateinit var sessionKey: ByteArray private lateinit var sessionKey: ByteArray
/** /**
* Kind of key, similar to sessionKey * Kind of key, similar to sessionKey
...@@ -92,7 +104,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -92,7 +104,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
is ServerLoginResponseSuccessPacket -> { is ServerLoginResponseSuccessPacket -> {
this._0828_rec_decr_key = packet._0828_rec_decr_key this._0828_rec_decr_key = packet._0828_rec_decr_key
sendPacket(ClientLoginSucceedConfirmationPacket(this.number, this.serverIP, this.loginIP, this.md5_32, packet.token38, packet.token88, packet.encryptionKey, this.tlv0105)) sendPacket(ClientSessionRequestPacket(this.number, this.serverIP, this.loginIP, this.md5_32, packet.token38, packet.token88, packet.encryptionKey, this.tlv0105))
} }
//是ClientPasswordSubmissionPacket之后服务器回复的 //是ClientPasswordSubmissionPacket之后服务器回复的
...@@ -150,8 +162,8 @@ class RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -150,8 +162,8 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun sendPacket(packet: ClientPacket) { fun sendPacket(packet: ClientPacket) {
sendPacketDebug(packet); /*sendPacketDebug(packet);
if (true) return; if (true) return;*/
try { try {
//MiraiLogger log "Encoding" //MiraiLogger log "Encoding"
packet.encode() packet.encode()
......
...@@ -69,7 +69,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet { ...@@ -69,7 +69,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@Throws(IOException::class) @Throws(IOException::class)
fun DataOutputStream.writeIP(ip: String) { fun DataOutputStream.writeIP(ip: String) {
for (s in ip.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) { for (s in ip.trim().split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
this.writeByte(s.toInt()) this.writeByte(s.toInt())
} }
} }
...@@ -78,7 +78,7 @@ fun DataOutputStream.writeIP(ip: String) { ...@@ -78,7 +78,7 @@ fun DataOutputStream.writeIP(ip: String) {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@Throws(IOException::class) @Throws(IOException::class)
fun DataOutputStream.writeHex(hex: String) { fun DataOutputStream.writeHex(hex: String) {
for (s in hex.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) { for (s in hex.trim().split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
if (s.isEmpty()) { if (s.isEmpty()) {
continue continue
} }
...@@ -128,7 +128,7 @@ fun DataOutputStream.encryptAndWrite(cryptor: TEACryptor, encoder: (ByteArrayDat ...@@ -128,7 +128,7 @@ fun DataOutputStream.encryptAndWrite(cryptor: TEACryptor, encoder: (ByteArrayDat
@Throws(IOException::class) @Throws(IOException::class)
fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray) { fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray) {
ByteArrayDataOutputStream().let { ByteArrayDataOutputStream().let {
it.writeRandom(4) it.writeHex("12 12 12 12")//it.writeRandom(4) todo
it.writeHex("00 02") it.writeHex("00 02")
it.writeQQ(qq) it.writeQQ(qq)
it.writeHex(Protocol._0825data2) it.writeHex(Protocol._0825data2)
...@@ -153,12 +153,18 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log ...@@ -153,12 +153,18 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log
} }
} }
fun main() {
}
/*
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun main() { fun main() {
println(lazyEncode { it.writeTLV0006(1994701021, "D1 A5 C8 BB E1 Q3 CC DD", 131513, "123.123.123.123", "AA BB CC DD EE FF AA BB CC".hexToBytes()) }.toUByteArray().toUHexString()) println(lazyEncode { it.writeTLV0006(1994701021, "D1 A5 C8 BB E1 Q3 CC DD", 131513, "123.123.123.123", "AA BB CC DD EE FF AA BB CC".hexToBytes()) }.toUByteArray().toUHexString())
} }*/
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@TestedSuccessfully
fun DataOutputStream.writeCRC32() = writeCRC32(getRandomKey(16)) fun DataOutputStream.writeCRC32() = writeCRC32(getRandomKey(16))
...@@ -170,6 +176,7 @@ fun DataOutputStream.writeCRC32(key: ByteArray) { ...@@ -170,6 +176,7 @@ fun DataOutputStream.writeCRC32(key: ByteArray) {
} }
} }
@TestedSuccessfully
fun DataOutputStream.writeDeviceName() { fun DataOutputStream.writeDeviceName() {
val deviceName = InetAddress.getLocalHost().hostName val deviceName = InetAddress.getLocalHost().hostName
this.writeShort(deviceName.length + 2) this.writeShort(deviceName.length + 2)
......
...@@ -6,6 +6,7 @@ import net.mamoe.mirai.network.packet.client.* ...@@ -6,6 +6,7 @@ import net.mamoe.mirai.network.packet.client.*
import net.mamoe.mirai.util.* import net.mamoe.mirai.util.*
import java.io.DataOutputStream import java.io.DataOutputStream
import java.net.InetAddress import java.net.InetAddress
import kotlin.system.exitProcess
/** /**
* Password submission (0836_622) * Password submission (0836_622)
...@@ -39,7 +40,11 @@ class ClientPasswordSubmissionPacket( ...@@ -39,7 +40,11 @@ class ClientPasswordSubmissionPacket(
} }
} }
@UseExperimental(ExperimentalUnsignedTypes::class)
fun main() { fun main() {
println(InetAddress.getLocalHost().hostName)
exitProcess(0)
val loginTime = "5D 60 F6 33".hexToInt() val loginTime = "5D 60 F6 33".hexToInt()
println(loginTime) println(loginTime)
...@@ -67,11 +72,13 @@ fun main() { ...@@ -67,11 +72,13 @@ fun main() {
@PacketId("08 36 31 04") @PacketId("08 36 31 04")
@ExperimentalUnsignedTypes//todo 测试出来这个包长度有问题 @ExperimentalUnsignedTypes//todo 测试出来这个包长度有问题
class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null) : ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr) class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null)
: ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr)
@PacketId("08 36 31 06") @PacketId("08 36 31 06")
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
class ClientLoginResendPacket3106(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null) : ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr) class ClientLoginResendPacket3106(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null)
: ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr)
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
open class ClientLoginResendPacket internal constructor( open class ClientLoginResendPacket internal constructor(
...@@ -111,7 +118,7 @@ open class ClientLoginResendPacket internal constructor( ...@@ -111,7 +118,7 @@ open class ClientLoginResendPacket internal constructor(
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@PacketId("08 28 04 34") @PacketId("08 28 04 34")
class ClientLoginSucceedConfirmationPacket( class ClientSessionRequestPacket(
private val qq: Int, private val qq: Int,
private val serverIp: String, private val serverIp: String,
private val loginIP: String, private val loginIP: String,
...@@ -153,7 +160,7 @@ class ClientLoginSucceedConfirmationPacket( ...@@ -153,7 +160,7 @@ class ClientLoginSucceedConfirmationPacket(
this.writeHex("68") this.writeHex("68")
this.writeHex("00 00 00 00 00 2D 00 06 00 01") this.writeHex("00 00 00 00 00 2D 00 06 00 01")
this.writeIP(InetAddress.getLocalHost().hostName)//? todo 这随便扔的 this.writeIP(InetAddress.getLocalHost().hostAddress)
return super.toByteArray() return super.toByteArray()
} }
...@@ -173,9 +180,6 @@ private fun DataOutputStream.writePart1(qq: Int, password: String, loginTime: In ...@@ -173,9 +180,6 @@ private fun DataOutputStream.writePart1(qq: Int, password: String, loginTime: In
this.write(token0825)//length this.write(token0825)//length
this.writeHex("03 0F")//tag this.writeHex("03 0F")//tag
this.writeDeviceName() this.writeDeviceName()
/*易语言源码: PCName就是HostName
PCName = BytesToStr (Ansi转Utf8 (取主机名 ()))
PCName = 取文本左边 (PCName, 取文本长度 (PCName) - 3)*/
this.writeHex("00 05 00 06 00 02") this.writeHex("00 05 00 06 00 02")
this.writeQQ(qq) this.writeQQ(qq)
......
...@@ -12,7 +12,7 @@ import net.mamoe.mirai.util.toUHexString ...@@ -12,7 +12,7 @@ import net.mamoe.mirai.util.toUHexString
import java.io.IOException import java.io.IOException
/** /**
* The packet to touch server. * The packet to touch server, that is, to start the connection to the server.
* *
* @author Him188moe * @author Him188moe
*/ */
......
...@@ -20,22 +20,22 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) : ...@@ -20,22 +20,22 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) :
OTHER, OTHER,
} }
lateinit var _0836_tlv0006_encr: ByteArray; lateinit var _0836_tlv0006_encr: ByteArray;//120bytes
var tokenUnknown: ByteArray? = null var tokenUnknown: ByteArray? = null
lateinit var tgtgtKey: ByteArray lateinit var tgtgtKey: ByteArray//16bytes
@TestedSuccessfully @TestedSuccessfully
override fun decode() { override fun decode() {
this.input.skip(5) this.input.skip(5)
tgtgtKey = this.input.readNBytes(16)//22 tgtgtKey = this.input.readNBytes(16)//22
println(tgtgtKey.toUHexString()) //this.input.skip(2)//25
this.input.skip(2)//25 this.input.goto(25)
_0836_tlv0006_encr = this.input.readNBytes(120) _0836_tlv0006_encr = this.input.readNBytes(120)
when (flag) { when (flag) {
Flag.`08 36 31 03` -> { Flag.`08 36 31 03` -> {
tokenUnknown = this.input.goto(153).readNBytes(56) tokenUnknown = this.input.goto(153).readNBytes(56)
println(tokenUnknown!!.toUHexString()) //println(tokenUnknown!!.toUHexString())
} }
Flag.OTHER -> { Flag.OTHER -> {
......
...@@ -6,6 +6,7 @@ import net.mamoe.mirai.network.packet.server.goto ...@@ -6,6 +6,7 @@ import net.mamoe.mirai.network.packet.server.goto
import net.mamoe.mirai.network.packet.server.readNBytes import net.mamoe.mirai.network.packet.server.readNBytes
import net.mamoe.mirai.network.packet.server.readVarString import net.mamoe.mirai.network.packet.server.readVarString
import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.TEACryptor
import net.mamoe.mirai.util.TestedSuccessfully
import net.mamoe.mirai.util.hexToBytes import net.mamoe.mirai.util.hexToBytes
import net.mamoe.mirai.util.toUHexString import net.mamoe.mirai.util.toUHexString
import java.io.DataInputStream import java.io.DataInputStream
...@@ -13,10 +14,8 @@ import java.io.DataInputStream ...@@ -13,10 +14,8 @@ import java.io.DataInputStream
/** /**
* @author NaturalHG * @author NaturalHG
*/ */
class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLength: Int) : ServerPacket(input) { class ServerLoginResponseSuccessPacket(input: DataInputStream) : ServerPacket(input) {
lateinit var _0828_rec_decr_key: ByteArray//16 bytes| lateinit var _0828_rec_decr_key: ByteArray//16 bytes|
var age: Short = 0
var gender: Int = 0//from 1byte
lateinit var nick: String lateinit var nick: String
lateinit var token38: ByteArray lateinit var token38: ByteArray
...@@ -24,6 +23,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen ...@@ -24,6 +23,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen
lateinit var encryptionKey: ByteArray lateinit var encryptionKey: ByteArray
@TestedSuccessfully
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
override fun decode() { override fun decode() {
//测试完成 @NaturalHG //测试完成 @NaturalHG
...@@ -113,9 +113,9 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen ...@@ -113,9 +113,9 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen
val nickLength = this.input.goto(624 + msgLength).readByte().toInt() val nickLength = this.input.goto(624 + msgLength).readByte().toInt()
this.nick = this.input.readVarString(nickLength) this.nick = this.input.readVarString(nickLength)
this.age = this.input.goto(packetDataLength - 28).readShort() //this.age = this.input.goto(packetDataLength - 28).readShort()
this.gender = this.input.goto(packetDataLength - 32).readByte().toInt() //this.gender = this.input.goto(packetDataLength - 32).readByte().toInt()
} }
} }
...@@ -131,7 +131,7 @@ class ServerLoginResponseSuccessPacketEncrypted(input: DataInputStream) : Server ...@@ -131,7 +131,7 @@ class ServerLoginResponseSuccessPacketEncrypted(input: DataInputStream) : Server
bytes = bytes.copyOfRange(0, bytes.size - 1) bytes = bytes.copyOfRange(0, bytes.size - 1)
println(bytes.toUByteArray().toUHexString()) println(bytes.toUByteArray().toUHexString())
return ServerLoginResponseSuccessPacket(DataInputStream(TEACryptor.decrypt(TEACryptor.decrypt(bytes, Protocol.shareKey.hexToBytes()), tgtgtKey).inputStream()), bytes.size); return ServerLoginResponseSuccessPacket(DataInputStream(TEACryptor.decrypt(TEACryptor.decrypt(bytes, Protocol.shareKey.hexToBytes()), tgtgtKey).inputStream()));
//TeaDecrypt(取文本中间(data, 43, 取文本长度(data) - 45), m_0828_rec_decr_key) //TeaDecrypt(取文本中间(data, 43, 取文本长度(data) - 45), m_0828_rec_decr_key)
} }
} }
...@@ -12,7 +12,7 @@ import java.util.zip.CRC32 ...@@ -12,7 +12,7 @@ import java.util.zip.CRC32
*/ */
object Utils { object Utils {
fun toHexString(byteArray: ByteArray, separator: String = " "): String = byteArray.joinToString(separator) { fun toHexString(byteArray: ByteArray, separator: String = " "): String = byteArray.joinToString(separator) {
var ret = it.toString(16).toUpperCase(); var ret = it.toString(16).toUpperCase()
if (ret.length == 1) { if (ret.length == 1) {
ret = "0$ret" ret = "0$ret"
} }
...@@ -21,7 +21,7 @@ object Utils { ...@@ -21,7 +21,7 @@ object Utils {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun toHexString(byteArray: UByteArray, separator: String = " "): String = byteArray.joinToString(separator) { fun toHexString(byteArray: UByteArray, separator: String = " "): String = byteArray.joinToString(separator) {
var ret = it.toString(16).toUpperCase(); var ret = it.toString(16).toUpperCase()
if (ret.length == 1) { if (ret.length == 1) {
ret = "0$ret" ret = "0$ret"
} }
...@@ -67,7 +67,7 @@ fun String.hexToByte(): Byte = hexToBytes()[0] ...@@ -67,7 +67,7 @@ fun String.hexToByte(): Byte = hexToBytes()[0]
open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream()) { open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream()) {
open fun toByteArray(): ByteArray = (out as ByteArrayOutputStream).toByteArray() open fun toByteArray(): ByteArray = (out as ByteArrayOutputStream).toByteArray()
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
open fun toUByteArray(): UByteArray = (out as ByteArrayOutputStream).toByteArray().toUByteArray(); open fun toUByteArray(): UByteArray = (out as ByteArrayOutputStream).toByteArray().toUByteArray()
} }
fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDataOutputStream().let { t(it); return it.toByteArray() } fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDataOutputStream().let { t(it); return it.toByteArray() }
...@@ -76,7 +76,7 @@ fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDat ...@@ -76,7 +76,7 @@ fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDat
fun getRandomKey(length: Int): ByteArray { fun getRandomKey(length: Int): ByteArray {
val bytes = LinkedList<Byte>() val bytes = LinkedList<Byte>()
repeat(length) { bytes.add((Math.random() * 255).toByte()) } repeat(length) { bytes.add((Math.random() * 255).toByte()) }
return bytes.toByteArray(); return bytes.toByteArray()
} }
fun getCrc32(key: ByteArray): Int = CRC32().let { it.update(key); it.value.toInt() } fun getCrc32(key: ByteArray): Int = CRC32().let { it.update(key); it.value.toInt() }
...@@ -93,7 +93,7 @@ fun getCrc32(key: ByteArray): Int = CRC32().let { it.update(key); it.value.toInt ...@@ -93,7 +93,7 @@ fun getCrc32(key: ByteArray): Int = CRC32().let { it.update(key); it.value.toInt
*/ */
@Throws(SecurityException::class) @Throws(SecurityException::class)
fun Any.getAllDeclaredFields(): List<Field> { fun Any.getAllDeclaredFields(): List<Field> {
var clazz: Class<*> = this.javaClass; var clazz: Class<*> = this.javaClass
val list = LinkedList<Field>() val list = LinkedList<Field>()
loop@ do { loop@ do {
......
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