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

added preimage and notification for reception of group chat request

parent 7e39889f
No related branches found
No related tags found
1 merge request!170Release
...@@ -158,6 +158,14 @@ func (c *Client) MakePrecannedAuthenticatedChannel(precannedID uint) (contact.Co ...@@ -158,6 +158,14 @@ func (c *Client) MakePrecannedAuthenticatedChannel(precannedID uint) (contact.Co
Source: precan.ID[:], Source: precan.ID[:],
}, me) }, me)
// group request
c.storage.GetEdge().Add(edge.Preimage{
Data: sessionPartner.GetGroupRequestPreimage(),
Type: preimage.GroupRq,
Source: precan.ID[:],
}, me)
return precan, err return precan, err
} }
......
...@@ -696,6 +696,7 @@ func (c *Client) DeleteContact(partnerId *id.ID) error { ...@@ -696,6 +696,7 @@ func (c *Client) DeleteContact(partnerId *id.ID) error {
e2ePreimage := partner.GetE2EPreimage() e2ePreimage := partner.GetE2EPreimage()
rekeyPreimage := partner.GetSilentPreimage() rekeyPreimage := partner.GetSilentPreimage()
fileTransferPreimage := partner.GetFileTransferPreimage() fileTransferPreimage := partner.GetFileTransferPreimage()
groupRequestPreimage := partner.GetGroupRequestPreimage()
//delete the partner //delete the partner
if err = c.storage.E2e().DeletePartner(partnerId); err != nil { if err = c.storage.E2e().DeletePartner(partnerId); err != nil {
...@@ -729,6 +730,15 @@ func (c *Client) DeleteContact(partnerId *id.ID) error { ...@@ -729,6 +730,15 @@ func (c *Client) DeleteContact(partnerId *id.ID) error {
"from %s on contact deletion: %+v", partnerId, err) "from %s on contact deletion: %+v", partnerId, err)
} }
if err = c.storage.GetEdge().Remove(edge.Preimage{
Data: groupRequestPreimage,
Type: preimage.GroupRq,
Source: partnerId[:],
}, c.storage.GetUser().ReceptionID); err != nil {
jww.WARN.Printf("Failed delete the preimage for group request "+
"from %s on contact deletion: %+v", partnerId, err)
}
if err = c.storage.Auth().Delete(partnerId); err != nil { if err = c.storage.Auth().Delete(partnerId); err != nil {
return err return err
} }
......
...@@ -434,6 +434,13 @@ func (m *Manager) doConfirm(sr *auth.SentRequest, grp *cyclic.Group, ...@@ -434,6 +434,13 @@ func (m *Manager) doConfirm(sr *auth.SentRequest, grp *cyclic.Group,
Source: sr.GetPartner()[:], Source: sr.GetPartner()[:],
}, me) }, me)
//group Request
m.storage.GetEdge().Add(edge.Preimage{
Data: sessionPartner.GetGroupRequestPreimage(),
Type: preimage.GroupRq,
Source: sr.GetPartner()[:],
}, me)
// delete the in progress negotiation // delete the in progress negotiation
// this undoes the request lock // this undoes the request lock
if err := m.storage.Auth().Delete(sr.GetPartner()); err != nil { if err := m.storage.Auth().Delete(sr.GetPartner()); err != nil {
......
...@@ -147,6 +147,13 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader, ...@@ -147,6 +147,13 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader,
Source: partner.ID[:], Source: partner.ID[:],
}, me) }, me)
//group Request
storage.GetEdge().Add(edge.Preimage{
Data: sessionPartner.GetGroupRequestPreimage(),
Type: preimage.GroupRq,
Source: partner.ID[:],
}, me)
// delete the in progress negotiation // delete the in progress negotiation
// this unlocks the request lock // this unlocks the request lock
//fixme - do these deletes at a later date //fixme - do these deletes at a later date
......
...@@ -59,6 +59,7 @@ func (mnfmr *ManyNotificationForMeReport) Len() int { ...@@ -59,6 +59,7 @@ func (mnfmr *ManyNotificationForMeReport) Len() int {
// "e2e" sender user ID reception of an E2E message // "e2e" sender user ID reception of an E2E message
// "group" group ID reception of a group chat message // "group" group ID reception of a group chat message
// "endFT" sender user ID Last message sent confirming end of file transfer // "endFT" sender user ID Last message sent confirming end of file transfer
// "groupRQ" sender user ID Request from sender to join a group chat
func NotificationsForMe(notifCSV, preimages string) (*ManyNotificationForMeReport, error) { func NotificationsForMe(notifCSV, preimages string) (*ManyNotificationForMeReport, error) {
//handle deserialization of preimages //handle deserialization of preimages
var preimageList []edge.Preimage var preimageList []edge.Preimage
......
...@@ -117,7 +117,17 @@ func (m Manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error ...@@ -117,7 +117,17 @@ func (m Manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error
MessageType: message.GroupCreationRequest, MessageType: message.GroupCreationRequest,
} }
rounds, _, _, err := m.net.SendE2E(sendMsg, params.GetDefaultE2E(), nil)
recipent, err := m.store.E2e().GetPartner(memberID)
if err!=nil{
return nil, errors.WithMessagef(err,"Failed to send request to %s " +
"because e2e relationship could not be found", memberID)
}
p := params.GetDefaultE2E()
p.IdentityPreimage = recipent.GetGroupRequestPreimage()
rounds, _, _, err := m.net.SendE2E(sendMsg, p, nil)
if err != nil { if err != nil {
return nil, errors.Errorf(sendE2eErr, memberID, err) return nil, errors.Errorf(sendE2eErr, memberID, err)
} }
......
...@@ -9,8 +9,13 @@ package groupChat ...@@ -9,8 +9,13 @@ package groupChat
import ( import (
"fmt" "fmt"
"github.com/cloudflare/circl/dh/sidh"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"gitlab.com/elixxir/client/interfaces/message" "gitlab.com/elixxir/client/interfaces/message"
"gitlab.com/elixxir/client/interfaces/params"
util "gitlab.com/elixxir/client/storage/utility"
"gitlab.com/elixxir/crypto/diffieHellman"
"gitlab.com/xx_network/crypto/csprng"
"gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id"
"math/rand" "math/rand"
"reflect" "reflect"
...@@ -33,11 +38,29 @@ func TestManager_ResendRequest(t *testing.T) { ...@@ -33,11 +38,29 @@ func TestManager_ResendRequest(t *testing.T) {
Created: g.Created.UnixNano(), Created: g.Created.UnixNano(),
} }
for i := range g.Members{
grp := m.store.E2e().GetGroup()
dhKey := grp.NewInt(int64(i + 42))
pubKey := diffieHellman.GeneratePublicKey(dhKey, grp)
p := params.GetDefaultE2ESessionParams()
rng := csprng.NewSystemRNG()
_, mySidhPriv := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhA, rng)
theirSidhPub, _ := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhB, rng)
err := m.store.E2e().AddPartner(g.Members[i].ID, pubKey, dhKey,
mySidhPriv, theirSidhPub, p, p)
if err != nil {
t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
}
}
_, status, err := m.ResendRequest(g.ID) _, status, err := m.ResendRequest(g.ID)
if err != nil { if err != nil {
t.Errorf("ResendRequest() returned an error: %+v", err) t.Errorf("ResendRequest() returned an error: %+v", err)
} }
if status != AllSent { if status != AllSent {
t.Errorf("ResendRequest() failed to return the expected status."+ t.Errorf("ResendRequest() failed to return the expected status."+
"\nexpected: %s\nreceived: %s", AllSent, status) "\nexpected: %s\nreceived: %s", AllSent, status)
...@@ -112,6 +135,23 @@ func TestManager_sendRequests(t *testing.T) { ...@@ -112,6 +135,23 @@ func TestManager_sendRequests(t *testing.T) {
Created: g.Created.UnixNano(), Created: g.Created.UnixNano(),
} }
for i := range g.Members{
grp := m.store.E2e().GetGroup()
dhKey := grp.NewInt(int64(i + 42))
pubKey := diffieHellman.GeneratePublicKey(dhKey, grp)
p := params.GetDefaultE2ESessionParams()
rng := csprng.NewSystemRNG()
_, mySidhPriv := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhA, rng)
theirSidhPub, _ := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhB, rng)
err := m.store.E2e().AddPartner(g.Members[i].ID, pubKey, dhKey,
mySidhPriv, theirSidhPub, p, p)
if err != nil {
t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
}
}
_, status, err := m.sendRequests(g) _, status, err := m.sendRequests(g)
if err != nil { if err != nil {
t.Errorf("sendRequests() returned an error: %+v", err) t.Errorf("sendRequests() returned an error: %+v", err)
...@@ -195,6 +235,23 @@ func TestManager_sendRequests_SendPartialSent(t *testing.T) { ...@@ -195,6 +235,23 @@ func TestManager_sendRequests_SendPartialSent(t *testing.T) {
expectedErr := fmt.Sprintf(sendRequestPartialErr, (len(g.Members)-1)/2, expectedErr := fmt.Sprintf(sendRequestPartialErr, (len(g.Members)-1)/2,
len(g.Members)-1, "") len(g.Members)-1, "")
for i := range g.Members{
grp := m.store.E2e().GetGroup()
dhKey := grp.NewInt(int64(i + 42))
pubKey := diffieHellman.GeneratePublicKey(dhKey, grp)
p := params.GetDefaultE2ESessionParams()
rng := csprng.NewSystemRNG()
_, mySidhPriv := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhA, rng)
theirSidhPub, _ := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhB, rng)
err := m.store.E2e().AddPartner(g.Members[i].ID, pubKey, dhKey,
mySidhPriv, theirSidhPub, p, p)
if err != nil {
t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
}
}
_, status, err := m.sendRequests(g) _, status, err := m.sendRequests(g)
if err == nil || !strings.Contains(err.Error(), expectedErr) { if err == nil || !strings.Contains(err.Error(), expectedErr) {
t.Errorf("sendRequests() failed to return the expected error."+ t.Errorf("sendRequests() failed to return the expected error."+
...@@ -217,6 +274,23 @@ func TestManager_sendRequest(t *testing.T) { ...@@ -217,6 +274,23 @@ func TestManager_sendRequest(t *testing.T) {
prng := rand.New(rand.NewSource(42)) prng := rand.New(rand.NewSource(42))
m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t)
for i := range g.Members{
grp := m.store.E2e().GetGroup()
dhKey := grp.NewInt(int64(i + 42))
pubKey := diffieHellman.GeneratePublicKey(dhKey, grp)
p := params.GetDefaultE2ESessionParams()
rng := csprng.NewSystemRNG()
_, mySidhPriv := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhA, rng)
theirSidhPub, _ := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhB, rng)
err := m.store.E2e().AddPartner(g.Members[i].ID, pubKey, dhKey,
mySidhPriv, theirSidhPub, p, p)
if err != nil {
t.Errorf("Failed to add partner #%d %s: %+v", i, g.Members[i].ID, err)
}
}
expected := message.Send{ expected := message.Send{
Recipient: g.Members[0].ID, Recipient: g.Members[0].ID,
Payload: []byte("request message"), Payload: []byte("request message"),
...@@ -241,7 +315,25 @@ func TestManager_sendRequest_SendE2eError(t *testing.T) { ...@@ -241,7 +315,25 @@ func TestManager_sendRequest_SendE2eError(t *testing.T) {
m, _ := newTestManagerWithStore(prng, 10, 1, nil, nil, t) m, _ := newTestManagerWithStore(prng, 10, 1, nil, nil, t)
expectedErr := strings.SplitN(sendE2eErr, "%", 2)[0] expectedErr := strings.SplitN(sendE2eErr, "%", 2)[0]
_, err := m.sendRequest(id.NewIdFromString("memberID", id.User, t), nil) recipientID := id.NewIdFromString("memberID", id.User, t)
grp := m.store.E2e().GetGroup()
dhKey := grp.NewInt(int64(42))
pubKey := diffieHellman.GeneratePublicKey(dhKey, grp)
p := params.GetDefaultE2ESessionParams()
rng := csprng.NewSystemRNG()
_, mySidhPriv := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhA, rng)
theirSidhPub, _ := util.GenerateSIDHKeyPair(
sidh.KeyVariantSidhB, rng)
err := m.store.E2e().AddPartner(recipientID, pubKey, dhKey,
mySidhPriv, theirSidhPub, p, p)
if err != nil {
t.Errorf("Failed to add partner %s: %+v", recipientID, err)
}
_, err = m.sendRequest(recipientID, nil)
if err == nil || !strings.Contains(err.Error(), expectedErr) { if err == nil || !strings.Contains(err.Error(), expectedErr) {
t.Errorf("sendRequest() failed to return the expected error."+ t.Errorf("sendRequest() failed to return the expected error."+
"\nexpected: %s\nreceived: %+v", expectedErr, err) "\nexpected: %s\nreceived: %+v", expectedErr, err)
......
...@@ -8,4 +8,5 @@ const ( ...@@ -8,4 +8,5 @@ const (
E2e = "e2e" E2e = "e2e"
Group = "group" Group = "group"
EndFT = "endFT" EndFT = "endFT"
GroupRq = "groupRq"
) )
...@@ -292,3 +292,9 @@ func (m *Manager) GetSilentPreimage() []byte { ...@@ -292,3 +292,9 @@ func (m *Manager) GetSilentPreimage() []byte {
func (m *Manager) GetFileTransferPreimage() []byte { func (m *Manager) GetFileTransferPreimage() []byte {
return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.EndFT) return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.EndFT)
} }
// GetGroupRequestPreimage returns a hash of the unique
// fingerprint for group requests received from this user.
func (m *Manager) GetGroupRequestPreimage() []byte {
return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.GroupRq)
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment