diff --git a/api/authenticatedChannel.go b/api/authenticatedChannel.go index 746572e94e73eb85c16dc60851adb04d901297a1..b302f78d46b81b9ebdb20d9f3e7e08f9ce2abb47 100644 --- a/api/authenticatedChannel.go +++ b/api/authenticatedChannel.go @@ -12,6 +12,8 @@ import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth" "gitlab.com/elixxir/client/interfaces" + "gitlab.com/elixxir/client/interfaces/preimage" + "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/id" @@ -103,6 +105,27 @@ func (c *Client) MakePrecannedAuthenticatedChannel(precannedID uint) (contact.Co // the channel c.network.CheckGarbledMessages() + //add the e2e and rekey firngeprints + //e2e + sessionPartner, err := c.storage.E2e().GetPartner(precan.ID) + if err != nil { + jww.FATAL.Panicf("Cannot find %s right after creating: %+v", precan.ID, err) + } + me := c.storage.GetUser().ReceptionID + + c.storage.GetEdge().Add(edge.Preimage{ + Data: sessionPartner.GetE2EPreimage(), + Type: preimage.E2e, + Source: precan.ID[:], + }, me) + + //rekey + c.storage.GetEdge().Add(edge.Preimage{ + Data: sessionPartner.GetRekeyPreimage(), + Type: preimage.Rekey, + Source: precan.ID[:], + }, me) + return precan, err } diff --git a/api/client.go b/api/client.go index 012e980a5d946c5dd632b896a9d26037d9b308bd..7919c62b869f1befb9a7567022bdc51475e8b4c2 100644 --- a/api/client.go +++ b/api/client.go @@ -13,12 +13,14 @@ import ( "gitlab.com/elixxir/client/auth" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/interfaces/user" "gitlab.com/elixxir/client/keyExchange" "gitlab.com/elixxir/client/network" "gitlab.com/elixxir/client/registration" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/client/switchboard" "gitlab.com/elixxir/comms/client" "gitlab.com/elixxir/crypto/cyclic" @@ -555,13 +557,45 @@ func (c *Client) GetNodeRegistrationStatus() (int, int, error) { // DeleteContact is a function which removes a partner from Client's storage func (c *Client) DeleteContact(partnerId *id.ID) error { jww.DEBUG.Printf("Deleting contact with ID %s", partnerId) - if err := c.storage.E2e().DeletePartner(partnerId); err != nil { + //get the partner so they can be removed from preiamge store + partner, err := c.storage.E2e().GetPartner(partnerId) + if err != nil { + return errors.WithMessagef(err, "Could not delete %s because "+ + "they could not be found", partnerId) + } + e2ePreimage := partner.GetE2EPreimage() + rekeyPreimage := partner.GetRekeyPreimage() + + //delete the partner + if err = c.storage.E2e().DeletePartner(partnerId); err != nil { return err } - if err := c.storage.Auth().Delete(partnerId); err != nil { + //delete the preimages + if err = c.storage.GetEdge().Remove(edge.Preimage{ + Data: e2ePreimage, + Type: preimage.E2e, + Source: partnerId[:], + }, c.storage.GetUser().ReceptionID); err != nil { + jww.WARN.Printf("Failed delete the preimage for e2e "+ + "from %s on contact deletion: %+v", partnerId, err) + } + + if err = c.storage.GetEdge().Remove(edge.Preimage{ + Data: rekeyPreimage, + Type: preimage.Rekey, + Source: partnerId[:], + }, c.storage.GetUser().ReceptionID); err != nil { + jww.WARN.Printf("Failed delete the preimage for rekey "+ + "from %s on contact deletion: %+v", partnerId, err) + } + + if err = c.storage.Auth().Delete(partnerId); err != nil { return err } + + //delete conversations c.storage.Conversations().Delete(partnerId) + return nil } @@ -694,6 +728,13 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition, storageDir string, err = storageSess.ForwardRegistrationStatus(storage.PermissioningComplete) } + //add the request preiamge + storageSess.GetEdge().Add(edge.Preimage{ + Data: preimage.GenerateRequest(protoUser.ReceptionID), + Type: preimage.Request, + Source: protoUser.ReceptionID[:], + }, protoUser.ReceptionID) + if err != nil { return errors.WithMessage(err, "Failed to denote state "+ "change in session") diff --git a/auth/callback.go b/auth/callback.go index 4a5fba05b7e74335fd71bac6685db01126ae2527..e3d53fb47f4aa868ee23b27c757dd9d05145bb39 100644 --- a/auth/callback.go +++ b/auth/callback.go @@ -13,8 +13,10 @@ import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage/auth" + "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" @@ -313,6 +315,38 @@ func (m *Manager) doConfirm(sr *auth.SentRequest, grp *cyclic.Group, sr.GetPartner(), err) } + //remove the confirm fingerprint + fp := sr.GetFingerprint() + if err := m.storage.GetEdge().Remove(edge.Preimage{ + Data: preimage.Generate(fp[:], preimage.Confirm), + Type: preimage.Confirm, + Source: sr.GetPartner()[:], + }, m.storage.GetUser().ReceptionID); err != nil { + jww.WARN.Printf("Failed delete the preimage for confirm from %s: %+v", + sr.GetPartner(), err) + } + + //add the e2e and rekey firngeprints + //e2e + sessionPartner, err := m.storage.E2e().GetPartner(sr.GetPartner()) + if err != nil { + jww.FATAL.Panicf("Cannot find %s right after creating: %+v", sr.GetPartner(), err) + } + me := m.storage.GetUser().ReceptionID + + m.storage.GetEdge().Add(edge.Preimage{ + Data: sessionPartner.GetE2EPreimage(), + Type: preimage.E2e, + Source: sr.GetPartner()[:], + }, me) + + //rekey + m.storage.GetEdge().Add(edge.Preimage{ + Data: sessionPartner.GetRekeyPreimage(), + Type: preimage.Rekey, + Source: sr.GetPartner()[:], + }, me) + // delete the in progress negotiation // this undoes the request lock if err := m.storage.Auth().Delete(sr.GetPartner()); err != nil { diff --git a/auth/confirm.go b/auth/confirm.go index f13d3871d9669b52c66924cfb7e4f17bc89b080c..62216ed28935abe65db07f3fe6c313f3bd273b0c 100644 --- a/auth/confirm.go +++ b/auth/confirm.go @@ -13,7 +13,9 @@ import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/diffieHellman" cAuth "gitlab.com/elixxir/crypto/e2e/auth" @@ -87,6 +89,7 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader, //get the fingerprint from the old ownership proof fp := cAuth.MakeOwnershipProofFP(storedContact.OwnershipProof) + preimg := preimage.Generate(fp[:], preimage.Confirm) //final construction baseFmt.SetEcrPayload(ecrPayload) @@ -114,6 +117,27 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader, events.Report(10, "Auth", "SendConfirmError", em) } + //add the preimages + sessionPartner, err := storage.E2e().GetPartner(partner.ID) + if err != nil { + jww.FATAL.Panicf("Cannot find %s right after creating: %+v", partner.ID, err) + } + me := storage.GetUser().ReceptionID + + //e2e + storage.GetEdge().Add(edge.Preimage{ + Data: sessionPartner.GetE2EPreimage(), + Type: preimage.E2e, + Source: partner.ID[:], + }, me) + + //rekey + storage.GetEdge().Add(edge.Preimage{ + Data: sessionPartner.GetRekeyPreimage(), + Type: preimage.Rekey, + Source: partner.ID[:], + }, me) + // delete the in progress negotiation // this unlocks the request lock //fixme - do these deletes at a later date @@ -126,8 +150,10 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader, jww.INFO.Printf("Confirming Auth with %s, msgDigest: %s", partner.ID, cmixMsg.Digest()) + param := params.GetDefaultCMIX() + param.IdentityPreimage = preimg /*send message*/ - round, _, err := net.SendCMIX(cmixMsg, partner.ID, params.GetDefaultCMIX()) + round, _, err := net.SendCMIX(cmixMsg, partner.ID, param) if err != nil { // if the send fails just set it to failed, it will but automatically // retried diff --git a/auth/request.go b/auth/request.go index 1be24089150fd7ef7dcce0c6ffaaffb1324bab2e..d323eeec7de5b9d734b25a6bfccac8a327a0c10d 100644 --- a/auth/request.go +++ b/auth/request.go @@ -13,9 +13,11 @@ import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/auth" "gitlab.com/elixxir/client/storage/e2e" + "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" @@ -141,6 +143,12 @@ func RequestAuth(partner, me contact.Contact, message string, rng io.Reader, cmixMsg.SetMac(mac) cmixMsg.SetContents(baseFmt.Marshal()) + storage.GetEdge().Add(edge.Preimage{ + Data: preimage.Generate(confirmFp[:], preimage.Confirm), + Type: preimage.Confirm, + Source: partner.ID[:], + }, me.ID) + jww.TRACE.Printf("RequestAuth SALT: %v", salt) jww.TRACE.Printf("RequestAuth ECRPAYLOAD: %v", baseFmt.GetEcrPayload()) jww.TRACE.Printf("RequestAuth MAC: %v", mac) @@ -160,8 +168,9 @@ func RequestAuth(partner, me contact.Contact, message string, rng io.Reader, partner.ID, cmixMsg.Digest()) /*send message*/ - round, _, err := net.SendCMIX(cmixMsg, partner.ID, - params.GetDefaultCMIX()) + p := params.GetDefaultCMIX() + p.IdentityPreimage = preimage.GenerateRequest(partner.ID) + round, _, err := net.SendCMIX(cmixMsg, partner.ID, p) if err != nil { // if the send fails just set it to failed, it will // but automatically retried diff --git a/bindings/notifications.go b/bindings/notifications.go index 745dafb1b32d4b7aa00f3ab29043caee19cfe4bd..2274b096a5bb6b3969419f14538707243180ad23 100644 --- a/bindings/notifications.go +++ b/bindings/notifications.go @@ -15,26 +15,24 @@ import ( "gitlab.com/elixxir/crypto/fingerprint" ) - -type NotificationForMeReport struct{ - forMe bool - tYpe string +type NotificationForMeReport struct { + forMe bool + tYpe string source []byte } -func (nfmr *NotificationForMeReport)ForMe()bool{ +func (nfmr *NotificationForMeReport) ForMe() bool { return nfmr.forMe } -func (nfmr *NotificationForMeReport)Type()string{ +func (nfmr *NotificationForMeReport) Type() string { return nfmr.tYpe } -func (nfmr *NotificationForMeReport)Source()[]byte{ +func (nfmr *NotificationForMeReport) Source() []byte { return nfmr.source } - // NotificationForMe Check if a notification received is for me func NotificationForMe(messageHash, idFP string, preimages string) (*NotificationForMeReport, error) { //handle message hash and idFP @@ -48,15 +46,15 @@ func NotificationForMe(messageHash, idFP string, preimages string) (*Notificatio } //handle deserialization of preimages - var preimageList edge.Preimages - if err := json.Unmarshal([]byte(preimages),&preimageList); err!=nil{ - return nil, errors.WithMessagef(err,"Failed to unmarshal the preimages list, " + + var preimageList []edge.Preimage + if err := json.Unmarshal([]byte(preimages), &preimageList); err != nil { + return nil, errors.WithMessagef(err, "Failed to unmarshal the preimages list, "+ "cannot check if notification is for me") } //check if any preimages match with the passed in data for _, preimage := range preimageList { - if fingerprint.CheckIdentityFpFromMessageHash(idFpBytes, messageHashBytes, preimage.Data){ + if fingerprint.CheckIdentityFpFromMessageHash(idFpBytes, messageHashBytes, preimage.Data) { return &NotificationForMeReport{ forMe: true, tYpe: preimage.Type, diff --git a/bindings/preimage.go b/bindings/preimage.go index 0540be51be4f89efaf90d9a91a7c55b58328fc70..38c2bf715ffa8b89a6e9bf266f963e352ff25937 100644 --- a/bindings/preimage.go +++ b/bindings/preimage.go @@ -6,34 +6,33 @@ import ( "gitlab.com/xx_network/primitives/id" ) - -type PreimageNotification interface{ +type PreimageNotification interface { Notify(identity []byte, deleted bool) } -func (c *Client)RegisterPreimageCallback(identity []byte, pin PreimageNotification){ +func (c *Client) RegisterPreimageCallback(identity []byte, pin PreimageNotification) { iid := &id.ID{} copy(iid[:], identity) - cb := func(localIdentity *id.ID, deleted bool){ - pin.Notify(localIdentity[:],deleted) + cb := func(localIdentity *id.ID, deleted bool) { + pin.Notify(localIdentity[:], deleted) } c.api.GetStorage().GetEdge().AddUpdateCallback(iid, cb) } -func (c *Client)GetPreimages(identity []byte)(string, error){ +func (c *Client) GetPreimages(identity []byte) (string, error) { iid := &id.ID{} copy(iid[:], identity) list, exist := c.api.GetStorage().GetEdge().Get(iid) - if !exist{ + if !exist { return "", errors.Errorf("Could not find a preimage list for %s", iid) } marshaled, err := json.Marshal(&list) return string(marshaled), err -} \ No newline at end of file +} diff --git a/bindings/ud.go b/bindings/ud.go index 900e102d75621c76d110732fca3c4011dfd23b8b..727f4118333c2813c8acd227000deffab78ad6e3 100644 --- a/bindings/ud.go +++ b/bindings/ud.go @@ -207,12 +207,11 @@ type MultiLookupCallback interface { Callback(Succeeded *ContactList, failed *IdList, errors string) } - -type lookupResponse struct{ - C contact.Contact - err error +type lookupResponse struct { + C contact.Contact + err error index int - id *id.ID + id *id.ID } // MultiLookup Looks for the contact object associated with all given userIDs. @@ -223,12 +222,12 @@ type lookupResponse struct{ func (ud UserDiscovery) MultiLookup(ids *IdList, callback MultiLookupCallback, timeoutMS int) error { - idList := make([]*id.ID,0,ids.Len()) + idList := make([]*id.ID, 0, ids.Len()) //extract all IDs from - for i:=0;i<ids.Len();i++{ + for i := 0; i < ids.Len(); i++ { idBytes, err := ids.Get(i) - if err!=nil{ + if err != nil { return errors.WithMessagef(err, "Failed to get ID at index %d", i) } uid, err := id.Unmarshal(idBytes) @@ -245,54 +244,52 @@ func (ud UserDiscovery) MultiLookup(ids *IdList, callback MultiLookupCallback, timeout := time.Duration(timeoutMS) * time.Millisecond //loop through the IDs and send the lookup - for i := range idList{ + for i := range idList { locali := i localID := idList[locali] - cb := func(c contact.Contact, err error){ + cb := func(c contact.Contact, err error) { results <- lookupResponse{ C: c, err: err, index: locali, - id: localID, + id: localID, } } - go func(){ + go func() { err := ud.ud.Lookup(localID, cb, timeout) - if err!=nil{ + if err != nil { results <- lookupResponse{ - C: contact.Contact{}, - err: errors.WithMessagef(err, "Failed to send lookup " + + C: contact.Contact{}, + err: errors.WithMessagef(err, "Failed to send lookup "+ "for user %s[%d]", localID, locali), index: locali, - id: localID, + id: localID, } } }() } //run the result gathering in its own thread - go func(){ - returnedContactList := make([]contact.Contact,0,len(idList)) - failedIDList := make([]*id.ID,0,len(idList)) + go func() { + returnedContactList := make([]contact.Contact, 0, len(idList)) + failedIDList := make([]*id.ID, 0, len(idList)) var concatonatedErrs string //Get the responses and return - for numReturned := 0; numReturned<len(idList);numReturned++{ - response := <- results - if response.err==nil{ + for numReturned := 0; numReturned < len(idList); numReturned++ { + response := <-results + if response.err == nil { returnedContactList = append(returnedContactList, response.C) - }else{ + } else { failedIDList = append(failedIDList, response.id) - concatonatedErrs = concatonatedErrs + fmt.Sprintf("Error returned from " + + concatonatedErrs = concatonatedErrs + fmt.Sprintf("Error returned from "+ "send to %d [%d]:%+v\t", response.id, response.index, response.err) } } - callback.Callback(&ContactList{list:returnedContactList}, &IdList{list:failedIDList}, concatonatedErrs) + callback.Callback(&ContactList{list: returnedContactList}, &IdList{list: failedIDList}, concatonatedErrs) }() - return nil } - diff --git a/cmd/root.go b/cmd/root.go index 036ff66cf9fef36c45b79b114ce85a5de5774b59..23416872ee7e210fbe6b886bee12788a17d0e1bc 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -236,7 +236,7 @@ var rootCmd = &cobra.Command{ expectedCnt := viper.GetUint("receiveCount") receiveCnt := uint(0) waitSecs := viper.GetUint("waitTimeout") - waitTimeout := time.Duration(waitSecs)* time.Second + waitTimeout := time.Duration(waitSecs) * time.Second done := false for !done && expectedCnt != 0 { @@ -261,7 +261,7 @@ var rootCmd = &cobra.Command{ //wait an extra 5 seconds to make sure no messages were missed done = false - timer := time.NewTimer(5*time.Second) + timer := time.NewTimer(5 * time.Second) for !done { select { case <-timer.C: diff --git a/cmd/single.go b/cmd/single.go index 6600cbfbbf9b9358d79163c555096127609379d2..27300ef1e6adb9965cc79682890df1ad6f0f7914 100644 --- a/cmd/single.go +++ b/cmd/single.go @@ -89,7 +89,7 @@ var singleCmd = &cobra.Command{ jww.FATAL.Panicf("Could not add single use process: %+v", err) } - for numReg, total := 1, 100; numReg < total; { + for numReg, total := 1, 100; numReg < (total*3)/4; { time.Sleep(1 * time.Second) numReg, total, err = client.GetNodeRegistrationStatus() if err != nil { diff --git a/dummy/send.go b/dummy/send.go index 6cde639e97f776b485d599d5a2659771751e487f..f37f79927402b86f59606d901c0f2d393ff41b05 100644 --- a/dummy/send.go +++ b/dummy/send.go @@ -70,7 +70,16 @@ func (m *Manager) sendMessages(msgs map[id.ID]format.Message) error { wg.Add(1) go func(i int64, recipient id.ID, msg format.Message) { - _, _, err := m.net.SendCMIX(msg, &recipient, params.GetDefaultCMIX()) + //fill the preiamge with random data to ensure it isnt repeatable + p := params.GetDefaultCMIX() + p.IdentityPreimage = make([]byte, 32) + rng := m.rng.GetStream() + if _, err := rng.Read(p.IdentityPreimage); err != nil { + jww.FATAL.Panicf("Failed to generate data for random "+ + "identity preimage in e2e send: %+v", err) + } + rng.Close() + _, _, err := m.net.SendCMIX(msg, &recipient, p) if err != nil { jww.WARN.Printf("failed to send dummy message %d/%d: %+v", i, len(msgs), err) diff --git a/groupChat/makeGroup.go b/groupChat/makeGroup.go index e5137f56fd0bc45c8752c96f8244aaebe25fb365..a8f7773f9dc57feef95a5316fa193b7b83de799d 100644 --- a/groupChat/makeGroup.go +++ b/groupChat/makeGroup.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/fastRNG" @@ -92,7 +93,7 @@ func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group, edgeStore := m.store.GetEdge() edgeStore.Add(edge.Preimage{ Data: g.ID[:], - Type: "group", + Type: preimage.Group, Source: g.ID[:], }, m.store.GetUser().ReceptionID) } diff --git a/groupChat/manager.go b/groupChat/manager.go index 9c2f83249d9100f8433f7b9373b5d39897b575b2..7fffb109d44dadc435383d65424ac1b55b0f41b3 100644 --- a/groupChat/manager.go +++ b/groupChat/manager.go @@ -14,6 +14,7 @@ import ( gs "gitlab.com/elixxir/client/groupChat/groupStore" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/edge" @@ -133,7 +134,7 @@ func (m Manager) JoinGroup(g gs.Group) error { edgeStore := m.store.GetEdge() edgeStore.Add(edge.Preimage{ Data: g.ID[:], - Type: "group", + Type: preimage.Group, Source: g.ID[:], }, m.store.GetUser().ReceptionID) @@ -151,7 +152,7 @@ func (m Manager) LeaveGroup(groupID *id.ID) error { edgeStore := m.store.GetEdge() err := edgeStore.Remove(edge.Preimage{ Data: groupID[:], - Type: "group", + Type: preimage.Group, Source: groupID[:], }, m.store.GetUser().ReceptionID) diff --git a/interfaces/preimage/generate.go b/interfaces/preimage/generate.go new file mode 100644 index 0000000000000000000000000000000000000000..f410e087332478d09dcff8ce32c33af5a4263855 --- /dev/null +++ b/interfaces/preimage/generate.go @@ -0,0 +1,26 @@ +package preimage + +import ( + "gitlab.com/xx_network/primitives/id" + "golang.org/x/crypto/blake2b" +) + +func Generate(data []byte, t string) []byte { + // Hash fingerprints + h, _ := blake2b.New256(nil) + h.Write(data) + h.Write([]byte(t)) + + // Base 64 encode hash and truncate + return h.Sum(nil) +} + +func GenerateRequest(recipient *id.ID) []byte { + // Hash fingerprints + h, _ := blake2b.New256(nil) + h.Write(recipient[:]) + h.Write([]byte(Request)) + + // Base 64 encode hash and truncate + return h.Sum(nil) +} diff --git a/interfaces/preimage/request.go b/interfaces/preimage/request.go new file mode 100644 index 0000000000000000000000000000000000000000..199c10909af8f723f2605dd4b5000d2072744b73 --- /dev/null +++ b/interfaces/preimage/request.go @@ -0,0 +1,24 @@ +package preimage + +import ( + "gitlab.com/xx_network/primitives/id" + "golang.org/x/crypto/blake2b" +) + +func MakeRequest(uid *id.ID) []byte { + h, _ := blake2b.New256(nil) + h.Write(uid[:]) + h.Write([]byte(Request)) + + // Base 64 encode hash and truncate + return h.Sum(nil) +} + +func MakeDefault(uid *id.ID) []byte { + h, _ := blake2b.New256(nil) + h.Write(uid[:]) + h.Write([]byte(Default)) + + // Base 64 encode hash and truncate + return h.Sum(nil) +} diff --git a/interfaces/preimage/types.go b/interfaces/preimage/types.go new file mode 100644 index 0000000000000000000000000000000000000000..3588b4f24ca24ecdb5cc6840d35ade097b5468d8 --- /dev/null +++ b/interfaces/preimage/types.go @@ -0,0 +1,10 @@ +package preimage + +const ( + Default = "default" + Request = "request" + Confirm = "confirm" + Rekey = "rekey" + E2e = "e2e" + Group = "group" +) diff --git a/keyExchange/rekey.go b/keyExchange/rekey.go index 5acc9ba71f383b5e8ae15966421ecd227ed7f6e7..f549d7a57a69674565618048828b3a8586a42717 100644 --- a/keyExchange/rekey.go +++ b/keyExchange/rekey.go @@ -62,8 +62,10 @@ func trigger(instance *network.Instance, sendE2E interfaces.SendE2E, "negotiating status: %s", session, session.NegotiationStatus()) } + rekeyPreimage := manager.GetRekeyPreimage() + // send the rekey notification to the partner - err := negotiate(instance, sendE2E, sess, negotiatingSession, sendTimeout, stop) + err := negotiate(instance, sendE2E, sess, negotiatingSession, sendTimeout, rekeyPreimage, stop) // if sending the negotiation fails, revert the state of the session to // unconfirmed so it will be triggered in the future if err != nil { @@ -74,7 +76,7 @@ func trigger(instance *network.Instance, sendE2E interfaces.SendE2E, func negotiate(instance *network.Instance, sendE2E interfaces.SendE2E, sess *storage.Session, session *e2e.Session, sendTimeout time.Duration, - stop *stoppable.Single) error { + rekeyPreimage []byte, stop *stoppable.Single) error { e2eStore := sess.E2e() //generate public key @@ -103,6 +105,7 @@ func negotiate(instance *network.Instance, sendE2E interfaces.SendE2E, //send the message under the key exchange e2eParams := params.GetDefaultE2E() e2eParams.Type = params.KeyExchange + e2eParams.IdentityPreimage = rekeyPreimage rounds, _, _, err := sendE2E(m, e2eParams, stop) // If the send fails, returns the error so it can be handled. The caller diff --git a/keyExchange/trigger.go b/keyExchange/trigger.go index 0bdcbcc6e6ca80a28b58f53bbf32f22a2b0d0d41..b4f6eb69c95707e1d330b255d10df6d3f6ae83e5 100644 --- a/keyExchange/trigger.go +++ b/keyExchange/trigger.go @@ -122,6 +122,7 @@ func handleTrigger(sess *storage.Session, net interfaces.NetworkManager, //send the message under the key exchange e2eParams := params.GetDefaultE2E() + e2eParams.IdentityPreimage = partner.GetRekeyPreimage() // store in critical messages buffer first to ensure it is resent if the // send fails diff --git a/network/follow.go b/network/follow.go index bdcdf5deb8d5bda9d72c587f2ceae7d20b80a0f8..9a33cd6c515685019f1f1375c5c28d6c2aa8240b 100644 --- a/network/follow.go +++ b/network/follow.go @@ -321,8 +321,8 @@ func (m *manager) follow(report interfaces.ClientErrorReport, rng csprng.Source, //threshold is the earliest round that will not be excluded from earliest remaining earliestRemaining, roundsWithMessages, roundsUnknown := gwRoundsState.RangeUnchecked(updated, m.param.KnownRoundsThreshold, roundChecker) - jww.DEBUG.Printf("Processed RangeUnchecked, Oldest: %d, firstUnchecked: %d, " + - "last Checked: %d, threshold: %d, NewEarliestRemaning: %d, NumWithMessages: %d, " + + jww.DEBUG.Printf("Processed RangeUnchecked, Oldest: %d, firstUnchecked: %d, "+ + "last Checked: %d, threshold: %d, NewEarliestRemaning: %d, NumWithMessages: %d, "+ "NumUnknown: %d", updated, gwRoundsState.GetFirstUnchecked(), gwRoundsState.GetLastChecked(), m.param.KnownRoundsThreshold, earliestRemaining, len(roundsWithMessages), len(roundsUnknown)) diff --git a/network/message/handler.go b/network/message/handler.go index a9a387b2c51e2324ffc6c0aafc73b79e79737465..838be7875a696a15f3074aee5fae07ce3b1f0679 100644 --- a/network/message/handler.go +++ b/network/message/handler.go @@ -11,6 +11,7 @@ import ( "fmt" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage/edge" "gitlab.com/elixxir/crypto/e2e" @@ -52,28 +53,19 @@ func (m *Manager) handleMessage(ecrMsg format.Message, bundle Bundle, edge *edge var err error var relationshipFingerprint []byte - //check if the identity fingerprint matches - //first check if a list is present in store for the receiving source - forMe := false - preimagelist, exist := edge.Get(identity.Source) - if exist{ - //if it exists, check against all in the list - for key := range preimagelist{ - if forMe = fingerprint2.CheckIdentityFP(ecrMsg.GetIdentityFP(), - ecrMsg.GetContents(), preimagelist[key].Data); forMe{ - break - } - } - }else{ + //if it exists, check against all in the list + has, forMe, _ := m.Session.GetEdge().Check(identity.Source, ecrMsg.GetIdentityFP(), ecrMsg.GetContents()) + if !has { + jww.INFO.Printf("checking backup %v", preimage.MakeDefault(identity.Source)) //if it doesnt exist, check against the default fingerprint for the identity forMe = fingerprint2.CheckIdentityFP(ecrMsg.GetIdentityFP(), - ecrMsg.GetContents(), identity.Source[:]) + ecrMsg.GetContents(), preimage.MakeDefault(identity.Source)) } if !forMe { if jww.GetLogThreshold() == jww.LevelTrace { expectedFP := fingerprint2.IdentityFP(ecrMsg.GetContents(), - identity.Source[:]) + preimage.MakeDefault(identity.Source)) jww.TRACE.Printf("Message for %d (%s) failed identity "+ "check: %v (expected-default) vs %v (received)", identity.EphId, identity.Source, expectedFP, ecrMsg.GetIdentityFP()) diff --git a/network/message/sendCmixUtils.go b/network/message/sendCmixUtils.go index 7535a66d97f8b66396e92e2c3284e5ff6488a399..30fb94088c1b339462c87405e7b10e221299f3a2 100644 --- a/network/message/sendCmixUtils.go +++ b/network/message/sendCmixUtils.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/params" + preimage2 "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/cmix" pb "gitlab.com/elixxir/comms/mixmessages" @@ -141,9 +142,13 @@ func buildSlotMessage(msg format.Message, recipient *id.ID, target *id.ID, msg.SetEphemeralRID(ephIdFilled[:]) // use the alternate identity preimage if it is set - preimage := recipient[:] - if param.IdentityPreimage!=nil{ + var preimage []byte + if param.IdentityPreimage != nil { preimage = param.IdentityPreimage + jww.INFO.Printf("Sending to %s with override preimage %v", recipient, preimage) + }else{ + preimage = preimage2.MakeDefault(recipient) + jww.INFO.Printf("Sending to %s with default preimage %v", recipient, preimage) } // Set the identity fingerprint @@ -151,6 +156,8 @@ func buildSlotMessage(msg format.Message, recipient *id.ID, target *id.ID, msg.SetIdentityFP(ifp) + jww.INFO.Printf(" Sending to %s with preimage %v, ifp: %v, contents: %v", recipient, preimage, ifp, msg.GetContents()) + // Encrypt the message salt := make([]byte, 32) _, err = stream.Read(salt) diff --git a/network/message/sendE2E.go b/network/message/sendE2E.go index 5f42729f651de44afa707d10b52d2d5c83caf428..52d202393cc8817f2bf9ffd8acace69fb9df72eb 100644 --- a/network/message/sendE2E.go +++ b/network/message/sendE2E.go @@ -93,6 +93,11 @@ func (m *Manager) SendE2E(msg message.Send, param params.E2E, jww.INFO.Printf("E2E sending %d/%d to %s with msgDigest: %s, key fp: %s", i+i, len(partitions), msg.Recipient, msgEnc.Digest(), key.Fingerprint()) + //set the preimage to the default e2e one if it is not already set + if param.IdentityPreimage == nil { + param.IdentityPreimage = partner.GetE2EPreimage() + } + //send the cmix message, each partition in its own thread wg.Add(1) go func(i int) { diff --git a/storage/e2e/manager.go b/storage/e2e/manager.go index a978beeae77c2fffa723c15f495ebf1fa4925c5c..68119395dc81f3c3dff50dfcfdd5b5d8b6da9ea4 100644 --- a/storage/e2e/manager.go +++ b/storage/e2e/manager.go @@ -14,13 +14,13 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/xx_network/primitives/id" "golang.org/x/crypto/blake2b" - "sort" ) const managerPrefix = "Manager{partner:%s}" @@ -228,10 +228,22 @@ const relationshipFpLength = 15 // relationship. The fingerprint is a base 64 encoded hash of of the two // relationship fingerprints truncated to 15 characters. func (m *Manager) GetRelationshipFingerprint() string { + + // Base 64 encode hash and truncate + return base64.StdEncoding.EncodeToString(m.GetRelationshipFingerprintBytes())[:relationshipFpLength] +} + +// GetRelationshipFingerprintBytes returns a unique fingerprint for an E2E +// relationship. used for the e2e preimage. +func (m *Manager) GetRelationshipFingerprintBytes() []byte { // Sort fingerprints - fps := [][]byte{m.receive.fingerprint, m.send.fingerprint} - less := func(i, j int) bool { return bytes.Compare(fps[i], fps[j]) == -1 } - sort.Slice(fps, less) + var fps [][]byte + + if bytes.Compare(m.receive.fingerprint, m.send.fingerprint) == 1 { + fps = [][]byte{m.send.fingerprint, m.receive.fingerprint} + } else { + fps = [][]byte{m.receive.fingerprint, m.send.fingerprint} + } // Hash fingerprints h, _ := blake2b.New256(nil) @@ -240,5 +252,17 @@ func (m *Manager) GetRelationshipFingerprint() string { } // Base 64 encode hash and truncate - return base64.StdEncoding.EncodeToString(h.Sum(nil))[:relationshipFpLength] + return h.Sum(nil) +} + +// GetE2EPreimage returns a hash of the unique +// fingerprint for an E2E relationship message. +func (m *Manager) GetE2EPreimage() []byte { + return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.E2e) +} + +// GetRekeyPreimage returns a hash of the unique +// fingerprint for an E2E rekey message. +func (m *Manager) GetRekeyPreimage() []byte { + return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.Rekey) } diff --git a/storage/edge/edge.go b/storage/edge/edge.go index 095780591630850d8e609e495c1c52647ae01648..a720055d73f95dcb8c70455cb16a40a3ba0f81b9 100644 --- a/storage/edge/edge.go +++ b/storage/edge/edge.go @@ -5,6 +5,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" + fingerprint2 "gitlab.com/elixxir/crypto/fingerprint" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "sync" @@ -146,12 +147,43 @@ func (s *Store) Remove(preimage Preimage, identity *id.ID) error { } // Get returns the Preimages list for the given identity. -func (s *Store) Get(identity *id.ID) (Preimages, bool) { +func (s *Store) Get(identity *id.ID) ([]Preimage, bool) { s.mux.RLock() defer s.mux.RUnlock() preimages, exists := s.edge[*identity] - return preimages, exists + if !exists { + return nil, false + } + + preiamgesSlice := make([]Preimage, 0, len(preimages)) + + for _, preimage := range preimages { + preiamgesSlice = append(preiamgesSlice, preimage) + } + return preiamgesSlice, exists +} + +// Check looks checks if the identity fingerprint matches for any of +// the stored preimages. It returns the preimage it hit with if it +// finds one. +func (s *Store) Check(identity *id.ID, identityFP []byte, messageContents []byte) (bool, bool, Preimage) { + s.mux.RLock() + defer s.mux.RUnlock() + + preimages, exists := s.edge[*identity] + if !exists { + return false, false, Preimage{} + } + + for _, preimage := range preimages { + jww.INFO.Printf("checking ifp: %v, msg: %v, preimage %v", identityFP, messageContents, preimage) + if fingerprint2.CheckIdentityFP(identityFP, messageContents, preimage.Data) { + return true, true, preimage + } + } + + return true, false, Preimage{} } // AddUpdateCallback adds the callback to be called for changes to the identity. @@ -183,8 +215,8 @@ func LoadStore(kv *versioned.KV) (*Store, error) { } s := &Store{ - kv: kv, - edge: make(map[id.ID]Preimages), + kv: kv, + edge: make(map[id.ID]Preimages), callbacks: make(map[id.ID][]ListUpdateCallBack), } diff --git a/storage/edge/edge_test.go b/storage/edge/edge_test.go index 91bc215696b611ab0ea8c79df9d217cbd9c58c26..e059e749666f0f30223e78e584a5af995a91092a 100644 --- a/storage/edge/edge_test.go +++ b/storage/edge/edge_test.go @@ -16,7 +16,9 @@ package edge import ( "encoding/json" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage/versioned" + fingerprint2 "gitlab.com/elixxir/crypto/fingerprint" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "math/rand" @@ -147,7 +149,7 @@ func TestStore_Add(t *testing.T) { "\nexpected: %d\nreceived: %d", identities[0], 3, len(pis)) } - expected := Preimage{identities[0].Bytes(), "default", identities[0].Bytes()} + expected := Preimage{preimage.Generate(identities[0].Bytes(), preimage.Default), preimage.Default, identities[0].Bytes()} if !reflect.DeepEqual(pis[expected.key()], expected) { t.Errorf("First Preimage of first Preimages does not match expected."+ "\nexpected: %+v\nreceived: %+v", expected, pis[expected.key()]) @@ -172,7 +174,7 @@ func TestStore_Add(t *testing.T) { "\nexpected: %d\nreceived: %d", identities[1], 2, len(pis)) } - expected = Preimage{identities[1].Bytes(), "default", identities[1].Bytes()} + expected = Preimage{preimage.Generate(identities[1].Bytes(), preimage.Default), preimage.Default, identities[1].Bytes()} if !reflect.DeepEqual(pis[expected.key()], expected) { t.Errorf("First Preimage of second Preimages does not match expected."+ "\nexpected: %+v\nreceived: %+v", expected, pis[expected.key()]) @@ -290,9 +292,9 @@ func TestStore_Remove(t *testing.T) { t.Errorf("Remove returned an error: %+v", err) } - if len(s.edge) != 2 { + if len(s.edge) != 3 { t.Errorf("Length of edge incorrect.\nexpected: %d\nreceived: %d", - 1, len(s.edge)) + 2, len(s.edge)) } pis := s.edge[*identities[0]] @@ -316,9 +318,9 @@ func TestStore_Remove(t *testing.T) { pis = s.edge[*identities[1]] - if len(pis) != 0 { + if len(pis) != 1 { t.Errorf("Length of preimages for identity %s inocrrect."+ - "\nexpected: %d\nreceived: %d", identities[1], 0, len(pis)) + "\nexpected: %d\nreceived: %d", identities[1], 1, len(pis)) } wg.Wait() @@ -346,15 +348,25 @@ func TestStore_Get(t *testing.T) { t.Errorf("No Preimages found for identity %s.", identities[0]) } - expected := Preimages{ - identities[0].String(): Preimage{identities[0].Bytes(), "default", identities[0].Bytes()}, - preimages[0].key(): preimages[0], - preimages[2].key(): preimages[2], + expected := []Preimage{ + {preimage.Generate(identities[0].Bytes(), preimage.Default), preimage.Default, identities[0].Bytes()}, + preimages[0], + preimages[2], } - if !reflect.DeepEqual(expected, pis) { - t.Errorf("First Preimages for identity %s does not match expected."+ - "\nexpected: %+v\nreceived: %+v", identities[0], expected, pis) + if len(expected) != len(pis) { + t.Errorf("First Preimages for identity %s does not match expected, difrent lengths of %d and %d"+ + "\nexpected: %+v\nreceived: %+v", identities[0], len(expected), len(pis), expected, pis) + } + +top: + for i, lookup := range expected { + for _, checked := range pis { + if reflect.DeepEqual(lookup, checked) { + continue top + } + } + t.Errorf("Entree %d in expected %v not found in received %v", i, lookup, pis) } pis, exists = s.Get(identities[1]) @@ -362,14 +374,24 @@ func TestStore_Get(t *testing.T) { t.Errorf("No Preimages found for identity %s.", identities[1]) } - expected = Preimages{ - identities[1].String(): Preimage{identities[1].Bytes(), "default", identities[1].Bytes()}, - preimages[1].key(): preimages[1], + expected = []Preimage{ + {preimage.Generate(identities[1].Bytes(), preimage.Default), preimage.Default, identities[1].Bytes()}, + preimages[1], + } + + if len(expected) != len(pis) { + t.Errorf("First Preimages for identity %s does not match expected, difrent lengths of %d and %d"+ + "\nexpected: %+v\nreceived: %+v", identities[0], len(expected), len(pis), expected, pis) } - if !reflect.DeepEqual(expected, pis) { - t.Errorf("First Preimages for identity %s does not match expected."+ - "\nexpected: %+v\nreceived: %+v", identities[1], expected, pis) +top2: + for i, lookup := range expected { + for _, checked := range pis { + if reflect.DeepEqual(lookup, checked) { + continue top2 + } + } + t.Errorf("Entree %d in expected %v not found in received %v", i, lookup, pis) } } @@ -451,15 +473,15 @@ func TestLoadStore(t *testing.T) { t.Fatalf("LoadStore error: %v", err) } - expectedPis := []Preimages{ + expectedPis := [][]Preimage{ { - identities[0].String(): Preimage{identities[0].Bytes(), "default", identities[0].Bytes()}, - preimages[0].key(): preimages[0], - preimages[2].key(): preimages[2], + Preimage{preimage.Generate(identities[0].Bytes(), preimage.Default), preimage.Default, identities[0].Bytes()}, + preimages[0], + preimages[2], }, { - identities[1].String(): Preimage{identities[1].Bytes(), "default", identities[1].Bytes()}, - preimages[1].key(): preimages[1], + Preimage{preimage.Generate(identities[1].Bytes(), preimage.Default), preimage.Default, identities[1].Bytes()}, + preimages[1], }, } @@ -469,11 +491,70 @@ func TestLoadStore(t *testing.T) { t.Errorf("Identity %s does not exist in loaded store", identity) } - if !reflect.DeepEqual(pis, expectedPis[i]) { - t.Errorf("Identity %s does not have expected preimages in loaded store."+ - "\nExpected: %v\nRecieved", expectedPis[i], pis) + if len(expectedPis[i]) != len(pis) { + t.Errorf("First Preimages for identity %s does not match expected, difrent lengths of %d and %d"+ + "\nexpected: %+v\nreceived: %+v", identities[0], len(expectedPis[i]), len(pis), expectedPis[i], pis) } + + top: + for idx, lookup := range expectedPis[i] { + for _, checked := range pis { + if reflect.DeepEqual(lookup, checked) { + continue top + } + } + t.Errorf("Entree %d in expected %v not found in received %v", idx, lookup, pis) + } + + } +} + +func TestStore_Check(t *testing.T) { + // Initialize store + s, _, _ := newTestStore(t) + identities := []*id.ID{ + id.NewIdFromString("identity0", id.User, t), + id.NewIdFromString("identity1", id.User, t), + } + preimages := []Preimage{ + {[]byte("ID0"), "default0", []byte("ID0")}, + {[]byte("ID1"), "default1", []byte("ID1")}, + {[]byte("ID2"), "default2", []byte("ID2")}, + } + + // Add preimages + s.Add(preimages[0], identities[0]) + s.Add(preimages[1], identities[1]) + s.Add(preimages[2], identities[0]) + + testMsg := []byte("test message 123") + preImageData := preimages[0].Data + testFp := fingerprint2.IdentityFP(testMsg, preImageData) + + has, forMe, receivedPreImage := s.Check(identities[0], testFp, testMsg) + + if !has || !forMe || !reflect.DeepEqual(receivedPreImage, preimages[0]) { + t.Errorf("Unexpected result from Check()."+ + "\nExpected results: (has: %v) "+ + "\n\t(forMe: %v)"+ + "\n\t(Preimage: %v)"+ + "\nReceived results: (has: %v) "+ + "\n\t(forME: %v)"+ + "\n\t(Preimage: %v)", true, true, preimages[0], + has, forMe, receivedPreImage) } + + // Check with wrong identity (has should be true, for me false) + has, forMe, _ = s.Check(identities[1], testFp, testMsg) + if !has || forMe { + t.Errorf("Unexpected results from check."+ + "\nExpected results: (has: %v)"+ + "\n\t(ForMe %v)"+ + "\nReceived results: "+ + "has: %v"+ + "\n\t(ForMe: %v)", true, false, has, forMe) + } + } func TestStore_save(t *testing.T) { diff --git a/storage/edge/preimage.go b/storage/edge/preimage.go index f9e63a6417c5c8f81f7fc8cdffd237ee8885d923..a8e4c89432dddc25596495fe69b59e7786ceab45 100644 --- a/storage/edge/preimage.go +++ b/storage/edge/preimage.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "encoding/json" "github.com/pkg/errors" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" @@ -31,12 +32,13 @@ type Preimages map[string]Preimage // newPreimages makes a Preimages object for the given identity and populates // it with the default preimage for the identity. Does not store to disk. func newPreimages(identity *id.ID) Preimages { + defaultPreimage := Preimage{ + Data: preimage.MakeDefault(identity), + Type: preimage.Default, + Source: identity[:], + } pis := Preimages{ - identity.String(): { - Data: identity[:], - Type: "default", - Source: identity[:], - }, + defaultPreimage.key(): defaultPreimage, } return pis diff --git a/storage/edge/preimage_test.go b/storage/edge/preimage_test.go index c70d449f2e7be43bfa0cbebdbb0466baa61d83cf..b31cc4274075344ad705b5308e7ac30e93bac5d0 100644 --- a/storage/edge/preimage_test.go +++ b/storage/edge/preimage_test.go @@ -10,6 +10,7 @@ package edge import ( "bytes" "encoding/json" + "gitlab.com/elixxir/client/interfaces/preimage" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" @@ -20,12 +21,13 @@ import ( // Tests that newPreimages returns the expected new Preimages. func Test_newPreimages(t *testing.T) { identity := id.NewIdFromString("identity", id.User, t) + pimg := Preimage{ + Data: preimage.MakeDefault(identity), + Type: "default", + Source: identity.Bytes(), + } expected := Preimages{ - identity.String(): { - Data: identity.Bytes(), - Type: "default", - Source: identity.Bytes(), - }, + pimg.key(): pimg, } received := newPreimages(identity) @@ -42,36 +44,47 @@ func TestPreimages_add(t *testing.T) { identity1 := id.NewIdFromString("identity1", id.User, t) identity2 := id.NewIdFromString("identity3", id.User, t) expected := Preimages{ - identity0.String(): {identity0.Bytes(), "default", identity0.Bytes()}, - identity1.String(): {identity1.Bytes(), "group", identity1.Bytes()}, - identity2.String(): {identity2.Bytes(), "default", identity2.Bytes()}, + identity0.String(): {preimage.Generate(identity0.Bytes(), preimage.Default), preimage.Default, preimage.MakeDefault(identity0)}, + identity1.String(): {preimage.Generate(identity1.Bytes(), preimage.Group), preimage.Group, identity1.Bytes()}, + identity2.String(): {preimage.Generate(identity2.Bytes(), preimage.Default), preimage.Default, identity2.Bytes()}, } pis := newPreimages(identity0) - exists := pis.add(Preimage{identity1.Bytes(), "group", identity1.Bytes()}) + preimageOne := Preimage{preimage.Generate(identity1.Bytes(), preimage.Group), preimage.Group, identity1.Bytes()} + exists := pis.add(preimageOne) if !exists { t.Errorf("Failed to add idenetity.") } - exists = pis.add(Preimage{identity2.Bytes(), "default", identity2.Bytes()}) + + preimageTwo := Preimage{preimage.Generate(identity2.Bytes(), preimage.Default), preimage.Default, identity2.Bytes()} + exists = pis.add(preimageTwo) if !exists { t.Errorf("Failed to add idenetity.") } - if !reflect.DeepEqual(expected, pis) { - t.Errorf("Failed to add expected Preimages."+ - "\nexpected: %+v\nreceived: %+v", expected, pis) + for identity, pimg := range expected { + if _, exists = pis[pimg.key()]; !exists { + t.Errorf("Identity %s could not be found", identity) + } } + expectedPreimageIdentityTwo := Preimage{ + Data: preimage.Generate(identity2.Bytes(), preimage.Default), + Type: preimage.Default, + Source: identity2.Bytes(), + } // Test that nothing happens when a Preimage with the same data exists - exists = pis.add(Preimage{identity2.Bytes(), "test", identity2.Bytes()}) + exists = pis.add(Preimage{preimage.Generate(identity2.Bytes(), preimage.Default), "test", identity2.Bytes()}) if exists { t.Errorf("Add idenetity that shoudl already exist.") } - if !reflect.DeepEqual(expected, pis) { - t.Errorf("Failed to add expected Preimages."+ - "\nexpected: %+v\nreceived: %+v", expected, pis) + receivedPreimageIdentityTwo := pis[preimageTwo.key()] + + if !reflect.DeepEqual(expectedPreimageIdentityTwo, receivedPreimageIdentityTwo) { + t.Errorf("Unexpected overwritting of existing identity") } + } // Tests that Preimages.remove removes all the correct Preimage from the list. @@ -82,9 +95,9 @@ func TestPreimages_remove(t *testing.T) { // Add 10 Preimage to the list for i := 0; i < 10; i++ { identity := id.NewIdFromUInt(uint64(i), id.User, t) - pisType := "default" + pisType := preimage.Default if i%2 == 0 { - pisType = "group" + pisType = preimage.Group } exists := pis.add(Preimage{identity.Bytes(), pisType, identity.Bytes()})