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

move go-libp2p-pnet here #1465

Merged
merged 43 commits into from
May 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
b5de300
Add pskConn
Kubuxu Oct 26, 2016
55d3a73
Disable tests for now and start implementing protector
Kubuxu Oct 27, 2016
c6ffeff
Start implementing codecs
Kubuxu Oct 27, 2016
3d3f679
Implement protector
Kubuxu Oct 28, 2016
9570786
Add decoding tests, make conn tests compile
Kubuxu Nov 2, 2016
23d1243
Enable tests back again using dummy-conn
Kubuxu Nov 7, 2016
1128a7c
Move from reader base ctor to bytestring based one
Kubuxu Nov 9, 2016
92a6e39
Implement fingerprint
Kubuxu Nov 24, 2016
8b54290
Add more info to error
Kubuxu Nov 24, 2016
85eab91
Update interface-pnet to 1.0.1
Kubuxu Nov 25, 2016
5f77c1f
Add function to generate PSK key
Kubuxu Feb 16, 2017
e48088b
Move to go-libp2p-transport.Conn
Kubuxu Feb 16, 2017
93471c1
Add docs to GenerateV1PSK
Kubuxu Feb 17, 2017
80bf4d2
read nonces, even if they are fragmented
marten-seemann May 27, 2017
bff8aac
Merge pull request #7 from marten-seemann/fix-nonce-read
Kubuxu May 27, 2017
b2e8111
add NewV1ProtectorFromBytes and tests for it
Kubuxu Jul 19, 2017
1915779
update msgio
Stebalien Nov 20, 2017
9e983da
don't copy the buffer pool
Stebalien Nov 20, 2017
30a698d
Merge pull request #15 from libp2p/feat/update-msgio
Stebalien Nov 20, 2017
a1ed19f
gx: update deps
Stebalien Nov 21, 2017
c49327c
Merge pull request #16 from libp2p/gx/update-steb
Stebalien Nov 21, 2017
02aa648
correctly handle Read errors/EOF
Stebalien Mar 8, 2018
cec0aa6
annotate the "malformed key" error from pnet protector
Stebalien Apr 20, 2018
11f3d9b
Merge pull request #21 from libp2p/fix/annotate-pnet-bad-key-error
Kubuxu Apr 20, 2018
34c0789
wrap net conns, not transport conns
Stebalien Jan 18, 2018
8684d2b
Merge pull request #19 from libp2p/feat/refactor
Stebalien Jun 6, 2018
fbcd00d
avoid the buffer-pool on read
Stebalien Sep 25, 2018
f9f8239
switch to go-buffer-pool
Stebalien Sep 25, 2018
03d3fdb
Merge pull request #24 from libp2p/feat/switch-to-buffer-pool
Kubuxu Sep 26, 2018
767f2b7
remove dependency on go-multicodec
Stebalien Mar 22, 2019
e90259b
test decoding on windows
Stebalien Mar 22, 2019
8c9004d
Add bad encoding test case
Kubuxu Mar 22, 2019
50f09fa
add back support for binary encoding
Stebalien Mar 22, 2019
410c629
Merge pull request #26 from libp2p/feat/no-multicodec
Kubuxu Mar 22, 2019
506082e
update readme badges
yusefnapora Apr 9, 2019
6793f6f
update readme badges
yusefnapora Apr 9, 2019
3ca427f
Consolidate abstractions and core types into go-libp2p-core (#27)
raulk May 25, 2019
a7b7b60
remove key serialization, construct conn from ipnet.PSK
marten-seemann Feb 20, 2020
e91fc11
Merge pull request #32 from libp2p/generalize-private-network
Stebalien Mar 7, 2020
64e14f9
fix staticcheck
marten-seemann Apr 23, 2021
fd9610c
Merge pull request #41 from libp2p/fix-staticcheck
Stebalien Apr 23, 2021
a225be0
move go-libp2p-pnet here
marten-seemann Apr 27, 2022
6f87598
switch from github.com/libp2p/go-libp2p-pnet to p2p/net/pnet
marten-seemann Apr 27, 2022
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
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.17

require (
github.com/benbjohnson/clock v1.3.0
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c
github.com/flynn/noise v1.0.0
github.com/gogo/protobuf v1.3.2
github.com/golang/mock v1.6.0
Expand All @@ -23,7 +24,6 @@ require (
github.com/libp2p/go-libp2p-core v0.15.1
github.com/libp2p/go-libp2p-nat v0.1.0
github.com/libp2p/go-libp2p-peerstore v0.6.0
github.com/libp2p/go-libp2p-pnet v0.2.0
github.com/libp2p/go-libp2p-resource-manager v0.2.1
github.com/libp2p/go-libp2p-testing v0.9.2
github.com/libp2p/go-libp2p-tls v0.4.1
Expand Down Expand Up @@ -63,7 +63,6 @@ require (
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/elastic/gosigar v0.14.2 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
Expand Down
18 changes: 18 additions & 0 deletions p2p/net/pnet/protector.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package pnet

import (
"errors"
"net"

ipnet "github.com/libp2p/go-libp2p-core/pnet"
)

// NewProtectedConn creates a new protected connection
func NewProtectedConn(psk ipnet.PSK, conn net.Conn) (net.Conn, error) {
if len(psk) != 32 {
return nil, errors.New("expected 32 byte PSK")
}
var p [32]byte
copy(p[:], psk)
return newPSKConn(&p, conn)
}
83 changes: 83 additions & 0 deletions p2p/net/pnet/psk_conn.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package pnet

import (
"crypto/cipher"
"crypto/rand"
"io"
"net"

"github.com/libp2p/go-libp2p-core/pnet"

"github.com/davidlazar/go-crypto/salsa20"
pool "github.com/libp2p/go-buffer-pool"
)

// we are using buffer pool as user needs their slice back
// so we can't do XOR cripter in place
var (
errShortNonce = pnet.NewError("could not read full nonce")
errInsecureNil = pnet.NewError("insecure is nil")
errPSKNil = pnet.NewError("pre-shread key is nil")
)

type pskConn struct {
net.Conn
psk *[32]byte

writeS20 cipher.Stream
readS20 cipher.Stream
}

func (c *pskConn) Read(out []byte) (int, error) {
if c.readS20 == nil {
nonce := make([]byte, 24)
_, err := io.ReadFull(c.Conn, nonce)
if err != nil {
return 0, errShortNonce
}
c.readS20 = salsa20.New(c.psk, nonce)
}

n, err := c.Conn.Read(out) // read to in
if n > 0 {
c.readS20.XORKeyStream(out[:n], out[:n]) // decrypt to out buffer
}
return n, err
}

func (c *pskConn) Write(in []byte) (int, error) {
if c.writeS20 == nil {
nonce := make([]byte, 24)
_, err := rand.Read(nonce)
if err != nil {
return 0, err
}
_, err = c.Conn.Write(nonce)
if err != nil {
return 0, err
}

c.writeS20 = salsa20.New(c.psk, nonce)
}
out := pool.Get(len(in))
defer pool.Put(out)

c.writeS20.XORKeyStream(out, in) // encrypt

return c.Conn.Write(out) // send
}

var _ net.Conn = (*pskConn)(nil)

func newPSKConn(psk *[32]byte, insecure net.Conn) (net.Conn, error) {
if insecure == nil {
return nil, errInsecureNil
}
if psk == nil {
return nil, errPSKNil
}
return &pskConn{
Conn: insecure,
psk: psk,
}, nil
}
92 changes: 92 additions & 0 deletions p2p/net/pnet/psk_conn_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package pnet

import (
"bytes"
"context"
"math/rand"
"net"
"testing"
)

func setupPSKConns(ctx context.Context, t *testing.T) (net.Conn, net.Conn) {
testPSK := make([]byte, 32) // null bytes are as good test key as any other key
conn1, conn2 := net.Pipe()

psk1, err := NewProtectedConn(testPSK, conn1)
if err != nil {
t.Fatal(err)
}
psk2, err := NewProtectedConn(testPSK, conn2)
if err != nil {
t.Fatal(err)
}
return psk1, psk2
}

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

psk1, psk2 := setupPSKConns(ctx, t)
msg1 := []byte("hello world")
out1 := make([]byte, len(msg1))

wch := make(chan error)
go func() {
_, err := psk1.Write(msg1)
wch <- err
}()
n, err := psk2.Read(out1)
if err != nil {
t.Fatal(err)
}

err = <-wch
if err != nil {
t.Fatal(err)
}

if n != len(out1) {
t.Fatalf("expected to read %d bytes, read: %d", len(out1), n)
}

if !bytes.Equal(msg1, out1) {
t.Fatalf("input and output are not the same")
}
}

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

psk1, psk2 := setupPSKConns(ctx, t)

in := make([]byte, 1000)
_, err := rand.Read(in)
if err != nil {
t.Fatal(err)
}

out := make([]byte, 100)

wch := make(chan error)
go func() {
_, err := psk1.Write(in)
wch <- err
}()

for i := 0; i < 10; i++ {
if _, err := psk2.Read(out); err != nil {
t.Fatal(err)
}
if !bytes.Equal(in[:100], out) {
t.Fatalf("input and output are not the same")
}
in = in[100:]
}

err = <-wch
if err != nil {
t.Fatal(err)
}
}
3 changes: 2 additions & 1 deletion p2p/net/upgrader/upgrader.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import (
"net"
"time"

"github.com/libp2p/go-libp2p/p2p/net/pnet"

"github.com/libp2p/go-libp2p-core/connmgr"
"github.com/libp2p/go-libp2p-core/network"
"github.com/libp2p/go-libp2p-core/peer"
ipnet "github.com/libp2p/go-libp2p-core/pnet"
"github.com/libp2p/go-libp2p-core/sec"
"github.com/libp2p/go-libp2p-core/transport"

pnet "github.com/libp2p/go-libp2p-pnet"
manet "github.com/multiformats/go-multiaddr/net"
)

Expand Down