diff --git a/go.mod b/go.mod index 17661bbab92822b5ebb61e6cea8d77c0b11831b0..240a6599d52313fb11686f74d33c56b1b243c203 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/viper v1.7.1 gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 - gitlab.com/elixxir/comms v0.0.4-0.20210922201638-6f29a4b4f1e3 + gitlab.com/elixxir/comms v0.0.4-0.20210924220856-4864c21fe316 gitlab.com/elixxir/crypto v0.0.7-0.20210920180151-6c9b84bae372 gitlab.com/elixxir/ekv v0.1.5 gitlab.com/elixxir/primitives v0.0.3-0.20210920180121-b85bca5212f4 diff --git a/go.sum b/go.sum index 259d63fe7295960e4791ecc1277d3a615a81a106..9f762119d26a085bf35480bd95d06b6bcf475f3b 100644 --- a/go.sum +++ b/go.sum @@ -257,6 +257,8 @@ gitlab.com/elixxir/comms v0.0.4-0.20210921011907-2be8c9faa4d8 h1:MqVGu0ADBHMw7rf gitlab.com/elixxir/comms v0.0.4-0.20210921011907-2be8c9faa4d8/go.mod h1:h41+FHc9zlQGveEao3aw8VSfzyOPecEhhUIadUsW1C8= gitlab.com/elixxir/comms v0.0.4-0.20210922201638-6f29a4b4f1e3 h1:xm9szmYscDwLUtbDyIcDlToKb1c7MDCCxQ4HFZJVPCk= gitlab.com/elixxir/comms v0.0.4-0.20210922201638-6f29a4b4f1e3/go.mod h1:h41+FHc9zlQGveEao3aw8VSfzyOPecEhhUIadUsW1C8= +gitlab.com/elixxir/comms v0.0.4-0.20210924220856-4864c21fe316 h1:PLGmuuaG5R1suI2GNHhaQw09vrM4p6KoJ6FsBZLNocc= +gitlab.com/elixxir/comms v0.0.4-0.20210924220856-4864c21fe316/go.mod h1:h41+FHc9zlQGveEao3aw8VSfzyOPecEhhUIadUsW1C8= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/crypto v0.0.7-0.20210920180151-6c9b84bae372 h1:W5Ax+cwqOOcsVegaMLvsFJ/Cs24a4Wyhp5UHFwvMQxo= diff --git a/network/node/register.go b/network/node/register.go index 7315304217b9ddd8f24839fb9a0ec547526fbde0..f72e4357da2228c9db8ac3148aadc2a694f1ec9b 100644 --- a/network/node/register.go +++ b/network/node/register.go @@ -11,6 +11,7 @@ import ( "crypto/rand" "crypto/sha256" "fmt" + "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/network/gateway" @@ -34,8 +35,8 @@ import ( ) type RegisterNodeCommsInterface interface { - SendRequestNonceMessage(host *connect.Host, - message *pb.NonceRequest) (*pb.Nonce, error) + SendRequestClientKeyMessage(host *connect.Host, + message *pb.SignedClientKeyRequest) (*pb.SignedKeyResponse, error) SendConfirmNonceMessage(host *connect.Host, message *pb.RequestRegistrationConfirmation) (*pb.RegistrationConfirmation, error) } @@ -126,7 +127,7 @@ func registerWithNode(sender *gateway.Sender, comms RegisterNodeCommsInterface, // keys transmissionHash, _ := hash.NewCMixHash() - nonce, dhPub, err := requestNonce(sender, comms, gatewayID, regSig, + nonce, dhPub, err := requestKey(sender, comms, gatewayID, regSig, registrationTimestampNano, uci, store, rng, stop) if err != nil { @@ -137,6 +138,7 @@ func registerWithNode(sender *gateway.Sender, comms RegisterNodeCommsInterface, serverPubDH := store.GetGroup().NewIntFromBytes(dhPub) // Confirm received nonce + // fixme: need? jww.INFO.Printf("Register: Confirming received nonce from node %s", nodeID.String()) err = confirmNonce(sender, comms, uci.GetTransmissionID().Bytes(), nonce, uci.GetTransmissionRSA(), gatewayID, stop) @@ -156,15 +158,30 @@ func registerWithNode(sender *gateway.Sender, comms RegisterNodeCommsInterface, return nil } -func requestNonce(sender *gateway.Sender, comms RegisterNodeCommsInterface, gwId *id.ID, +func requestKey(sender *gateway.Sender, comms RegisterNodeCommsInterface, gwId *id.ID, regSig []byte, registrationTimestampNano int64, uci *user.CryptographicIdentity, - store *cmix.Store, rng csprng.Source, stop *stoppable.Single) ([]byte, []byte, error) { + store *cmix.Store, rng csprng.Source, stop *stoppable.Single) (keyResponse, clientGatewayKey []byte, err error) { dhPub := store.GetDHPublicKey().Bytes() + + keyRequest := &pb.ClientKeyRequest{ + Salt: uci.GetTransmissionSalt(), + ClientTransmissionConfirmation: &pb.SignedRegistrationConfirmation{ + RegistrarSignature: &messages.RSASignature{Signature: regSig}, + }, + ClientDHPubKey: dhPub, + RequestTimestamp: registrationTimestampNano, + } + + serializedMessage, err := proto.Marshal(keyRequest) + if err != nil { + return nil, nil, err + } + opts := rsa.NewDefaultOptions() opts.Hash = hash.CMixHash - h, _ := hash.NewCMixHash() - h.Write(dhPub) + h := opts.Hash.New() + h.Write(serializedMessage) data := h.Sum(nil) // Sign DH pubkey @@ -178,26 +195,17 @@ func requestNonce(sender *gateway.Sender, comms RegisterNodeCommsInterface, gwId jww.INFO.Printf("Register: Requesting nonce from gateway %v", gwId.String()) result, err := sender.SendToAny(func(host *connect.Host) (interface{}, error) { - nonceResponse, err := comms.SendRequestNonceMessage(host, - &pb.NonceRequest{ - Salt: uci.GetTransmissionSalt(), - ClientRSAPubKey: string(rsa.CreatePublicKeyPem(uci.GetTransmissionRSA().GetPublic())), - ClientSignedByServer: &messages.RSASignature{ - Signature: regSig, - }, - ClientDHPubKey: dhPub, - RequestSignature: &messages.RSASignature{ - Signature: clientSig, - }, - Target: gwId.Marshal(), - // Timestamp in which user has registered with registration - TimeStamp: registrationTimestampNano, + nonceResponse, err := comms.SendRequestClientKeyMessage(host, + &pb.SignedClientKeyRequest{ + ClientKeyRequest: serializedMessage, + ClientKeyRequestSignature: &messages.RSASignature{Signature: clientSig}, + Target: gwId.Bytes(), }) if err != nil { return nil, errors.WithMessage(err, "Register: Failed requesting nonce from gateway") } if nonceResponse.Error != "" { - return nil, errors.WithMessage(err, "requestNonce: nonceResponse error") + return nil, errors.WithMessage(err, "requestKey: nonceResponse error") } return nonceResponse, nil }, stop) @@ -206,10 +214,10 @@ func requestNonce(sender *gateway.Sender, comms RegisterNodeCommsInterface, gwId return nil, nil, err } - nonceResponse := result.(*pb.Nonce) + nonceResponse := result.(*pb.SignedKeyResponse) // Use Client keypair to sign Server nonce - return nonceResponse.Nonce, nonceResponse.DHPubKey, nil + return nonceResponse.KeyResponse, nonceResponse.ClientGatewayKey, nil } // confirmNonce is a helper for the Register function diff --git a/network/node/register_test.go b/network/node/register_test.go index 95d0765bfdfa47d2443ff45245d770d1eafaeb8b..83f4efd482cfe6c3f4af01a0b761d2c2e978f97e 100644 --- a/network/node/register_test.go +++ b/network/node/register_test.go @@ -39,13 +39,13 @@ func NewMockClientComms() *MockClientComms { func (mcc *MockClientComms) GetHost(hostId *id.ID) (*connect.Host, bool) { return &connect.Host{}, true } -func (mcc *MockClientComms) SendRequestNonceMessage(host *connect.Host, - message *pb.NonceRequest) (*pb.Nonce, error) { +func (mcc *MockClientComms) SendRequestClientKeyMessage(host *connect.Host, + message *pb.SignedClientKeyRequest) (*pb.SignedKeyResponse, error) { // Use this channel to confirm that request nonce was called mcc.request <- true - return &pb.Nonce{ - Nonce: []byte("nonce"), - DHPubKey: []byte("dhpub"), + return &pb.SignedKeyResponse{ + KeyResponse: []byte("nonce"), + ClientGatewayKey: []byte("dhpub"), }, nil } func (mcc *MockClientComms) SendConfirmNonceMessage(host *connect.Host,