github.com/LagrangeDev/LagrangeGo@v0.0.0-20240512064304-ad4a85e10cb4/client/packets/wtlogin/exchange.go (about) 1 package wtlogin 2 3 import ( 4 "encoding/hex" 5 6 "github.com/LagrangeDev/LagrangeGo/client/packets/pb/login" 7 "github.com/LagrangeDev/LagrangeGo/internal/proto" 8 "github.com/LagrangeDev/LagrangeGo/utils" 9 "github.com/LagrangeDev/LagrangeGo/utils/binary" 10 "github.com/LagrangeDev/LagrangeGo/utils/crypto" 11 "github.com/LagrangeDev/LagrangeGo/utils/crypto/ecdh" 12 ) 13 14 var encKey, _ = hex.DecodeString("e2733bf403149913cbf80c7a95168bd4ca6935ee53cd39764beebe2e007e3aee") 15 16 func BuildKexExchangeRequest(uin uint32, guid string) ([]byte, error) { 17 encl, err := crypto.AESGCMEncrypt(proto.DynamicMessage{ 18 1: uin, 19 2: guid, 20 }.Encode(), ecdh.P256().SharedKey()) 21 if err != nil { 22 return nil, err 23 } 24 25 p2Hash := crypto.SHA256Digest( 26 binary.NewBuilder(nil). 27 WriteBytes(ecdh.P256().PublicKey()). 28 WriteU32(1). 29 WriteBytes(encl). 30 WriteU32(0). 31 WriteU32(uint32(utils.TimeStamp())). 32 ToBytes(), 33 ) 34 encP2Hash, err := crypto.AESGCMEncrypt(p2Hash, encKey) 35 if err != nil { 36 return nil, err 37 } 38 39 return proto.DynamicMessage{ 40 1: ecdh.P256().PublicKey(), 41 2: 1, 42 3: encl, 43 4: utils.TimeStamp(), 44 5: encP2Hash, 45 }.Encode(), nil 46 } 47 48 func ParseKeyExchangeResponse(response []byte) (key, sign []byte, err error) { 49 var p login.SsoKeyExchangeResponse 50 err = proto.Unmarshal(response, &p) 51 if err != nil { 52 return 53 } 54 55 shareKey, err := ecdh.P256().Exange(p.PublicKey) 56 if err != nil { 57 return 58 } 59 60 var decPb login.SsoKeyExchangeDecrypted 61 data, err := crypto.AESGCMDecrypt(p.GcmEncrypted, shareKey) 62 if err != nil { 63 return 64 } 65 err = proto.Unmarshal(data, &decPb) 66 if err != nil { 67 return 68 } 69 70 return decPb.GcmKey, decPb.Sign, nil 71 }