Added LoginStart. Doesn't work yet though

This commit is contained in:
Verox001 2025-02-21 18:20:43 +01:00
parent c20ff0fea7
commit 887a82564f

89
main.go
View File

@ -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
}