MCPcopy
hub / github.com/txthinking/brook / Exchange

Method Exchange

packetclient.go:51–137  ·  view source on GitHub ↗
(local net.Conn)

Source from the content-addressed store, hash-verified

49}
50
51func (c *PacketClient) Exchange(local net.Conn) error {
52 go func() {
53 for {
54 if c.Timeout != 0 {
55 if err := c.Server.SetDeadline(time.Now().Add(time.Duration(c.Timeout) * time.Second)); err != nil {
56 return
57 }
58 }
59 i, err := c.Server.Read(c.RB)
60 if err != nil {
61 return
62 }
63 if i < 12+16 {
64 Log(errors.New("data too small"))
65 return
66 }
67 sk := x.BP32.Get().([]byte)
68 if _, err := io.ReadFull(hkdf.New(sha256.New, c.Password, c.RB[:12], ServerHKDFInfo), sk); err != nil {
69 x.BP32.Put(sk)
70 Log(err)
71 return
72 }
73 sb, err := aes.NewCipher(sk)
74 if err != nil {
75 x.BP32.Put(sk)
76 Log(err)
77 return
78 }
79 x.BP32.Put(sk)
80 sa, err := cipher.NewGCM(sb)
81 if err != nil {
82 Log(err)
83 return
84 }
85 if _, err := sa.Open(c.RB[:12], c.RB[:12], c.RB[12:i], nil); err != nil {
86 Log(err)
87 return
88 }
89 _, h, _, err := socks5.ParseBytesAddress(c.RB[12:])
90 if err != nil {
91 Log(err)
92 return
93 }
94 _, err = local.Write(c.RB[12+1+len(h)+2 : i-16])
95 if err != nil {
96 return
97 }
98 }
99 }()
100 for {
101 if c.Timeout != 0 {
102 if err := local.SetDeadline(time.Now().Add(time.Duration(c.Timeout) * time.Second)); err != nil {
103 return nil
104 }
105 }
106 copy(c.WB[12+4:12+4+len(c.dstb)], c.dstb)
107 l, err := local.Read(c.WB[12+4+len(c.dstb) : 65507-16])
108 if err != nil {

Callers 1

UDPHandleMethod · 0.95

Calls 4

GetMethod · 0.80
SetDeadlineMethod · 0.45
ReadMethod · 0.45
WriteMethod · 0.45

Tested by

no test coverage detected