From 641114ba28a411c561956b5524534d3981188f11 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 19 Oct 2016 12:51:44 +0200 Subject: [PATCH] whisper: fixed math/rand.Read() issue --- whisper/whisperv5/filter.go | 2 +- whisper/whisperv5/filter_test.go | 28 ++++++++++------------------ whisper/whisperv5/message.go | 18 +++++++++++++++++- whisper/whisperv5/message_test.go | 24 ++++++------------------ 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/whisper/whisperv5/filter.go b/whisper/whisperv5/filter.go index 3ca1c84472..31c7aed0f1 100644 --- a/whisper/whisperv5/filter.go +++ b/whisper/whisperv5/filter.go @@ -96,7 +96,7 @@ func (fs *Filters) NotifyWatchers(env *Envelope, messageCode uint64) { } fs.mutex.RUnlock() // we need to unlock before calling addDecryptedMessage - if msg != nil { + if msg != nil && fs.whisper != nil { fs.whisper.addDecryptedMessage(msg) } } diff --git a/whisper/whisperv5/filter_test.go b/whisper/whisperv5/filter_test.go index e92b528d3e..71b6b04298 100644 --- a/whisper/whisperv5/filter_test.go +++ b/whisper/whisperv5/filter_test.go @@ -16,25 +16,17 @@ package whisperv5 -/* import "testing" -var topicXxxxxxxxxxxTests = []struct { - topic TopicType - str string -}{ - {topic: TopicType{0x00, 0x00, 0x00, 0x00}, str: "0x00000000"}, - {topic: TopicType{0x00, 0x7f, 0x80, 0xff}, str: "0x007f80ff"}, - {topic: TopicType{0xff, 0x80, 0x7f, 0x00}, str: "0xff807f00"}, - {topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, str: "0xf26e7779"}, -} - -func TestXxxxxxxxxxxx(x *testing.T) { - for i, tst := range topicStringTests { - s := tst.topic.String() - if s != tst.str { - x.Errorf("failed test %d: have %s, want %s.", i, s, tst.str) - } +func TestFilters(x *testing.T) { + filters := NewFilters(nil) + f := Filter{} + filters.Install(f) + i := filters.Install(f) + if i == 0 { + x.Errorf("failed install") + return } + + // todo: test Install, Uninstall, Get } -*/ diff --git a/whisper/whisperv5/message.go b/whisper/whisperv5/message.go index 176676caca..35ce949ab3 100644 --- a/whisper/whisperv5/message.go +++ b/whisper/whisperv5/message.go @@ -130,7 +130,7 @@ func (msg *SentMessage) appendPadding(params *MessageParams) { panic("please fix the padding algorithm before releasing new version") } buf := make([]byte, padSize) - mrand.Read(buf[1:]) + randomize(buf[1:]) // change to: err = mrand.Read(buf[1:]) buf[0] = byte(padSize) if params.Padding != nil { copy(buf[1:], params.Padding) @@ -360,3 +360,19 @@ func (msg *ReceivedMessage) hash() []byte { } return crypto.Keccak256(msg.Raw) } + +// rand.Rand provides a Read method in Go 1.7 and later, +// but we can't use it yet. +func randomize(b []byte) { + cnt := 0 + val := mrand.Int63() + for n := 0; n < len(b); n++ { + b[n] = byte(val) + val >>= 8 + cnt++ + if cnt >= 7 { + cnt = 0 + val = mrand.Int63() + } + } +} diff --git a/whisper/whisperv5/message_test.go b/whisper/whisperv5/message_test.go index 3e6fc701cd..65487bef4c 100644 --- a/whisper/whisperv5/message_test.go +++ b/whisper/whisperv5/message_test.go @@ -30,16 +30,13 @@ func copyFromBuf(dst []byte, src []byte, beg int) int { return beg + len(dst) } -func generateMessageParams() (*MessageParams, error) { +func generateMessageParams() (*MessageParams, err error) { buf := make([]byte, 1024) - _, err := rand.Read(buf) - if err != nil { - return nil, err - } + randomize(buf) + sz := rand.Intn(400) var p MessageParams p.TTL = uint32(rand.Intn(1024)) - sz := rand.Intn(400) p.Payload = make([]byte, sz) p.Padding = make([]byte, padSizeLimitUpper) p.KeySym = make([]byte, aesKeyLength) @@ -49,7 +46,6 @@ func generateMessageParams() (*MessageParams, error) { b = copyFromBuf(p.Padding, buf, b) b = copyFromBuf(p.KeySym, buf, b) p.Topic = BytesToTopic(buf[b:]) - p.Src, err = crypto.GenerateKey() if err != nil { return nil, err @@ -184,16 +180,8 @@ func TestMessageSeal(x *testing.T) { params.TTL = 1 aesnonce := make([]byte, 12) salt := make([]byte, 12) - _, err = rand.Read(aesnonce) - if err != nil { - x.Errorf("failed generate aesnonce with seed %d: %s.", seed, err) - return - } - _, err = rand.Read(salt) - if err != nil { - x.Errorf("failed generate salt with seed %d: %s.", seed, err) - return - } + randomize(aesnonce) + randomize(salt) env := NewEnvelope(params.TTL, params.Topic, salt, aesnonce, msg) if err != nil { @@ -219,7 +207,7 @@ func TestMessageSeal(x *testing.T) { env.Seal(params) env.calculatePoW(0) pow = env.PoW() - if pow < 1000 { + if pow < 2*target { // this depends on deterministic choice of seed (1976726903) x.Errorf("failed Wrap with seed %d: pow too small %f.", seed, pow) return