whisper: fixed math/rand.Read() issue

This commit is contained in:
Vlad 2016-10-19 12:51:44 +02:00
parent e9d3ff3760
commit 641114ba28
4 changed files with 34 additions and 38 deletions

View file

@ -96,7 +96,7 @@ func (fs *Filters) NotifyWatchers(env *Envelope, messageCode uint64) {
} }
fs.mutex.RUnlock() // we need to unlock before calling addDecryptedMessage fs.mutex.RUnlock() // we need to unlock before calling addDecryptedMessage
if msg != nil { if msg != nil && fs.whisper != nil {
fs.whisper.addDecryptedMessage(msg) fs.whisper.addDecryptedMessage(msg)
} }
} }

View file

@ -16,25 +16,17 @@
package whisperv5 package whisperv5
/*
import "testing" import "testing"
var topicXxxxxxxxxxxTests = []struct { func TestFilters(x *testing.T) {
topic TopicType filters := NewFilters(nil)
str string f := Filter{}
}{ filters.Install(f)
{topic: TopicType{0x00, 0x00, 0x00, 0x00}, str: "0x00000000"}, i := filters.Install(f)
{topic: TopicType{0x00, 0x7f, 0x80, 0xff}, str: "0x007f80ff"}, if i == 0 {
{topic: TopicType{0xff, 0x80, 0x7f, 0x00}, str: "0xff807f00"}, x.Errorf("failed install")
{topic: TopicType{0xf2, 0x6e, 0x77, 0x79}, str: "0xf26e7779"}, return
}
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)
}
} }
// todo: test Install, Uninstall, Get
} }
*/

View file

@ -130,7 +130,7 @@ func (msg *SentMessage) appendPadding(params *MessageParams) {
panic("please fix the padding algorithm before releasing new version") panic("please fix the padding algorithm before releasing new version")
} }
buf := make([]byte, padSize) buf := make([]byte, padSize)
mrand.Read(buf[1:]) randomize(buf[1:]) // change to: err = mrand.Read(buf[1:])
buf[0] = byte(padSize) buf[0] = byte(padSize)
if params.Padding != nil { if params.Padding != nil {
copy(buf[1:], params.Padding) copy(buf[1:], params.Padding)
@ -360,3 +360,19 @@ func (msg *ReceivedMessage) hash() []byte {
} }
return crypto.Keccak256(msg.Raw) 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()
}
}
}

View file

@ -30,16 +30,13 @@ func copyFromBuf(dst []byte, src []byte, beg int) int {
return beg + len(dst) return beg + len(dst)
} }
func generateMessageParams() (*MessageParams, error) { func generateMessageParams() (*MessageParams, err error) {
buf := make([]byte, 1024) buf := make([]byte, 1024)
_, err := rand.Read(buf) randomize(buf)
if err != nil { sz := rand.Intn(400)
return nil, err
}
var p MessageParams var p MessageParams
p.TTL = uint32(rand.Intn(1024)) p.TTL = uint32(rand.Intn(1024))
sz := rand.Intn(400)
p.Payload = make([]byte, sz) p.Payload = make([]byte, sz)
p.Padding = make([]byte, padSizeLimitUpper) p.Padding = make([]byte, padSizeLimitUpper)
p.KeySym = make([]byte, aesKeyLength) p.KeySym = make([]byte, aesKeyLength)
@ -49,7 +46,6 @@ func generateMessageParams() (*MessageParams, error) {
b = copyFromBuf(p.Padding, buf, b) b = copyFromBuf(p.Padding, buf, b)
b = copyFromBuf(p.KeySym, buf, b) b = copyFromBuf(p.KeySym, buf, b)
p.Topic = BytesToTopic(buf[b:]) p.Topic = BytesToTopic(buf[b:])
p.Src, err = crypto.GenerateKey() p.Src, err = crypto.GenerateKey()
if err != nil { if err != nil {
return nil, err return nil, err
@ -184,16 +180,8 @@ func TestMessageSeal(x *testing.T) {
params.TTL = 1 params.TTL = 1
aesnonce := make([]byte, 12) aesnonce := make([]byte, 12)
salt := make([]byte, 12) salt := make([]byte, 12)
_, err = rand.Read(aesnonce) randomize(aesnonce)
if err != nil { randomize(salt)
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
}
env := NewEnvelope(params.TTL, params.Topic, salt, aesnonce, msg) env := NewEnvelope(params.TTL, params.Topic, salt, aesnonce, msg)
if err != nil { if err != nil {
@ -219,7 +207,7 @@ func TestMessageSeal(x *testing.T) {
env.Seal(params) env.Seal(params)
env.calculatePoW(0) env.calculatePoW(0)
pow = env.PoW() pow = env.PoW()
if pow < 1000 { if pow < 2*target {
// this depends on deterministic choice of seed (1976726903) // this depends on deterministic choice of seed (1976726903)
x.Errorf("failed Wrap with seed %d: pow too small %f.", seed, pow) x.Errorf("failed Wrap with seed %d: pow too small %f.", seed, pow)
return return