diff --git a/cmd/ud.go b/cmd/ud.go index fec4e372fcf9d205197da1b46efdd3ad19946b9a..2310b172c2b138026d03b1309dc0d04cc9ff5f80 100644 --- a/cmd/ud.go +++ b/cmd/ud.go @@ -80,21 +80,21 @@ var udCmd = &cobra.Command{ waitUntilConnected(connected) // Make user discovery manager - stream := client.GetRng().GetStream() - defer stream.Close() + rng := client.GetRng() userToRegister := viper.GetString("register") userDiscoveryMgr, err := ud.NewManager(client.GetCmix(), client.GetE2E(), client.NetworkFollowerStatus, client.GetEventReporter(), client.GetComms(), client.GetStorage(), - stream, + rng, userToRegister, client.GetStorage().GetKV()) if err != nil { if strings.Contains(err.Error(), ud.IsRegisteredErr) { userDiscoveryMgr, err = ud.LoadManager(client.GetCmix(), client.GetE2E(), client.GetEventReporter(), client.GetComms(), - client.GetStorage(), client.GetStorage().GetKV()) + client.GetStorage(), client.GetRng(), + client.GetStorage().GetKV()) if err != nil { jww.FATAL.Panicf("Failed to load UD manager: %+v", err) } @@ -165,12 +165,15 @@ var udCmd = &cobra.Command{ } printContact(newContact) } + + stream := rng.GetStream() _, _, err = ud.Lookup(client.GetCmix(), stream, client.GetE2E().GetGroup(), udContact, cb, lookupID, single.GetDefaultRequestParams()) if err != nil { jww.WARN.Printf("Failed UD lookup: %+v", err) } + stream.Close() time.Sleep(31 * time.Second) } @@ -258,6 +261,8 @@ var udCmd = &cobra.Command{ } } + stream := rng.GetStream() + defer stream.Close() _, _, err = ud.Search(client.GetCmix(), client.GetEventReporter(), stream, client.GetE2E().GetGroup(), diff --git a/ud/addFact.go b/ud/addFact.go index 6412e94b308871e9aa7266b2176e39cb8f169376..3c2b0af5428d71c57fd5f80cc3a0b5657bc9cccc 100644 --- a/ud/addFact.go +++ b/ud/addFact.go @@ -1,7 +1,6 @@ package ud import ( - "crypto/rand" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" pb "gitlab.com/elixxir/comms/mixmessages" @@ -47,7 +46,9 @@ func (m *Manager) addFact(inFact fact.Fact, myId *id.ID, // Sign our inFact for putting into the request privKey := m.user.PortableUserInfo().ReceptionRSA - fSig, err := rsa.Sign(rand.Reader, privKey, hash.CMixHash, fHash, nil) + stream := m.rng.GetStream() + defer stream.Close() + fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil) if err != nil { return "", err } diff --git a/ud/manager.go b/ud/manager.go index 1ce22eac8d6c24812c381fdc60753e07ba5e5e66..77dbc01f44def0d37e0d84ff208fb8cffe39befe 100644 --- a/ud/manager.go +++ b/ud/manager.go @@ -2,6 +2,7 @@ package ud import ( "fmt" + "gitlab.com/elixxir/crypto/fastRNG" "sync" "time" @@ -14,7 +15,6 @@ import ( "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/comms/connect" - "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" ) @@ -65,6 +65,10 @@ type Manager struct { // alternativeUd is an alternate User discovery service to circumvent // production. This is for testing with a separately deployed UD service. alternativeUd *alternateUd + + // rng is a fastRNG.StreamGenerator which is used to generate random + // data. This is used for signatures for adding/removing facts. + rng *fastRNG.StreamGenerator } // NewManager builds a new user discovery manager. @@ -73,7 +77,7 @@ type Manager struct { func NewManager(services CMix, e2e E2E, follower NetworkStatus, events event.Reporter, comms Comms, userStore UserInfo, - rng csprng.Source, username string, + rng *fastRNG.StreamGenerator, username string, kv *versioned.KV) (*Manager, error) { jww.INFO.Println("ud.NewManager()") @@ -90,6 +94,7 @@ func NewManager(services CMix, e2e E2E, comms: comms, user: userStore, kv: kv, + rng: rng, } if m.isRegistered() { @@ -111,7 +116,9 @@ func NewManager(services CMix, e2e E2E, } // Register with user discovery - err = m.register(username, rng, comms, udHost) + stream := rng.GetStream() + defer stream.Close() + err = m.register(username, stream, comms, udHost) if err != nil { return nil, errors.Errorf("Failed to register: %v", err) } @@ -132,6 +139,7 @@ func NewManager(services CMix, e2e E2E, func NewManagerFromBackup(services CMix, e2e E2E, follower NetworkStatus, events event.Reporter, comms Comms, userStore UserInfo, + rng *fastRNG.StreamGenerator, email, phone fact.Fact, kv *versioned.KV) (*Manager, error) { jww.INFO.Println("ud.NewManagerFromBackup()") if follower() != xxdk.Running { @@ -148,6 +156,7 @@ func NewManagerFromBackup(services CMix, comms: comms, user: userStore, kv: kv, + rng: rng, } // Initialize our store @@ -212,6 +221,7 @@ func InitStoreFromBackup(kv *versioned.KV, // instantiation of the manager by NewUserDiscovery. func LoadManager(services CMix, e2e E2E, events event.Reporter, comms Comms, userStore UserInfo, + rng *fastRNG.StreamGenerator, kv *versioned.KV) (*Manager, error) { m := &Manager{ @@ -220,8 +230,8 @@ func LoadManager(services CMix, e2e E2E, events: events, comms: comms, user: userStore, - - kv: kv, + rng: rng, + kv: kv, } if !m.isRegistered() { diff --git a/ud/remove.go b/ud/remove.go index 61d130ec240ad1bda693af3c39c9660f7858f597..b64a218e6d54f120de999478ef8b9fd5fb10dd0c 100644 --- a/ud/remove.go +++ b/ud/remove.go @@ -1,7 +1,6 @@ package ud import ( - "crypto/rand" "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" @@ -47,7 +46,9 @@ func (m *Manager) removeFact(f fact.Fact, // Sign our inFact for putting into the request privKey := m.user.PortableUserInfo().ReceptionRSA - fSig, err := rsa.Sign(rand.Reader, privKey, hash.CMixHash, fHash, nil) + stream := m.rng.GetStream() + defer stream.Close() + fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil) if err != nil { return err } @@ -103,7 +104,9 @@ func (m *Manager) permanentDeleteAccount(f fact.Fact, myId *id.ID, privateKey *r fHash := factID.Fingerprint(f) // Sign our inFact for putting into the request - fsig, err := rsa.Sign(rand.Reader, privateKey, hash.CMixHash, fHash, nil) + stream := m.rng.GetStream() + defer stream.Close() + fsig, err := rsa.Sign(stream, privateKey, hash.CMixHash, fHash, nil) if err != nil { return err } diff --git a/ud/utils_test.go b/ud/utils_test.go index 640c62ec048b356c66319a15e3e08f3ae187ff61..5124db19cd73f3b153afde487c4649a2276780ff 100644 --- a/ud/utils_test.go +++ b/ud/utils_test.go @@ -24,6 +24,7 @@ import ( "gitlab.com/elixxir/comms/testkeys" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/messages" @@ -69,6 +70,8 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) { t.Fatalf("Failed to initialize store %v", err) } + rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + // Create our Manager object m := &Manager{ e2e: mockE2e{grp: getGroup()}, @@ -76,6 +79,7 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) { user: mockUser{testing: t, key: key}, store: udStore, comms: &mockComms{}, + rng: rngGen, kv: kv, } tnm := newTestNetworkManager(t) diff --git a/xxdk/e2e.go b/xxdk/e2e.go index 78e3c5d1daee69650eb84ac45fedf105221b2297..55c83b6f490a25691c4954916a558901816ae661 100644 --- a/xxdk/e2e.go +++ b/xxdk/e2e.go @@ -135,11 +135,6 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, "able to register or track network.") } - err = c.registerFollower() - if err != nil { - return nil, err - } - return LoginLegacy(c, e2eParams, nil) } @@ -180,12 +175,7 @@ func LoginWithProtoClient(storageDir string, password []byte, return nil, err } - err = c.registerFollower() - if err != nil { - return nil, err - } - - userInfo := c.GetStorage().PortableUserInfo() + userInfo := user.NewUserFromProto(protoUser) receptionIdentity, err := buildReceptionIdentity(userInfo, c.GetStorage().GetE2EGroup(), protoUser.E2eDhPrivateKey) return Login(c, callbacks, receptionIdentity, e2eParams) diff --git a/xxdk/identity.go b/xxdk/identity.go index 46caef778129618a8a07a2ebc5ba036fc5500718..97de124001ce2d090d80cf7c70b7f48a9bba5431 100644 --- a/xxdk/identity.go +++ b/xxdk/identity.go @@ -172,8 +172,8 @@ func (r ReceptionIdentity) GetContact() contact.Contact { // buildReceptionIdentity creates a new ReceptionIdentity // from the given user.Info func buildReceptionIdentity(userInfo user.Info, e2eGrp *cyclic.Group, dHPrivkey *cyclic.Int) (ReceptionIdentity, error) { - saltCopy := make([]byte, len(userInfo.TransmissionSalt)) - copy(saltCopy, userInfo.TransmissionSalt) + saltCopy := make([]byte, len(userInfo.ReceptionSalt)) + copy(saltCopy, userInfo.ReceptionSalt) grp, err := e2eGrp.MarshalJSON() if err != nil {