server.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package encoding
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/md5"
  6. "hash/fnv"
  7. "io"
  8. "golang.org/x/crypto/chacha20poly1305"
  9. "v2ray.com/core/common/buf"
  10. "v2ray.com/core/common/crypto"
  11. "v2ray.com/core/common/errors"
  12. "v2ray.com/core/app/log"
  13. "v2ray.com/core/common/net"
  14. "v2ray.com/core/common/protocol"
  15. "v2ray.com/core/common/serial"
  16. "v2ray.com/core/proxy/vmess"
  17. )
  18. type ServerSession struct {
  19. userValidator protocol.UserValidator
  20. requestBodyKey []byte
  21. requestBodyIV []byte
  22. responseBodyKey []byte
  23. responseBodyIV []byte
  24. responseHeader byte
  25. responseWriter io.Writer
  26. }
  27. // NewServerSession creates a new ServerSession, using the given UserValidator.
  28. // The ServerSession instance doesn't take ownership of the validator.
  29. func NewServerSession(validator protocol.UserValidator) *ServerSession {
  30. return &ServerSession{
  31. userValidator: validator,
  32. }
  33. }
  34. func (v *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.RequestHeader, error) {
  35. buffer := make([]byte, 512)
  36. _, err := io.ReadFull(reader, buffer[:protocol.IDBytesLen])
  37. if err != nil {
  38. log.Info("VMess|Server: Failed to read request header: ", err)
  39. return nil, io.EOF
  40. }
  41. user, timestamp, valid := v.userValidator.Get(buffer[:protocol.IDBytesLen])
  42. if !valid {
  43. return nil, errors.New("VMess|Server: Invalid user.")
  44. }
  45. timestampHash := md5.New()
  46. timestampHash.Write(hashTimestamp(timestamp))
  47. iv := timestampHash.Sum(nil)
  48. account, err := user.GetTypedAccount()
  49. if err != nil {
  50. return nil, errors.Base(err).Message("VMess|Server: Failed to get user account.")
  51. }
  52. aesStream := crypto.NewAesDecryptionStream(account.(*vmess.InternalAccount).ID.CmdKey(), iv)
  53. decryptor := crypto.NewCryptionReader(aesStream, reader)
  54. nBytes, err := io.ReadFull(decryptor, buffer[:41])
  55. if err != nil {
  56. return nil, errors.Base(err).Message("VMess|Server: Failed to read request header.")
  57. }
  58. bufferLen := nBytes
  59. request := &protocol.RequestHeader{
  60. User: user,
  61. Version: buffer[0],
  62. }
  63. if request.Version != Version {
  64. return nil, errors.New("VMess|Server: Invalid protocol version ", request.Version)
  65. }
  66. v.requestBodyIV = append([]byte(nil), buffer[1:17]...) // 16 bytes
  67. v.requestBodyKey = append([]byte(nil), buffer[17:33]...) // 16 bytes
  68. v.responseHeader = buffer[33] // 1 byte
  69. request.Option = protocol.RequestOption(buffer[34]) // 1 byte
  70. padingLen := int(buffer[35] >> 4)
  71. request.Security = protocol.NormSecurity(protocol.Security(buffer[35] & 0x0F))
  72. // 1 bytes reserved
  73. request.Command = protocol.RequestCommand(buffer[37])
  74. request.Port = net.PortFromBytes(buffer[38:40])
  75. switch buffer[40] {
  76. case AddrTypeIPv4:
  77. _, err = io.ReadFull(decryptor, buffer[41:45]) // 4 bytes
  78. bufferLen += 4
  79. if err != nil {
  80. return nil, errors.Base(err).Message("VMess|Server: Failed to read IPv4.")
  81. }
  82. request.Address = net.IPAddress(buffer[41:45])
  83. case AddrTypeIPv6:
  84. _, err = io.ReadFull(decryptor, buffer[41:57]) // 16 bytes
  85. bufferLen += 16
  86. if err != nil {
  87. return nil, errors.Base(err).Message("VMess|Server: Failed to read IPv6 address.")
  88. }
  89. request.Address = net.IPAddress(buffer[41:57])
  90. case AddrTypeDomain:
  91. _, err = io.ReadFull(decryptor, buffer[41:42])
  92. if err != nil {
  93. return nil, errors.Base(err).Message("VMess:Server: Failed to read domain.")
  94. }
  95. domainLength := int(buffer[41])
  96. if domainLength == 0 {
  97. return nil, errors.New("VMess|Server: Zero length domain.")
  98. }
  99. _, err = io.ReadFull(decryptor, buffer[42:42+domainLength])
  100. if err != nil {
  101. return nil, errors.Base(err).Message("VMess|Server: Failed to read domain.")
  102. }
  103. bufferLen += 1 + domainLength
  104. request.Address = net.DomainAddress(string(buffer[42 : 42+domainLength]))
  105. }
  106. if padingLen > 0 {
  107. _, err = io.ReadFull(decryptor, buffer[bufferLen:bufferLen+padingLen])
  108. if err != nil {
  109. return nil, errors.New("VMess|Server: Failed to read padding.")
  110. }
  111. bufferLen += padingLen
  112. }
  113. _, err = io.ReadFull(decryptor, buffer[bufferLen:bufferLen+4])
  114. if err != nil {
  115. return nil, errors.Base(err).Message("VMess|Server: Failed to read checksum.")
  116. }
  117. fnv1a := fnv.New32a()
  118. fnv1a.Write(buffer[:bufferLen])
  119. actualHash := fnv1a.Sum32()
  120. expectedHash := serial.BytesToUint32(buffer[bufferLen : bufferLen+4])
  121. if actualHash != expectedHash {
  122. return nil, errors.New("VMess|Server: Invalid auth.")
  123. }
  124. if request.Address == nil {
  125. return nil, errors.New("VMess|Server: Invalid remote address.")
  126. }
  127. return request, nil
  128. }
  129. func (v *ServerSession) DecodeRequestBody(request *protocol.RequestHeader, reader io.Reader) buf.Reader {
  130. var authReader io.Reader
  131. if request.Security.Is(protocol.SecurityType_NONE) {
  132. if request.Option.Has(protocol.RequestOptionChunkStream) {
  133. auth := &crypto.AEADAuthenticator{
  134. AEAD: NoOpAuthenticator{},
  135. NonceGenerator: crypto.NoOpBytesGenerator{},
  136. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  137. }
  138. authReader = crypto.NewAuthenticationReader(auth, reader)
  139. } else {
  140. authReader = reader
  141. }
  142. } else if request.Security.Is(protocol.SecurityType_LEGACY) {
  143. aesStream := crypto.NewAesDecryptionStream(v.requestBodyKey, v.requestBodyIV)
  144. cryptionReader := crypto.NewCryptionReader(aesStream, reader)
  145. if request.Option.Has(protocol.RequestOptionChunkStream) {
  146. auth := &crypto.AEADAuthenticator{
  147. AEAD: new(FnvAuthenticator),
  148. NonceGenerator: crypto.NoOpBytesGenerator{},
  149. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  150. }
  151. authReader = crypto.NewAuthenticationReader(auth, cryptionReader)
  152. } else {
  153. authReader = cryptionReader
  154. }
  155. } else if request.Security.Is(protocol.SecurityType_AES128_GCM) {
  156. block, _ := aes.NewCipher(v.requestBodyKey)
  157. aead, _ := cipher.NewGCM(block)
  158. auth := &crypto.AEADAuthenticator{
  159. AEAD: aead,
  160. NonceGenerator: &ChunkNonceGenerator{
  161. Nonce: append([]byte(nil), v.requestBodyIV...),
  162. Size: aead.NonceSize(),
  163. },
  164. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  165. }
  166. authReader = crypto.NewAuthenticationReader(auth, reader)
  167. } else if request.Security.Is(protocol.SecurityType_CHACHA20_POLY1305) {
  168. aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(v.requestBodyKey))
  169. auth := &crypto.AEADAuthenticator{
  170. AEAD: aead,
  171. NonceGenerator: &ChunkNonceGenerator{
  172. Nonce: append([]byte(nil), v.requestBodyIV...),
  173. Size: aead.NonceSize(),
  174. },
  175. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  176. }
  177. authReader = crypto.NewAuthenticationReader(auth, reader)
  178. }
  179. return buf.NewReader(authReader)
  180. }
  181. func (v *ServerSession) EncodeResponseHeader(header *protocol.ResponseHeader, writer io.Writer) {
  182. responseBodyKey := md5.Sum(v.requestBodyKey)
  183. responseBodyIV := md5.Sum(v.requestBodyIV)
  184. v.responseBodyKey = responseBodyKey[:]
  185. v.responseBodyIV = responseBodyIV[:]
  186. aesStream := crypto.NewAesEncryptionStream(v.responseBodyKey, v.responseBodyIV)
  187. encryptionWriter := crypto.NewCryptionWriter(aesStream, writer)
  188. v.responseWriter = encryptionWriter
  189. encryptionWriter.Write([]byte{v.responseHeader, byte(header.Option)})
  190. err := MarshalCommand(header.Command, encryptionWriter)
  191. if err != nil {
  192. encryptionWriter.Write([]byte{0x00, 0x00})
  193. }
  194. }
  195. func (v *ServerSession) EncodeResponseBody(request *protocol.RequestHeader, writer io.Writer) buf.Writer {
  196. var authWriter io.Writer
  197. if request.Security.Is(protocol.SecurityType_NONE) {
  198. if request.Option.Has(protocol.RequestOptionChunkStream) {
  199. auth := &crypto.AEADAuthenticator{
  200. AEAD: new(FnvAuthenticator),
  201. NonceGenerator: crypto.NoOpBytesGenerator{},
  202. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  203. }
  204. authWriter = crypto.NewAuthenticationWriter(auth, writer)
  205. } else {
  206. authWriter = writer
  207. }
  208. } else if request.Security.Is(protocol.SecurityType_LEGACY) {
  209. if request.Option.Has(protocol.RequestOptionChunkStream) {
  210. auth := &crypto.AEADAuthenticator{
  211. AEAD: new(FnvAuthenticator),
  212. NonceGenerator: crypto.NoOpBytesGenerator{},
  213. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  214. }
  215. authWriter = crypto.NewAuthenticationWriter(auth, v.responseWriter)
  216. } else {
  217. authWriter = v.responseWriter
  218. }
  219. } else if request.Security.Is(protocol.SecurityType_AES128_GCM) {
  220. block, _ := aes.NewCipher(v.responseBodyKey)
  221. aead, _ := cipher.NewGCM(block)
  222. auth := &crypto.AEADAuthenticator{
  223. AEAD: aead,
  224. NonceGenerator: &ChunkNonceGenerator{
  225. Nonce: append([]byte(nil), v.responseBodyIV...),
  226. Size: aead.NonceSize(),
  227. },
  228. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  229. }
  230. authWriter = crypto.NewAuthenticationWriter(auth, writer)
  231. } else if request.Security.Is(protocol.SecurityType_CHACHA20_POLY1305) {
  232. aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(v.responseBodyKey))
  233. auth := &crypto.AEADAuthenticator{
  234. AEAD: aead,
  235. NonceGenerator: &ChunkNonceGenerator{
  236. Nonce: append([]byte(nil), v.responseBodyIV...),
  237. Size: aead.NonceSize(),
  238. },
  239. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  240. }
  241. authWriter = crypto.NewAuthenticationWriter(auth, writer)
  242. }
  243. return buf.NewWriter(authWriter)
  244. }