Skip to content
Snippets Groups Projects
Commit fff7fe73 authored by Benjamin Wenger's avatar Benjamin Wenger
Browse files

tested both adminListener and userListener

parent a4e5f641
No related branches found
No related tags found
5 merge requests!510Release,!419rewrote the health tracker to both consider if there are waiting rounds and...,!371[Channel RSAtoPrivate] Implement Reverse Asymmetric in Client/Broadcast,!354Channels impl,!340Project/channels
...@@ -66,7 +66,7 @@ func DecodeSizedBroadcast(data []byte) ([]byte, error) { ...@@ -66,7 +66,7 @@ func DecodeSizedBroadcast(data []byte) ([]byte, error) {
errDecodeSizedBroadcastDataLen, len(data), sizedBroadcastMinSize) errDecodeSizedBroadcastDataLen, len(data), sizedBroadcastMinSize)
} }
size := binary.LittleEndian.Uint16(data[:sizeSize]) size := GetSizedBroadcastSize(data)
if int(size) > len(data[sizeSize:]) { if int(size) > len(data[sizeSize:]) {
return nil, errors.Errorf( return nil, errors.Errorf(
errDecodeSizedBroadcastSize, size, len(data[sizeSize:])) errDecodeSizedBroadcastSize, size, len(data[sizeSize:]))
...@@ -75,6 +75,16 @@ func DecodeSizedBroadcast(data []byte) ([]byte, error) { ...@@ -75,6 +75,16 @@ func DecodeSizedBroadcast(data []byte) ([]byte, error) {
return data[sizeSize : size+sizeSize], nil return data[sizeSize : size+sizeSize], nil
} }
// GetSizedBroadcastSize returns the size of the sized broadcast, used for
// testing
func GetSizedBroadcastSize(data []byte) uint16 {
if len(data) < sizeSize {
return 0
}
return binary.LittleEndian.Uint16(data[:sizeSize])
}
// MaxSizedBroadcastPayloadSize returns the maximum size of a payload that can // MaxSizedBroadcastPayloadSize returns the maximum size of a payload that can
// fit in a sized broadcast message for the given maximum cMix message payload // fit in a sized broadcast message for the given maximum cMix message payload
// size. // size.
......
...@@ -13,9 +13,8 @@ import ( ...@@ -13,9 +13,8 @@ import (
// the adminListener adheres to the broadcast listener interface and is used // the adminListener adheres to the broadcast listener interface and is used
// when admin messages are received on the channel // when admin messages are received on the channel
type adminListener struct { type adminListener struct {
name NameService
events *events
chID *id.ID chID *id.ID
trigger triggerAdminEventFunc
} }
func (al *adminListener) Listen(payload []byte, func (al *adminListener) Listen(payload []byte,
...@@ -33,7 +32,7 @@ func (al *adminListener) Listen(payload []byte, ...@@ -33,7 +32,7 @@ func (al *adminListener) Listen(payload []byte,
msgID := channel.MakeMessageID(payloadUnpadded) msgID := channel.MakeMessageID(payloadUnpadded)
//Decode the message as a channel message //Decode the message as a channel message
var cm *ChannelMessage cm := &ChannelMessage{}
if err = proto.Unmarshal(payloadUnpadded, cm); err != nil { if err = proto.Unmarshal(payloadUnpadded, cm); err != nil {
jww.WARN.Printf("Failed to unmarshal Channel Message from Admin"+ jww.WARN.Printf("Failed to unmarshal Channel Message from Admin"+
" on channel %s", al.chID) " on channel %s", al.chID)
...@@ -51,7 +50,7 @@ func (al *adminListener) Listen(payload []byte, ...@@ -51,7 +50,7 @@ func (al *adminListener) Listen(payload []byte,
} }
//Submit the message to the event model for listening //Submit the message to the event model for listening
al.events.triggerAdminEvent(al.chID, cm, msgID, receptionID, round) al.trigger(al.chID, cm, msgID, receptionID, round)
return return
} }
package channels
import (
"bytes"
"gitlab.com/elixxir/client/broadcast"
"testing"
"time"
"github.com/golang/protobuf/proto"
"gitlab.com/elixxir/client/cmix/identity/receptionID"
"gitlab.com/elixxir/client/cmix/rounds"
cryptoChannel "gitlab.com/elixxir/crypto/channel"
"gitlab.com/elixxir/primitives/states"
"gitlab.com/xx_network/primitives/id"
)
type triggerAdminEventDummy struct {
gotData bool
chID *id.ID
cm *ChannelMessage
msgID cryptoChannel.MessageID
receptionID receptionID.EphemeralIdentity
round rounds.Round
}
func (taed *triggerAdminEventDummy) triggerAdminEvent(chID *id.ID, cm *ChannelMessage,
messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
round rounds.Round) {
taed.gotData = true
taed.chID = chID
taed.cm = cm
taed.msgID = messageID
taed.receptionID = receptionID
taed.round = round
}
// Tests the happy path
func TestAdminListener_Listen(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
cm := &ChannelMessage{
Lease: int64(time.Hour),
RoundID: uint64(r.ID),
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
chMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, cmSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
msgID := cryptoChannel.MakeMessageID(cmSerial)
//build the listener
dummy := &triggerAdminEventDummy{}
al := adminListener{
chID: chID,
trigger: dummy.triggerAdminEvent,
}
//call the listener
al.Listen(chMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if !dummy.gotData {
t.Fatalf("No data returned after valid listen")
}
if !dummy.chID.Cmp(chID) {
t.Errorf("Channel ID not correct: %s vs %s", dummy.chID, chID)
}
if !bytes.Equal(cm.Payload, dummy.cm.Payload) {
t.Errorf("payload not correct: %s vs %s", cm.Payload,
dummy.cm.Payload)
}
if !msgID.Equals(dummy.msgID) {
t.Errorf("messageIDs not correct: %s vs %s", msgID,
dummy.msgID)
}
if r.ID != dummy.round.ID {
t.Errorf("rounds not correct: %s vs %s", r.ID,
dummy.round.ID)
}
}
// Tests that the message is rejected when the round it came on doesnt
// match the round in the channel message
func TestAdminListener_Listen_BadRound(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
cm := &ChannelMessage{
Lease: int64(time.Hour),
// different from the round above
RoundID: 69,
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
chMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, cmSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerAdminEventDummy{}
al := adminListener{
chID: chID,
trigger: dummy.triggerAdminEvent,
}
//call the listener
al.Listen(chMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("payload handled when it should have failed due to " +
"a round issue")
}
}
// Tests that the message is rejected when the channel message is malformed
func TestAdminListener_Listen_BadChannelMessage(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
cmSerial := []byte("blarg")
chMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, cmSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerAdminEventDummy{}
al := adminListener{
chID: chID,
trigger: dummy.triggerAdminEvent,
}
//call the listener
al.Listen(chMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("payload handled when it should have failed due to " +
"a malformed channel message")
}
}
// Tests that the message is rejected when the sized broadcast message is
//malformed
func TestAdminListener_Listen_BadSizedBroadcast(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
cm := &ChannelMessage{
Lease: int64(time.Hour),
// different from the round above
RoundID: 69,
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
chMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, cmSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//remove half the sized broadcast to make it malformed
chMsgSerialSized = chMsgSerialSized[:broadcast.GetSizedBroadcastSize(chMsgSerialSized)/2]
//build the listener
dummy := &triggerAdminEventDummy{}
al := adminListener{
chID: chID,
trigger: dummy.triggerAdminEvent,
}
//call the listener
al.Listen(chMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("payload handled when it should have failed due to " +
"a malformed sized broadcast")
}
}
...@@ -113,6 +113,9 @@ func (e *events) RegisterReceiveHandler(messageType MessageType, ...@@ -113,6 +113,9 @@ func (e *events) RegisterReceiveHandler(messageType MessageType,
return nil return nil
} }
type triggerEventFunc func(chID *id.ID, umi *userMessageInternal,
receptionID receptionID.EphemeralIdentity, round rounds.Round)
// triggerEvent is an internal function which is used to trigger message // triggerEvent is an internal function which is used to trigger message
// reception on a message received from a user (symmetric encryption) // reception on a message received from a user (symmetric encryption)
// It will call the appropriate MessageTypeHandler assuming one exists. // It will call the appropriate MessageTypeHandler assuming one exists.
...@@ -139,6 +142,10 @@ func (e *events) triggerEvent(chID *id.ID, umi *userMessageInternal, ...@@ -139,6 +142,10 @@ func (e *events) triggerEvent(chID *id.ID, umi *userMessageInternal,
return return
} }
type triggerAdminEventFunc func(chID *id.ID, cm *ChannelMessage,
messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity,
round rounds.Round)
// triggerAdminEvent is an internal function which is used to trigger message // triggerAdminEvent is an internal function which is used to trigger message
// reception on a message received from the admin (asymmetric encryption) // reception on a message received from the admin (asymmetric encryption)
// It will call the appropriate MessageTypeHandler assuming one exists. // It will call the appropriate MessageTypeHandler assuming one exists.
......
...@@ -92,17 +92,16 @@ func (m *manager) addChannel(channel cryptoBroadcast.Channel) error { ...@@ -92,17 +92,16 @@ func (m *manager) addChannel(channel cryptoBroadcast.Channel) error {
// Connect to listeners // Connect to listeners
err = b.RegisterListener((&userListener{ err = b.RegisterListener((&userListener{
name: m.name, name: m.name,
events: m.events,
chID: channel.ReceptionID, chID: channel.ReceptionID,
trigger: m.events.triggerEvent,
}).Listen, broadcast.Symmetric) }).Listen, broadcast.Symmetric)
if err != nil { if err != nil {
return err return err
} }
err = b.RegisterListener((&adminListener{ err = b.RegisterListener((&adminListener{
name: m.name,
events: m.events,
chID: channel.ReceptionID, chID: channel.ReceptionID,
trigger: m.events.triggerAdminEvent,
}).Listen, broadcast.Asymmetric) }).Listen, broadcast.Asymmetric)
if err != nil { if err != nil {
return err return err
...@@ -225,17 +224,16 @@ func loadJoinedChannel(chId *id.ID, kv *versioned.KV, net broadcast.Client, ...@@ -225,17 +224,16 @@ func loadJoinedChannel(chId *id.ID, kv *versioned.KV, net broadcast.Client,
err = b.RegisterListener((&userListener{ err = b.RegisterListener((&userListener{
name: name, name: name,
events: e,
chID: jcd.broadcast.ReceptionID, chID: jcd.broadcast.ReceptionID,
trigger: e.triggerEvent,
}).Listen, broadcast.Symmetric) }).Listen, broadcast.Symmetric)
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = b.RegisterListener((&adminListener{ err = b.RegisterListener((&adminListener{
name: name,
events: e,
chID: jcd.broadcast.ReceptionID, chID: jcd.broadcast.ReceptionID,
trigger: e.triggerAdminEvent,
}).Listen, broadcast.Asymmetric) }).Listen, broadcast.Asymmetric)
if err != nil { if err != nil {
return nil, err return nil, err
......
...@@ -53,6 +53,9 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, ...@@ -53,6 +53,9 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
return nil, err return nil, err
} }
//make the messageID
msgId = cryptoChannel.MakeMessageID(chMsgSerial)
//Sign the message //Sign the message
messageSig, err := m.name.SignChannelMessage(chMsgSerial) messageSig, err := m.name.SignChannelMessage(chMsgSerial)
if err != nil { if err != nil {
...@@ -84,8 +87,6 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, ...@@ -84,8 +87,6 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType,
return nil, err return nil, err
} }
msgId = cryptoChannel.MakeMessageID(usrMsgSerialSized)
return usrMsgSerialSized, nil return usrMsgSerialSized, nil
} }
...@@ -132,6 +133,8 @@ func (m *manager) SendAdminGeneric(privKey *rsa.PrivateKey, channelID *id.ID, ...@@ -132,6 +133,8 @@ func (m *manager) SendAdminGeneric(privKey *rsa.PrivateKey, channelID *id.ID,
return nil, err return nil, err
} }
msgId = cryptoChannel.MakeMessageID(chMsgSerial)
//check if the message is too long //check if the message is too long
if len(chMsgSerial) > broadcast.MaxSizedBroadcastPayloadSize(privKey.Size()) { if len(chMsgSerial) > broadcast.MaxSizedBroadcastPayloadSize(privKey.Size()) {
return nil, MessageTooLongErr return nil, MessageTooLongErr
...@@ -144,8 +147,6 @@ func (m *manager) SendAdminGeneric(privKey *rsa.PrivateKey, channelID *id.ID, ...@@ -144,8 +147,6 @@ func (m *manager) SendAdminGeneric(privKey *rsa.PrivateKey, channelID *id.ID,
return nil, err return nil, err
} }
msgId = cryptoChannel.MakeMessageID(chMsgSerialSized)
return chMsgSerialSized, nil return chMsgSerialSized, nil
} }
......
...@@ -2,21 +2,16 @@ package channels ...@@ -2,21 +2,16 @@ package channels
import ( import (
"crypto/ed25519" "crypto/ed25519"
"testing"
"time" "time"
"gitlab.com/xx_network/crypto/csprng"
"gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id"
"gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/id/ephemeral"
"gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix"
"gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/cmix/message"
"gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/cmix/rounds"
"gitlab.com/elixxir/client/storage/versioned"
cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast"
cryptoChannel "gitlab.com/elixxir/crypto/channel" cryptoChannel "gitlab.com/elixxir/crypto/channel"
"gitlab.com/elixxir/crypto/fastRNG"
"gitlab.com/elixxir/ekv"
) )
type mockBroadcastClient struct{} type mockBroadcastClient struct{}
...@@ -51,7 +46,9 @@ func (m *mockBroadcastClient) DeleteClientService(clientID *id.ID) {} ...@@ -51,7 +46,9 @@ func (m *mockBroadcastClient) DeleteClientService(clientID *id.ID) {}
func (m *mockBroadcastClient) RemoveIdentity(id *id.ID) {} func (m *mockBroadcastClient) RemoveIdentity(id *id.ID) {}
type mockNameService struct{} type mockNameService struct {
validChMsg bool
}
func (m *mockNameService) GetUsername() string { func (m *mockNameService) GetUsername() string {
return "Alice" return "Alice"
...@@ -71,7 +68,7 @@ func (m *mockNameService) SignChannelMessage(message []byte) (signature []byte, ...@@ -71,7 +68,7 @@ func (m *mockNameService) SignChannelMessage(message []byte) (signature []byte,
func (m *mockNameService) ValidateChannelMessage(username string, lease time.Time, func (m *mockNameService) ValidateChannelMessage(username string, lease time.Time,
pubKey ed25519.PublicKey, authorIDSignature []byte) bool { pubKey ed25519.PublicKey, authorIDSignature []byte) bool {
return true return m.validChMsg
} }
type mockEventModel struct{} type mockEventModel struct{}
...@@ -99,12 +96,13 @@ func (m *mockEventModel) ReceiveReaction(channelID *id.ID, messageID cryptoChann ...@@ -99,12 +96,13 @@ func (m *mockEventModel) ReceiveReaction(channelID *id.ID, messageID cryptoChann
} }
func TestSendGeneric(t *testing.T) { /*func TestSendGeneric(t *testing.T) {
kv := versioned.NewKV(ekv.MakeMemstore()) kv := versioned.NewKV(ekv.MakeMemstore())
client := new(mockBroadcastClient) client := new(mockBroadcastClient)
rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)
nameService := new(mockNameService) nameService := new(mockNameService)
nameService.validChMsg = true
model := new(mockEventModel) model := new(mockEventModel)
manager := NewManager(kv, client, rngGen, nameService, model) manager := NewManager(kv, client, rngGen, nameService, model)
...@@ -134,4 +132,4 @@ func TestSendGeneric(t *testing.T) { ...@@ -134,4 +132,4 @@ func TestSendGeneric(t *testing.T) {
} }
t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId) t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId)
} }*/
...@@ -15,8 +15,8 @@ import ( ...@@ -15,8 +15,8 @@ import (
// when user messages are received on the channel // when user messages are received on the channel
type userListener struct { type userListener struct {
name NameService name NameService
events *events
chID *id.ID chID *id.ID
trigger triggerEventFunc
} }
func (gul *userListener) Listen(payload []byte, func (gul *userListener) Listen(payload []byte,
...@@ -54,7 +54,7 @@ func (gul *userListener) Listen(payload []byte, ...@@ -54,7 +54,7 @@ func (gul *userListener) Listen(payload []byte,
// check that the username lease is valid // check that the username lease is valid
usernameLeaseEnd := time.Unix(0, um.UsernameLease) usernameLeaseEnd := time.Unix(0, um.UsernameLease)
if usernameLeaseEnd.After(round.Timestamps[states.QUEUED]) { if !usernameLeaseEnd.After(round.Timestamps[states.QUEUED]) {
jww.WARN.Printf("Message %s on channel %s purportedly from %s "+ jww.WARN.Printf("Message %s on channel %s purportedly from %s "+
"has an expired lease, ended %s, round %d was sent at %s", msgID, "has an expired lease, ended %s, round %d was sent at %s", msgID,
gul.chID, um.Username, usernameLeaseEnd, round.ID, gul.chID, um.Username, usernameLeaseEnd, round.ID,
...@@ -82,7 +82,7 @@ func (gul *userListener) Listen(payload []byte, ...@@ -82,7 +82,7 @@ func (gul *userListener) Listen(payload []byte,
//TODO: Processing of the message relative to admin commands will be here //TODO: Processing of the message relative to admin commands will be here
//Submit the message to the event model for listening //Submit the message to the event model for listening
gul.events.triggerEvent(gul.chID, umi, receptionID, round) gul.trigger(gul.chID, umi, receptionID, round)
return return
} }
package channels
import (
"bytes"
"crypto/ed25519"
"github.com/golang/protobuf/proto"
"gitlab.com/elixxir/client/broadcast"
"gitlab.com/elixxir/client/cmix/identity/receptionID"
"gitlab.com/elixxir/client/cmix/rounds"
cryptoChannel "gitlab.com/elixxir/crypto/channel"
"gitlab.com/elixxir/primitives/states"
"gitlab.com/xx_network/primitives/id"
"math/rand"
"testing"
"time"
)
type triggerEventDummy struct {
gotData bool
chID *id.ID
umi *userMessageInternal
msgID cryptoChannel.MessageID
receptionID receptionID.EphemeralIdentity
round rounds.Round
}
func (ted *triggerEventDummy) triggerEvent(chID *id.ID, umi *userMessageInternal,
receptionID receptionID.EphemeralIdentity, round rounds.Round) {
ted.gotData = true
ted.chID = chID
ted.umi = umi
ted.receptionID = receptionID
ted.round = round
ted.msgID = umi.GetMessageID()
}
// Tests the happy path
func TestUserListener_Listen(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
rng := rand.New(rand.NewSource(42))
pub, priv, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
cm := &ChannelMessage{
Lease: int64(time.Hour),
RoundID: uint64(r.ID),
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
msgID := cryptoChannel.MakeMessageID(cmSerial)
sig := ed25519.Sign(priv, cmSerial)
ns := &mockNameService{validChMsg: true}
um := &UserMessage{
Message: cmSerial,
ValidationSignature: []byte("Not checked in test"),
Signature: sig,
Username: ns.GetUsername(),
ECCPublicKey: pub,
UsernameLease: time.Now().Add(time.Hour).UnixNano(),
}
umSerial, err := proto.Marshal(um)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if !dummy.gotData {
t.Fatalf("No data returned after valid listen")
}
if !dummy.chID.Cmp(chID) {
t.Errorf("Channel ID not correct: %s vs %s", dummy.chID, chID)
}
if !bytes.Equal(um.Message, dummy.umi.userMessage.Message) {
t.Errorf("message not correct: %s vs %s", um.Message,
dummy.umi.userMessage.Message)
}
if !msgID.Equals(dummy.msgID) {
t.Errorf("messageIDs not correct: %s vs %s", msgID,
dummy.msgID)
}
if r.ID != dummy.round.ID {
t.Errorf("rounds not correct: %s vs %s", r.ID,
dummy.round.ID)
}
}
//tests that the message is rejected when the user signature is invalid
func TestUserListener_Listen_BadUserSig(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
rng := rand.New(rand.NewSource(42))
pub, _, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
cm := &ChannelMessage{
Lease: int64(time.Hour),
RoundID: uint64(r.ID),
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
_, badpriv, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
sig := ed25519.Sign(badpriv, cmSerial)
ns := &mockNameService{validChMsg: true}
um := &UserMessage{
Message: cmSerial,
ValidationSignature: []byte("Not checked in test"),
Signature: sig,
Username: ns.GetUsername(),
ECCPublicKey: pub,
UsernameLease: time.Now().Add(time.Hour).UnixNano(),
}
umSerial, err := proto.Marshal(um)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("Data returned after invalid listen")
}
}
//tests that the message is rejected when the validation signature cannot be
//validated
func TestUserListener_Listen_BadValidSig(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
rng := rand.New(rand.NewSource(42))
pub, priv, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
cm := &ChannelMessage{
Lease: int64(time.Hour),
RoundID: uint64(r.ID),
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
sig := ed25519.Sign(priv, cmSerial)
//make the signature not validate
ns := &mockNameService{validChMsg: false}
um := &UserMessage{
Message: cmSerial,
ValidationSignature: []byte("Not checked in test"),
Signature: sig,
Username: ns.GetUsername(),
ECCPublicKey: pub,
UsernameLease: time.Now().Add(time.Hour).UnixNano(),
}
umSerial, err := proto.Marshal(um)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("Data returned after invalid listen")
}
}
//tests that the message is rejected when the username timestamp is not valid
func TestUserListener_Listen_BadUnameTs(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
rng := rand.New(rand.NewSource(42))
pub, priv, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
cm := &ChannelMessage{
Lease: int64(time.Hour),
RoundID: uint64(r.ID),
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
sig := ed25519.Sign(priv, cmSerial)
ns := &mockNameService{validChMsg: true}
um := &UserMessage{
Message: cmSerial,
ValidationSignature: []byte("Not checked in test"),
Signature: sig,
Username: ns.GetUsername(),
ECCPublicKey: pub,
//make the username lease invalid
UsernameLease: 42,
}
umSerial, err := proto.Marshal(um)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("Data returned after invalid listen")
}
}
//tests that the message is rejected when the round in the message does not
//match the round passed in
func TestUserListener_Listen_BadRound(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
rng := rand.New(rand.NewSource(42))
pub, priv, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
cm := &ChannelMessage{
Lease: int64(time.Hour),
//make the round not match
RoundID: 69,
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
sig := ed25519.Sign(priv, cmSerial)
ns := &mockNameService{validChMsg: true}
um := &UserMessage{
Message: cmSerial,
ValidationSignature: []byte("Not checked in test"),
Signature: sig,
Username: ns.GetUsername(),
ECCPublicKey: pub,
UsernameLease: time.Now().Add(time.Hour).UnixNano(),
}
umSerial, err := proto.Marshal(um)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("Data returned after invalid listen")
}
}
//tests that the message is rejected when the user message is malformed
func TestUserListener_Listen_BadMessage(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
ns := &mockNameService{validChMsg: true}
umSerial := []byte("malformed")
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("Data returned after invalid listen")
}
}
//tests that the message is rejected when the sized broadcast is malformed
func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) {
//build inputs
chID := &id.ID{}
chID[0] = 1
r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)}
r.Timestamps[states.QUEUED] = time.Now()
rng := rand.New(rand.NewSource(42))
pub, priv, err := ed25519.GenerateKey(rng)
if err != nil {
t.Fatalf("failed to generate ed25519 keypair, cant run test")
}
cm := &ChannelMessage{
Lease: int64(time.Hour),
//make the round not match
RoundID: 69,
PayloadType: 42,
Payload: []byte("blarg"),
}
cmSerial, err := proto.Marshal(cm)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
sig := ed25519.Sign(priv, cmSerial)
ns := &mockNameService{validChMsg: true}
um := &UserMessage{
Message: cmSerial,
ValidationSignature: []byte("Not checked in test"),
Signature: sig,
Username: ns.GetUsername(),
ECCPublicKey: pub,
UsernameLease: time.Now().Add(time.Hour).UnixNano(),
}
umSerial, err := proto.Marshal(um)
if err != nil {
t.Fatalf("Failed to marshal proto: %+v", err)
}
umMsgSerialSized, err := broadcast.NewSizedBroadcast(
512, umSerial)
if err != nil {
t.Fatalf("Failed to size channel message: %+v", err)
}
//remove half the sized broadcast to make it malformed
umMsgSerialSized = umMsgSerialSized[:broadcast.GetSizedBroadcastSize(umMsgSerialSized)/2]
//build the listener
dummy := &triggerEventDummy{}
al := userListener{
chID: chID,
name: ns,
trigger: dummy.triggerEvent,
}
//call the listener
al.Listen(umMsgSerialSized, receptionID.EphemeralIdentity{}, r)
//check the results
if dummy.gotData {
t.Fatalf("Data returned after invalid listen")
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment