From cb00499efe0956f5766334e10361ff044f7cf5c5 Mon Sep 17 00:00:00 2001 From: Tnze Date: Thu, 26 Jan 2023 22:42:37 +0800 Subject: [PATCH] update encryption response packet for 1.19.3 --- bot/client.go | 6 ++---- bot/login.go | 58 ++++++++++----------------------------------------- bot/mcbot.go | 12 ++++------- 3 files changed, 17 insertions(+), 59 deletions(-) diff --git a/bot/client.go b/bot/client.go index 2c32b44..46f2bc2 100644 --- a/bot/client.go +++ b/bot/client.go @@ -5,14 +5,12 @@ import ( "github.com/Tnze/go-mc/data/packetid" "github.com/Tnze/go-mc/net" - "github.com/Tnze/go-mc/yggdrasil/user" ) // Client is used to access Minecraft server type Client struct { - Conn *net.Conn - Auth Auth - KeyPair *user.KeyPairResp + Conn *net.Conn + Auth Auth Name string UUID uuid.UUID diff --git a/bot/login.go b/bot/login.go index 6772544..2b6e9e4 100644 --- a/bot/login.go +++ b/bot/login.go @@ -2,16 +2,13 @@ package bot import ( "bytes" - "crypto" "crypto/aes" "crypto/cipher" "crypto/rand" "crypto/rsa" "crypto/sha1" - "crypto/sha256" "crypto/x509" "encoding/json" - "encoding/pem" "fmt" "io" "net/http" @@ -20,7 +17,6 @@ import ( "github.com/Tnze/go-mc/data/packetid" "github.com/Tnze/go-mc/net/CFB8" pk "github.com/Tnze/go-mc/net/packet" - "github.com/Tnze/go-mc/yggdrasil/user" ) // Auth includes an account @@ -47,7 +43,7 @@ func handleEncryptionRequest(c *Client, p pk.Packet) error { // 响应加密请求 // Write Encryption Key Response - p, err = genEncryptionKeyResponse(key, er.PublicKey, er.VerifyToken, c.KeyPair) + p, err = genEncryptionKeyResponse(key, er.PublicKey, er.VerifyToken) if err != nil { return fmt.Errorf("gen encryption key response fail: %v", err) } @@ -182,7 +178,7 @@ func newSymmetricEncryption() (key []byte, encoStream, decoStream cipher.Stream) return } -func genEncryptionKeyResponse(shareSecret, publicKey, verifyToken []byte, keyPair *user.KeyPairResp) (erp pk.Packet, err error) { +func genEncryptionKeyResponse(shareSecret, publicKey, verifyToken []byte) (erp pk.Packet, err error) { iPK, err := x509.ParsePKIXPublicKey(publicKey) // Decode Public Key if err != nil { err = fmt.Errorf("decode public key fail: %v", err) @@ -194,47 +190,15 @@ func genEncryptionKeyResponse(shareSecret, publicKey, verifyToken []byte, keyPai err = fmt.Errorf("encryption share secret fail: %v", err) return } - if keyPair != nil { - privateKeyBlock, _ := pem.Decode([]byte(keyPair.KeyPair.PrivateKey)) - privateKey, err := x509.ParsePKCS8PrivateKey(privateKeyBlock.Bytes) - if err != nil { - err = fmt.Errorf("decode user private key fail: %v", err) - return erp, err - } - var l pk.Long - if _, err := l.ReadFrom(rand.Reader); err != nil { - err = fmt.Errorf("generate random number fail: %v", err) - return erp, err - } - - key := privateKey.(*rsa.PrivateKey) - hash := sha256.New() - hash.Write(verifyToken) - _, _ = l.WriteTo(hash) - signedData, err := key.Sign(rand.Reader, hash.Sum(nil), crypto.SHA256) - if err != nil { - err = fmt.Errorf("sign verifyToken fail: %v", err) - return erp, err - } - return pk.Marshal( - packetid.LoginEncryptionResponse, - pk.ByteArray(cryptPK), - pk.Boolean(false), - l, - pk.ByteArray(signedData), - ), nil - } else { - verifyT, err := rsa.EncryptPKCS1v15(rand.Reader, rsaKey, verifyToken) - if err != nil { - err = fmt.Errorf("encryption verfy tokenfail: %v", err) - return erp, err - } - return pk.Marshal( - packetid.LoginEncryptionResponse, - pk.ByteArray(cryptPK), - pk.Boolean(true), - pk.ByteArray(verifyT), - ), nil + verifyT, err := rsa.EncryptPKCS1v15(rand.Reader, rsaKey, verifyToken) + if err != nil { + err = fmt.Errorf("encryption verfy tokenfail: %v", err) + return erp, err } + return pk.Marshal( + packetid.LoginEncryptionResponse, + pk.ByteArray(cryptPK), + pk.ByteArray(verifyT), + ), nil } diff --git a/bot/mcbot.go b/bot/mcbot.go index 9baf20c..7eb247a 100644 --- a/bot/mcbot.go +++ b/bot/mcbot.go @@ -104,13 +104,6 @@ func (c *Client) join(addr string, options JoinOptions) error { return LoginErr{"handshake", err} } // Login Start - if c.Auth.AsTk != "" && !options.NoPublicKey { - if options.KeyPair != nil { - c.KeyPair = options.KeyPair - } else if KeyPairResp, err := user.GetOrFetchKeyPair(c.Auth.AsTk); err == nil { - c.KeyPair = &KeyPairResp - } - } c.UUID, err = uuid.Parse(c.Auth.UUID) PlayerUUID := pk.Option[pk.UUID, *pk.UUID]{ Has: err == nil, @@ -124,11 +117,12 @@ func (c *Client) join(addr string, options JoinOptions) error { if err != nil { return LoginErr{"login start", err} } + receiving := "encrypt start" for { // Receive Packet var p pk.Packet if err = c.Conn.ReadPacket(&p); err != nil { - return LoginErr{"receive packet", err} + return LoginErr{receiving, err} } // Handle Packet @@ -145,6 +139,7 @@ func (c *Client) join(addr string, options JoinOptions) error { if err := handleEncryptionRequest(c, p); err != nil { return LoginErr{"encryption", err} } + receiving = "set compression" case packetid.LoginSuccess: // Login Success err := p.Scan( @@ -162,6 +157,7 @@ func (c *Client) join(addr string, options JoinOptions) error { return LoginErr{"compression", err} } c.Conn.SetThreshold(int(threshold)) + receiving = "login success" case packetid.LoginPluginRequest: // Login Plugin Request var (