Skip to content
Snippets Groups Projects
Select Git revision
  • 461a58e6a4e0622b852efd209c7e137946b5dd92
  • release default protected
  • XX-4719/announcementChannels
  • jonah/channelCodenames
  • master protected
  • XX-4601/HavenInvites
  • sihSize
  • project/HavenNotifications
  • hotfix/base8KeySizes
  • Anne/Project/DM
  • XX-4004_ownership_vector_test
  • XX-3566_constant_time_comparison
  • XX-4132-upgrade-channel-keying
  • XX-4133-rsa-to-private
  • XX-3958/ConnectionCLI
  • xx-3893/asymmetric
  • xx-3891/symmetric-integration
  • hotfix/groupChat
  • XX-3770/UpdateExternalDeps
  • dev
  • waitingRoundsRewrite
  • v0.0.9
  • v0.0.8
  • v0.0.7
  • v0.0.6
  • v0.0.5
  • v0.0.4
  • v0.0.3
  • v0.0.2
  • v0.0.1
30 results

buffer_test.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),
    	}
    }