shadowsocks_client_key_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package service
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "testing"
  6. )
  7. // A method switch between SS-2022 ciphers of different key sizes must regenerate
  8. // client PSKs whose length no longer matches; otherwise xray rejects the user.
  9. func TestNormalizeShadowsocksClientKeys_RegeneratesOnMethodResize(t *testing.T) {
  10. // 32-byte (aes-256-sized) client key under an aes-128 (16-byte) method.
  11. oversized := base64.StdEncoding.EncodeToString(make([]byte, 32))
  12. settings := `{"method":"2022-blake3-aes-128-gcm","password":"` +
  13. base64.StdEncoding.EncodeToString(make([]byte, 16)) +
  14. `","clients":[{"email":"a","password":"` + oversized + `"}]}`
  15. out, changed := normalizeShadowsocksClientKeys(settings)
  16. if !changed {
  17. t.Fatalf("expected mismatched client key to be regenerated")
  18. }
  19. var m map[string]any
  20. if err := json.Unmarshal([]byte(out), &m); err != nil {
  21. t.Fatalf("unmarshal: %v", err)
  22. }
  23. clients := m["clients"].([]any)
  24. pw := clients[0].(map[string]any)["password"].(string)
  25. if pw == oversized {
  26. t.Fatalf("client key was not regenerated")
  27. }
  28. if decoded, err := base64.StdEncoding.DecodeString(pw); err != nil || len(decoded) != 16 {
  29. t.Fatalf("regenerated key must be 16 bytes for aes-128, got len=%d err=%v", len(decoded), err)
  30. }
  31. }
  32. // A correctly-sized key (and non-2022 / legacy settings) must pass through untouched.
  33. func TestNormalizeShadowsocksClientKeys_NoChangeWhenValid(t *testing.T) {
  34. valid := base64.StdEncoding.EncodeToString(make([]byte, 32))
  35. settings := `{"method":"2022-blake3-aes-256-gcm","clients":[{"email":"a","password":"` + valid + `"}]}`
  36. if out, changed := normalizeShadowsocksClientKeys(settings); changed || out != settings {
  37. t.Fatalf("valid aes-256 key must be left unchanged")
  38. }
  39. legacy := `{"method":"aes-256-gcm","clients":[{"email":"a","password":"anything"}]}`
  40. if out, changed := normalizeShadowsocksClientKeys(legacy); changed || out != legacy {
  41. t.Fatalf("legacy (non-2022) SS settings must be left unchanged")
  42. }
  43. }