| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | package kcpimport (	"crypto/cipher"	"crypto/rand"	"io"	"v2ray.com/core/common"	"v2ray.com/core/common/buf"	"v2ray.com/core/transport/internet")type PacketReader interface {	Read([]byte) []Segment}type PacketWriter interface {	Overhead() int	io.Writer}type KCPPacketReader struct {	Security cipher.AEAD	Header   internet.PacketHeader}func (r *KCPPacketReader) Read(b []byte) []Segment {	if r.Header != nil {		b = b[r.Header.Size():]	}	if r.Security != nil {		nonceSize := r.Security.NonceSize()		overhead := r.Security.Overhead()		if len(b) <= nonceSize+overhead {			return nil		}		out, err := r.Security.Open(b[nonceSize:nonceSize], b[:nonceSize], b[nonceSize:], nil)		if err != nil {			return nil		}		b = out	}	var result []Segment	for len(b) > 0 {		seg, x := ReadSegment(b)		if seg == nil {			break		}		result = append(result, seg)		b = x	}	return result}type KCPPacketWriter struct {	Header   internet.PacketHeader	Security cipher.AEAD	Writer   io.Writer}func (w *KCPPacketWriter) Overhead() int {	overhead := 0	if w.Header != nil {		overhead += int(w.Header.Size())	}	if w.Security != nil {		overhead += w.Security.Overhead()	}	return overhead}func (w *KCPPacketWriter) Write(b []byte) (int, error) {	bb := buf.NewSize(int32(len(b) + w.Overhead()))	defer bb.Release()	if w.Header != nil {		common.Must(bb.AppendSupplier(func(x []byte) (int, error) {			return w.Header.Write(x)		}))	}	if w.Security != nil {		nonceSize := w.Security.NonceSize()		common.Must(bb.AppendSupplier(func(x []byte) (int, error) {			return rand.Read(x[:nonceSize])		}))		nonce := bb.BytesFrom(int32(-nonceSize))		common.Must(bb.AppendSupplier(func(x []byte) (int, error) {			eb := w.Security.Seal(x[:0], nonce, b, nil)			return len(eb), nil		}))	} else {		bb.Write(b)	}	_, err := w.Writer.Write(bb.Bytes())	return len(b), err}
 |