Propagate shared secrets on encryption protocol init (#23)
This commit is contained in:
parent
35e60767b7
commit
dec4e63d9f
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue