From b113acaca23a9b4728e55652e232e22ec801072d Mon Sep 17 00:00:00 2001 From: Benjamin Wenger <ben@elixxir.ioo> Date: Fri, 25 Mar 2022 14:58:44 -0700 Subject: [PATCH] more work --- go.mod | 2 +- go.sum | 2 ++ network/interface.go | 8 +++++-- network/message/handler.go | 8 +++---- network/message/triggers.go | 32 +++++++++++++++++++++------- network/params.go | 3 ++- network/sendCmix.go | 42 +++++++++++++++++++++++++++++++++++-- 7 files changed, 79 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 0d5e6d485..534fe473e 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/spf13/viper v1.7.1 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 gitlab.com/elixxir/comms v0.0.4-0.20220308183624-c2183e687a03 - gitlab.com/elixxir/crypto v0.0.7-0.20220309234716-1ba339865787 + gitlab.com/elixxir/crypto v0.0.7-0.20220325215559-7489d68d7714 gitlab.com/elixxir/ekv v0.1.6 gitlab.com/elixxir/primitives v0.0.3-0.20220222212109-d412a6e46623 gitlab.com/xx_network/comms v0.0.4-0.20220311192415-d95fe8906580 diff --git a/go.sum b/go.sum index d5504c7a5..8815f9a6d 100644 --- a/go.sum +++ b/go.sum @@ -279,6 +279,8 @@ gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp0 gitlab.com/elixxir/crypto v0.0.7-0.20220222221347-95c7ae58da6b/go.mod h1:tD6XjtQh87T2nKZL5I/pYPck5M2wLpkZ1Oz7H/LqO10= gitlab.com/elixxir/crypto v0.0.7-0.20220309234716-1ba339865787 h1:+qmsWov412+Yn7AKUhTbOcDgAydNXlNLPmFpO2W5LwY= gitlab.com/elixxir/crypto v0.0.7-0.20220309234716-1ba339865787/go.mod h1:tD6XjtQh87T2nKZL5I/pYPck5M2wLpkZ1Oz7H/LqO10= +gitlab.com/elixxir/crypto v0.0.7-0.20220325215559-7489d68d7714 h1:epnov8zyFWod14MUNtGHSbZCVSkZjN4NvoiBs1TgEV8= +gitlab.com/elixxir/crypto v0.0.7-0.20220325215559-7489d68d7714/go.mod h1:tD6XjtQh87T2nKZL5I/pYPck5M2wLpkZ1Oz7H/LqO10= gitlab.com/elixxir/ekv v0.1.6 h1:M2hUSNhH/ChxDd+s8xBqSEKgoPtmE6hOEBqQ73KbN6A= gitlab.com/elixxir/ekv v0.1.6/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4= gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg= diff --git a/network/interface.go b/network/interface.go index 3f37458ec..0c48d2546 100644 --- a/network/interface.go +++ b/network/interface.go @@ -1,7 +1,6 @@ package network import ( - "gitlab.com/elixxir/client/interfaces/message" "gitlab.com/elixxir/client/network/identity/receptionID" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/comms/mixmessages" @@ -35,7 +34,7 @@ type Manager interface { // replaced with multiple uses of SendCmix in most cases. Returns the round // ID of the round the payload was sent or an error if it fails. // WARNING: Potentially Unsafe - SendManyCMIX(messages []message.TargetedCmixMessage, p CMIXParams) ( + SendManyCMIX(messages []TargetedCmixMessage, p CMIXParams) ( id.Round, []ephemeral.Id, error) /*===Message Reception====================================================*/ @@ -117,6 +116,11 @@ type Manager interface { // Multiple trackTriggers can be registered TrackTriggers(TriggerTracker) + + //Dropped Messages Pickup + RegisterDroppedMessagesPickup(response MessageProcessor) + DenoteReception(msgId uint) + /* In inProcess */ // it is possible to receive a message over cMix before the fingerprints or // triggers are registered. As a result, when handling fails, messages are diff --git a/network/message/handler.go b/network/message/handler.go index 34f4ad91e..0496f71ab 100644 --- a/network/message/handler.go +++ b/network/message/handler.go @@ -73,21 +73,21 @@ func (p *handler) handleMessage(ecrMsg format.Message, bundle Bundle) bool { return true } - triggers, exists := p.get(identity.Source, ecrMsg.GetIdentityFP(), ecrMsg.GetContents()) + triggers, exists := p.get(identity.Source, ecrMsg.GetSIH(), ecrMsg.GetContents()) if exists { for _, t := range triggers { go t.Process(ecrMsg, receptionID, round) } if len(triggers) == 0 { jww.ERROR.Printf("empty trigger list for %s", - ecrMsg.GetIdentityFP()) // get preimage + ecrMsg.GetSIH()) // get preimage } return true } else { // TODO: delete this else block because it should not be needed. 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(), + // forMe = fingerprint2.CheckIdentityFP(ecrMsg.GetSIH(), // ecrMsgContents, preimage.MakeDefault(identity.Source)) } @@ -97,7 +97,7 @@ func (p *handler) handleMessage(ecrMsg format.Message, bundle Bundle) bool { jww.TRACE.Printf("Message for %d (%s) failed identity "+ "check: %v (expected-default) vs %v (received)", identity.EphId, - identity.Source, expectedFP, ecrMsg.GetIdentityFP()) + identity.Source, expectedFP, ecrMsg.GetSIH()) } im := fmt.Sprintf("Garbled/RAW Message: keyFP: %v, round: %d"+ "msgDigest: %s, not determined to be for client", diff --git a/network/message/triggers.go b/network/message/triggers.go index 3011ae600..ab733cdd3 100644 --- a/network/message/triggers.go +++ b/network/message/triggers.go @@ -8,6 +8,7 @@ package message import ( + "golang.org/x/crypto/blake2b" "sync" "github.com/pkg/errors" @@ -102,20 +103,35 @@ func (t *TriggersManager) AddTrigger(clientID *id.ID, newTrigger interfaces.Trig MessageProcessor: response, } + realTrigger := Generate(newTrigger.Preimage,newTrigger.Type) + cid := *clientID if _, exists := t.tmap[cid]; !exists { t.tmap[cid] = make(map[interfaces.Preimage][]trigger) } - pi := newTrigger.Preimage - if existingTriggers, exists := t.tmap[cid][pi]; exists { - t.tmap[cid][pi] = append(existingTriggers, newEntry) + + if existingTriggers, exists := t.tmap[cid][realTrigger]; exists { + t.tmap[cid][realTrigger] = append(existingTriggers, newEntry) } - t.tmap[cid][pi] = []trigger{newEntry} + t.tmap[cid][realTrigger] = []trigger{newEntry} t.numTriggers++ - t.triggerTriggerTracking() + t.triggerTracking() +} + +func Generate(data []byte, t string) []byte { + if t == Default { + return data + } + // Hash fingerprints + h, _ := blake2b.New256(nil) + h.Write(data) + h.Write([]byte(t)) + + // Base 64 encode hash and truncate + return h.Sum(nil) } // DeleteTrigger - If only a single response is associated with the preimage, @@ -159,7 +175,7 @@ func (t *TriggersManager) DeleteTrigger(clientID *id.ID, preimage interfaces.Pre } } t.numTriggers-- - t.triggerTriggerTracking() + t.triggerTracking() return nil } @@ -183,8 +199,8 @@ func (t *TriggersManager) TrackTriggers(triggerTracker interfaces.TriggerTracker t.trackers = append(t.trackers, triggerTracker) } -//triggerTriggerTracking triggers the tracking of triggers -func (t *TriggersManager) triggerTriggerTracking() { +//triggerTracking triggers the tracking of triggers +func (t *TriggersManager) triggerTracking() { if len(t.trackers) == 0 { return } diff --git a/network/params.go b/network/params.go index cd8e68d2d..2baf33104 100644 --- a/network/params.go +++ b/network/params.go @@ -2,6 +2,7 @@ package network import ( "encoding/json" + "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/network/historical" "gitlab.com/elixxir/client/network/message" "gitlab.com/elixxir/client/network/rounds" @@ -97,7 +98,7 @@ type CMIXParams struct { // an alternate identity preimage to use on send. If not set, the default // for the sending identity will be used - IdentityPreimage []byte + trigger interfaces.Trigger // Tag which prints with sending logs to help localize the source // All internal sends are tagged, so the default tag is "External" diff --git a/network/sendCmix.go b/network/sendCmix.go index 097247647..0351f7685 100644 --- a/network/sendCmix.go +++ b/network/sendCmix.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/event" + "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/network/gateway" "gitlab.com/elixxir/client/network/nodes" "gitlab.com/elixxir/client/stoppable" @@ -31,11 +32,48 @@ import ( "time" ) + +type StandardSendable struct{ + Recipient *id.ID + Payload []byte + Fingerprint format.Fingerprint + Trigger StandardTrigger +} + +type StandardTrigger struct{ + Preimage + Type string + Source []byte + crystal []byte +} + +func (t *trigger)Crystalize()[]byte{ + if t.crystal==nil{ + t.crystal=t.generate() + } + return copy(t.crystal) +} + +type Sendable interface{ + GetRecipient()*id.ID + GetPayload()[]byte + GetMac()[]byte + GetFingerprint()format.Fingerprint + GetTriggerPreimage()PreimagePrefix +} + +type Trigger interface{ + GetPreimage()[]byte + GetSource()format.Fingerprint + GetType()string + Crystalize()[]byte +} + + // SendCMIX sends a "raw" CMIX message payload to the provided recipient. // Returns the round ID of the round the payload was sent or an error // if it fails. -func (m *manager) SendCMIX(msg format.Message, - recipient *id.ID, cmixParams CMIXParams) (id.Round, ephemeral.Id, error) { +func (m *manager) SendCMIX(message Sendable, cmixParams CMIXParams) (id.Round, ephemeral.Id, error) { if !m.Monitor.IsHealthy() { return 0, ephemeral.Id{}, errors.New("Cannot send cmix message when the " + "network is not healthy") -- GitLab