io.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package kcp
  2. import (
  3. "crypto/cipher"
  4. "crypto/rand"
  5. "io"
  6. "v2ray.com/core/transport/internet"
  7. )
  8. type PacketReader interface {
  9. Read([]byte) []Segment
  10. }
  11. type PacketWriter interface {
  12. Overhead() int
  13. io.Writer
  14. }
  15. type KCPPacketReader struct {
  16. Security cipher.AEAD
  17. Header internet.PacketHeader
  18. }
  19. func (v *KCPPacketReader) Read(b []byte) []Segment {
  20. if v.Header != nil {
  21. b = b[v.Header.Size():]
  22. }
  23. if v.Security != nil {
  24. nonceSize := v.Security.NonceSize()
  25. out, err := v.Security.Open(b[nonceSize:nonceSize], b[:nonceSize], b[nonceSize:], nil)
  26. if err != nil {
  27. return nil
  28. }
  29. b = out
  30. }
  31. var result []Segment
  32. for len(b) > 0 {
  33. seg, x := ReadSegment(b)
  34. if seg == nil {
  35. break
  36. }
  37. result = append(result, seg)
  38. b = x
  39. }
  40. return result
  41. }
  42. type KCPPacketWriter struct {
  43. Header internet.PacketHeader
  44. Security cipher.AEAD
  45. Writer io.Writer
  46. buffer [32 * 1024]byte
  47. }
  48. func (v *KCPPacketWriter) Overhead() int {
  49. overhead := 0
  50. if v.Header != nil {
  51. overhead += v.Header.Size()
  52. }
  53. if v.Security != nil {
  54. overhead += v.Security.Overhead()
  55. }
  56. return overhead
  57. }
  58. func (v *KCPPacketWriter) Write(b []byte) (int, error) {
  59. x := v.buffer[:]
  60. size := 0
  61. if v.Header != nil {
  62. nBytes := v.Header.Write(x)
  63. size += nBytes
  64. x = x[nBytes:]
  65. }
  66. if v.Security != nil {
  67. nonceSize := v.Security.NonceSize()
  68. var nonce []byte
  69. if nonceSize > 0 {
  70. nonce = x[:nonceSize]
  71. rand.Read(nonce)
  72. x = x[nonceSize:]
  73. }
  74. x = v.Security.Seal(x[:0], nonce, b, nil)
  75. size += nonceSize + len(x)
  76. } else {
  77. size += copy(x, b)
  78. }
  79. _, err := v.Writer.Write(v.buffer[:size])
  80. return len(b), err
  81. }