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  }