From afc8b887abfbfeaec5040a39f0f20d3071902abe Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Dec 2014 12:01:55 +0100 Subject: added whisper --- whisper/whisper.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index 356debd1c..1b3f54b67 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -4,12 +4,12 @@ import ( "bytes" "crypto/ecdsa" "errors" - "fmt" "sync" "time" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/event/filter" + "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" "gopkg.in/fatih/set.v0" ) @@ -47,6 +47,8 @@ type MessageEvent struct { const DefaultTtl = 50 * time.Second +var wlogger = logger.NewLogger("SHH") + type Whisper struct { protocol p2p.Protocol filters *filter.Filters @@ -68,16 +70,15 @@ func New() *Whisper { quit: make(chan struct{}), } whisper.filters.Start() - go whisper.update() // XXX TODO REMOVE TESTING CODE - msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) - envelope, _ := msg.Seal(DefaultPow, Opts{ - Ttl: DefaultTtl, - }) - if err := whisper.Send(envelope); err != nil { - fmt.Println(err) - } + //msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) + //envelope, _ := msg.Seal(DefaultPow, Opts{ + // Ttl: DefaultTtl, + //}) + //if err := whisper.Send(envelope); err != nil { + // fmt.Println(err) + //} // XXX TODO REMOVE TESTING CODE // p2p whisper sub protocol handler @@ -91,6 +92,11 @@ func New() *Whisper { return whisper } +func (self *Whisper) Start() { + wlogger.Infoln("Whisper started") + go self.update() +} + func (self *Whisper) Stop() { close(self.quit) } @@ -236,7 +242,7 @@ func (self *Whisper) postEvent(envelope *Envelope) { Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), }, message) } else { - fmt.Println(err) + wlogger.Infoln(err) } } } -- cgit v1.2.3 From 01a6db93241a01e98a0467b628423c9b5b1361cb Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Dec 2014 17:14:02 +0100 Subject: Added whisper debug interface + whisper fixes --- whisper/main.go | 14 ++------------ whisper/whisper.go | 13 +++---------- 2 files changed, 5 insertions(+), 22 deletions(-) (limited to 'whisper') diff --git a/whisper/main.go b/whisper/main.go index 2ee2f3ff1..edd5f7004 100644 --- a/whisper/main.go +++ b/whisper/main.go @@ -5,10 +5,8 @@ package main import ( "fmt" "log" - "net" "os" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/whisper" @@ -20,12 +18,12 @@ func main() { pub, _ := secp256k1.GenerateKeyPair() - whisper := whisper.New(&event.TypeMux{}) + whisper := whisper.New() srv := p2p.Server{ MaxPeers: 10, Identity: p2p.NewSimpleClientIdentity("whisper-go", "1.0", "", string(pub)), - ListenAddr: ":30303", + ListenAddr: ":30300", NAT: p2p.UPNP(), Protocols: []p2p.Protocol{whisper.Protocol()}, @@ -35,13 +33,5 @@ func main() { os.Exit(1) } - // add seed peers - seed, err := net.ResolveTCPAddr("tcp", "poc-7.ethdev.com:30300") - if err != nil { - fmt.Println("couldn't resolve:", err) - os.Exit(1) - } - srv.SuggestPeer(seed.IP, seed.Port, nil) - select {} } diff --git a/whisper/whisper.go b/whisper/whisper.go index 1b3f54b67..f91b61d9a 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/ecdsa" "errors" + "fmt" "sync" "time" @@ -71,16 +72,6 @@ func New() *Whisper { } whisper.filters.Start() - // XXX TODO REMOVE TESTING CODE - //msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) - //envelope, _ := msg.Seal(DefaultPow, Opts{ - // Ttl: DefaultTtl, - //}) - //if err := whisper.Send(envelope); err != nil { - // fmt.Println(err) - //} - // XXX TODO REMOVE TESTING CODE - // p2p whisper sub protocol handler whisper.protocol = p2p.Protocol{ Name: "shh", @@ -158,6 +149,7 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { continue } + fmt.Println("recv") if err := self.add(envelope); err != nil { // TODO Punish peer here. Invalid envelope. peer.Infoln(err) @@ -184,6 +176,7 @@ func (self *Whisper) add(envelope *Envelope) error { if !self.expiry[envelope.Expiry].Has(hash) { self.expiry[envelope.Expiry].Add(hash) self.postEvent(envelope) + fmt.Println("envelope added", envelope) } return nil -- cgit v1.2.3 From 54605d8c8e2c6c4b2619cf392ac430fecd7a4282 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Dec 2014 21:54:34 +0100 Subject: During env open check for pub error which indicated unencrypted payload. --- whisper/envelope.go | 6 +++++- whisper/whisper.go | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'whisper') diff --git a/whisper/envelope.go b/whisper/envelope.go index 683e88128..dc8d3cda4 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/rlp" + "github.com/obscuren/ecies" ) const ( @@ -76,7 +77,10 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { message.Payload = data[dataStart:] if prv != nil { message.Payload, err = crypto.Decrypt(prv, message.Payload) - if err != nil { + switch err { + case ecies.ErrInvalidPublicKey: // Payload isn't encrypted + return &message, err + default: return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err) } } diff --git a/whisper/whisper.go b/whisper/whisper.go index f91b61d9a..b16ccd1e9 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum/go-ethereum/event/filter" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" + "github.com/obscuren/ecies" "gopkg.in/fatih/set.v0" ) @@ -229,7 +230,7 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) { func (self *Whisper) postEvent(envelope *Envelope) { for _, key := range self.keys { - if message, err := envelope.Open(key); err == nil { + if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) { // Create a custom filter? self.filters.Notify(filter.Generic{ Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), -- cgit v1.2.3 From b55fabc7be4debff147b0598eea39f9d16cfa108 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Dec 2014 22:18:58 +0100 Subject: Removed debug message --- whisper/whisper.go | 1 - 1 file changed, 1 deletion(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index b16ccd1e9..32e951385 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -177,7 +177,6 @@ func (self *Whisper) add(envelope *Envelope) error { if !self.expiry[envelope.Expiry].Has(hash) { self.expiry[envelope.Expiry].Add(hash) self.postEvent(envelope) - fmt.Println("envelope added", envelope) } return nil -- cgit v1.2.3 From 93edae280d60d217084430a0c6c16f648c82732e Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 15 Dec 2014 22:50:38 +0100 Subject: doc desc --- whisper/doc.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 whisper/doc.go (limited to 'whisper') diff --git a/whisper/doc.go b/whisper/doc.go new file mode 100644 index 000000000..986df8fb9 --- /dev/null +++ b/whisper/doc.go @@ -0,0 +1,16 @@ +/* +Package whisper implements the Whisper PoC-1. + +(https://github.com/ethereum/wiki/wiki/Whisper-PoC-1-Protocol-Spec) + +Whisper combines aspects of both DHTs and datagram messaging systems (e.g. UDP). +As such it may be likened and compared to both, not dissimilar to the +matter/energy duality (apologies to physicists for the blatant abuse of a +fundamental and beautiful natural principle). + +Whisper is a pure identity-based messaging system. Whisper provides a low-level +(non-application-specific) but easily-accessible API without being based upon +or prejudiced by the low-level hardware attributes and characteristics, +particularly the notion of singular endpoints. +*/ +package whisper -- cgit v1.2.3 From 52b54631a47dfa46742635be178f2f8d33dd9f41 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 16 Dec 2014 19:55:57 +0100 Subject: Whisper watches fixes --- whisper/envelope.go | 6 ++++-- whisper/util.go | 11 ++++++++++- whisper/whisper.go | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) (limited to 'whisper') diff --git a/whisper/envelope.go b/whisper/envelope.go index dc8d3cda4..066e20f6a 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -74,11 +74,13 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { message.Flags = data[0] message.Signature = data[1:66] } - message.Payload = data[dataStart:] + + payload := data[dataStart:] if prv != nil { - message.Payload, err = crypto.Decrypt(prv, message.Payload) + message.Payload, err = crypto.Decrypt(prv, payload) switch err { case ecies.ErrInvalidPublicKey: // Payload isn't encrypted + message.Payload = payload return &message, err default: return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err) diff --git a/whisper/util.go b/whisper/util.go index abef1d667..7a222395f 100644 --- a/whisper/util.go +++ b/whisper/util.go @@ -18,10 +18,19 @@ func Topics(data [][]byte) [][]byte { return d } -func TopicsFromString(data []string) [][]byte { +func TopicsFromString(data ...string) [][]byte { d := make([][]byte, len(data)) for i, str := range data { d[i] = hashTopic([]byte(str)) } return d } + +func bytesToMap(s [][]byte) map[string]struct{} { + m := make(map[string]struct{}) + for _, topic := range s { + m[string(topic)] = struct{}{} + } + + return m +} diff --git a/whisper/whisper.go b/whisper/whisper.go index 32e951385..9721ca9f9 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -4,7 +4,6 @@ import ( "bytes" "crypto/ecdsa" "errors" - "fmt" "sync" "time" @@ -120,6 +119,7 @@ func (self *Whisper) Watch(opts Filter) int { return self.filters.Install(filter.Generic{ Str1: string(crypto.FromECDSA(opts.To)), Str2: string(crypto.FromECDSAPub(opts.From)), + Data: bytesToMap(opts.Topics), Fn: func(data interface{}) { opts.Fn(data.(*Message)) }, @@ -150,7 +150,6 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { continue } - fmt.Println("recv") if err := self.add(envelope); err != nil { // TODO Punish peer here. Invalid envelope. peer.Infoln(err) @@ -233,6 +232,7 @@ func (self *Whisper) postEvent(envelope *Envelope) { // Create a custom filter? self.filters.Notify(filter.Generic{ Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), + Data: bytesToMap(envelope.Topics), }, message) } else { wlogger.Infoln(err) -- cgit v1.2.3 From 4051c0333f43765a7414a4e0e8ac51e7148b0646 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 22 Dec 2014 13:23:11 +0100 Subject: Added whisper js api --- whisper/whisper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index 9721ca9f9..ffcdd7d40 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -175,7 +175,7 @@ func (self *Whisper) add(envelope *Envelope) error { if !self.expiry[envelope.Expiry].Has(hash) { self.expiry[envelope.Expiry].Add(hash) - self.postEvent(envelope) + go self.postEvent(envelope) } return nil -- cgit v1.2.3 From e2d1d832efe0623539c9d37ca8aee17d44e47067 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 2 Jan 2015 13:00:25 +0100 Subject: added nil check --- whisper/envelope.go | 1 + whisper/messages_test.go | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'whisper') diff --git a/whisper/envelope.go b/whisper/envelope.go index 066e20f6a..9d28dfa6b 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -79,6 +79,7 @@ func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { if prv != nil { message.Payload, err = crypto.Decrypt(prv, payload) switch err { + case nil: // OK case ecies.ErrInvalidPublicKey: // Payload isn't encrypted message.Payload = payload return &message, err diff --git a/whisper/messages_test.go b/whisper/messages_test.go index cba103011..93caa31b3 100644 --- a/whisper/messages_test.go +++ b/whisper/messages_test.go @@ -40,12 +40,11 @@ func TestMessageEncryptDecrypt(t *testing.T) { msg1, err := envelope.Open(prv2) if err != nil { - fmt.Println(err) + t.Error(err) t.FailNow() } if !bytes.Equal(msg1.Payload, data) { - fmt.Println("encryption error. data did not match") - t.FailNow() + t.Error("encryption error. data did not match") } } -- cgit v1.2.3 From 4a0ade4788b0e8d53c6b0eabaf9652643b6a073a Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 8 Jan 2015 21:41:32 +0100 Subject: Fixed some whisper issues --- whisper/message.go | 2 ++ whisper/peer.go | 2 +- whisper/whisper.go | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) (limited to 'whisper') diff --git a/whisper/message.go b/whisper/message.go index db0110b4a..5bda849ec 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -2,6 +2,7 @@ package whisper import ( "crypto/ecdsa" + "fmt" "time" "github.com/ethereum/go-ethereum/crypto" @@ -53,6 +54,7 @@ type Opts struct { } func (self *Message) Seal(pow time.Duration, opts Opts) (*Envelope, error) { + fmt.Println(opts) if opts.From != nil { err := self.sign(opts.From) if err != nil { diff --git a/whisper/peer.go b/whisper/peer.go index d42b374b5..f82cc6e3e 100644 --- a/whisper/peer.go +++ b/whisper/peer.go @@ -55,7 +55,7 @@ out: case <-relay.C: err := self.broadcast(self.host.envelopes()) if err != nil { - self.peer.Infoln(err) + self.peer.Infoln("broadcast err:", err) break out } diff --git a/whisper/whisper.go b/whisper/whisper.go index ffcdd7d40..3ff4bac5a 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -229,11 +229,11 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) { func (self *Whisper) postEvent(envelope *Envelope) { for _, key := range self.keys { if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) { - // Create a custom filter? self.filters.Notify(filter.Generic{ Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), Data: bytesToMap(envelope.Topics), }, message) + break } else { wlogger.Infoln(err) } -- cgit v1.2.3 From 26f066f0c7570bcca43299721c2b7a1a70186ee3 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 8 Jan 2015 22:18:23 +0100 Subject: just enable by default --- whisper/whisper.go | 3 +++ 1 file changed, 3 insertions(+) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index 3ff4bac5a..71a4e841e 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -4,6 +4,7 @@ import ( "bytes" "crypto/ecdsa" "errors" + "fmt" "sync" "time" @@ -143,6 +144,7 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { if err != nil { return err } + fmt.Println("reading message") envelope, err := NewEnvelopeFromReader(msg.Payload) if err != nil { @@ -160,6 +162,7 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { // takes care of adding envelopes to the messages pool. At this moment no sanity checks are being performed. func (self *Whisper) add(envelope *Envelope) error { + fmt.Println("adding") if !envelope.valid() { return errors.New("invalid pow provided for envelope") } -- cgit v1.2.3 From c8a4c04b36d264f538f452b4540372907216b394 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 8 Jan 2015 23:15:46 +0100 Subject: err --- whisper/whisper.go | 3 --- 1 file changed, 3 deletions(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index 71a4e841e..3ff4bac5a 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -4,7 +4,6 @@ import ( "bytes" "crypto/ecdsa" "errors" - "fmt" "sync" "time" @@ -144,7 +143,6 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { if err != nil { return err } - fmt.Println("reading message") envelope, err := NewEnvelopeFromReader(msg.Payload) if err != nil { @@ -162,7 +160,6 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { // takes care of adding envelopes to the messages pool. At this moment no sanity checks are being performed. func (self *Whisper) add(envelope *Envelope) error { - fmt.Println("adding") if !envelope.valid() { return errors.New("invalid pow provided for envelope") } -- cgit v1.2.3 From c9f566269b39780accfb7632b94dd7635be2022b Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 9 Jan 2015 13:28:48 +0100 Subject: merged --- whisper/message.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'whisper') diff --git a/whisper/message.go b/whisper/message.go index 5bda849ec..db0110b4a 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -2,7 +2,6 @@ package whisper import ( "crypto/ecdsa" - "fmt" "time" "github.com/ethereum/go-ethereum/crypto" @@ -54,7 +53,6 @@ type Opts struct { } func (self *Message) Seal(pow time.Duration, opts Opts) (*Envelope, error) { - fmt.Println(opts) if opts.From != nil { err := self.sign(opts.From) if err != nil { -- cgit v1.2.3 From 34689cb3f369ad71164b81d0c05238d78cb67945 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 12 Jan 2015 20:36:45 +0100 Subject: Added manual triggering of filters --- whisper/whisper.go | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index 3ff4bac5a..bdc69f199 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -126,6 +126,20 @@ func (self *Whisper) Watch(opts Filter) int { }) } +func (self *Whisper) Trigger(id int) { + 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 self.filters.Match(filter, f) { + self.filters.Notify(f, msg) + } + } + } + } +} + // Main handler for passing whisper messages to whisper peer objects func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { wpeer := NewPeer(self, peer, ws) @@ -227,19 +241,28 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) { } func (self *Whisper) postEvent(envelope *Envelope) { + if message, key := self.open(envelope); message != nil { + self.filters.Notify(createFilter(message, envelope.Topics, key), message) + } +} + +func (self *Whisper) open(envelope *Envelope) (*Message, *ecdsa.PrivateKey) { for _, key := range self.keys { if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) { - self.filters.Notify(filter.Generic{ - Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), - Data: bytesToMap(envelope.Topics), - }, message) - break - } else { - wlogger.Infoln(err) + return message, key } } + + return nil, nil } func (self *Whisper) Protocol() p2p.Protocol { return self.protocol } + +func createFilter(message *Message, topics [][]byte, key *ecdsa.PrivateKey) filter.Filter { + return filter.Generic{ + Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), + Data: bytesToMap(topics), + } +} -- cgit v1.2.3 From e3cad04decbbc83a0c956850717cb0ae0b2b3eec Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 13 Jan 2015 13:36:44 +0100 Subject: Fixed whisper messages * Whisper protocol wasn't properly suppling envelope slices * Message history wasn't properly propagated * Added 'Messages' method, filtering any current envelope with the supplied filter. --- whisper/envelope.go | 42 ++++++++++++++++++++++++------------------ whisper/message.go | 6 +++++- whisper/whisper.go | 22 ++++++++++++++-------- 3 files changed, 43 insertions(+), 27 deletions(-) (limited to 'whisper') diff --git a/whisper/envelope.go b/whisper/envelope.go index 9d28dfa6b..3c477ad9f 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -1,11 +1,9 @@ package whisper import ( - "bytes" "crypto/ecdsa" "encoding/binary" "fmt" - "io" "time" "github.com/ethereum/go-ethereum/crypto" @@ -28,22 +26,6 @@ type Envelope struct { hash Hash } -func NewEnvelopeFromReader(reader io.Reader) (*Envelope, error) { - var envelope Envelope - - buf := new(bytes.Buffer) - buf.ReadFrom(reader) - - h := H(crypto.Sha3(buf.Bytes())) - if err := rlp.Decode(buf, &envelope); err != nil { - return nil, err - } - - envelope.hash = h - - return &envelope, nil -} - func (self *Envelope) Hash() Hash { if self.hash == EmptyHash { self.hash = H(crypto.Sha3(ethutil.Encode(self))) @@ -126,3 +108,27 @@ func (self *Envelope) withoutNonce() interface{} { func (self *Envelope) RlpData() interface{} { return []interface{}{self.Expiry, self.Ttl, ethutil.ByteSliceToInterface(self.Topics), self.Data, self.Nonce} } + +func (self *Envelope) DecodeRLP(s *rlp.Stream) error { + var extenv struct { + Expiry uint32 + Ttl uint32 + Topics [][]byte + Data []byte + Nonce uint32 + } + if err := s.Decode(&extenv); err != nil { + return err + } + + self.Expiry = extenv.Expiry + self.Ttl = extenv.Ttl + self.Topics = extenv.Topics + self.Data = extenv.Data + self.Nonce = extenv.Nonce + + // TODO We should use the stream directly here. + self.hash = H(crypto.Sha3(ethutil.Encode(self))) + + return nil +} diff --git a/whisper/message.go b/whisper/message.go index db0110b4a..bbad8e6a3 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -67,7 +67,11 @@ func (self *Message) Seal(pow time.Duration, opts Opts) (*Envelope, error) { } } - envelope := NewEnvelope(DefaultTtl, opts.Topics, self) + if opts.Ttl == 0 { + opts.Ttl = DefaultTtl + } + + envelope := NewEnvelope(opts.Ttl, opts.Topics, self) envelope.Seal(pow) return envelope, nil diff --git a/whisper/whisper.go b/whisper/whisper.go index bdc69f199..ece2dd6d4 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -126,18 +126,20 @@ func (self *Whisper) Watch(opts Filter) int { }) } -func (self *Whisper) Trigger(id int) { +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 self.filters.Match(filter, f) { - self.filters.Notify(f, msg) + messages = append(messages, msg) } } } } + + return } // Main handler for passing whisper messages to whisper peer objects @@ -158,17 +160,19 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { return err } - envelope, err := NewEnvelopeFromReader(msg.Payload) - if err != nil { + var envelopes []*Envelope + if err := msg.Decode(&envelopes); err != nil { peer.Infoln(err) continue } - if err := self.add(envelope); err != nil { - // TODO Punish peer here. Invalid envelope. - peer.Infoln(err) + for _, envelope := range envelopes { + if err := self.add(envelope); err != nil { + // TODO Punish peer here. Invalid envelope. + peer.Infoln(err) + } + wpeer.addKnown(envelope) } - wpeer.addKnown(envelope) } } @@ -192,6 +196,8 @@ func (self *Whisper) add(envelope *Envelope) error { go self.postEvent(envelope) } + wlogger.DebugDetailln("added whisper message") + return nil } -- cgit v1.2.3 From 62e0e18030c84fa19f54373ebdf25f7adbc64793 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 14 Jan 2015 18:12:18 +0100 Subject: Changed public whisper api not to reveal temporary private keys --- whisper/whisper.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index ece2dd6d4..76cfe34a4 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -60,7 +60,7 @@ type Whisper struct { quit chan struct{} - keys []*ecdsa.PrivateKey + keys map[string]*ecdsa.PrivateKey } func New() *Whisper { @@ -69,6 +69,7 @@ func New() *Whisper { filters: filter.New(), expiry: make(map[uint32]*set.SetNonTS), quit: make(chan struct{}), + keys: make(map[string]*ecdsa.PrivateKey), } whisper.filters.Start() @@ -101,18 +102,18 @@ func (self *Whisper) NewIdentity() *ecdsa.PrivateKey { if err != nil { panic(err) } - self.keys = append(self.keys, key) + + self.keys[string(crypto.FromECDSAPub(&key.PublicKey))] = key return key } -func (self *Whisper) HasIdentity(key *ecdsa.PrivateKey) bool { - for _, key := range self.keys { - if key.D.Cmp(key.D) == 0 { - return true - } - } - return false +func (self *Whisper) HasIdentity(key *ecdsa.PublicKey) bool { + return self.keys[string(crypto.FromECDSAPub(key))] != nil +} + +func (self *Whisper) GetIdentity(key *ecdsa.PublicKey) *ecdsa.PrivateKey { + return self.keys[string(crypto.FromECDSAPub(key))] } func (self *Whisper) Watch(opts Filter) int { -- cgit v1.2.3 From 87f50659db7a4bf194769b05f541d2ccf02f4fc8 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 20 Jan 2015 18:42:29 +0100 Subject: fixed url bug in browser --- whisper/whisper_test.go | 9 --------- 1 file changed, 9 deletions(-) (limited to 'whisper') diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go index 107cb8c97..c5ad73021 100644 --- a/whisper/whisper_test.go +++ b/whisper/whisper_test.go @@ -6,15 +6,6 @@ import ( "time" ) -func TestKeyManagement(t *testing.T) { - whisper := New() - - key := whisper.NewIdentity() - if !whisper.HasIdentity(key) { - t.Error("expected whisper to have identify") - } -} - func TestEvent(t *testing.T) { res := make(chan *Message, 1) whisper := New() -- cgit v1.2.3 From 67f9783e6a0fa5613a031e05549b92adbee57399 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 22 Jan 2015 00:35:00 +0100 Subject: Moved `obscuren` secp256k1-go --- whisper/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'whisper') diff --git a/whisper/main.go b/whisper/main.go index edd5f7004..9f35dbb8d 100644 --- a/whisper/main.go +++ b/whisper/main.go @@ -7,10 +7,10 @@ import ( "log" "os" + "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/whisper" - "github.com/obscuren/secp256k1-go" ) func main() { -- cgit v1.2.3 From b777d6aa3f0e771ca8465924820db1848bc47402 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 22 Jan 2015 12:35:31 +0100 Subject: UI Updates * Browser now has tabs * Fixed a callback issue --- whisper/peer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'whisper') diff --git a/whisper/peer.go b/whisper/peer.go index f82cc6e3e..332ddd22a 100644 --- a/whisper/peer.go +++ b/whisper/peer.go @@ -81,7 +81,7 @@ func (self *peer) broadcast(envelopes []*Envelope) error { if err := self.ws.WriteMsg(msg); err != nil { return err } - self.peer.Infoln("broadcasted", i, "message(s)") + self.peer.DebugDetailln("broadcasted", i, "message(s)") } return nil -- cgit v1.2.3 From c48644490f039fb9756b4cd1fedf11fbb1c4a16f Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 30 Jan 2015 13:24:20 +0100 Subject: Fixed whisper pub key bug * Unrecoverable messages would cause segfault when recovering invalid pub key --- whisper/whisper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'whisper') diff --git a/whisper/whisper.go b/whisper/whisper.go index 76cfe34a4..8eab0825b 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -197,7 +197,7 @@ func (self *Whisper) add(envelope *Envelope) error { go self.postEvent(envelope) } - wlogger.DebugDetailln("added whisper message") + wlogger.DebugDetailf("added whisper envelope %x\n", envelope) return nil } -- cgit v1.2.3 From 623469cb6c6cdb6ff84dc2cb7d4409e9d7cf3f65 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 3 Feb 2015 06:56:19 -0800 Subject: Added missing whisper timestamp. Closes #284 --- whisper/message.go | 1 + 1 file changed, 1 insertion(+) (limited to 'whisper') diff --git a/whisper/message.go b/whisper/message.go index bbad8e6a3..fa631b2ef 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -11,6 +11,7 @@ type Message struct { Flags byte Signature []byte Payload []byte + Sent uint64 } func NewMessage(payload []byte) *Message { -- cgit v1.2.3 From 7bd2fbe2b1445c26190008d21ad52dc5c364765c Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 3 Feb 2015 07:16:05 -0800 Subject: Fixed whisper "to" filtering. Closes #283 --- whisper/message.go | 4 ++-- whisper/whisper.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'whisper') diff --git a/whisper/message.go b/whisper/message.go index fa631b2ef..23b5cfb0e 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -11,11 +11,11 @@ type Message struct { Flags byte Signature []byte Payload []byte - Sent uint64 + Sent int64 } func NewMessage(payload []byte) *Message { - return &Message{Flags: 0, Payload: payload} + return &Message{Flags: 0, Payload: payload, Sent: time.Now().Unix()} } func (self *Message) hash() []byte { diff --git a/whisper/whisper.go b/whisper/whisper.go index 8eab0825b..cc0348422 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -269,7 +269,7 @@ func (self *Whisper) Protocol() p2p.Protocol { func createFilter(message *Message, topics [][]byte, key *ecdsa.PrivateKey) filter.Filter { return filter.Generic{ - Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), + Str1: string(crypto.FromECDSAPub(&key.PublicKey)), Str2: string(crypto.FromECDSAPub(message.Recover())), Data: bytesToMap(topics), } } -- cgit v1.2.3 From e40c1c62ce0c2d9567066d84ea74fd24b424a81a Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 5 Feb 2015 15:00:59 -0800 Subject: API changed to use Pubkey only. Reflected that change in the rest of the api --- whisper/filter.go | 2 +- whisper/whisper.go | 2 +- whisper/whisper_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'whisper') diff --git a/whisper/filter.go b/whisper/filter.go index 4315aa556..b33f2c1a2 100644 --- a/whisper/filter.go +++ b/whisper/filter.go @@ -3,7 +3,7 @@ package whisper import "crypto/ecdsa" type Filter struct { - To *ecdsa.PrivateKey + To *ecdsa.PublicKey From *ecdsa.PublicKey Topics [][]byte Fn func(*Message) diff --git a/whisper/whisper.go b/whisper/whisper.go index cc0348422..57c898303 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -118,7 +118,7 @@ func (self *Whisper) GetIdentity(key *ecdsa.PublicKey) *ecdsa.PrivateKey { func (self *Whisper) Watch(opts Filter) int { return self.filters.Install(filter.Generic{ - Str1: string(crypto.FromECDSA(opts.To)), + Str1: string(crypto.FromECDSAPub(opts.To)), Str2: string(crypto.FromECDSAPub(opts.From)), Data: bytesToMap(opts.Topics), Fn: func(data interface{}) { diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go index c5ad73021..3e3945a0a 100644 --- a/whisper/whisper_test.go +++ b/whisper/whisper_test.go @@ -11,7 +11,7 @@ func TestEvent(t *testing.T) { whisper := New() id := whisper.NewIdentity() whisper.Watch(Filter{ - To: id, + To: &id.PublicKey, Fn: func(msg *Message) { res <- msg }, -- cgit v1.2.3 From ddccea75e8f4931689fdf6b57ec7159b65c0d3c5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 10 Feb 2015 13:20:06 +0100 Subject: Fixed "to" field --- whisper/message.go | 2 ++ whisper/whisper.go | 2 ++ 2 files changed, 4 insertions(+) (limited to 'whisper') diff --git a/whisper/message.go b/whisper/message.go index 23b5cfb0e..5d9e5b5c1 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -12,6 +12,8 @@ type Message struct { Signature []byte Payload []byte Sent int64 + + To *ecdsa.PublicKey } func NewMessage(payload []byte) *Message { diff --git a/whisper/whisper.go b/whisper/whisper.go index 57c898303..066f2c4ea 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -256,6 +256,8 @@ func (self *Whisper) postEvent(envelope *Envelope) { func (self *Whisper) open(envelope *Envelope) (*Message, *ecdsa.PrivateKey) { for _, key := range self.keys { if message, err := envelope.Open(key); err == nil || (err != nil && err == ecies.ErrInvalidPublicKey) { + message.To = &key.PublicKey + return message, key } } -- cgit v1.2.3 From 84f7c966f725ef0f5c62b4427857d112c0d1e828 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 14 Feb 2015 00:25:47 +0100 Subject: Moved ECIES to repo & added secondary title for webview * ECIES moved from obscuren to ethereum * Added html META[name=badge] to reflect menuItem.secondaryTitle --- whisper/envelope.go | 2 +- whisper/whisper.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'whisper') diff --git a/whisper/envelope.go b/whisper/envelope.go index 3c477ad9f..d30397c98 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -7,9 +7,9 @@ import ( "time" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/rlp" - "github.com/obscuren/ecies" ) const ( diff --git a/whisper/whisper.go b/whisper/whisper.go index 066f2c4ea..50c2f98fd 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -8,10 +8,10 @@ import ( "time" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" "github.com/ethereum/go-ethereum/event/filter" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" - "github.com/obscuren/ecies" "gopkg.in/fatih/set.v0" ) -- cgit v1.2.3