From 7bd24eda3ae89356d1caea6f3f2b34a9487c0172 Mon Sep 17 00:00:00 2001
From: "Richard T. Carback III" <rick.carback@gmail.com>
Date: Tue, 26 Apr 2022 01:55:35 +0000
Subject: [PATCH] Don't replay sent requests on a reset

---
 auth/receivedConfirm.go |  4 ++--
 auth/receivedRequest.go |  4 ++++
 auth/request.go         | 10 +++++++++-
 auth/state.go           |  6 +++---
 auth/store/store.go     | 20 +++++++++++---------
 5 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/auth/receivedConfirm.go b/auth/receivedConfirm.go
index 202085d34..c4b5a7e81 100644
--- a/auth/receivedConfirm.go
+++ b/auth/receivedConfirm.go
@@ -50,8 +50,8 @@ func (rcs *receivedConfirmService) Process(msg format.Message,
 		baseFmt.GetEcrPayload(), msg.GetMac(), state.e2e.GetGroup())
 
 	if !success {
-		em := fmt.Sprintf("Received auth confirmation failed its mac " +
-			"check")
+		em := fmt.Sprintf("Received auth confirmation " +
+			"failed its mac check")
 		jww.WARN.Print(em)
 		state.event.Report(10, "Auth", "ConfirmError", em)
 		return
diff --git a/auth/receivedRequest.go b/auth/receivedRequest.go
index 7b033cc2c..22a94b064 100644
--- a/auth/receivedRequest.go
+++ b/auth/receivedRequest.go
@@ -149,6 +149,10 @@ func (rrs *receivedRequestService) Process(message format.Message,
 	// new request
 	reset := false
 	if rrs.reset {
+		jww.INFO.Printf("AuthRequest ResetSession from %s,"+
+			" msgDigest: %s, FP: %s", partnerID,
+			format.DigestContents(message.GetContents()),
+			base64.StdEncoding.EncodeToString(fp))
 		// delete only deletes if the partner is present, so we can just call delete
 		// instead of checking if it exists and then calling delete, and check the
 		// error to see if it did or didnt exist
diff --git a/auth/request.go b/auth/request.go
index 8a064c1fe..9c0dc2e4d 100644
--- a/auth/request.go
+++ b/auth/request.go
@@ -86,6 +86,10 @@ func (s *state) request(partner contact.Contact, myfacts fact.FactList,
 		} else {
 			jww.INFO.Printf("Resending request to %s from %s as "+
 				"one was already sent", partner.ID, me)
+			dhPriv = sr.GetMyPrivKey()
+			dhPub = sr.GetMyPubKey()
+			//sidhPriv = sr.GetMySIDHPrivKey()
+			sidhPub = sr.GetMySIDHPubKey()
 		}
 	}
 
@@ -114,9 +118,13 @@ func (s *state) request(partner contact.Contact, myfacts fact.FactList,
 
 	p := cmix.GetDefaultCMIXParams()
 	p.DebugTag = "auth.Request"
+	tag := s.params.RequestTag
+	if reset {
+		tag = s.params.ResetRequestTag
+	}
 	svc := message.Service{
 		Identifier: partner.ID.Marshal(),
-		Tag:        s.params.RequestTag,
+		Tag:        tag,
 		Metadata:   nil,
 	}
 	round, _, err := s.net.Send(partner.ID, requestfp, svc, contents, mac, p)
diff --git a/auth/state.go b/auth/state.go
index a3e3d59df..2be3d4d6b 100644
--- a/auth/state.go
+++ b/auth/state.go
@@ -77,11 +77,11 @@ type e2eHandler interface {
 }
 
 type Callbacks interface {
-	Request(requestor contact.Contact, receptionID receptionID.EphemeralIdentity,
+	Request(partner contact.Contact, receptionID receptionID.EphemeralIdentity,
 		round rounds.Round)
-	Confirm(requestor contact.Contact, receptionID receptionID.EphemeralIdentity,
+	Confirm(partner contact.Contact, receptionID receptionID.EphemeralIdentity,
 		round rounds.Round)
-	Reset(requestor contact.Contact, receptionID receptionID.EphemeralIdentity,
+	Reset(partner contact.Contact, receptionID receptionID.EphemeralIdentity,
 		round rounds.Round)
 }
 
diff --git a/auth/store/store.go b/auth/store/store.go
index 241a090ef..d38510933 100644
--- a/auth/store/store.go
+++ b/auth/store/store.go
@@ -181,15 +181,17 @@ func (s *Store) AddSent(partner *id.ID, partnerHistoricalPubKey, myPrivKey,
 	s.mux.Lock()
 	defer s.mux.Unlock()
 
-	if sentRq, ok := s.sentByID[*partner]; ok {
-		return sentRq, errors.Errorf("Cannot make new sentRequest "+
-			"for partner %s, a sent request already exists",
-			partner)
-	}
-	if _, ok := s.receivedByID[*partner]; ok {
-		return nil, errors.Errorf("Cannot make new sentRequest for "+
-			" partner %s, a received reqyest already exists",
-			partner)
+	if !reset {
+		if sentRq, ok := s.sentByID[*partner]; ok {
+			return sentRq, errors.Errorf("sent request "+
+				"already exists for partner %s",
+				partner)
+		}
+		if _, ok := s.receivedByID[*partner]; ok {
+			return nil, errors.Errorf("received request "+
+				"already exists for partner %s",
+				partner)
+		}
 	}
 
 	sr, err := newSentRequest(s.kv, partner, partnerHistoricalPubKey,
-- 
GitLab