(remote net.Conn)
| 47 | } |
| 48 | |
| 49 | func (s *PacketServer) Exchange(remote net.Conn) error { |
| 50 | go func() { |
| 51 | for { |
| 52 | if s.Timeout != 0 { |
| 53 | if err := remote.SetDeadline(time.Now().Add(time.Duration(s.Timeout) * time.Second)); err != nil { |
| 54 | return |
| 55 | } |
| 56 | } |
| 57 | copy(s.WB[12:12+len(s.dstb)], s.dstb) |
| 58 | l, err := remote.Read(s.WB[12+len(s.dstb) : 65507-16]) |
| 59 | if err != nil { |
| 60 | return |
| 61 | } |
| 62 | if _, err := io.ReadFull(rand.Reader, s.WB[:12]); err != nil { |
| 63 | Log(err) |
| 64 | return |
| 65 | } |
| 66 | sk := x.BP32.Get().([]byte) |
| 67 | if _, err := io.ReadFull(hkdf.New(sha256.New, s.Password, s.WB[:12], ServerHKDFInfo), sk); err != nil { |
| 68 | x.BP32.Put(sk) |
| 69 | Log(err) |
| 70 | return |
| 71 | } |
| 72 | sb, err := aes.NewCipher(sk) |
| 73 | if err != nil { |
| 74 | x.BP32.Put(sk) |
| 75 | Log(err) |
| 76 | return |
| 77 | } |
| 78 | x.BP32.Put(sk) |
| 79 | sa, err := cipher.NewGCM(sb) |
| 80 | if err != nil { |
| 81 | Log(err) |
| 82 | return |
| 83 | } |
| 84 | sa.Seal(s.WB[:12], s.WB[:12], s.WB[12:12+len(s.dstb)+l], nil) |
| 85 | _, err = s.Client.Write(s.WB[:12+len(s.dstb)+l+16]) |
| 86 | if err != nil { |
| 87 | return |
| 88 | } |
| 89 | } |
| 90 | }() |
| 91 | for { |
| 92 | if s.Timeout != 0 { |
| 93 | if err := s.Client.SetDeadline(time.Now().Add(time.Duration(s.Timeout) * time.Second)); err != nil { |
| 94 | return nil |
| 95 | } |
| 96 | } |
| 97 | l, err := s.Client.Read(s.RB) |
| 98 | if err != nil { |
| 99 | return nil |
| 100 | } |
| 101 | if _, err := remote.Write(s.RB[:l]); err != nil { |
| 102 | return nil |
| 103 | } |
| 104 | } |
| 105 | return nil |
| 106 | } |
nothing calls this directly
no test coverage detected