From 13636715a725945e200899d1e8835578a326aa96 Mon Sep 17 00:00:00 2001 From: CN-JS-HuiBai Date: Wed, 15 Apr 2026 01:30:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=B7=E5=90=88=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/xboard/service.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/service/xboard/service.go b/service/xboard/service.go index b08c2d43..fbcaf6c0 100644 --- a/service/xboard/service.go +++ b/service/xboard/service.go @@ -27,16 +27,17 @@ import ( "github.com/sagernet/sing/service" ) -// ss2022Key returns the correctly sized identity string. -func ss2022Key(identity string, keyLen int) string { +// ss2022UserKey prepares a user key for SS2022: +// Truncate UUID string to keyLen and encode as Base64 for sing-box. +func ss2022UserKey(identity string, keyLen int) string { if len(identity) > keyLen { - return identity[:keyLen] + identity = identity[:keyLen] } else if len(identity) < keyLen { padded := make([]byte, keyLen) copy(padded, []byte(identity)) - return string(padded) + identity = string(padded) } - return identity + return base64.StdEncoding.EncodeToString([]byte(identity)) } // ss2022KeyLength returns the required key length for a given SS2022 cipher. @@ -617,9 +618,9 @@ func (s *Service) setupNode() error { } if strings.Contains(method, "2022") { - // SS2022: server_key is the prefix/identity for PSK + // SS2022: server_key is used DIRECTLY as PSK (like V2bX) + ssOptions.Password = serverKey keyLen := ss2022KeyLength(method) - ssOptions.Password = ss2022Key(serverKey, keyLen) // Create a dummy user (will be replaced by syncUsers) dummyKey := make([]byte, keyLen) @@ -894,10 +895,10 @@ func (s *Service) syncUsers() { // Base64 encode the UUID string (clipped/padded to keyLen) if isSS2022 { originalKey := key - key = ss2022Key(key, ss2022KeyLen) + key = ss2022UserKey(key, ss2022KeyLen) if len(newUsers) == 0 { // Log first user's key derivation for debugging - s.logger.Info("SS2022 user key derivation: ID[:", ss2022KeyLen, "]=", originalKey[:min(ss2022KeyLen, len(originalKey))], " → b64_PSK=", key) + s.logger.Info("SS2022 user key derivation: ID[:", ss2022KeyLen, "]=", originalKey[:min(ss2022KeyLen, len(originalKey))], " → b64_uPSK=", key) } }