diff --git a/channels/adminListener.go b/channels/adminListener.go index 0f5b6630e6c2bbb0c68a72b029c46882789a9d09..421b4ac9f70f91f9c3294a2838e684fb01527b65 100644 --- a/channels/adminListener.go +++ b/channels/adminListener.go @@ -29,7 +29,7 @@ type adminListener struct { func (al *adminListener) Listen(payload []byte, receptionID receptionID.EphemeralIdentity, round rounds.Round) { // Get the message ID - msgID := channel.MakeMessageID(payload) + msgID := channel.MakeMessageID(payload, al.chID) // Decode the message as a channel message cm := &ChannelMessage{} diff --git a/channels/adminListener_test.go b/channels/adminListener_test.go index bd5f7c459b937ec43afa84f93e871cd86187c89b..1b6f06e8a0bf6e9d70d39ee8129185a8e75c89a2 100644 --- a/channels/adminListener_test.go +++ b/channels/adminListener_test.go @@ -69,7 +69,7 @@ func TestAdminListener_Listen(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(cmSerial) + msgID := cryptoChannel.MakeMessageID(cmSerial, chID) // Build the listener dummy := &triggerAdminEventDummy{} diff --git a/channels/channelMessages.proto b/channels/channelMessages.proto index f64265e9a4caa7d8b8d186636e24621506491556..b0ceb6fd8c156c4c24f80743eb8e1b54973cf084 100644 --- a/channels/channelMessages.proto +++ b/channels/channelMessages.proto @@ -31,6 +31,11 @@ message ChannelMessage{ // nickname is the name which the user is using for this message // it will not be longer than 24 characters string Nickname = 5; + + // Nonce is 32 bits of randomness to ensure that in the event that in the + // same round two messages are send with the same nickname, payload, + // and lease, they will not have the same message ID. + bytes Nonce = 6; } // UserMessage is a message sent by a user who is a member within the channel. diff --git a/channels/eventModel_test.go b/channels/eventModel_test.go index 60ec58fcd4bee882d612dd6f5d20cae4ba571b0b..89f30f3ef36a5362a94eb33746d76a6c976e339d 100644 --- a/channels/eventModel_test.go +++ b/channels/eventModel_test.go @@ -353,7 +353,7 @@ func TestEvents_triggerAdminEvents(t *testing.T) { r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)} r.Timestamps[states.QUEUED] = netTime.Now() - msgID := cryptoChannel.MakeMessageID(u.userMessage.Message) + msgID := cryptoChannel.MakeMessageID(u.userMessage.Message, chID) //call the trigger _, err = e.triggerAdminEvent(chID, cm, netTime.Now(), msgID, receptionID.EphemeralIdentity{}, r, @@ -428,7 +428,7 @@ func TestEvents_triggerAdminEvents_noChannel(t *testing.T) { r := rounds.Round{ID: 420, Timestamps: make(map[states.Round]time.Time)} r.Timestamps[states.QUEUED] = netTime.Now() - msgID := cryptoChannel.MakeMessageID(u.userMessage.Message) + msgID := cryptoChannel.MakeMessageID(u.userMessage.Message, chID) //call the trigger _, err := e.triggerAdminEvent(chID, cm, netTime.Now(), msgID, receptionID.EphemeralIdentity{}, r, @@ -463,7 +463,7 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) { t.Fatalf("failed to marshael the message proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(textMarshaled) + msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) rng := rand.New(rand.NewSource(64)) @@ -530,7 +530,7 @@ func TestEvents_receiveTextMessage_Reply(t *testing.T) { chID := &id.ID{} chID[0] = 1 - replyMsgId := cryptoChannel.MakeMessageID([]byte("blarg")) + replyMsgId := cryptoChannel.MakeMessageID([]byte("blarg"), chID) textPayload := &CMIXChannelText{ Version: 0, @@ -543,7 +543,7 @@ func TestEvents_receiveTextMessage_Reply(t *testing.T) { t.Fatalf("failed to marshael the message proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(textMarshaled) + msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) senderUsername := "Alice" ts := netTime.Now() @@ -623,7 +623,7 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) { t.Fatalf("failed to marshael the message proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(textMarshaled) + msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) senderUsername := "Alice" ts := netTime.Now() @@ -690,7 +690,7 @@ func TestEvents_receiveReaction(t *testing.T) { chID := &id.ID{} chID[0] = 1 - replyMsgId := cryptoChannel.MakeMessageID([]byte("blarg")) + replyMsgId := cryptoChannel.MakeMessageID([]byte("blarg"), chID) textPayload := &CMIXChannelReaction{ Version: 0, @@ -703,7 +703,7 @@ func TestEvents_receiveReaction(t *testing.T) { t.Fatalf("failed to marshael the message proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(textMarshaled) + msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) senderUsername := "Alice" ts := netTime.Now() @@ -783,7 +783,7 @@ func TestEvents_receiveReaction_InvalidReactionMessageID(t *testing.T) { t.Fatalf("failed to marshael the message proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(textMarshaled) + msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) senderUsername := "Alice" ts := netTime.Now() @@ -840,7 +840,7 @@ func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) { chID := &id.ID{} chID[0] = 1 - replyMsgId := cryptoChannel.MakeMessageID([]byte("blarg")) + replyMsgId := cryptoChannel.MakeMessageID([]byte("blarg"), chID) textPayload := &CMIXChannelReaction{ Version: 0, @@ -853,7 +853,7 @@ func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) { t.Fatalf("failed to marshael the message proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(textMarshaled) + msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) senderUsername := "Alice" ts := netTime.Now() diff --git a/channels/messages.go b/channels/messages.go index df77a9d92e5930569d1ae5e0e0ac69b91c8b7b88..0162c3c62f62c10c7c652d206e405e7a2383327b 100644 --- a/channels/messages.go +++ b/channels/messages.go @@ -10,6 +10,7 @@ package channels import ( "github.com/golang/protobuf/proto" "gitlab.com/elixxir/crypto/channel" + "gitlab.com/xx_network/primitives/id" ) // userMessageInternal is the internal structure of a UserMessage protobuf. @@ -19,7 +20,7 @@ type userMessageInternal struct { messageID channel.MessageID } -func newUserMessageInternal(ursMsg *UserMessage) (*userMessageInternal, error) { +func newUserMessageInternal(ursMsg *UserMessage, chid *id.ID) (*userMessageInternal, error) { chanMessage := &ChannelMessage{} err := proto.Unmarshal(ursMsg.Message, chanMessage) if err != nil { @@ -30,11 +31,11 @@ func newUserMessageInternal(ursMsg *UserMessage) (*userMessageInternal, error) { return &userMessageInternal{ userMessage: ursMsg, channelMessage: channelMessage, - messageID: channel.MakeMessageID(ursMsg.Message), + messageID: channel.MakeMessageID(ursMsg.Message, chid), }, nil } -func unmarshalUserMessageInternal(usrMsg []byte) (*userMessageInternal, error) { +func unmarshalUserMessageInternal(usrMsg []byte, chid *id.ID) (*userMessageInternal, error) { um := &UserMessage{} if err := proto.Unmarshal(usrMsg, um); err != nil { @@ -52,7 +53,7 @@ func unmarshalUserMessageInternal(usrMsg []byte) (*userMessageInternal, error) { return &userMessageInternal{ userMessage: um, channelMessage: channelMessage, - messageID: channel.MakeMessageID(um.Message), + messageID: channel.MakeMessageID(um.Message, chid), }, nil } diff --git a/channels/messages_test.go b/channels/messages_test.go index 5bd10e15ba03552f8e3de7129c70419761144be2..b5109bd30a535156edc2e80556b9db51d55313e4 100644 --- a/channels/messages_test.go +++ b/channels/messages_test.go @@ -10,6 +10,7 @@ package channels import ( "github.com/golang/protobuf/proto" "gitlab.com/elixxir/crypto/channel" + "gitlab.com/xx_network/primitives/id" "reflect" "testing" ) @@ -17,12 +18,14 @@ import ( func TestUnmarshalUserMessageInternal(t *testing.T) { internal, usrMsg, _ := builtTestUMI(t, 7) + chID := &id.ID{} + usrMsgMarshaled, err := proto.Marshal(usrMsg) if err != nil { t.Fatalf("Failed to marshal user message: %+v", err) } - umi, err := unmarshalUserMessageInternal(usrMsgMarshaled) + umi, err := unmarshalUserMessageInternal(usrMsgMarshaled, chID) if err != nil { t.Fatalf("Failed to unmarshal user message: %+v", err) } @@ -34,7 +37,8 @@ func TestUnmarshalUserMessageInternal(t *testing.T) { } func TestUnmarshalUserMessageInternal_BadUserMessage(t *testing.T) { - _, err := unmarshalUserMessageInternal([]byte("Malformed")) + chID := &id.ID{} + _, err := unmarshalUserMessageInternal([]byte("Malformed"), chID) if err == nil { t.Fatalf("Error not returned on unmarshaling a bad user " + "message") @@ -46,12 +50,14 @@ func TestUnmarshalUserMessageInternal_BadChannelMessage(t *testing.T) { usrMsg.Message = []byte("Malformed") + chID := &id.ID{} + usrMsgMarshaled, err := proto.Marshal(usrMsg) if err != nil { t.Fatalf("Failed to marshal user message: %+v", err) } - _, err = unmarshalUserMessageInternal(usrMsgMarshaled) + _, err = unmarshalUserMessageInternal(usrMsgMarshaled, chID) if err == nil { t.Fatalf("Error not returned on unmarshaling a user message " + "with a bad channel message") @@ -63,7 +69,9 @@ func TestNewUserMessageInternal_BadChannelMessage(t *testing.T) { usrMsg.Message = []byte("Malformed") - _, err := newUserMessageInternal(usrMsg) + chID := &id.ID{} + + _, err := newUserMessageInternal(usrMsg, chID) if err == nil { t.Fatalf("failed to produce error with malformed user message") @@ -101,7 +109,9 @@ func TestUserMessageInternal_GetMessageID(t *testing.T) { internal, usrMsg, _ := builtTestUMI(t, 7) received := internal.GetMessageID() - expected := channel.MakeMessageID(usrMsg.Message) + chID := &id.ID{} + + expected := channel.MakeMessageID(usrMsg.Message, chID) if !reflect.DeepEqual(expected, received) { t.Fatalf("GetMessageID did not return expected data."+ @@ -115,7 +125,7 @@ func TestUserMessageInternal_GetMessageID(t *testing.T) { // it would be good to know when this changes. If this test breaks, report it, // but it should be safe to update the expected func TestUserMessageInternal_GetMessageID_Consistency(t *testing.T) { - expected := "ChMsgID-s425CTIAcKxvhUEZNr6Dk1g6rrOOpzKOS9L97OzLJ2w=" + expected := "ChMsgID-LrGYLFCaPamZk44X+c/b08qtmJIorgNnoE68v1HYrf8=" internal, _, _ := builtTestUMI(t, 7) @@ -148,7 +158,9 @@ func builtTestUMI(t *testing.T, mt MessageType) (*userMessageInternal, *UserMess ECCPublicKey: []byte("key"), } - internal, _ := newUserMessageInternal(usrMsg) + chID := &id.ID{} + + internal, _ := newUserMessageInternal(usrMsg, chID) return internal, usrMsg, channelMsg } diff --git a/channels/send.go b/channels/send.go index 6d17fdab0b4e5634c2f97159e5235dee6a2bc52c..af1c33e09a926a0cbb4c3dff2fff8c353919574a 100644 --- a/channels/send.go +++ b/channels/send.go @@ -71,7 +71,7 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, } //make the messageID - msgId = cryptoChannel.MakeMessageID(chMsgSerial) + msgId = cryptoChannel.MakeMessageID(chMsgSerial, channelID) //Sign the message messageSig := ed25519.Sign(*m.me.Privkey, chMsgSerial) @@ -140,7 +140,7 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, return nil, err } - msgId = cryptoChannel.MakeMessageID(chMsgSerial) + msgId = cryptoChannel.MakeMessageID(chMsgSerial, channelID) //check if the message is too long if len(chMsgSerial) > ch.broadcast.MaxRSAToPublicPayloadSize() { diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go index e3e90b6180358f02e5e4ce2fd4500dc39982fdf0..305e9084f2637ce54d5345bda861a3213c52f735 100644 --- a/channels/sendTracker_test.go +++ b/channels/sendTracker_test.go @@ -57,15 +57,16 @@ func TestSendTracker_MessageReceive(t *testing.T) { timestamp time.Time, round rounds.Round, status SentStatus) { } + cid := id.NewIdFromString("channel", id.User, t) + st := loadSendTracker(&mockClient{}, kv, trigger, nil, updateStatus) - mid := cryptoChannel.MakeMessageID([]byte("hello")) + mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) process := st.MessageReceive(mid) if process { t.Fatalf("Did not receive expected result from MessageReceive") } - cid := id.NewIdFromString("channel", id.User, t) rid := id.Round(2) uuid, err := st.denotePendingSend(cid, &userMessageInternal{ userMessage: &UserMessage{}, @@ -135,7 +136,7 @@ func TestSendTracker_sendAdmin(t *testing.T) { st := loadSendTracker(&mockClient{}, kv, nil, adminTrigger, updateStatus) cid := id.NewIdFromString("channel", id.User, t) - mid := cryptoChannel.MakeMessageID([]byte("hello")) + mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) rid := id.Round(2) uuid, err := st.denotePendingAdminSend(cid, &ChannelMessage{ Lease: 0, @@ -202,7 +203,7 @@ func TestSendTracker_send(t *testing.T) { st := loadSendTracker(&mockClient{}, kv, trigger, nil, updateStatus) cid := id.NewIdFromString("channel", id.User, t) - mid := cryptoChannel.MakeMessageID([]byte("hello")) + mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) rid := id.Round(2) uuid, err := st.denotePendingSend(cid, &userMessageInternal{ userMessage: &UserMessage{}, @@ -260,7 +261,7 @@ func TestSendTracker_load_store(t *testing.T) { st := loadSendTracker(&mockClient{}, kv, nil, nil, nil) cid := id.NewIdFromString("channel", id.User, t) - mid := cryptoChannel.MakeMessageID([]byte("hello")) + mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) rid := id.Round(2) st.byRound[rid] = []*tracked{{MsgID: mid, ChannelID: cid, RoundID: rid}} err := st.store() @@ -290,7 +291,7 @@ func TestRoundResult_callback(t *testing.T) { st := loadSendTracker(&mockClient{}, kv, trigger, nil, update) cid := id.NewIdFromString("channel", id.User, t) - mid := cryptoChannel.MakeMessageID([]byte("hello")) + mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) rid := id.Round(2) uuid, err := st.denotePendingSend(cid, &userMessageInternal{ userMessage: &UserMessage{}, diff --git a/channels/send_test.go b/channels/send_test.go index 4df520e0fd676d916698f31382ddeaab6a1ed83d..d8c96c028fa249a74de615e749c60767697b8b1e 100644 --- a/channels/send_test.go +++ b/channels/send_test.go @@ -199,7 +199,7 @@ func TestSendGeneric(t *testing.T) { //verify the message was handled correctly //decode the user message - umi, err := unmarshalUserMessageInternal(mbc.payload) + umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { t.Fatalf("Failed to decode the user message: %s", err) } @@ -284,7 +284,7 @@ func TestAdminGeneric(t *testing.T) { //verify the message was handled correctly - msgID := cryptoChannel.MakeMessageID(mbc.payload) + msgID := cryptoChannel.MakeMessageID(mbc.payload, ch.ReceptionID) if !msgID.Equals(messageId) { t.Errorf("The message IDs do not match. %s vs %s ", @@ -373,7 +373,7 @@ func TestSendMessage(t *testing.T) { //verify the message was handled correctly //decode the user message - umi, err := unmarshalUserMessageInternal(mbc.payload) + umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { t.Fatalf("Failed to decode the user message: %s", err) } @@ -467,7 +467,7 @@ func TestSendReply(t *testing.T) { //verify the message was handled correctly //decode the user message - umi, err := unmarshalUserMessageInternal(mbc.payload) + umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { t.Fatalf("Failed to decode the user message: %s", err) } @@ -560,7 +560,7 @@ func TestSendReaction(t *testing.T) { //verify the message was handled correctly //decode the user message - umi, err := unmarshalUserMessageInternal(mbc.payload) + umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { t.Fatalf("Failed to decode the user message: %s", err) } diff --git a/channels/userListener.go b/channels/userListener.go index 5e56121f9bb6c07007a61e4535e4ddc1c0bde84f..98bcffd47fb736e3b3059f28b9bdc0c1e6552049 100644 --- a/channels/userListener.go +++ b/channels/userListener.go @@ -30,7 +30,7 @@ func (ul *userListener) Listen(payload []byte, receptionID receptionID.EphemeralIdentity, round rounds.Round) { //Decode the message as a user message - umi, err := unmarshalUserMessageInternal(payload) + umi, err := unmarshalUserMessageInternal(payload, ul.chID) if err != nil { jww.WARN.Printf("Failed to unmarshal User Message on "+ "channel %s", ul.chID) diff --git a/channels/userListener_test.go b/channels/userListener_test.go index 081048252623e8a63f51855f3f102d66ec1917e0..fa0c5369207e145490446c58248178c781112f99 100644 --- a/channels/userListener_test.go +++ b/channels/userListener_test.go @@ -76,7 +76,7 @@ func TestUserListener_Listen(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - msgID := cryptoChannel.MakeMessageID(cmSerial) + msgID := cryptoChannel.MakeMessageID(cmSerial, chID) sig := ed25519.Sign(priv, cmSerial) ns := &mockNameService{validChMsg: true} diff --git a/go.mod b/go.mod index 8c1ef5bd8fdc76c5bf9e87840ac945af23d73f22..abc7ce228c9649327891d793008ddf47d0c77f38 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/stretchr/testify v1.8.0 gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f gitlab.com/elixxir/comms v0.0.4-0.20220916185715-f1e9a5eda939 - gitlab.com/elixxir/crypto v0.0.7-0.20220923233816-0364f1b203c6 + gitlab.com/elixxir/crypto v0.0.7-0.20221003185354-b091598d2322 gitlab.com/elixxir/ekv v0.2.1 gitlab.com/elixxir/primitives v0.0.3-0.20220901220638-1acc75fabdc6 gitlab.com/xx_network/comms v0.0.4-0.20220916185248-8a984b8594de diff --git a/go.sum b/go.sum index 1adedcf76b7aece37f731dceb7ee6d33fa9627f1..9d03fc4f0998f786dfa263516a7c9094a1bd35d5 100644 --- a/go.sum +++ b/go.sum @@ -644,6 +644,8 @@ gitlab.com/elixxir/crypto v0.0.7-0.20220923164228-3f5620181081 h1:xrTNr42Id8rvq6 gitlab.com/elixxir/crypto v0.0.7-0.20220923164228-3f5620181081/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= gitlab.com/elixxir/crypto v0.0.7-0.20220923233816-0364f1b203c6 h1:ZCMqzKB86nrs9ldIoF2ZHvcExrkXIIIeH2RlNVwZx2A= gitlab.com/elixxir/crypto v0.0.7-0.20220923233816-0364f1b203c6/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= +gitlab.com/elixxir/crypto v0.0.7-0.20221003185354-b091598d2322 h1:8unQE70BDNRXTWUbjOO9d4kWyh19LySlTZo0Jqx0gPE= +gitlab.com/elixxir/crypto v0.0.7-0.20221003185354-b091598d2322/go.mod h1:QF8SzsrYh9Elip9EUYUDAhPjqO9DGrrrQxYHvn+VXok= gitlab.com/elixxir/ekv v0.2.1 h1:dtwbt6KmAXG2Tik5d60iDz2fLhoFBgWwST03p7T+9Is= gitlab.com/elixxir/ekv v0.2.1/go.mod h1:USLD7xeDnuZEavygdrgzNEwZXeLQJK/w1a+htpN+JEU= gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=