auth.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package crypto
  2. import (
  3. "crypto/cipher"
  4. "io"
  5. "v2ray.com/core/common/buf"
  6. "v2ray.com/core/common/protocol"
  7. )
  8. type BytesGenerator interface {
  9. Next() []byte
  10. }
  11. type NoOpBytesGenerator struct {
  12. buffer [1]byte
  13. }
  14. func (v NoOpBytesGenerator) Next() []byte {
  15. return v.buffer[:0]
  16. }
  17. type StaticBytesGenerator struct {
  18. Content []byte
  19. }
  20. func (v StaticBytesGenerator) Next() []byte {
  21. return v.Content
  22. }
  23. type Authenticator interface {
  24. NonceSize() int
  25. Overhead() int
  26. Open(dst, cipherText []byte) ([]byte, error)
  27. Seal(dst, plainText []byte) ([]byte, error)
  28. }
  29. type AEADAuthenticator struct {
  30. cipher.AEAD
  31. NonceGenerator BytesGenerator
  32. AdditionalDataGenerator BytesGenerator
  33. }
  34. func (v *AEADAuthenticator) Open(dst, cipherText []byte) ([]byte, error) {
  35. iv := v.NonceGenerator.Next()
  36. if len(iv) != v.AEAD.NonceSize() {
  37. return nil, newError("invalid AEAD nonce size: ", len(iv))
  38. }
  39. additionalData := v.AdditionalDataGenerator.Next()
  40. return v.AEAD.Open(dst, iv, cipherText, additionalData)
  41. }
  42. func (v *AEADAuthenticator) Seal(dst, plainText []byte) ([]byte, error) {
  43. iv := v.NonceGenerator.Next()
  44. if len(iv) != v.AEAD.NonceSize() {
  45. return nil, newError("invalid AEAD nonce size: ", len(iv))
  46. }
  47. additionalData := v.AdditionalDataGenerator.Next()
  48. return v.AEAD.Seal(dst, iv, plainText, additionalData), nil
  49. }
  50. type AuthenticationReader struct {
  51. auth Authenticator
  52. buffer *buf.Buffer
  53. reader io.Reader
  54. sizeParser ChunkSizeDecoder
  55. size int
  56. transferType protocol.TransferType
  57. }
  58. const (
  59. readerBufferSize = 32 * 1024
  60. )
  61. func NewAuthenticationReader(auth Authenticator, sizeParser ChunkSizeDecoder, reader io.Reader, transferType protocol.TransferType) *AuthenticationReader {
  62. return &AuthenticationReader{
  63. auth: auth,
  64. buffer: buf.NewLocal(readerBufferSize),
  65. reader: reader,
  66. sizeParser: sizeParser,
  67. size: -1,
  68. transferType: transferType,
  69. }
  70. }
  71. func (r *AuthenticationReader) readSize() error {
  72. if r.size >= 0 {
  73. return nil
  74. }
  75. sizeBytes := r.sizeParser.SizeBytes()
  76. if r.buffer.Len() < sizeBytes {
  77. r.buffer.Reset(buf.ReadFrom(r.buffer))
  78. delta := sizeBytes - r.buffer.Len()
  79. if err := r.buffer.AppendSupplier(buf.ReadAtLeastFrom(r.reader, delta)); err != nil {
  80. return err
  81. }
  82. }
  83. size, err := r.sizeParser.Decode(r.buffer.BytesTo(sizeBytes))
  84. if err != nil {
  85. return err
  86. }
  87. r.size = int(size)
  88. r.buffer.SliceFrom(sizeBytes)
  89. return nil
  90. }
  91. func (r *AuthenticationReader) readChunk(waitForData bool) ([]byte, error) {
  92. if err := r.readSize(); err != nil {
  93. return nil, err
  94. }
  95. if r.size > readerBufferSize-r.sizeParser.SizeBytes() {
  96. return nil, newError("size too large ", r.size).AtWarning()
  97. }
  98. if r.size == r.auth.Overhead() {
  99. return nil, io.EOF
  100. }
  101. if r.buffer.Len() < r.size {
  102. if !waitForData {
  103. return nil, io.ErrNoProgress
  104. }
  105. r.buffer.Reset(buf.ReadFrom(r.buffer))
  106. delta := r.size - r.buffer.Len()
  107. if err := r.buffer.AppendSupplier(buf.ReadAtLeastFrom(r.reader, delta)); err != nil {
  108. return nil, err
  109. }
  110. }
  111. b, err := r.auth.Open(r.buffer.BytesTo(0), r.buffer.BytesTo(r.size))
  112. if err != nil {
  113. return nil, err
  114. }
  115. r.buffer.SliceFrom(r.size)
  116. r.size = -1
  117. return b, nil
  118. }
  119. func (r *AuthenticationReader) Read() (buf.MultiBuffer, error) {
  120. b, err := r.readChunk(true)
  121. if err != nil {
  122. return nil, err
  123. }
  124. mb := buf.NewMultiBuffer()
  125. if r.transferType == protocol.TransferTypeStream {
  126. mb.Write(b)
  127. } else {
  128. var bb *buf.Buffer
  129. if len(b) < buf.Size {
  130. bb = buf.New()
  131. } else {
  132. bb = buf.NewLocal(len(b))
  133. }
  134. bb.Append(b)
  135. mb.Append(bb)
  136. }
  137. for r.buffer.Len() >= r.sizeParser.SizeBytes() {
  138. b, err := r.readChunk(false)
  139. if err != nil {
  140. break
  141. }
  142. if r.transferType == protocol.TransferTypeStream {
  143. mb.Write(b)
  144. } else {
  145. var bb *buf.Buffer
  146. if len(b) < buf.Size {
  147. bb = buf.New()
  148. } else {
  149. bb = buf.NewLocal(len(b))
  150. }
  151. bb.Append(b)
  152. mb.Append(bb)
  153. }
  154. }
  155. return mb, nil
  156. }
  157. type AuthenticationWriter struct {
  158. auth Authenticator
  159. payload []byte
  160. buffer *buf.Buffer
  161. writer io.Writer
  162. sizeParser ChunkSizeEncoder
  163. transferType protocol.TransferType
  164. }
  165. func NewAuthenticationWriter(auth Authenticator, sizeParser ChunkSizeEncoder, writer io.Writer, transferType protocol.TransferType) *AuthenticationWriter {
  166. return &AuthenticationWriter{
  167. auth: auth,
  168. payload: make([]byte, 1024),
  169. buffer: buf.NewLocal(readerBufferSize),
  170. writer: writer,
  171. sizeParser: sizeParser,
  172. transferType: transferType,
  173. }
  174. }
  175. func (w *AuthenticationWriter) append(b []byte) {
  176. encryptedSize := len(b) + w.auth.Overhead()
  177. w.buffer.AppendSupplier(func(bb []byte) (int, error) {
  178. w.sizeParser.Encode(uint16(encryptedSize), bb[:0])
  179. return w.sizeParser.SizeBytes(), nil
  180. })
  181. w.buffer.AppendSupplier(func(bb []byte) (int, error) {
  182. w.auth.Seal(bb[:0], b)
  183. return encryptedSize, nil
  184. })
  185. }
  186. func (w *AuthenticationWriter) flush() error {
  187. _, err := w.writer.Write(w.buffer.Bytes())
  188. w.buffer.Clear()
  189. return err
  190. }
  191. func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error {
  192. defer mb.Release()
  193. for {
  194. n, _ := mb.Read(w.payload)
  195. w.append(w.payload[:n])
  196. if w.buffer.Len() > readerBufferSize-2*1024 {
  197. if err := w.flush(); err != nil {
  198. return err
  199. }
  200. }
  201. if mb.IsEmpty() {
  202. break
  203. }
  204. }
  205. if !w.buffer.IsEmpty() {
  206. return w.flush()
  207. }
  208. return nil
  209. }
  210. func (w *AuthenticationWriter) writePacket(mb buf.MultiBuffer) error {
  211. defer mb.Release()
  212. for {
  213. b := mb.SplitFirst()
  214. if b == nil {
  215. b = buf.New()
  216. }
  217. if w.buffer.Len() > readerBufferSize-b.Len()-128 {
  218. if err := w.flush(); err != nil {
  219. b.Release()
  220. return err
  221. }
  222. }
  223. w.append(b.Bytes())
  224. b.Release()
  225. if mb.IsEmpty() {
  226. break
  227. }
  228. }
  229. if !w.buffer.IsEmpty() {
  230. return w.flush()
  231. }
  232. return nil
  233. }
  234. func (w *AuthenticationWriter) Write(mb buf.MultiBuffer) error {
  235. if w.transferType == protocol.TransferTypeStream {
  236. return w.writeStream(mb)
  237. }
  238. return w.writePacket(mb)
  239. }