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