protocol.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. package shadowsocks
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "v2ray.com/core/common/alloc"
  7. "v2ray.com/core/common/crypto"
  8. "v2ray.com/core/common/errors"
  9. v2io "v2ray.com/core/common/io"
  10. v2net "v2ray.com/core/common/net"
  11. "v2ray.com/core/common/protocol"
  12. )
  13. const (
  14. Version = 1
  15. RequestOptionOneTimeAuth = protocol.RequestOption(101)
  16. AddrTypeIPv4 = 1
  17. AddrTypeIPv6 = 4
  18. AddrTypeDomain = 3
  19. )
  20. func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHeader, v2io.Reader, error) {
  21. rawAccount, err := user.GetTypedAccount()
  22. if err != nil {
  23. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to parse account.")
  24. }
  25. account := rawAccount.(*ShadowsocksAccount)
  26. buffer := alloc.NewLocalBuffer(512)
  27. defer buffer.Release()
  28. ivLen := account.Cipher.IVSize()
  29. _, err = io.ReadFull(reader, buffer.Value[:ivLen])
  30. if err != nil {
  31. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IV.")
  32. }
  33. iv := append([]byte(nil), buffer.Value[:ivLen]...)
  34. stream, err := account.Cipher.NewDecodingStream(account.Key, iv)
  35. if err != nil {
  36. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to initialize decoding stream.")
  37. }
  38. reader = crypto.NewCryptionReader(stream, reader)
  39. authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
  40. request := &protocol.RequestHeader{
  41. Version: Version,
  42. User: user,
  43. Command: protocol.RequestCommandTCP,
  44. }
  45. lenBuffer := 1
  46. _, err = io.ReadFull(reader, buffer.Value[:1])
  47. if err != nil {
  48. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read address type.")
  49. }
  50. addrType := (buffer.Value[0] & 0x0F)
  51. if (buffer.Value[0] & 0x10) == 0x10 {
  52. request.Option |= RequestOptionOneTimeAuth
  53. }
  54. if request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Disabled {
  55. return nil, nil, errors.New("Shadowsocks|TCP: Rejecting connection with OTA enabled, while server disables OTA.")
  56. }
  57. if !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled {
  58. return nil, nil, errors.New("Shadowsocks|TCP: Rejecting connection with OTA disabled, while server enables OTA.")
  59. }
  60. switch addrType {
  61. case AddrTypeIPv4:
  62. _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+4])
  63. if err != nil {
  64. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IPv4 address.")
  65. }
  66. request.Address = v2net.IPAddress(buffer.Value[lenBuffer : lenBuffer+4])
  67. lenBuffer += 4
  68. case AddrTypeIPv6:
  69. _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+16])
  70. if err != nil {
  71. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read IPv6 address.")
  72. }
  73. request.Address = v2net.IPAddress(buffer.Value[lenBuffer : lenBuffer+16])
  74. lenBuffer += 16
  75. case AddrTypeDomain:
  76. _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+1])
  77. if err != nil {
  78. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read domain lenth.")
  79. }
  80. domainLength := int(buffer.Value[lenBuffer])
  81. lenBuffer++
  82. _, err = io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+domainLength])
  83. if err != nil {
  84. return nil, nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to read domain.")
  85. }
  86. request.Address = v2net.DomainAddress(string(buffer.Value[lenBuffer : lenBuffer+domainLength]))
  87. lenBuffer += domainLength
  88. default:
  89. return nil, nil, errors.New("Shadowsocks|TCP: Unknown address type: ", addrType)
  90. }
  91. _, err = io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+2])
  92. if err != nil {
  93. return nil, nil, errors.New("Shadowsocks|TCP: Failed to read port: " + err.Error())
  94. }
  95. request.Port = v2net.PortFromBytes(buffer.Value[lenBuffer : lenBuffer+2])
  96. lenBuffer += 2
  97. if request.Option.Has(RequestOptionOneTimeAuth) {
  98. authBytes := buffer.Value[lenBuffer : lenBuffer+AuthSize]
  99. _, err = io.ReadFull(reader, authBytes)
  100. if err != nil {
  101. return nil, nil, errors.New("Shadowsocks|TCP: Failed to read OTA: " + err.Error())
  102. }
  103. actualAuth := authenticator.Authenticate(nil, buffer.Value[0:lenBuffer])
  104. if !bytes.Equal(actualAuth, authBytes) {
  105. return nil, nil, errors.New("Shadowsocks|TCP: Invalid OTA")
  106. }
  107. }
  108. var chunkReader v2io.Reader
  109. if request.Option.Has(RequestOptionOneTimeAuth) {
  110. chunkReader = NewChunkReader(reader, NewAuthenticator(ChunkKeyGenerator(iv)))
  111. } else {
  112. chunkReader = v2io.NewAdaptiveReader(reader)
  113. }
  114. return request, chunkReader, nil
  115. }
  116. func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (v2io.Writer, error) {
  117. user := request.User
  118. rawAccount, err := user.GetTypedAccount()
  119. if err != nil {
  120. return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to parse account.")
  121. }
  122. account := rawAccount.(*ShadowsocksAccount)
  123. iv := make([]byte, account.Cipher.IVSize())
  124. rand.Read(iv)
  125. _, err = writer.Write(iv)
  126. if err != nil {
  127. return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to write IV.")
  128. }
  129. stream, err := account.Cipher.NewEncodingStream(account.Key, iv)
  130. if err != nil {
  131. return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to create encoding stream.")
  132. }
  133. writer = crypto.NewCryptionWriter(stream, writer)
  134. header := alloc.NewLocalBuffer(512).Clear()
  135. switch request.Address.Family() {
  136. case v2net.AddressFamilyIPv4:
  137. header.AppendBytes(AddrTypeIPv4)
  138. header.Append([]byte(request.Address.IP()))
  139. case v2net.AddressFamilyIPv6:
  140. header.AppendBytes(AddrTypeIPv6)
  141. header.Append([]byte(request.Address.IP()))
  142. case v2net.AddressFamilyDomain:
  143. header.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain())))
  144. header.Append([]byte(request.Address.Domain()))
  145. default:
  146. return nil, errors.New("Shadowsocks|TCP: Unsupported address type: ", request.Address.Family())
  147. }
  148. header.AppendUint16(uint16(request.Port))
  149. if request.Option.Has(RequestOptionOneTimeAuth) {
  150. header.Value[0] |= 0x10
  151. authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
  152. header.Value = authenticator.Authenticate(header.Value, header.Value)
  153. }
  154. _, err = writer.Write(header.Value)
  155. if err != nil {
  156. return nil, errors.Base(err).Message("Shadowsocks|TCP: Failed to write header.")
  157. }
  158. var chunkWriter v2io.Writer
  159. if request.Option.Has(RequestOptionOneTimeAuth) {
  160. chunkWriter = NewChunkWriter(writer, NewAuthenticator(ChunkKeyGenerator(iv)))
  161. } else {
  162. chunkWriter = v2io.NewAdaptiveWriter(writer)
  163. }
  164. return chunkWriter, nil
  165. }
  166. func ReadTCPResponse(user *protocol.User, reader io.Reader) (v2io.Reader, error) {
  167. rawAccount, err := user.GetTypedAccount()
  168. if err != nil {
  169. return nil, errors.New("Shadowsocks|TCP: Failed to parse account: " + err.Error())
  170. }
  171. account := rawAccount.(*ShadowsocksAccount)
  172. iv := make([]byte, account.Cipher.IVSize())
  173. _, err = io.ReadFull(reader, iv)
  174. if err != nil {
  175. return nil, errors.New("Shadowsocks|TCP: Failed to read IV: " + err.Error())
  176. }
  177. stream, err := account.Cipher.NewDecodingStream(account.Key, iv)
  178. if err != nil {
  179. return nil, errors.New("Shadowsocks|TCP: Failed to initialize decoding stream: " + err.Error())
  180. }
  181. return v2io.NewAdaptiveReader(crypto.NewCryptionReader(stream, reader)), nil
  182. }
  183. func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (v2io.Writer, error) {
  184. user := request.User
  185. rawAccount, err := user.GetTypedAccount()
  186. if err != nil {
  187. return nil, errors.New("Shadowsocks|TCP: Failed to parse account: " + err.Error())
  188. }
  189. account := rawAccount.(*ShadowsocksAccount)
  190. iv := make([]byte, account.Cipher.IVSize())
  191. rand.Read(iv)
  192. _, err = writer.Write(iv)
  193. if err != nil {
  194. return nil, errors.New("Shadowsocks|TCP: Failed to write IV: " + err.Error())
  195. }
  196. stream, err := account.Cipher.NewEncodingStream(account.Key, iv)
  197. if err != nil {
  198. return nil, errors.New("Shadowsocks|TCP: Failed to create encoding stream: " + err.Error())
  199. }
  200. return v2io.NewAdaptiveWriter(crypto.NewCryptionWriter(stream, writer)), nil
  201. }
  202. func EncodeUDPPacket(request *protocol.RequestHeader, payload *alloc.Buffer) (*alloc.Buffer, error) {
  203. user := request.User
  204. rawAccount, err := user.GetTypedAccount()
  205. if err != nil {
  206. return nil, errors.New("Shadowsocks|UDP: Failed to parse account: " + err.Error())
  207. }
  208. account := rawAccount.(*ShadowsocksAccount)
  209. buffer := alloc.NewSmallBuffer()
  210. ivLen := account.Cipher.IVSize()
  211. buffer.Slice(0, ivLen)
  212. rand.Read(buffer.Value)
  213. iv := buffer.Value
  214. switch request.Address.Family() {
  215. case v2net.AddressFamilyIPv4:
  216. buffer.AppendBytes(AddrTypeIPv4)
  217. buffer.Append([]byte(request.Address.IP()))
  218. case v2net.AddressFamilyIPv6:
  219. buffer.AppendBytes(AddrTypeIPv6)
  220. buffer.Append([]byte(request.Address.IP()))
  221. case v2net.AddressFamilyDomain:
  222. buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain())))
  223. buffer.Append([]byte(request.Address.Domain()))
  224. default:
  225. return nil, errors.New("Shadowsocks|UDP: Unsupported address type. ")
  226. }
  227. buffer.AppendUint16(uint16(request.Port))
  228. buffer.Append(payload.Value)
  229. if request.Option.Has(RequestOptionOneTimeAuth) {
  230. authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
  231. buffer.Value[ivLen] |= 0x10
  232. buffer.Value = authenticator.Authenticate(buffer.Value, buffer.Value[ivLen:])
  233. }
  234. stream, err := account.Cipher.NewEncodingStream(account.Key, iv)
  235. if err != nil {
  236. return nil, errors.New("Shadowsocks|TCP: Failed to create encoding stream: " + err.Error())
  237. }
  238. stream.XORKeyStream(buffer.Value[ivLen:], buffer.Value[ivLen:])
  239. return buffer, nil
  240. }
  241. func DecodeUDPPacket(user *protocol.User, payload *alloc.Buffer) (*protocol.RequestHeader, *alloc.Buffer, error) {
  242. rawAccount, err := user.GetTypedAccount()
  243. if err != nil {
  244. return nil, nil, errors.New("Shadowsocks|UDP: Failed to parse account: " + err.Error())
  245. }
  246. account := rawAccount.(*ShadowsocksAccount)
  247. ivLen := account.Cipher.IVSize()
  248. iv := payload.Value[:ivLen]
  249. payload.SliceFrom(ivLen)
  250. stream, err := account.Cipher.NewDecodingStream(account.Key, iv)
  251. if err != nil {
  252. return nil, nil, errors.New("Shadowsocks|UDP: Failed to initialize decoding stream: " + err.Error())
  253. }
  254. stream.XORKeyStream(payload.Value, payload.Value)
  255. authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
  256. request := &protocol.RequestHeader{
  257. Version: Version,
  258. User: user,
  259. Command: protocol.RequestCommandUDP,
  260. }
  261. addrType := (payload.Value[0] & 0x0F)
  262. if (payload.Value[0] & 0x10) == 0x10 {
  263. request.Option |= RequestOptionOneTimeAuth
  264. }
  265. if request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Disabled {
  266. return nil, nil, errors.New("Shadowsocks|UDP: Rejecting packet with OTA enabled, while server disables OTA.")
  267. }
  268. if !request.Option.Has(RequestOptionOneTimeAuth) && account.OneTimeAuth == Account_Enabled {
  269. return nil, nil, errors.New("Shadowsocks|UDP: Rejecting packet with OTA disabled, while server enables OTA.")
  270. }
  271. if request.Option.Has(RequestOptionOneTimeAuth) {
  272. payloadLen := payload.Len() - AuthSize
  273. authBytes := payload.Value[payloadLen:]
  274. actualAuth := authenticator.Authenticate(nil, payload.Value[0:payloadLen])
  275. if !bytes.Equal(actualAuth, authBytes) {
  276. return nil, nil, errors.New("Shadowsocks|UDP: Invalid OTA.")
  277. }
  278. payload.Slice(0, payloadLen)
  279. }
  280. payload.SliceFrom(1)
  281. switch addrType {
  282. case AddrTypeIPv4:
  283. request.Address = v2net.IPAddress(payload.Value[:4])
  284. payload.SliceFrom(4)
  285. case AddrTypeIPv6:
  286. request.Address = v2net.IPAddress(payload.Value[:16])
  287. payload.SliceFrom(16)
  288. case AddrTypeDomain:
  289. domainLength := int(payload.Value[0])
  290. request.Address = v2net.DomainAddress(string(payload.Value[1 : 1+domainLength]))
  291. payload.SliceFrom(1 + domainLength)
  292. default:
  293. return nil, nil, errors.New("Shadowsocks|UDP: Unknown address type")
  294. }
  295. request.Port = v2net.PortFromBytes(payload.Value[:2])
  296. payload.SliceFrom(2)
  297. return request, payload, nil
  298. }
  299. type UDPReader struct {
  300. Reader io.Reader
  301. User *protocol.User
  302. }
  303. func (v *UDPReader) Read() (*alloc.Buffer, error) {
  304. buffer := alloc.NewSmallBuffer()
  305. nBytes, err := v.Reader.Read(buffer.Value)
  306. if err != nil {
  307. buffer.Release()
  308. return nil, err
  309. }
  310. buffer.Slice(0, nBytes)
  311. _, payload, err := DecodeUDPPacket(v.User, buffer)
  312. if err != nil {
  313. buffer.Release()
  314. return nil, err
  315. }
  316. return payload, nil
  317. }
  318. func (v *UDPReader) Release() {
  319. }
  320. type UDPWriter struct {
  321. Writer io.Writer
  322. Request *protocol.RequestHeader
  323. }
  324. func (v *UDPWriter) Write(buffer *alloc.Buffer) error {
  325. payload, err := EncodeUDPPacket(v.Request, buffer)
  326. if err != nil {
  327. return err
  328. }
  329. _, err = v.Writer.Write(payload.Value)
  330. payload.Release()
  331. return err
  332. }
  333. func (v *UDPWriter) Release() {
  334. }