func connect(args args) error { p, ps, err := setupPeer(args) if err != nil { return err } var conn net.Conn if args.listen { conn, err = Listen(args.localAddr) } else { conn, err = Dial(args.localAddr, args.remoteAddr) } if err != nil { return err } // log everything that goes through conn rwc := &logRW{n: "conn", rw: conn} // OK, let's setup the channel. sk := ps.PrivKey(p) sg := secio.SessionGenerator{LocalID: p, PrivateKey: sk} sess, err := sg.NewSession(nil, rwc) if err != nil { return err } out("remote peer id: %s", sess.RemotePeer()) netcat(sess.ReadWriter().(io.ReadWriteCloser)) return nil }
// newConn constructs a new connection func newSecureConn(ctx context.Context, sk ic.PrivKey, insecure Conn) (Conn, error) { if insecure == nil { return nil, errors.New("insecure is nil") } if insecure.LocalPeer() == "" { return nil, errors.New("insecure.LocalPeer() is nil") } if sk == nil { return nil, errors.New("private key is nil") } // NewSession performs the secure handshake, which takes multiple RTT sessgen := secio.SessionGenerator{LocalID: insecure.LocalPeer(), PrivateKey: sk} secure, err := sessgen.NewSession(ctx, insecure) if err != nil { return nil, err } conn := &secureConn{ insecure: insecure, secure: secure, } return conn, nil }