diff --git a/cmd/ud.go b/cmd/ud.go index 2310b172c2b138026d03b1309dc0d04cc9ff5f80..cf1a0df7be220da8ded2bc23bba9b0c1c6c01fa3 100644 --- a/cmd/ud.go +++ b/cmd/ud.go @@ -82,19 +82,11 @@ var udCmd = &cobra.Command{ // Make user discovery manager rng := client.GetRng() userToRegister := viper.GetString("register") - userDiscoveryMgr, err := ud.NewManager(client.GetCmix(), - client.GetE2E(), client.NetworkFollowerStatus, - client.GetEventReporter(), - client.GetComms(), client.GetStorage(), - rng, - userToRegister, client.GetStorage().GetKV()) + userDiscoveryMgr, err := ud.NewManager(client, client.GetComms(), + client.NetworkFollowerStatus, userToRegister, nil) 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.GetRng(), - client.GetStorage().GetKV()) + userDiscoveryMgr, err = ud.LoadManager(client, client.GetComms()) if err != nil { jww.FATAL.Panicf("Failed to load UD manager: %+v", err) } diff --git a/ud/addFact.go b/ud/addFact.go index 3c2b0af5428d71c57fd5f80cc3a0b5657bc9cccc..f5174a0ed1dc928759ea14591e3e983b0c91bfc3 100644 --- a/ud/addFact.go +++ b/ud/addFact.go @@ -22,7 +22,7 @@ func (m *Manager) SendRegisterFact(f fact.Fact) (string, error) { jww.INFO.Printf("ud.SendRegisterFact(%s)", f.Stringify()) m.factMux.Lock() defer m.factMux.Unlock() - return m.addFact(f, m.e2e.GetReceptionID(), m.comms) + return m.addFact(f, m.e2e.GetReceptionIdentity().ID, m.comms) } // addFact is the helper function for SendRegisterFact. @@ -45,7 +45,10 @@ func (m *Manager) addFact(inFact fact.Fact, myId *id.ID, fHash := factID.Fingerprint(f) // Sign our inFact for putting into the request - privKey := m.user.PortableUserInfo().ReceptionRSA + privKey, err := m.e2e.GetReceptionIdentity().GetRSAPrivatePem() + if err != nil { + return "", err + } stream := m.rng.GetStream() defer stream.Close() fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil) diff --git a/ud/interfaces.go b/ud/interfaces.go index db7f0b60333ddbc559520aa5ee9a12eb51594eea..42b0c570f5ff522bcb2b8204ad867b4b08fd9b4a 100644 --- a/ud/interfaces.go +++ b/ud/interfaces.go @@ -1,11 +1,13 @@ package ud import ( + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/xxdk" - "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/xx_network/primitives/id" + "gitlab.com/elixxir/crypto/fastRNG" ) // CMix is a sub-interface of the cmix.Client. It contains the methods @@ -16,25 +18,16 @@ type CMix interface { single.Cmix } -// E2E is a sub-interface of the e2e.Handler. It contains the methods +// E2E is a sub-interface of the xxdk.E2e. It contains the methods // relevant to what is used in this package. type E2E interface { - // GetGroup returns the cyclic group used for end to end encruption - GetGroup() *cyclic.Group - - // GetReceptionID returns the default IDs - GetReceptionID() *id.ID - - // GetHistoricalDHPubkey returns the user's Historical DH - // Public Key - GetHistoricalDHPubkey() *cyclic.Int -} - -// UserInfo is a sub-interface for the user.User object in storage. -// It contains the methods relevant to what is used in this package. -type UserInfo interface { - PortableUserInfo() user.Info - GetReceptionRegistrationValidationSignature() []byte + GetReceptionIdentity() xxdk.ReceptionIdentity + GetCmix() cmix.Client + GetE2E() e2e.Handler + GetEventReporter() event.Reporter + GetRng() *fastRNG.StreamGenerator + GetStorage() storage.Session + GetTransmissionIdentity() xxdk.TransmissionIdentity } // NetworkStatus is an interface for the xxdk.Cmix's diff --git a/ud/lookup_test.go b/ud/lookup_test.go index 132905cc0878331aba435b1cbeee045bbda91d84..716f93460fe87b982e7f705ff6ebab59e7711a60 100644 --- a/ud/lookup_test.go +++ b/ud/lookup_test.go @@ -65,8 +65,8 @@ func TestManager_Lookup(t *testing.T) { defer mockListener.Stop() - r := m.e2e.GetGroup().NewInt(1) - m.e2e.GetGroup().Random(r) + r := m.e2e.GetE2E().GetGroup().NewInt(1) + m.e2e.GetE2E().GetGroup().Random(r) s := "" jsonable, err := r.MarshalJSON() if err != nil { diff --git a/ud/manager.go b/ud/manager.go index 77dbc01f44def0d37e0d84ff208fb8cffe39befe..757d2247331fdbc2f531039c72e6643306a4725c 100644 --- a/ud/manager.go +++ b/ud/manager.go @@ -43,11 +43,6 @@ type Manager struct { // with the UD service store *store.Store - // user is a sub-interface of the user.User object in the storage package. - // This allows the Manager to pull user information for registration - // and verifying the client's identity - user UserInfo - // comms is a sub-interface of the client.Comms interface. It contains // gRPC functions for registering and fact operations. comms Comms @@ -69,16 +64,18 @@ type Manager struct { // rng is a fastRNG.StreamGenerator which is used to generate random // data. This is used for signatures for adding/removing facts. rng *fastRNG.StreamGenerator + + // registrationValidationSignature for the ReceptionID + // Optional, depending on UD configuration + registrationValidationSignature []byte } // NewManager builds a new user discovery manager. // It requires that an updated // NDF is available and will error if one is not. -func NewManager(services CMix, e2e E2E, - follower NetworkStatus, - events event.Reporter, comms Comms, userStore UserInfo, - rng *fastRNG.StreamGenerator, username string, - kv *versioned.KV) (*Manager, error) { +// registrationValidationSignature may be set to nil +func NewManager(e2e E2E, comms Comms, follower NetworkStatus, + username string, registrationValidationSignature []byte) (*Manager, error) { jww.INFO.Println("ud.NewManager()") if follower() != xxdk.Running { @@ -88,13 +85,13 @@ func NewManager(services CMix, e2e E2E, // Initialize manager m := &Manager{ - network: services, - e2e: e2e, - events: events, - comms: comms, - user: userStore, - kv: kv, - rng: rng, + network: e2e.GetCmix(), + e2e: e2e, + events: e2e.GetEventReporter(), + comms: comms, + kv: e2e.GetStorage().GetKV(), + rng: e2e.GetRng(), + registrationValidationSignature: registrationValidationSignature, } if m.isRegistered() { @@ -103,7 +100,7 @@ func NewManager(services CMix, e2e E2E, // Initialize store var err error - m.store, err = store.NewOrLoadStore(kv) + m.store, err = store.NewOrLoadStore(m.kv) if err != nil { return nil, errors.Errorf("Failed to initialize store: %v", err) } @@ -116,15 +113,15 @@ func NewManager(services CMix, e2e E2E, } // Register with user discovery - stream := rng.GetStream() + stream := m.rng.GetStream() defer stream.Close() - err = m.register(username, stream, comms, udHost) + err = m.register(username, stream, m.comms, udHost) if err != nil { return nil, errors.Errorf("Failed to register: %v", err) } // Set storage to registered - if err = setRegistered(kv); err != nil && m.events != nil { + if err = setRegistered(m.kv); err != nil && m.events != nil { m.events.Report(1, "UserDiscovery", "Registration", fmt.Sprintf("User Registered with UD: %+v", username)) @@ -136,11 +133,8 @@ func NewManager(services CMix, e2e E2E, // NewManagerFromBackup builds a new user discover manager from a backup. // It will construct a manager that is already registered and restore // already registered facts into store. -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) { +func NewManagerFromBackup(e2e E2E, comms Comms, follower NetworkStatus, + email, phone fact.Fact) (*Manager, error) { jww.INFO.Println("ud.NewManagerFromBackup()") if follower() != xxdk.Running { return nil, errors.New( @@ -150,18 +144,17 @@ func NewManagerFromBackup(services CMix, // Initialize manager m := &Manager{ - network: services, + network: e2e.GetCmix(), e2e: e2e, - events: events, + events: e2e.GetEventReporter(), comms: comms, - user: userStore, - kv: kv, - rng: rng, + kv: e2e.GetStorage().GetKV(), + rng: e2e.GetRng(), } // Initialize our store var err error - m.store, err = store.NewOrLoadStore(kv) + m.store, err = store.NewOrLoadStore(m.kv) if err != nil { return nil, err } @@ -175,7 +168,7 @@ func NewManagerFromBackup(services CMix, // Set as registered. Since it's from a backup, // the client is already registered - if err = setRegistered(kv); err != nil { + if err = setRegistered(m.kv); err != nil { return nil, errors.WithMessage(err, "failed to set client as "+ "registered with user discovery.") } @@ -219,19 +212,15 @@ func InitStoreFromBackup(kv *versioned.KV, // LoadManager loads the state of the Manager // from disk. This is meant to be called after any the first // 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) { +func LoadManager(e2e E2E, comms Comms) (*Manager, error) { m := &Manager{ - network: services, + network: e2e.GetCmix(), e2e: e2e, - events: events, + events: e2e.GetEventReporter(), comms: comms, - user: userStore, - rng: rng, - kv: kv, + rng: e2e.GetRng(), + kv: e2e.GetStorage().GetKV(), } if !m.isRegistered() { @@ -240,7 +229,7 @@ func LoadManager(services CMix, e2e E2E, } var err error - m.store, err = store.NewOrLoadStore(kv) + m.store, err = store.NewOrLoadStore(m.kv) if err != nil { return nil, errors.Errorf("Failed to initialize store: %v", err) } @@ -262,7 +251,10 @@ func (m *Manager) GetStringifiedFacts() []string { // GetContact returns the contact for UD as retrieved from the NDF. func (m *Manager) GetContact() (contact.Contact, error) { - grp := m.e2e.GetGroup() + grp, err := m.e2e.GetReceptionIdentity().GetGroup() + if err != nil { + return contact.Contact{}, err + } // Return alternative User discovery contact if set if m.alternativeUd != nil { // Unmarshal UD DH public key diff --git a/ud/mockComms_test.go b/ud/mockComms_test.go new file mode 100644 index 0000000000000000000000000000000000000000..542469eac332d27589dc6c40a27ef824f60a6cab --- /dev/null +++ b/ud/mockComms_test.go @@ -0,0 +1,46 @@ +package ud + +import ( + pb "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/xx_network/comms/connect" + "gitlab.com/xx_network/comms/messages" + "gitlab.com/xx_network/primitives/id" +) + +type mockComms struct { + udHost *connect.Host +} + +func (m mockComms) SendRegisterUser(host *connect.Host, message *pb.UDBUserRegistration) (*messages.Ack, error) { + return nil, nil +} + +func (m mockComms) SendRegisterFact(host *connect.Host, message *pb.FactRegisterRequest) (*pb.FactRegisterResponse, error) { + return nil, nil +} + +func (m mockComms) SendConfirmFact(host *connect.Host, message *pb.FactConfirmRequest) (*messages.Ack, error) { + return nil, nil +} + +func (m mockComms) SendRemoveFact(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { + return nil, nil +} + +func (m mockComms) SendRemoveUser(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { + return nil, nil +} + +func (m *mockComms) AddHost(hid *id.ID, address string, cert []byte, params connect.HostParams) (host *connect.Host, err error) { + h, err := connect.NewHost(hid, address, cert, params) + if err != nil { + return nil, err + } + + m.udHost = h + return h, nil +} + +func (m mockComms) GetHost(hostId *id.ID) (*connect.Host, bool) { + return m.udHost, true +} diff --git a/ud/mockE2e_test.go b/ud/mockE2e_test.go new file mode 100644 index 0000000000000000000000000000000000000000..4341478526e251ff22b85a0ccfa458383137798b --- /dev/null +++ b/ud/mockE2e_test.go @@ -0,0 +1,215 @@ +package ud + +import ( + "github.com/cloudflare/circl/dh/sidh" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/ratchet/partner" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/event" + "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/crypto/cyclic" + cryptoE2e "gitlab.com/elixxir/crypto/e2e" + "gitlab.com/elixxir/crypto/fastRNG" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/crypto/signature/rsa" + "gitlab.com/xx_network/primitives/id" + "testing" + "time" +) + +/////////////////////////////////////////////////////////////////////////////// +// Mock of the E2E interface within this package ////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +type mockE2e struct { + grp *cyclic.Group + t testing.TB + key *rsa.PrivateKey +} + +func (m mockE2e) GetE2E() e2e.Handler { + return mockE2eHandler{} +} + +func (m mockE2e) GetReceptionIdentity() xxdk.ReceptionIdentity { + + dhPrivKey, _ := getGroup().NewInt(5).MarshalJSON() + grp, _ := getGroup().MarshalJSON() + + return xxdk.ReceptionIdentity{ + ID: id.NewIdFromString("test", id.User, m.t), + RSAPrivatePem: rsa.CreatePrivateKeyPem(m.key), + Salt: []byte("test"), + DHKeyPrivate: dhPrivKey, + E2eGrp: grp, + } +} + +func (m mockE2e) GetRng() *fastRNG.StreamGenerator { + return fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) +} + +func (m mockE2e) GetTransmissionIdentity() xxdk.TransmissionIdentity { + return xxdk.TransmissionIdentity{ + ID: id.NewIdFromString("test", id.User, m.t), + RSAPrivatePem: m.key, + Salt: []byte("test"), + } +} + +func (m mockE2e) GetHistoricalDHPubkey() *cyclic.Int { + return m.grp.NewInt(6) +} + +func (m mockE2e) GetReceptionID() *id.ID { + return id.NewIdFromString("test", id.User, m.t) +} + +func (m mockE2e) GetGroup() *cyclic.Group { + return getGroup() +} + +func (m mockE2e) GetEventReporter() event.Reporter { + return mockReporter{} +} + +func (m mockE2e) GetCmix() cmix.Client { + //TODO implement me + panic("implement me") +} + +func (m mockE2e) GetStorage() storage.Session { + //TODO implement me + panic("implement me") +} + +/////////////////////////////////////////////////////////////////////////////// +// Mock of the e2e.Handler interface within this package ////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +type mockE2eHandler struct{} + +func (m mockE2eHandler) StartProcesses() (stoppable.Stoppable, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, cryptoE2e.MessageID, time.Time, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RegisterListener(senderID *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RegisterFunc(name string, senderID *id.ID, messageType catalog.MessageType, newListener receive.ListenerFunc) receive.ListenerID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RegisterChannel(name string, senderID *id.ID, messageType catalog.MessageType, newListener chan receive.Message) receive.ListenerID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) Unregister(listenerID receive.ListenerID) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) UnregisterUserListeners(userID *id.ID) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, sendParams, receiveParams session.Params) (partner.Manager, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetPartner(partnerID *id.ID) (partner.Manager, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) DeletePartner(partnerId *id.ID) error { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetAllPartnerIDs() []*id.ID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) HasAuthenticatedChannel(partner *id.ID) bool { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) AddService(tag string, processor message.Processor) error { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RemoveService(tag string) error { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) SendUnsafe(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, time.Time, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) EnableUnsafeReception() { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetHistoricalDHPubkey() *cyclic.Int { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetHistoricalDHPrivkey() *cyclic.Int { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetReceptionID() *id.ID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) FirstPartitionSize() uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) SecondPartitionSize() uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) PartitionSize(payloadIndex uint) uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) PayloadSize() uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetGroup() *cyclic.Group { + return getGroup() +} diff --git a/ud/register.go b/ud/register.go index 3df8edd643216d8629e7c074152cd23f7ef2cc04..591a1cf1fd218c9afc9b84af5d53c4300505914e 100644 --- a/ud/register.go +++ b/ud/register.go @@ -17,24 +17,37 @@ func (m *Manager) register(username string, rng csprng.Source, comm registerUserComms, udHost *connect.Host) error { var err error - cryptoUser := m.user.PortableUserInfo() + identity := m.e2e.GetReceptionIdentity() + privKey, err := identity.GetRSAPrivatePem() + if err != nil { + return err + } + grp, err := identity.GetGroup() + if err != nil { + return err + } + dhKeyPriv, err := identity.GetDHKeyPrivate() + if err != nil { + return err + } + dhKeyPub := grp.ExpG(dhKeyPriv, grp.NewInt(1)) // Construct the user registration message msg := &pb.UDBUserRegistration{ - PermissioningSignature: m.user.GetReceptionRegistrationValidationSignature(), - RSAPublicPem: string(rsa.CreatePublicKeyPem(cryptoUser.ReceptionRSA.GetPublic())), + PermissioningSignature: m.registrationValidationSignature, + RSAPublicPem: string(rsa.CreatePublicKeyPem(privKey.GetPublic())), IdentityRegistration: &pb.Identity{ Username: username, - DhPubKey: m.e2e.GetHistoricalDHPubkey().Bytes(), - Salt: cryptoUser.ReceptionSalt, + DhPubKey: dhKeyPub.Bytes(), + Salt: identity.Salt, }, - UID: cryptoUser.ReceptionID.Marshal(), - Timestamp: cryptoUser.RegistrationTimestamp, + UID: identity.ID.Marshal(), + Timestamp: m.e2e.GetTransmissionIdentity().RegistrationTimestamp, } // Sign the identity data and add to user registration message identityDigest := msg.IdentityRegistration.Digest() - msg.IdentitySignature, err = rsa.Sign(rng, cryptoUser.ReceptionRSA, + msg.IdentitySignature, err = rsa.Sign(rng, privKey, hash.CMixHash, identityDigest, nil) if err != nil { return errors.Errorf("Failed to sign user's IdentityRegistration: %+v", err) @@ -48,11 +61,11 @@ func (m *Manager) register(username string, rng csprng.Source, // Hash and sign fact hashedFact := factID.Fingerprint(usernameFact) - signedFact, err := rsa.Sign(rng, cryptoUser.ReceptionRSA, hash.CMixHash, hashedFact, nil) + signedFact, err := rsa.Sign(rng, privKey, hash.CMixHash, hashedFact, nil) // Add username fact register request to the user registration message msg.Frs = &pb.FactRegisterRequest{ - UID: cryptoUser.ReceptionID.Marshal(), + UID: identity.ID.Marshal(), Fact: &pb.Fact{ Fact: username, FactType: 0, diff --git a/ud/register_test.go b/ud/register_test.go index 3aae46e19b7a3834e3f16c6f42a35e8e696e20bc..d23aacc40f1b7bb89a1fb2f9606dc414ec909f72 100644 --- a/ud/register_test.go +++ b/ud/register_test.go @@ -43,8 +43,13 @@ func TestManager_register(t *testing.T) { isCorrect("testUser", c.msg, m, t) // Verify the signed identity data - pubKey := m.user.PortableUserInfo().ReceptionRSA.GetPublic() - err = rsa.Verify(pubKey, hash.CMixHash, c.msg.IdentityRegistration.Digest(), + pubKeyPem := m.e2e.GetReceptionIdentity().RSAPrivatePem + privKey, err := rsa.LoadPrivateKeyFromPem(pubKeyPem) + if err != nil { + t.Fatalf("Failed to load public key: %+v", err) + } + + err = rsa.Verify(privKey.GetPublic(), hash.CMixHash, c.msg.IdentityRegistration.Digest(), c.msg.IdentitySignature, nil) if err != nil { t.Errorf("Failed to verify signed identity data: %+v", err) @@ -52,7 +57,7 @@ func TestManager_register(t *testing.T) { // Verify the signed fact usernameFact, _ := fact.NewFact(fact.Username, "testUser") - err = rsa.Verify(pubKey, hash.CMixHash, factID.Fingerprint(usernameFact), + err = rsa.Verify(privKey.GetPublic(), hash.CMixHash, factID.Fingerprint(usernameFact), c.msg.Frs.FactSig, nil) if err != nil { t.Errorf("Failed to verify signed fact data: %+v", err) @@ -62,17 +67,23 @@ func TestManager_register(t *testing.T) { // isCorrect checks if the UDBUserRegistration has all the expected fields minus // any signatures. func isCorrect(username string, msg *pb.UDBUserRegistration, m *Manager, t *testing.T) { - userInfo := m.user.PortableUserInfo() - - if !bytes.Equal(m.user.GetReceptionRegistrationValidationSignature(), msg.PermissioningSignature) { + if !bytes.Equal(m.registrationValidationSignature, msg.PermissioningSignature) { t.Errorf("PermissioningSignature incorrect.\n\texpected: %v\n\treceived: %v", - m.user.GetReceptionRegistrationValidationSignature(), msg.PermissioningSignature) + m.registrationValidationSignature, msg.PermissioningSignature) + } + + identity := m.e2e.GetReceptionIdentity() + privKey, err := rsa.LoadPrivateKeyFromPem(identity.RSAPrivatePem) + if err != nil { + t.Fatalf("Failed to load private key: %v", err) } - if string(rsa.CreatePublicKeyPem(userInfo.TransmissionRSA.GetPublic())) != + pubKeyPem := rsa.CreatePublicKeyPem(privKey.GetPublic()) + + if string(pubKeyPem) != msg.RSAPublicPem { t.Errorf("RSAPublicPem incorrect.\n\texpected: %v\n\treceived: %v", - string(rsa.CreatePublicKeyPem(userInfo.TransmissionRSA.GetPublic())), + string(pubKeyPem), msg.RSAPublicPem) } @@ -81,19 +92,27 @@ func isCorrect(username string, msg *pb.UDBUserRegistration, m *Manager, t *test username, msg.IdentityRegistration.Username) } - if !bytes.Equal(userInfo.E2eDhPublicKey.Bytes(), msg.IdentityRegistration.DhPubKey) { + dhKeyPriv, err := identity.GetDHKeyPrivate() + if err != nil { + t.Fatalf("%v", err) + } + + grp := m.e2e.GetE2E().GetGroup() + dhKeyPub := grp.ExpG(dhKeyPriv, grp.NewInt(1)) + + if !bytes.Equal(dhKeyPub.Bytes(), msg.IdentityRegistration.DhPubKey) { t.Errorf("IdentityRegistration DhPubKey incorrect.\n\texpected: %#v\n\treceived: %#v", - userInfo.E2eDhPublicKey.Bytes(), msg.IdentityRegistration.DhPubKey) + dhKeyPub.Bytes(), msg.IdentityRegistration.DhPubKey) } - if !bytes.Equal(userInfo.TransmissionSalt, msg.IdentityRegistration.Salt) { + if !bytes.Equal(identity.Salt, msg.IdentityRegistration.Salt) { t.Errorf("IdentityRegistration Salt incorrect.\n\texpected: %#v\n\treceived: %#v", - userInfo.TransmissionSalt, msg.IdentityRegistration.Salt) + identity.Salt, msg.IdentityRegistration.Salt) } - if !bytes.Equal(userInfo.TransmissionID.Marshal(), msg.Frs.UID) { + if !bytes.Equal(identity.ID.Marshal(), msg.Frs.UID) { t.Errorf("Frs UID incorrect.\n\texpected: %v\n\treceived: %v", - userInfo.TransmissionID.Marshal(), msg.Frs.UID) + identity.ID.Marshal(), msg.Frs.UID) } if !reflect.DeepEqual(&pb.Fact{Fact: username}, msg.Frs.Fact) { diff --git a/ud/remove.go b/ud/remove.go index b64a218e6d54f120de999478ef8b9fd5fb10dd0c..97fbc8a192bea01066632717029bd07a69167733 100644 --- a/ud/remove.go +++ b/ud/remove.go @@ -45,7 +45,11 @@ func (m *Manager) removeFact(f fact.Fact, fHash := factID.Fingerprint(f) // Sign our inFact for putting into the request - privKey := m.user.PortableUserInfo().ReceptionRSA + identity := m.e2e.GetReceptionIdentity() + privKey, err := identity.GetRSAPrivatePem() + if err != nil { + return err + } stream := m.rng.GetStream() defer stream.Close() fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil) @@ -55,7 +59,7 @@ func (m *Manager) removeFact(f fact.Fact, // Create our Fact Removal Request message data remFactMsg := mixmessages.FactRemovalRequest{ - UID: m.e2e.GetReceptionID().Marshal(), + UID: identity.ID.Marshal(), RemovalData: &mmFact, FactSig: fSig, } @@ -84,9 +88,14 @@ func (m *Manager) PermanentDeleteAccount(f fact.Fact) error { if err != nil { return err } - privKey := m.user.PortableUserInfo().ReceptionRSA - return m.permanentDeleteAccount(f, m.e2e.GetReceptionID(), privKey, m.comms, udHost) + identity := m.e2e.GetReceptionIdentity() + privKey, err := identity.GetRSAPrivatePem() + if err != nil { + return err + } + + return m.permanentDeleteAccount(f, identity.ID, privKey, m.comms, udHost) } // permanentDeleteAccount is a helper function for PermanentDeleteAccount. diff --git a/ud/search_test.go b/ud/search_test.go index 4bbc98e44ccba2fc08f3f98b0b58c5925d774ae9..49d9cbf7905bed838a9607098f1c5cd427b42ec3 100644 --- a/ud/search_test.go +++ b/ud/search_test.go @@ -71,7 +71,7 @@ func TestManager_Search(t *testing.T) { CmixParams: cmix.GetDefaultCMIXParams(), } - _, _, err = Search(m.network, m.events, prng, m.e2e.GetGroup(), + _, _, err = Search(m.network, m.events, prng, m.e2e.GetE2E().GetGroup(), udContact, callback, factList, p) if err != nil { t.Fatalf("Search() returned an error: %+v", err) diff --git a/ud/utils_test.go b/ud/utils_test.go index 5124db19cd73f3b153afde487c4649a2276780ff..5c65cb48f3d36d4d1589eaba85f86b16cc8d9176 100644 --- a/ud/utils_test.go +++ b/ud/utils_test.go @@ -20,19 +20,15 @@ import ( "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/client/storage/versioned" store "gitlab.com/elixxir/client/ud/store" - pb "gitlab.com/elixxir/comms/mixmessages" - "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" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id/ephemeral" - "gitlab.com/xx_network/primitives/utils" "io" "math/rand" "testing" @@ -53,17 +49,6 @@ const dhKeyEnc = `hQj4FKeaQDt34eO/BQe5OSk571WMQBu4YNqMQ0TFeuzjzCM9lLMuOsQhcyjZcI const lookupRequestEnc = `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` func newTestManager(t *testing.T) (*Manager, *testNetworkManager) { - - keyData, err := utils.ReadFile(testkeys.GetNodeKeyPath()) - if err != nil { - t.Fatalf("Could not load private key: %v", err) - } - - key, err := rsa.LoadPrivateKeyFromPem(keyData) - if err != nil { - t.Fatalf("Could not load public key") - } - kv := versioned.NewKV(ekv.MakeMemstore()) udStore, err := store.NewOrLoadStore(kv) if err != nil { @@ -71,12 +56,18 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) { } rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + stream := rngGen.GetStream() + privKey, err := rsa.GenerateKey(stream, 1024) + stream.Close() // Create our Manager object m := &Manager{ - e2e: mockE2e{grp: getGroup()}, + e2e: mockE2e{ + grp: getGroup(), + t: t, + key: privKey, + }, events: event.NewEventManager(), - user: mockUser{testing: t, key: key}, store: udStore, comms: &mockComms{}, rng: rngGen, @@ -335,81 +326,10 @@ func (tnm *testNetworkManager) GetInstance() *network.Instance { return tnm.instance } -type mockUserStore struct{} - -func (m mockUserStore) PortableUserInfo() user.Info { - //TODO implement me - panic("implement me") -} - -func (m mockUserStore) GetUsername() (string, error) { - //TODO implement me - panic("implement me") -} - -func (m mockUserStore) GetReceptionRegistrationValidationSignature() []byte { - //TODO implement me - panic("implement me") -} - -type mockComms struct { - udHost *connect.Host -} - -func (m mockComms) SendRegisterUser(host *connect.Host, message *pb.UDBUserRegistration) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendRegisterFact(host *connect.Host, message *pb.FactRegisterRequest) (*pb.FactRegisterResponse, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendConfirmFact(host *connect.Host, message *pb.FactConfirmRequest) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} +type mockReporter struct{} -func (m mockComms) SendRemoveFact(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendRemoveUser(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m *mockComms) AddHost(hid *id.ID, address string, cert []byte, params connect.HostParams) (host *connect.Host, err error) { - h, err := connect.NewHost(hid, address, cert, params) - if err != nil { - return nil, err - } - - m.udHost = h - return h, nil -} - -func (m mockComms) GetHost(hostId *id.ID) (*connect.Host, bool) { - return m.udHost, true -} - -type mockE2e struct { - grp *cyclic.Group -} - -func (m mockE2e) GetHistoricalDHPubkey() *cyclic.Int { - return m.grp.NewInt(6) -} - -func (m mockE2e) GetReceptionID() *id.ID { - //TODO implement me - panic("implement me") -} - -func (m mockE2e) GetGroup() *cyclic.Group { - return getGroup() +func (m mockReporter) Report(priority int, category, evtType, details string) { + return } type mockResponse struct { diff --git a/xxdk/cmix.go b/xxdk/cmix.go index fbc08044b3cdb27bc8224cdff2805dff8efd09eb..6bc1f0915134ec42d5a5bb21b2b433ae9603f59f 100644 --- a/xxdk/cmix.go +++ b/xxdk/cmix.go @@ -213,12 +213,12 @@ func LoadCmix(storageDir string, password []byte, parameters CMIXParams) (*Cmix, return nil, err } - jww.INFO.Printf("Cmix Logged in: \n\tTransmissionID: %s "+ - "\n\tReceptionID: %s", c.storage.GetTransmissionID(), c.storage.GetReceptionID()) + jww.INFO.Printf("Client loaded: \n\tTransmissionID: %s", + c.GetTransmissionIdentity().ID) def := c.storage.GetNDF() - //initialize registration + //initialize registration. if def.Registration.Address != "" { err = c.initPermissioning(def) if err != nil { @@ -257,13 +257,14 @@ func (c *Cmix) initComms() error { var err error //get the user from session - privKey := c.storage.GetTransmissionRSA() + transmissionIdentity := c.GetTransmissionIdentity() + privKey := transmissionIdentity.RSAPrivatePem pubPEM := rsa.CreatePublicKeyPem(privKey.GetPublic()) privPEM := rsa.CreatePrivateKeyPem(privKey) //start comms - c.comms, err = client.NewClientComms(c.storage.GetTransmissionID(), - pubPEM, privPEM, c.storage.GetTransmissionSalt()) + c.comms, err = client.NewClientComms(transmissionIdentity.ID, + pubPEM, privPEM, transmissionIdentity.Salt) if err != nil { return errors.WithMessage(err, "failed to load client") } diff --git a/xxdk/e2e.go b/xxdk/e2e.go index 55c83b6f490a25691c4954916a558901816ae661..0e55925360d9793445218c441a4c6ee3d9df8a5a 100644 --- a/xxdk/e2e.go +++ b/xxdk/e2e.go @@ -248,6 +248,8 @@ func login(client *Cmix, callbacks AuthCallbacks, identity ReceptionIdentity, } client.network.AddIdentity(identity.ID, time.Time{}, true) + jww.INFO.Printf("Client logged in: \n\tReceptionID: %s", + identity.ID) return m, err } diff --git a/xxdk/identity.go b/xxdk/identity.go index 97de124001ce2d090d80cf7c70b7f48a9bba5431..96100eddf44e1a7de4bbf11045dea336b6446251 100644 --- a/xxdk/identity.go +++ b/xxdk/identity.go @@ -81,6 +81,12 @@ func (r ReceptionIdentity) GetRSAPrivatePem() (*rsa.PrivateKey, error) { return rsa.LoadPrivateKeyFromPem(r.RSAPrivatePem) } +// GetGroup returns the cyclic.Group in go format +func (r ReceptionIdentity) GetGroup() (*cyclic.Group, error) { + grp := &cyclic.Group{} + return grp, grp.UnmarshalJSON(r.E2eGrp) +} + // MakeReceptionIdentity generates a new cryptographic identity // for receiving messages. func MakeReceptionIdentity(client *Cmix) (ReceptionIdentity, error) { @@ -155,8 +161,7 @@ func (r ReceptionIdentity) DeepCopy() ReceptionIdentity { // GetContact accepts a xxdk.ReceptionIdentity object and returns a contact.Contact object func (r ReceptionIdentity) GetContact() contact.Contact { - grp := &cyclic.Group{} - _ = grp.UnmarshalJSON(r.E2eGrp) + grp, _ := r.GetGroup() dhKeyPriv, _ := r.GetDHKeyPrivate() dhPub := grp.ExpG(dhKeyPriv, grp.NewInt(1))