vmess.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. // Package vmess contains protocol definition, io lib for VMess.
  2. package vmess
  3. import (
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "crypto/rand"
  7. "encoding/binary"
  8. "errors"
  9. "fmt"
  10. "io"
  11. _ "log"
  12. mrand "math/rand"
  13. "net"
  14. "github.com/v2ray/v2ray-core"
  15. v2io "github.com/v2ray/v2ray-core/io"
  16. v2net "github.com/v2ray/v2ray-core/net"
  17. )
  18. const (
  19. addrTypeIPv4 = byte(0x01)
  20. addrTypeIPv6 = byte(0x03)
  21. addrTypeDomain = byte(0x02)
  22. Version = byte(0x01)
  23. )
  24. var (
  25. ErrorInvalidUser = errors.New("Invalid User")
  26. )
  27. // VMessRequest implements the request message of VMess protocol. It only contains
  28. // the header of a request message. The data part will be handled by conection
  29. // handler directly, in favor of data streaming.
  30. // 1 Version
  31. // 16 UserHash
  32. // 16 Request IV
  33. // 16 Request Key
  34. // 4 Response Header
  35. // 1 Command
  36. // 2 Port
  37. // 1 Address Type
  38. // 256 Target Address
  39. type VMessRequest [312]byte
  40. func (r *VMessRequest) Version() byte {
  41. return r[0]
  42. }
  43. func (r *VMessRequest) SetVersion(version byte) *VMessRequest {
  44. r[0] = version
  45. return r
  46. }
  47. func (r *VMessRequest) UserHash() []byte {
  48. return r[1:17]
  49. }
  50. func (r *VMessRequest) RequestIV() []byte {
  51. return r[17:33]
  52. }
  53. func (r *VMessRequest) RequestKey() []byte {
  54. return r[33:49]
  55. }
  56. func (r *VMessRequest) ResponseHeader() []byte {
  57. return r[49:53]
  58. }
  59. func (r *VMessRequest) Command() byte {
  60. return r[53]
  61. }
  62. func (r *VMessRequest) SetCommand(command byte) *VMessRequest {
  63. r[53] = command
  64. return r
  65. }
  66. func (r *VMessRequest) Port() uint16 {
  67. return binary.BigEndian.Uint16(r.portBytes())
  68. }
  69. func (r *VMessRequest) portBytes() []byte {
  70. return r[54:56]
  71. }
  72. func (r *VMessRequest) SetPort(port uint16) *VMessRequest {
  73. binary.BigEndian.PutUint16(r.portBytes(), port)
  74. return r
  75. }
  76. func (r *VMessRequest) targetAddressType() byte {
  77. return r[56]
  78. }
  79. func (r *VMessRequest) Destination() v2net.VAddress {
  80. switch r.targetAddressType() {
  81. case addrTypeIPv4:
  82. fallthrough
  83. case addrTypeIPv6:
  84. return v2net.IPAddress(r.targetAddressBytes(), r.Port())
  85. case addrTypeDomain:
  86. return v2net.DomainAddress(r.TargetAddress(), r.Port())
  87. default:
  88. panic("Unpexected address type")
  89. }
  90. }
  91. func (r *VMessRequest) TargetAddress() string {
  92. switch r.targetAddressType() {
  93. case addrTypeIPv4:
  94. return net.IP(r[57:61]).String()
  95. case addrTypeIPv6:
  96. return net.IP(r[57:73]).String()
  97. case addrTypeDomain:
  98. domainLength := int(r[57])
  99. return string(r[58 : 58+domainLength])
  100. default:
  101. panic("Unexpected address type")
  102. }
  103. }
  104. func (r *VMessRequest) targetAddressBytes() []byte {
  105. switch r.targetAddressType() {
  106. case addrTypeIPv4:
  107. return r[57:61]
  108. case addrTypeIPv6:
  109. return r[57:73]
  110. case addrTypeDomain:
  111. domainLength := int(r[57])
  112. return r[57 : 58+domainLength]
  113. default:
  114. panic("Unexpected address type")
  115. }
  116. }
  117. func (r *VMessRequest) SetIPv4(ipv4 []byte) *VMessRequest {
  118. r[56] = addrTypeIPv4
  119. copy(r[57:], ipv4)
  120. return r
  121. }
  122. func (r *VMessRequest) SetIPv6(ipv6 []byte) *VMessRequest {
  123. r[56] = addrTypeIPv6
  124. copy(r[57:], ipv6)
  125. return r
  126. }
  127. func (r *VMessRequest) SetDomain(domain string) *VMessRequest {
  128. r[56] = addrTypeDomain
  129. r[57] = byte(len(domain))
  130. copy(r[58:], []byte(domain))
  131. return r
  132. }
  133. type VMessRequestReader struct {
  134. vUserSet *core.VUserSet
  135. }
  136. func NewVMessRequestReader(vUserSet *core.VUserSet) *VMessRequestReader {
  137. reader := new(VMessRequestReader)
  138. reader.vUserSet = vUserSet
  139. return reader
  140. }
  141. func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
  142. request := new(VMessRequest)
  143. nBytes, err := reader.Read(request[0:17] /* version + user hash */)
  144. if err != nil {
  145. return nil, err
  146. }
  147. if nBytes != 17 {
  148. err = fmt.Errorf("Unexpected length of header %d", nBytes)
  149. return nil, err
  150. }
  151. // TODO: verify version number
  152. userId, valid := r.vUserSet.IsValidUserId(request.UserHash())
  153. if !valid {
  154. return nil, ErrorInvalidUser
  155. }
  156. decryptor, err := NewDecryptionReader(reader, userId.Hash([]byte("PWD")), make([]byte, blockSize))
  157. if err != nil {
  158. return nil, err
  159. }
  160. buffer := make([]byte, 300)
  161. nBytes, err = decryptor.Read(buffer[0:1])
  162. if err != nil {
  163. return nil, err
  164. }
  165. randomLength := buffer[0]
  166. if randomLength <= 0 || randomLength > 32 {
  167. return nil, fmt.Errorf("Unexpected random length %d", randomLength)
  168. }
  169. _, err = decryptor.Read(buffer[:randomLength])
  170. if err != nil {
  171. return nil, err
  172. }
  173. // TODO: check number of bytes returned
  174. _, err = decryptor.Read(request.RequestIV())
  175. if err != nil {
  176. return nil, err
  177. }
  178. _, err = decryptor.Read(request.RequestKey())
  179. if err != nil {
  180. return nil, err
  181. }
  182. _, err = decryptor.Read(request.ResponseHeader())
  183. if err != nil {
  184. return nil, err
  185. }
  186. _, err = decryptor.Read(buffer[0:1])
  187. if err != nil {
  188. return nil, err
  189. }
  190. request.SetCommand(buffer[0])
  191. _, err = decryptor.Read(buffer[0:2])
  192. if err != nil {
  193. return nil, err
  194. }
  195. request.SetPort(binary.BigEndian.Uint16(buffer[0:2]))
  196. _, err = decryptor.Read(buffer[0:1])
  197. if err != nil {
  198. return nil, err
  199. }
  200. switch buffer[0] {
  201. case addrTypeIPv4:
  202. _, err = decryptor.Read(buffer[1:5])
  203. if err != nil {
  204. return nil, err
  205. }
  206. request.SetIPv4(buffer[1:5])
  207. case addrTypeIPv6:
  208. _, err = decryptor.Read(buffer[1:17])
  209. if err != nil {
  210. return nil, err
  211. }
  212. request.SetIPv6(buffer[1:17])
  213. case addrTypeDomain:
  214. _, err = decryptor.Read(buffer[1:2])
  215. if err != nil {
  216. return nil, err
  217. }
  218. domainLength := buffer[1]
  219. _, err = decryptor.Read(buffer[2 : 2+domainLength])
  220. if err != nil {
  221. return nil, err
  222. }
  223. request.SetDomain(string(buffer[2 : 2+domainLength]))
  224. }
  225. _, err = decryptor.Read(buffer[0:1])
  226. if err != nil {
  227. return nil, err
  228. }
  229. randomLength = buffer[0]
  230. _, err = decryptor.Read(buffer[:randomLength])
  231. if err != nil {
  232. return nil, err
  233. }
  234. return request, nil
  235. }
  236. type VMessRequestWriter struct {
  237. vUserSet *core.VUserSet
  238. }
  239. func NewVMessRequestWriter(vUserSet *core.VUserSet) *VMessRequestWriter {
  240. writer := new(VMessRequestWriter)
  241. writer.vUserSet = vUserSet
  242. return writer
  243. }
  244. func (w *VMessRequestWriter) Write(writer io.Writer, request *VMessRequest) error {
  245. buffer := make([]byte, 0, 300)
  246. buffer = append(buffer, request.Version())
  247. buffer = append(buffer, request.UserHash()...)
  248. encryptionBegin := len(buffer)
  249. randomLength := mrand.Intn(32) + 1
  250. randomContent := make([]byte, randomLength)
  251. _, err := rand.Read(randomContent)
  252. if err != nil {
  253. return err
  254. }
  255. buffer = append(buffer, byte(randomLength))
  256. buffer = append(buffer, randomContent...)
  257. buffer = append(buffer, request.RequestIV()...)
  258. buffer = append(buffer, request.RequestKey()...)
  259. buffer = append(buffer, request.ResponseHeader()...)
  260. buffer = append(buffer, request.Command())
  261. buffer = append(buffer, request.portBytes()...)
  262. buffer = append(buffer, request.targetAddressType())
  263. buffer = append(buffer, request.targetAddressBytes()...)
  264. paddingLength := blockSize - 1 - (len(buffer)-encryptionBegin)%blockSize
  265. if paddingLength == 0 {
  266. paddingLength = blockSize
  267. }
  268. paddingBuffer := make([]byte, paddingLength)
  269. _, err = rand.Read(paddingBuffer)
  270. if err != nil {
  271. return err
  272. }
  273. buffer = append(buffer, byte(paddingLength))
  274. buffer = append(buffer, paddingBuffer...)
  275. encryptionEnd := len(buffer)
  276. userId, valid := w.vUserSet.IsValidUserId(request.UserHash())
  277. if !valid {
  278. return ErrorInvalidUser
  279. }
  280. aesCipher, err := aes.NewCipher(userId.Hash([]byte("PWD")))
  281. if err != nil {
  282. return err
  283. }
  284. aesMode := cipher.NewCBCEncrypter(aesCipher, make([]byte, blockSize))
  285. cWriter := v2io.NewCryptionWriter(aesMode, writer)
  286. _, err = writer.Write(buffer[0:encryptionBegin])
  287. if err != nil {
  288. return err
  289. }
  290. _, err = cWriter.Write(buffer[encryptionBegin:encryptionEnd])
  291. if err != nil {
  292. return err
  293. }
  294. return nil
  295. }
  296. type VMessResponse [4]byte
  297. func NewVMessResponse(request *VMessRequest) *VMessResponse {
  298. response := new(VMessResponse)
  299. copy(response[:], request.ResponseHeader())
  300. return response
  301. }