Skip to content

Commit cccdfef

Browse files
authored
Merge pull request #422 from perun-network/421_exchange_addrs_auth
fix(wire/net): remove test backend signature from authMsg of exchange address protocol
2 parents f824816 + 973104e commit cccdfef

File tree

6 files changed

+68
-64
lines changed

6 files changed

+68
-64
lines changed

wire/account.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ type Account interface {
4040
Sign(msg []byte) ([]byte, error)
4141
}
4242

43-
const testBackendID = 0
44-
4543
var _ Msg = (*AuthResponseMsg)(nil)
4644

4745
// AuthResponseMsg is the response message in the peer authentication protocol.
@@ -84,7 +82,7 @@ func (m *AuthResponseMsg) Decode(r io.Reader) (err error) {
8482
}
8583

8684
// NewAuthResponseMsg creates an authentication response message.
87-
func NewAuthResponseMsg(acc map[wallet.BackendID]Account) (Msg, error) {
85+
func NewAuthResponseMsg(acc map[wallet.BackendID]Account, backendID wallet.BackendID) (Msg, error) {
8886
addressMap := make(map[wallet.BackendID]Address)
8987
for id, a := range acc {
9088
addressMap[id] = a.Address()
@@ -98,7 +96,7 @@ func NewAuthResponseMsg(acc map[wallet.BackendID]Account) (Msg, error) {
9896
}
9997
addressBytes = append(addressBytes, addrBytes...)
10098
}
101-
signature, err := acc[testBackendID].Sign(addressBytes)
99+
signature, err := acc[backendID].Sign(addressBytes)
102100
if err != nil {
103101
return nil, fmt.Errorf("failed to sign address: %w", err)
104102
}

wire/net/exchange_addr.go

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -63,33 +63,35 @@ func IsAuthenticationError(err error) bool {
6363
func ExchangeAddrsActive(ctx context.Context, id map[wallet.BackendID]wire.Account, peer map[wallet.BackendID]wire.Address, conn Conn) error {
6464
var err error
6565
ok := pkg.TerminatesCtx(ctx, func() {
66-
authMsg, err2 := wire.NewAuthResponseMsg(id)
67-
if err2 != nil {
68-
err = errors.WithMessage(err2, "creating auth message")
69-
return
70-
}
71-
err = conn.Send(&wire.Envelope{
72-
Sender: wire.AddressMapfromAccountMap(id),
73-
Recipient: peer,
74-
Msg: authMsg,
75-
})
76-
if err != nil {
77-
err = errors.WithMessage(err, "sending message")
78-
return
79-
}
66+
for bid := range id {
67+
authMsg, err2 := wire.NewAuthResponseMsg(id, bid)
68+
if err2 != nil {
69+
err = errors.WithMessage(err2, "creating auth message")
70+
return
71+
}
72+
err = conn.Send(&wire.Envelope{
73+
Sender: wire.AddressMapfromAccountMap(id),
74+
Recipient: peer,
75+
Msg: authMsg,
76+
})
77+
if err != nil {
78+
err = errors.WithMessage(err, "sending message")
79+
return
80+
}
8081

81-
var e *wire.Envelope
82-
if e, err = conn.Recv(); err != nil {
83-
err = errors.WithMessage(err, "receiving message")
84-
} else if _, ok := e.Msg.(*wire.AuthResponseMsg); !ok {
85-
err = errors.Errorf("expected AuthResponse wire msg, got %v", e.Msg.Type())
86-
} else if msg, ok := e.Msg.(*wire.AuthResponseMsg); ok {
87-
if check := VerifyAddressSignature(peer, msg.Signature); check != nil {
88-
err = errors.WithMessage(check, "verifying peer address's signature")
82+
var e *wire.Envelope
83+
if e, err = conn.Recv(); err != nil {
84+
err = errors.WithMessage(err, "receiving message")
85+
} else if _, ok := e.Msg.(*wire.AuthResponseMsg); !ok {
86+
err = errors.Errorf("expected AuthResponse wire msg, got %v", e.Msg.Type())
87+
} else if msg, ok := e.Msg.(*wire.AuthResponseMsg); ok {
88+
if check := VerifyAddressSignature(peer, msg.Signature); check != nil {
89+
err = errors.WithMessage(check, "verifying peer address's signature")
90+
}
91+
} else if !channel.EqualWireMaps(e.Recipient, wire.AddressMapfromAccountMap(id)) &&
92+
!channel.EqualWireMaps(e.Sender, peer) {
93+
err = NewAuthenticationError(e.Sender, e.Recipient, wire.AddressMapfromAccountMap(id), "unmatched response sender or recipient")
8994
}
90-
} else if !channel.EqualWireMaps(e.Recipient, wire.AddressMapfromAccountMap(id)) &&
91-
!channel.EqualWireMaps(e.Sender, peer) {
92-
err = NewAuthenticationError(e.Sender, e.Recipient, wire.AddressMapfromAccountMap(id), "unmatched response sender or recipient")
9395
}
9496
})
9597

@@ -108,33 +110,35 @@ func ExchangeAddrsPassive(ctx context.Context, id map[wallet.BackendID]wire.Acco
108110
var err error
109111
addrs := wire.AddressMapfromAccountMap(id)
110112
ok := pkg.TerminatesCtx(ctx, func() {
111-
var e *wire.Envelope
112-
if e, err = conn.Recv(); err != nil {
113-
err = errors.WithMessage(err, "receiving auth message")
114-
} else if _, ok := e.Msg.(*wire.AuthResponseMsg); !ok {
115-
err = errors.Errorf("expected AuthResponse wire msg, got %v", e.Msg.Type())
116-
} else if !channel.EqualWireMaps(e.Recipient, addrs) {
117-
err = NewAuthenticationError(e.Sender, e.Recipient, wire.AddressMapfromAccountMap(id), "unmatched response sender or recipient")
118-
} else if msg, ok := e.Msg.(*wire.AuthResponseMsg); ok {
119-
if err = VerifyAddressSignature(e.Sender, msg.Signature); err != nil {
120-
err = errors.WithMessage(err, "verifying peer address's signature")
113+
for bid := range id {
114+
var e *wire.Envelope
115+
if e, err = conn.Recv(); err != nil {
116+
err = errors.WithMessage(err, "receiving auth message")
117+
} else if _, ok := e.Msg.(*wire.AuthResponseMsg); !ok {
118+
err = errors.Errorf("expected AuthResponse wire msg, got %v", e.Msg.Type())
119+
} else if !channel.EqualWireMaps(e.Recipient, addrs) {
120+
err = NewAuthenticationError(e.Sender, e.Recipient, wire.AddressMapfromAccountMap(id), "unmatched response sender or recipient")
121+
} else if msg, ok := e.Msg.(*wire.AuthResponseMsg); ok {
122+
if err = VerifyAddressSignature(e.Sender, msg.Signature); err != nil {
123+
err = errors.WithMessage(err, "verifying peer address's signature")
124+
}
121125
}
122-
}
123126

124-
if err != nil {
125-
return
126-
}
127+
if err != nil {
128+
return
129+
}
127130

128-
authMsg, err2 := wire.NewAuthResponseMsg(id)
129-
if err2 != nil {
130-
err = errors.WithMessage(err2, "creating auth message")
131-
return
131+
authMsg, err2 := wire.NewAuthResponseMsg(id, bid)
132+
if err2 != nil {
133+
err = errors.WithMessage(err2, "creating auth message")
134+
return
135+
}
136+
addr, err = e.Sender, conn.Send(&wire.Envelope{
137+
Sender: wire.AddressMapfromAccountMap(id),
138+
Recipient: e.Sender,
139+
Msg: authMsg,
140+
})
132141
}
133-
addr, err = e.Sender, conn.Send(&wire.Envelope{
134-
Sender: wire.AddressMapfromAccountMap(id),
135-
Recipient: e.Sender,
136-
Msg: authMsg,
137-
})
138142
})
139143

140144
if !ok {

wire/net/simple/address.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ import (
2828
"perun.network/go-perun/wire"
2929
)
3030

31-
// testBackendID is the identifier for the simulated Backend.
32-
const testBackendID = 0
33-
3431
// Address is a wire address.
3532
type Address struct {
3633
Name string
@@ -208,18 +205,22 @@ func NewRandomAddress(rng *rand.Rand) *Address {
208205
}
209206

210207
// NewRandomAddresses returns a new random peer address.
211-
func NewRandomAddresses(rng *rand.Rand) map[wallet.BackendID]wire.Address {
208+
func NewRandomAddresses(rng *rand.Rand, backendID []wallet.BackendID) map[wallet.BackendID]wire.Address {
212209
const addrLen = 32
213210
l := rng.Intn(addrLen)
214211
d := make([]byte, l)
215212
if _, err := rng.Read(d); err != nil {
216213
panic(err)
217214
}
218215

219-
a := Address{
220-
Name: string(d),
216+
addresses := make(map[wallet.BackendID]wire.Address)
217+
for _, id := range backendID {
218+
a := Address{
219+
Name: string(d),
220+
}
221+
addresses[id] = &a
221222
}
222-
return map[wallet.BackendID]wire.Address{testBackendID: &a}
223+
return addresses
223224
}
224225

225226
// Verify verifies a message signature.

wire/net/simple/dialer_internal_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func TestDialer_Dial(t *testing.T) {
139139
})
140140

141141
t.Run("unknown host", func(t *testing.T) {
142-
noHostAddr := NewRandomAddresses(rng)
142+
noHostAddr := NewRandomAddresses(rng, []wallet.BackendID{wiretest.TestBackendID})
143143
d.Register(noHostAddr, "no such host")
144144

145145
ctxtest.AssertTerminates(t, timeout, func() {
@@ -151,7 +151,7 @@ func TestDialer_Dial(t *testing.T) {
151151

152152
t.Run("unknown address", func(t *testing.T) {
153153
ctxtest.AssertTerminates(t, timeout, func() {
154-
unkownAddr := NewRandomAddresses(rng)
154+
unkownAddr := NewRandomAddresses(rng, []wallet.BackendID{wiretest.TestBackendID})
155155
conn, err := d.Dial(context.Background(), unkownAddr, ser)
156156
assert.Error(t, err)
157157
assert.Nil(t, conn)

wire/net/simple/simple_exchange_addr_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"time"
2828

2929
"perun.network/go-perun/channel"
30+
"perun.network/go-perun/wallet"
3031

3132
"github.com/stretchr/testify/assert"
3233

@@ -107,8 +108,8 @@ func newPipeConnPair() (a wirenet.Conn, b wirenet.Conn) {
107108
// recipient generated using randomness from rng.
108109
func newRandomEnvelope(rng *rand.Rand, m wire.Msg) *wire.Envelope {
109110
return &wire.Envelope{
110-
Sender: NewRandomAddresses(rng),
111-
Recipient: NewRandomAddresses(rng),
111+
Sender: NewRandomAddresses(rng, []wallet.BackendID{wiretest.TestBackendID}),
112+
Recipient: NewRandomAddresses(rng, []wallet.BackendID{wiretest.TestBackendID}),
112113
Msg: m,
113114
}
114115
}

wire/test/msgstest.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func AuthMsgsSerializationTest(t *testing.T, serializerTest func(t *testing.T, m
4040
t.Helper()
4141

4242
rng := pkgtest.Prng(t)
43-
testMsg, err := wire.NewAuthResponseMsg(NewRandomAccountMap(rng, TestBackendID))
43+
testMsg, err := wire.NewAuthResponseMsg(NewRandomAccountMap(rng, TestBackendID), TestBackendID)
4444
if err != nil {
4545
t.Fatal(err)
4646
}

0 commit comments

Comments
 (0)