vmess.go 7.1 KB

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