io.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. out, err := r.Security.Open(b[nonceSize:nonceSize], b[:nonceSize], b[nonceSize:], nil)
  28. if err != nil {
  29. return nil
  30. }
  31. b = out
  32. }
  33. var result []Segment
  34. for len(b) > 0 {
  35. seg, x := ReadSegment(b)
  36. if seg == nil {
  37. break
  38. }
  39. result = append(result, seg)
  40. b = x
  41. }
  42. return result
  43. }
  44. type KCPPacketWriter struct {
  45. Header internet.PacketHeader
  46. Security cipher.AEAD
  47. Writer io.Writer
  48. }
  49. func (w *KCPPacketWriter) Overhead() int {
  50. overhead := 0
  51. if w.Header != nil {
  52. overhead += int(w.Header.Size())
  53. }
  54. if w.Security != nil {
  55. overhead += w.Security.Overhead()
  56. }
  57. return overhead
  58. }
  59. func (w *KCPPacketWriter) Write(b []byte) (int, error) {
  60. bb := buf.NewSize(int32(len(b) + w.Overhead()))
  61. defer bb.Release()
  62. if w.Header != nil {
  63. common.Must(bb.AppendSupplier(func(x []byte) (int, error) {
  64. return w.Header.Write(x)
  65. }))
  66. }
  67. if w.Security != nil {
  68. nonceSize := w.Security.NonceSize()
  69. common.Must(bb.AppendSupplier(func(x []byte) (int, error) {
  70. return rand.Read(x[:nonceSize])
  71. }))
  72. nonce := bb.BytesFrom(int32(-nonceSize))
  73. common.Must(bb.AppendSupplier(func(x []byte) (int, error) {
  74. eb := w.Security.Seal(x[:0], nonce, b, nil)
  75. return len(eb), nil
  76. }))
  77. } else {
  78. bb.Write(b)
  79. }
  80. _, err := w.Writer.Write(bb.Bytes())
  81. return len(b), err
  82. }