server.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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/common/log"
  13. v2net "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 = v2net.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 = v2net.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 = v2net.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 = v2net.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. aggressive := (request.Command == protocol.RequestCommandTCP)
  131. var authReader io.Reader
  132. if request.Security.Is(protocol.SecurityType_NONE) {
  133. if request.Option.Has(protocol.RequestOptionChunkStream) {
  134. auth := &crypto.AEADAuthenticator{
  135. AEAD: new(FnvAuthenticator),
  136. NonceGenerator: crypto.NoOpBytesGenerator{},
  137. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  138. }
  139. authReader = crypto.NewAuthenticationReader(auth, reader, aggressive)
  140. } else {
  141. authReader = reader
  142. }
  143. } else if request.Security.Is(protocol.SecurityType_LEGACY) {
  144. aesStream := crypto.NewAesDecryptionStream(v.requestBodyKey, v.requestBodyIV)
  145. cryptionReader := crypto.NewCryptionReader(aesStream, reader)
  146. if request.Option.Has(protocol.RequestOptionChunkStream) {
  147. auth := &crypto.AEADAuthenticator{
  148. AEAD: new(FnvAuthenticator),
  149. NonceGenerator: crypto.NoOpBytesGenerator{},
  150. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  151. }
  152. authReader = crypto.NewAuthenticationReader(auth, cryptionReader, aggressive)
  153. } else {
  154. authReader = cryptionReader
  155. }
  156. } else if request.Security.Is(protocol.SecurityType_AES128_GCM) {
  157. block, _ := aes.NewCipher(v.requestBodyKey)
  158. aead, _ := cipher.NewGCM(block)
  159. auth := &crypto.AEADAuthenticator{
  160. AEAD: aead,
  161. NonceGenerator: &ChunkNonceGenerator{
  162. Nonce: append([]byte(nil), v.requestBodyIV...),
  163. Size: aead.NonceSize(),
  164. },
  165. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  166. }
  167. authReader = crypto.NewAuthenticationReader(auth, reader, aggressive)
  168. } else if request.Security.Is(protocol.SecurityType_CHACHA20_POLY1305) {
  169. aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(v.requestBodyKey))
  170. auth := &crypto.AEADAuthenticator{
  171. AEAD: aead,
  172. NonceGenerator: &ChunkNonceGenerator{
  173. Nonce: append([]byte(nil), v.requestBodyIV...),
  174. Size: aead.NonceSize(),
  175. },
  176. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  177. }
  178. authReader = crypto.NewAuthenticationReader(auth, reader, aggressive)
  179. }
  180. return buf.NewReader(authReader)
  181. }
  182. func (v *ServerSession) EncodeResponseHeader(header *protocol.ResponseHeader, writer io.Writer) {
  183. responseBodyKey := md5.Sum(v.requestBodyKey)
  184. responseBodyIV := md5.Sum(v.requestBodyIV)
  185. v.responseBodyKey = responseBodyKey[:]
  186. v.responseBodyIV = responseBodyIV[:]
  187. aesStream := crypto.NewAesEncryptionStream(v.responseBodyKey, v.responseBodyIV)
  188. encryptionWriter := crypto.NewCryptionWriter(aesStream, writer)
  189. v.responseWriter = encryptionWriter
  190. encryptionWriter.Write([]byte{v.responseHeader, byte(header.Option)})
  191. err := MarshalCommand(header.Command, encryptionWriter)
  192. if err != nil {
  193. encryptionWriter.Write([]byte{0x00, 0x00})
  194. }
  195. }
  196. func (v *ServerSession) EncodeResponseBody(request *protocol.RequestHeader, writer io.Writer) buf.Writer {
  197. var authWriter io.Writer
  198. if request.Security.Is(protocol.SecurityType_NONE) {
  199. if request.Option.Has(protocol.RequestOptionChunkStream) {
  200. auth := &crypto.AEADAuthenticator{
  201. AEAD: new(FnvAuthenticator),
  202. NonceGenerator: crypto.NoOpBytesGenerator{},
  203. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  204. }
  205. authWriter = crypto.NewAuthenticationWriter(auth, writer)
  206. } else {
  207. authWriter = writer
  208. }
  209. } else if request.Security.Is(protocol.SecurityType_LEGACY) {
  210. if request.Option.Has(protocol.RequestOptionChunkStream) {
  211. auth := &crypto.AEADAuthenticator{
  212. AEAD: new(FnvAuthenticator),
  213. NonceGenerator: crypto.NoOpBytesGenerator{},
  214. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  215. }
  216. authWriter = crypto.NewAuthenticationWriter(auth, v.responseWriter)
  217. } else {
  218. authWriter = v.responseWriter
  219. }
  220. } else if request.Security.Is(protocol.SecurityType_AES128_GCM) {
  221. block, _ := aes.NewCipher(v.responseBodyKey)
  222. aead, _ := cipher.NewGCM(block)
  223. auth := &crypto.AEADAuthenticator{
  224. AEAD: aead,
  225. NonceGenerator: &ChunkNonceGenerator{
  226. Nonce: append([]byte(nil), v.responseBodyIV...),
  227. Size: aead.NonceSize(),
  228. },
  229. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  230. }
  231. authWriter = crypto.NewAuthenticationWriter(auth, writer)
  232. } else if request.Security.Is(protocol.SecurityType_CHACHA20_POLY1305) {
  233. aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(v.responseBodyKey))
  234. auth := &crypto.AEADAuthenticator{
  235. AEAD: aead,
  236. NonceGenerator: &ChunkNonceGenerator{
  237. Nonce: append([]byte(nil), v.responseBodyIV...),
  238. Size: aead.NonceSize(),
  239. },
  240. AdditionalDataGenerator: crypto.NoOpBytesGenerator{},
  241. }
  242. authWriter = crypto.NewAuthenticationWriter(auth, writer)
  243. }
  244. return buf.NewWriter(authWriter)
  245. }