Skip to content
Snippets Groups Projects
Select Git revision
  • 2c5a20131b1b6446eb7ef25dfc306e2358c23443
  • release default protected
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • hotfix/TestHostPool_UpdateNdf_AddFilter
  • XX-4719/announcementChannels
  • xx-4717/logLevel
  • jonah/noob-channel
  • master protected
  • XX-4707/tagDiskJson
  • xx-4698/notification-retry
  • hotfix/notifylockup
  • syncNodes
  • hotfix/localCB
  • XX-4677/NewChanManagerMobile
  • XX-4689/DmSync
  • duplicatePrefix
  • XX-4601/HavenInvites
  • finalizedUICallbacks
  • XX-4673/AdminKeySync
  • debugNotifID
  • anne/test
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.6.3
  • v4.6.1
  • v4.5.0
  • v4.4.4
  • v4.3.11
  • v4.3.8
  • v4.3.7
  • v4.3.6
  • v4.3.5
  • v4.2.0
  • v4.3.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
41 results

precan.go

Blame
  • precan.go 2.73 KiB
    package messenger
    
    import (
    	"encoding/binary"
    	"github.com/cloudflare/circl/dh/sidh"
    	"gitlab.com/elixxir/client/api"
    	"gitlab.com/elixxir/client/e2e/ratchet/partner/session"
    	util "gitlab.com/elixxir/client/storage/utility"
    	"gitlab.com/elixxir/crypto/contact"
    	"gitlab.com/elixxir/crypto/cyclic"
    	"gitlab.com/elixxir/crypto/diffieHellman"
    	"gitlab.com/elixxir/primitives/fact"
    	"math/rand"
    )
    
    func generatePrecanDHKeypair(precannedID uint, e2eGrp *cyclic.Group) *cyclic.Int {
    	// DH Keygen
    	prng := rand.New(rand.NewSource(int64(precannedID)))
    	prime := e2eGrp.GetPBytes()
    	keyLen := len(prime)
    	priv := diffieHellman.GeneratePrivateKey(keyLen, e2eGrp, prng)
    	return priv
    }
    
    // Create an insecure e2e relationship with a precanned user
    func (m *Client) MakePrecannedAuthenticatedChannel(precannedID uint) (
    	contact.Contact, error) {
    
    	precan := m.MakePrecannedContact(precannedID)
    
    	myID := binary.BigEndian.Uint64(m.GetStorage().GetReceptionID()[:])
    	// Pick a variant based on if their ID is bigger than mine.
    	myVariant := sidh.KeyVariantSidhA
    	theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB)
    	if myID > uint64(precannedID) {
    		myVariant = sidh.KeyVariantSidhB
    		theirVariant = sidh.KeyVariantSidhA
    	}
    	prng1 := rand.New(rand.NewSource(int64(precannedID)))
    	theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant)
    	theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant)
    	theirSIDHPrivKey.Generate(prng1)
    	theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey)
    
    	prng2 := rand.New(rand.NewSource(int64(myID)))
    	mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant)
    	mySIDHPubKey := util.NewSIDHPublicKey(myVariant)
    	mySIDHPrivKey.Generate(prng2)
    	mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey)
    
    	// add the precanned user as a e2e contact
    	// FIXME: these params need to be threaded through...
    	sesParam := session.GetDefaultParams()
    	_, err := m.e2e.AddPartner(precan.ID, precan.DhPubKey,
    		m.e2e.GetHistoricalDHPrivkey(), theirSIDHPubKey,
    		mySIDHPrivKey, sesParam, sesParam)
    
    	// check garbled messages in case any messages arrived before creating
    	// the channel
    	m.GetCmix().CheckInProgressMessages()
    
    	return precan, err
    }
    
    // Create an insecure e2e contact object for a precanned user
    func (m *Client) MakePrecannedContact(precannedID uint) contact.Contact {
    
    	e2eGrp := m.GetStorage().GetE2EGroup()
    
    	rng := m.GetRng().GetStream()
    	precanned := api.CreatePrecannedUser(precannedID, rng)
    	rng.Close()
    
    	precanned.E2eDhPrivateKey = generatePrecanDHKeypair(precannedID,
    		m.GetStorage().GetE2EGroup())
    
    	// compute their public e2e key
    	partnerPubKey := e2eGrp.ExpG(precanned.E2eDhPrivateKey,
    		e2eGrp.NewInt(1))
    
    	return contact.Contact{
    		ID:             precanned.ReceptionID,
    		DhPubKey:       partnerPubKey,
    		OwnershipProof: nil,
    		Facts:          make([]fact.Fact, 0),
    	}
    }