From 887a82564f4809bd4b1d5fc10442d5844a00cd5a Mon Sep 17 00:00:00 2001 From: Verox001 Date: Fri, 21 Feb 2025 18:20:43 +0100 Subject: [PATCH] Added LoginStart. Doesn't work yet though --- main.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index de3a2cc..9dccd7e 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,11 @@ const ( PongResponseID = 0x01 ) +type PrefixedByteArray struct { + Length int + Data []byte +} + type HandshakePacket struct { ProtocolVersion int ServerAddress string @@ -25,6 +30,11 @@ type HandshakePacket struct { NextState int } +type LoginStartPacket struct { + SharedSecret PrefixedByteArray + VerifyToken PrefixedByteArray +} + type StatusResponse struct { Version VersionInfo `json:"version"` Players PlayerInfo `json:"players"` @@ -42,10 +52,6 @@ type PlayerInfo struct { Sample []Player `json:"sample"` } -type Pong struct { - Timestamp int64 `json:"timestamp"` -} - type Player struct { Name string `json:"name"` ID string `json:"id"` @@ -129,8 +135,40 @@ func handleConnection(client *ClientState) { if client.nextState == 1 { handleStatusRequest(client) } else if client.nextState == 2 { - fmt.Println("Received status request in the wrong state") + fmt.Println("Received Login Start") + + // Login Start + loginStart, err := handleLoginStart(packetReader) + if err != nil { + fmt.Println("Error processing login start:", err) + return + } + fmt.Println("Login Start:", loginStart) + + // Send Encryption Request back + var packetData bytes.Buffer + writeVarInt(&packetData, 1) // Packet length: 1 byte for ID + packetData.WriteByte(0x01) // Encryption Request ID + + // Server ID + writeString(&packetData, "JustAnotherServer") + + // Public Key + writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}}) + + // Verify Token + writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}}) + + // Should authenticate (actually a boolean) + packetData.WriteByte(1) + + if _, err := client.conn.Write(packetData.Bytes()); err != nil { + fmt.Println("Error sending encryption request:", err) + } else { + fmt.Println("Encryption request sent successfully") + } } else if client.nextState == 3 { + // Transfer fmt.Println("Received status request in the wrong state") } else { handshake, err := handleHandshake(packetReader) @@ -188,6 +226,24 @@ func handleHandshake(reader *bytes.Reader) (HandshakePacket, error) { return handshake, nil } +func handleLoginStart(reader *bytes.Reader) (LoginStartPacket, error) { + var packet LoginStartPacket + var err error + + packet.SharedSecret, err = readPrefixedByteArray(reader) + if err != nil { + return packet, err + } + + packet.VerifyToken, err = readPrefixedByteArray(reader) + if err != nil { + return packet, err + } + + fmt.Printf("Login Start received: %+v\n", packet) + return packet, nil +} + func handleStatusRequest(client *ClientState) { status := StatusResponse{ Version: VersionInfo{"1.21.4", 769}, @@ -233,6 +289,16 @@ func writeVarInt(buf *bytes.Buffer, value int) { } } +func writeString(buf *bytes.Buffer, value string) { + writeVarInt(buf, len(value)) + buf.WriteString(value) +} + +func writePrefixedByteArray(buf *bytes.Buffer, value PrefixedByteArray) { + writeVarInt(buf, value.Length) + buf.Write(value.Data) +} + func readVarInt(reader *bytes.Reader) (int, error) { value, position := 0, 0 for { @@ -264,3 +330,16 @@ func readString(reader *bytes.Reader) (string, error) { } return string(strBuf), nil } + +func readPrefixedByteArray(reader *bytes.Reader) (PrefixedByteArray, error) { + length, err := readVarInt(reader) + if err != nil { + return PrefixedByteArray{}, err + } + + data := make([]byte, length) + if _, err := reader.Read(data); err != nil { + return PrefixedByteArray{}, err + } + return PrefixedByteArray{Length: length, Data: data}, nil +}