shadowsocks_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * Copyright (c) 2025, Psiphon Inc.
  3. * All rights reserved.
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. */
  19. package server
  20. import (
  21. "bytes"
  22. "crypto/rand"
  23. "io"
  24. "net"
  25. "testing"
  26. "time"
  27. "github.com/Jigsaw-Code/outline-sdk/transport"
  28. "github.com/Jigsaw-Code/outline-sdk/transport/shadowsocks"
  29. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common"
  30. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors"
  31. )
  32. func TestShadowsocksServer(t *testing.T) {
  33. listener, err := net.Listen("tcp", "127.0.0.1:0")
  34. if err != nil {
  35. t.Fatalf("net.Listen failed %v", err)
  36. }
  37. defer listener.Close()
  38. numIrregularTunnels := 0
  39. irregularTunnelLogger := func(clientIP string, tunnelError error, logFields common.LogFields) {
  40. numIrregularTunnels++
  41. }
  42. secretText := "TEST"
  43. listener, err = ListenShadowsocks(nil, listener, secretText, irregularTunnelLogger)
  44. if err != nil {
  45. t.Fatalf("ListenShadowsocks failed %v", err)
  46. }
  47. type listenerState struct {
  48. err error
  49. recv []byte
  50. }
  51. wantRecv := []byte("hello world")
  52. runListener := func(listener net.Listener, recv chan *listenerState) {
  53. conn, err := listener.Accept()
  54. if err != nil {
  55. recv <- &listenerState{
  56. err: errors.TraceMsg(err, "listener.Accept failed"),
  57. }
  58. return
  59. }
  60. // Set a short deadline as Read will block indefinitely if there is
  61. // no deadline and a replay is detected because the underlying conn
  62. // will be drained synchronously before Read returns and the client
  63. // will not hang up until it receives a response from the server.
  64. err = conn.SetDeadline(time.Now().Add(1 * time.Second))
  65. if err != nil {
  66. recv <- &listenerState{
  67. err: errors.TraceMsg(err, "conn.SetDeadline failed"),
  68. }
  69. return
  70. }
  71. defer conn.Close()
  72. b := make([]byte, len(wantRecv))
  73. // A single Read should be sufficient because multiple requests
  74. // in a single connection are not supported by this test.
  75. n, err := conn.Read(b)
  76. if err != nil {
  77. recv <- &listenerState{
  78. err: errors.TraceMsg(err, "conn.Read failed"),
  79. }
  80. return
  81. }
  82. b = b[:n]
  83. _, err = conn.Write(b)
  84. if err != nil {
  85. recv <- &listenerState{
  86. err: errors.TraceMsg(err, "conn.Write failed"),
  87. }
  88. return
  89. }
  90. recv <- &listenerState{
  91. recv: b,
  92. err: nil,
  93. }
  94. }
  95. recv := make(chan *listenerState)
  96. go runListener(listener, recv)
  97. conn, err := net.Dial("tcp", listener.Addr().String())
  98. if err != nil {
  99. t.Fatalf("net.Dial failed %v", err)
  100. }
  101. defer conn.Close()
  102. key, err := shadowsocks.NewEncryptionKey(shadowsocks.CHACHA20IETFPOLY1305, secretText)
  103. if err != nil {
  104. t.Fatalf("shadowsocks.NewEncryptionKey failed %v", err)
  105. }
  106. // Based on shadowsocks.DialStream
  107. clientToServerRecorder := NewWriteRecorder(conn)
  108. ssw := shadowsocks.NewWriter(clientToServerRecorder, key)
  109. serverToClientRecorder := NewReadRecorder(conn)
  110. ssr := shadowsocks.NewReader(serverToClientRecorder, key)
  111. conn = transport.WrapConn(conn.(*net.TCPConn), ssr, ssw)
  112. n, err := conn.Write(wantRecv)
  113. if err != nil {
  114. t.Fatalf("conn.Write failed %v", err)
  115. }
  116. if n != len(wantRecv) {
  117. t.Fatalf("expected to write %d bytes but wrote %d", len(wantRecv), n)
  118. }
  119. // read response
  120. b := make([]byte, 512)
  121. n, err = conn.Read(b)
  122. if err != nil {
  123. t.Fatalf("conn.Read failed %v", err)
  124. }
  125. b = b[:n]
  126. r := <-recv
  127. if r.err != nil {
  128. t.Fatalf("listener failed %v", r.err)
  129. }
  130. if !bytes.Equal(r.recv, wantRecv) {
  131. t.Fatalf("expected \"%s\" of len %d but got \"%s\" of len %d", string(wantRecv), len(wantRecv), string(r.recv), len(r.recv))
  132. }
  133. // Server echos bytes back
  134. if !bytes.Equal(b, wantRecv) {
  135. t.Fatalf("expected \"%s\" of len %d but got \"%s\" of len %d", string(wantRecv), len(wantRecv), string(b), len(b))
  136. }
  137. if numIrregularTunnels > 0 {
  138. t.Fatal("expected no irregular tunnels")
  139. }
  140. // Mimic a replay attack
  141. go runListener(listener, recv)
  142. conn, err = net.Dial("tcp", listener.Addr().String())
  143. if err != nil {
  144. t.Fatalf("net.Dial failed %v", err)
  145. }
  146. defer conn.Close()
  147. _, err = conn.Write(clientToServerRecorder.Bytes())
  148. if err != nil {
  149. t.Fatalf("conn.Read failed %v", err)
  150. }
  151. r = <-recv
  152. if r.err == nil {
  153. t.Fatalf("expected error")
  154. }
  155. if numIrregularTunnels != 1 {
  156. t.Fatal("expected 1 irregular tunnel")
  157. }
  158. // Mimic a reflection attack
  159. go runListener(listener, recv)
  160. conn, err = net.Dial("tcp", listener.Addr().String())
  161. if err != nil {
  162. t.Fatalf("net.Dial failed %v", err)
  163. }
  164. defer conn.Close()
  165. _, err = conn.Write(serverToClientRecorder.Bytes())
  166. if err != nil {
  167. t.Fatalf("conn.Read failed %v", err)
  168. }
  169. r = <-recv
  170. if r.err == nil {
  171. t.Fatalf("expected error")
  172. }
  173. if numIrregularTunnels != 2 {
  174. t.Fatal("expected 2 irregular tunnels")
  175. }
  176. // Mimic random bytes
  177. go runListener(listener, recv)
  178. conn, err = net.Dial("tcp", listener.Addr().String())
  179. if err != nil {
  180. t.Fatalf("net.Dial failed %v", err)
  181. }
  182. defer conn.Close()
  183. randomBytes := make([]byte, clientToServerRecorder.Len())
  184. _, err = rand.Read(randomBytes)
  185. if err != nil {
  186. t.Fatalf("rand.Read failed %v", err)
  187. }
  188. _, err = conn.Write(randomBytes)
  189. if err != nil {
  190. t.Fatalf("conn.Read failed %v", err)
  191. }
  192. r = <-recv
  193. if r.err == nil {
  194. t.Fatalf("expected error")
  195. }
  196. // Note: currently an invalid message from the client is not logged as an
  197. // irregular tunnel due to the limitations described in
  198. // ShadowsocksConn.Read so do not expect another irregular tunnel.
  199. if numIrregularTunnels != 2 {
  200. t.Fatal("expected 2 irregular tunnels")
  201. }
  202. }
  203. type writeRecorder struct {
  204. io.Writer
  205. bytes.Buffer
  206. }
  207. func NewWriteRecorder(writer io.Writer) *writeRecorder {
  208. return &writeRecorder{
  209. Writer: writer,
  210. }
  211. }
  212. func (w *writeRecorder) Write(p []byte) (n int, err error) {
  213. _, err = w.Buffer.Write(p)
  214. if err != nil {
  215. panic(err)
  216. }
  217. return w.Writer.Write(p)
  218. }
  219. type readRecorder struct {
  220. io.Reader
  221. bytes.Buffer
  222. }
  223. func NewReadRecorder(reader io.Reader) *readRecorder {
  224. return &readRecorder{
  225. Reader: reader,
  226. }
  227. }
  228. func (r *readRecorder) Read(p []byte) (n int, err error) {
  229. n, err = r.Reader.Read(p)
  230. r.Buffer.Write(p[:n])
  231. return n, err
  232. }