Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add multistream select to select which crypto to use #33

Merged
merged 4 commits into from
Apr 6, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions p2p/net/conn/dial.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
addrutil "github.com/ipfs/go-libp2p/p2p/net/swarm/addr"
transport "github.com/ipfs/go-libp2p/p2p/net/transport"
peer "github.com/ipfs/go-libp2p/p2p/peer"
msmux "gx/ipfs/QmUeEcYJrzAEKdQXjzTxCgNZgc9sRuwharsvzzm5Gd2oGB/go-multistream"
manet "gx/ipfs/QmYVqhVfbK4BKvbW88Lhm26b3ud14sTBvcm1H7uWUx1Fkp/go-multiaddr-net"
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr"
Expand Down Expand Up @@ -62,6 +63,17 @@ func (d *Dialer) Dial(ctx context.Context, raddr ma.Multiaddr, remote peer.ID) (
maconn = d.Wrapper(maconn)
}

cryptoProtoChoice := SecioTag
if !EncryptConnections {
cryptoProtoChoice = NoEncryptionTag
}

err = msmux.SelectProtoOrFail(cryptoProtoChoice, maconn)
if err != nil {
errOut = err
return
}

c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn)
if err != nil {
maconn.Close()
Expand Down
30 changes: 30 additions & 0 deletions p2p/net/conn/dial_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
peer "github.com/ipfs/go-libp2p/p2p/peer"
tu "github.com/ipfs/go-libp2p/testutil"

msmux "gx/ipfs/QmUeEcYJrzAEKdQXjzTxCgNZgc9sRuwharsvzzm5Gd2oGB/go-multistream"
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr"
)
Expand Down Expand Up @@ -319,3 +320,32 @@ func TestDialerCloseEarlySecure(t *testing.T) {
// t.Skip("Skipping in favor of another test")
testDialerCloseEarly(t, true)
}

func TestMultistreamHeader(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

p1 := tu.RandPeerNetParamsOrFatal(t)

l1, err := Listen(ctx, p1.Addr, p1.ID, p1.PrivKey)
if err != nil {
t.Fatal(err)
}

p1.Addr = l1.Multiaddr() // Addr has been determined by kernel.

go func() {
_, _ = l1.Accept()
}()

con, err := net.Dial("tcp", l1.Addr().String())
if err != nil {
t.Fatal(err)
}
defer con.Close()

err = msmux.SelectProtoOrFail(SecioTag, con)
if err != nil {
t.Fatal(err)
}
}
18 changes: 18 additions & 0 deletions p2p/net/conn/listen.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,15 @@ import (
peer "github.com/ipfs/go-libp2p/p2p/peer"
"gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess"
goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context"
msmux "gx/ipfs/QmUeEcYJrzAEKdQXjzTxCgNZgc9sRuwharsvzzm5Gd2oGB/go-multistream"
tec "gx/ipfs/QmWHgLqrghM9zw77nF6gdvT9ExQ2RB9pLxkd8sDHZf1rWb/go-temp-err-catcher"
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr"
)

const SecioTag = "/secio/1.0.0"
const NoEncryptionTag = "/plaintext/1.0.0"

// ConnWrapper is any function that wraps a raw multiaddr connection
type ConnWrapper func(transport.Conn) transport.Conn

Expand All @@ -31,6 +35,8 @@ type listener struct {
wrapper ConnWrapper

proc goprocess.Process

mux *msmux.MultistreamMuxer
}

func (l *listener) teardown() error {
Expand Down Expand Up @@ -98,6 +104,11 @@ func (l *listener) Accept() (net.Conn, error) {
maconn = l.wrapper(maconn)
}

_, _, err = l.mux.Negotiate(maconn)
if err != nil {
return nil, err
}

c, err := newSingleConn(ctx, l.local, "", maconn)
if err != nil {
if catcher.IsTemporary(err) {
Expand Down Expand Up @@ -150,9 +161,16 @@ func WrapTransportListener(ctx context.Context, ml transport.Listener, local pee
Listener: ml,
local: local,
privk: sk,
mux: msmux.NewMultistreamMuxer(),
}
l.proc = goprocessctx.WithContextAndTeardown(ctx, l.teardown)

if EncryptConnections {
l.mux.AddHandler(SecioTag, nil)
} else {
l.mux.AddHandler(NoEncryptionTag, nil)
}

log.Debugf("Conn Listener on %s", l.Multiaddr())
log.Event(ctx, "swarmListen", l)
return l, nil
Expand Down
4 changes: 2 additions & 2 deletions p2p/net/swarm/swarm.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ func init() {
LogOutput: ioutil.Discard,
}

msstpt.AddTransport("/yamux", ymxtpt)
msstpt.AddTransport("/spdystream", spdy.Transport)
msstpt.AddTransport("/yamux/1.0.0", ymxtpt)
msstpt.AddTransport("/spdy/3.1.0", spdy.Transport)

PSTransport = msstpt
}
Expand Down
2 changes: 1 addition & 1 deletion p2p/protocol/identify/id.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
var log = logging.Logger("net/identify")

// ID is the protocol.ID of the Identify Service.
const ID = "/ipfs/identify"
const ID = "/ipfs/id/1.0.0"

// LibP2PVersion holds the current protocol version for a client running this code
// TODO(jbenet): fix the versioning mess.
Expand Down
2 changes: 1 addition & 1 deletion p2p/protocol/ping/ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ var log = logging.Logger("ping")

const PingSize = 32

const ID = "/ipfs/ping"
const ID = "/ipfs/ping/1.0.0"

type PingService struct {
Host host.Host
Expand Down
2 changes: 1 addition & 1 deletion p2p/protocol/relay/relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
var log = logging.Logger("github.com/ipfs/go-libp2p/p2p/protocol/relay")

// ID is the protocol.ID of the Relay Service.
const ID protocol.ID = "/ipfs/relay"
const ID protocol.ID = "/ipfs/relay/line/0.1.0"

// Relay is a structure that implements ProtocolRelay.
// It is a simple relay service which forwards traffic
Expand Down