Skip to content

Commit

Permalink
Merge pull request Psiphon-Labs#722 from mirokuratczyk/ss
Browse files Browse the repository at this point in the history
Add Shadowsocks
  • Loading branch information
rod-hynes authored Feb 4, 2025
2 parents 78d00b6 + 16701a1 commit 002e8a5
Show file tree
Hide file tree
Showing 72 changed files with 6,375 additions and 195 deletions.
9 changes: 6 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ replace github.com/pion/webrtc/v3 => ./replace/webrtc

require (
filippo.io/edwards25519 v1.1.0
github.com/Jigsaw-Code/outline-sdk v0.0.16
github.com/Jigsaw-Code/outline-ss-server v1.8.0
github.com/Psiphon-Inc/rotate-safe-writer v0.0.0-20210303140923-464a7a37606e
github.com/Psiphon-Labs/bolt v0.0.0-20200624191537-23cedaef7ad7
github.com/Psiphon-Labs/consistent v0.0.0-20240322131436-20aaa4e05737
Expand Down Expand Up @@ -81,7 +83,7 @@ require (
github.com/wlynxg/anet v0.0.1
golang.org/x/crypto v0.22.0
golang.org/x/net v0.24.0
golang.org/x/sync v0.5.0
golang.org/x/sync v0.6.0
golang.org/x/sys v0.20.0
golang.org/x/term v0.19.0
golang.org/x/time v0.5.0
Expand Down Expand Up @@ -136,6 +138,7 @@ require (
github.com/refraction-networking/obfs4 v0.1.2 // indirect
github.com/refraction-networking/utls v1.3.3 // indirect
github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507 // indirect
github.com/shadowsocks/go-shadowsocks2 v0.1.5 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect
github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85 // indirect
Expand All @@ -149,10 +152,10 @@ require (
go.uber.org/mock v0.4.0 // indirect
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e // indirect
golang.org/x/mod v0.14.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.15.0 // indirect
golang.org/x/tools v0.16.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
25 changes: 19 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIo
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/Jigsaw-Code/outline-sdk v0.0.16 h1:WbHmv80FKDIpzEmR3GehTbq5CibYTLvcxIIpMMILiEs=
github.com/Jigsaw-Code/outline-sdk v0.0.16/go.mod h1:e1oQZbSdLJBBuHgfeQsgEkvkuyIePPwstUeZRGq0KO8=
github.com/Jigsaw-Code/outline-ss-server v1.8.0 h1:6h7CZsyl1vQLz3nvxmL9FbhDug4QxJ1YTxm534eye1E=
github.com/Jigsaw-Code/outline-ss-server v1.8.0/go.mod h1:slnHH3OZsQmZx/DRKhxvvaGE/8+n3Lkd6363h1ev71E=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/Psiphon-Inc/rotate-safe-writer v0.0.0-20210303140923-464a7a37606e h1:NPfqIbzmijrl0VclX2t8eO5EPBhqe47LLGKpRrcVjXk=
Expand Down Expand Up @@ -162,6 +166,8 @@ github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI
github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc=
github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y=
github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs=
Expand Down Expand Up @@ -228,13 +234,17 @@ github.com/refraction-networking/obfs4 v0.1.2 h1:J842O4fGSkd2W8ogYj0KN6gqVVY+Cpq
github.com/refraction-networking/obfs4 v0.1.2/go.mod h1:wAl/+gWiLsrcykJA3nKJHx89f5/gXGM8UKvty7+mvbM=
github.com/refraction-networking/utls v1.3.3 h1:f/TBLX7KBciRyFH3bwupp+CE4fzoYKCirhdRcC490sw=
github.com/refraction-networking/utls v1.3.3/go.mod h1:DlecWW1LMlMJu+9qpzzQqdHDT/C2LAe03EdpLUz/RL8=
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg=
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s=
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 h1:7YvPJVmEeFHR1Tj9sZEYsmarJEQfMVYpd/Vyy/A8dqE=
github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507 h1:ML7ZNtcln5UBo5Wv7RIv9Xg3Pr5VuRCWLFXEwda54Y4=
github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507/go.mod h1:DbI1gxrXI2jRGw7XGEUZQOOMd6PsnKzRrCKabvvMrwM=
github.com/shadowsocks/go-shadowsocks2 v0.1.5 h1:PDSQv9y2S85Fl7VBeOMF9StzeXZyK1HakRm86CUbr28=
github.com/shadowsocks/go-shadowsocks2 v0.1.5/go.mod h1:AGGpIoek4HRno4xzyFiAtLHkOpcoznZEkAccaI/rplM=
github.com/shirou/gopsutil/v4 v4.24.5 h1:gGsArG5K6vmsh5hcFOHaPm87UD003CaDMkAOweSQjhM=
github.com/shirou/gopsutil/v4 v4.24.5/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
Expand Down Expand Up @@ -294,6 +304,7 @@ go4.org/netipx v0.0.0-20230824141953-6213f710f925 h1:eeQDDVKFkx0g4Hyy8pHgmZaK0Eq
go4.org/netipx v0.0.0-20230824141953-6213f710f925/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
Expand All @@ -302,8 +313,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e h1:723BNChdd0c2Wk6WOE320qGBiPtYx0F0Bbm1kriShfE=
golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
Expand Down Expand Up @@ -331,15 +342,16 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand All @@ -363,6 +375,7 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
Expand Down Expand Up @@ -391,8 +404,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8=
golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk=
golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Expand Down
20 changes: 19 additions & 1 deletion psiphon/common/parameters/parameters.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,10 @@ const (
OSSHPrefixSplitMaxDelay = "OSSHPrefixSplitMaxDelay"
OSSHPrefixEnableFragmentor = "OSSHPrefixEnableFragmentor"
ServerOSSHPrefixSpecs = "ServerOSSHPrefixSpecs"
ShadowsocksPrefixSpecs = "ShadowsocksPrefixSpecs"
ShadowsocksPrefixScopedSpecNames = "ShadowsocksPrefixScopedSpecNames"
ShadowsocksPrefixProbability = "ShadowsocksPrefixProbability"
ReplayShadowsocksPrefix = "ReplayShadowsocksPrefix"
TLSTunnelObfuscatedPSKProbability = "TLSTunnelObfuscatedPSKProbability"
TLSTunnelTrafficShapingProbability = "TLSTunnelTrafficShapingProbability"
TLSTunnelMinTLSPadding = "TLSTunnelMinTLSPadding"
Expand Down Expand Up @@ -748,6 +752,7 @@ var defaultParameters = map[string]struct {
ReplayHTTPTransformerParameters: {value: true},
ReplayOSSHSeedTransformerParameters: {value: true},
ReplayOSSHPrefix: {value: true},
ReplayShadowsocksPrefix: {value: true},
ReplayTLSFragmentClientHello: {value: true},
ReplayInproxyWebRTC: {value: true},
ReplayInproxySTUN: {value: true},
Expand Down Expand Up @@ -914,6 +919,10 @@ var defaultParameters = map[string]struct {
OSSHPrefixEnableFragmentor: {value: false},
ServerOSSHPrefixSpecs: {value: transforms.Specs{}, flags: serverSideOnly},

ShadowsocksPrefixSpecs: {value: transforms.Specs{}},
ShadowsocksPrefixScopedSpecNames: {value: transforms.ScopedSpecNames{}},
ShadowsocksPrefixProbability: {value: 0.0, minimum: 0.0},

// TLSTunnelMinTLSPadding/TLSTunnelMaxTLSPadding are subject to TLS server limitations.

TLSTunnelObfuscatedPSKProbability: {value: 0.5, minimum: 0.0},
Expand Down Expand Up @@ -1275,6 +1284,13 @@ func (p *Parameters) Set(
}
osshPrefixSpecs, _ := osshPrefixSpecsValue.(transforms.Specs)

shadowsocksPrefixSpecsValue, err := getAppliedValue(
ShadowsocksPrefixSpecs, parameters, applyParameters)
if err != nil {
return nil, errors.Trace(err)
}
shadowsocksPrefixSpecs, _ := shadowsocksPrefixSpecsValue.(transforms.Specs)

// Special case: in-proxy broker public keys in InproxyBrokerSpecs must
// appear in InproxyAllBrokerPublicKeys; and inproxy common compartment
// IDs must appear in InproxyAllCommonCompartmentIDs. This check is
Expand Down Expand Up @@ -1503,7 +1519,7 @@ func (p *Parameters) Set(
}

prefixMode := false
if name == OSSHPrefixSpecs || name == ServerOSSHPrefixSpecs {
if name == OSSHPrefixSpecs || name == ServerOSSHPrefixSpecs || name == ShadowsocksPrefixSpecs {
prefixMode = true
}
err := v.Validate(prefixMode)
Expand All @@ -1528,6 +1544,8 @@ func (p *Parameters) Set(
specs = obfuscatedQuicNonceTransformSpecs
} else if name == OSSHPrefixScopedSpecNames {
specs = osshPrefixSpecs
} else if name == ShadowsocksPrefixScopedSpecNames {
specs = shadowsocksPrefixSpecs
}

err := v.Validate(specs)
Expand Down
6 changes: 5 additions & 1 deletion psiphon/common/protocol/packed.go
Original file line number Diff line number Diff line change
Expand Up @@ -827,7 +827,11 @@ func init() {
{165, "inproxy_broker_is_reuse", intConverter},
{166, "inproxy_webrtc_use_media_streams", intConverter},

// Next key value = 167
// Specs: server.baseDialParams

{167, "shadowsocks_prefix", nil},

// Next key value = 168
}

for _, spec := range packedAPIParameterSpecs {
Expand Down
16 changes: 13 additions & 3 deletions psiphon/common/protocol/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const (
TUNNEL_PROTOCOL_SSH = "SSH"
TUNNEL_PROTOCOL_OBFUSCATED_SSH = "OSSH"
TUNNEL_PROTOCOL_TLS_OBFUSCATED_SSH = "TLS-OSSH"
TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH = "SHADOWSOCKS-OSSH"
TUNNEL_PROTOCOL_UNFRONTED_MEEK = "UNFRONTED-MEEK-OSSH"
TUNNEL_PROTOCOL_UNFRONTED_MEEK_HTTPS = "UNFRONTED-MEEK-HTTPS-OSSH"
TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET = "UNFRONTED-MEEK-SESSION-TICKET-OSSH"
Expand Down Expand Up @@ -198,6 +199,7 @@ var SupportedTunnelProtocols = TunnelProtocols{
TUNNEL_PROTOCOL_FRONTED_MEEK_QUIC_OBFUSCATED_SSH,
TUNNEL_PROTOCOL_TAPDANCE_OBFUSCATED_SSH,
TUNNEL_PROTOCOL_CONJURE_OBFUSCATED_SSH,
TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH,
}

var DefaultDisabledTunnelProtocols = TunnelProtocols{
Expand Down Expand Up @@ -355,6 +357,11 @@ func TunnelProtocolUsesConjure(protocol string) bool {
return protocol == TUNNEL_PROTOCOL_CONJURE_OBFUSCATED_SSH
}

func TunnelProtocolUsesShadowsocks(protocol string) bool {
protocol = TunnelProtocolMinusInproxy(protocol)
return protocol == TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH
}

func TunnelProtocolIsResourceIntensive(protocol string) bool {
return TunnelProtocolUsesMeek(protocol) ||
TunnelProtocolUsesQUIC(protocol) ||
Expand All @@ -372,7 +379,8 @@ func TunnelProtocolIsCompatibleWithFragmentor(protocol string) bool {
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET ||
protocol == TUNNEL_PROTOCOL_FRONTED_MEEK ||
protocol == TUNNEL_PROTOCOL_FRONTED_MEEK_HTTP ||
protocol == TUNNEL_PROTOCOL_CONJURE_OBFUSCATED_SSH
protocol == TUNNEL_PROTOCOL_CONJURE_OBFUSCATED_SSH ||
protocol == TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH
}

func TunnelProtocolIsDirect(protocol string) bool {
Expand All @@ -382,7 +390,8 @@ func TunnelProtocolIsDirect(protocol string) bool {
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK ||
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK_HTTPS ||
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET ||
protocol == TUNNEL_PROTOCOL_QUIC_OBFUSCATED_SSH
protocol == TUNNEL_PROTOCOL_QUIC_OBFUSCATED_SSH ||
protocol == TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH
}

func TunnelProtocolRequiresTLS12SessionTickets(protocol string) bool {
Expand Down Expand Up @@ -419,7 +428,8 @@ func TunnelProtocolMayUseServerPacketManipulation(protocol string) bool {
protocol == TUNNEL_PROTOCOL_TLS_OBFUSCATED_SSH ||
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK ||
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK_HTTPS ||
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET
protocol == TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET ||
protocol == TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH
}

func TunnelProtocolMayUseClientBPF(protocol string) bool {
Expand Down
10 changes: 10 additions & 0 deletions psiphon/common/protocol/serverEntry.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ type ServerEntry struct {
SshObfuscatedTapDancePort int `json:"sshObfuscatedTapdancePort,omitempty"`
SshObfuscatedConjurePort int `json:"sshObfuscatedConjurePort,omitempty"`
SshObfuscatedKey string `json:"sshObfuscatedKey,omitempty"`
SshShadowsocksPort int `json:"sshShadowsocksPort,omitempty"`
SshShadowsocksKey string `json:"sshShadowsocksKey,omitempty"`
Capabilities []string `json:"capabilities,omitempty"`
Region string `json:"region,omitempty"`
ProviderID string `json:"providerID,omitempty"`
Expand All @@ -84,13 +86,15 @@ type ServerEntry struct {
DisableObfuscatedQUICTransforms bool `json:"disableObfuscatedQUICTransforms,omitempty"`
DisableOSSHTransforms bool `json:"disableOSSHTransforms,omitempty"`
DisableOSSHPrefix bool `json:"disableOSSHPrefix,omitempty"`
DisableShadowsocksPrefix bool `json:"disableShadowsocksPrefix,omitempty"`
InproxySessionPublicKey string `json:"inproxySessionPublicKey,omitempty"`
InproxySessionRootObfuscationSecret string `json:"inproxySessionRootObfuscationSecret,omitempty"`
InproxySSHPort int `json:"inproxySSHPort,omitempty"`
InproxyOSSHPort int `json:"inproxyOSSHPort,omitempty"`
InproxyQUICPort int `json:"inproxyQUICPort,omitempty"`
InproxyMeekPort int `json:"inproxyMeekPort,omitempty"`
InproxyTlsOSSHPort int `json:"inproxyTlsOSSHPort,omitempty"`
InproxyShadowsocksPort int `json:"inproxyShadowsocksPort,omitempty"`

// These local fields are not expected to be present in downloaded server
// entries. They are added by the client to record and report stats about
Expand Down Expand Up @@ -750,6 +754,9 @@ func (serverEntry *ServerEntry) GetDialPortNumber(tunnelProtocol string) (int, e
TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET,
TUNNEL_PROTOCOL_UNFRONTED_MEEK:
return serverEntry.MeekServerPort, nil

case TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH:
return serverEntry.SshShadowsocksPort, nil
}

} else {
Expand Down Expand Up @@ -786,6 +793,9 @@ func (serverEntry *ServerEntry) GetDialPortNumber(tunnelProtocol string) (int, e
TUNNEL_PROTOCOL_UNFRONTED_MEEK_SESSION_TICKET,
TUNNEL_PROTOCOL_UNFRONTED_MEEK:
return serverEntry.InproxyMeekPort, nil

case TUNNEL_PROTOCOL_SHADOWSOCKS_OSSH:
return serverEntry.InproxyShadowsocksPort, nil
}

}
Expand Down
Loading

0 comments on commit 002e8a5

Please sign in to comment.