protocol.go 11 KB

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