io.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package crypto
  2. import (
  3. "crypto/cipher"
  4. "io"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/buf"
  7. )
  8. type CryptionReader struct {
  9. stream cipher.Stream
  10. reader io.Reader
  11. }
  12. func NewCryptionReader(stream cipher.Stream, reader io.Reader) *CryptionReader {
  13. return &CryptionReader{
  14. stream: stream,
  15. reader: reader,
  16. }
  17. }
  18. func (r *CryptionReader) Read(data []byte) (int, error) {
  19. nBytes, err := r.reader.Read(data)
  20. if nBytes > 0 {
  21. r.stream.XORKeyStream(data[:nBytes], data[:nBytes])
  22. }
  23. return nBytes, err
  24. }
  25. var (
  26. _ buf.Writer = (*CryptionWriter)(nil)
  27. )
  28. type CryptionWriter struct {
  29. stream cipher.Stream
  30. writer io.Writer
  31. }
  32. // NewCryptionWriter creates a new CryptionWriter.
  33. func NewCryptionWriter(stream cipher.Stream, writer io.Writer) *CryptionWriter {
  34. return &CryptionWriter{
  35. stream: stream,
  36. writer: writer,
  37. }
  38. }
  39. // Write implements io.Writer.Write().
  40. func (w *CryptionWriter) Write(data []byte) (int, error) {
  41. w.stream.XORKeyStream(data, data)
  42. return w.writer.Write(data)
  43. }
  44. // WriteMultiBuffer implements buf.Writer.
  45. func (w *CryptionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  46. defer mb.Release()
  47. bs := mb.ToNetBuffers()
  48. for _, b := range bs {
  49. w.stream.XORKeyStream(b, b)
  50. }
  51. return common.Error2(bs.WriteTo(w.writer))
  52. }