aboutsummaryrefslogtreecommitdiffstats
path: root/whisper/whisper.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2015-04-14 17:12:47 +0800
committerPéter Szilágyi <peterke@gmail.com>2015-04-14 17:12:47 +0800
commit5205b2f19b9173580f9a9e727d74e202b8dd0f67 (patch)
treea43057307d4fb8c704953c6a82507bc5f473aaf1 /whisper/whisper.go
parent4af7743663fa3e444668b90878f64d0df4316deb (diff)
downloadgo-tangerine-5205b2f19b9173580f9a9e727d74e202b8dd0f67.tar.gz
go-tangerine-5205b2f19b9173580f9a9e727d74e202b8dd0f67.tar.zst
go-tangerine-5205b2f19b9173580f9a9e727d74e202b8dd0f67.zip
whisper: fix anonymous broadcast drop, add broadcast tests
Diffstat (limited to 'whisper/whisper.go')
-rw-r--r--whisper/whisper.go46
1 files changed, 30 insertions, 16 deletions
diff --git a/whisper/whisper.go b/whisper/whisper.go
index f3b539d2c..a4ec943e8 100644
--- a/whisper/whisper.go
+++ b/whisper/whisper.go
@@ -136,8 +136,8 @@ func (self *Whisper) Messages(id int) (messages []*Message) {
filter := self.filters.Get(id)
if filter != nil {
for _, e := range self.messages {
- if msg, key := self.open(e); msg != nil {
- f := createFilter(msg, e.Topics, key)
+ if msg := self.open(e); msg != nil {
+ f := createFilter(msg, e.Topics)
if self.filters.Match(filter, f) {
messages = append(messages, msg)
}
@@ -251,31 +251,45 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) {
return
}
+func (self *Whisper) Protocol() p2p.Protocol {
+ return self.protocol
+}
+
+// postEvent opens an envelope with the configured identities and delivers the
+// message upstream from application processing.
func (self *Whisper) postEvent(envelope *Envelope) {
- if message, key := self.open(envelope); message != nil {
- self.filters.Notify(createFilter(message, envelope.Topics, key), message)
+ if message := self.open(envelope); message != nil {
+ self.filters.Notify(createFilter(message, envelope.Topics), message)
}
}
-func (self *Whisper) open(envelope *Envelope) (*Message, *ecdsa.PrivateKey) {
+// open tries to decrypt a whisper envelope with all the configured identities,
+// returning the decrypted message and the key used to achieve it. If not keys
+// are configured, open will return the payload as if non encrypted.
+func (self *Whisper) open(envelope *Envelope) *Message {
+ // Short circuit if no identity is set, and assume clear-text
+ if len(self.keys) == 0 {
+ if message, err := envelope.Open(nil); err == nil {
+ return message
+ }
+ }
+ // Iterate over the keys and try to decrypt the message
for _, key := range self.keys {
- if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) {
+ message, err := envelope.Open(key)
+ if err == nil || err == ecies.ErrInvalidPublicKey {
message.To = &key.PublicKey
-
- return message, key
+ return message
}
}
-
- return nil, nil
-}
-
-func (self *Whisper) Protocol() p2p.Protocol {
- return self.protocol
+ // Failed to decrypt, don't return anything
+ return nil
}
-func createFilter(message *Message, topics []Topic, key *ecdsa.PrivateKey) filter.Filter {
+// createFilter creates a message filter to check against installed handlers.
+func createFilter(message *Message, topics []Topic) filter.Filter {
return filter.Generic{
- Str1: string(crypto.FromECDSAPub(&key.PublicKey)), Str2: string(crypto.FromECDSAPub(message.Recover())),
+ Str1: string(crypto.FromECDSAPub(message.To)),
+ Str2: string(crypto.FromECDSAPub(message.Recover())),
Data: NewTopicSet(topics),
}
}