| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | 
							- package vmess
 
- import (
 
- 	"bytes"
 
- 	"crypto/aes"
 
- 	"crypto/cipher"
 
- 	"fmt"
 
- 	"io"
 
- )
 
- const (
 
- 	blockSize = 16
 
- )
 
- type DecryptionReader struct {
 
- 	cipher cipher.Block
 
- 	reader io.Reader
 
- 	buffer *bytes.Buffer
 
- }
 
- func NewDecryptionReader(reader io.Reader, key []byte) (*DecryptionReader, error) {
 
- 	decryptionReader := new(DecryptionReader)
 
- 	cipher, err := aes.NewCipher(key)
 
- 	if err != nil {
 
- 		return nil, err
 
- 	}
 
- 	decryptionReader.cipher = cipher
 
- 	decryptionReader.reader = reader
 
- 	decryptionReader.buffer = bytes.NewBuffer(make([]byte, 0, 2*blockSize))
 
- 	return decryptionReader, nil
 
- }
 
- func (reader *DecryptionReader) readBlock() error {
 
- 	buffer := make([]byte, blockSize)
 
- 	nBytes, err := reader.reader.Read(buffer)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	if nBytes < blockSize {
 
- 		return fmt.Errorf("Expected to read %d bytes, but got %d bytes", blockSize, nBytes)
 
- 	}
 
- 	reader.cipher.Decrypt(buffer, buffer)
 
- 	reader.buffer.Write(buffer)
 
- 	return nil
 
- }
 
- func (reader *DecryptionReader) Read(p []byte) (int, error) {
 
- 	if reader.buffer.Len() == 0 {
 
- 		err := reader.readBlock()
 
- 		if err != nil {
 
- 			return 0, err
 
- 		}
 
- 	}
 
- 	nBytes, err := reader.buffer.Read(p)
 
- 	if err != nil {
 
- 		return nBytes, err
 
- 	}
 
- 	if nBytes < len(p) {
 
- 		err = reader.readBlock()
 
- 		if err != nil {
 
- 			return nBytes, err
 
- 		}
 
- 		moreBytes, err := reader.buffer.Read(p[nBytes:])
 
- 		if err != nil {
 
- 			return nBytes, err
 
- 		}
 
- 		nBytes += moreBytes
 
- 		if nBytes != len(p) {
 
- 			return nBytes, fmt.Errorf("Unable to read %d bytes", len(p))
 
- 		}
 
- 	}
 
- 	return nBytes, err
 
- }
 
 
  |