forked from cerc-io/plugeth
whisper/whisperv5: set filter SymKeyHash on creation (#15165)
This commit is contained in:
parent
36243c7ed8
commit
7a045af05b
@ -104,7 +104,7 @@ func (api *PublicWhisperAPI) Info(ctx context.Context) Info {
|
|||||||
stats := api.w.Stats()
|
stats := api.w.Stats()
|
||||||
return Info{
|
return Info{
|
||||||
Memory: stats.memoryUsed,
|
Memory: stats.memoryUsed,
|
||||||
Messages: len(api.w.messageQueue) + len(api.w.p2pMsgQueue),
|
Messages: len(api.w.messageQueue) + len(api.w.p2pMsgQueue),
|
||||||
MinPow: api.w.MinPow(),
|
MinPow: api.w.MinPow(),
|
||||||
MaxMessageSize: api.w.MaxMessageSize(),
|
MaxMessageSize: api.w.MaxMessageSize(),
|
||||||
}
|
}
|
||||||
|
@ -25,5 +25,3 @@ var DefaultConfig = Config{
|
|||||||
MaxMessageSize: DefaultMaxMessageSize,
|
MaxMessageSize: DefaultMaxMessageSize,
|
||||||
MinimumAcceptedPOW: DefaultMinimumPoW,
|
MinimumAcceptedPOW: DefaultMinimumPoW,
|
||||||
}
|
}
|
||||||
|
|
||||||
var ()
|
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -68,6 +69,10 @@ func (fs *Filters) Install(watcher *Filter) (string, error) {
|
|||||||
return "", fmt.Errorf("failed to generate unique ID")
|
return "", fmt.Errorf("failed to generate unique ID")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if watcher.expectsSymmetricEncryption() {
|
||||||
|
watcher.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym)
|
||||||
|
}
|
||||||
|
|
||||||
fs.watchers[id] = watcher
|
fs.watchers[id] = watcher
|
||||||
return id, err
|
return id, err
|
||||||
}
|
}
|
||||||
@ -119,7 +124,9 @@ func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
|
|||||||
|
|
||||||
if match && msg != nil {
|
if match && msg != nil {
|
||||||
log.Trace("processing message: decrypted", "hash", env.Hash().Hex())
|
log.Trace("processing message: decrypted", "hash", env.Hash().Hex())
|
||||||
watcher.Trigger(msg)
|
if watcher.Src == nil || IsPubKeyEqual(msg.Src, watcher.Src) {
|
||||||
|
watcher.Trigger(msg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,9 +179,6 @@ func (f *Filter) MatchMessage(msg *ReceivedMessage) bool {
|
|||||||
if f.PoW > 0 && msg.PoW < f.PoW {
|
if f.PoW > 0 && msg.PoW < f.PoW {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if f.Src != nil && !IsPubKeyEqual(msg.Src, f.Src) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() {
|
if f.expectsAsymmetricEncryption() && msg.isAsymmetricEncryption() {
|
||||||
return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic)
|
return IsPubKeyEqual(&f.KeyAsym.PublicKey, msg.Dst) && f.MatchTopic(msg.Topic)
|
||||||
|
@ -132,6 +132,103 @@ func TestInstallFilters(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInstallSymKeyGeneratesHash(t *testing.T) {
|
||||||
|
InitSingleTest()
|
||||||
|
|
||||||
|
w := New(&Config{})
|
||||||
|
filters := NewFilters(w)
|
||||||
|
filter, _ := generateFilter(t, true)
|
||||||
|
|
||||||
|
// save the current SymKeyHash for comparison
|
||||||
|
initialSymKeyHash := filter.SymKeyHash
|
||||||
|
|
||||||
|
// ensure the SymKeyHash is invalid, for Install to recreate it
|
||||||
|
var invalid common.Hash
|
||||||
|
filter.SymKeyHash = invalid
|
||||||
|
|
||||||
|
_, err := filters.Install(filter)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error installing the filter: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, b := range filter.SymKeyHash {
|
||||||
|
if b != initialSymKeyHash[i] {
|
||||||
|
t.Fatalf("The filter's symmetric key hash was not properly generated by Install")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInstallIdenticalFilters(t *testing.T) {
|
||||||
|
InitSingleTest()
|
||||||
|
|
||||||
|
w := New(&Config{})
|
||||||
|
filters := NewFilters(w)
|
||||||
|
filter1, _ := generateFilter(t, true)
|
||||||
|
|
||||||
|
// Copy the first filter since some of its fields
|
||||||
|
// are randomly gnerated.
|
||||||
|
filter2 := &Filter{
|
||||||
|
KeySym: filter1.KeySym,
|
||||||
|
Topics: filter1.Topics,
|
||||||
|
PoW: filter1.PoW,
|
||||||
|
AllowP2P: filter1.AllowP2P,
|
||||||
|
Messages: make(map[common.Hash]*ReceivedMessage),
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := filters.Install(filter1)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error installing the first filter with seed %d: %s", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = filters.Install(filter2)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error installing the second filter with seed %d: %s", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
params, err := generateMessageParams()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error generating message parameters with seed %d: %s", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
params.KeySym = filter1.KeySym
|
||||||
|
params.Topic = BytesToTopic(filter1.Topics[0])
|
||||||
|
|
||||||
|
filter1.Src = ¶ms.Src.PublicKey
|
||||||
|
filter2.Src = ¶ms.Src.PublicKey
|
||||||
|
|
||||||
|
sentMessage, err := NewSentMessage(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
env, err := sentMessage.Wrap(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
msg := env.Open(filter1)
|
||||||
|
if msg == nil {
|
||||||
|
t.Fatalf("failed to Open with filter1")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !filter1.MatchEnvelope(env) {
|
||||||
|
t.Fatalf("failed matching with the first filter")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !filter2.MatchEnvelope(env) {
|
||||||
|
t.Fatalf("failed matching with the first filter")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !filter1.MatchMessage(msg) {
|
||||||
|
t.Fatalf("failed matching with the second filter")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !filter2.MatchMessage(msg) {
|
||||||
|
t.Fatalf("failed matching with the second filter")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestComparePubKey(t *testing.T) {
|
func TestComparePubKey(t *testing.T) {
|
||||||
InitSingleTest()
|
InitSingleTest()
|
||||||
|
|
||||||
@ -345,11 +442,6 @@ func TestMatchMessageSym(t *testing.T) {
|
|||||||
t.Fatalf("failed Open with seed %d.", seed)
|
t.Fatalf("failed Open with seed %d.", seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Src mismatch
|
|
||||||
if f.MatchMessage(msg) {
|
|
||||||
t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Src: match
|
// Src: match
|
||||||
*f.Src.X = *params.Src.PublicKey.X
|
*f.Src.X = *params.Src.PublicKey.X
|
||||||
*f.Src.Y = *params.Src.PublicKey.Y
|
*f.Src.Y = *params.Src.PublicKey.Y
|
||||||
@ -443,11 +535,6 @@ func TestMatchMessageAsym(t *testing.T) {
|
|||||||
t.Fatalf("failed to open with seed %d.", seed)
|
t.Fatalf("failed to open with seed %d.", seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Src mismatch
|
|
||||||
if f.MatchMessage(msg) {
|
|
||||||
t.Fatalf("failed MatchMessage(src mismatch) with seed %d.", seed)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Src: match
|
// Src: match
|
||||||
*f.Src.X = *params.Src.PublicKey.X
|
*f.Src.X = *params.Src.PublicKey.X
|
||||||
*f.Src.Y = *params.Src.PublicKey.Y
|
*f.Src.Y = *params.Src.PublicKey.Y
|
||||||
|
@ -22,6 +22,8 @@ import (
|
|||||||
mrand "math/rand"
|
mrand "math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestWhisperBasic(t *testing.T) {
|
func TestWhisperBasic(t *testing.T) {
|
||||||
@ -624,3 +626,226 @@ func TestCustomization(t *testing.T) {
|
|||||||
t.Fatalf("failed to get whisper messages")
|
t.Fatalf("failed to get whisper messages")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSymmetricSendCycle(t *testing.T) {
|
||||||
|
InitSingleTest()
|
||||||
|
|
||||||
|
w := New(&DefaultConfig)
|
||||||
|
defer w.SetMinimumPoW(DefaultMinimumPoW)
|
||||||
|
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
|
||||||
|
w.Start(nil)
|
||||||
|
defer w.Stop()
|
||||||
|
|
||||||
|
filter1, err := generateFilter(t, true)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
filter1.PoW = DefaultMinimumPoW
|
||||||
|
|
||||||
|
// Copy the first filter since some of its fields
|
||||||
|
// are randomly gnerated.
|
||||||
|
filter2 := &Filter{
|
||||||
|
KeySym: filter1.KeySym,
|
||||||
|
Topics: filter1.Topics,
|
||||||
|
PoW: filter1.PoW,
|
||||||
|
AllowP2P: filter1.AllowP2P,
|
||||||
|
Messages: make(map[common.Hash]*ReceivedMessage),
|
||||||
|
}
|
||||||
|
|
||||||
|
params, err := generateMessageParams()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
filter1.Src = ¶ms.Src.PublicKey
|
||||||
|
filter2.Src = ¶ms.Src.PublicKey
|
||||||
|
|
||||||
|
params.KeySym = filter1.KeySym
|
||||||
|
params.Topic = BytesToTopic(filter1.Topics[2])
|
||||||
|
params.PoW = filter1.PoW
|
||||||
|
params.WorkTime = 10
|
||||||
|
params.TTL = 50
|
||||||
|
msg, err := NewSentMessage(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
env, err := msg.Wrap(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Subscribe(filter1)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Subscribe(filter2)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = w.Send(env)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait till received or timeout
|
||||||
|
var received bool
|
||||||
|
for j := 0; j < 200; j++ {
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
if len(w.Envelopes()) > 0 {
|
||||||
|
received = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !received {
|
||||||
|
t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check w.messages()
|
||||||
|
time.Sleep(5 * time.Millisecond)
|
||||||
|
mail1 := filter1.Retrieve()
|
||||||
|
mail2 := filter2.Retrieve()
|
||||||
|
if len(mail2) == 0 {
|
||||||
|
t.Fatalf("did not receive any email for filter 2")
|
||||||
|
}
|
||||||
|
if len(mail1) == 0 {
|
||||||
|
t.Fatalf("did not receive any email for filter 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSymmetricSendWithoutAKey(t *testing.T) {
|
||||||
|
InitSingleTest()
|
||||||
|
|
||||||
|
w := New(&DefaultConfig)
|
||||||
|
defer w.SetMinimumPoW(DefaultMinimumPoW)
|
||||||
|
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
|
||||||
|
w.Start(nil)
|
||||||
|
defer w.Stop()
|
||||||
|
|
||||||
|
filter, err := generateFilter(t, true)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
filter.PoW = DefaultMinimumPoW
|
||||||
|
|
||||||
|
params, err := generateMessageParams()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
filter.Src = nil
|
||||||
|
|
||||||
|
params.KeySym = filter.KeySym
|
||||||
|
params.Topic = BytesToTopic(filter.Topics[2])
|
||||||
|
params.PoW = filter.PoW
|
||||||
|
params.WorkTime = 10
|
||||||
|
params.TTL = 50
|
||||||
|
msg, err := NewSentMessage(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
env, err := msg.Wrap(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Subscribe(filter)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = w.Send(env)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait till received or timeout
|
||||||
|
var received bool
|
||||||
|
for j := 0; j < 200; j++ {
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
if len(w.Envelopes()) > 0 {
|
||||||
|
received = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !received {
|
||||||
|
t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check w.messages()
|
||||||
|
time.Sleep(5 * time.Millisecond)
|
||||||
|
mail := filter.Retrieve()
|
||||||
|
if len(mail) == 0 {
|
||||||
|
t.Fatalf("did not receive message in spite of not setting a public key")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSymmetricSendKeyMismatch(t *testing.T) {
|
||||||
|
InitSingleTest()
|
||||||
|
|
||||||
|
w := New(&DefaultConfig)
|
||||||
|
defer w.SetMinimumPoW(DefaultMinimumPoW)
|
||||||
|
defer w.SetMaxMessageSize(DefaultMaxMessageSize)
|
||||||
|
w.Start(nil)
|
||||||
|
defer w.Stop()
|
||||||
|
|
||||||
|
filter, err := generateFilter(t, true)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
filter.PoW = DefaultMinimumPoW
|
||||||
|
|
||||||
|
params, err := generateMessageParams()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
params.KeySym = filter.KeySym
|
||||||
|
params.Topic = BytesToTopic(filter.Topics[2])
|
||||||
|
params.PoW = filter.PoW
|
||||||
|
params.WorkTime = 10
|
||||||
|
params.TTL = 50
|
||||||
|
msg, err := NewSentMessage(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
env, err := msg.Wrap(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Subscribe(filter)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = w.Send(env)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait till received or timeout
|
||||||
|
var received bool
|
||||||
|
for j := 0; j < 200; j++ {
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
if len(w.Envelopes()) > 0 {
|
||||||
|
received = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !received {
|
||||||
|
t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check w.messages()
|
||||||
|
time.Sleep(5 * time.Millisecond)
|
||||||
|
mail := filter.Retrieve()
|
||||||
|
if len(mail) > 0 {
|
||||||
|
t.Fatalf("received a message when keys weren't matching")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user