From 763f279498284459af8676dca586433bce878e49 Mon Sep 17 00:00:00 2001 From: Benjamin Wenger <ben@elixxir.ioo> Date: Tue, 29 Mar 2022 14:44:57 -0700 Subject: [PATCH] in progress e2e work --- e2e/ratchet/context.go | 24 --- e2e/ratchet/fingerprintAccess.go | 19 -- e2e/ratchet/interface.go | 22 +++ e2e/ratchet/partner/interface.go | 30 ++++ e2e/ratchet/partner/manager.go | 113 ++++++------ e2e/ratchet/partner/manager_test.go | 12 +- e2e/ratchet/partner/session/session.go | 4 +- e2e/ratchet/partner/session/sessionID.go | 2 +- e2e/ratchet/serviceList.go | 68 +++++++ e2e/ratchet/store.go | 215 ++++------------------- network/message/serviceGenerators.go | 4 +- network/message/serviceInterface.go | 4 +- network/message/services.go | 2 +- 13 files changed, 223 insertions(+), 296 deletions(-) delete mode 100644 e2e/ratchet/context.go delete mode 100644 e2e/ratchet/fingerprintAccess.go create mode 100644 e2e/ratchet/interface.go create mode 100644 e2e/ratchet/partner/interface.go create mode 100644 e2e/ratchet/serviceList.go diff --git a/e2e/ratchet/context.go b/e2e/ratchet/context.go deleted file mode 100644 index 27279e4fd..000000000 --- a/e2e/ratchet/context.go +++ /dev/null @@ -1,24 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2020 xx network SEZC // -// // -// Use of this source code is governed by a license that can be found in the // -// LICENSE file // -/////////////////////////////////////////////////////////////////////////////// - -package ratchet - -import ( - "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/elixxir/crypto/fastRNG" - "gitlab.com/xx_network/primitives/id" -) - -type context struct { - fa fingerprintAccess - - grp *cyclic.Group - - rng *fastRNG.StreamGenerator - - myID *id.ID -} diff --git a/e2e/ratchet/fingerprintAccess.go b/e2e/ratchet/fingerprintAccess.go deleted file mode 100644 index aefb0fd56..000000000 --- a/e2e/ratchet/fingerprintAccess.go +++ /dev/null @@ -1,19 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2020 xx network SEZC // -// // -// Use of this source code is governed by a license that can be found in the // -// LICENSE file // -/////////////////////////////////////////////////////////////////////////////// - -package ratchet - -import ( - session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" -) - -type fingerprintAccess interface { - // Receives a list of fingerprints to add. Overrides on collision. - add([]*session2.Cypher) - // Receives a list of fingerprints to delete. Ignores any not available Keys - remove([]*session2.Cypher) -} diff --git a/e2e/ratchet/interface.go b/e2e/ratchet/interface.go new file mode 100644 index 000000000..889dba56f --- /dev/null +++ b/e2e/ratchet/interface.go @@ -0,0 +1,22 @@ +package ratchet + +import ( + "github.com/cloudflare/circl/dh/sidh" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/network/message" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/xx_network/primitives/id" +) + +type Ratchet interface { + AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, + partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, + sendParams, receiveParams session.Params) + GetPartner(partnerID *id.ID) (*Manager, error) + DeletePartner(partnerId *id.ID) + GetAllPartnerIDs() []*id.ID + GetDHPrivateKey() *cyclic.Int + GetDHPublicKey() *cyclic.Int + AddService(tag string, processor message.Processor) + RemoveService(tag string) +} diff --git a/e2e/ratchet/partner/interface.go b/e2e/ratchet/partner/interface.go new file mode 100644 index 000000000..170fb88b4 --- /dev/null +++ b/e2e/ratchet/partner/interface.go @@ -0,0 +1,30 @@ +package partner + +import ( + "github.com/cloudflare/circl/dh/sidh" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/network/message" + "gitlab.com/elixxir/crypto/contact" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/xx_network/primitives/id" +) + +type Manager2 interface { + NewReceiveSession(partnerPubKey *cyclic.Int, + partnerSIDHPubKey *sidh.PublicKey, e2eParams session.Params, + source *session.Session) (*session.Session, bool) + NewSendSession(myPrivKey *cyclic.Int, + mySIDHPrivKey *sidh.PrivateKey, e2eParams session.Params) + PopSendCypher() (*session.Cypher, error) + PopRekeyCypher() (*session.Cypher, error) + GetPartnerID() *id.ID + GetSendSession(sid session.SessionID) *session.Session + GetSendRelationshipFingerprint() + Confirm(sid session.SessionID) + TriggerNegotiations() []*session.Session + GetMyOriginPrivateKey() + GetPartnerOriginPublicKey() + GetRelationshipFingerprintBytes() []byte + MakeService(tag string) message.Service + GetContact() contact.Contact +} diff --git a/e2e/ratchet/partner/manager.go b/e2e/ratchet/partner/manager.go index 29f30fd12..d9643ca39 100644 --- a/e2e/ratchet/partner/manager.go +++ b/e2e/ratchet/partner/manager.go @@ -14,12 +14,11 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/ratchet" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/interfaces/params" - "gitlab.com/elixxir/client/interfaces/preimage" + "gitlab.com/elixxir/client/network/message" "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" @@ -92,7 +91,7 @@ func NewManager(kv *versioned.KV, myID, partnerID *id.ID, myPrivKey, } //loads a relationship and all buffers and sessions from disk -func loadManager(kv *versioned.KV, myID, partnerID *id.ID, +func LoadManager(kv *versioned.KV, myID, partnerID *id.ID, cyHandler session.CypherHandler, grp *cyclic.Group, rng *fastRNG.StreamGenerator) (*Manager, error) { @@ -130,7 +129,7 @@ func loadManager(kv *versioned.KV, myID, partnerID *id.ID, } m.receive, err = LoadRelationship(m.kv, session.Receive, myID, partnerID, - cyHandler, grp, rng)) + cyHandler, grp, rng) if err != nil { return nil, errors.WithMessage(err, "Failed to load partner key relationship due to failure to "+ @@ -140,10 +139,10 @@ func loadManager(kv *versioned.KV, myID, partnerID *id.ID, return m, nil } -// clearManager removes the relationship between the partner +// ClearManager removes the relationship between the partner // and deletes the Send and Receive sessions. This includes the // sessions and the key vectors -func clearManager(m *Manager, kv *versioned.KV) error { +func ClearManager(m *Manager, kv *versioned.KV) error { kv = kv.Prefix(fmt.Sprintf(managerPrefix, m.partner)) if err := DeleteRelationship(m); err != nil { @@ -166,21 +165,22 @@ func clearManager(m *Manager, kv *versioned.KV) error { // allows for support of duplicate key exchange triggering. func (m *Manager) NewReceiveSession(partnerPubKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, e2eParams session.Params, - source *session2.Session) (*session2.Session, bool) { + source *session.Session) (*session.Session, bool) { // Check if the session already exists - baseKey := session2.GenerateE2ESessionBaseKey(source.myPrivKey, partnerPubKey, - m.ctx.grp, source.mySIDHPrivKey, partnerSIDHPubKey) - sessionID := session.getSessionIDFromBaseKey(baseKey) + baseKey := session.GenerateE2ESessionBaseKey(source.GetMyPrivKey(), partnerPubKey, + m.grp, source.GetMySIDHPrivKey(), partnerSIDHPubKey) + + sessionID := session.GetSessionIDFromBaseKey(baseKey) if s := m.receive.GetByID(sessionID); s != nil { return s, true } // Add the session to the buffer - session := m.receive.AddSession(source.myPrivKey, partnerPubKey, baseKey, - source.mySIDHPrivKey, partnerSIDHPubKey, - source.GetID(), session2.Confirmed, e2eParams) + session := m.receive.AddSession(source.GetMyPrivKey(), partnerPubKey, baseKey, + source.GetMySIDHPrivKey(), partnerSIDHPubKey, + source.GetID(), session.Confirmed, e2eParams) return session, false } @@ -189,29 +189,27 @@ func (m *Manager) NewReceiveSession(partnerPubKey *cyclic.Int, // received from the partner and a new private key for the user. Passing in a // private key is optional. A private key will be generated if none is passed. func (m *Manager) NewSendSession(myPrivKey *cyclic.Int, - mySIDHPrivKey *sidh.PrivateKey, - e2eParams params.E2ESessionParams) *session2.Session { + mySIDHPrivKey *sidh.PrivateKey, e2eParams session.Params) *session.Session { // Find the latest public key from the other party sourceSession := m.receive.getNewestRekeyableSession() // Add the session to the Send session buffer and return - return m.send.AddSession(myPrivKey, sourceSession.partnerPubKey, nil, - mySIDHPrivKey, sourceSession.partnerSIDHPubKey, - sourceSession.GetID(), session2.Sending, e2eParams) + return m.send.AddSession(myPrivKey, sourceSession.GetPartnerPubKey(), nil, + mySIDHPrivKey, sourceSession.GetPartnerSIDHPubKey(), + sourceSession.GetID(), session.Sending, e2eParams) } -// GetKeyForSending gets the correct session to Send with depending on the type +// PopSendCypher gets the correct session to Send with depending on the type // of Send. -func (m *Manager) GetKeyForSending(st params.SendType) (*session2.Cypher, error) { - switch st { - case params.Standard: - return m.send.getKeyForSending() - case params.KeyExchange: - return m.send.getKeyForRekey() - default: - } +func (m *Manager) PopSendCypher() (*session.Cypher, error) { + return m.send.getKeyForSending() +} + +// PopRekeyCypher gets the correct session to Send with depending on the type +// of Send. +func (m *Manager) PopRekeyCypher() (*session.Cypher, error) { + return m.send.getKeyForRekey() - return nil, errors.Errorf("Cannot get session for invalid Send Tag: %s", st) } // GetPartnerID returns a copy of the ID of the partner. @@ -221,30 +219,30 @@ func (m *Manager) GetPartnerID() *id.ID { // GetSendSession gets the Send session of the passed ID. Returns nil if no // session is found. -func (m *Manager) GetSendSession(sid session2.SessionID) *session2.Session { +func (m *Manager) GetSendSession(sid session.SessionID) *session.Session { return m.send.GetByID(sid) } +// GetReceiveSession gets the Receive session of the passed ID. Returns nil if +// no session is found. +func (m *Manager) GetReceiveSession(sid session.SessionID) *session.Session { + return m.receive.GetByID(sid) +} + // GetSendSession gets the Send session of the passed ID. Returns nil if no // session is found. func (m *Manager) GetSendRelationshipFingerprint() []byte { return m.send.fingerprint } -// GetReceiveSession gets the Receive session of the passed ID. Returns nil if -// no session is found. -func (m *Manager) GetReceiveSession(sid session2.SessionID) *session2.Session { - return m.receive.GetByID(sid) -} - // Confirm confirms a Send session is known about by the partner. -func (m *Manager) Confirm(sid session2.SessionID) error { +func (m *Manager) Confirm(sid session.SessionID) error { return m.send.Confirm(sid) } // TriggerNegotiations returns a list of key exchange operations if any are // necessary. -func (m *Manager) TriggerNegotiations() []*session2.Session { +func (m *Manager) TriggerNegotiations() []*session.Session { return m.send.TriggerNegotiation() } @@ -289,30 +287,27 @@ func (m *Manager) GetRelationshipFingerprintBytes() []byte { 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) -} - -// GetSilentPreimage returns a hash of the unique -// fingerprint for silent messages like E2E rekey message. -func (m *Manager) GetSilentPreimage() []byte { - return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.Silent) -} - -// GetFileTransferPreimage returns a hash of the unique -// fingerprint for an E2E end file transfer message. -func (m *Manager) GetFileTransferPreimage() []byte { - return preimage.Generate(m.GetRelationshipFingerprintBytes(), preimage.EndFT) +// MakeService Returns a service interface with the +// appropriate identifier for who is being sent to. Will populate +// the metadata with the partner +func (m *Manager) MakeService(tag string) message.Service { + return message.Service{ + Identifier: m.GetRelationshipFingerprintBytes(), + Tag: tag, + Metadata: m.partner[:], + } } -// 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) +// GetContact assembles and returns a contact.Contact with the partner's ID +// and DH key. +func (m *Manager) GetContact() contact.Contact { + // Assemble Contact + return contact.Contact{ + ID: m.GetPartnerID(), + DhPubKey: m.GetPartnerOriginPublicKey(), + } } func makeManagerPrefix(pid *id.ID) string { return fmt.Sprintf(managerPrefix, pid) -} \ No newline at end of file +} diff --git a/e2e/ratchet/partner/manager_test.go b/e2e/ratchet/partner/manager_test.go index a88634977..e81ce9a08 100644 --- a/e2e/ratchet/partner/manager_test.go +++ b/e2e/ratchet/partner/manager_test.go @@ -57,20 +57,20 @@ func Test_newManager(t *testing.T) { } } -// Tests happy path of loadManager. +// Tests happy path of LoadManager. func TestLoadManager(t *testing.T) { // Set up expected and test values expectedM, kv := newTestManager(t) // Attempt to load relationship - m, err := loadManager(expectedM.ctx, kv, expectedM.partner) + m, err := LoadManager(expectedM.ctx, kv, expectedM.partner) if err != nil { - t.Errorf("loadManager() returned an error: %v", err) + t.Errorf("LoadManager() returned an error: %v", err) } // Check if the loaded relationship matches the expected if !managersEqual(expectedM, m, t) { - t.Errorf("loadManager() did not produce the expected Manager."+ + t.Errorf("LoadManager() did not produce the expected Manager."+ "\n\texpected: %+v\n\treceived: %+v", expectedM, m) } } @@ -93,9 +93,9 @@ func TestManager_ClearManager(t *testing.T) { } // Attempt to load relationship - _, err = loadManager(expectedM.ctx, kv, expectedM.partner) + _, err = LoadManager(expectedM.ctx, kv, expectedM.partner) if err != nil { - t.Errorf("loadManager() returned an error: %v", err) + t.Errorf("LoadManager() returned an error: %v", err) } } diff --git a/e2e/ratchet/partner/session/session.go b/e2e/ratchet/partner/session/session.go index 8f0605741..9b0543ac7 100644 --- a/e2e/ratchet/partner/session/session.go +++ b/e2e/ratchet/partner/session/session.go @@ -303,7 +303,7 @@ func GetSessionIDFromBaseKeyForTesting(baseKey *cyclic.Int, i interface{}) Sessi default: jww.FATAL.Panicf("GetSessionIDFromBaseKeyForTesting is restricted to testing only. Got %T", i) } - return getSessionIDFromBaseKey(baseKey) + return GetSessionIDFromBaseKey(baseKey) } //Blake2B hash of base key used for storage @@ -632,7 +632,7 @@ func (s *Session) finalizeKeyNegotiation() { s.partnerSIDHPubKey) } - s.sID = getSessionIDFromBaseKey(s.baseKey) + s.sID = GetSessionIDFromBaseKey(s.baseKey) } func (s *Session) buildChildKeys() { diff --git a/e2e/ratchet/partner/session/sessionID.go b/e2e/ratchet/partner/session/sessionID.go index 4dddea303..82f0bf4f6 100644 --- a/e2e/ratchet/partner/session/sessionID.go +++ b/e2e/ratchet/partner/session/sessionID.go @@ -35,7 +35,7 @@ func (sid *SessionID) Unmarshal(b []byte) error { } //underlying definition of session id -func getSessionIDFromBaseKey(baseKey *cyclic.Int) SessionID { +func GetSessionIDFromBaseKey(baseKey *cyclic.Int) SessionID { // no lock is needed because this cannot be edited sid := SessionID{} h, _ := hash.NewCMixHash() diff --git a/e2e/ratchet/serviceList.go b/e2e/ratchet/serviceList.go new file mode 100644 index 000000000..3f4d2747c --- /dev/null +++ b/e2e/ratchet/serviceList.go @@ -0,0 +1,68 @@ +package ratchet + +import ( + "github.com/pkg/errors" + "gitlab.com/elixxir/client/e2e/ratchet/partner" + "gitlab.com/elixxir/client/network/message" + "gitlab.com/xx_network/primitives/id" +) + +// Services is a subsection of the network.Manager interface used for services +type Services interface { + AddService(AddService *id.ID, newService message.Service, + response message.Processor) + DeleteService(clientID *id.ID, toDelete message.Service, + processor message.Processor) +} + +func (s *Store) add(m *partner.Manager) { + s.servicesmux.RLock() + defer s.servicesmux.RUnlock() + for tag, process := range s.services { + s.sInteface.AddService(s.myID, m.MakeService(tag), process) + } +} + +func (s *Store) delete(m *partner.Manager) { + s.servicesmux.RLock() + defer s.servicesmux.RUnlock() + for tag, process := range s.services { + s.sInteface.DeleteService(s.myID, m.MakeService(tag), process) + } +} + +func (s *Store) AddService(tag string, processor message.Processor) error { + s.servicesmux.Lock() + defer s.servicesmux.Unlock() + //add the services to the list + if _, exists := s.services[tag]; exists { + return errors.Errorf("Cannot add more than one service '%s'", tag) + } + s.services[tag] = processor + + //add a service for every manager + for _, m := range s.managers { + s.sInteface.AddService(s.myID, m.MakeService(tag), processor) + } + + return nil +} + +func (s *Store) RemoveService(tag string) error { + s.servicesmux.Lock() + defer s.servicesmux.Unlock() + + oldServiceProcess, exists := s.services[tag] + if !exists { + return errors.Errorf("Cannot remove a service that doesnt "+ + "exist: '%s'", tag) + } + + delete(s.services, tag) + + for _, m := range s.managers { + s.sInteface.DeleteService(s.myID, m.MakeService(tag), oldServiceProcess) + } + + return nil +} diff --git a/e2e/ratchet/store.go b/e2e/ratchet/store.go index ca16426ed..193b05dc8 100644 --- a/e2e/ratchet/store.go +++ b/e2e/ratchet/store.go @@ -13,15 +13,13 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/e2e/ratchet/partner" - session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/network/message" util "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" - "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "sync" @@ -33,7 +31,6 @@ const ( storeKey = "Store" pubKeyKey = "DhPubKey" privKeyKey = "DhPrivKey" - grpKey = "Group" sidhPubKeyKey = "SidhPubKey" sidhPrivKeyKey = "SidhPrivKey" ) @@ -44,49 +41,43 @@ type Store struct { managers map[id.ID]*partner.Manager mux sync.RWMutex + myID *id.ID dhPrivateKey *cyclic.Int dhPublicKey *cyclic.Int - grp *cyclic.Group - kv *versioned.KV - - *fingerprints + grp *cyclic.Group + cyHandler session.CypherHandler + rng *fastRNG.StreamGenerator - *context + //services handler + services map[string]message.Processor + sInteface Services + servicesmux sync.RWMutex - e2eParams params.E2ESessionParams + kv *versioned.KV } -func NewStore(grp *cyclic.Group, kv *versioned.KV, privKey *cyclic.Int, - myID *id.ID, rng *fastRNG.StreamGenerator) (*Store, error) { +func NewStore(kv *versioned.KV, privKey *cyclic.Int, + myID *id.ID, grp *cyclic.Group, cyHandler session.CypherHandler, + rng *fastRNG.StreamGenerator) (*Store, error) { // Generate public key pubKey := diffieHellman.GeneratePublicKey(privKey, grp) // Modify the prefix of the KV kv = kv.Prefix(packagePrefix) - // Create new fingerprint map - fingerprints := newFingerprints() - s := &Store{ managers: make(map[id.ID]*partner.Manager), + myID: myID, dhPrivateKey: privKey, dhPublicKey: pubKey, - grp: grp, - - fingerprints: &fingerprints, kv: kv, - context: &context{ - fa: &fingerprints, - grp: grp, - rng: rng, - myID: myID, - }, - - e2eParams: params.GetDefaultE2ESessionParams(), + cyHandler: cyHandler, + grp: grp, + rng: rng, } err := util.StoreCyclicKey(kv, pubKey, pubKeyKey) @@ -101,39 +92,24 @@ func NewStore(grp *cyclic.Group, kv *versioned.KV, privKey *cyclic.Int, "Failed to store e2e DH private key") } - err = util.StoreGroup(kv, grp, grpKey) - if err != nil { - return nil, errors.WithMessage(err, "Failed to store e2e group") - } - return s, s.save() } -func LoadStore(kv *versioned.KV, myID *id.ID, rng *fastRNG.StreamGenerator) (*Store, error) { - fingerprints := newFingerprints() +func LoadStore(kv *versioned.KV, myID *id.ID, grp *cyclic.Group, + cyHandler session.CypherHandler, rng *fastRNG.StreamGenerator) ( + *Store, error) { kv = kv.Prefix(packagePrefix) - grp, err := util.LoadGroup(kv, grpKey) - if err != nil { - return nil, err - } - s := &Store{ managers: make(map[id.ID]*partner.Manager), - fingerprints: &fingerprints, - - kv: kv, - grp: grp, + myID: myID, - context: &context{ - fa: &fingerprints, - rng: rng, - myID: myID, - grp: grp, - }, + kv: kv, - e2eParams: params.GetDefaultE2ESessionParams(), + cyHandler: cyHandler, + grp: grp, + rng: rng, } obj, err := kv.Get(storeKey, currentStoreVersion) @@ -146,8 +122,6 @@ func LoadStore(kv *versioned.KV, myID *id.ID, rng *fastRNG.StreamGenerator) (*St return nil, err } - s.context.grp = s.grp - return s, nil } @@ -170,8 +144,8 @@ func (s *Store) save() error { func (s *Store) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, - mySIDHPrivKey *sidh.PrivateKey, - sendParams, receiveParams params.E2ESessionParams) error { + mySIDHPrivKey *sidh.PrivateKey, sendParams, + receiveParams session.Params) error { s.mux.Lock() defer s.mux.Unlock() @@ -185,9 +159,9 @@ func (s *Store) AddPartner(partnerID *id.ID, partnerPubKey, return errors.New("Cannot overwrite existing partner") } - m := partner.newManager(s.context, s.kv, partnerID, myPrivKey, partnerPubKey, + m := partner.NewManager(s.kv, s.myID, partnerID, myPrivKey, partnerPubKey, mySIDHPrivKey, partnerSIDHPubKey, - sendParams, receiveParams) + sendParams, receiveParams, s.cyHandler, s.grp, s.rng) s.managers[*partnerID] = m if err := s.save(); err != nil { @@ -205,7 +179,7 @@ func (s *Store) DeletePartner(partnerId *id.ID) error { return errors.New(NoPartnerErrorStr) } - if err := partner.clearManager(m, s.kv); err != nil { + if err := partner.ClearManager(m, s.kv); err != nil { return errors.WithMessagef(err, "Could not remove partner %s from store", partnerId) } @@ -226,31 +200,9 @@ func (s *Store) GetPartner(partnerID *id.ID) (*partner.Manager, error) { return m, nil } -// GetPartnerContact find the partner with the given ID and assembles and -// returns a contact.Contact with their ID and DH key. An error is returned if -// no partner exists for the given ID. -func (s *Store) GetPartnerContact(partnerID *id.ID) (contact.Contact, error) { - s.mux.RLock() - defer s.mux.RUnlock() - - // get partner - m, exists := s.managers[*partnerID] - if !exists { - return contact.Contact{}, errors.New(NoPartnerErrorStr) - } - - // Assemble Contact - c := contact.Contact{ - ID: m.GetPartnerID(), - DhPubKey: m.GetPartnerOriginPublicKey(), - } - - return c, nil -} - -// GetPartners returns a list of all partner IDs that the user has +// GetAllPartnerIDs returns a list of all partner IDs that the user has // an E2E relationship with. -func (s *Store) GetPartners() []*id.ID { +func (s *Store) GetAllPartnerIDs() []*id.ID { s.mux.RLock() defer s.mux.RUnlock() @@ -263,16 +215,6 @@ func (s *Store) GetPartners() []*id.ID { return partnerIds } -// PopKey pops a key for use based upon its fingerprint. -func (s *Store) PopKey(f format.Fingerprint) (*session2.Cypher, bool) { - return s.fingerprints.Pop(f) -} - -// CheckKey checks that a key exists for the key fingerprint. -func (s *Store) CheckKey(f format.Fingerprint) bool { - return s.fingerprints.Check(f) -} - // GetDHPrivateKey returns the diffie hellman private key. func (s *Store) GetDHPrivateKey() *cyclic.Int { return s.dhPrivateKey @@ -283,13 +225,7 @@ func (s *Store) GetDHPublicKey() *cyclic.Int { return s.dhPublicKey } -// GetGroup returns the cyclic group used for cMix. -func (s *Store) GetGroup() *cyclic.Group { - return s.grp -} - // ekv functions - func (s *Store) marshal() ([]byte, error) { contacts := make([]id.ID, len(s.managers)) @@ -317,7 +253,8 @@ func (s *Store) unmarshal(b []byte) error { partnerID := (&contacts[i]).DeepCopy() // Load the relationship. The relationship handles adding the fingerprints via the // context object - manager, err := partner.loadManager(s.context, s.kv, partnerID) + manager, err := partner.LoadManager(s.kv, s.myID, partnerID, + s.cyHandler, s.grp, s.rng) if err != nil { jww.FATAL.Panicf("Failed to load relationship for partner %s: %s", partnerID, err.Error()) @@ -344,87 +281,5 @@ func (s *Store) unmarshal(b []byte) error { "Failed to load e2e DH public key") } - s.grp, err = util.LoadGroup(s.kv, grpKey) - if err != nil { - return errors.WithMessage(err, - "Failed to load e2e DH group") - } - return nil } - -// GetE2ESessionParams returns a copy of the session params object -func (s *Store) GetE2ESessionParams() params.E2ESessionParams { - s.mux.RLock() - defer s.mux.RUnlock() - jww.DEBUG.Printf("Using Session Params: %s", s.e2eParams) - return s.e2eParams -} - -// SetE2ESessionParams overwrites the current session params -func (s *Store) SetE2ESessionParams(newParams params.E2ESessionParams) { - s.mux.Lock() - defer s.mux.Unlock() - jww.DEBUG.Printf("Setting Session Params: %s", newParams) - s.e2eParams = newParams -} - -type fingerprints struct { - toKey map[format.Fingerprint]*session2.Cypher - mux sync.RWMutex -} - -// newFingerprints creates a new fingerprints with an empty map. -func newFingerprints() fingerprints { - return fingerprints{ - toKey: make(map[format.Fingerprint]*session2.Cypher), - } -} - -// fingerprints adheres to the fingerprintAccess interface. - -func (f *fingerprints) add(keys []*session2.Cypher) { - f.mux.Lock() - defer f.mux.Unlock() - - for _, k := range keys { - f.toKey[k.Fingerprint()] = k - jww.TRACE.Printf("Added Key Fingerprint: %s", - k.Fingerprint()) - } -} - -func (f *fingerprints) remove(keys []*session2.Cypher) { - f.mux.Lock() - defer f.mux.Unlock() - - for _, k := range keys { - delete(f.toKey, k.Fingerprint()) - } -} - -func (f *fingerprints) Check(fingerprint format.Fingerprint) bool { - f.mux.RLock() - defer f.mux.RUnlock() - - _, ok := f.toKey[fingerprint] - return ok -} - -func (f *fingerprints) Pop(fingerprint format.Fingerprint) (*session2.Cypher, bool) { - f.mux.Lock() - defer f.mux.Unlock() - key, ok := f.toKey[fingerprint] - - if !ok { - return nil, false - } - - delete(f.toKey, fingerprint) - - key.denoteUse() - - key.fp = &fingerprint - - return key, true -} diff --git a/network/message/serviceGenerators.go b/network/message/serviceGenerators.go index 8fb275595..374e37ba1 100644 --- a/network/message/serviceGenerators.go +++ b/network/message/serviceGenerators.go @@ -17,7 +17,7 @@ func GetDefaultService(recipient *id.ID) Service { return Service{ Identifier: recipient[:], Tag: sih.Default, - Source: recipient[:], + Metadata: recipient[:], } } @@ -32,6 +32,6 @@ func GetRandomService(rng csprng.Source) Service { return Service{ Identifier: identifier, Tag: "Random", - Source: identifier, + Metadata: identifier, } } diff --git a/network/message/serviceInterface.go b/network/message/serviceInterface.go index b0304acd5..ca1cbee4e 100644 --- a/network/message/serviceInterface.go +++ b/network/message/serviceInterface.go @@ -10,7 +10,7 @@ import ( type Service struct { Identifier []byte Tag string - Source []byte // Optional metadata field, only used on reception + Metadata []byte // Optional metadata field, only used on reception // Private field for lazy evaluation of preimage // A value of nil denotes not yet evaluated @@ -56,6 +56,6 @@ func (si Service) String() string { p := si.preimage() return fmt.Sprintf("Tag: %s, Identifier: %s, source: %s, "+ "preimage:%s", si.Tag, base64.StdEncoding.EncodeToString(si.Identifier), - base64.StdEncoding.EncodeToString(si.Source), + base64.StdEncoding.EncodeToString(si.Metadata), base64.StdEncoding.EncodeToString(p[:])) } diff --git a/network/message/services.go b/network/message/services.go index d05938905..3a9ca471d 100644 --- a/network/message/services.go +++ b/network/message/services.go @@ -125,7 +125,7 @@ func (sm *ServicesManager) AddService(clientID *id.ID, newService Service, newEntry = oldDefault oldDefault.defaultList = append(oldDefault.defaultList, response) } else { - newEntry.Source = clientID[:] + newEntry.Metadata = clientID[:] } } else if _, exists := sm.tmap[*clientID][newService.preimage()]; exists { jww.FATAL.Panicf("Cannot add service %s, an identical "+ -- GitLab