auth.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package crypto
  2. import (
  3. "crypto/cipher"
  4. "io"
  5. "golang.org/x/crypto/sha3"
  6. "v2ray.com/core/common"
  7. "v2ray.com/core/common/buf"
  8. "v2ray.com/core/common/errors"
  9. "v2ray.com/core/common/serial"
  10. )
  11. var (
  12. errInsufficientBuffer = errors.New("Insufficient buffer.")
  13. )
  14. type BytesGenerator interface {
  15. Next() []byte
  16. }
  17. type NoOpBytesGenerator struct {
  18. buffer [1]byte
  19. }
  20. func (v NoOpBytesGenerator) Next() []byte {
  21. return v.buffer[:0]
  22. }
  23. type StaticBytesGenerator struct {
  24. Content []byte
  25. }
  26. func (v StaticBytesGenerator) Next() []byte {
  27. return v.Content
  28. }
  29. type Authenticator interface {
  30. NonceSize() int
  31. Overhead() int
  32. Open(dst, cipherText []byte) ([]byte, error)
  33. Seal(dst, plainText []byte) ([]byte, error)
  34. }
  35. type AEADAuthenticator struct {
  36. cipher.AEAD
  37. NonceGenerator BytesGenerator
  38. AdditionalDataGenerator BytesGenerator
  39. }
  40. func (v *AEADAuthenticator) Open(dst, cipherText []byte) ([]byte, error) {
  41. iv := v.NonceGenerator.Next()
  42. if len(iv) != v.AEAD.NonceSize() {
  43. return nil, errors.New("Crypto:AEADAuthenticator: Invalid nonce size: ", len(iv))
  44. }
  45. additionalData := v.AdditionalDataGenerator.Next()
  46. return v.AEAD.Open(dst, iv, cipherText, additionalData)
  47. }
  48. func (v *AEADAuthenticator) Seal(dst, plainText []byte) ([]byte, error) {
  49. iv := v.NonceGenerator.Next()
  50. if len(iv) != v.AEAD.NonceSize() {
  51. return nil, errors.New("Crypto:AEADAuthenticator: Invalid nonce size: ", len(iv))
  52. }
  53. additionalData := v.AdditionalDataGenerator.Next()
  54. return v.AEAD.Seal(dst, iv, plainText, additionalData), nil
  55. }
  56. type Uint16Generator interface {
  57. Next() uint16
  58. }
  59. type StaticUint16Generator uint16
  60. func (g StaticUint16Generator) Next() uint16 {
  61. return uint16(g)
  62. }
  63. type MultiplyUint16Generator struct {
  64. base uint16
  65. value uint16
  66. }
  67. func NewMultiplyUint16Generator(base uint16) *MultiplyUint16Generator {
  68. return &MultiplyUint16Generator{
  69. base: base,
  70. value: 1,
  71. }
  72. }
  73. func (g *MultiplyUint16Generator) Next() uint16 {
  74. g.value *= g.base
  75. return g.value
  76. }
  77. type ShakeUint16Generator struct {
  78. shake sha3.ShakeHash
  79. buffer [2]byte
  80. }
  81. func NewShakeUint16Generator(nonce []byte) *ShakeUint16Generator {
  82. shake := sha3.NewShake128()
  83. shake.Write(nonce)
  84. return &ShakeUint16Generator{
  85. shake: shake,
  86. }
  87. }
  88. func (g *ShakeUint16Generator) Next() uint16 {
  89. g.shake.Read(g.buffer[:])
  90. return serial.BytesToUint16(g.buffer[:])
  91. }
  92. type AuthenticationReader struct {
  93. auth Authenticator
  94. buffer *buf.Buffer
  95. reader io.Reader
  96. sizeMask Uint16Generator
  97. chunk []byte
  98. }
  99. const (
  100. readerBufferSize = 32 * 1024
  101. )
  102. func NewAuthenticationReader(auth Authenticator, reader io.Reader, sizeMask Uint16Generator) *AuthenticationReader {
  103. return &AuthenticationReader{
  104. auth: auth,
  105. buffer: buf.NewLocal(readerBufferSize),
  106. reader: reader,
  107. sizeMask: sizeMask,
  108. }
  109. }
  110. func (v *AuthenticationReader) NextChunk(mask uint16) error {
  111. if v.buffer.Len() < 2 {
  112. return errInsufficientBuffer
  113. }
  114. size := int(serial.BytesToUint16(v.buffer.BytesTo(2)) ^ mask)
  115. if size > v.buffer.Len()-2 {
  116. return errInsufficientBuffer
  117. }
  118. if size > readerBufferSize-2 {
  119. return errors.New("Crypto:AuthenticationReader: Size too large: ", size)
  120. }
  121. if size == v.auth.Overhead() {
  122. return io.EOF
  123. }
  124. if size < v.auth.Overhead() {
  125. return errors.New("AuthenticationReader: invalid packet size:", size)
  126. }
  127. cipherChunk := v.buffer.BytesRange(2, size+2)
  128. plainChunk, err := v.auth.Open(cipherChunk[:0], cipherChunk)
  129. if err != nil {
  130. return err
  131. }
  132. v.chunk = plainChunk
  133. v.buffer.SliceFrom(size + 2)
  134. return nil
  135. }
  136. func (v *AuthenticationReader) CopyChunk(b []byte) int {
  137. if len(v.chunk) == 0 {
  138. return 0
  139. }
  140. nBytes := copy(b, v.chunk)
  141. if nBytes == len(v.chunk) {
  142. v.chunk = nil
  143. } else {
  144. v.chunk = v.chunk[nBytes:]
  145. }
  146. return nBytes
  147. }
  148. func (v *AuthenticationReader) EnsureChunk() error {
  149. atHead := false
  150. if v.buffer.IsEmpty() {
  151. v.buffer.Clear()
  152. atHead = true
  153. }
  154. mask := v.sizeMask.Next()
  155. for {
  156. err := v.NextChunk(mask)
  157. if err != errInsufficientBuffer {
  158. return err
  159. }
  160. leftover := v.buffer.Bytes()
  161. if !atHead && len(leftover) > 0 {
  162. common.Must(v.buffer.Reset(func(b []byte) (int, error) {
  163. return copy(b, leftover), nil
  164. }))
  165. }
  166. if err := v.buffer.AppendSupplier(buf.ReadFrom(v.reader)); err != nil {
  167. return err
  168. }
  169. }
  170. }
  171. func (v *AuthenticationReader) Read(b []byte) (int, error) {
  172. if len(v.chunk) > 0 {
  173. nBytes := v.CopyChunk(b)
  174. return nBytes, nil
  175. }
  176. err := v.EnsureChunk()
  177. if err != nil {
  178. return 0, err
  179. }
  180. return v.CopyChunk(b), nil
  181. }
  182. type AuthenticationWriter struct {
  183. auth Authenticator
  184. buffer []byte
  185. writer io.Writer
  186. sizeMask Uint16Generator
  187. }
  188. func NewAuthenticationWriter(auth Authenticator, writer io.Writer, sizeMask Uint16Generator) *AuthenticationWriter {
  189. return &AuthenticationWriter{
  190. auth: auth,
  191. buffer: make([]byte, 32*1024),
  192. writer: writer,
  193. sizeMask: sizeMask,
  194. }
  195. }
  196. func (v *AuthenticationWriter) Write(b []byte) (int, error) {
  197. cipherChunk, err := v.auth.Seal(v.buffer[2:2], b)
  198. if err != nil {
  199. return 0, err
  200. }
  201. size := uint16(len(cipherChunk)) ^ v.sizeMask.Next()
  202. serial.Uint16ToBytes(size, v.buffer[:0])
  203. _, err = v.writer.Write(v.buffer[:2+len(cipherChunk)])
  204. return len(b), err
  205. }