Propagate shared secrets on encryption protocol init (#23)

This commit is contained in:
Adam Babik 2019-07-17 15:14:16 +02:00 committed by GitHub
parent 35e60767b7
commit dec4e63d9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 27 deletions

View File

@ -3,11 +3,11 @@ package encryption
import (
"bytes"
"crypto/ecdsa"
"errors"
"fmt"
"log"
"github.com/ethereum/go-ethereum/crypto"
"github.com/pkg/errors"
"github.com/status-im/status-protocol-go/encryption/multidevice"
"github.com/status-im/status-protocol-go/encryption/publisher"
@ -131,7 +131,14 @@ func NewWithEncryptorConfig(
}, nil
}
func (p *Protocol) Start(myIdentity *ecdsa.PrivateKey) {
func (p *Protocol) Start(myIdentity *ecdsa.PrivateKey) error {
// Propagate currently cached shared secrets.
secrets, err := p.secret.All()
if err != nil {
return errors.Wrap(err, "failed to get all secrets")
}
p.onNewSharedSecretHandler(secrets)
// Handle Publisher system messages.
publisherCh := p.publisher.Start()
@ -146,6 +153,8 @@ func (p *Protocol) Start(myIdentity *ecdsa.PrivateKey) {
p.onSendContactCodeHandler(messageSpec)
}
}()
return nil
}
func (p *Protocol) addBundle(myIdentityKey *ecdsa.PrivateKey, msg *ProtocolMessage, sendSingle bool) error {

View File

@ -161,3 +161,28 @@ func (s *ProtocolServiceTestSuite) TestSecretNegotiation() {
s.Require().NotNil(secretResponse)
}
func (s *ProtocolServiceTestSuite) TestPropagatingSavedSharedSecretsOnStart() {
var secretResponse []*sharedsecret.Secret
aliceKey, err := crypto.GenerateKey()
s.NoError(err)
bobKey, err := crypto.GenerateKey()
s.NoError(err)
// Generate and save a shared secret.
generatedSecret, err := s.alice.secret.Generate(aliceKey, &bobKey.PublicKey, "installation-1")
s.NoError(err)
s.alice.onNewSharedSecretHandler = func(secret []*sharedsecret.Secret) {
secretResponse = secret
}
err = s.alice.Start(aliceKey)
s.NoError(err)
s.Require().NotNil(secretResponse)
s.Require().Len(secretResponse, 1)
s.Equal(crypto.FromECDSAPub(generatedSecret.Identity), crypto.FromECDSAPub(secretResponse[0].Identity))
s.Equal(generatedSecret.Key, secretResponse[0].Key)
}

View File

@ -150,8 +150,6 @@ func NewMessenger(
if err != nil {
return nil, errors.Wrap(err, "failed to create the encryption layer")
}
// TODO: consider removing identity as an argument to Start().
encryptionProtocol.Start(identity)
messagesDB, err := sqlite.Open(filepath.Join(dataDir, "messages.sql"), dbKey, sqlite.MigrationConfig{
AssetNames: migrations.AssetNames(),
@ -171,6 +169,12 @@ func NewMessenger(
ownMessages: make(map[string][]*protocol.Message),
}
// Start all services immediately.
// TODO: consider removing identity as an argument to Start().
if err := encryptionProtocol.Start(identity); err != nil {
return nil, err
}
return messenger, nil
}

View File

@ -13,29 +13,8 @@ import (
"github.com/ethereum/go-ethereum/crypto"
whisper "github.com/status-im/whisper/whisperv6"
"github.com/stretchr/testify/require"
)
func TestNewMessenger(t *testing.T) {
tmpDir, err := ioutil.TempDir("", "messenger-test")
require.NoError(t, err)
privateKey, err := crypto.GenerateKey()
require.NoError(t, err)
shh := whisper.New(nil)
_, err = NewMessenger(
privateKey,
nil,
shh,
tmpDir,
"some-key",
"installation-1",
WithChats([]string{"status"}, nil, nil),
)
require.NoError(t, err)
}
type testChat struct {
publicName string
publicKey *ecdsa.PublicKey

View File

@ -61,7 +61,7 @@ type ChatsManager struct {
whisper *whisper.Whisper
persistence *sqlitePersistence
privateKey *ecdsa.PrivateKey
keys map[string][]byte
keys map[string][]byte // a cache of symmetric keys derived from passwords
mutex sync.Mutex
chats map[string]*Chat
@ -109,7 +109,7 @@ func (s *ChatsManager) Init(chatIDs []string, publicKeys []*ecdsa.PublicKey, neg
return nil, err
}
// Add public, one-to-one and generic chats.
// Add public, one-to-one and negotiated chats.
for _, chatID := range chatIDs {
_, err := s.LoadPublic(chatID)
if err != nil {