github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/p2p/net/conn/secure_conn.go (about) 1 package conn 2 3 import ( 4 "errors" 5 "net" 6 "time" 7 8 ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" 9 context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" 10 11 ic "github.com/ipfs/go-ipfs/p2p/crypto" 12 secio "github.com/ipfs/go-ipfs/p2p/crypto/secio" 13 peer "github.com/ipfs/go-ipfs/p2p/peer" 14 ) 15 16 // secureConn wraps another Conn object with an encrypted channel. 17 type secureConn struct { 18 insecure Conn // the wrapped conn 19 secure secio.Session // secure Session 20 } 21 22 // newConn constructs a new connection 23 func newSecureConn(ctx context.Context, sk ic.PrivKey, insecure Conn) (Conn, error) { 24 25 if insecure == nil { 26 return nil, errors.New("insecure is nil") 27 } 28 if insecure.LocalPeer() == "" { 29 return nil, errors.New("insecure.LocalPeer() is nil") 30 } 31 if sk == nil { 32 return nil, errors.New("private key is nil") 33 } 34 35 // NewSession performs the secure handshake, which takes multiple RTT 36 sessgen := secio.SessionGenerator{LocalID: insecure.LocalPeer(), PrivateKey: sk} 37 secure, err := sessgen.NewSession(ctx, insecure) 38 if err != nil { 39 return nil, err 40 } 41 42 conn := &secureConn{ 43 insecure: insecure, 44 secure: secure, 45 } 46 return conn, nil 47 } 48 49 func (c *secureConn) Close() error { 50 return c.secure.Close() 51 } 52 53 // ID is an identifier unique to this connection. 54 func (c *secureConn) ID() string { 55 return ID(c) 56 } 57 58 func (c *secureConn) String() string { 59 return String(c, "secureConn") 60 } 61 62 func (c *secureConn) LocalAddr() net.Addr { 63 return c.insecure.LocalAddr() 64 } 65 66 func (c *secureConn) RemoteAddr() net.Addr { 67 return c.insecure.RemoteAddr() 68 } 69 70 func (c *secureConn) SetDeadline(t time.Time) error { 71 return c.insecure.SetDeadline(t) 72 } 73 74 func (c *secureConn) SetReadDeadline(t time.Time) error { 75 return c.insecure.SetReadDeadline(t) 76 } 77 78 func (c *secureConn) SetWriteDeadline(t time.Time) error { 79 return c.insecure.SetWriteDeadline(t) 80 } 81 82 // LocalMultiaddr is the Multiaddr on this side 83 func (c *secureConn) LocalMultiaddr() ma.Multiaddr { 84 return c.insecure.LocalMultiaddr() 85 } 86 87 // RemoteMultiaddr is the Multiaddr on the remote side 88 func (c *secureConn) RemoteMultiaddr() ma.Multiaddr { 89 return c.insecure.RemoteMultiaddr() 90 } 91 92 // LocalPeer is the Peer on this side 93 func (c *secureConn) LocalPeer() peer.ID { 94 return c.secure.LocalPeer() 95 } 96 97 // RemotePeer is the Peer on the remote side 98 func (c *secureConn) RemotePeer() peer.ID { 99 return c.secure.RemotePeer() 100 } 101 102 // LocalPrivateKey is the public key of the peer on this side 103 func (c *secureConn) LocalPrivateKey() ic.PrivKey { 104 return c.secure.LocalPrivateKey() 105 } 106 107 // RemotePubKey is the public key of the peer on the remote side 108 func (c *secureConn) RemotePublicKey() ic.PubKey { 109 return c.secure.RemotePublicKey() 110 } 111 112 // Read reads data, net.Conn style 113 func (c *secureConn) Read(buf []byte) (int, error) { 114 return c.secure.ReadWriter().Read(buf) 115 } 116 117 // Write writes data, net.Conn style 118 func (c *secureConn) Write(buf []byte) (int, error) { 119 return c.secure.ReadWriter().Write(buf) 120 } 121 122 func (c *secureConn) NextMsgLen() (int, error) { 123 return c.secure.ReadWriter().NextMsgLen() 124 } 125 126 // ReadMsg reads data, net.Conn style 127 func (c *secureConn) ReadMsg() ([]byte, error) { 128 return c.secure.ReadWriter().ReadMsg() 129 } 130 131 // WriteMsg writes data, net.Conn style 132 func (c *secureConn) WriteMsg(buf []byte) error { 133 return c.secure.ReadWriter().WriteMsg(buf) 134 } 135 136 // ReleaseMsg releases a buffer 137 func (c *secureConn) ReleaseMsg(m []byte) { 138 c.secure.ReadWriter().ReleaseMsg(m) 139 }