| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | package vmessimport (  "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}
 |