From 5c65bbb5d362f6aaf98d6bd63690e8cc591fadd2 Mon Sep 17 00:00:00 2001
From: "Richard T. Carback III" <rick.carback@gmail.com>
Date: Wed, 8 Dec 2021 02:00:59 +0000
Subject: [PATCH] Integration fixes

---
 auth/callback.go            | 32 ++++++++++++++++++--------------
 auth/confirm.go             |  2 +-
 storage/auth/sentRequest.go | 10 ++++++++++
 storage/e2e/session.go      |  3 ++-
 storage/utility/sidh.go     | 18 +++++++++++++++++-
 5 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/auth/callback.go b/auth/callback.go
index f9ca1cfac..f73c3ea1f 100644
--- a/auth/callback.go
+++ b/auth/callback.go
@@ -26,6 +26,9 @@ import (
 	"gitlab.com/elixxir/primitives/fact"
 	"gitlab.com/elixxir/primitives/format"
 	"strings"
+	util "gitlab.com/elixxir/client/storage/utility"
+	"gitlab.com/elixxir/crypto/fastRNG"
+	"gitlab.com/xx_network/crypto/csprng"
 )
 
 func (m *Manager) StartProcesses() (stoppable.Stoppable, error) {
@@ -179,6 +182,18 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 				jww.INFO.Printf("Received AuthRequest from %s,"+
 					" msgDigest: %s which has been requested, auto-confirming",
 					partnerID, cmixMsg.Digest())
+				// Note that our sent request SIDH key needs to
+				// change to be compatible
+				rngGen := fastRNG.NewStreamGenerator(1, 1,
+					csprng.NewSystemRNG)
+				rng := rngGen.GetStream()
+				myVariant := util.GetCompatibleSIDHVariant(
+					partnerSIDHPubKey.Variant())
+				myPriv, myPub := util.GenerateSIDHKeyPair(
+					myVariant, rng)
+				sr2.OverwriteSIDHKeys(myPriv, myPub)
+				rng.Close()
+
 				// do the confirmation
 				if err := m.doConfirm(sr2, grp, partnerPubKey,
 					m.storage.E2e().GetDHPrivateKey(),
@@ -197,23 +212,12 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 		}
 	}
 
-	//process the inner payload
-	facts, msg, err := fact.UnstringifyFactList(
-		string(requestFmt.GetPayload()))
-	if err != nil {
-		em := fmt.Sprintf("failed to parse facts and message "+
-			"from Auth Request: %s", err)
-		jww.WARN.Print(em)
-		events.Report(10, "Auth", "RequestError", em)
-		return
-	}
-
-	//create the contact
+	//create the contact, note that no facts are sent in the payload
 	c := contact.Contact{
 		ID:             partnerID,
 		DhPubKey:       partnerPubKey,
 		OwnershipProof: copySlice(ecrFmt.ownership),
-		Facts:          facts,
+		Facts:          make([]fact.Fact, 0),
 	}
 
 	// fixme: the client will never be notified of the channel creation if a
@@ -232,7 +236,7 @@ func (m *Manager) handleRequest(cmixMsg format.Message,
 	cbList := m.requestCallbacks.Get(c.ID)
 	for _, cb := range cbList {
 		rcb := cb.(interfaces.RequestCallback)
-		go rcb(c, msg)
+		go rcb(c, "")
 	}
 	return
 }
diff --git a/auth/confirm.go b/auth/confirm.go
index 8e6475756..8a05297de 100644
--- a/auth/confirm.go
+++ b/auth/confirm.go
@@ -68,7 +68,7 @@ func ConfirmRequestAuth(partner contact.Contact, rng io.Reader,
 	newPrivKey := diffieHellman.GeneratePrivateKey(256, grp, rng)
 	newPubKey := diffieHellman.GeneratePublicKey(newPrivKey, grp)
 
-	sidhVariant := util.GetSIDHVariant(theirSidhKey.Variant())
+	sidhVariant := util.GetCompatibleSIDHVariant(theirSidhKey.Variant())
 	newSIDHPrivKey := util.NewSIDHPrivateKey(sidhVariant)
 	newSIDHPubKey := util.NewSIDHPublicKey(sidhVariant)
 
diff --git a/storage/auth/sentRequest.go b/storage/auth/sentRequest.go
index 42b908192..2b42df472 100644
--- a/storage/auth/sentRequest.go
+++ b/storage/auth/sentRequest.go
@@ -205,6 +205,16 @@ func (sr *SentRequest) GetMySIDHPubKey() *sidh.PublicKey {
 	return sr.mySidHPubKeyA
 }
 
+// OverwriteSIDHKeys is used to temporarily overwrite sidh keys
+// to handle e.g., confirmation requests.
+// 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,
+	pub *sidh.PublicKey) {
+	sr.mySidHPrivKeyA = priv
+	sr.mySidHPubKeyA = pub
+}
+
 func (sr *SentRequest) GetFingerprint() format.Fingerprint {
 	return sr.fingerprint
 }
diff --git a/storage/e2e/session.go b/storage/e2e/session.go
index ebea67c48..f8c89b972 100644
--- a/storage/e2e/session.go
+++ b/storage/e2e/session.go
@@ -613,7 +613,8 @@ func (s *Session) generate(kv *versioned.KV) *versioned.KV {
 		s.myPrivKey = dh.GeneratePrivateKey(dh.DefaultPrivateKeyLength,
 			grp, stream)
 		// Get the variant opposite my partners variant
-		sidhVariant := utility.GetSIDHVariant(s.partnerSIDHPubKey.Variant())
+		sidhVariant := utility.GetCompatibleSIDHVariant(
+			s.partnerSIDHPubKey.Variant())
 		s.mySIDHPrivKey = utility.NewSIDHPrivateKey(sidhVariant)
 		s.mySIDHPrivKey.Generate(stream)
 		stream.Close()
diff --git a/storage/utility/sidh.go b/storage/utility/sidh.go
index 88053fd24..d4bef091f 100644
--- a/storage/utility/sidh.go
+++ b/storage/utility/sidh.go
@@ -15,6 +15,8 @@ import (
 	sidhinterface "gitlab.com/elixxir/client/interfaces/sidh"
 	"gitlab.com/xx_network/primitives/id"
 	"fmt"
+	jww "github.com/spf13/jwalterweatherman"
+	"io"
 )
 
 const currentSIDHVersion = 0
@@ -32,7 +34,7 @@ func NewSIDHPrivateKey(variant sidh.KeyVariant) *sidh.PrivateKey {
 }
 
 // GetSIDHVariant returns the variant opposite the otherVariant
-func GetSIDHVariant(otherVariant sidh.KeyVariant) sidh.KeyVariant {
+func GetCompatibleSIDHVariant(otherVariant sidh.KeyVariant) sidh.KeyVariant {
 	// Note -- this is taken from inside the sidh lib to look for the A flag
 	if (otherVariant & sidh.KeyVariantSidhA) == sidh.KeyVariantSidhA {
 		return sidh.KeyVariantSidhB
@@ -40,6 +42,20 @@ func GetSIDHVariant(otherVariant sidh.KeyVariant) sidh.KeyVariant {
 	return sidh.KeyVariantSidhA
 }
 
+// GenerateSIDHKeyPair generates a SIDH keypair
+func GenerateSIDHKeyPair(variant sidh.KeyVariant, rng io.Reader) (
+	*sidh.PrivateKey, *sidh.PublicKey) {
+	priv := NewSIDHPrivateKey(variant)
+	pub := NewSIDHPublicKey(variant)
+
+	if err := priv.Generate(rng); err!=nil {
+		jww.FATAL.Panicf("Unable to generate SIDH private key: %+v",
+			err)
+	}
+	priv.GeneratePublicKey(pub)
+	return priv, pub
+}
+
 // String interface impl to dump the contents of the public key as b64 string
 func StringSIDHPubKey(k *sidh.PublicKey) string {
 	kBytes := make([]byte, k.Size())
-- 
GitLab