(local net.Conn)
| 49 | } |
| 50 | |
| 51 | func (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 { |
no test coverage detected