diff --git a/e2e/ratchet/partner/manager.go b/e2e/ratchet/partner/manager.go index 7b04009ee06c005af6b77184c8d326c8d88fc675..9bded0aa5856f4f9b7482c66e0096f1074f4ccca 100644 --- a/e2e/ratchet/partner/manager.go +++ b/e2e/ratchet/partner/manager.go @@ -47,6 +47,8 @@ type Manager struct { grp *cyclic.Group cyHandler session.CypherHandler rng *fastRNG.StreamGenerator + + managerID ManagerIdentity } // NewManager creates the relationship and its first Send and Receive sessions. @@ -56,7 +58,9 @@ func NewManager(kv *versioned.KV, myID, partnerID *id.ID, myPrivKey, receiveParams session.Params, cyHandler session.CypherHandler, grp *cyclic.Group, rng *fastRNG.StreamGenerator) *Manager { - kv = kv.Prefix(makeManagerPrefix(partnerID)) + mi := MakeManagerIdentity(partnerID, myID) + + kv = kv.Prefix(makeManagerPrefix(mi)) m := &Manager{ kv: kv, @@ -69,6 +73,7 @@ func NewManager(kv *versioned.KV, myID, partnerID *id.ID, myPrivKey, cyHandler: cyHandler, grp: grp, rng: rng, + managerID: mi, } if err := utility.StoreCyclicKey(kv, myPrivKey, originMyPrivKeyKey); err != nil { jww.FATAL.Panicf("Failed to store %s: %+v", originMyPrivKeyKey, @@ -95,26 +100,34 @@ func LoadManager(kv *versioned.KV, myID, partnerID *id.ID, cyHandler session.CypherHandler, grp *cyclic.Group, rng *fastRNG.StreamGenerator) (*Manager, error) { - kv = kv.Prefix(fmt.Sprintf(managerPrefix, partnerID)) + mi := MakeManagerIdentity(partnerID, myID) m := &Manager{ - kv: kv, + kv: kv.Prefix(makeManagerPrefix(mi)), myID: myID, partner: partnerID, cyHandler: cyHandler, grp: grp, rng: rng, + managerID: mi, } var err error - m.originMyPrivKey, err = utility.LoadCyclicKey(kv, originMyPrivKeyKey) + m.originMyPrivKey, err = utility.LoadCyclicKey(m.kv, originMyPrivKeyKey) if err != nil { - jww.FATAL.Panicf("Failed to load %s: %+v", originMyPrivKeyKey, - err) + // if the key cannot be found, this might be an old session, in which case + // we attempt to revert to the old file structure + m.kv = kv.Prefix(makeOldManagerPrefix(partnerID)) + m.originMyPrivKey, err = utility.LoadCyclicKey(m.kv, originMyPrivKeyKey) + if err != nil { + jww.FATAL.Panicf("Failed to load %s: %+v", originMyPrivKeyKey, + err) + } + } - m.originPartnerPubKey, err = utility.LoadCyclicKey(kv, originPartnerPubKey) + m.originPartnerPubKey, err = utility.LoadCyclicKey(m.kv, originPartnerPubKey) if err != nil { jww.FATAL.Panicf("Failed to load %s: %+v", originPartnerPubKey, err) @@ -296,6 +309,10 @@ func (m *Manager) GetRelationshipFingerprintBytes() []byte { return h.Sum(nil) } +func (m *Manager) GetIdentity() ManagerIdentity { + return m.managerID +} + // MakeService Returns a service interface with the // appropriate identifier for who is being sent to. Will populate // the metadata with the partner @@ -317,6 +334,10 @@ func (m *Manager) GetContact() contact.Contact { } } -func makeManagerPrefix(pid *id.ID) string { +func makeOldManagerPrefix(pid *id.ID) string { return fmt.Sprintf(managerPrefix, pid) } + +func makeManagerPrefix(identity ManagerIdentity) string { + return fmt.Sprintf(managerPrefix, identity) +} diff --git a/e2e/ratchet/partner/managerID.go b/e2e/ratchet/partner/managerID.go new file mode 100644 index 0000000000000000000000000000000000000000..177036b5e9abda973b5f4357bc16a8ab67369996 --- /dev/null +++ b/e2e/ratchet/partner/managerID.go @@ -0,0 +1,31 @@ +package partner + +import ( + "encoding/base64" + "gitlab.com/xx_network/primitives/id" +) + +type ManagerIdentity [2 * id.ArrIDLen]byte + +func MakeManagerIdentity(partner, me *id.ID) ManagerIdentity { + ph := ManagerIdentity{} + copy(ph[:id.ArrIDLen], me[:]) + copy(ph[id.ArrIDLen:], partner[:]) + return ph +} + +func (mi ManagerIdentity) GetMe() *id.ID { + me := &id.ID{} + copy(me[:], mi[:id.ArrIDLen]) + return me +} + +func (mi ManagerIdentity) GetPartner() *id.ID { + partner := &id.ID{} + copy(partner[:], mi[id.ArrIDLen:]) + return partner +} + +func (mi ManagerIdentity) String() string { + return base64.StdEncoding.EncodeToString(mi[:]) +} diff --git a/e2e/ratchet/ratchet.go b/e2e/ratchet/ratchet.go index a84b1e5d5f993db01f987560acb51c0d2c386de1..5bdf827264e7ab86fa55a399f3203d144b9bc0fe 100644 --- a/e2e/ratchet/ratchet.go +++ b/e2e/ratchet/ratchet.go @@ -32,7 +32,7 @@ const ( var NoPartnerErrorStr = "No relationship with partner found" type Ratchet struct { - managers map[relationshipIdentity]*partner.Manager + managers map[partner.ManagerIdentity]*partner.Manager mux sync.RWMutex defaultID *id.ID @@ -66,7 +66,7 @@ func New(kv *versioned.KV, myID *id.ID, privKey *cyclic.Int, kv = kv.Prefix(packagePrefix) r := &Ratchet{ - managers: make(map[relationshipIdentity]*partner.Manager), + managers: make(map[partner.ManagerIdentity]*partner.Manager), services: make(map[string]message.Processor), defaultID: myID, @@ -95,7 +95,7 @@ func New(kv *versioned.KV, myID *id.ID, privKey *cyclic.Int, // AddPartner adds a partner. Automatically creates both send and receive // sessions using the passed cryptographic data and per the parameters sent -func (r *Ratchet) AddPartner(myID *id.ID, myPrivateKey *cyclic.Int, partnerID *id.ID, +func (r *Ratchet) AddPartner(myID *id.ID, partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, sendParams, receiveParams session.Params, temporary bool) (*partner.Manager, error) { @@ -106,19 +106,15 @@ func (r *Ratchet) AddPartner(myID *id.ID, myPrivateKey *cyclic.Int, partnerID *i myID = r.defaultID } - if myPrivateKey == nil { - myPrivateKey = r.defaultDHPrivateKey - } - jww.INFO.Printf("Adding Partner %r:\n\tMy Private Key: %r"+ "\n\tPartner Public Key: %r to %s", partnerID, myPrivKey.TextVerbose(16, 0), partnerPubKey.TextVerbose(16, 0), myID) - rship := makeRelationshipIdentity(partnerID, myID) + mid := partner.MakeManagerIdentity(partnerID, myID) - if _, ok := r.managers[rship]; ok { + if _, ok := r.managers[mid]; ok { return nil, errors.New("Cannot overwrite existing partner") } @@ -132,7 +128,7 @@ func (r *Ratchet) AddPartner(myID *id.ID, myPrivateKey *cyclic.Int, partnerID *i mySIDHPrivKey, partnerSIDHPubKey, sendParams, receiveParams, r.cyHandler, r.grp, r.rng) - r.managers[rship] = m + r.managers[mid] = m if err := r.save(); err != nil { jww.FATAL.Printf("Failed to add Partner %r: Save of store failed: %r", partnerID, err) @@ -153,7 +149,7 @@ func (r *Ratchet) GetPartner(partnerID *id.ID, myID *id.ID) (*partner.Manager, e myID = r.defaultID } - m, ok := r.managers[makeRelationshipIdentity(partnerID, myID)] + m, ok := r.managers[partner.MakeManagerIdentity(partnerID, myID)] if !ok { return nil, errors.New(NoPartnerErrorStr) @@ -168,7 +164,7 @@ func (r *Ratchet) DeletePartner(partnerId *id.ID, myID *id.ID) error { myID = r.defaultID } - rShip := makeRelationshipIdentity(partnerId, myID) + rShip := partner.MakeManagerIdentity(partnerId, myID) m, ok := r.managers[rShip] if !ok { return errors.New(NoPartnerErrorStr) diff --git a/e2e/ratchet/relationshipID.go b/e2e/ratchet/relationshipID.go deleted file mode 100644 index 58cdfcbcedcf3acb5163ca592207b5e27c859f99..0000000000000000000000000000000000000000 --- a/e2e/ratchet/relationshipID.go +++ /dev/null @@ -1,26 +0,0 @@ -package ratchet - -import ( - "gitlab.com/xx_network/primitives/id" -) - -type relationshipIdentity [2 * id.ArrIDLen]byte - -func makeRelationshipIdentity(partner, me *id.ID) relationshipIdentity { - ph := relationshipIdentity{} - copy(ph[:id.ArrIDLen], me[:]) - copy(ph[id.ArrIDLen:], partner[:]) - return ph -} - -func (ri relationshipIdentity) GetMe() *id.ID { - me := &id.ID{} - copy(me[:], ri[:id.ArrIDLen]) - return me -} - -func (ri relationshipIdentity) GetPartner() *id.ID { - partner := &id.ID{} - copy(partner[:], ri[id.ArrIDLen:]) - return partner -} diff --git a/e2e/ratchet/storage.go b/e2e/ratchet/storage.go index f170df1786f4e01544e035a091f5f51c06fef73e..5ed2969fd9d3d67926950a5e684e3fb4a0b8e62f 100644 --- a/e2e/ratchet/storage.go +++ b/e2e/ratchet/storage.go @@ -28,7 +28,7 @@ func Load(kv *versioned.KV, myID *id.ID, grp *cyclic.Group, kv = kv.Prefix(packagePrefix) r := &Ratchet{ - managers: make(map[relationshipIdentity]*partner.Manager), + managers: make(map[partner.ManagerIdentity]*partner.Manager), services: make(map[string]message.Processor), defaultID: myID, @@ -94,7 +94,7 @@ func (r *Ratchet) save() error { // ekv functions func (r *Ratchet) marshal() ([]byte, error) { - contacts := make([]relationshipIdentity, len(r.managers)) + contacts := make([]partner.ManagerIdentity, len(r.managers)) index := 0 for rid, m := range r.managers { @@ -140,7 +140,7 @@ func (r *Ratchet) unmarshalOld(b []byte) error { r.add(manager) //assume - r.managers[makeRelationshipIdentity(partnerID, r.defaultID)] = manager + r.managers[partner.makeRelationshipIdentity(partnerID, r.defaultID)] = manager } r.defaultDHPrivateKey, err = util.LoadCyclicKey(r.kv, privKeyKey) @@ -160,7 +160,7 @@ func (r *Ratchet) unmarshalOld(b []byte) error { func (r *Ratchet) unmarshal(b []byte) error { - var contacts []relationshipIdentity + var contacts []partner.ManagerIdentity err := json.Unmarshal(b, &contacts) diff --git a/network/interface.go b/network/interface.go index 665ba791d9f4210aa8f458d42aa76b00ce05d902..56cce25d99e72576c45a5320bc48a138f6757835 100644 --- a/network/interface.go +++ b/network/interface.go @@ -226,6 +226,8 @@ type Manager interface { roundCallback RoundEventCallback) error // LookupHistoricalRound looks up the passed historical round on the network. + // GetRoundResults does this lookup when needed, generally that is + // preferable LookupHistoricalRound( rid id.Round, callback historical.RoundResultCallback) error diff --git a/storage/auth/authID.go b/storage/auth/authID.go new file mode 100644 index 0000000000000000000000000000000000000000..41a4e6c5cc34329c71622924f33114e2adee9560 --- /dev/null +++ b/storage/auth/authID.go @@ -0,0 +1,35 @@ +package auth + +import ( + "encoding/base64" + "gitlab.com/xx_network/primitives/id" +) + +type authIdentity [2 * id.ArrIDLen]byte + +func makeAuthIdentity(partner, me *id.ID) authIdentity { + ph := authIdentity{} + copy(ph[:id.ArrIDLen], me[:]) + copy(ph[id.ArrIDLen:], partner[:]) + return ph +} + +func (ai authIdentity) GetMe() *id.ID { + me := &id.ID{} + copy(me[:], ai[:id.ArrIDLen]) + return me +} + +func (ai authIdentity) GetPartner() *id.ID { + partner := &id.ID{} + copy(partner[:], ai[id.ArrIDLen:]) + return partner +} + +func (ai authIdentity) String() string { + return base64.StdEncoding.EncodeToString(ai[:]) +} + +func makeRequestPrefix(aid authIdentity) string { + return base64.StdEncoding.EncodeToString(aid[:]) +} diff --git a/storage/auth/confirmation_test.go b/storage/auth/confirmation_test.go index 94f4dad1b27d227e6742da07917f75b1dc79253e..2de100e510a38051aec12d28701a44badcf246ce 100644 --- a/storage/auth/confirmation_test.go +++ b/storage/auth/confirmation_test.go @@ -22,7 +22,7 @@ import ( "testing" ) -// Tests that a confirmation for different partners and fingerprints can be +// Tests that a confirmation for different partners and sentByFingerprints can be // saved and loaded from storage via Store.StoreConfirmation and // Store.LoadConfirmation. func TestStore_StoreConfirmation_LoadConfirmation(t *testing.T) { diff --git a/storage/auth/fingerprint.go b/storage/auth/fingerprint.go index 04d0571c852f0ca359e303d69f41e1085f57bd14..b4aa9941490d79ad7cf37319f16b82f77a43cca1 100644 --- a/storage/auth/fingerprint.go +++ b/storage/auth/fingerprint.go @@ -23,5 +23,5 @@ type fingerprint struct { PrivKey *cyclic.Int // Only populated if it is specific - Request *request + Request *ReceivedRequest } diff --git a/storage/auth/previousNegotiations.go b/storage/auth/previousNegotiations.go index 6b880859800d1f2cc8e4d2ac8b2a1500b14d44ad..f00a5cdf9df348c4cb088fd4ac0223555e23e507 100644 --- a/storage/auth/previousNegotiations.go +++ b/storage/auth/previousNegotiations.go @@ -54,7 +54,7 @@ func (s *Store) AddIfNew(partner *id.ID, negotiationFingerprint []byte) ( // Save fingerprint to storage err := s.saveNegotiationFingerprints(partner, negotiationFingerprint) if err != nil { - jww.FATAL.Panicf("Failed to save negotiation fingerprints for "+ + jww.FATAL.Panicf("Failed to save negotiation sentByFingerprints for "+ "partner %s: %+v", partner, err) } @@ -74,7 +74,7 @@ func (s *Store) AddIfNew(partner *id.ID, negotiationFingerprint []byte) ( // get the fingerprint list from storage fingerprints, err := s.loadNegotiationFingerprints(partner) if err != nil { - jww.FATAL.Panicf("Failed to load negotiation fingerprints for "+ + jww.FATAL.Panicf("Failed to load negotiation sentByFingerprints for "+ "partner %s: %+v", partner, err) } @@ -96,7 +96,7 @@ func (s *Store) AddIfNew(partner *id.ID, negotiationFingerprint []byte) ( fingerprints = append(fingerprints, negotiationFingerprint) err = s.saveNegotiationFingerprints(partner, fingerprints...) if err != nil { - jww.FATAL.Panicf("Failed to save negotiation fingerprints for "+ + jww.FATAL.Panicf("Failed to save negotiation sentByFingerprints for "+ "partner %s: %+v", partner, err) } @@ -106,7 +106,7 @@ func (s *Store) AddIfNew(partner *id.ID, negotiationFingerprint []byte) ( return } -// deletePreviousNegotiationPartner removes the partner, its fingerprints, and +// deletePreviousNegotiationPartner removes the partner, its sentByFingerprints, and // its confirmations from memory and storage. func (s *Store) deletePreviousNegotiationPartner(partner *id.ID) error { @@ -124,10 +124,10 @@ func (s *Store) deletePreviousNegotiationPartner(partner *id.ID) error { return err } - // Check if fingerprints exist + // Check if sentByFingerprints exist fingerprints, err := s.loadNegotiationFingerprints(partner) - // If fingerprints exist for this partner, delete them from storage and any + // If sentByFingerprints exist for this partner, delete them from storage and any // accompanying confirmations if err == nil { // Delete the fingerprint list from storage but do not return the error @@ -142,7 +142,7 @@ func (s *Store) deletePreviousNegotiationPartner(partner *id.ID) error { } } - // Return any error from loading or deleting fingerprints + // Return any error from loading or deleting sentByFingerprints return err } @@ -212,7 +212,7 @@ func unmarshalPreviousNegotiations(buf []byte) map[id.ID]struct{} { return partners } -// saveNegotiationFingerprints saves the list of fingerprints for the given +// saveNegotiationFingerprints saves the list of sentByFingerprints for the given // partner to storage. func (s *Store) saveNegotiationFingerprints( partner *id.ID, fingerprints ...[]byte) error { @@ -227,7 +227,7 @@ func (s *Store) saveNegotiationFingerprints( currentNegotiationFingerprintsVersion, obj) } -// loadNegotiationFingerprints loads the list of fingerprints for the given +// loadNegotiationFingerprints loads the list of sentByFingerprints for the given // partner from storage. func (s *Store) loadNegotiationFingerprints(partner *id.ID) ([][]byte, error) { obj, err := s.kv.Get(makeNegotiationFingerprintsKey(partner), @@ -239,13 +239,13 @@ func (s *Store) loadNegotiationFingerprints(partner *id.ID) ([][]byte, error) { return unmarshalNegotiationFingerprints(obj.Data), nil } -// marshalNegotiationFingerprints marshals the list of fingerprints into a byte +// marshalNegotiationFingerprints marshals the list of sentByFingerprints into a byte // slice for storage. func marshalNegotiationFingerprints(fingerprints ...[]byte) []byte { buff := bytes.NewBuffer(nil) buff.Grow(8 + (len(fingerprints) * auth.NegotiationFingerprintLen)) - // Write number of fingerprints to buffer + // Write number of sentByFingerprints to buffer b := make([]byte, 8) binary.LittleEndian.PutUint64(b, uint64(len(fingerprints))) buff.Write(b) @@ -259,7 +259,7 @@ func marshalNegotiationFingerprints(fingerprints ...[]byte) []byte { } // unmarshalNegotiationFingerprints unmarshalls the marshalled byte slice into a -// list of fingerprints. +// list of sentByFingerprints. func unmarshalNegotiationFingerprints(buf []byte) [][]byte { buff := bytes.NewBuffer(buf) @@ -275,7 +275,7 @@ func unmarshalNegotiationFingerprints(buf []byte) [][]byte { } // makeNegotiationFingerprintsKey generates the key used to load and store -// negotiation fingerprints for the partner. +// negotiation sentByFingerprints for the partner. func makeNegotiationFingerprintsKey(partner *id.ID) string { return negotiationFingerprintsKeyPrefix + partner.String() } diff --git a/storage/auth/previousNegotiations_test.go b/storage/auth/previousNegotiations_test.go index 8d096fc21d054110d0fd048151a8873d90291b4d..7f840e633342848e88cd34a6db11b35989e540fb 100644 --- a/storage/auth/previousNegotiations_test.go +++ b/storage/auth/previousNegotiations_test.go @@ -56,7 +56,7 @@ func TestStore_AddIfNew(t *testing.T) { addPartner bool // If true, partner is added to list first addFp bool // If true, fingerprint is added to list first latestFp bool // If true, fingerprint is added as latest - otherFps [][]byte // Other fingerprints to add first + otherFps [][]byte // Other sentByFingerprints to add first // Inputs partner *id.ID @@ -157,7 +157,7 @@ func TestStore_AddIfNew(t *testing.T) { } // Tests that Store.deletePreviousNegotiationPartner deletes the partner from -// previousNegotiations in memory, previousNegotiations in storage, fingerprints +// previousNegotiations in memory, previousNegotiations in storage, sentByFingerprints // in storage, and any confirmations in storage. func TestStore_deletePreviousNegotiationPartner(t *testing.T) { s := &Store{ @@ -184,7 +184,7 @@ func TestStore_deletePreviousNegotiationPartner(t *testing.T) { i, err) } - // Generate fingerprints + // Generate sentByFingerprints fingerprints := make([][]byte, i+1) for j := range fingerprints { dhPubKey := diffieHellman.GeneratePublicKey(grp.NewInt(42), grp) @@ -240,10 +240,10 @@ func TestStore_deletePreviousNegotiationPartner(t *testing.T) { v.partner, i) } - // Check negotiation fingerprints in storage + // Check negotiation sentByFingerprints in storage fps, err := s.loadNegotiationFingerprints(v.partner) if err == nil || fps != nil { - t.Errorf("Loaded fingerprints for partner %s (%d): %v", + t.Errorf("Loaded sentByFingerprints for partner %s (%d): %v", v.partner, i, fps) } @@ -338,7 +338,7 @@ func Test_marshalPreviousNegotiations_unmarshalPreviousNegotiations(t *testing.T } } -// Tests that a list of fingerprints for different partners can be saved and +// Tests that a list of sentByFingerprints for different partners can be saved and // loaded from storage via Store.saveNegotiationFingerprints and // Store.loadNegotiationFingerprints. func TestStore_saveNegotiationFingerprints_loadNegotiationFingerprints(t *testing.T) { @@ -354,7 +354,7 @@ func TestStore_saveNegotiationFingerprints_loadNegotiationFingerprints(t *testin for i := range testValues { partner, _ := id.NewRandomID(rng, id.User) - // Generate original fingerprints to marshal + // Generate original sentByFingerprints to marshal originalFps := make([][]byte, 50) for j := range originalFps { dhPubKey := diffieHellman.GeneratePublicKey(grp.NewInt(42), grp) @@ -382,20 +382,20 @@ func TestStore_saveNegotiationFingerprints_loadNegotiationFingerprints(t *testin } if !reflect.DeepEqual(val.fps, loadedFps) { - t.Errorf("Loaded fingerprints do not match original (%d)."+ + t.Errorf("Loaded sentByFingerprints do not match original (%d)."+ "\nexpected: %v\nreceived: %v", i, val.fps, loadedFps) } } } -// Tests that a list of fingerprints that is marshalled and unmarshalled via +// Tests that a list of sentByFingerprints that is marshalled and unmarshalled via // marshalNegotiationFingerprints and unmarshalNegotiationFingerprints matches // the original list func Test_marshalNegotiationFingerprints_unmarshalNegotiationFingerprints(t *testing.T) { rng := csprng.NewSystemRNG() grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) - // Generate original fingerprints to marshal + // Generate original sentByFingerprints to marshal originalFps := make([][]byte, 50) for i := range originalFps { dhPubKey := diffieHellman.GeneratePublicKey(grp.NewInt(42), grp) @@ -409,7 +409,7 @@ func Test_marshalNegotiationFingerprints_unmarshalNegotiationFingerprints(t *tes // Check that the original matches the unmarshalled if !reflect.DeepEqual(originalFps, unmarshalledFps) { - t.Errorf("Unmarshalled fingerprints do not match original."+ + t.Errorf("Unmarshalled sentByFingerprints do not match original."+ "\nexpected: %v\nreceived: %v", originalFps, unmarshalledFps) } } @@ -441,7 +441,7 @@ func Test_makeNegotiationFingerprintsKey_Consistency(t *testing.T) { key := makeNegotiationFingerprintsKey(partner) if expected != key { - t.Errorf("Negotiation fingerprints key does not match expected "+ + t.Errorf("Negotiation sentByFingerprints key does not match expected "+ "for partner %s (%d).\nexpected: %q\nreceived: %q", partner, i, expected, key) } diff --git a/storage/auth/receivedRequest.go b/storage/auth/receivedRequest.go new file mode 100644 index 0000000000000000000000000000000000000000..4f56526005cd71c9a4d7060776aeaf873aaeb245 --- /dev/null +++ b/storage/auth/receivedRequest.go @@ -0,0 +1,76 @@ +package auth + +import ( + "github.com/cloudflare/circl/dh/sidh" + "github.com/pkg/errors" + util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/contact" + "gitlab.com/xx_network/primitives/id" +) + +type ReceivedRequest struct { + kv *versioned.KV + + aid authIdentity + + // ID received on + myID *id.ID + + // contact of partner + partner contact.Contact + + //sidHPublic key of partner + theirSidHPubKeyA *sidh.PublicKey +} + +func loadReceivedRequest(kv *versioned.KV, partner *id.ID, myID *id.ID) ( + *ReceivedRequest, error) { + + // try the load with both the new prefix and the old, which one is + // successful will determine which file structure the sent request will use + // a change was made when auth was upgraded to handle auths for multiple + // outgoing IDs and it became possible to have multiple auths for the same + // partner at a time, so it now needed to be keyed on the touple of + // partnerID,MyID. Old receivedByID always have the same myID so they can be left + // at their own paths + aid := makeAuthIdentity(partner, myID) + newKV := kv + oldKV := kv.Prefix(makeRequestPrefix(aid)) + + c, err := util.LoadContact(newKV, partner) + + //loading with the new prefix path failed, try with the new + if err != nil { + c, err = util.LoadContact(newKV, partner) + if err != nil { + return nil, errors.WithMessagef(err, "Failed to Load "+ + "Received Auth Request Contact with %s and to %s", + partner, myID) + } else { + kv = oldKV + } + } else { + kv = newKV + } + + key, err := util.LoadSIDHPublicKey(kv, + util.MakeSIDHPublicKeyKey(c.ID)) + if err != nil { + return nil, errors.WithMessagef(err, "Failed to Load "+ + "Received Auth Request Partner SIDHkey with %s and to %s", + partner, myID) + } + + return &ReceivedRequest{ + aid: aid, + kv: kv, + myID: myID, + partner: c, + theirSidHPubKeyA: key, + }, nil +} + +func (rr *ReceivedRequest) getType() RequestType { + return Receive +} diff --git a/storage/auth/request.go b/storage/auth/request.go index 0520da29ffe627c93f6eafd10b446286c2511aab..e3da8be3c0332cb9ee28d2251f587e9589433cc5 100644 --- a/storage/auth/request.go +++ b/storage/auth/request.go @@ -7,12 +7,6 @@ package auth -import ( - "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/crypto/contact" - "sync" -) - type RequestType uint const ( @@ -20,23 +14,8 @@ const ( Receive RequestType = 2 ) -type request struct { - rt RequestType - - // Data if sent - sent *SentRequest - - // Data if receive - receive *contact.Contact - - //sidHPublic key of partner - theirSidHPubKeyA *sidh.PublicKey - - // mux to ensure there is not concurrent access - mux sync.Mutex -} - type requestDisk struct { - T uint - ID []byte + T uint + ID []byte + MyID []byte } diff --git a/storage/auth/sentRequest.go b/storage/auth/sentRequest.go index 1ab1cb8e80c4bc4f3246b989279aeddd36c2d8d7..70b13b1522bbc735fab27dd5e04fc39bf2eafb4c 100644 --- a/storage/auth/sentRequest.go +++ b/storage/auth/sentRequest.go @@ -26,6 +26,9 @@ const currentSentRequestVersion = 0 type SentRequest struct { kv *versioned.KV + aid authIdentity + + myID *id.ID partner *id.ID partnerHistoricalPubKey *cyclic.Int myPrivKey *cyclic.Int @@ -44,12 +47,34 @@ type sentRequestDisk struct { Fingerprint []byte } -func loadSentRequest(kv *versioned.KV, partner *id.ID, grp *cyclic.Group) (*SentRequest, error) { - obj, err := kv.Get(versioned.MakePartnerPrefix(partner), +func loadSentRequest(kv *versioned.KV, partner *id.ID, myID *id.ID, grp *cyclic.Group) (*SentRequest, error) { + + // try the load with both the new prefix and the old, which one is + // successful will determine which file structure the sent request will use + // a change was made when auth was upgraded to handle auths for multiple + // outgoing IDs and it became possible to have multiple auths for the same + // partner at a time, so it now needed to be keyed on the touple of + // partnerID,MyID. Old receivedByID always have the same myID so they can be left + // at their own paths + aid := makeAuthIdentity(partner, myID) + oldKV := kv + newKV := kv.Prefix(makeRequestPrefix(aid)) + + obj, err := newKV.Get(versioned.MakePartnerPrefix(partner), currentSentRequestVersion) + + //loading with the new prefix path failed, try with the new if err != nil { - return nil, errors.WithMessagef(err, "Failed to Load "+ - "SentRequest Auth with %s", partner) + obj, err = oldKV.Get(versioned.MakePartnerPrefix(partner), + currentSentRequestVersion) + if err != nil { + return nil, errors.WithMessagef(err, "Failed to Load "+ + "SentRequest Auth with %s", partner) + } else { + kv = oldKV + } + } else { + kv = newKV } srd := &sentRequestDisk{} @@ -109,6 +134,8 @@ func loadSentRequest(kv *versioned.KV, partner *id.ID, grp *cyclic.Group) (*Sent return &SentRequest{ kv: kv, + aid: aid, + myID: myID, partner: partner, partnerHistoricalPubKey: historicalPubKey, myPrivKey: myPrivKey, @@ -205,7 +232,7 @@ func (sr *SentRequest) GetMySIDHPubKey() *sidh.PublicKey { } // OverwriteSIDHKeys is used to temporarily overwrite sidh keys -// to handle e.g., confirmation requests. +// to handle e.g., confirmation receivedByID. // FIXME: this is a code smell but was the cleanest solution at // the time. Business logic should probably handle this better? func (sr *SentRequest) OverwriteSIDHKeys(priv *sidh.PrivateKey, @@ -217,3 +244,11 @@ func (sr *SentRequest) OverwriteSIDHKeys(priv *sidh.PrivateKey, func (sr *SentRequest) GetFingerprint() format.Fingerprint { return sr.fingerprint } + +func (sr *SentRequest) getAuthID() authIdentity { + return sr.aid +} + +func (sr *SentRequest) getType() RequestType { + return Sent +} diff --git a/storage/auth/store.go b/storage/auth/store.go index 9a4580333a1b191a87958a73d391e6a5d98f93ce..40e1c9dd5dd7e7cddb20a1cc4a48237f8025c0ef 100644 --- a/storage/auth/store.go +++ b/storage/auth/store.go @@ -16,7 +16,6 @@ import ( "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" @@ -31,127 +30,109 @@ const requestMapKey = "map" const requestMapVersion = 0 type Store struct { - kv *versioned.KV - grp *cyclic.Group - requests map[id.ID]*request - fingerprints map[format.Fingerprint]fingerprint + kv *versioned.KV + grp *cyclic.Group + receivedByID map[authIdentity]*ReceivedRequest + sentByID map[authIdentity]*SentRequest + previousNegotiations map[id.ID]struct{} - mux sync.RWMutex + + defaultID *id.ID + + mux sync.RWMutex } // NewStore creates a new store. All passed in private keys are added as -// fingerprints so they can be used to trigger requests. -func NewStore(kv *versioned.KV, grp *cyclic.Group, privKeys []*cyclic.Int) (*Store, error) { +// sentByFingerprints so they can be used to trigger receivedByID. +func NewStore(kv *versioned.KV, grp *cyclic.Group) error { kv = kv.Prefix(storePrefix) s := &Store{ kv: kv, grp: grp, - requests: make(map[id.ID]*request), - fingerprints: make(map[format.Fingerprint]fingerprint), + receivedByID: make(map[authIdentity]*ReceivedRequest), + sentByID: make(map[authIdentity]*SentRequest), previousNegotiations: make(map[id.ID]struct{}), } - for _, key := range privKeys { - pubkey := grp.ExpG(key, grp.NewInt(1)) - fp := auth.MakeRequestFingerprint(pubkey) - s.fingerprints[fp] = fingerprint{ - Type: General, - PrivKey: key, - Request: nil, - } - } - err := s.savePreviousNegotiations() if err != nil { - return nil, errors.Errorf( + return errors.Errorf( "failed to load previousNegotiations partners: %+v", err) } - return s, s.save() + return s.save() } // LoadStore loads an extant new store. All passed in private keys are added as -// fingerprints so they can be used to trigger requests. -func LoadStore(kv *versioned.KV, grp *cyclic.Group, privKeys []*cyclic.Int) (*Store, error) { +// sentByFingerprints so they can be used to trigger receivedByID. +func LoadStore(kv *versioned.KV, defaultID *id.ID, grp *cyclic.Group) (*Store, error) { kv = kv.Prefix(storePrefix) - sentObj, err := kv.Get(requestMapKey, requestMapVersion) - if err != nil { - return nil, errors.WithMessagef(err, "Failed to load requestMap") - } s := &Store{ kv: kv, grp: grp, - requests: make(map[id.ID]*request), - fingerprints: make(map[format.Fingerprint]fingerprint), + receivedByID: make(map[authIdentity]*ReceivedRequest), + sentByID: make(map[authIdentity]*SentRequest), previousNegotiations: make(map[id.ID]struct{}), + defaultID: defaultID, } - for _, key := range privKeys { - pubkey := grp.ExpG(key, grp.NewInt(1)) - fp := auth.MakeRequestFingerprint(pubkey) - s.fingerprints[fp] = fingerprint{ - Type: General, - PrivKey: key, - Request: nil, - } + var requestList []requestDisk + + //load all receivedByID + sentObj, err := kv.Get(requestMapKey, requestMapVersion) + if err != nil { + return nil, errors.WithMessagef(err, "Failed to load requestMap") } - var requestList []requestDisk if err := json.Unmarshal(sentObj.Data, &requestList); err != nil { return nil, errors.WithMessagef(err, "Failed to "+ "unmarshal SentRequestMap") } + jww.TRACE.Printf("%d found when loading AuthStore", len(requestList)) + + //process receivedByID for _, rDisk := range requestList { - r := &request{ - rt: RequestType(rDisk.T), - } - var rid *id.ID + requestType := RequestType(rDisk.T) partner, err := id.Unmarshal(rDisk.ID) if err != nil { jww.FATAL.Panicf("Failed to load stored id: %+v", err) } - switch r.rt { - case Sent: - sr, err := loadSentRequest(kv, partner, grp) + var myID *id.ID + // load the self id used. If it is blank, that means this is an older + // version request, and replace it with the default ID + if len(rDisk.MyID) == 0 { + myID = defaultID + } else { + myID, err = id.Unmarshal(rDisk.ID) if err != nil { - jww.FATAL.Panicf("Failed to load stored sentRequest: %+v", err) + jww.FATAL.Panicf("Failed to load stored self id: %+v", err) } - r.sent = sr - s.fingerprints[sr.fingerprint] = fingerprint{ - Type: Specific, - PrivKey: nil, - Request: r, - } - rid = sr.partner - r.sent = sr + } - case Receive: - c, err := util.LoadContact(kv, partner) + switch requestType { + case Sent: + sr, err := loadSentRequest(kv, partner, myID, grp) if err != nil { - jww.FATAL.Panicf("Failed to load stored contact for: %+v", err) + jww.FATAL.Panicf("Failed to load stored sentRequest: %+v", err) } - key, err := util.LoadSIDHPublicKey(kv, - util.MakeSIDHPublicKeyKey(c.ID)) + s.sentByID[sr.getAuthID()] = sr + case Receive: + rr, err := loadReceivedRequest(kv, partner, myID) if err != nil { - jww.FATAL.Panicf("Failed to load stored contact for: %+v", err) + jww.FATAL.Panicf("Failed to load stored receivedRequest: %+v", err) } - rid = c.ID - r.receive = &c - r.theirSidHPubKeyA = key + s.receivedByID[rr.aid] = rr default: - jww.FATAL.Panicf("Unknown request type: %d", r.rt) + jww.FATAL.Panicf("Unknown request type: %d", requestType) } - - // store in the request map - s.requests[*rid] = r } // Load previous negotiations from storage @@ -165,15 +146,23 @@ func LoadStore(kv *versioned.KV, grp *cyclic.Group, privKeys []*cyclic.Int) (*St } func (s *Store) save() error { - requestIDList := make([]requestDisk, len(s.requests)) - index := 0 - for pid, r := range s.requests { + requestIDList := make([]requestDisk, 0, len(s.receivedByID)+len(s.sentByID)) + for _, r := range s.receivedByID { + rDisk := requestDisk{ + T: uint(r.getType()), + ID: r.partner.ID.Marshal(), + MyID: r.myID.Marshal(), + } + requestIDList = append(requestIDList, rDisk) + } + + for _, r := range s.sentByID { rDisk := requestDisk{ - T: uint(r.rt), - ID: pid.Marshal(), + T: uint(r.getType()), + ID: r.partner.Marshal(), + MyID: r.myID.Marshal(), } - requestIDList[index] = rDisk - index++ + requestIDList = append(requestIDList, rDisk) } data, err := json.Marshal(&requestIDList) @@ -189,13 +178,15 @@ func (s *Store) save() error { return s.kv.Set(requestMapKey, requestMapVersion, &obj) } -func (s *Store) AddSent(partner *id.ID, partnerHistoricalPubKey, myPrivKey, +func (s *Store) AddSent(partner, myID *id.ID, partnerHistoricalPubKey, myPrivKey, myPubKey *cyclic.Int, sidHPrivA *sidh.PrivateKey, sidHPubA *sidh.PublicKey, fp format.Fingerprint) error { s.mux.Lock() defer s.mux.Unlock() - if _, ok := s.requests[*partner]; ok { + aid := makeAuthIdentity(partner, myID) + + if _, ok := s.sentByID[aid]; ok { return errors.Errorf("Cannot make new sentRequest for partner "+ "%s, one already exists", partner) } @@ -215,29 +206,6 @@ func (s *Store) AddSent(partner *id.ID, partnerHistoricalPubKey, myPrivKey, jww.FATAL.Panicf("Failed to save Sent Request for partner %s", partner) } - r := &request{ - rt: Sent, - sent: sr, - receive: nil, - mux: sync.Mutex{}, - } - - s.requests[*partner] = r - if err := s.save(); err != nil { - jww.FATAL.Panicf("Failed to save Sent Request Map after adding "+ - "partern %s", partner) - } - - jww.INFO.Printf("AddSent PUBKEY FINGERPRINT: %v", sr.fingerprint) - jww.INFO.Printf("AddSent PUBKEY: %v", sr.myPubKey.Bytes()) - jww.INFO.Printf("AddSent Partner: %s", partner) - - s.fingerprints[sr.fingerprint] = fingerprint{ - Type: Specific, - PrivKey: nil, - Request: r, - } - return nil } @@ -245,7 +213,7 @@ func (s *Store) AddReceived(c contact.Contact, key *sidh.PublicKey) error { s.mux.Lock() defer s.mux.Unlock() jww.DEBUG.Printf("AddReceived new contact: %s", c.ID) - if _, ok := s.requests[*c.ID]; ok { + if _, ok := s.receivedByID[*c.ID]; ok { return errors.Errorf("Cannot add contact for partner "+ "%s, one already exists", c.ID) } @@ -260,15 +228,15 @@ func (s *Store) AddReceived(c contact.Contact, key *sidh.PublicKey) error { c.ID.String()) } - r := &request{ + r := &ReceivedRequest{ rt: Receive, sent: nil, - receive: &c, + partner: &c, theirSidHPubKeyA: key, mux: sync.Mutex{}, } - s.requests[*c.ID] = r + s.receivedByID[*c.ID] = r if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to save Sent Request Map after adding "+ "partner %s", c.ID) @@ -277,15 +245,15 @@ func (s *Store) AddReceived(c contact.Contact, key *sidh.PublicKey) error { return nil } -// GetAllReceived returns all pending received contact requests from storage. +// GetAllReceived returns all pending received contact receivedByID from storage. func (s *Store) GetAllReceived() []contact.Contact { s.mux.RLock() defer s.mux.RUnlock() - cList := make([]contact.Contact, 0, len(s.requests)) - for key := range s.requests { - r := s.requests[key] + cList := make([]contact.Contact, 0, len(s.receivedByID)) + for key := range s.receivedByID { + r := s.receivedByID[key] if r.rt == Receive { - cList = append(cList, *r.receive) + cList = append(cList, *r.partner) } } return cList @@ -299,7 +267,7 @@ func (s *Store) GetFingerprint(fp format.Fingerprint) (FingerprintType, *SentRequest, *cyclic.Int, error) { s.mux.RLock() - r, ok := s.fingerprints[fp] + r, ok := s.sentByFingerprints[fp] s.mux.RUnlock() if !ok { return 0, nil, nil, errors.Errorf("Fingerprint cannot be found: %v", fp) @@ -316,9 +284,10 @@ func (s *Store) GetFingerprint(fp format.Fingerprint) (FingerprintType, // Check that the request still exists; it could have been deleted // while the lock was taken s.mux.RLock() - _, ok := s.requests[*r.Request.sent.partner] + _, ok := s.receivedByID[*r.Request.sent.partner] s.mux.RUnlock() if !ok { + r.Request.mux.Unlock() return 0, nil, nil, errors.Errorf("request associated with "+ "fingerprint cannot be found: %s", fp) } @@ -332,13 +301,13 @@ func (s *Store) GetFingerprint(fp format.Fingerprint) (FingerprintType, } } -// GetReceivedRequest returns the contact representing the receive request, if +// GetReceivedRequest returns the contact representing the partner request, if // it exists. If it returns, then it takes the lock to ensure that there is only // one operator at a time. The user of the API must release the lock by calling // store.delete() or store.Failed() with the partner ID. func (s *Store) GetReceivedRequest(partner *id.ID) (contact.Contact, *sidh.PublicKey, error) { s.mux.RLock() - r, ok := s.requests[*partner] + r, ok := s.receivedByID[*partner] s.mux.RUnlock() if !ok { @@ -352,7 +321,7 @@ func (s *Store) GetReceivedRequest(partner *id.ID) (contact.Contact, *sidh.Publi // Check that the request still exists; it could have been deleted while the // lock was taken s.mux.RLock() - _, ok = s.requests[*partner] + _, ok = s.receivedByID[*partner] s.mux.RUnlock() if !ok { @@ -361,29 +330,29 @@ func (s *Store) GetReceivedRequest(partner *id.ID) (contact.Contact, *sidh.Publi "found: %s", partner) } - return *r.receive, r.theirSidHPubKeyA, nil + return *r.partner, r.theirSidHPubKeyA, nil } -// GetReceivedRequestData returns the contact representing the receive request +// GetReceivedRequestData returns the contact representing the partner request // if it exists. It does not take the lock. It is only meant to return the // contact to an external API user. func (s *Store) GetReceivedRequestData(partner *id.ID) (contact.Contact, error) { s.mux.RLock() - r, ok := s.requests[*partner] + r, ok := s.receivedByID[*partner] s.mux.RUnlock() - if !ok || r.receive == nil { + if !ok || r.partner == nil { return contact.Contact{}, errors.Errorf("Received request not "+ "found: %s", partner) } - return *r.receive, nil + return *r.partner, nil } // GetRequest returns request with its type and data. The lock is not taken. func (s *Store) GetRequest(partner *id.ID) (RequestType, *SentRequest, contact.Contact, error) { s.mux.RLock() - r, ok := s.requests[*partner] + r, ok := s.receivedByID[*partner] s.mux.RUnlock() if !ok { @@ -394,7 +363,7 @@ func (s *Store) GetRequest(partner *id.ID) (RequestType, *SentRequest, contact.C case Sent: return Sent, r.sent, contact.Contact{}, nil case Receive: - return Receive, nil, *r.receive, nil + return Receive, nil, *r.partner, nil default: return 0, nil, contact.Contact{}, errors.Errorf("invalid Tag: %d", r.rt) @@ -407,7 +376,7 @@ func (s *Store) GetRequest(partner *id.ID) (RequestType, *SentRequest, contact.C // It does not return an error because an error is not handleable. func (s *Store) Done(partner *id.ID) { s.mux.RLock() - r, ok := s.requests[*partner] + r, ok := s.receivedByID[*partner] s.mux.RUnlock() if !ok { @@ -426,7 +395,7 @@ func (s *Store) Done(partner *id.ID) { func (s *Store) Delete(partner *id.ID) error { s.mux.Lock() defer s.mux.Unlock() - r, ok := s.requests[*partner] + r, ok := s.receivedByID[*partner] if !ok { return errors.Errorf("Request not found: %s", partner) @@ -439,7 +408,7 @@ func (s *Store) Delete(partner *id.ID) error { s.deleteReceiveRequest(r) } - delete(s.requests, *partner) + delete(s.receivedByID, *partner) if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to store updated request map after "+ "deletion: %+v", err) @@ -459,21 +428,21 @@ func (s *Store) DeleteAllRequests() error { s.mux.Lock() defer s.mux.Unlock() - for partnerId, req := range s.requests { + for partnerId, req := range s.receivedByID { switch req.rt { case Sent: s.deleteSentRequest(req) - delete(s.requests, partnerId) + delete(s.receivedByID, partnerId) case Receive: s.deleteReceiveRequest(req) - delete(s.requests, partnerId) + delete(s.receivedByID, partnerId) } } if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to store updated request map after "+ - "deleting all requests: %+v", err) + "deleting all receivedByID: %+v", err) } return nil @@ -487,7 +456,7 @@ func (s *Store) DeleteRequest(partnerId *id.ID) error { s.mux.Lock() defer s.mux.Unlock() - req, ok := s.requests[*partnerId] + req, ok := s.receivedByID[*partnerId] if !ok { return errors.Errorf("Request for %s does not exist", partnerId) } @@ -499,26 +468,26 @@ func (s *Store) DeleteRequest(partnerId *id.ID) error { s.deleteReceiveRequest(req) } - delete(s.requests, *partnerId) + delete(s.receivedByID, *partnerId) if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to store updated request map after "+ - "deleting receive request for partner %s: %+v", partnerId, err) + "deleting partner request for partner %s: %+v", partnerId, err) } return nil } -// DeleteSentRequests deletes all Sent requests from Store. +// DeleteSentRequests deletes all Sent receivedByID from Store. func (s *Store) DeleteSentRequests() error { s.mux.Lock() defer s.mux.Unlock() - for partnerId, req := range s.requests { + for partnerId, req := range s.receivedByID { switch req.rt { case Sent: s.deleteSentRequest(req) - delete(s.requests, partnerId) + delete(s.receivedByID, partnerId) case Receive: continue } @@ -526,46 +495,46 @@ func (s *Store) DeleteSentRequests() error { if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to store updated request map after "+ - "deleting all sent requests: %+v", err) + "deleting all sent receivedByID: %+v", err) } return nil } -// DeleteReceiveRequests deletes all Receive requests from Store. +// DeleteReceiveRequests deletes all Receive receivedByID from Store. func (s *Store) DeleteReceiveRequests() error { s.mux.Lock() defer s.mux.Unlock() - for partnerId, req := range s.requests { + for partnerId, req := range s.receivedByID { switch req.rt { case Sent: continue case Receive: s.deleteReceiveRequest(req) - delete(s.requests, partnerId) + delete(s.receivedByID, partnerId) } } if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to store updated request map after "+ - "deleting all receive requests: %+v", err) + "deleting all partner receivedByID: %+v", err) } return nil } // deleteSentRequest is a helper function which deletes a Sent request from storage. -func (s *Store) deleteSentRequest(r *request) { - delete(s.fingerprints, r.sent.fingerprint) +func (s *Store) deleteSentRequest(r *ReceivedRequest) { + delete(s.sentByFingerprints, r.sent.fingerprint) if err := r.sent.delete(); err != nil { jww.FATAL.Panicf("Failed to delete sent request: %+v", err) } } // deleteReceiveRequest is a helper function which deletes a Receive request from storage. -func (s *Store) deleteReceiveRequest(r *request) { - if err := util.DeleteContact(s.kv, r.receive.ID); err != nil { +func (s *Store) deleteReceiveRequest(r *ReceivedRequest) { + if err := util.DeleteContact(s.kv, r.partner.ID); err != nil { jww.FATAL.Panicf("Failed to delete recieved request "+ "contact: %+v", err) } diff --git a/storage/auth/store_test.go b/storage/auth/store_test.go index 2963efc611c16360a0aaa0d8411f6ed448ac9acc..964b3b88e807bde5e4606ffbbcf25aa47ab9fa32 100644 --- a/storage/auth/store_test.go +++ b/storage/auth/store_test.go @@ -46,7 +46,7 @@ func TestNewStore(t *testing.T) { } for i, key := range privKeys { - rq, ok := store.fingerprints[auth.MakeRequestFingerprint(pubKeys[i])] + rq, ok := store.sentByFingerprints[auth.MakeRequestFingerprint(pubKeys[i])] if !ok { t.Errorf("Key not found in map (%d): %s", i, pubKeys[i].Text(16)) } else if rq.PrivKey.Cmp(key) != 0 { @@ -125,27 +125,27 @@ func TestLoadStore(t *testing.T) { } partner := sr.partner - if s.requests[*partner] == nil { + if s.receivedByID[*partner] == nil { t.Errorf("AddSent() failed to add request to map for "+ "partner ID %s.", partner) - } else if !reflect.DeepEqual(sr, s.requests[*partner].sent) { + } else if !reflect.DeepEqual(sr, s.receivedByID[*partner].sent) { t.Errorf("AddSent() failed store the correct SentRequest."+ "\n\texpected: %+v\n\treceived: %+v", - sr, s.requests[*partner].sent) + sr, s.receivedByID[*partner].sent) } expectedFP := fingerprint{ Type: Specific, PrivKey: nil, - Request: &request{Sent, sr, nil, nil, sync.Mutex{}}, + Request: &ReceivedRequest{Sent, sr, nil, nil, sync.Mutex{}}, } - if _, exists := s.fingerprints[sr.fingerprint]; !exists { + if _, exists := s.sentByFingerprints[sr.fingerprint]; !exists { t.Errorf("AddSent() failed to add fingerprint to map for "+ "fingerprint %s.", sr.fingerprint) } else if !reflect.DeepEqual(expectedFP, - s.fingerprints[sr.fingerprint]) { + s.sentByFingerprints[sr.fingerprint]) { t.Errorf("AddSent() failed store the correct fingerprint."+ "\n\texpected: %+v\n\treceived: %+v", - expectedFP, s.fingerprints[sr.fingerprint]) + expectedFP, s.sentByFingerprints[sr.fingerprint]) } } @@ -177,7 +177,7 @@ func TestStore_AddSent(t *testing.T) { expectedFP := fingerprint{ Type: Specific, PrivKey: nil, - Request: &request{Sent, sr, nil, nil, sync.Mutex{}}, + Request: &ReceivedRequest{Sent, sr, nil, nil, sync.Mutex{}}, } err := s.AddSent(partner, sr.partnerHistoricalPubKey, sr.myPrivKey, @@ -187,23 +187,23 @@ func TestStore_AddSent(t *testing.T) { t.Errorf("AddSent() produced an error: %+v", err) } - if s.requests[*partner] == nil { + if s.receivedByID[*partner] == nil { t.Errorf("AddSent() failed to add request to map for "+ "partner ID %s.", partner) - } else if !reflect.DeepEqual(sr, s.requests[*partner].sent) { + } else if !reflect.DeepEqual(sr, s.receivedByID[*partner].sent) { t.Errorf("AddSent() failed store the correct SentRequest."+ "\n\texpected: %+v\n\treceived: %+v", - sr, s.requests[*partner].sent) + sr, s.receivedByID[*partner].sent) } - if _, exists := s.fingerprints[sr.fingerprint]; !exists { + if _, exists := s.sentByFingerprints[sr.fingerprint]; !exists { t.Errorf("AddSent() failed to add fingerprint to map for "+ "fingerprint %s.", sr.fingerprint) } else if !reflect.DeepEqual(expectedFP, - s.fingerprints[sr.fingerprint]) { + s.sentByFingerprints[sr.fingerprint]) { t.Errorf("AddSent() failed store the correct fingerprint."+ "\n\texpected: %+v\n\treceived: %+v", - expectedFP, s.fingerprints[sr.fingerprint]) + expectedFP, s.sentByFingerprints[sr.fingerprint]) } } @@ -246,13 +246,13 @@ func TestStore_AddReceived(t *testing.T) { t.Errorf("AddReceived() returned an error: %+v", err) } - if s.requests[*c.ID] == nil { + if s.receivedByID[*c.ID] == nil { t.Errorf("AddReceived() failed to add request to map for "+ "partner ID %s.", c.ID) - } else if !reflect.DeepEqual(c, *s.requests[*c.ID].receive) { + } else if !reflect.DeepEqual(c, *s.receivedByID[*c.ID].partner) { t.Errorf("AddReceived() failed store the correct Contact."+ "\n\texpected: %+v\n\treceived: %+v", c, - *s.requests[*c.ID].receive) + *s.receivedByID[*c.ID].partner) } } @@ -276,7 +276,7 @@ func TestStore_AddReceived_PartnerAlreadyExistsError(t *testing.T) { } } -// Happy path: fingerprints type is General. +// Happy path: sentByFingerprints type is General. func TestStore_GetFingerprint_GeneralFingerprintType(t *testing.T) { s, _, privKeys := makeTestStore(t) @@ -302,7 +302,7 @@ func TestStore_GetFingerprint_GeneralFingerprintType(t *testing.T) { } } -// Happy path: fingerprints type is Specific. +// Happy path: sentByFingerprints type is Specific. func TestStore_GetFingerprint_SpecificFingerprintType(t *testing.T) { s, _, _ := makeTestStore(t) partnerID := id.NewIdFromUInt(rand.Uint64(), id.User, t) @@ -371,10 +371,10 @@ func TestStore_GetFingerprint_InvalidFingerprintType(t *testing.T) { s, _, privKeys := makeTestStore(t) fp := auth.MakeRequestFingerprint(privKeys[0]) - s.fingerprints[fp] = fingerprint{ + s.sentByFingerprints[fp] = fingerprint{ Type: 0, - PrivKey: s.fingerprints[fp].PrivKey, - Request: s.fingerprints[fp].Request, + PrivKey: s.sentByFingerprints[fp].PrivKey, + Request: s.sentByFingerprints[fp].Request, } fpType, request, key, err := s.GetFingerprint(fp) if err == nil { @@ -418,7 +418,7 @@ func TestStore_GetReceivedRequest(t *testing.T) { } // Check if the request's mutex is locked - if reflect.ValueOf(&s.requests[*c.ID].mux).Elem().FieldByName( + if reflect.ValueOf(&s.receivedByID[*c.ID].mux).Elem().FieldByName( "state").Int() != 1 { t.Errorf("GetReceivedRequest() did not lock mutex.") } @@ -442,11 +442,11 @@ func TestStore_GetReceivedRequest_RequestDeleted(t *testing.T) { t.Fatalf("AddReceived() returned an error: %+v", err) } - r := s.requests[*c.ID] + r := s.receivedByID[*c.ID] r.mux.Lock() go func() { - delete(s.requests, *c.ID) + delete(s.receivedByID, *c.ID) r.mux.Unlock() }() @@ -605,7 +605,7 @@ func TestStore_GetRequest_SentRequest(t *testing.T) { func TestStore_GetRequest_InvalidType(t *testing.T) { s, _, _ := makeTestStore(t) uid := id.NewIdFromUInt(rand.Uint64(), id.User, t) - s.requests[*uid] = &request{rt: 42} + s.receivedByID[*uid] = &ReceivedRequest{rt: 42} rType, request, con, err := s.GetRequest(uid) if err == nil { @@ -674,7 +674,7 @@ func TestStore_Fail(t *testing.T) { s.Done(c.ID) // Check if the request's mutex is locked - if reflect.ValueOf(&s.requests[*c.ID].mux).Elem().FieldByName( + if reflect.ValueOf(&s.receivedByID[*c.ID].mux).Elem().FieldByName( "state").Int() != 0 { t.Errorf("Done() did not unlock mutex.") } @@ -694,7 +694,7 @@ func TestStore_Fail_RequestNotInMap(t *testing.T) { s.Done(id.NewIdFromUInt(rand.Uint64(), id.User, t)) } -// Happy path: receive request. +// Happy path: partner request. func TestStore_Delete_ReceiveRequest(t *testing.T) { s, _, _ := makeTestStore(t) c := contact.Contact{ID: id.NewIdFromUInt(rand.Uint64(), id.User, t)} @@ -712,7 +712,7 @@ func TestStore_Delete_ReceiveRequest(t *testing.T) { t.Errorf("delete() returned an error: %+v", err) } - if s.requests[*c.ID] != nil { + if s.receivedByID[*c.ID] != nil { t.Errorf("delete() failed to delete request for user %s.", c.ID) } } @@ -747,12 +747,12 @@ func TestStore_Delete_SentRequest(t *testing.T) { t.Errorf("delete() returned an error: %+v", err) } - if s.requests[*sr.partner] != nil { + if s.receivedByID[*sr.partner] != nil { t.Errorf("delete() failed to delete request for user %s.", sr.partner) } - if _, exists := s.fingerprints[sr.fingerprint]; exists { + if _, exists := s.sentByFingerprints[sr.fingerprint]; exists { t.Errorf("delete() failed to delete fingerprint for fp %v.", sr.fingerprint) } @@ -775,7 +775,7 @@ func TestStore_GetAllReceived(t *testing.T) { numReceived := 10 expectContactList := make([]contact.Contact, 0, numReceived) - // Add multiple received contact requests + // Add multiple received contact receivedByID for i := 0; i < numReceived; i++ { c := contact.Contact{ID: id.NewIdFromUInt(rand.Uint64(), id.User, t)} rng := csprng.NewSystemRNG() @@ -815,7 +815,7 @@ func TestStore_GetAllReceived(t *testing.T) { } // Tests that Store.GetAllReceived returns an empty list when there are no -// received requests. +// received receivedByID. func TestStore_GetAllReceived_EmptyList(t *testing.T) { s, _, _ := makeTestStore(t) @@ -827,7 +827,7 @@ func TestStore_GetAllReceived_EmptyList(t *testing.T) { "\nReceived: %d", 0, len(receivedContactList)) } - // Add Sent and Receive requests + // Add Sent and Receive receivedByID for i := 0; i < 10; i++ { partnerID := id.NewIdFromUInt(rand.Uint64(), id.User, t) rng := csprng.NewSystemRNG() @@ -860,13 +860,13 @@ func TestStore_GetAllReceived_EmptyList(t *testing.T) { } -// Tests that Store.GetAllReceived returns only Sent requests when there -// are both Sent and Receive requests in Store. +// Tests that Store.GetAllReceived returns only Sent receivedByID when there +// are both Sent and Receive receivedByID in Store. func TestStore_GetAllReceived_MixSentReceived(t *testing.T) { s, _, _ := makeTestStore(t) numReceived := 10 - // Add multiple received contact requests + // Add multiple received contact receivedByID for i := 0; i < numReceived; i++ { // Add received request c := contact.Contact{ID: id.NewIdFromUInt(rand.Uint64(), id.User, t)} @@ -925,7 +925,7 @@ func TestStore_DeleteRequest_NonexistantRequest(t *testing.T) { err := s.DeleteRequest(c.ID) if err != nil { t.Errorf("DeleteRequest should return an error " + - "when trying to delete a receive request") + "when trying to delete a partner request") } } @@ -948,7 +948,7 @@ func TestStore_DeleteReceiveRequests(t *testing.T) { t.Fatalf("DeleteReceiveRequests returned an error: %+v", err) } - if s.requests[*c.ID] != nil { + if s.receivedByID[*c.ID] != nil { t.Errorf("delete() failed to delete request for user %s.", c.ID) } } @@ -980,18 +980,18 @@ func TestStore_DeleteSentRequests(t *testing.T) { t.Fatalf("DeleteSentRequests returned an error: %+v", err) } - if s.requests[*sr.partner] != nil { + if s.receivedByID[*sr.partner] != nil { t.Errorf("delete() failed to delete request for user %s.", sr.partner) } - if _, exists := s.fingerprints[sr.fingerprint]; exists { + if _, exists := s.sentByFingerprints[sr.fingerprint]; exists { t.Errorf("delete() failed to delete fingerprint for fp %v.", sr.fingerprint) } } -// Tests that DeleteSentRequests does not affect receive requests in map +// Tests that DeleteSentRequests does not affect partner receivedByID in map func TestStore_DeleteSentRequests_ReceiveInMap(t *testing.T) { s, _, _ := makeTestStore(t) c := contact.Contact{ID: id.NewIdFromUInt(rand.Uint64(), id.User, t)} @@ -1006,13 +1006,13 @@ func TestStore_DeleteSentRequests_ReceiveInMap(t *testing.T) { t.Fatalf("DeleteSentRequests returned an error: %+v", err) } - if s.requests[*c.ID] == nil { - t.Fatalf("DeleteSentRequests removes receive requests!") + if s.receivedByID[*c.ID] == nil { + t.Fatalf("DeleteSentRequests removes partner receivedByID!") } } -// Tests that DeleteReceiveRequests does not affect sent requests in map +// Tests that DeleteReceiveRequests does not affect sent receivedByID in map func TestStore_DeleteReceiveRequests_SentInMap(t *testing.T) { s, _, _ := makeTestStore(t) partnerID := id.NewIdFromUInt(rand.Uint64(), id.User, t) @@ -1039,8 +1039,8 @@ func TestStore_DeleteReceiveRequests_SentInMap(t *testing.T) { t.Fatalf("DeleteSentRequests returned an error: %+v", err) } - if s.requests[*partnerID] == nil { - t.Fatalf("DeleteReceiveRequests removes sent requests!") + if s.receivedByID[*partnerID] == nil { + t.Fatalf("DeleteReceiveRequests removes sent receivedByID!") } } @@ -1078,17 +1078,17 @@ func TestStore_DeleteAllRequests(t *testing.T) { t.Fatalf("DeleteAllRequests returned an error: %+v", err) } - if s.requests[*sr.partner] != nil { + if s.receivedByID[*sr.partner] != nil { t.Errorf("delete() failed to delete request for user %s.", sr.partner) } - if _, exists := s.fingerprints[sr.fingerprint]; exists { + if _, exists := s.sentByFingerprints[sr.fingerprint]; exists { t.Errorf("delete() failed to delete fingerprint for fp %v.", sr.fingerprint) } - if s.requests[*c.ID] != nil { + if s.receivedByID[*c.ID] != nil { t.Errorf("delete() failed to delete request for user %s.", c.ID) }