10 "github.com/anacrolix/torrent/mse"
11 pp "github.com/anacrolix/torrent/peer_protocol"
14 // Wraps a raw connection and provides the interface we want for using the
15 // connection in the message loop.
16 type deadlineReader struct {
21 func (r deadlineReader) Read(b []byte) (int, error) {
22 // Keep-alives should be received every 2 mins. Give a bit of gracetime.
23 err := r.nc.SetReadDeadline(time.Now().Add(150 * time.Second))
25 return 0, fmt.Errorf("error setting read deadline: %s", err)
30 func handleEncryption(
32 skeys mse.SecretKeyIter,
33 policy HeaderObfuscationPolicy,
34 selector mse.CryptoSelector,
38 cryptoMethod mse.CryptoMethod,
41 if !policy.RequirePreferred || !policy.Preferred {
42 var protocol [len(pp.Protocol)]byte
43 _, err = io.ReadFull(rw, protocol[:])
51 io.MultiReader(bytes.NewReader(protocol[:]), rw),
54 if string(protocol[:]) == pp.Protocol {
58 if policy.RequirePreferred {
59 err = fmt.Errorf("unexpected protocol string %q and header obfuscation disabled", protocol)
63 headerEncrypted = true
64 ret, cryptoMethod, err = mse.ReceiveHandshake(rw, skeys, selector)
68 type PeerExtensionBits = pp.PeerExtensionBits