protocol.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package shadowsocks
  2. import (
  3. "io"
  4. "github.com/v2ray/v2ray-core/common/alloc"
  5. "github.com/v2ray/v2ray-core/common/log"
  6. v2net "github.com/v2ray/v2ray-core/common/net"
  7. "github.com/v2ray/v2ray-core/common/serial"
  8. "github.com/v2ray/v2ray-core/transport"
  9. )
  10. const (
  11. AddrTypeIPv4 = 1
  12. AddrTypeIPv6 = 4
  13. AddrTypeDomain = 3
  14. )
  15. type Request struct {
  16. Address v2net.Address
  17. Port v2net.Port
  18. OTA bool
  19. }
  20. func ReadRequest(reader io.Reader, auth *Authenticator) (*Request, error) {
  21. buffer := alloc.NewSmallBuffer()
  22. defer buffer.Release()
  23. _, err := io.ReadFull(reader, buffer.Value[:1])
  24. if err != nil {
  25. log.Error("Shadowsocks: Failed to read address type: ", err)
  26. return nil, transport.CorruptedPacket
  27. }
  28. lenBuffer := 1
  29. request := new(Request)
  30. addrType := (buffer.Value[0] & 0x0F)
  31. if (buffer.Value[0] & 0x10) == 0x10 {
  32. request.OTA = true
  33. }
  34. switch addrType {
  35. case AddrTypeIPv4:
  36. _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+4])
  37. if err != nil {
  38. log.Error("Shadowsocks: Failed to read IPv4 address: ", err)
  39. return nil, transport.CorruptedPacket
  40. }
  41. request.Address = v2net.IPAddress(buffer.Value[lenBuffer : lenBuffer+4])
  42. lenBuffer += 4
  43. case AddrTypeIPv6:
  44. _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+16])
  45. if err != nil {
  46. log.Error("Shadowsocks: Failed to read IPv6 address: ", err)
  47. return nil, transport.CorruptedPacket
  48. }
  49. request.Address = v2net.IPAddress(buffer.Value[lenBuffer : lenBuffer+16])
  50. lenBuffer += 16
  51. case AddrTypeDomain:
  52. _, err := io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+1])
  53. if err != nil {
  54. log.Error("Shadowsocks: Failed to read domain lenth: ", err)
  55. return nil, transport.CorruptedPacket
  56. }
  57. domainLength := int(buffer.Value[lenBuffer])
  58. lenBuffer++
  59. _, err = io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+domainLength])
  60. if err != nil {
  61. log.Error("Shadowsocks: Failed to read domain: ", err)
  62. return nil, transport.CorruptedPacket
  63. }
  64. request.Address = v2net.DomainAddress(string(buffer.Value[lenBuffer : lenBuffer+domainLength]))
  65. lenBuffer += domainLength
  66. default:
  67. log.Error("Shadowsocks: Unknown address type: ", addrType)
  68. return nil, transport.CorruptedPacket
  69. }
  70. _, err = io.ReadFull(reader, buffer.Value[lenBuffer:lenBuffer+2])
  71. if err != nil {
  72. log.Error("Shadowsocks: Failed to read port: ", err)
  73. return nil, transport.CorruptedPacket
  74. }
  75. request.Port = v2net.PortFromBytes(buffer.Value[lenBuffer : lenBuffer+2])
  76. lenBuffer += 2
  77. if request.OTA {
  78. authBytes := buffer.Value[lenBuffer : lenBuffer+auth.AuthSize()]
  79. _, err = io.ReadFull(reader, authBytes)
  80. if err != nil {
  81. log.Error("Shadowsocks: Failed to read OTA: ", err)
  82. return nil, transport.CorruptedPacket
  83. }
  84. actualAuth := auth.Authenticate(nil, buffer.Value[0:lenBuffer])
  85. if !serial.BytesLiteral(actualAuth).Equals(serial.BytesLiteral(authBytes)) {
  86. log.Error("Shadowsocks: Invalid OTA: ", actualAuth)
  87. return nil, transport.CorruptedPacket
  88. }
  89. }
  90. return request, nil
  91. }