io.go 1.8 KB

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